diff --git a/Source/Client/Mode/CGameMode.h b/Source/Client/Mode/CGameMode.h index 6fc0dfd5..2d8198b3 100644 --- a/Source/Client/Mode/CGameMode.h +++ b/Source/Client/Mode/CGameMode.h @@ -24,6 +24,7 @@ class CPlayer; class CRenderObject; struct ActorNameAllPacket; struct ActorNameTitlePacket; +struct PlayerNameUpdatePacket; struct GameOptionEntry; struct CWorld; struct TextureRegion; @@ -162,6 +163,7 @@ public: bool GetClosestValidCell(int* x, int* y); void ReceiveActorNameAll(const ActorNameAllPacket* packet); void ReceiveActorNameTitle(const ActorNameTitlePacket* packet); + void ReceivePlayerNameUpdate(const PlayerNameUpdatePacket* packet); void ReceiveColoredNotice(const unsigned char* packet); void ReceiveNamedActionResult(const unsigned char* packet); void ReceiveStatDump(const unsigned char* packet); diff --git a/Source/Network/ActorNamePacket.cpp b/Source/Network/ActorNamePacket.cpp index 9881e3d3..31ac0ade 100644 --- a/Source/Network/ActorNamePacket.cpp +++ b/Source/Network/ActorNamePacket.cpp @@ -1,5 +1,6 @@ #include "Client/Mode/CGameMode.h" #include "Client/Session.h" +#include "Contents/MessageTable.h" #include "Network/ActorNamePacket.h" #include "UI/Edit/UIEditCtrl.h" #include "UI/Window/UIPetInfoWnd.h" @@ -30,3 +31,13 @@ void CGameMode::ReceiveActorNameTitle(const ActorNameTitlePacket* packet) { } } } + +// OFFSET: 0x00D1DB50 +// FUNCTION: fn_21631 +void CGameMode::ReceivePlayerNameUpdate(const PlayerNameUpdatePacket* packet) { + if (packet->type == 4 || packet->type == 3) { + std::string name = packet->type == 4 ? std::string(LookupMessage(581)) + : std::string(std::string(packet->name, packet->name + sizeof(packet->name)).c_str()); + SetPlayerName(packet->characterId, name); + } +} diff --git a/Source/Network/ActorNamePacket.h b/Source/Network/ActorNamePacket.h index 08ea0dc4..22298544 100644 --- a/Source/Network/ActorNamePacket.h +++ b/Source/Network/ActorNamePacket.h @@ -3,6 +3,7 @@ #include #include +#include #pragma pack(push, 1) struct ActorNameAllPacket { @@ -21,13 +22,23 @@ struct ActorNameTitlePacket { /* 000A */ char name[24]; /* 0022 */ char title[24]; }; + +struct PlayerNameUpdatePacket { + /* 0000 */ std::int16_t id; + /* 0002 */ std::int16_t type; + /* 0004 */ std::uint32_t characterId; + /* 0008 */ char name[24]; +}; #pragma pack(pop) +void SetPlayerName(std::uint32_t id, std::string name); + #if defined(_WIN32) && !defined(_WIN64) static_assert(offsetof(ActorNameAllPacket, positionName) == 0x4E); static_assert(sizeof(ActorNameAllPacket) == 0x66); static_assert(offsetof(ActorNameTitlePacket, title) == 0x22); static_assert(sizeof(ActorNameTitlePacket) == 0x3A); +static_assert(sizeof(PlayerNameUpdatePacket) == 0x20); #endif #endif