merge upstream

This commit is contained in:
Fireblade
2026-07-05 19:48:38 -04:00
parent 878198d6f1
commit 3f51fcb01f
85 changed files with 2097 additions and 914 deletions
+6
View File
@@ -24,6 +24,12 @@ bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z)
bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z, bool force)
{
// check if level is corrupted first
if (level == nullptr || random == nullptr)
{
return false;
}
if (!level->isNew) return false;
//Will only spawn a bonus chest if the world is new and has never been saved.
if (level->isNew)
{
+16 -16
View File
@@ -736,9 +736,13 @@ vector<HtmlString> *ItemInstance::getHoverText(shared_ptr<Player> player, bool a
{
vector<HtmlString> *lines = new vector<HtmlString>();
Item *item = Item::items[id];
HtmlString title = HtmlString(getHoverName());
if (hasCustomHoverName())
wstring hoverName = getHoverName();
HtmlString title = HtmlString(L"");
title.text = app.EscapeHTMLString(hoverName);
title.text = app.FormatColoredString(title.text);
if (hasCustomHoverName() && !(hoverName[0] == L'\u00A7' && hoverName[1] == L'r'))
{
title.italics = true;
}
@@ -791,19 +795,12 @@ vector<HtmlString> *ItemInstance::getHoverText(shared_ptr<Player> player, bool a
{
CompoundTag *display = tag->getCompound(L"display");
//if (display->contains(L"color"))
//{
// if (advanced)
// {
// wchar_t text [256];
// swprintf(text, 256, L"Color: LOCALISE #%08X", display->getInt(L"color"));
// lines->push_back(HtmlString(text));
// }
// else
// {
// lines->push_back(HtmlString(L"Dyed LOCALISE", eMinecraftColour_NOT_SET, true));
// }
//}
if (display->contains(L"color") && advanced)
{
wchar_t text[256];
swprintf(text, 256, L"Color: LOCALISE #%08X", display->getInt(L"color"));
lines->push_back(HtmlString(text));
}
if (display->contains(L"Lore"))
{
@@ -813,7 +810,10 @@ vector<HtmlString> *ItemInstance::getHoverText(shared_ptr<Player> player, bool a
for (int i = 0; i < lore->size(); i++)
{
//lines->push_back(ChatFormatting::DARK_PURPLE + "" + ChatFormatting::ITALIC + lore->get(i)->data);
lines->push_back(lore->get(i)->data);
HtmlString loreString = HtmlString(L"");
loreString.text = app.EscapeHTMLString(lore->get(i)->data);
loreString.text = app.EscapeHTMLString(loreString.text);
lines->push_back(loreString);
}
}
}
+77 -11
View File
@@ -110,6 +110,10 @@ void Player::_init()
m_bCheckedForModelParts=false;
m_bCheckedDLCForModelParts=false;
m_ppSkinOffsets=nullptr;
m_bCheckedForSkinOffsets=false;
m_bCheckedDLCForSkinOffsets=false;
#if defined(__PS3__) || defined(__ORBIS__)
m_ePlayerNameValidState=ePlayerNameValid_NotSet;
#endif
@@ -724,7 +728,9 @@ void Player::setCustomSkin(DWORD skinId)
m_bCheckedDLCForModelParts=false;
this->SetAdditionalModelParts(nullptr);
m_bCheckedForSkinOffsets=false;
m_bCheckedDLCForSkinOffsets=false;
this->SetSkinOffsets(nullptr);
}
unsigned int Player::getSkinAnimOverrideBitmask(DWORD skinId)
@@ -2903,25 +2909,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";
@@ -3389,11 +3395,71 @@ vector<ModelPart *> *Player::GetAdditionalModelParts()
return m_ppAdditionalModelParts;
}
vector<SKIN_OFFSET *> *Player::GetSkinOffsets()
{
if(m_ppSkinOffsets==nullptr && !m_bCheckedForSkinOffsets)
{
bool hasCustomTexture = !customTextureUrl.empty();
bool customTextureIsDefaultSkin = customTextureUrl.substr(0,3).compare(L"def") == 0;
// see if we can find the parts
m_ppSkinOffsets=app.GetSkinOffsets(m_dwSkinId);
// If it's a default texture (which has no parts), we have the parts, or we already have the texture (in which case we should have parts if there are any) then we are done
if(!hasCustomTexture || customTextureIsDefaultSkin || m_ppSkinOffsets != nullptr || app.IsFileInMemoryTextures(customTextureUrl))
{
m_bCheckedForSkinOffsets=true;
}
if(m_ppSkinOffsets == nullptr && !m_bCheckedDLCForSkinOffsets)
{
m_bCheckedDLCForSkinOffsets = true;
// we don't have the data from the dlc skin yet
app.DebugPrintf("m_bCheckedForModelOffsets Couldn't get skin offsets for skin %X\n",m_dwSkinId);
// do we have it from the DLC pack?
DLCSkinFile *pDLCSkinFile = app.m_dlcManager.getSkinFile(this->customTextureUrl);
if(pDLCSkinFile!=nullptr)
{
DWORD dwOffsetC=pDLCSkinFile->getOffsetsCount();
if(dwOffsetC!=0)
{
app.DebugPrintf("m_bCheckedForSkinOffsets Got skin offsets from DLCskin for skin %X\n",m_dwSkinId);
m_ppSkinOffsets=app.SetSkinOffsets(m_dwSkinId,pDLCSkinFile->getOffsets());
}
m_bCheckedForSkinOffsets=true;
}
}
}
return m_ppSkinOffsets;
}
int Player::GetModelTypeFromAnimBitmask(unsigned int animBitmask)
{
if (animBitmask&(1<<HumanoidModel::eAnim_SlimModel)) return 2;
else if (animBitmask&(1<<HumanoidModel::eAnim_WideModel)) return 1;
else return 0;
}
int Player::GetModelTypeFromTextureId(int textureId)
{
if (textureId > 8 && textureId < 18) return 2;
else if (textureId == 18) return 1;
else return 0;
}
void Player::SetAdditionalModelParts(vector<ModelPart *> *ppAdditionalModelParts)
{
m_ppAdditionalModelParts=ppAdditionalModelParts;
}
void Player::SetSkinOffsets(vector<SKIN_OFFSET *> *ppSkinOffsets)
{
m_ppSkinOffsets=ppSkinOffsets;
}
#if defined(__PS3__) || defined(__ORBIS__)
Player::ePlayerNameValidState Player::GetPlayerNameValidState(void)
+7
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);
@@ -553,6 +555,8 @@ public:
vector<ModelPart *> *GetAdditionalModelParts();
void SetAdditionalModelParts(vector<ModelPart *> *ppAdditionalModelParts);
vector<SKIN_OFFSET *> *GetSkinOffsets();
void SetSkinOffsets(vector<SKIN_OFFSET *> *ppSkinOffsets);
#if defined(__PS3__) || defined(__ORBIS__)
enum ePlayerNameValidState
@@ -569,6 +573,9 @@ private:
vector<ModelPart *> *m_ppAdditionalModelParts;
bool m_bCheckedForModelParts;
bool m_bCheckedDLCForModelParts;
vector<SKIN_OFFSET *> *m_ppSkinOffsets;
bool m_bCheckedForSkinOffsets;
bool m_bCheckedDLCForSkinOffsets;
#if defined(__PS3__) || defined(__ORBIS__)
ePlayerNameValidState m_ePlayerNameValidState; // 4J-PB - to ensure we have the characters for this name in our font, or display a player number instead
+75 -2
View File
@@ -12,7 +12,9 @@ TextureAndGeometryPacket::TextureAndGeometryPacket()
this->dwTextureBytes = 0;
this->pbData = nullptr;
this->dwBoxC = 0;
this->dwOffsetC = 0;
this->BoxDataA = nullptr;
this->OffsetDataA = nullptr;
uiAnimOverrideBitmask=0;
}
@@ -43,7 +45,9 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P
this->pbData = pbData;
this->dwTextureBytes = dwBytes;
this->dwBoxC = 0;
this->dwOffsetC = 0;
this->BoxDataA=nullptr;
this->OffsetDataA=nullptr;
this->uiAnimOverrideBitmask=0;
}
@@ -62,6 +66,7 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P
this->dwTextureBytes = dwBytes;
this->uiAnimOverrideBitmask = pDLCSkinFile->getAnimOverrideBitmask();
this->dwBoxC = pDLCSkinFile->getAdditionalBoxesCount();
this->dwOffsetC = pDLCSkinFile->getOffsetsCount();
if(this->dwBoxC!=0)
{
this->BoxDataA= new SKIN_BOX [this->dwBoxC];
@@ -77,9 +82,24 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P
{
this->BoxDataA=nullptr;
}
if(this->dwOffsetC!=0)
{
this->OffsetDataA= new SKIN_OFFSET [this->dwOffsetC];
vector<SKIN_OFFSET *> *pSkinOffsets=pDLCSkinFile->getOffsets();
int iCount=0;
for(auto& pSkinOffset : *pSkinOffsets)
{
this->OffsetDataA[iCount++]=*pSkinOffset;
}
}
else
{
this->OffsetDataA=nullptr;
}
}
TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes,vector<SKIN_BOX *> *pvSkinBoxes, unsigned int uiAnimOverrideBitmask)
TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector<SKIN_BOX *> *pvSkinBoxes, vector<SKIN_OFFSET *> *pvSkinOffsets, unsigned int uiAnimOverrideBitmask)
{
this->textureName = textureName;
@@ -109,6 +129,22 @@ TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, P
this->BoxDataA[iCount++]=*pSkinBox;
}
}
if(pvSkinOffsets==nullptr)
{
this->dwOffsetC=0;
this->OffsetDataA=nullptr;
}
else
{
this->dwOffsetC = static_cast<DWORD>(pvSkinOffsets->size());
this->OffsetDataA= new SKIN_OFFSET [this->dwOffsetC];
int iCount=0;
for(auto& pSkinOffset : *pvSkinOffsets)
{
this->OffsetDataA[iCount++]=*pSkinOffset;
}
}
}
@@ -148,6 +184,7 @@ void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
uiAnimOverrideBitmask = dis->readInt();
short rawBoxC = dis->readShort();
short rawOffsetC = dis->readShort();
if (rawBoxC <= 0)
{
dwBoxC = 0;
@@ -160,11 +197,27 @@ void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
dwBoxC = 0; // sane limit for skin boxes
}
}
if (rawOffsetC <= 0)
{
dwOffsetC = 0;
}
else
{
dwOffsetC = (DWORD)(unsigned short)rawOffsetC;
if (dwOffsetC > 256)
{
dwOffsetC = 0; // sane limit for skin offsets
}
}
if(dwBoxC>0)
{
this->BoxDataA= new SKIN_BOX [dwBoxC];
}
if(dwOffsetC>0)
{
this->OffsetDataA= new SKIN_OFFSET [dwOffsetC];
}
for(DWORD i=0;i<dwBoxC;i++)
{
@@ -177,10 +230,19 @@ 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();
}
for(DWORD i=0;i<dwOffsetC;i++)
{
this->OffsetDataA[i].ePart = static_cast<eBodyOffset>(dis->readShort());
this->OffsetDataA[i].fD = dis->readFloat();
this->OffsetDataA[i].fO = dis->readFloat();
}
}
void TextureAndGeometryPacket::write(DataOutputStream *dos) //throws IOException
void __fastcall TextureAndGeometryPacket::write(DataOutputStream *dos) //throws IOException
{
dos->writeUTF(textureName);
dos->writeInt(dwSkinID);
@@ -203,6 +265,17 @@ 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);
}
dos->writeShort(static_cast<short>(dwOffsetC));
for(DWORD i=0;i<dwOffsetC;i++)
{
dos->writeShort(static_cast<short>(this->OffsetDataA[i].ePart));
dos->writeFloat(this->OffsetDataA[i].fD);
dos->writeFloat(this->OffsetDataA[i].fO);
}
}
+4 -1
View File
@@ -4,6 +4,7 @@ using namespace std;
#include "Packet.h"
#include "../Minecraft.Client/Model.h"
#include "../Minecraft.Client/SkinBox.h"
#include "../Minecraft.Client/SkinOffset.h"
class DLCSkinFile;
@@ -15,14 +16,16 @@ public:
PBYTE pbData;
DWORD dwTextureBytes;
SKIN_BOX *BoxDataA;
SKIN_OFFSET *OffsetDataA;
DWORD dwBoxC;
DWORD dwOffsetC;
unsigned int uiAnimOverrideBitmask;
TextureAndGeometryPacket();
~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);
virtual void read(DataInputStream *dis);