Made changes to skin related code

Renamed all Alex skins and Developer Steve skin to match the official file names, reordered default skin to match the order in the official release of LCE, modified model type logic to be more optimized, added more anim flags to HumanoidModel.h, added code to show armor if the corresponding part is hidden but the "show armor" part anim flag is present, added code to handle extra skin box values of "hide with armor", "mirror skin box", and "scale", corrected player model second/overlay layer scale from 0.5 to 0.25, and fixed skin boxes not rendering on 64x64 DLC skins.
This commit is contained in:
Langtanium 2026-05-16 23:34:29 -07:00
parent 4cb96bcb44
commit e41b579603
43 changed files with 249 additions and 339 deletions

View file

@ -9615,7 +9615,14 @@ void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, D
{
EntityRenderDispatcher *dispatcher = EntityRenderDispatcher::instance;
EntityRenderer *renderer = dispatcher ? dispatcher->getRenderer(eTYPE_PLAYER) : nullptr;
Model *pModel = renderer ? renderer->getModel() : nullptr;
unsigned int m_uiAnimOverrideBitmask = GetAnimOverrideBitmask(dwSkinID);
Model *pModel;
if (m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_SlimModel))
pModel = renderer ? renderer->getModel(2) : nullptr;
else if (m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_WideModel))
pModel = renderer ? renderer->getModel(1) : nullptr;
else
pModel = renderer ? renderer->getModel(0) : nullptr;
vector<ModelPart *> *pvModelPart = new vector<ModelPart *>;
vector<SKIN_BOX *> *pvSkinBoxes = new vector<SKIN_BOX *>;
@ -9648,7 +9655,14 @@ vector<ModelPart *> * CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, vect
{
EntityRenderDispatcher *dispatcher = EntityRenderDispatcher::instance;
EntityRenderer *renderer = dispatcher ? dispatcher->getRenderer(eTYPE_PLAYER) : nullptr;
Model *pModel = renderer ? renderer->getModel() : nullptr;
unsigned int m_uiAnimOverrideBitmask = GetAnimOverrideBitmask(dwSkinID);
Model *pModel;
if (m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_SlimModel))
pModel = renderer ? renderer->getModel(2) : nullptr;
else if (m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_WideModel))
pModel = renderer ? renderer->getModel(1) : nullptr;
else
pModel = renderer ? renderer->getModel(0) : nullptr;
vector<ModelPart *> *pvModelPart = new vector<ModelPart *>;
EnterCriticalSection( &csAdditionalModelParts );

View file

@ -120,9 +120,9 @@ void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring
#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", wchBodyPart,
swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f%f%f%f", wchBodyPart,
#else
swscanf_s(value.c_str(), L"%9ls%f%f%f%f%f%f%f%f", wchBodyPart,10,
swscanf_s(value.c_str(), L"%9ls%f%f%f%f%f%f%f%f%f%f%f", wchBodyPart,10,
#endif
&pSkinBox->fX,
&pSkinBox->fY,
@ -131,7 +131,10 @@ void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring
&pSkinBox->fH,
&pSkinBox->fD,
&pSkinBox->fU,
&pSkinBox->fV);
&pSkinBox->fV,
&pSkinBox->fA,
&pSkinBox->fM,
&pSkinBox->fS);
if(wcscmp(wchBodyPart,L"HEAD")==0)
{

View file

@ -8,7 +8,6 @@
#include "../../ModelPart.h"
#include "../../Options.h"
#include "../../../Minecraft.World/net.minecraft.world.entity.player.h"
#include "Skins.h"
#include "UIControl_PlayerSkinPreview.h"
#include <string>
@ -309,24 +308,8 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou
glPushMatrix();
glDisable(GL_CULL_FACE);
HumanoidModel *model = static_cast<HumanoidModel *>(renderer->getModel());
Textures *textures = Minecraft::GetInstance()->textures;
int skinId = textures->loadMemTexture(m_customTextureUrl, m_backupTexture) - 37;
if (slim[skinId] == true)
{
if (textures->getHeight(m_customTextureUrl, m_backupTexture) == 64)
model = static_cast<HumanoidModel *>(renderer->getNewModelSlim());
else
model = static_cast<HumanoidModel *>(renderer->getModelSlim());
}
else
{
if (textures->getHeight(m_customTextureUrl, m_backupTexture) == 64)
model = static_cast<HumanoidModel *>(renderer->getNewModel());
else
model = static_cast<HumanoidModel *>(renderer->getModel());
}
Textures *t = Minecraft::GetInstance()->textures;
HumanoidModel *model = static_cast<HumanoidModel *>(renderer->getModel(Player::GetModelTypeFromTextureId(t->loadMemTexture(m_customTextureUrl, m_backupTexture))+Player::GetModelTypeFromAnimBitmask(m_uiAnimOverrideBitmask)));
//getAttackAnim(mob, a);
//if (armor != nullptr) armor->attackTime = model->attackTime;

View file

@ -24,16 +24,16 @@ const WCHAR *UIScene_SkinSelectMenu::wchDefaultNamesA[]=
L"Prisoner Steve",
L"Cyclist Steve",
L"Boxer Steve",
L"Developer Steve",
L"Alex",
L"Tuxedo Alex",
L"Boxer Alex",
L"Prisoner Alex",
L"Tennis Alex",
L"Cyclist Alex",
L"Tuxedo Alex",
L"Athlete Alex",
L"Swedish Alex",
L"Prisoner Alex",
L"Cyclist Alex",
L"Boxer Alex",
L"Developer Alex",
L"Developer Steve",
};
UIScene_SkinSelectMenu::UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
@ -1004,34 +1004,34 @@ TEXTURE_NAME UIScene_SkinSelectMenu::getTextureId(int skinIndex)
texture = TN_MOB_CHAR7;
break;
case eDefaultSkins_Skin8:
texture = TN_MOB_CHAR8;
texture = TN_MOB_ALEX;
break;
case eDefaultSkins_Skin9:
texture = TN_MOB_CHAR9;
texture = TN_MOB_ALEX1;
break;
case eDefaultSkins_Skin10:
texture = TN_MOB_CHAR10;
texture = TN_MOB_ALEX2;
break;
case eDefaultSkins_Skin11:
texture = TN_MOB_CHAR11;
texture = TN_MOB_ALEX3;
break;
case eDefaultSkins_Skin12:
texture = TN_MOB_CHAR12;
texture = TN_MOB_ALEX4;
break;
case eDefaultSkins_Skin13:
texture = TN_MOB_CHAR13;
texture = TN_MOB_ALEX5;
break;
case eDefaultSkins_Skin14:
texture = TN_MOB_CHAR14;
texture = TN_MOB_ALEX6;
break;
case eDefaultSkins_Skin15:
texture = TN_MOB_CHAR15;
texture = TN_MOB_ALEX7;
break;
case eDefaultSkins_Skin16:
texture = TN_MOB_CHAR16;
texture = TN_MOB_DEVALEX;
break;
case eDefaultSkins_Skin17:
texture = TN_MOB_CHAR17;
texture = TN_MOB_DEVSTEVE;
break;
};

