diff --git a/src/PlayerSubordinates.cc b/src/PlayerSubordinates.cc index 3e1bd957..fca44136 100644 --- a/src/PlayerSubordinates.cc +++ b/src/PlayerSubordinates.cc @@ -265,7 +265,7 @@ void PlayerLobbyDataXB::clear() { void PlayerLobbyDataBB::clear() { this->player_tag = 0; this->guild_card_number = 0; - this->sys_guild_card_number = 0; + this->team_master_guild_card_number = 0; this->team_id = 0; this->unknown_a1.clear(0); this->client_id = 0; diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index 7f6cfc98..28066e5c 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -310,7 +310,7 @@ struct PlayerLobbyDataXB { struct PlayerLobbyDataBB { /* 00 */ le_uint32_t player_tag = 0; /* 04 */ le_uint32_t guild_card_number = 0; - /* 08 */ le_uint32_t sys_guild_card_number = 0; + /* 08 */ le_uint32_t team_master_guild_card_number = 0; /* 0C */ le_uint32_t team_id = 0; /* 10 */ parray unknown_a1; /* 1C */ le_uint32_t client_id = 0; diff --git a/src/SaveFileFormats.hh b/src/SaveFileFormats.hh index e959c648..5da10b92 100644 --- a/src/SaveFileFormats.hh +++ b/src/SaveFileFormats.hh @@ -134,7 +134,7 @@ struct PSOBBMinimalSystemFile { } __attribute__((packed)); struct PSOBBTeamMembership { - /* 0000 */ le_uint32_t guild_card_number = 0; + /* 0000 */ le_uint32_t team_master_guild_card_number = 0; /* 0004 */ le_uint32_t team_id = 0; /* 0008 */ le_uint32_t unknown_a5 = 0; /* 000C */ le_uint32_t unknown_a6 = 0; diff --git a/src/SendCommands.cc b/src/SendCommands.cc index eafcb07d..528ad979 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1644,11 +1644,14 @@ template <> void populate_lobby_data_for_client(PlayerLobbyDataBB& ret, shared_ptr c, shared_ptr viewer_c) { ret.player_tag = 0x00010000; ret.guild_card_number = c->license->serial_number; - ret.sys_guild_card_number = viewer_c->license->serial_number; ret.client_id = c->lobby_client_id; auto team = c->team(); if (team) { + ret.team_master_guild_card_number = team->master_serial_number; ret.team_id = team->team_id; + } else { + ret.team_master_guild_card_number = 0; + ret.team_id = 0; } string name = c->character()->disp.name.decode(c->language()); if ((name.size() >= 2) && (name[0] == '\t') && (name[1] != 'C')) { diff --git a/src/TeamIndex.cc b/src/TeamIndex.cc index b2de7dd9..5d606978 100644 --- a/src/TeamIndex.cc +++ b/src/TeamIndex.cc @@ -58,6 +58,9 @@ void TeamIndex::Team::load_config() { Member m(*member_it); this->points += m.points; uint32_t serial_number = m.serial_number; + if (m.check_flag(Member::Flag::IS_MASTER)) { + this->master_serial_number = serial_number; + } this->members.emplace(serial_number, std::move(m)); } try { @@ -125,7 +128,7 @@ PSOBBTeamMembership TeamIndex::Team::membership_for_member(uint32_t serial_numbe const auto& m = this->members.at(serial_number); PSOBBTeamMembership ret; - ret.guild_card_number = serial_number; + ret.team_master_guild_card_number = this->master_serial_number; ret.team_id = this->team_id; ret.unknown_a5 = 0; ret.unknown_a6 = 0; @@ -421,6 +424,7 @@ void TeamIndex::change_master(uint32_t master_serial_number, uint32_t new_master master_m.set_flag(TeamIndex::Team::Member::Flag::IS_LEADER); new_master_m.clear_flag(TeamIndex::Team::Member::Flag::IS_LEADER); new_master_m.set_flag(TeamIndex::Team::Member::Flag::IS_MASTER); + team->master_serial_number = new_master_serial_number; team->save_config(); } diff --git a/src/TeamIndex.hh b/src/TeamIndex.hh index 852717be..ac7303f8 100644 --- a/src/TeamIndex.hh +++ b/src/TeamIndex.hh @@ -60,6 +60,7 @@ public: uint32_t points = 0; uint32_t spent_points = 0; std::string name; + uint32_t master_serial_number = 0; std::unordered_map members; uint32_t reward_flags = 0; std::unordered_set reward_keys;