aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/TextureAndGeometryPacket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/TextureAndGeometryPacket.cpp')
-rw-r--r--Minecraft.World/TextureAndGeometryPacket.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/Minecraft.World/TextureAndGeometryPacket.cpp b/Minecraft.World/TextureAndGeometryPacket.cpp
new file mode 100644
index 00000000..70f2f516
--- /dev/null
+++ b/Minecraft.World/TextureAndGeometryPacket.cpp
@@ -0,0 +1,189 @@
+#include "stdafx.h"
+#include <iostream>
+#include "InputOutputStream.h"
+#include "PacketListener.h"
+#include "TextureAndGeometryPacket.h"
+
+
+
+TextureAndGeometryPacket::TextureAndGeometryPacket()
+{
+ this->textureName = L"";
+ this->dwTextureBytes = 0;
+ this->pbData = NULL;
+ this->dwBoxC = 0;
+ this->BoxDataA = NULL;
+ uiAnimOverrideBitmask=0;
+}
+
+TextureAndGeometryPacket::~TextureAndGeometryPacket()
+{
+ // can't free these - they're used elsewhere
+// if(this->BoxDataA!=NULL)
+// {
+// delete [] this->BoxDataA;
+// }
+//
+// if(this->pbData!=NULL)
+// {
+// delete [] this->pbData;
+// }
+}
+
+TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes)
+{
+ 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->dwBoxC = 0;
+ this->BoxDataA=NULL;
+ this->uiAnimOverrideBitmask=0;
+}
+
+TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, DLCSkinFile *pDLCSkinFile)
+{
+ 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 = pDLCSkinFile->getAnimOverrideBitmask();
+ this->dwBoxC = pDLCSkinFile->getAdditionalBoxesCount();
+ if(this->dwBoxC!=0)
+ {
+ this->BoxDataA= new SKIN_BOX [this->dwBoxC];
+ vector<SKIN_BOX *> *pSkinBoxes=pDLCSkinFile->getAdditionalBoxes();
+ int iCount=0;
+
+ for(AUTO_VAR(it, pSkinBoxes->begin());it != pSkinBoxes->end(); ++it)
+ {
+ SKIN_BOX *pSkinBox=*it;
+ this->BoxDataA[iCount++]=*pSkinBox;
+ }
+ }
+ else
+ {
+ this->BoxDataA=NULL;
+ }
+}
+
+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==NULL)
+ {
+ this->dwBoxC=0;
+ this->BoxDataA=NULL;
+ }
+ else
+ {
+ this->dwBoxC = (DWORD)pvSkinBoxes->size();
+ this->BoxDataA= new SKIN_BOX [this->dwBoxC];
+ int iCount=0;
+
+ for(AUTO_VAR(it, pvSkinBoxes->begin());it != pvSkinBoxes->end(); ++it)
+ {
+ SKIN_BOX *pSkinBox=*it;
+ this->BoxDataA[iCount++]=*pSkinBox;
+ }
+ }
+
+}
+
+void TextureAndGeometryPacket::handle(PacketListener *listener)
+{
+ listener->handleTextureAndGeometry(shared_from_this());
+}
+
+void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
+{
+ textureName = dis->readUTF();
+ dwSkinID = (DWORD)dis->readInt();
+ dwTextureBytes = (DWORD)dis->readShort();
+
+ if(dwTextureBytes>0)
+ {
+ this->pbData= new BYTE [dwTextureBytes];
+
+ for(DWORD i=0;i<dwTextureBytes;i++)
+ {
+ this->pbData[i] = dis->readByte();
+ }
+ }
+ uiAnimOverrideBitmask = dis->readInt();
+
+ dwBoxC = (DWORD)dis->readShort();
+
+ if(dwBoxC>0)
+ {
+ this->BoxDataA= new SKIN_BOX [dwBoxC];
+ }
+
+ for(DWORD i=0;i<dwBoxC;i++)
+ {
+ this->BoxDataA[i].ePart = (eBodyPart) dis->readShort();
+ this->BoxDataA[i].fX = dis->readFloat();
+ this->BoxDataA[i].fY = dis->readFloat();
+ this->BoxDataA[i].fZ = dis->readFloat();
+ this->BoxDataA[i].fH = dis->readFloat();
+ this->BoxDataA[i].fW = dis->readFloat();
+ this->BoxDataA[i].fD = dis->readFloat();
+ this->BoxDataA[i].fU = dis->readFloat();
+ this->BoxDataA[i].fV = dis->readFloat();
+ }
+}
+
+void TextureAndGeometryPacket::write(DataOutputStream *dos) //throws IOException
+{
+ dos->writeUTF(textureName);
+ dos->writeInt(dwSkinID);
+ dos->writeShort((short)dwTextureBytes);
+ for(DWORD i=0;i<dwTextureBytes;i++)
+ {
+ dos->writeByte(this->pbData[i]);
+ }
+ dos->writeInt(uiAnimOverrideBitmask);
+
+ dos->writeShort((short)dwBoxC);
+ for(DWORD i=0;i<dwBoxC;i++)
+ {
+ dos->writeShort((short)this->BoxDataA[i].ePart);
+ dos->writeFloat(this->BoxDataA[i].fX);
+ dos->writeFloat(this->BoxDataA[i].fY);
+ dos->writeFloat(this->BoxDataA[i].fZ);
+ dos->writeFloat(this->BoxDataA[i].fH);
+ dos->writeFloat(this->BoxDataA[i].fW);
+ dos->writeFloat(this->BoxDataA[i].fD);
+ dos->writeFloat(this->BoxDataA[i].fU);
+ dos->writeFloat(this->BoxDataA[i].fV);
+ }
+}
+
+int TextureAndGeometryPacket::getEstimatedSize()
+{
+ return 4096+ +sizeof(int) + sizeof(float)*8*4;
+}