View file

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -19,9 +19,8 @@ ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__M
EntityRenderer::EntityRenderer()
{
model = nullptr;
modelWide = nullptr;
modelSlim = nullptr;
newModel = nullptr;
newModelSlim = nullptr;
tileRenderer = new TileRenderer();
shadowRadius = 0;
shadowStrength = 1.0f;
@ -407,6 +406,13 @@ void EntityRenderer::registerTerrainTextures(IconRegister *iconRegister)
{
}
Model *EntityRenderer::getModel(int modelType)
{
if (modelType == 2) return modelSlim;
else if (modelType == 1) return modelWide;
else return model;
}
ResourceLocation *EntityRenderer::getTextureLocation(shared_ptr<Entity> mob)
{

View file

@ -31,9 +31,8 @@ private:
protected:
Model *model; // TODO 4J: Check why exactly this is here, it seems to get shadowed by classes inheriting from this by their own
Model *modelWide;
Model *modelSlim;
Model *newModel;
Model *newModelSlim;
protected:
TileRenderer *tileRenderer; // 4J - changed to protected so derived classes can use instead of shadowing their own
@ -71,10 +70,7 @@ public:
public:
// 4J Added
virtual Model *getModel() { return model; }
virtual Model *getModelSlim() { return modelSlim; }
virtual Model *getNewModel() { return newModel; }
virtual Model *getNewModelSlim() { return newModelSlim; }
virtual Model *getModel(int modelType = 0);
virtual void SetItemFrame(bool bSet) {}
virtual bool shouldRender(shared_ptr<Entity> entity, float camX, float camY, float camZ) { return true; }

View file

@ -9,6 +9,7 @@
ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
{
ModelPart *pAttachTo=nullptr;
float scale=0;
switch(pBox->ePart)
{
@ -32,21 +33,29 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
break;
case eBodyPart_Jacket:
pAttachTo=jacket;
scale=0.25;
break;
case eBodyPart_Sleeve0:
pAttachTo=sleeve0;
scale=0.25;
break;
case eBodyPart_Sleeve1:
pAttachTo=sleeve1;
scale=0.25;
break;
case eBodyPart_Pants0:
pAttachTo=pants0;
scale=0.25;
break;
case eBodyPart_Pants1:
pAttachTo=pants1;
scale=0.25;
break;
}
// check if this box has a declared scale then add it
if (pBox->fS != 0) scale = pBox->fS;
// first check this box doesn't already exist
ModelPart *pNewBox = pAttachTo->retrieveChild(pBox);
@ -64,6 +73,8 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
pNewBox = new ModelPart(this, static_cast<int>(pBox->fU), static_cast<int>(pBox->fV));
pNewBox->visible=false;
if (pBox->fM > 0) pNewBox->bMirror = true; // check if this box has the mirror flag
pNewBox->hideWithArmor = (unsigned int)pBox->fA; // add the "hide when armor is worn" bit flags
pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0);
// 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use.
//pNewBox->compile(1.0f/16.0f);
@ -73,7 +84,7 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
return pNewBox;
}
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, bool slimHands, bool mirror, bool force32)
void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, bool slimHands, bool mirror, bool force32, bool isArmor)
{
this->texWidth = texWidth;
this->texHeight = texHeight;
@ -113,7 +124,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
if ((texWidth == 64 && texHeight == 64) && !force32)
{
jacket = new ModelPart(this, 16, 32);
jacket->addHumanoidBox(-4, 0, -2, 8, 12, 4, g + 0.5);
jacket->addHumanoidBox(-4, 0, -2, 8, 12, 4, g + 0.25);
jacket->setPos(0, 0 + yOffset, 0);
}
@ -131,13 +142,13 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
if (slimHands == false)
{
sleeve0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g + 0.5);
sleeve1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g + 0.5);
sleeve0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g + 0.25);
sleeve1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g + 0.25);
}
else if (slimHands == true)
{
sleeve0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g + 0.5);
sleeve1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g + 0.5);
sleeve0->addHumanoidBox(-2, -2, -2, 3, 12, 4, g + 0.25);
sleeve1->addHumanoidBox(-1, -2, -2, 3, 12, 4, g + 0.25);
}
sleeve0->setPos(-5, 2 + yOffset, 0);
@ -172,11 +183,11 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
leg1 = new ModelPart(this, 16, 48);
pants0 = new ModelPart(this, 0, 32);
pants0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.5);
pants0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25);
pants0->setPos(-1.9, 12 + yOffset, 0);
pants1 = new ModelPart(this, 0, 48);
pants1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.5);
pants1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g + 0.25);
pants1->setPos(1.9, 12 + yOffset, 0);
}
else if ((texWidth == 64 && texHeight == 32) || force32)
@ -226,6 +237,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
bowAndArrow=false;
elytraFlying = false;
elytraCrouching = false;
m_isArmor = isArmor;
// 4J added
@ -238,32 +250,37 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight, b
HumanoidModel::HumanoidModel() : Model()
{
_init(0, 0, 64, 32, false, true, false);
_init(0, 0, 64, 32, false, true, false, false);
}
HumanoidModel::HumanoidModel(float g) : Model()
{
_init(g, 0, 64, 32, false, true, false);
_init(g, 0, 64, 32, false, true, false, false);
}
HumanoidModel::HumanoidModel(float g, bool isArmor) : Model()
{
_init(g, 0, 64, 32, false, true, false, isArmor);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model()
{
_init(g,yOffset,texWidth,texHeight, false, true, false);
_init(g,yOffset,texWidth,texHeight, false, true, false, false);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands) : Model()
{
_init(g,yOffset,texWidth,texHeight, slimHands, true, false);
_init(g,yOffset,texWidth,texHeight, slimHands, true, false, false);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands, bool mirror) : Model()
{
_init(g,yOffset,texWidth,texHeight, slimHands, mirror, false);
_init(g,yOffset,texWidth,texHeight, slimHands, mirror, false, false);
}
HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands, bool mirror, bool force32) : Model()
{
_init(g,yOffset,texWidth,texHeight, slimHands, mirror, force32);
_init(g,yOffset,texWidth,texHeight, slimHands, mirror, force32, false);
}
void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled)
@ -308,12 +325,12 @@ void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float
}
else
{
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0);
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0);
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0);
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0);
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0);
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0);
head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorHead))>0||!m_isArmor));
body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorTorso))>0||!m_isArmor));
arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm0))>0||!m_isArmor));
arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorArm1))>0||!m_isArmor));
leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg0))>0||!m_isArmor));
leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0&&(!(m_uiAnimOverrideBitmask&(1<<eAnim_RenderArmorLeg1))>0||!m_isArmor));
hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
if (jacket)

