the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include <iostream>
3#include "InputOutputStream.h"
4#include "PacketListener.h"
5#include "TextureAndGeometryPacket.h"
6
7
8
9TextureAndGeometryPacket::TextureAndGeometryPacket()
10{
11 this->textureName = L"";
12 this->dwTextureBytes = 0;
13 this->pbData = NULL;
14 this->dwBoxC = 0;
15 this->BoxDataA = NULL;
16 uiAnimOverrideBitmask=0;
17}
18
19TextureAndGeometryPacket::~TextureAndGeometryPacket()
20{
21 // can't free these - they're used elsewhere
22// if(this->BoxDataA!=NULL)
23// {
24// delete [] this->BoxDataA;
25// }
26//
27// if(this->pbData!=NULL)
28// {
29// delete [] this->pbData;
30// }
31}
32
33TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes)
34{
35 this->textureName = textureName;
36
37 wstring skinValue = textureName.substr(7,textureName.size());
38 skinValue = skinValue.substr(0,skinValue.find_first_of(L'.'));
39 std::wstringstream ss;
40 ss << std::dec << skinValue.c_str();
41 ss >> this->dwSkinID;
42 this->dwSkinID = MAKE_SKIN_BITMASK(true, this->dwSkinID);
43 this->pbData = pbData;
44 this->dwTextureBytes = dwBytes;
45 this->dwBoxC = 0;
46 this->BoxDataA=NULL;
47 this->uiAnimOverrideBitmask=0;
48}
49
50TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, DLCSkinFile *pDLCSkinFile)
51{
52 this->textureName = textureName;
53
54 wstring skinValue = textureName.substr(7,textureName.size());
55 skinValue = skinValue.substr(0,skinValue.find_first_of(L'.'));
56 std::wstringstream ss;
57 ss << std::dec << skinValue.c_str();
58 ss >> this->dwSkinID;
59 this->dwSkinID = MAKE_SKIN_BITMASK(true, this->dwSkinID);
60
61 this->pbData = pbData;
62 this->dwTextureBytes = dwBytes;
63 this->uiAnimOverrideBitmask = pDLCSkinFile->getAnimOverrideBitmask();
64 this->dwBoxC = pDLCSkinFile->getAdditionalBoxesCount();
65 if(this->dwBoxC!=0)
66 {
67 this->BoxDataA= new SKIN_BOX [this->dwBoxC];
68 vector<SKIN_BOX *> *pSkinBoxes=pDLCSkinFile->getAdditionalBoxes();
69 int iCount=0;
70
71 for(AUTO_VAR(it, pSkinBoxes->begin());it != pSkinBoxes->end(); ++it)
72 {
73 SKIN_BOX *pSkinBox=*it;
74 this->BoxDataA[iCount++]=*pSkinBox;
75 }
76 }
77 else
78 {
79 this->BoxDataA=NULL;
80 }
81}
82
83TextureAndGeometryPacket::TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes,vector<SKIN_BOX *> *pvSkinBoxes, unsigned int uiAnimOverrideBitmask)
84{
85 this->textureName = textureName;
86
87 wstring skinValue = textureName.substr(7,textureName.size());
88 skinValue = skinValue.substr(0,skinValue.find_first_of(L'.'));
89 std::wstringstream ss;
90 ss << std::dec << skinValue.c_str();
91 ss >> this->dwSkinID;
92 this->dwSkinID = MAKE_SKIN_BITMASK(true, this->dwSkinID);
93
94 this->pbData = pbData;
95 this->dwTextureBytes = dwBytes;
96 this->uiAnimOverrideBitmask = uiAnimOverrideBitmask;
97 if(pvSkinBoxes==NULL)
98 {
99 this->dwBoxC=0;
100 this->BoxDataA=NULL;
101 }
102 else
103 {
104 this->dwBoxC = (DWORD)pvSkinBoxes->size();
105 this->BoxDataA= new SKIN_BOX [this->dwBoxC];
106 int iCount=0;
107
108 for(AUTO_VAR(it, pvSkinBoxes->begin());it != pvSkinBoxes->end(); ++it)
109 {
110 SKIN_BOX *pSkinBox=*it;
111 this->BoxDataA[iCount++]=*pSkinBox;
112 }
113 }
114
115}
116
117void TextureAndGeometryPacket::handle(PacketListener *listener)
118{
119 listener->handleTextureAndGeometry(shared_from_this());
120}
121
122void TextureAndGeometryPacket::read(DataInputStream *dis) //throws IOException
123{
124 textureName = dis->readUTF();
125 dwSkinID = (DWORD)dis->readInt();
126 dwTextureBytes = (DWORD)dis->readShort();
127
128 if(dwTextureBytes>0)
129 {
130 this->pbData= new BYTE [dwTextureBytes];
131
132 for(DWORD i=0;i<dwTextureBytes;i++)
133 {
134 this->pbData[i] = dis->readByte();
135 }
136 }
137 uiAnimOverrideBitmask = dis->readInt();
138
139 dwBoxC = (DWORD)dis->readShort();
140
141 if(dwBoxC>0)
142 {
143 this->BoxDataA= new SKIN_BOX [dwBoxC];
144 }
145
146 for(DWORD i=0;i<dwBoxC;i++)
147 {
148 this->BoxDataA[i].ePart = (eBodyPart) dis->readShort();
149 this->BoxDataA[i].fX = dis->readFloat();
150 this->BoxDataA[i].fY = dis->readFloat();
151 this->BoxDataA[i].fZ = dis->readFloat();
152 this->BoxDataA[i].fH = dis->readFloat();
153 this->BoxDataA[i].fW = dis->readFloat();
154 this->BoxDataA[i].fD = dis->readFloat();
155 this->BoxDataA[i].fU = dis->readFloat();
156 this->BoxDataA[i].fV = dis->readFloat();
157 }
158}
159
160void TextureAndGeometryPacket::write(DataOutputStream *dos) //throws IOException
161{
162 dos->writeUTF(textureName);
163 dos->writeInt(dwSkinID);
164 dos->writeShort((short)dwTextureBytes);
165 for(DWORD i=0;i<dwTextureBytes;i++)
166 {
167 dos->writeByte(this->pbData[i]);
168 }
169 dos->writeInt(uiAnimOverrideBitmask);
170
171 dos->writeShort((short)dwBoxC);
172 for(DWORD i=0;i<dwBoxC;i++)
173 {
174 dos->writeShort((short)this->BoxDataA[i].ePart);
175 dos->writeFloat(this->BoxDataA[i].fX);
176 dos->writeFloat(this->BoxDataA[i].fY);
177 dos->writeFloat(this->BoxDataA[i].fZ);
178 dos->writeFloat(this->BoxDataA[i].fH);
179 dos->writeFloat(this->BoxDataA[i].fW);
180 dos->writeFloat(this->BoxDataA[i].fD);
181 dos->writeFloat(this->BoxDataA[i].fU);
182 dos->writeFloat(this->BoxDataA[i].fV);
183 }
184}
185
186int TextureAndGeometryPacket::getEstimatedSize()
187{
188 return 4096+ +sizeof(int) + sizeof(float)*8*4;
189}