diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index f222d117..4cac2007 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -2577,8 +2577,8 @@ static void on_6x_C9_CB(shared_ptr s, shared_ptr c, on_subcommand_multi(s, l, c, command, flag, data); } -static void on_chat_generic(shared_ptr s, shared_ptr c, - const u16string& text) { +static void on_chat_generic( + shared_ptr s, shared_ptr c, const u16string& text) { if (text.empty()) { return; @@ -2614,13 +2614,20 @@ static void on_chat_generic(shared_ptr s, shared_ptr c, return; } + u16string from_name = c->game_data.player()->disp.name; for (size_t x = 0; x < l->max_clients; x++) { - if (!l->clients[x]) { - continue; + if (l->clients[x]) { + send_chat_message(l->clients[x], c->license->serial_number, + from_name, processed_text.c_str(), private_flags); + } + } + for (const auto& watcher_l : l->watcher_lobbies) { + for (size_t x = 0; x < watcher_l->max_clients; x++) { + if (watcher_l->clients[x]) { + send_chat_message(watcher_l->clients[x], c->license->serial_number, + from_name, processed_text.c_str(), private_flags); + } } - send_chat_message(l->clients[x], c->license->serial_number, - c->game_data.player()->disp.name.data(), processed_text.c_str(), - private_flags); } if (l->battle_record && l->battle_record->battle_in_progress()) { diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index ac7eb33e..cf02cb10 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -31,12 +31,18 @@ static const unordered_set watcher_subcommands({ 0x07, // Symbol chat 0x74, // Word select 0xBD, // Word select during battle (with private_flags) + 0xBE, // Sound chat }); -static void forward_subcommand(shared_ptr l, shared_ptr c, - uint8_t command, uint8_t flag, const void* data, size_t size) { +static void forward_subcommand( + shared_ptr l, + shared_ptr c, + uint8_t command, + uint8_t flag, + const void* data, + size_t size) { - // if the command is an Ep3-only command, make sure an Ep3 client sent it + // If the command is an Ep3-only command, make sure an Ep3 client sent it bool command_is_ep3 = (command & 0xF0) == 0xC0; if (command_is_ep3 && !(c->flags & Client::Flag::IS_EPISODE_3)) { return; @@ -50,9 +56,6 @@ static void forward_subcommand(shared_ptr l, shared_ptr c, if (!target) { return; } - if (command_is_ep3 && !(target->flags & Client::Flag::IS_EPISODE_3)) { - return; - } send_command(target, command, flag, data, size); } else { @@ -69,10 +72,13 @@ static void forward_subcommand(shared_ptr l, shared_ptr c, } // Before battle, forward only chat commands to watcher lobbies; during - // battle, forward everything to watcher lobbies. - if (size && - (watcher_subcommands.count(*reinterpret_cast(data) || - (l->ep3_server && l->ep3_server->setup_phase != Episode3::SetupPhase::REGISTRATION)))) { + // battle, forward everything to watcher lobbies. (This is necessary because + // if we forward everything before battle, the blocking menu subcommands + // cause the battle setup menu to appear in the spectator room, which looks + // weird and is generally undesirable.) + uint8_t subcommand = size ? *reinterpret_cast(data) : 0x00; + if ((l->ep3_server && (l->ep3_server->setup_phase != Episode3::SetupPhase::REGISTRATION)) || + watcher_subcommands.count(subcommand)) { for (const auto& watcher_lobby : l->watcher_lobbies) { forward_subcommand(watcher_lobby, c, command, flag, data, size); } @@ -1148,8 +1154,8 @@ static void on_open_bank_bb_or_card_trade_counter_ep3(shared_ptr, } } -static void on_bank_action_bb(shared_ptr, - shared_ptr l, shared_ptr c, uint8_t, uint8_t, const void* data, size_t size) { +static void on_ep3_private_word_select_bb_bank_action(shared_ptr, + shared_ptr l, shared_ptr c, uint8_t command, uint8_t flag, const void* data, size_t size) { if (l->version == GameVersion::BB) { const auto& cmd = check_size_t(data, size); @@ -1195,6 +1201,9 @@ static void on_bank_action_bb(shared_ptr, send_create_inventory_item(l, c, item.data); } } + + } else if ((c->version() == GameVersion::GC) && (c->flags & Client::Flag::IS_EPISODE_3)) { + forward_subcommand(l, c, command, flag, data, size); } } @@ -1960,7 +1969,7 @@ subcommand_handler_t subcommand_handlers[0x100] = { /* 6xBA */ on_accept_identify_item_bb, /* 6xBB */ on_open_bank_bb_or_card_trade_counter_ep3, /* 6xBC */ on_forward_check_size_ep3_game, - /* 6xBD */ on_bank_action_bb, + /* 6xBD */ on_ep3_private_word_select_bb_bank_action, /* 6xBE */ on_ep3_sound_chat, /* 6xBF */ on_forward_check_size_ep3_lobby, /* 6xC0 */ on_sell_item_at_shop_bb,