View file

@ -15,6 +15,7 @@ public:
float eating_swing;
bool elytraFlying;
bool elytraCrouching;
bool m_isArmor;
unsigned int m_uiAnimOverrideBitmask;
float m_fYOffset;
enum animbits
@ -37,11 +38,20 @@ public:
eAnim_DisableRenderLeg1,
eAnim_DisableRenderHair,
eAnim_SmallModel,
eAnim_DisableRenderJacket,
eAnim_DisableRenderSleeve0,
eAnim_DisableRenderSleeve1,
eAnim_DisableRenderPants0,
eAnim_DisableRenderPants1
eAnim_WideModel,
eAnim_SlimModel,
eAnim_DisableRenderSleeve1,
eAnim_DisableRenderSleeve0,
eAnim_DisableRenderPants1,
eAnim_DisableRenderPants0,
eAnim_DisableRenderJacket,
eAnim_RenderArmorHead,
eAnim_RenderArmorArm0,
eAnim_RenderArmorArm1,
eAnim_RenderArmorTorso,
eAnim_RenderArmorLeg0,
eAnim_RenderArmorLeg1,
eAnim_Dinnerbone
};
@ -60,10 +70,11 @@ public:
(1 << HumanoidModel::eAnim_DisableRenderPants1);
void _init(float g, float yOffset, int texWidth, int texHeight,
bool slimHands, bool mirror, bool force32);
bool slimHands, bool mirror, bool force32, bool isArmor = false);
HumanoidModel();
HumanoidModel(float g);
HumanoidModel(float g, bool isArmor);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands);
HumanoidModel(float g, float yOffset, int texWidth, int texHeight, bool slimHands, bool mirror);

View file

