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)