//TODO: Call a function here later, when redesigning /* new "SdSddddddddddffdQddddddddddddddddddddddddddddddddddddddddddddddffdddchhd" count)); //if we have chars on the account //create a new packet and memset //fix opcode *pNewPacket = 0x09; pNewPacket +=1; pOldPacketData +=1; iNewPacketLen +=1; //chars on account *(int*)pNewPacket = iCharsOnAccount; pNewPacket +=4; pOldPacketData +=4; iNewPacketLen +=4; //set the "cancreatecharsflag" *(int*)pNewPacket = 0x07; pNewPacket +=4; iNewPacketLen +=4; //set another unknown byte *(BYTE *)pNewPacket = 0x00; pNewPacket +=1; iNewPacketLen +=1; //loop through the chars and fix only the changed / additional stuff //counter for loop int iForLoop = 0; while ( iForLoop < iCharsOnAccount ) { //now fix the data, getting the data of the oldpacket and write to new. //we write the whole buffer at the end by using memcpy ////copy data until the next fix "SdS" int iTmp = 0; iTmp += (lstrlenW((LPCWSTR)(pOldPacketData))+1)*2; //name iTmp +=4; iTmp += (lstrlenW((LPCWSTR)(pOldPacketData + iTmp))+1)*2; //account name memcpy(pNewPacket, pOldPacketData, iTmp); pNewPacket+=iTmp; pOldPacketData+=iTmp; iNewPacketLen+=iTmp; //copy data until the next fix "ddddddddddffd" iTmp = 10*4 + 2*8 + 4; memcpy(pNewPacket, pOldPacketData, iTmp); pNewPacket+=iTmp; pOldPacketData+=iTmp; iNewPacketLen += iTmp; //fix the EXP ->> changed from d to Q (but Q is f) //exp lower byte iTmp = 4; memcpy(pNewPacket, pOldPacketData, iTmp); pNewPacket += iTmp; pOldPacketData += iTmp; //exp higher byte *(int *)pNewPacket = 0; pNewPacket += 4; iNewPacketLen +=8; //copy data until the next fix "ddddddddddddddddddddddddddddddddddddffdddc" iTmp = 46*4 + 2*8 + 3*4 + 1; memcpy(pNewPacket, pOldPacketData, iTmp); pNewPacket += iTmp; pOldPacketData += iTmp; iNewPacketLen += iTmp; //add the new data to the end "hhd" *(int *)pNewPacket = 0; //augumentation effect has been added for IL pNewPacket += 4; iNewPacketLen += 4; *(int *)pNewPacket = 0; //augumentation effect has been added for IL pNewPacket += 4; iNewPacketLen += 4; *(int *)pNewPacket = 0; //transformation ID has been added for CT1 pNewPacket += 4; iNewPacketLen += 4; iForLoop++; } memcpy(pPacket, pNewPacket-iNewPacketLen, iNewPacketLen); //rewind pNewPacket-=iNewPacketLen; // delete the allocated buffer delete [] pNewPacket; } else { //empty account char *pNewPacket = new char[10]; memset(pNewPacket, 0, 10); *pNewPacket = 0x09; pNewPacket += 1; iNewPacketLen +=1; *(int *)pNewPacket = 0; pNewPacket +=4; iNewPacketLen +=4; *(int *)pNewPacket = 0x07; //allow to create chars, if 0 we prevent new/empty accounts from creating chars pNewPacket +=4; iNewPacketLen +=4; *(BYTE *)pNewPacket = 0x00; pNewPacket +=1; iNewPacketLen +=1; //fix data memcpy(pPacket, pNewPacket-iNewPacketLen, iNewPacketLen); //rewind pNewPacket-=iNewPacketLen; // delete the allocated buffer delete [] pNewPacket; } //set the new packet len (2 places ( packet -2 and packet + 0x1FFE ) ) *(u16*)(pPacket - 2) = iNewPacketLen+2; *(u16*)(pPacket + 0x1FFE) = iNewPacketLen+2; }