diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp index c9bc99d2..66d2bacf 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -2711,7 +2711,7 @@ void ClientConnection::handleTextureAndGeometry(shared_ptrdwSkinID); - send(std::make_shared(packet->textureName, pbData, dwBytes, app.GetAdditionalSkinBoxes(packet->dwSkinID), uiAnimOverrideBitmask)); + send(std::make_shared(packet->textureName, pbData, dwBytes, app.GetAdditionalSkinBoxes(packet->dwSkinID), app.GetModelOffsets(packet->dwSkinID), uiAnimOverrideBitmask)); } } } diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index 6e3dcada..d7905d1b 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -844,11 +844,11 @@ public: // Storing additional model parts per skin texture void SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC); - void SetSkinOffsets(DWORD dwSkinID, SKIN_OFFSET *SkinOffsetA, DWORD dwSkinOffsetC); vector * SetAdditionalSkinBoxes(DWORD dwSkinID, vector *pvSkinBoxA); - vector * SetSkinOffsets(DWORD dwSkinID, vector *pvSkinOffsetA); vector *GetAdditionalModelParts(DWORD dwSkinID); vector *GetAdditionalSkinBoxes(DWORD dwSkinID); + void SetSkinOffsets(DWORD dwSkinID, SKIN_OFFSET *SkinOffsetA, DWORD dwSkinOffsetC); + vector * SetSkinOffsets(DWORD dwSkinID, vector *pvSkinOffsetA); vector *GetModelOffsets(DWORD dwSkinID); void SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask); unsigned int GetAnimOverrideBitmask(DWORD dwSkinID); diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h index 22f4991b..9789ecec 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h @@ -5,6 +5,7 @@ #include "..\..\Textures.h" //#include "..\..\Xbox\DLC\DLCSkinFile.h" #include "..\..\Model.h" +#include "..\..\SkinOffset.h" using namespace std; @@ -103,4 +104,5 @@ private: ESkinPreviewAnimations m_currentAnimation; //vector *m_pvAdditionalBoxes; vector *m_pvAdditionalModelParts; + vector *m_pvModelOffsets; }; \ No newline at end of file diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index 509da6d3..b1c0cc48 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -558,6 +558,26 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float arm0->xRot += ((float) (Mth::sin(bob * 0.067f)) * 0.05f); arm1->xRot -= ((float) (Mth::sin(bob * 0.067f)) * 0.05f); } + + vector* pModelOffsets=entity->getSkinOffsets(); + if (pModelOffsets!=nullptr) + { + for( SKIN_OFFSET *pModelOffset : *pModelOffsets ) + { + switch (pModelOffset->ePart) + { + case eBodyOffset_Head: + if (pModelOffset->fD == L'Y') + head->y += pModelOffset->fO; + break; + case eBodyOffset_Body: + if (pModelOffset->fD == L'Y') + body->y += pModelOffset->fO; + break; + } + } + } + if (jacket != 0) { jacket->x = body->x; diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index d6cbe753..68ca7454 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -273,25 +273,6 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } } - vector* pModelOffsets=mob->GetModelOffsets(); - if (pModelOffsets!=nullptr) - { - for( SKIN_OFFSET pModelOffset : pModelOffsets ) - { - switch (pModelOffset->ePart) - { - case eBodyOffset_Head: - if (pModelOffset->fD == L'Y') - resModel->head->y += pModelOffset->fO; - break; - case eBodyOffset_Body: - if (pModelOffset->fD == L'Y') - resModel->body->y += pModelOffset->fO; - break; - } - } - } - armorParts1->bowAndArrow = armorParts2->bowAndArrow = resModel->bowAndArrow = false; armorParts1->sneaking = armorParts2->sneaking = resModel->sneaking = false; armorParts1->holdingRightHand = armorParts2->holdingRightHand = resModel->holdingRightHand = 0; @@ -577,7 +558,7 @@ void PlayerRenderer::renderHand() resModel->sleeve0->render(1 / 16.0f,true); //Render custom skin boxes on viewmodel - Botch - vector* additionalModelParts = Minecraft::GetInstance()->player->GetAdditionalModelParts(); + vector* additionalModelParts = player->GetAdditionalModelParts(); if (!additionalModelParts) return; //If there are no custom boxes, return. This fixes bug where the game will crash if you select a skin with no additional boxes. std::unordered_set additionalModelPartSet(additionalModelParts->begin(), additionalModelParts->end()); vector armchildren = resModel->arm0->children; diff --git a/Minecraft.World/Entity.cpp b/Minecraft.World/Entity.cpp index 924312e5..143a1d55 100644 --- a/Minecraft.World/Entity.cpp +++ b/Minecraft.World/Entity.cpp @@ -353,6 +353,7 @@ void Entity::_init(bool useSmallId, Level *level) // 4J Added m_ignoreVerticalCollisions = false; m_uiAnimOverrideBitmask = 0L; + m_skinOffsets = nullptr; m_ignorePortal = false; } @@ -2128,7 +2129,12 @@ unsigned int Entity::getAnimOverrideBitmask() (1< *skinOffsets) +{ + m_skinOffsets=skinOffsets; + //app.DebugPrintf("!!! Setting skin offsets to %d\n",skinOffsets); +} +vector *Entity::getSkinOffsets() +{ + return m_skinOffsets; } \ No newline at end of file diff --git a/Minecraft.World/Entity.h b/Minecraft.World/Entity.h index a738c2ba..20e129c2 100644 --- a/Minecraft.World/Entity.h +++ b/Minecraft.World/Entity.h @@ -422,9 +422,12 @@ public: private: unsigned int m_uiAnimOverrideBitmask; + vector *m_skinOffsets; public: void setAnimOverrideBitmask(unsigned int uiBitmask); unsigned int getAnimOverrideBitmask(); + void setSkinOffsets(vector *skinOffsets); + vector *getSkinOffsets(); // 4J added virtual bool isDespawnProtected() { return false; } diff --git a/Minecraft.World/Player.cpp b/Minecraft.World/Player.cpp index fbd79f0f..5dfc23b1 100644 --- a/Minecraft.World/Player.cpp +++ b/Minecraft.World/Player.cpp @@ -100,6 +100,9 @@ void Player::_init() m_ppAdditionalModelParts=nullptr; m_bCheckedForModelParts=false; m_bCheckedDLCForModelParts=false; + m_ppModelOffsets=nullptr; + m_bCheckedForModelOffsets=false; + m_bCheckedDLCForModelOffsets=false; #if defined(__PS3__) || defined(__ORBIS__) m_ePlayerNameValidState=ePlayerNameValid_NotSet; @@ -650,6 +653,7 @@ void Player::setCustomSkin(DWORD skinId) setIsIdle(false); setAnimOverrideBitmask(getSkinAnimOverrideBitmask(skinId)); + setSkinOffsets(getSkinModelOffsets(skinId)); if( !GET_IS_DLC_SKIN_FROM_BITMASK(skinId) ) { // GET_UGC_SKIN_ID_FROM_BITMASK will always be zero - this was for a possible custom skin editor skin @@ -713,7 +717,10 @@ void Player::setCustomSkin(DWORD skinId) // reset the check for model parts m_bCheckedForModelParts=false; m_bCheckedDLCForModelParts=false; + m_bCheckedForModelOffsets=false; + m_bCheckedDLCForModelOffsets=false; this->SetAdditionalModelParts(nullptr); + this->SetModelOffsets(nullptr); } @@ -759,6 +766,12 @@ unsigned int Player::getSkinAnimOverrideBitmask(DWORD skinId) return bitmask; } +vector *Player::getSkinModelOffsets(DWORD skinId) +{ + vector *skinOffsets = app.GetModelOffsets(skinId); + return skinOffsets; +} + void Player::setXuid(PlayerUID xuid) { m_xuid = xuid; @@ -3150,7 +3163,7 @@ vector *Player::GetAdditionalModelParts() vector *Player::GetModelOffsets() { - if(m_ppModelOffsets==nullptr && !m_bCheckedForModelParts) + if(m_ppModelOffsets==nullptr && !m_bCheckedForModelOffsets) { bool hasCustomTexture = !customTextureUrl.empty(); bool customTextureIsDefaultSkin = customTextureUrl.substr(0,3).compare(L"def") == 0; @@ -3185,6 +3198,8 @@ vector *Player::GetModelOffsets() m_bCheckedForModelOffsets=true; } } + + if(m_bCheckedForModelOffsets) setSkinOffsets(getSkinModelOffsets(m_dwSkinId)); } return m_ppModelOffsets; } diff --git a/Minecraft.World/Player.h b/Minecraft.World/Player.h index 79122f1a..8cb21974 100644 --- a/Minecraft.World/Player.h +++ b/Minecraft.World/Player.h @@ -411,6 +411,7 @@ public: static DWORD getCapeIdFromPath(const wstring &cape); static wstring getCapePathFromId(DWORD capeId); static unsigned int getSkinAnimOverrideBitmask(DWORD skinId); + vector *getSkinModelOffsets(DWORD skinId); // 4J Added void setXuid(PlayerUID xuid); diff --git a/Minecraft.World/TextureAndGeometryPacket.cpp b/Minecraft.World/TextureAndGeometryPacket.cpp index ecd98acf..c73ff44c 100644 --- a/Minecraft.World/TextureAndGeometryPacket.cpp +++ b/Minecraft.World/TextureAndGeometryPacket.cpp @@ -99,39 +99,6 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P } } -TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, unsigned int uiAnimOverrideBitmask) -{ - this->textureName = textureName; - - wstring skinValue = textureName.substr(7,textureName.size()); - skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); - std::wstringstream ss; - ss << std::dec << skinValue.c_str(); - ss >> this->dwSkinID; - this->dwSkinID = MAKE_SKIN_BITMASK(true, this->dwSkinID); - - this->pbData = pbData; - this->dwTextureBytes = dwBytes; - this->uiAnimOverrideBitmask = uiAnimOverrideBitmask; - if(pvSkinBoxes==nullptr) - { - this->dwBoxC=0; - this->BoxDataA=nullptr; - } - else - { - this->dwBoxC = static_cast(pvSkinBoxes->size()); - this->BoxDataA= new SKIN_BOX [this->dwBoxC]; - int iCount=0; - - for(auto& pSkinBox : *pvSkinBoxes) - { - this->BoxDataA[iCount++]=*pSkinBox; - } - } - -} - TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, vector *pvSkinOffsets, unsigned int uiAnimOverrideBitmask) { this->textureName = textureName; diff --git a/Minecraft.World/TextureAndGeometryPacket.h b/Minecraft.World/TextureAndGeometryPacket.h index 6c7855b2..370d0b9b 100644 --- a/Minecraft.World/TextureAndGeometryPacket.h +++ b/Minecraft.World/TextureAndGeometryPacket.h @@ -25,7 +25,6 @@ public: ~TextureAndGeometryPacket(); TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes); TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, DLCSkinFile *pDLCSkinFile); - TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, unsigned int uiAnimOverrideBitmask); TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, vector *pvSkinOffsets, unsigned int uiAnimOverrideBitmask); virtual void handle(PacketListener *listener);