@ -8,29 +8,23 @@
#include "../Minecraft.World/Arrow.h"
#include "../Minecraft.World/Mth.h"
#include "../Minecraft.World/Player.h"
#include "Skins.h"
ResourceLocation LivingEntityRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT);
int LivingEntityRenderer::MAX_ARMOR_LAYERS = 4;
LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow, bool slimHands, bool createNewVar)
LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow, bool isPlayer)
{
this->model = model;
if (slimHands == true)
this->modelSlim = new HumanoidModel(0, 0, 64, 32, true);
if (createNewVar)
if (isPlayer)
{
this->newModel = new HumanoidModel(0, 0, 64, 64, false, false);
if (slimHands == true)
this->newModelSlim = new HumanoidModel(0, 0, 64, 64, true, false);
this->modelWide = new HumanoidModel(0, 0, 64, 64, false);
this->modelSlim = new HumanoidModel(0, 0, 64, 64, true);
}
shadowRadius = shadow;
armor = nullptr;
resModel = model;
}
void LivingEntityRenderer::setArmor(Model *armor)
@ -38,6 +32,11 @@ void LivingEntityRenderer::setArmor(Model *armor)
this->armor = armor;
}
void LivingEntityRenderer::setPlayerModelType(Model *humanoidModel)
{
resModel = humanoidModel;
}
float LivingEntityRenderer::rotlerp(float from, float to, float a)
{
float diff = to - from;
@ -56,8 +55,6 @@ void LivingEntityRenderer::render(shared_ptr<Entity> _mob, double x, double y, d
}
shared_ptr<LivingEntity> mob = dynamic_pointer_cast<LivingEntity>(_mob);
shared_ptr<Player> player = dynamic_pointer_cast<Player>(_mob);
Model *resModel = static_cast<HumanoidModel *>(model);
if (mob == nullptr)
{
@ -67,30 +64,6 @@ void LivingEntityRenderer::render(shared_ptr<Entity> _mob, double x, double y, d
glPushMatrix();
glDisable(GL_CULL_FACE);
if (player != nullptr)
{
Textures *textures = Minecraft::GetInstance()->textures;
int skinId = player->getPlayerDefaultSkin() - 1;
int defaultSkin = player->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModelSlim);
else
resModel = static_cast<HumanoidModel *>(modelSlim);
}
else
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModel);
else
resModel = static_cast<HumanoidModel *>(model);
}
}
else
resModel = static_cast<HumanoidModel *>(model);
resModel->attackTime = getAttackAnim(mob, a);
if (armor != nullptr) armor->attackTime = resModel->attackTime;
resModel->riding = mob->isRiding();
@ -281,33 +254,6 @@ void LivingEntityRenderer::render(shared_ptr<Entity> _mob, double x, double y, d
void LivingEntityRenderer::renderModel(shared_ptr<LivingEntity> mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale)
{
shared_ptr<Player> player = dynamic_pointer_cast<Player>(mob);
Model *resModel = static_cast<HumanoidModel *>(model);
if (player != nullptr)
{
Textures *textures = Minecraft::GetInstance()->textures;
int skinId = player->getPlayerDefaultSkin() - 1;
int defaultSkin = player->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModelSlim);
else
resModel = static_cast<HumanoidModel *>(modelSlim);
}
else
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModel);
else
resModel = static_cast<HumanoidModel *>(model);
}
}
else
resModel = static_cast<HumanoidModel *>(model);
bindTexture(mob);
if (!mob->isInvisible())
{
@ -351,7 +297,7 @@ void LivingEntityRenderer::setupRotations(shared_ptr<LivingEntity> mob, float bo
else
{
wstring name = mob->getAName();
if (name == L"Dinnerbone" || name == L"Grumm")
if (name == L"Dinnerbone" || name == L"Grumm" || mob->getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_Dinnerbone))
{
if ( !mob->instanceof(eTYPE_PLAYER) || !dynamic_pointer_cast<Player>(mob)->isCapeHidden() )
{
@ -379,33 +325,6 @@ void LivingEntityRenderer::additionalRendering(shared_ptr<LivingEntity> mob, flo
void LivingEntityRenderer::renderArrows(shared_ptr<LivingEntity> mob, float a)
{
shared_ptr<Player> player = dynamic_pointer_cast<Player>(mob);
Model *resModel = static_cast<HumanoidModel *>(model);
if (player != nullptr)
{
Textures *textures = Minecraft::GetInstance()->textures;
int skinId = player->getPlayerDefaultSkin() - 1;
int defaultSkin = player->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModelSlim);
else
resModel = static_cast<HumanoidModel *>(modelSlim);
}
else
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel *>(newModel);
else
resModel = static_cast<HumanoidModel *>(model);
}
}
else
resModel = static_cast<HumanoidModel *>(model);
int arrowCount = mob->getArrowCount();
if (arrowCount > 0)

View file

@ -17,11 +17,13 @@ class LivingEntityRenderer : public EntityRenderer
protected:
//Model *model; // 4J Stu - This shadows the one in EntityRenderer
Model *armor;
Model *resModel;
public:
LivingEntityRenderer(Model *model, float shadow, bool slimHands = 0, bool createNewVar = 0);
LivingEntityRenderer(Model *model, float shadow, bool isPlayer = false);
virtual void render(shared_ptr<Entity> mob, double x, double y, double z, float rot, float a);
virtual void setArmor(Model *armor);
virtual void setPlayerModelType(Model *humanoidModel);
private:
float rotlerp(float from, float to, float a);

View file

@ -14,6 +14,7 @@ void ModelPart::_init()
bMirror = false;
visible = true;
neverRender = false;
hideWithArmor = 0L;
x=y=z = 0.0f;
xRot=yRot=zRot = 0.0f;
translateX = translateY = translateZ = 0.0f;

View file

@ -17,6 +17,7 @@ public:
bool bMirror;
bool visible;
bool neverRender;
unsigned int hideWithArmor;
vector <Cube *> cubes;
vector <ModelPart *> children;
static const float RAD;

View file

@ -16,7 +16,6 @@
#include "../Minecraft.World/StringHelpers.h"
#include "SkeletonHeadModel.h"
#include "Textures.h"
#include "Skins.h"
ResourceLocation PlayerRenderer::SKELETON_LOCATION = ResourceLocation(TN_MOB_SKELETON);
ResourceLocation PlayerRenderer::WITHER_SKELETON_LOCATION = ResourceLocation(TN_MOB_WITHER_SKELETON);
@ -64,16 +63,22 @@ static unsigned int nametagColorForIndex(int index)
ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR);
PlayerRenderer::PlayerRenderer() : LivingEntityRenderer(new HumanoidModel(0), 0.5f, true, true)
PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f, true )
{
humanoidModel = static_cast<HumanoidModel*>(model);
humanoidModelSlim = static_cast<HumanoidModel*>(modelSlim);
newHumanoidModel = static_cast<HumanoidModel*>(newModel);
newHumanoidModelSlim = static_cast<HumanoidModel*>(newModelSlim);
humanoidModel = static_cast<HumanoidModel *>(model);
humanoidModelWide = static_cast<HumanoidModel *>(modelWide);
humanoidModelSlim = static_cast<HumanoidModel *>(modelSlim);
armorParts1 = new HumanoidModel(1.0f);
armorParts2 = new HumanoidModel(0.5f);
armorParts3 = new HumanoidModel(0.5f);
armorParts1 = new HumanoidModel(1.0f, true);
armorParts2 = new HumanoidModel(0.5f, true);
armorParts3 = new HumanoidModel(0.5f, true);
}
void PlayerRenderer::setModelType(shared_ptr<Player> player)
{
if (Player::GetModelTypeFromTextureId(player->getCustomSkin()) == 1 || Player::GetModelTypeFromAnimBitmask(player->getAnimOverrideBitmask()) == 1) resModel = humanoidModelWide;
else if (Player::GetModelTypeFromTextureId(player->getCustomSkin()) == 2 || Player::GetModelTypeFromAnimBitmask(player->getAnimOverrideBitmask()) == 2) resModel = humanoidModelSlim;
else resModel = humanoidModel;
}
unsigned int PlayerRenderer::getNametagColour(int index)
@ -87,6 +92,7 @@ int PlayerRenderer::prepareArmor(shared_ptr<LivingEntity> _player, int layer, fl
{
// 4J - dynamic cast required because we aren't using templates/generics in our version
shared_ptr<Player> player = dynamic_pointer_cast<Player>(_player);
setModelType(player);
// 4J-PB - need to disable rendering armour for some special skins (Daleks)
unsigned int uiAnimOverrideBitmask = player->getAnimOverrideBitmask();
@ -116,9 +122,9 @@ int PlayerRenderer::prepareArmor(shared_ptr<LivingEntity> _player, int layer, fl
armor->leg1->visible = layer == 2 || layer == 3;
setArmor(armor);
if (armor != nullptr) armor->attackTime = model->attackTime;
if (armor != nullptr) armor->riding = model->riding;
if (armor != nullptr) armor->young = model->young;
if (armor != nullptr) armor->attackTime = resModel->attackTime;
if (armor != nullptr) armor->riding = resModel->riding;
if (armor != nullptr) armor->young = resModel->young;
float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a);
if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH)
@ -221,38 +227,12 @@ void PlayerRenderer::render(shared_ptr<Entity> _mob, double x, double y, double
// 4J - dynamic cast required because we aren't using templates/generics in our version
shared_ptr<Player> mob = dynamic_pointer_cast<Player>(_mob);
HumanoidModel* resModel = static_cast<HumanoidModel*>(model);
if (mob == nullptr) return;
if (mob->hasInvisiblePrivilege()) return;
if (mob != nullptr)
{
Textures* textures = Minecraft::GetInstance()->textures;
int skinId = mob->getPlayerDefaultSkin() - 1;
int defaultSkin = mob->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModelSlim);
else
resModel = static_cast<HumanoidModel*>(humanoidModelSlim);
}
else
{
if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModel);
else
resModel = static_cast<HumanoidModel*>(humanoidModel);
}
}
else
resModel = static_cast<HumanoidModel*>(model);
/*if (mob != nullptr && newHumanoidModelSlim != nullptr && (mob->getCustomSkin() >= 10 && mob->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim;
else if (mob != nullptr && newHumanoidModel != nullptr && (mob->getCustomSkin() >= 2 && mob->getCustomSkin() <= 9)) resModel = newHumanoidModel;
else resModel = humanoidModel;*/
setModelType(mob);
setPlayerModelType(resModel);
shared_ptr<ItemInstance> item = mob->inventory->getSelected();
@ -341,6 +321,12 @@ void PlayerRenderer::render(shared_ptr<Entity> _mob, double x, double y, double
armorParts2->idle = false;
}
// Get armor in armor slot so we can hide the armor layer of the skin - Langtanium
shared_ptr<ItemInstance> itemHelmet = mob->inventory->getArmor(3);
shared_ptr<ItemInstance> itemChestplate = mob->inventory->getArmor(2);
shared_ptr<ItemInstance> itemLeggings = mob->inventory->getArmor(1);
shared_ptr<ItemInstance> itemBoots = mob->inventory->getArmor(0);
// 4J-PB - any additional parts to turn on for this player (skin dependent)
vector<ModelPart*>* pAdditionalModelParts = mob->GetAdditionalModelParts();
//turn them on
@ -348,7 +334,16 @@ void PlayerRenderer::render(shared_ptr<Entity> _mob, double x, double y, double
{
for (ModelPart* pModelPart : *pAdditionalModelParts)
{
pModelPart->visible = true;
if (itemHelmet != nullptr && pModelPart->hideWithArmor & (1 << 0)) // Hide the skin boxes that have the "hide when helmet is worn" bit flag - Langtanium
pModelPart->visible = false;
else if (itemChestplate != nullptr && pModelPart->hideWithArmor & (1 << 1)) // Hide the skin boxes that have the "hide when chestplate is worn" bit flag - Langtanium
pModelPart->visible = false;
else if (itemLeggings != nullptr && pModelPart->hideWithArmor & (1 << 2)) // Hide the skin boxes that have the "hide when leggings are worn" bit flag - Langtanium
pModelPart->visible = false;
else if (itemBoots != nullptr && pModelPart->hideWithArmor & (1 << 3)) // Hide the skin boxes that have the "hide when boots are worn" bit flag - Langtanium
pModelPart->visible = false;
else
pModelPart->visible = true;
}
}
@ -379,35 +374,7 @@ void PlayerRenderer::additionalRendering(shared_ptr<LivingEntity> _mob, float a)
// 4J - dynamic cast required because we aren't using templates/generics in our version
shared_ptr<Player> mob = dynamic_pointer_cast<Player>(_mob);
HumanoidModel* resModel = static_cast<HumanoidModel*>(model);
if (mob != nullptr)
{
Textures* textures = Minecraft::GetInstance()->textures;
int skinId = mob->getPlayerDefaultSkin() - 1;
int defaultSkin = mob->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModelSlim);
else
resModel = static_cast<HumanoidModel*>(humanoidModelSlim);
}
else
{
if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModel);
else
resModel = static_cast<HumanoidModel*>(humanoidModel);
}
}
else
resModel = static_cast<HumanoidModel*>(model);
/*if (mob != nullptr && newHumanoidModelSlim != nullptr && (mob->getCustomSkin() >= 10 && mob->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim;
else if (mob != nullptr && newHumanoidModel != nullptr && (mob->getCustomSkin() >= 2 && mob->getCustomSkin() <= 9)) resModel = newHumanoidModel;
else resModel = humanoidModel;*/
setModelType(mob);
shared_ptr<ItemInstance> headGear = mob->inventory->getArmor(3);
if (headGear != nullptr)
@ -741,35 +708,7 @@ void PlayerRenderer::scale(shared_ptr<LivingEntity> player, float a)
void PlayerRenderer::renderHand()
{
shared_ptr<Player> player = dynamic_pointer_cast<Player>(Minecraft::GetInstance()->player);
HumanoidModel* resModel = static_cast<HumanoidModel*>(model);
if (player != nullptr)
{
Textures* textures = Minecraft::GetInstance()->textures;
int skinId = player->getPlayerDefaultSkin() - 1;
int defaultSkin = player->getPlayerDefaultSkin() + 35;
if (slim[skinId] == true)
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModelSlim);
else
resModel = static_cast<HumanoidModel*>(humanoidModelSlim);
}
else
{
if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64)
resModel = static_cast<HumanoidModel*>(newHumanoidModel);
else
resModel = static_cast<HumanoidModel*>(humanoidModel);
}
}
else
resModel = static_cast<HumanoidModel*>(model);
/*if (player != nullptr && newHumanoidModelSlim != nullptr && (player->getCustomSkin() >= 10 && player->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim;
else if (player != nullptr && newHumanoidModel != nullptr && (player->getCustomSkin() >= 2 && player->getCustomSkin() <= 9)) resModel = newHumanoidModel;
else resModel = humanoidModel;*/
setModelType(player);
float brightness = 1;
glColor3f(brightness, brightness, brightness);
@ -781,9 +720,12 @@ void PlayerRenderer::renderHand()
// 4J-PB - does this skin have its arm0 disabled? (Dalek, etc)
if ((resModel->m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_DisableRenderArm0)) == 0)
resModel->arm0->render(1 / 16.0f, true);
// Does this skin have its sleeve0 disabled?
if ((resModel->m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_DisableRenderSleeve0)) == 0 && resModel->sleeve0 != nullptr)
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.
vector<ModelPart*> armchildren = resModel->arm0->children;
std::unordered_set<ModelPart*> additionalModelPartSet(additionalModelParts->begin(), additionalModelParts->end());
@ -801,6 +743,25 @@ void PlayerRenderer::renderHand()
}
}
}
//Render custom skin boxes on viewmodel for sleeve0
if (resModel->sleeve0!=nullptr)
{
vector<ModelPart*> sleevechildren = resModel->sleeve0->children;
for (const auto& x : sleevechildren) {
if (x) {
if (additionalModelPartSet.find(x) != additionalModelPartSet.end()) { //This is to verify box is still actually on current skin
glPushMatrix();
//We need to transform to match offset of arm/sleeve
glTranslatef(-5 * 0.0625f, 2 * 0.0625f, 0);
glRotatef(0.1 * (180.0f / PI), 0, 0, 1);
x->visible = true;
x->render(1.0f / 16.0f, true);
x->visible = false;
glPopMatrix();
}
}
}
}
}
void PlayerRenderer::setupPosition(shared_ptr<LivingEntity> _mob, double x, double y, double z)
@ -857,7 +818,7 @@ void PlayerRenderer::setupRotations(shared_ptr<LivingEntity> _mob, float bob, fl
}
}
else
else
{
LivingEntityRenderer::setupRotations(mob, bob, bodyRot, a);
}

View file

@ -14,9 +14,9 @@ public:
private:
HumanoidModel *humanoidModel;
HumanoidModel *humanoidModelWide;
HumanoidModel *humanoidModelSlim;
HumanoidModel *newHumanoidModel;
HumanoidModel *newHumanoidModelSlim;
HumanoidModel *resModel;
HumanoidModel *armorParts1;
HumanoidModel *armorParts2;
@ -38,6 +38,7 @@ private:
static const wstring MATERIAL_NAMES[5];
protected:
virtual void setModelType(shared_ptr<Player> player);
virtual int prepareArmor(shared_ptr<LivingEntity> _player, int layer, float a);
virtual void prepareSecondPassArmor(shared_ptr<LivingEntity> mob, int layer, float a);

View file

@ -19,6 +19,6 @@ enum eBodyPart
typedef struct
{
eBodyPart ePart;
float fX,fY,fZ,fW,fH,fD,fU,fV;
float fX,fY,fZ,fW,fH,fD,fU,fV,fA,fM,fS;
}
SKIN_BOX;

View file

@ -1,29 +0,0 @@
#pragma once
#include <map>
using namespace std;
class AABB;
class Recipy;
class Object;
static std::map<int, bool> slim = {
{ 0, false },
{ 1, false },
{ 2, false },
{ 3, false },
{ 4, false },
{ 5, false },
{ 6, false },
{ 7, false },
{ 8, false },
{ 9, true },
{ 10, true },
{ 11, true },
{ 12, true },
{ 13, true },
{ 14, true },
{ 15, true },
{ 16, true },
{ 17, true },
{ 18, true },
};

