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:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user