Quote:
Originally Posted by ℓσℓ
Dankeschön aber für mich wäre es lieber es selbst zu fixxen.
|
Code:
void PythonNetworkStream::Initialize()
{
STORM_STATIC_ASSERT(sizeof(TPacketSafeBoxItemSet) == 40);
uint8_t* RecvSafeBoxSetPacketAddr = reinterpret_cast<uint8_t*>(0x41E530);
DetourClassFunc(RecvSafeBoxSetPacketAddr, reinterpret_cast<const uint8_t*>(&RecvSafeBoxSetPacket_Hook), GetAsmInstrLength(RecvSafeBoxSetPacketAddr, 8));
}
Code:
char __stdcall PythonNetworkStream::RecvSafeBoxSetPacket_Hook(PythonNetworkStream* self)
{
TPacketSafeBoxItemSet packet;
if (!self->Recv(&packet, sizeof(TPacketSafeBoxItemSet)))
return 0;
metin2_vc_client::packet_item itemData;
itemData.itemVnum = packet.m_itemVnum;
itemData.itemCount = packet.m_itemCount;
memcpy(itemData.itemMetinSockets, packet.m_itemMetinSockets, sizeof(uint32_t) * 3);
memcpy(itemData.attributes, packet.m_itemAttributes, sizeof(metin2_vc_client::packet_item_attribute) * 7);
// NOOOOO, assembly
void (__stdcall* CPythonSafebox__SetItemData)(uint32_t slotIndex, const void* data) = (void (__stdcall* )(uint32_t, const void*))0x467500;
const void* safeboxSingleton = *(void **)0x61C370;
asm("movl %0, %%ecx" : : "m" (safeboxSingleton));
CPythonSafebox__SetItemData(packet.m_itemIndex, &itemData);
(reinterpret_cast<uint8_t*>(self))[1322] = 1; // Refresh Safebox
return 1;
}
Der alte Code hätte auch funktioniert ...
Kleine Dokumentation:
packet_item ist der Name der struct im Metin2 Client (laut .map)
CPythonNetworkStream ist der Name der MainStream-Klasse im Client (Char- und World-Server)
CNetworkStream ist der Name der allgemeinen Socket-Klasse im Client (diese enthält auch den Encryption/Decryption Code).
Kind Regards Tim