View file

@ -72,16 +72,16 @@ const wchar_t *Textures::preLoaded[TN_COUNT] =
L"mob/char5",
L"mob/char6",
L"mob/char7",
L"mob/char8",
L"mob/char9",
L"mob/char10",
L"mob/char11",
L"mob/char12",
L"mob/char13",
L"mob/char14",
L"mob/char15",
L"mob/char16",
L"mob/char17",
L"mob/alex",
L"mob/alex1",
L"mob/alex2",
L"mob/alex3",
L"mob/alex4",
L"mob/alex5",
L"mob/alex6",
L"mob/alex7",
L"mob/DevAlex",
L"mob/DevSteve",
L"terrain/moon",
L"terrain/sun",
L"armor/power",
@ -1697,16 +1697,16 @@ TEXTURE_NAME OriginalImages[] =
TN_MOB_CHAR5,
TN_MOB_CHAR6,
TN_MOB_CHAR7,
TN_MOB_CHAR8,
TN_MOB_CHAR9,
TN_MOB_CHAR10,
TN_MOB_CHAR11,
TN_MOB_CHAR12,
TN_MOB_CHAR13,
TN_MOB_CHAR14,
TN_MOB_CHAR15,
TN_MOB_CHAR16,
TN_MOB_CHAR17,
TN_MOB_ALEX,
TN_MOB_ALEX1,
TN_MOB_ALEX2,
TN_MOB_ALEX3,
TN_MOB_ALEX4,
TN_MOB_ALEX5,
TN_MOB_ALEX6,
TN_MOB_ALEX7,
TN_MOB_DEVALEX,
TN_MOB_DEVSTEVE,
TN_MISC_MAPBG,

