From cef65c8df33f60575bba0308c26be67f43e50aaa Mon Sep 17 00:00:00 2001 From: Langtanium <94726057+Langtanium@users.noreply.github.com> Date: Sat, 18 Apr 2026 11:41:06 -0700 Subject: [PATCH] Fixed a few issues and added more functionality Fixed player not rendering in third person and armor arm0 not moving with 64x64 skins. Added offsets to held item (main hand) and armor (boots). --- Minecraft.Client/Common/DLC/DLCSkinFile.cpp | 2 +- .../Common/UI/UIControl_PlayerSkinPreview.cpp | 6 +- Minecraft.Client/HumanoidModel.cpp | 279 ++++++++++++++++-- Minecraft.Client/HumanoidModel.h | 3 +- Minecraft.Client/ItemInHandRenderer.cpp | 34 ++- Minecraft.Client/ModelPart.cpp | 1 + Minecraft.Client/ModelPart.h | 1 + Minecraft.Client/PlayerRenderer.cpp | 19 +- 8 files changed, 306 insertions(+), 39 deletions(-) diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.cpp b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp index 3d78b7e0..f37bf1f2 100644 --- a/Minecraft.Client/Common/DLC/DLCSkinFile.cpp +++ b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp @@ -113,7 +113,7 @@ void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring WCHAR wchBodyPart[10]; SKIN_BOX *pSkinBox = new SKIN_BOX; ZeroMemory(pSkinBox,sizeof(SKIN_BOX)); - + #ifdef __PS3__ // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f%f%f%f", wchBodyPart, diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp index 7459db8e..96abff51 100644 --- a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -56,6 +56,7 @@ UIControl_PlayerSkinPreview::UIControl_PlayerSkinPreview() m_framesAnimatingRotation = 0; m_bAnimatingToFacing = false; m_pvAdditionalModelParts=nullptr; + m_pvModelOffsets=nullptr; m_uiAnimOverrideBitmask=0L; } @@ -366,7 +367,10 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou glEnable(GL_ALPHA_TEST); //model->prepareMobModel(mob, wp, ws, a); - model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets); + if (m_pvModelOffsets != nullptr) // If the skin has offsets use a modified version of the render function + model->renderUIOffset(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets); + else // If the skin has no offsets use the default render function (without this all skins that don't have an offset won't render) + model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) { if (prepareArmor(mob, i, a)) diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index 29cea256..2863047c 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -88,8 +88,8 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) pAttachTo=boot1; break; } - // check if this box has a declared scale - if (pBox->fS > 0) scale = pBox->fS; + // check if this box has a declared scale then add it + if (pBox->fS != 0) scale = pBox->fS; // first check this box doesn't already exist ModelPart *pNewBox = pAttachTo->retrieveChild(pBox); @@ -109,7 +109,7 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) pNewBox = new ModelPart(this, static_cast(pBox->fU), static_cast(pBox->fV)); pNewBox->visible=false; if (pBox->fM > 0) pNewBox->bMirror = true; // check if this box has the mirror flag - if (pBox->fA > 0) pNewBox->hideWithHelmet = true; // check if this box has the "hide when helmet" is worn flag + if (pBox->fA > 0) pNewBox->hideWithHelmet = true; // check if this box has the "hide when helmet is worn" flag pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, scale); // 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use. //pNewBox->compile(1.0f/16.0f); @@ -329,7 +329,6 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b m_isArmor = isArmor; } - HumanoidModel::HumanoidModel() : Model() { _init(0, 0, 64, 32, false, false); @@ -355,8 +354,8 @@ HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight _init(g,yOffset,texWidth,texHeight, slim, false); } -void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets) -{ +void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ if(entity != nullptr) { m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); @@ -395,8 +394,6 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float vector* pModelOffsets = nullptr; if (player != nullptr) pModelOffsets = player->GetModelOffsets(); - else if (modelOffsets != nullptr) - pModelOffsets = modelOffsets; if (pModelOffsets != nullptr) { for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) @@ -405,91 +402,309 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float { case eBodyOffset_Head: if(pModelOffset->fD == 1) - headOffsets[0] = pModelOffset->fO; + headOffsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - headOffsets[1] = pModelOffset->fO; + headOffsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - headOffsets[2] = pModelOffset->fO; + headOffsets[2] = pModelOffset->fO / 16.0f; break; case eBodyOffset_Body: if(pModelOffset->fD == 1) - bodyOffsets[0] = pModelOffset->fO; + bodyOffsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - bodyOffsets[1] = pModelOffset->fO; + bodyOffsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - bodyOffsets[2] = pModelOffset->fO; + bodyOffsets[2] = pModelOffset->fO / 16.0f; break; case eBodyOffset_Arm0: if(pModelOffset->fD == 1) - arm0Offsets[0] = pModelOffset->fO; + arm0Offsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - arm0Offsets[1] = pModelOffset->fO; + arm0Offsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - arm0Offsets[2] = pModelOffset->fO; + arm0Offsets[2] = pModelOffset->fO / 16.0f; break; case eBodyOffset_Arm1: if(pModelOffset->fD == 1) - arm1Offsets[0] = pModelOffset->fO; + arm1Offsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - arm1Offsets[1] = pModelOffset->fO; + arm1Offsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - arm1Offsets[2] = pModelOffset->fO; + arm1Offsets[2] = pModelOffset->fO / 16.0f; break; case eBodyOffset_Leg0: if(pModelOffset->fD == 1) - leg0Offsets[0] = pModelOffset->fO; + leg0Offsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - leg0Offsets[1] = pModelOffset->fO; + leg0Offsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - leg0Offsets[2] = pModelOffset->fO; + leg0Offsets[2] = pModelOffset->fO / 16.0f; break; case eBodyOffset_Leg1: if(pModelOffset->fD == 1) - leg1Offsets[0] = pModelOffset->fO; + leg1Offsets[0] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - leg1Offsets[1] = pModelOffset->fO; + leg1Offsets[1] = pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - leg1Offsets[2] = pModelOffset->fO; + leg1Offsets[2] = pModelOffset->fO / 16.0f; break; } } + if (m_isArmor) // Set offsets for armor + { + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + { + switch (pModelOffset->ePart) + { + case eBodyOffset_Boot0: + if (leg0->isArmorPart1) + { + if(pModelOffset->fD == 1) + leg0Offsets[0] += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + leg0Offsets[1] += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + leg0Offsets[2] += pModelOffset->fO / 16.0f; + } + break; + case eBodyOffset_Boot1: + if (leg1->isArmorPart1) + { + if(pModelOffset->fD == 1) + leg1Offsets[0] += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + leg1Offsets[1] += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + leg1Offsets[2] += pModelOffset->fO / 16.0f; + } + break; + } + } + } } glPushMatrix(); - glTranslatef(headOffsets[0]/16.0f, headOffsets[1]/16.0f, headOffsets[2]/16.0f); + glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); - glTranslatef(bodyOffsets[0]/16.0f, bodyOffsets[1]/16.0f, bodyOffsets[2]/16.0f); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); - glTranslatef(arm0Offsets[0]/16.0f, arm0Offsets[1]/16.0f, arm0Offsets[2]/16.0f); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); - glTranslatef(arm1Offsets[0]/16.0f, arm1Offsets[1]/16.0f, arm1Offsets[2]/16.0f); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); - glTranslatef(leg0Offsets[0]/16.0f, leg0Offsets[1]/16.0f, leg0Offsets[2]/16.0f); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); glPushMatrix(); - glTranslatef(leg1Offsets[0]/16.0f, leg1Offsets[1]/16.0f, leg1Offsets[2]/16.0f); + glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); glPopMatrix(); + glPushMatrix(); + glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); if (jacket != 0) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } if (sleeve0 != 0) + { + glPushMatrix(); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } if (sleeve1 != 0) + { + glPushMatrix(); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } if (pants0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } if (pants1 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } + if (waist != 0) + waist->render(scale, usecompiled); + if (belt != 0) + belt->render(scale, usecompiled); + if (bodyArmor != 0) + bodyArmor->render(scale, usecompiled); + if (armArmor0 != 0) + armArmor0->render(scale, usecompiled); + if (armArmor1 != 0) + armArmor1->render(scale, usecompiled); + if (legging0 != 0) + legging0->render(scale, usecompiled); + if (legging1 != 0) + legging1->render(scale, usecompiled); + if (sock0 != 0) + sock0->render(scale, usecompiled); + if (sock1 != 0) + sock1->render(scale, usecompiled); + if (boot0 != 0) + boot0->render(scale, usecompiled); + if (boot1 != 0) + boot1->render(scale, usecompiled); + } +} + +// This code is the same as above but allows for skin offsets to work in the skin select menu - Langtanium +void HumanoidModel::renderUIOffset(float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets) +{ + setupAnim(time, r, bob, yRot, xRot, scale, nullptr, m_uiAnimOverrideBitmask); + + vector headOffsets = {0, 0, 0}; + vector bodyOffsets = {0, 0, 0}; + vector arm0Offsets = {0, 0, 0}; + vector arm1Offsets = {0, 0, 0}; + vector leg0Offsets = {0, 0, 0}; + vector leg1Offsets = {0, 0, 0}; + vector* pModelOffsets = nullptr; + if (modelOffsets != nullptr) + pModelOffsets = modelOffsets; + if (pModelOffsets != nullptr) + { + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + { + switch (pModelOffset->ePart) + { + case eBodyOffset_Head: + if(pModelOffset->fD == 1) + headOffsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + headOffsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + headOffsets[2] = pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Body: + if(pModelOffset->fD == 1) + bodyOffsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + bodyOffsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + bodyOffsets[2] = pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Arm0: + if(pModelOffset->fD == 1) + arm0Offsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + arm0Offsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + arm0Offsets[2] = pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Arm1: + if(pModelOffset->fD == 1) + arm1Offsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + arm1Offsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + arm1Offsets[2] = pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Leg0: + if(pModelOffset->fD == 1) + leg0Offsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + leg0Offsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + leg0Offsets[2] = pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Leg1: + if(pModelOffset->fD == 1) + leg1Offsets[0] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + leg1Offsets[1] = pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + leg1Offsets[2] = pModelOffset->fO / 16.0f; + break; + } + } + + glPushMatrix(); + glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); + head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); + body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); + arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); + arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); + leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); + leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + glPopMatrix(); + glPushMatrix(); + glTranslatef(headOffsets[0], headOffsets[1], headOffsets[2]); + hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + if (jacket != 0) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); + jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } + if (sleeve0 != 0) + { + glPushMatrix(); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); + sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } + if (sleeve1 != 0) + { + glPushMatrix(); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); + sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } + if (pants0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); + pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } + if (pants1 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); + pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + glPopMatrix(); + } if (waist != 0) waist->render(scale, usecompiled); if (belt != 0) diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h index 99c821f4..c6f68767 100644 --- a/Minecraft.Client/HumanoidModel.h +++ b/Minecraft.Client/HumanoidModel.h @@ -83,7 +83,8 @@ public: HumanoidModel(float g, bool isArmor); HumanoidModel(float g, float yOffset, int texWidth, int texHeight); HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slim); - virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets = nullptr); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void renderUIOffset(float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *modelOffsets); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); void renderHair(float scale, bool usecompiled); void renderEars(float scale, bool usecompiled); diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp index 462cb81f..e3be5c90 100644 --- a/Minecraft.Client/ItemInHandRenderer.cpp +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -286,6 +286,7 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr mob, shared_ptr player = dynamic_pointer_cast(mob); + vector* pModelOffsets = nullptr; + if (player != nullptr) + pModelOffsets = player->GetModelOffsets(); + if (pModelOffsets != nullptr) + { + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + { + switch (pModelOffset->ePart) + { + case eBodyOffset_Arm0: + if(pModelOffset->fD == 1) + xo += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + zo += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + yo += pModelOffset->fO / 16.0f; + break; + case eBodyOffset_Tool0: + if(pModelOffset->fD == 1) + xo += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 2) + zo += pModelOffset->fO / 16.0f; + else if(pModelOffset->fD == 3) + yo += pModelOffset->fO / 16.0f; + break; + } + } + } + glEnable(GL_RESCALE_NORMAL); - glTranslatef(-xo, -yo, 0); + glTranslatef(-xo, -yo, -zo); float s = 1.5f; glScalef(s, s, s); diff --git a/Minecraft.Client/ModelPart.cpp b/Minecraft.Client/ModelPart.cpp index 8a39dbf4..2ea9d04b 100644 --- a/Minecraft.Client/ModelPart.cpp +++ b/Minecraft.Client/ModelPart.cpp @@ -14,6 +14,7 @@ void ModelPart::_init() bMirror = false; visible = true; hideWithHelmet = false; + isArmorPart1 = false; neverRender = false; x=y=z = 0.0f; xRot=yRot=zRot = 0.0f; diff --git a/Minecraft.Client/ModelPart.h b/Minecraft.Client/ModelPart.h index ad41879b..575dbcbb 100644 --- a/Minecraft.Client/ModelPart.h +++ b/Minecraft.Client/ModelPart.h @@ -17,6 +17,7 @@ public: bool bMirror; bool visible; bool hideWithHelmet; + bool isArmorPart1; bool neverRender; vector cubes; vector children; diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index 113dad2f..ad0a9b1f 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -76,6 +76,11 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, fl { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); + HumanoidModel *resModel; + + if (humanoidModelClassic != nullptr && (player->getCustomSkin() == 18 || player->getAnimOverrideBitmask()&(1<getCustomSkin() >= 8 && player->getCustomSkin() <= 17) || player->getAnimOverrideBitmask()&(1<getAnimOverrideBitmask(); @@ -103,10 +108,18 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, fl armor->leg0->visible = layer == 2 || layer == 3; armor->leg1->visible = layer == 2 || layer == 3; + armor->head->isArmorPart1 = layer == 0; + armor->hair->isArmorPart1 = layer == 0; + armor->body->isArmorPart1 = layer == 1; + armor->arm0->isArmorPart1 = layer == 1; + armor->arm1->isArmorPart1 = layer == 1; + armor->leg0->isArmorPart1 = layer == 3; + armor->leg1->isArmorPart1 = layer == 3; + setArmor(armor); - if (armor != nullptr) armor->attackTime = model->attackTime; - if (armor != nullptr) armor->riding = model->riding; - if (armor != nullptr) armor->young = model->young; + if (armor != nullptr) armor->attackTime = resModel->attackTime; + if (armor != nullptr) armor->riding = resModel->riding; + if (armor != nullptr) armor->young = resModel->young; float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH)