From 25918293e857c409552c66a69ca2568e92a2ff21 Mon Sep 17 00:00:00 2001 From: Langtanium <94726057+Langtanium@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:42:13 -0700 Subject: [PATCH] Fixed skin offset leak and removed skin item offset Fixed DLC skin offset leak causing offsets from one skin to leak onto another skin. Removed skin item offset as the location it was previously added to did not have the desired result. --- Minecraft.Client/HumanoidModel.cpp | 763 ++++++++++++++++++++++++++++- Minecraft.Client/HumanoidModel.h | 2 + 2 files changed, 745 insertions(+), 20 deletions(-) diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index c363f528..e57cd999 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -78,6 +78,8 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b this->texWidth = texWidth; this->texHeight = texHeight; + m_is64x64 = texHeight == 64; + jacket = nullptr; sleeve0 = nullptr; sleeve1 = nullptr; @@ -121,7 +123,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b body->addHumanoidBox(-4, 0, -2, 8, 12, 4, g); // Body body->setPos(0, 0 + yOffset, 0); - if ((texWidth == 64 && texHeight == 64) && !force32) + if (m_is64x64) { arm0 = new ModelPart(this, 24 + 16, 16); arm1 = new ModelPart(this, 16 + 16, 48); @@ -143,7 +145,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b sleeve0->setPos(-5, 2 + yOffset, 0); sleeve1->setPos(5, 2 + yOffset, 0); } - else if ((texWidth == 64 && texHeight == 32) || force32) + else if (!m_is64x64) { arm0 = new ModelPart(this, 24 + 16, 16); arm1 = new ModelPart(this, 24 + 16, 16); @@ -166,7 +168,22 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b if (mirror == true) arm1->bMirror = true; - if ((texWidth == 64 && texHeight == 64) && !force32) + if (!slim) + { + arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0 + arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g); // Arm1 + } + else if (slim) + { + arm0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g); // Arm0 Slim + arm1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g); // Arm1 Slim + } + + arm0->setPos(-5, 2 + yOffset, 0); + arm1->setPos(5, 2 + yOffset, 0); + + leg0 = new ModelPart(this, 0, 16); + if (m_is64x64) { leg0 = new ModelPart(this, 0, 16); leg1 = new ModelPart(this, 16, 48); @@ -179,7 +196,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b pants1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.5); pants1->setPos(1.9, 12 + yOffset, 0); } - else if ((texWidth == 64 && texHeight == 32) || force32) + else if (!m_is64x64) { leg0 = new ModelPart(this, 0, 16); leg1 = new ModelPart(this, 0, 16); @@ -208,16 +225,25 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b leg1->compile(1.0f/16.0f); hair->compile(1.0f/16.0f); - if (jacket != 0) + if (m_is64x64) + { jacket->compile(1.0f/16.0f); - if (sleeve0 != 0) sleeve0->compile(1.0f/16.0f); - if (sleeve1 != 0) sleeve1->compile(1.0f/16.0f); - if (pants0 != 0) pants0->compile(1.0f/16.0f); - if (pants1 != 0) pants1->compile(1.0f/16.0f); + waist->compile(1.0f/16.0f); + belt->compile(1.0f/16.0f); + bodyArmor->compile(1.0f/16.0f); + armArmor0->compile(1.0f/16.0f); + armArmor1->compile(1.0f/16.0f); + legging0->compile(1.0f/16.0f); + legging1->compile(1.0f/16.0f); + sock0->compile(1.0f/16.0f); + sock1->compile(1.0f/16.0f); + boot0->compile(1.0f/16.0f); + boot1->compile(1.0f/16.0f); + } holdingLeftHand=0; holdingRightHand=0; @@ -271,6 +297,400 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float if(entity != nullptr) { m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); + + // Reset offsets so they don't leak onto other skins - Langtanium + head->translateX = 0; + head->translateY = 0; + head->translateZ = 0; + hair->translateX = 0; + hair->translateY = 0; + hair->translateZ = 0; + body->translateX = 0; + body->translateY = 0; + body->translateZ = 0; + arm0->translateX = 0; + arm0->translateY = 0; + arm0->translateZ = 0; + arm1->translateX = 0; + arm1->translateY = 0; + arm1->translateZ = 0; + leg0->translateX = 0; + leg0->translateY = 0; + leg0->translateZ = 0; + leg1->translateX = 0; + leg1->translateY = 0; + leg1->translateZ = 0; + if (m_is64x64) + { + jacket->translateX = 0; + jacket->translateY = 0; + jacket->translateZ = 0; + sleeve0->translateX = 0; + sleeve0->translateY = 0; + sleeve0->translateZ = 0; + sleeve1->translateX = 0; + sleeve1->translateY = 0; + sleeve1->translateZ = 0; + pants0->translateX = 0; + pants0->translateY = 0; + pants0->translateZ = 0; + pants1->translateX = 0; + pants1->translateY = 0; + pants1->translateZ = 0; + bodyArmor->translateX = 0; + bodyArmor->translateY = 0; + bodyArmor->translateZ = 0; + waist->translateX = 0; + waist->translateY = 0; + waist->translateZ = 0; + belt->translateX = 0; + belt->translateY = 0; + belt->translateZ = 0; + armArmor0->translateX = 0; + armArmor0->translateY = 0; + armArmor0->translateZ = 0; + armArmor1->translateX = 0; + armArmor1->translateY = 0; + armArmor1->translateZ = 0; + legging0->translateX = 0; + legging0->translateY = 0; + legging0->translateZ = 0; + legging1->translateX = 0; + legging1->translateY = 0; + legging1->translateZ = 0; + sock0->translateX = 0; + sock0->translateY = 0; + sock0->translateZ = 0; + sock1->translateX = 0; + sock1->translateY = 0; + sock1->translateZ = 0; + boot0->translateX = 0; + boot0->translateY = 0; + boot0->translateZ = 0; + boot1->translateX = 0; + boot1->translateY = 0; + boot1->translateZ = 0; + } + + shared_ptr player = dynamic_pointer_cast(entity); + vector* pSkinOffsets = nullptr; + if (player != nullptr) + pSkinOffsets = player->GetSkinOffsets(); + if (pSkinOffsets != nullptr) + { + for( SKIN_OFFSET *pSkinOffset : *pSkinOffsets ) + { + switch (pSkinOffset->ePart) + { + case eBodyOffset_Head: + if (pSkinOffset->fD == 1 && head->translateX == 0) + { + head->translateX = pSkinOffset->fO / 16.0f; + hair->translateX = pSkinOffset->fO / 16.0f; + headOffsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && head->translateY == 0) + { + head->translateY = pSkinOffset->fO / 16.0f; + hair->translateY = pSkinOffset->fO / 16.0f; + headOffsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && head->translateZ == 0) + { + head->translateZ = pSkinOffset->fO / 16.0f; + hair->translateZ = pSkinOffset->fO / 16.0f; + headOffsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Body: + if (pSkinOffset->fD == 1 && body->translateX == 0) + { + body->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateX = pSkinOffset->fO / 16.0f; + bodyArmor->translateX = pSkinOffset->fO / 16.0f; + waist->translateX = pSkinOffset->fO / 16.0f; + belt->translateX = pSkinOffset->fO / 16.0f; + } + bodyOffsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && body->translateY == 0) + { + body->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateY = pSkinOffset->fO / 16.0f; + bodyArmor->translateY = pSkinOffset->fO / 16.0f; + waist->translateY = pSkinOffset->fO / 16.0f; + belt->translateY = pSkinOffset->fO / 16.0f; + } + bodyOffsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && body->translateZ == 0) + { + body->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateZ = pSkinOffset->fO / 16.0f; + bodyArmor->translateZ = pSkinOffset->fO / 16.0f; + waist->translateZ = pSkinOffset->fO / 16.0f; + belt->translateZ = pSkinOffset->fO / 16.0f; + } + bodyOffsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Arm0: + if (pSkinOffset->fD == 1 && arm0->translateX == 0) + { + arm0->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateX = pSkinOffset->fO / 16.0f; + armArmor0->translateX = pSkinOffset->fO / 16.0f; + } + arm0Offsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && arm0->translateY == 0) + { + arm0->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateY = pSkinOffset->fO / 16.0f; + armArmor0->translateY = pSkinOffset->fO / 16.0f; + } + arm0Offsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && arm0->translateZ == 0) + { + arm0->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateZ = pSkinOffset->fO / 16.0f; + armArmor0->translateZ = pSkinOffset->fO / 16.0f; + } + arm0Offsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Arm1: + if (pSkinOffset->fD == 1 && arm1->translateX == 0) + { + arm1->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateX = pSkinOffset->fO / 16.0f; + armArmor1->translateX = pSkinOffset->fO / 16.0f; + } + arm1Offsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && arm1->translateY == 0) + { + arm1->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateY = pSkinOffset->fO / 16.0f; + armArmor1->translateY = pSkinOffset->fO / 16.0f; + } + arm1Offsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && arm1->translateZ == 0) + { + arm1->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateZ = pSkinOffset->fO / 16.0f; + armArmor1->translateZ = pSkinOffset->fO / 16.0f; + } + arm1Offsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Leg0: + if (pSkinOffset->fD == 1 && leg0->translateX == 0) + { + leg0->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateX = pSkinOffset->fO / 16.0f; + legging0->translateX = pSkinOffset->fO / 16.0f; + sock0->translateX = pSkinOffset->fO / 16.0f; + boot0->translateX = pSkinOffset->fO / 16.0f; + } + leg0Offsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && leg0->translateY == 0) + { + leg0->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateY = pSkinOffset->fO / 16.0f; + legging0->translateY = pSkinOffset->fO / 16.0f; + sock0->translateY = pSkinOffset->fO / 16.0f; + boot0->translateY = pSkinOffset->fO / 16.0f; + } + leg0Offsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && leg0->translateZ == 0) + { + leg0->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateZ = pSkinOffset->fO / 16.0f; + legging0->translateZ = pSkinOffset->fO / 16.0f; + sock0->translateZ = pSkinOffset->fO / 16.0f; + boot0->translateZ = pSkinOffset->fO / 16.0f; + } + leg0Offsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Leg1: + if (pSkinOffset->fD == 1 && leg1->translateX == 0) + { + leg1->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateX = pSkinOffset->fO / 16.0f; + legging1->translateX = pSkinOffset->fO / 16.0f; + sock1->translateX = pSkinOffset->fO / 16.0f; + boot1->translateX = pSkinOffset->fO / 16.0f; + } + leg1Offsets[0] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && leg1->translateY == 0) + { + leg1->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateY = pSkinOffset->fO / 16.0f; + legging1->translateY = pSkinOffset->fO / 16.0f; + sock1->translateY = pSkinOffset->fO / 16.0f; + boot1->translateY = pSkinOffset->fO / 16.0f; + } + leg1Offsets[1] = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && leg1->translateZ == 0) + { + leg1->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateZ = pSkinOffset->fO / 16.0f; + legging1->translateZ = pSkinOffset->fO / 16.0f; + sock1->translateZ = pSkinOffset->fO / 16.0f; + boot1->translateZ = pSkinOffset->fO / 16.0f; + } + leg1Offsets[2] = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Helmet: + if (m_isArmor) + { + if (pSkinOffset->fD == 1 && head->translateX == headOffsets[0]) + { + head->translateX += pSkinOffset->fO / 16.0f; + hair->translateX += pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && head->translateY == headOffsets[1]) + { + head->translateY += pSkinOffset->fO / 16.0f; + hair->translateY += pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && head->translateZ == headOffsets[2]) + { + head->translateZ += pSkinOffset->fO / 16.0f; + hair->translateZ += pSkinOffset->fO / 16.0f; + } + } + break; + case eBodyOffset_BodyArmor: + if (m_isArmor && !body->isArmorPart2) + { + if (pSkinOffset->fD == 1 && body->translateX == bodyOffsets[0]) + body->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && body->translateY == bodyOffsets[1]) + body->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && body->translateZ == bodyOffsets[2]) + body->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_ArmArmor0: + if (m_isArmor) + { + if (pSkinOffset->fD == 1 && arm0->translateX == arm0Offsets[0]) + arm0->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && arm0->translateY == arm0Offsets[1]) + arm0->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && arm0->translateZ == arm0Offsets[2]) + arm0->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_ArmArmor1: + if (m_isArmor) + { + if (pSkinOffset->fD == 1 && arm1->translateX == arm1Offsets[0]) + arm1->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && arm1->translateY == arm1Offsets[1]) + arm1->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && arm1->translateZ == arm1Offsets[2]) + arm1->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Waist: + if (m_isArmor && body->isArmorPart2) + { + if (pSkinOffset->fD == 1 && body->translateX == bodyOffsets[0]) + body->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && body->translateY == bodyOffsets[1]) + body->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && body->translateZ == bodyOffsets[2]) + body->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Legging0: + if (m_isArmor && leg0->isArmorPart2) + { + if (pSkinOffset->fD == 1 && leg0->translateX == leg0Offsets[0]) + leg0->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && leg0->translateY == leg0Offsets[1]) + leg0->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && leg0->translateZ == leg0Offsets[2]) + leg0->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Legging1: + if (m_isArmor && leg1->isArmorPart2) + { + if (pSkinOffset->fD == 1 && leg1->translateX == leg1Offsets[0]) + leg1->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && leg1->translateY == leg1Offsets[1]) + leg1->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && leg1->translateZ == leg1Offsets[2]) + leg1->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Boot0: + if (m_isArmor && !leg0->isArmorPart2) + { + if (pSkinOffset->fD == 1 && leg0->translateX == leg0Offsets[0]) + leg0->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && leg0->translateY == leg0Offsets[1]) + leg0->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && leg0->translateZ == leg0Offsets[2]) + leg0->translateZ += pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Boot1: + if (m_isArmor && !leg1->isArmorPart2) + { + if (pSkinOffset->fD == 1 && leg1->translateX == leg1Offsets[0]) + leg1->translateX += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 2 && leg1->translateY == leg1Offsets[1]) + leg1->translateY += pSkinOffset->fO / 16.0f; + else if (pSkinOffset->fD == 3 && leg1->translateZ == leg1Offsets[2]) + leg1->translateZ += pSkinOffset->fO / 16.0f; + } + break; + } + } + } } setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask); @@ -293,16 +713,14 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float leg1->render(scale, usecompiled); hair->render(scale, usecompiled); - if (jacket) + if (m_is64x64) + { jacket->render(scale, usecompiled); - if (sleeve0) sleeve0->render(scale, usecompiled); - if (sleeve1) sleeve1->render(scale, usecompiled); - if (pants0) pants0->render(scale, usecompiled); - if (pants1) pants1->render(scale, usecompiled); + } glPopMatrix(); } @@ -315,17 +733,322 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - - if (jacket) + if (m_is64x64) + { jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - if (sleeve0) sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - if (sleeve1) sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - if (pants0) pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); - if (pants1) pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + waist->render(scale, usecompiled); + belt->render(scale, usecompiled); + bodyArmor->render(scale, usecompiled); + armArmor0->render(scale, usecompiled); + armArmor1->render(scale, usecompiled); + legging0->render(scale, usecompiled); + legging1->render(scale, usecompiled); + sock0->render(scale, usecompiled); + sock1->render(scale, usecompiled); + boot0->render(scale, usecompiled); + boot1->render(scale, usecompiled); + } + } +} + +// This code is similar to what's above, but allows skin offsets to work in the skin select menu - Langtanium +void HumanoidModel::renderUI(float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled, vector *skinOffsets) +{ + // Reset offsets so they don't leak onto other skins - Langtanium + head->translateX = 0; + head->translateY = 0; + head->translateZ = 0; + hair->translateX = 0; + hair->translateY = 0; + hair->translateZ = 0; + body->translateX = 0; + body->translateY = 0; + body->translateZ = 0; + arm0->translateX = 0; + arm0->translateY = 0; + arm0->translateZ = 0; + arm1->translateX = 0; + arm1->translateY = 0; + arm1->translateZ = 0; + leg0->translateX = 0; + leg0->translateY = 0; + leg0->translateZ = 0; + leg1->translateX = 0; + leg1->translateY = 0; + leg1->translateZ = 0; + if (m_is64x64) + { + jacket->translateX = 0; + jacket->translateY = 0; + jacket->translateZ = 0; + sleeve0->translateX = 0; + sleeve0->translateY = 0; + sleeve0->translateZ = 0; + sleeve1->translateX = 0; + sleeve1->translateY = 0; + sleeve1->translateZ = 0; + pants0->translateX = 0; + pants0->translateY = 0; + pants0->translateZ = 0; + pants1->translateX = 0; + pants1->translateY = 0; + pants1->translateZ = 0; + bodyArmor->translateX = 0; + bodyArmor->translateY = 0; + bodyArmor->translateZ = 0; + waist->translateX = 0; + waist->translateY = 0; + waist->translateZ = 0; + belt->translateX = 0; + belt->translateY = 0; + belt->translateZ = 0; + armArmor0->translateX = 0; + armArmor0->translateY = 0; + armArmor0->translateZ = 0; + armArmor1->translateX = 0; + armArmor1->translateY = 0; + armArmor1->translateZ = 0; + legging0->translateX = 0; + legging0->translateY = 0; + legging0->translateZ = 0; + legging1->translateX = 0; + legging1->translateY = 0; + legging1->translateZ = 0; + sock0->translateX = 0; + sock0->translateY = 0; + sock0->translateZ = 0; + sock1->translateX = 0; + sock1->translateY = 0; + sock1->translateZ = 0; + boot0->translateX = 0; + boot0->translateY = 0; + boot0->translateZ = 0; + boot1->translateX = 0; + boot1->translateY = 0; + boot1->translateZ = 0; + } + + if (skinOffsets != nullptr) + { + for( SKIN_OFFSET *pSkinOffset : *skinOffsets ) + { + switch (pSkinOffset->ePart) + { + case eBodyOffset_Head: + if (pSkinOffset->fD == 1 && head->translateX == 0) + { + head->translateX = pSkinOffset->fO / 16.0f; + hair->translateX = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 2 && head->translateY == 0) + { + head->translateY = pSkinOffset->fO / 16.0f; + hair->translateY = pSkinOffset->fO / 16.0f; + } + else if (pSkinOffset->fD == 3 && head->translateZ == 0) + { + head->translateZ = pSkinOffset->fO / 16.0f; + hair->translateZ = pSkinOffset->fO / 16.0f; + } + break; + case eBodyOffset_Body: + if (pSkinOffset->fD == 1 && body->translateX == 0) + { + body->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateX = pSkinOffset->fO / 16.0f; + bodyArmor->translateX = pSkinOffset->fO / 16.0f; + waist->translateX = pSkinOffset->fO / 16.0f; + belt->translateX = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 2 && body->translateY == 0) + { + body->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateY = pSkinOffset->fO / 16.0f; + bodyArmor->translateY = pSkinOffset->fO / 16.0f; + waist->translateY = pSkinOffset->fO / 16.0f; + belt->translateY = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 3 && body->translateZ == 0) + { + body->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + jacket->translateZ = pSkinOffset->fO / 16.0f; + bodyArmor->translateZ = pSkinOffset->fO / 16.0f; + waist->translateZ = pSkinOffset->fO / 16.0f; + belt->translateZ = pSkinOffset->fO / 16.0f; + } + } + break; + case eBodyOffset_Arm0: + if (pSkinOffset->fD == 1 && arm0->translateX == 0) + { + arm0->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateX = pSkinOffset->fO / 16.0f; + armArmor0->translateX = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 2 && arm0->translateY == 0) + { + arm0->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateY = pSkinOffset->fO / 16.0f; + armArmor0->translateY = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 3 && arm0->translateZ == 0) + { + arm0->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve0->translateZ = pSkinOffset->fO / 16.0f; + armArmor0->translateZ = pSkinOffset->fO / 16.0f; + } + } + break; + case eBodyOffset_Arm1: + if (pSkinOffset->fD == 1 && arm1->translateX == 0) + { + arm1->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateX = pSkinOffset->fO / 16.0f; + armArmor1->translateX = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 2 && arm1->translateY == 0) + { + arm1->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateY = pSkinOffset->fO / 16.0f; + armArmor1->translateY = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 3 && arm1->translateZ == 0) + { + arm1->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + sleeve1->translateZ = pSkinOffset->fO / 16.0f; + armArmor1->translateZ = pSkinOffset->fO / 16.0f; + } + } + break; + case eBodyOffset_Leg0: + if (pSkinOffset->fD == 1 && leg0->translateX == 0) + { + leg0->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateX = pSkinOffset->fO / 16.0f; + legging0->translateX = pSkinOffset->fO / 16.0f; + sock0->translateX = pSkinOffset->fO / 16.0f; + boot0->translateX = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 2 && leg0->translateY == 0) + { + leg0->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateY = pSkinOffset->fO / 16.0f; + legging0->translateY = pSkinOffset->fO / 16.0f; + sock0->translateY = pSkinOffset->fO / 16.0f; + boot0->translateY = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 3 && leg0->translateZ == 0) + { + leg0->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants0->translateZ = pSkinOffset->fO / 16.0f; + legging0->translateZ = pSkinOffset->fO / 16.0f; + sock0->translateZ = pSkinOffset->fO / 16.0f; + boot0->translateZ = pSkinOffset->fO / 16.0f; + } + } + break; + case eBodyOffset_Leg1: + if (pSkinOffset->fD == 1 && leg1->translateX == 0) + { + leg1->translateX = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateX = pSkinOffset->fO / 16.0f; + legging1->translateX = pSkinOffset->fO / 16.0f; + sock1->translateX = pSkinOffset->fO / 16.0f; + boot1->translateX = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 2 && leg1->translateY == 0) + { + leg1->translateY = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateY = pSkinOffset->fO / 16.0f; + legging1->translateY = pSkinOffset->fO / 16.0f; + sock1->translateY = pSkinOffset->fO / 16.0f; + boot1->translateY = pSkinOffset->fO / 16.0f; + } + } + else if (pSkinOffset->fD == 3 && leg1->translateZ == 0) + { + leg1->translateZ = pSkinOffset->fO / 16.0f; + if (m_is64x64) + { + pants1->translateZ = pSkinOffset->fO / 16.0f; + legging1->translateZ = pSkinOffset->fO / 16.0f; + sock1->translateZ = pSkinOffset->fO / 16.0f; + boot1->translateZ = pSkinOffset->fO / 16.0f; + } + } + break; + } + } + } + + setupAnim(time, r, bob, yRot, xRot, scale, nullptr, m_uiAnimOverrideBitmask); + + head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + if (m_is64x64) + { + jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + pants0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + pants1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + waist->render(scale, usecompiled); + belt->render(scale, usecompiled); + bodyArmor->render(scale, usecompiled); + armArmor0->render(scale, usecompiled); + armArmor1->render(scale, usecompiled); + legging0->render(scale, usecompiled); + legging1->render(scale, usecompiled); + sock0->render(scale, usecompiled); + sock1->render(scale, usecompiled); + boot0->render(scale, usecompiled); + boot1->render(scale, usecompiled); } } diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h index 4c7f95f5..3d194411 100644 --- a/Minecraft.Client/HumanoidModel.h +++ b/Minecraft.Client/HumanoidModel.h @@ -15,6 +15,8 @@ public: float eating_swing; bool elytraFlying; bool elytraCrouching; + bool m_isArmor; + bool m_is64x64; unsigned int m_uiAnimOverrideBitmask; float m_fYOffset; enum animbits