feat(net): handle SMSG_CHAR_ENUM

This commit is contained in:
fallenoak 2025-10-03 22:52:33 -05:00
parent 226468f93d
commit 7a22ffb998
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
6 changed files with 127 additions and 1 deletions

View File

@ -4,6 +4,10 @@ void AccountDataInitialize(bool a1) {
// TODO
}
void ClientRealmResponseAdapter::CharacterListReceived(RealmConnection* realmConnection, const TSFixedArray<CHARACTER_INFO>& characterList, int32_t listSuccess) {
// TODO
}
void ClientRealmResponseAdapter::HandleAuthResponse(RealmConnection* realmConnection, uint8_t authResult) {
auto clientConnection = static_cast<ClientConnection*>(realmConnection);

View File

@ -7,6 +7,7 @@ class ClientRealmResponseAdapter : public RealmResponse {
public:
// Virtual member functions
virtual void HandleAuthResponse(RealmConnection* realmConnection, uint8_t authResult);
virtual void CharacterListReceived(RealmConnection* realmConnection, const TSFixedArray<CHARACTER_INFO>& characterList, int32_t listSuccess);
virtual void GameServerResult(RealmConnection* realmConnection, const char* a2, const char* a3, const char* a4) {};
};

View File

@ -1,6 +1,7 @@
#ifndef NET_TYPES_HPP
#define NET_TYPES_HPP
#include <tempest/Vector.hpp>
#include <cstdint>
enum NETMESSAGE {
@ -1185,4 +1186,35 @@ struct REALM_INFO {
uint16_t revision;
};
struct INVENTORY_ITEM {
uint8_t type;
uint32_t displayID;
uint32_t auraID;
};
struct CHARACTER_INFO {
uint64_t guid;
char name[48];
uint32_t mapID;
uint32_t zoneID;
uint32_t guildID;
C3Vector position;
INVENTORY_ITEM items[23];
uint32_t petDisplayInfoID;
uint32_t petExperienceLevel;
uint32_t petCreatureFamilyID;
uint32_t flags;
uint32_t customizeFlags;
uint8_t raceID;
uint8_t classID;
uint8_t sexID;
uint8_t skinID;
uint8_t faceID;
uint8_t hairStyleID;
uint8_t hairColorID;
uint8_t facialHairStyleID;
uint8_t experienceLevel;
uint8_t firstLogin;
};
#endif

View File

@ -24,7 +24,7 @@ int32_t RealmConnection::MessageHandler(void* param, NETMESSAGE msgId, uint32_t
}
case SMSG_ENUM_CHARACTERS_RESULT: {
// TODO
result = connection->HandleCharEnum(msgId, time, msg);
break;
}
@ -193,6 +193,91 @@ int32_t RealmConnection::HandleAuthResponse(uint32_t msgId, uint32_t time, CData
return 1;
}
int32_t RealmConnection::HandleCharEnum(uint32_t msgId, uint32_t time, CDataStore* msg) {
if (this->m_realmResponse) {
this->m_realmResponse->GameServerResult(this, "SMSG_CHAR_ENUM", nullptr, nullptr);
}
int32_t characterLimitExceeded = 0;
uint8_t count;
msg->Get(count);
if (count > 10) {
count = 0;
characterLimitExceeded = 1;
}
this->m_characterList.Clear();
this->m_characterList.SetCount(count);
for (uint32_t i = 0; i < count; i++) {
auto& character = this->m_characterList[i];
msg->Get(character.guid);
msg->GetString(character.name, 48);
msg->Get(character.raceID);
msg->Get(character.classID);
msg->Get(character.sexID);
msg->Get(character.skinID);
msg->Get(character.faceID);
msg->Get(character.hairStyleID);
msg->Get(character.hairColorID);
msg->Get(character.facialHairStyleID);
msg->Get(character.experienceLevel);
msg->Get(character.zoneID);
msg->Get(character.mapID);
msg->Get(character.position.x);
msg->Get(character.position.y);
msg->Get(character.position.z);
msg->Get(character.guildID);
msg->Get(character.flags);
msg->Get(character.customizeFlags);
msg->Get(character.firstLogin);
msg->Get(character.petDisplayInfoID);
msg->Get(character.petExperienceLevel);
msg->Get(character.petCreatureFamilyID);
for (auto& item : character.items) {
msg->Get(item.displayID);
msg->Get(item.type);
msg->Get(item.auraID);
}
}
int32_t listSuccess = 0;
if (!characterLimitExceeded) {
if (!msg->IsRead()) {
// TODO what are these fields?
uint32_t unknown;
for (uint32_t i = 0; i < 10; i++) {
msg->Get(unknown);
}
}
if (msg->IsRead()) {
listSuccess = 1;
}
}
if (!listSuccess) {
this->m_characterList.Clear();
}
this->m_realmResponse->CharacterListReceived(this, this->m_characterList, listSuccess);
return 1;
}
void RealmConnection::SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4) {
// TODO
}

View File

@ -2,6 +2,7 @@
#define NET_CONNECTION_REALM_CONNECTION_HPP
#include "net/connection/NetClient.hpp"
#include <storm/Array.hpp>
#include <cstdint>
class CDataStore;
@ -24,6 +25,7 @@ class RealmConnection : public NetClient {
// Member variables
RealmResponse* m_realmResponse;
TSFixedArray<CHARACTER_INFO> m_characterList;
uint8_t m_authenticated = 0;
uint32_t m_queuePosition = 0;
uint32_t m_freeCharacterMigration = 0;
@ -38,6 +40,7 @@ class RealmConnection : public NetClient {
// Member functions
RealmConnection(RealmResponse* realmResponse);
int32_t HandleAuthResponse(uint32_t msgId, uint32_t time, CDataStore* msg);
int32_t HandleCharEnum(uint32_t msgId, uint32_t time, CDataStore* msg);
void SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4);
};

View File

@ -5,6 +5,7 @@ class RealmResponse {
public:
// Virtual member functions
virtual void HandleAuthResponse(RealmConnection* connection, uint8_t authResult) = 0;
virtual void CharacterListReceived(RealmConnection* realmConnection, const TSFixedArray<CHARACTER_INFO>& characterList, int32_t listResult) = 0;
virtual void GameServerResult(RealmConnection* connection, const char* a3, const char* a4, const char* a5) = 0;
};