Made more changes

Made more changes in files to support skin offsets. The game still crashes when trying to load skins.
This commit is contained in:
Langtanium
2026-04-07 16:50:43 -07:00
parent 1a8f353297
commit 8e76763a3d
11 changed files with 63 additions and 59 deletions

View File

@@ -2711,7 +2711,7 @@ void ClientConnection::handleTextureAndGeometry(shared_ptr<TextureAndGeometryPac
{
unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(packet->dwSkinID);
send(std::make_shared<TextureAndGeometryPacket>(packet->textureName, pbData, dwBytes, app.GetAdditionalSkinBoxes(packet->dwSkinID), uiAnimOverrideBitmask));
send(std::make_shared<TextureAndGeometryPacket>(packet->textureName, pbData, dwBytes, app.GetAdditionalSkinBoxes(packet->dwSkinID), app.GetModelOffsets(packet->dwSkinID), uiAnimOverrideBitmask));
}
}
}

View File

@@ -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<ModelPart *> * SetAdditionalSkinBoxes(DWORD dwSkinID, vector<SKIN_BOX *> *pvSkinBoxA);
vector<SKIN_OFFSET *> * SetSkinOffsets(DWORD dwSkinID, vector<SKIN_OFFSET *> *pvSkinOffsetA);
vector<ModelPart *> *GetAdditionalModelParts(DWORD dwSkinID);
vector<SKIN_BOX *> *GetAdditionalSkinBoxes(DWORD dwSkinID);
void SetSkinOffsets(DWORD dwSkinID, SKIN_OFFSET *SkinOffsetA, DWORD dwSkinOffsetC);
vector<SKIN_OFFSET *> * SetSkinOffsets(DWORD dwSkinID, vector<SKIN_OFFSET *> *pvSkinOffsetA);
vector<SKIN_OFFSET *> *GetModelOffsets(DWORD dwSkinID);
void SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask);
unsigned int GetAnimOverrideBitmask(DWORD dwSkinID);

View File

@@ -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<Model::SKIN_BOX *> *m_pvAdditionalBoxes;
vector<ModelPart *> *m_pvAdditionalModelParts;
vector<SKIN_OFFSET *> *m_pvModelOffsets;
};

View File

@@ -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<SKIN_OFFSET *>* 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;

View File

@@ -273,25 +273,6 @@ void PlayerRenderer::render(shared_ptr<Entity> _mob, double x, double y, double
}
}
vector<SKIN_OFFSET *>* 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<ModelPart*>* additionalModelParts = Minecraft::GetInstance()->player->GetAdditionalModelParts();
vector<ModelPart*>* 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<ModelPart*> additionalModelPartSet(additionalModelParts->begin(), additionalModelParts->end());
vector<ModelPart*> armchildren = resModel->arm0->children;

View File

@@ -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<<HumanoidModel::eAnim_DisableRenderTorso) |
(1<<HumanoidModel::eAnim_DisableRenderLeg0) |
(1<<HumanoidModel::eAnim_DisableRenderLeg1) |
(1<<HumanoidModel::eAnim_DisableRenderHair);
(1<<HumanoidModel::eAnim_DisableRenderHair) |
(1<<HumanoidModel::eAnim_DisableRenderSleeve1) |
(1<<HumanoidModel::eAnim_DisableRenderSleeve0) |
(1<<HumanoidModel::eAnim_DisableRenderPants1) |
(1<<HumanoidModel::eAnim_DisableRenderPants0) |
(1<<HumanoidModel::eAnim_DisableRenderJacket);
if((m_uiAnimOverrideBitmask & HumanoidModel::m_staticBitmaskIgnorePlayerCustomAnimSetting)!=0)
{
@@ -2138,4 +2144,14 @@ unsigned int Entity::getAnimOverrideBitmask()
}
return m_uiAnimOverrideBitmask;
}
void Entity::setSkinOffsets(vector<SKIN_OFFSET *> *skinOffsets)
{
m_skinOffsets=skinOffsets;
//app.DebugPrintf("!!! Setting skin offsets to %d\n",skinOffsets);
}
vector<SKIN_OFFSET *> *Entity::getSkinOffsets()
{
return m_skinOffsets;
}

View File

@@ -422,9 +422,12 @@ public:
private:
unsigned int m_uiAnimOverrideBitmask;
vector<SKIN_OFFSET *> *m_skinOffsets;
public:
void setAnimOverrideBitmask(unsigned int uiBitmask);
unsigned int getAnimOverrideBitmask();
void setSkinOffsets(vector<SKIN_OFFSET *> *skinOffsets);
vector<SKIN_OFFSET *> *getSkinOffsets();
// 4J added
virtual bool isDespawnProtected() { return false; }

View File

@@ -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<SKIN_OFFSET *> *Player::getSkinModelOffsets(DWORD skinId)
{
vector<SKIN_OFFSET *> *skinOffsets = app.GetModelOffsets(skinId);
return skinOffsets;
}
void Player::setXuid(PlayerUID xuid)
{
m_xuid = xuid;
@@ -3150,7 +3163,7 @@ vector<ModelPart *> *Player::GetAdditionalModelParts()
vector<SKIN_OFFSET *> *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<SKIN_OFFSET *> *Player::GetModelOffsets()
m_bCheckedForModelOffsets=true;
}
}
if(m_bCheckedForModelOffsets) setSkinOffsets(getSkinModelOffsets(m_dwSkinId));
}
return m_ppModelOffsets;
}

View File

@@ -411,6 +411,7 @@ public:
static DWORD getCapeIdFromPath(const wstring &cape);
static wstring getCapePathFromId(DWORD capeId);
static unsigned int getSkinAnimOverrideBitmask(DWORD skinId);
vector<SKIN_OFFSET *> *getSkinModelOffsets(DWORD skinId);
// 4J Added
void setXuid(PlayerUID xuid);

View File

@@ -99,39 +99,6 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P
}
}
TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector<SKIN_BOX *> *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<DWORD>(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<SKIN_BOX *> *pvSkinBoxes, vector<SKIN_OFFSET *> *pvSkinOffsets, unsigned int uiAnimOverrideBitmask)
{
this->textureName = textureName;

View File

@@ -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<SKIN_BOX *> *pvSkinBoxes, unsigned int uiAnimOverrideBitmask);
TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector<SKIN_BOX *> *pvSkinBoxes, vector<SKIN_OFFSET *> *pvSkinOffsets, unsigned int uiAnimOverrideBitmask);
virtual void handle(PacketListener *listener);