implement spectator team tracking properly on proxy server
This commit is contained in:
+66
-14
@@ -1229,7 +1229,7 @@ static void update_leader_id(ProxyServer::LinkedSession& session, uint8_t leader
|
||||
}
|
||||
|
||||
template <typename CmdT>
|
||||
static HandlerResult S_65_67_68(shared_ptr<ServerState>,
|
||||
static HandlerResult S_65_67_68_EB(shared_ptr<ServerState>,
|
||||
ProxyServer::LinkedSession& session, uint16_t command, uint32_t flag, string& data) {
|
||||
if (command == 0x67) {
|
||||
session.clear_lobby_players(12);
|
||||
@@ -1289,10 +1289,10 @@ static HandlerResult S_65_67_68(shared_ptr<ServerState>,
|
||||
return modified ? HandlerResult::Type::MODIFIED : HandlerResult::Type::FORWARD;
|
||||
}
|
||||
|
||||
constexpr on_command_t S_DG_65_67_68 = &S_65_67_68<S_JoinLobby_DC_GC_65_67_68_Ep3_EB>;
|
||||
constexpr on_command_t S_P_65_67_68 = &S_65_67_68<S_JoinLobby_PC_65_67_68>;
|
||||
constexpr on_command_t S_X_65_67_68 = &S_65_67_68<S_JoinLobby_XB_65_67_68>;
|
||||
constexpr on_command_t S_B_65_67_68 = &S_65_67_68<S_JoinLobby_BB_65_67_68>;
|
||||
constexpr on_command_t S_DG_65_67_68_EB = &S_65_67_68_EB<S_JoinLobby_DC_GC_65_67_68_Ep3_EB>;
|
||||
constexpr on_command_t S_P_65_67_68 = &S_65_67_68_EB<S_JoinLobby_PC_65_67_68>;
|
||||
constexpr on_command_t S_X_65_67_68 = &S_65_67_68_EB<S_JoinLobby_XB_65_67_68>;
|
||||
constexpr on_command_t S_B_65_67_68 = &S_65_67_68_EB<S_JoinLobby_BB_65_67_68>;
|
||||
|
||||
template <typename CmdT>
|
||||
static HandlerResult S_64(shared_ptr<ServerState>,
|
||||
@@ -1354,7 +1354,59 @@ constexpr on_command_t S_P_64 = &S_64<S_JoinGame_PC_64>;
|
||||
constexpr on_command_t S_X_64 = &S_64<S_JoinGame_XB_64>;
|
||||
constexpr on_command_t S_B_64 = &S_64<S_JoinGame_BB_64>;
|
||||
|
||||
static HandlerResult S_66_69(shared_ptr<ServerState>,
|
||||
static HandlerResult S_E8(shared_ptr<ServerState>,
|
||||
ProxyServer::LinkedSession& session, uint16_t, uint32_t, string& data) {
|
||||
auto& cmd = check_size_t<S_JoinSpectatorTeam_GC_Ep3_E8>(data);
|
||||
|
||||
session.clear_lobby_players(12);
|
||||
session.area = 0;
|
||||
session.is_in_game = true;
|
||||
|
||||
bool modified = false;
|
||||
|
||||
session.lobby_client_id = cmd.client_id;
|
||||
update_leader_id(session, cmd.leader_id);
|
||||
|
||||
for (size_t x = 0; x < 12; x++) {
|
||||
auto& player_entry = (x < 4) ? cmd.players[x] : cmd.spectator_players[x - 4];
|
||||
auto& spec_entry = cmd.entries[x];
|
||||
|
||||
if (player_entry.lobby_data.guild_card == session.remote_guild_card_number) {
|
||||
player_entry.lobby_data.guild_card = session.license->serial_number;
|
||||
modified = true;
|
||||
}
|
||||
if (spec_entry.guild_card_number == session.remote_guild_card_number) {
|
||||
spec_entry.guild_card_number = session.license->serial_number;
|
||||
modified = true;
|
||||
}
|
||||
|
||||
auto& p = session.lobby_players[x];
|
||||
p.guild_card_number = player_entry.lobby_data.guild_card;
|
||||
ptext<char, 0x10> name = player_entry.disp.name;
|
||||
p.name = name;
|
||||
p.section_id = player_entry.disp.section_id;
|
||||
p.char_class = player_entry.disp.char_class;
|
||||
session.log.info("Added lobby player: (%zu) %" PRIu32 " %s",
|
||||
x, p.guild_card_number, p.name.c_str());
|
||||
}
|
||||
|
||||
if (session.options.override_section_id >= 0) {
|
||||
cmd.section_id = session.options.override_section_id;
|
||||
modified = true;
|
||||
}
|
||||
if (session.options.override_lobby_event >= 0) {
|
||||
cmd.event = session.options.override_lobby_event;
|
||||
modified = true;
|
||||
}
|
||||
if (session.options.override_random_seed >= 0) {
|
||||
cmd.rare_seed = session.options.override_random_seed;
|
||||
modified = true;
|
||||
}
|
||||
|
||||
return modified ? HandlerResult::Type::MODIFIED : HandlerResult::Type::FORWARD;
|
||||
}
|
||||
|
||||
static HandlerResult S_66_69_E9(shared_ptr<ServerState>,
|
||||
ProxyServer::LinkedSession& session, uint16_t, uint32_t, string& data) {
|
||||
const auto& cmd = check_size_t<S_LeaveLobby_66_69_Ep3_E9>(data);
|
||||
size_t index = cmd.client_id;
|
||||
@@ -1668,11 +1720,11 @@ static on_command_t handlers[0x100][6][2] = {
|
||||
/* 62 */ {{S_invalid, nullptr}, {S_6x, C_D_6x}, {S_6x, C_P_6x}, {S_6x, C_GX_6x}, {S_6x, C_GX_6x}, {S_6x, C_B_6x}},
|
||||
/* 63 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* 64 */ {{S_invalid, nullptr}, {S_DG_64, nullptr}, {S_P_64, nullptr}, {S_DG_64, nullptr}, {S_X_64, nullptr}, {S_B_64, nullptr}},
|
||||
/* 65 */ {{S_invalid, nullptr}, {S_DG_65_67_68, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 66 */ {{S_invalid, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}},
|
||||
/* 67 */ {{S_invalid, nullptr}, {S_DG_65_67_68, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 68 */ {{S_invalid, nullptr}, {S_DG_65_67_68, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 69 */ {{S_invalid, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}, {S_66_69, nullptr}},
|
||||
/* 65 */ {{S_invalid, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 66 */ {{S_invalid, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}},
|
||||
/* 67 */ {{S_invalid, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 68 */ {{S_invalid, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_P_65_67_68, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_X_65_67_68, nullptr}, {S_B_65_67_68, nullptr}},
|
||||
/* 69 */ {{S_invalid, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}, {S_66_69_E9, nullptr}},
|
||||
/* 6A */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* 6B */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* 6C */ {{S_invalid, nullptr}, {S_6x, C_D_6x}, {S_6x, C_P_6x}, {S_6x, C_GX_6x}, {S_6x, C_GX_6x}, {S_6x, C_B_6x}},
|
||||
@@ -1803,10 +1855,10 @@ static on_command_t handlers[0x100][6][2] = {
|
||||
/* E5 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* E6 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* E7 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {S_B_E7, nullptr}},
|
||||
/* E8 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* E9 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* E8 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_E8, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* E9 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_66_69_E9, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* EA */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* EB */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* EB */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_DG_65_67_68_EB, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* EC */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* ED */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
/* EE */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}},
|
||||
|
||||
Reference in New Issue
Block a user