fix common cross-version lobby counter animation mismatch

This commit is contained in:
Martin Michelsen
2023-12-31 23:43:35 -08:00
parent e126015b5f
commit 09b7885013
2 changed files with 39 additions and 5 deletions
+4 -4
View File
@@ -4369,13 +4369,13 @@ struct G_SwitchInteraction_6x50 {
// 6x51: Invalid subcommand
// 6x52: Toggle counter (shop/bank) interaction (protected on V3/V4)
// 6x52: Set animation state (protected on V3/V4)
struct G_ToggleCounterInteraction_6x52 {
struct G_SetAnimationState_6x52 {
G_ClientIDHeader header;
le_uint16_t unknown_a1 = 0;
le_uint16_t animation = 0;
le_uint16_t unknown_a2 = 0;
le_uint32_t unknown_a3 = 0;
le_uint32_t angle = 0;
} __packed__;
// 6x53: Unknown (supported; game only) (protected on V3/V4)
+35 -1
View File
@@ -1330,6 +1330,40 @@ void on_movement_with_floor(shared_ptr<Client> c, uint8_t command, uint8_t flag,
forward_subcommand(c, command, flag, data, size);
}
void on_set_animation_state(shared_ptr<Client> c, uint8_t command, uint8_t flag, void* data, size_t size) {
auto& cmd = check_size_t<G_SetAnimationState_6x52>(data, size);
if (cmd.header.client_id != c->lobby_client_id) {
return;
}
if (command_is_private(command)) {
return;
}
auto l = c->require_lobby();
if (l->is_game()) {
forward_subcommand(c, command, flag, data, size);
return;
}
// The animation numbers were changed on V3. This is the most common one to
// see in the lobby (it occurs when a player talks to the counter), so we
// take care to translate it specifically.
bool c_is_v1_or_v2 = is_v1_or_v2(c->version());
if (!((c_is_v1_or_v2 && (cmd.animation == 0x000A)) || (!c_is_v1_or_v2 && (cmd.animation == 0x0000)))) {
forward_subcommand(c, command, flag, data, size);
return;
}
G_SetAnimationState_6x52 other_cmd = cmd;
other_cmd.animation = 0x000A - cmd.animation;
for (auto lc : l->clients) {
if (lc && (lc != c)) {
auto& out_cmd = (is_v1_or_v2(lc->version()) != c_is_v1_or_v2) ? other_cmd : cmd;
out_cmd.header.subcommand = translate_subcommand_number(lc->version(), Version::BB_V4, 0x52);
send_command_t(lc, command, flag, out_cmd);
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Item commands
@@ -3466,7 +3500,7 @@ const SubcommandDefinition subcommand_definitions[0x100] = {
/* 6x4F */ {0x43, 0x49, 0x4F, on_forward_check_game_client},
/* 6x50 */ {0x44, 0x4A, 0x50, on_forward_check_game_client},
/* 6x51 */ {0x00, 0x00, 0x51, nullptr},
/* 6x52 */ {0x46, 0x4C, 0x52, forward_subcommand_m},
/* 6x52 */ {0x46, 0x4C, 0x52, on_set_animation_state},
/* 6x53 */ {0x47, 0x4D, 0x53, on_forward_check_game},
/* 6x54 */ {0x48, 0x4E, 0x54, nullptr},
/* 6x55 */ {0x49, 0x4F, 0x55, on_forward_check_game_client},