Fixed crashes

Fixed code for offsets preventing crashes. The amount of offsets is correctly obtain, but lacks the actual data.
This commit is contained in:
Langtanium
2026-04-11 19:36:52 -07:00
parent f18ac12cc0
commit aa769d54ad
6 changed files with 26 additions and 36 deletions

View File

@@ -687,25 +687,6 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
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;
@@ -853,6 +834,14 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float
}
}
void HumanoidModel::setOffset(int part, wchar_t direction, float amount)
{
if (part == 1)
head->y += amount;
else if (part == 2)
body->y += amount;
}
void HumanoidModel::renderHair(float scale,bool usecompiled)
{
hair->yRot = head->yRot;

View File

@@ -85,6 +85,7 @@ public:
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands);
virtual void render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled);
virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr<Entity> entity, unsigned int uiBitmaskOverrideAnim = 0);
virtual void setOffset(int part, wchar_t direction, float amount);
void renderHair(float scale, bool usecompiled);
void renderEars(float scale, bool usecompiled);
void renderCloak(float scale, bool usecompiled);

View File

@@ -273,6 +273,23 @@ 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:
resModel->setOffset(1, pModelOffset->fD, pModelOffset->fO);
break;
case eBodyOffset_Body:
resModel->setOffset(2, pModelOffset->fD, pModelOffset->fO);
break;
}
}
}
armorParts1->bowAndArrow = armorParts2->bowAndArrow = resModel->bowAndArrow = false;
armorParts1->sneaking = armorParts2->sneaking = resModel->sneaking = false;
armorParts1->holdingRightHand = armorParts2->holdingRightHand = resModel->holdingRightHand = 0;

View File

@@ -353,7 +353,6 @@ void Entity::_init(bool useSmallId, Level *level)
// 4J Added
m_ignoreVerticalCollisions = false;
m_uiAnimOverrideBitmask = 0L;
m_skinOffsets = nullptr;
m_ignorePortal = false;
}
@@ -2144,14 +2143,4 @@ 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,12 +422,9 @@ 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

@@ -653,7 +653,6 @@ 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
@@ -3198,8 +3197,6 @@ vector<SKIN_OFFSET *> *Player::GetModelOffsets()
m_bCheckedForModelOffsets=true;
}
}
if(m_bCheckedForModelOffsets) setSkinOffsets(getSkinModelOffsets(m_dwSkinId));
}
return m_ppModelOffsets;
}