View file

@ -63,16 +63,16 @@ typedef enum _TEXTURE_NAME
TN_MOB_CHAR5,
TN_MOB_CHAR6,
TN_MOB_CHAR7,
TN_MOB_CHAR8,
TN_MOB_CHAR9,
TN_MOB_CHAR10,
TN_MOB_CHAR11,
TN_MOB_CHAR12,
TN_MOB_CHAR13,
TN_MOB_CHAR14,
TN_MOB_CHAR15,
TN_MOB_CHAR16,
TN_MOB_CHAR17,
TN_MOB_ALEX,
TN_MOB_ALEX1,
TN_MOB_ALEX2,
TN_MOB_ALEX3,
TN_MOB_ALEX4,
TN_MOB_ALEX5,
TN_MOB_ALEX6,
TN_MOB_ALEX7,
TN_MOB_DEVALEX,
TN_MOB_DEVSTEVE,
TN_TERRAIN_MOON,
TN_TERRAIN_SUN,
TN_POWERED_CREEPER,

View file

@ -727,6 +727,22 @@ void Player::setCustomSkin(DWORD skinId)
}
int Player::GetModelTypeFromAnimBitmask(unsigned int uiAnimOverrideBitmask)
{
if (uiAnimOverrideBitmask&(1<<HumanoidModel::eAnim_SlimModel)) return 2;
else if (uiAnimOverrideBitmask&(1<<HumanoidModel::eAnim_WideModel)) return 1;
return 0;
}
int Player::GetModelTypeFromTextureId(int textureId)
{
if (textureId > 8 && textureId < 18) return 2;
else if (textureId == 18) return 1;
else if (textureId > 44 && textureId < 54) return 2;
else if (textureId == 54) return 1;
else return 0;
}
unsigned int Player::getSkinAnimOverrideBitmask(DWORD skinId)
{
unsigned long bitmask = 0L;
@ -2903,25 +2919,25 @@ int Player::getTexture()
case eDefaultSkins_Skin7:
return TN_MOB_CHAR7; // 4J - was L"/mob/char7.png";
case eDefaultSkins_Skin8:
return TN_MOB_CHAR8; // 4J - was L"/mob/char8.png";
return TN_MOB_ALEX; // 4J - was L"/mob/alex.png";
case eDefaultSkins_Skin9:
return TN_MOB_CHAR9; // 4J - was L"/mob/char9.png";
return TN_MOB_ALEX1; // 4J - was L"/mob/alex1.png";
case eDefaultSkins_Skin10:
return TN_MOB_CHAR10; // 4J - was L"/mob/char10.png";
return TN_MOB_ALEX2; // 4J - was L"/mob/alex2.png";
case eDefaultSkins_Skin11:
return TN_MOB_CHAR11; // 4J - was L"/mob/char11.png";
return TN_MOB_ALEX3; // 4J - was L"/mob/alex3.png";
case eDefaultSkins_Skin12:
return TN_MOB_CHAR12; // 4J - was L"/mob/char12.png";
return TN_MOB_ALEX4; // 4J - was L"/mob/alex4.png";
case eDefaultSkins_Skin13:
return TN_MOB_CHAR13; // 4J - was L"/mob/char13.png";
return TN_MOB_ALEX5; // 4J - was L"/mob/alex5.png";
case eDefaultSkins_Skin14:
return TN_MOB_CHAR14; // 4J - was L"/mob/char14.png";
return TN_MOB_ALEX6; // 4J - was L"/mob/alex6.png";
case eDefaultSkins_Skin15:
return TN_MOB_CHAR15; // 4J - was L"/mob/char15.png";
return TN_MOB_ALEX7; // 4J - was L"/mob/alex7.png";
case eDefaultSkins_Skin16:
return TN_MOB_CHAR16; // 4J - was L"/mob/char16.png";
return TN_MOB_DEVALEX; // 4J - was L"/mob/DevAlex.png";
case eDefaultSkins_Skin17:
return TN_MOB_CHAR17; // 4J - was L"/mob/char17.png";
return TN_MOB_DEVSTEVE; // 4J - was L"/mob/DevSteve.png";
default:
return TN_MOB_CHAR; // 4J - was L"/mob/char.png";

View file

@ -442,6 +442,8 @@ public:
static DWORD getCapeIdFromPath(const wstring &cape);
static wstring getCapePathFromId(DWORD capeId);
static unsigned int getSkinAnimOverrideBitmask(DWORD skinId);
static int GetModelTypeFromAnimBitmask(unsigned int uiAnimOverrideBitmask);
static int GetModelTypeFromTextureId(int textureId);
// 4J Added
void setXuid(PlayerUID xuid);

View file

@ -177,6 +177,9 @@ void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
this->BoxDataA[i].fD = dis->readFloat();
this->BoxDataA[i].fU = dis->readFloat();
this->BoxDataA[i].fV = dis->readFloat();
this->BoxDataA[i].fA = dis->readFloat();
this->BoxDataA[i].fM = dis->readFloat();
this->BoxDataA[i].fS = dis->readFloat();
}
}
@ -203,6 +206,9 @@ void TextureAndGeometryPacket::write(DataOutputStream *dos) //throws IOException
dos->writeFloat(this->BoxDataA[i].fD);
dos->writeFloat(this->BoxDataA[i].fU);
dos->writeFloat(this->BoxDataA[i].fV);
dos->writeFloat(this->BoxDataA[i].fA);
dos->writeFloat(this->BoxDataA[i].fM);
dos->writeFloat(this->BoxDataA[i].fS);
}
}