From e0cf6f23c1bf94e72f342b666b20bdd8e361d628 Mon Sep 17 00:00:00 2001 From: Langtanium <94726057+Langtanium@users.noreply.github.com> Date: Tue, 21 Apr 2026 12:26:24 -0700 Subject: [PATCH] Added more skin offset code Added another offset enum for the helmet offset, fixed renderUIOffset() function not rendering skins that didn't have an offset, and added more code for offsets. --- Minecraft.Client/Common/DLC/DLCSkinFile.cpp | 6 +- .../Common/UI/UIControl_PlayerSkinPreview.cpp | 6 +- Minecraft.Client/HumanoidModel.cpp | 396 ++++++++++++------ Minecraft.Client/SkinOffset.h | 1 + 4 files changed, 281 insertions(+), 128 deletions(-) diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.cpp b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp index f37bf1f27..eec95c1db 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, @@ -305,6 +305,10 @@ void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring { pSkinOffset->ePart=eBodyOffset_Pants1; } + else if(wcscmp(wchBodyPart,L"HELMET")==0) + { + pSkinOffset->ePart=eBodyOffset_Helmet; + } else if(wcscmp(wchBodyPart,L"WAIST")==0) { pSkinOffset->ePart=eBodyOffset_Waist; diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp index 96abff511..77b72db68 100644 --- a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -367,10 +367,8 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou glEnable(GL_ALPHA_TEST); //model->prepareMobModel(mob, wp, ws, a); - 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); + // Using a modified version of the render function to render offsts is skin select menu + model->renderUIOffset(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true, m_pvModelOffsets); /*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 2863047c1..b0a394945 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -402,85 +402,54 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float { case eBodyOffset_Head: if(pModelOffset->fD == 1) - headOffsets[0] = pModelOffset->fO / 16.0f; + headOffsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - headOffsets[1] = pModelOffset->fO / 16.0f; + headOffsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - headOffsets[2] = pModelOffset->fO / 16.0f; + headOffsets[2] += pModelOffset->fO / 16.0f; break; case eBodyOffset_Body: if(pModelOffset->fD == 1) - bodyOffsets[0] = pModelOffset->fO / 16.0f; + bodyOffsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - bodyOffsets[1] = pModelOffset->fO / 16.0f; + bodyOffsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - bodyOffsets[2] = pModelOffset->fO / 16.0f; + bodyOffsets[2] += pModelOffset->fO / 16.0f; break; case eBodyOffset_Arm0: if(pModelOffset->fD == 1) - arm0Offsets[0] = pModelOffset->fO / 16.0f; + arm0Offsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - arm0Offsets[1] = pModelOffset->fO / 16.0f; + arm0Offsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - arm0Offsets[2] = pModelOffset->fO / 16.0f; + arm0Offsets[2] += pModelOffset->fO / 16.0f; break; case eBodyOffset_Arm1: if(pModelOffset->fD == 1) - arm1Offsets[0] = pModelOffset->fO / 16.0f; + arm1Offsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - arm1Offsets[1] = pModelOffset->fO / 16.0f; + arm1Offsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - arm1Offsets[2] = pModelOffset->fO / 16.0f; + arm1Offsets[2] += pModelOffset->fO / 16.0f; break; case eBodyOffset_Leg0: if(pModelOffset->fD == 1) - leg0Offsets[0] = pModelOffset->fO / 16.0f; + leg0Offsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - leg0Offsets[1] = pModelOffset->fO / 16.0f; + leg0Offsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - leg0Offsets[2] = pModelOffset->fO / 16.0f; + leg0Offsets[2] += pModelOffset->fO / 16.0f; break; case eBodyOffset_Leg1: if(pModelOffset->fD == 1) - leg1Offsets[0] = pModelOffset->fO / 16.0f; + leg1Offsets[0] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 2) - leg1Offsets[1] = pModelOffset->fO / 16.0f; + leg1Offsets[1] += pModelOffset->fO / 16.0f; else if(pModelOffset->fD == 3) - leg1Offsets[2] = pModelOffset->fO / 16.0f; + 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(); @@ -549,25 +518,65 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float if (waist != 0) waist->render(scale, usecompiled); if (belt != 0) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); belt->render(scale, usecompiled); + glPopMatrix(); + } if (bodyArmor != 0) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); bodyArmor->render(scale, usecompiled); + glPopMatrix(); + } if (armArmor0 != 0) + { + glPushMatrix(); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); armArmor0->render(scale, usecompiled); + glPopMatrix(); + } if (armArmor1 != 0) + { + glPushMatrix(); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); armArmor1->render(scale, usecompiled); + glPopMatrix(); + } if (legging0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); legging0->render(scale, usecompiled); + glPopMatrix(); + } if (legging1 != 0) + { + glPushMatrix(); + glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); legging1->render(scale, usecompiled); + glPopMatrix(); + } if (sock0 != 0) sock0->render(scale, usecompiled); if (sock1 != 0) sock1->render(scale, usecompiled); if (boot0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); boot0->render(scale, usecompiled); + glPopMatrix(); + } if (boot1 != 0) + { + glPushMatrix(); + glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); boot1->render(scale, usecompiled); + glPopMatrix(); + } } } @@ -641,93 +650,134 @@ void HumanoidModel::renderUIOffset(float time, float r, float bob, float yRot, f 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(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]); - body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + jacket->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); + } + if (sleeve0 != 0) + { glPushMatrix(); glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); - arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + sleeve0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); + } + if (sleeve1 != 0) + { glPushMatrix(); glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); - arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + sleeve1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); glPopMatrix(); + } + if (pants0 != 0) + { glPushMatrix(); glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); - leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + 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) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); + belt->render(scale, usecompiled); + glPopMatrix(); + } + if (bodyArmor != 0) + { + glPushMatrix(); + glTranslatef(bodyOffsets[0], bodyOffsets[1], bodyOffsets[2]); + bodyArmor->render(scale, usecompiled); + glPopMatrix(); + } + if (armArmor0 != 0) + { + glPushMatrix(); + glTranslatef(arm0Offsets[0], arm0Offsets[1], arm0Offsets[2]); + armArmor0->render(scale, usecompiled); + glPopMatrix(); + } + if (armArmor1 != 0) + { + glPushMatrix(); + glTranslatef(arm1Offsets[0], arm1Offsets[1], arm1Offsets[2]); + armArmor1->render(scale, usecompiled); + glPopMatrix(); + } + if (legging0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); + legging0->render(scale, usecompiled); + glPopMatrix(); + } + if (legging1 != 0) + { glPushMatrix(); glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); - leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0&&(!(m_uiAnimOverrideBitmask&(1<0||!m_isArmor)); + legging1->render(scale, usecompiled); 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); } + if (sock0 != 0) + sock0->render(scale, usecompiled); + if (sock1 != 0) + sock1->render(scale, usecompiled); + if (boot0 != 0) + { + glPushMatrix(); + glTranslatef(leg0Offsets[0], leg0Offsets[1], leg0Offsets[2]); + boot0->render(scale, usecompiled); + glPopMatrix(); + } + if (boot1 != 0) + { + glPushMatrix(); + glTranslatef(leg1Offsets[0], leg1Offsets[1], leg1Offsets[2]); + boot1->render(scale, usecompiled); + glPopMatrix(); + } + } void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) @@ -735,6 +785,99 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float //bool bIsAttacking = (attackTime > -9990.0f); { + /* Code to get armor offsets, not fully implemented yet. Directly applying the offsets + causes the armor pivot points to not aline with the player model pivot points. Some math + is requied to properly rotate the armor pivot points around the player model pivot points - Langtanium*/ + 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}; + if (m_isArmor) + { + shared_ptr player = dynamic_pointer_cast(entity); + vector* pModelOffsets = nullptr; + if (player != nullptr) + pModelOffsets = player->GetModelOffsets(); + if (pModelOffsets != nullptr) + { + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + { + switch (pModelOffset->ePart) + { + case eBodyOffset_Helmet: + if(pModelOffset->fD == 1) + headOffsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + headOffsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + headOffsets[2] += pModelOffset->fO; + case eBodyOffset_Belt: + if (!body->isArmorPart1) + { + if(pModelOffset->fD == 1) + bodyOffsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + bodyOffsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + bodyOffsets[2] += pModelOffset->fO; + } + break; + case eBodyOffset_BodyArmor: + if (body->isArmorPart1) + { + if(pModelOffset->fD == 1) + bodyOffsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + bodyOffsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + bodyOffsets[2] += pModelOffset->fO; + } + break; + case eBodyOffset_ArmArmor0: + if(pModelOffset->fD == 1) + arm0Offsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + arm0Offsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + arm0Offsets[2] += pModelOffset->fO; + break; + case eBodyOffset_ArmArmor1: + if(pModelOffset->fD == 1) + arm1Offsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + arm1Offsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + arm1Offsets[2] += pModelOffset->fO; + break; + case eBodyOffset_Boot0: + if (leg0->isArmorPart1) + { + if(pModelOffset->fD == 1) + leg0Offsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + leg0Offsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + leg0Offsets[2] += pModelOffset->fO; + } + break; + case eBodyOffset_Boot1: + if (leg1->isArmorPart1) + { + if(pModelOffset->fD == 1) + leg1Offsets[0] += pModelOffset->fO; + else if(pModelOffset->fD == 2) + leg1Offsets[1] += pModelOffset->fO; + else if(pModelOffset->fD == 3) + leg1Offsets[2] += pModelOffset->fO; + } + break; + } + } + } + } + head->yRot = yRot / (float) (180.0f / PI); head->xRot = xRot / (float) (180.0f / PI); hair->yRot = head->yRot; @@ -959,6 +1102,13 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float body->y = 0.0f; arm0->y = 2.0f; arm1->y = 2.0f; + /*if (m_isArmor) // If armor apply helmet offset using some math, needs to be refined - Langtanium + { + head->x = headOffsets[1] * sin(yRot / (float) (180.0f / PI)) * sin(xRot / (float) (180.0f / PI)); + head->y = headOffsets[1] * cos(xRot / (float) (180.0f / PI)); + head->z = headOffsets[1] * sin(xRot / (float) (180.0f / PI)) - headOffsets[1] * abs(sin(yRot / (float) (180.0f / PI))) * sin(xRot / (float) (180.0f / PI)); + } + else*/ head->y = 0.0f; hair->y = 0.0f; ear->y = 1.0f; @@ -998,7 +1148,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float jacket->z = body->z; jacket->xRot = body->xRot; jacket->yRot = body->yRot; - jacket->zRot = body->zRot; } if (sleeve0 != 0) { @@ -1043,7 +1192,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float waist->z = body->z; waist->xRot = body->xRot; waist->yRot = body->yRot; - waist->zRot = body->zRot; } if (belt != 0) { @@ -1052,7 +1200,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float belt->z = body->z; belt->xRot = body->xRot; belt->yRot = body->yRot; - belt->zRot = body->zRot; } if (bodyArmor != 0) { @@ -1061,7 +1208,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float bodyArmor->z = body->z; bodyArmor->xRot = body->xRot; bodyArmor->yRot = body->yRot; - bodyArmor->zRot = body->zRot; } if (armArmor0 != 0) { @@ -1178,18 +1324,22 @@ void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled) arm0->zRot = model->arm0->zRot; if (sleeve0 != 0) + { sleeve0->xRot = model->arm0->xRot; sleeve0->yRot = model->arm0->yRot; sleeve0->zRot = model->arm0->zRot; + } arm1->xRot = model->arm1->xRot; arm1->yRot = model->arm1->yRot; arm1->zRot = model->arm1->zRot; if (sleeve1 != 0) + { sleeve1->xRot = model->arm1->xRot; sleeve1->yRot = model->arm1->yRot; sleeve1->zRot = model->arm1->zRot; + } leg0->xRot = model->leg0->xRot; if (pants0 != 0) diff --git a/Minecraft.Client/SkinOffset.h b/Minecraft.Client/SkinOffset.h index bba7bcc2a..79d39cac3 100644 --- a/Minecraft.Client/SkinOffset.h +++ b/Minecraft.Client/SkinOffset.h @@ -15,6 +15,7 @@ enum eBodyOffset eBodyOffset_Sleeve1, eBodyOffset_Pants0, eBodyOffset_Pants1, + eBodyOffset_Helmet, eBodyOffset_Waist, eBodyOffset_Legging0, eBodyOffset_Legging1,