From 25c0aa21dc415cf2deba0f169f1664aff8a317a4 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 4 Nov 2023 09:19:07 -0700 Subject: [PATCH] remove client ID check for externally-generated item IDs --- src/Lobby.cc | 7 ++----- src/Lobby.hh | 2 +- src/ReceiveSubcommands.cc | 8 ++++---- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Lobby.cc b/src/Lobby.cc index 9d8b19cc..a26b3660 100644 --- a/src/Lobby.cc +++ b/src/Lobby.cc @@ -351,7 +351,7 @@ uint32_t Lobby::generate_item_id(uint8_t client_id) { return this->next_game_item_id++; } -void Lobby::on_item_id_generated_externally(uint8_t client_id, uint32_t item_id) { +void Lobby::on_item_id_generated_externally(uint32_t item_id) { if (this->base_version == GameVersion::BB) { throw logic_error("BB games cannot have externally-generated item IDs"); } @@ -360,10 +360,7 @@ void Lobby::on_item_id_generated_externally(uint8_t client_id, uint32_t item_id) // the range further here. if ((item_id > 0x00010000) && (item_id < 0x00810000)) { uint16_t item_client_id = (item_id >> 21) & 0x7FF; - if (item_client_id != client_id) { - throw runtime_error("externally-generated item ID does not match expected client ID"); - } - uint32_t& next_item_id = this->next_item_id.at(client_id); + uint32_t& next_item_id = this->next_item_id.at(item_client_id); next_item_id = std::max(next_item_id, item_id + 1); } } diff --git a/src/Lobby.hh b/src/Lobby.hh index 535da3ae..45fa9b58 100644 --- a/src/Lobby.hh +++ b/src/Lobby.hh @@ -177,7 +177,7 @@ struct Lobby : public std::enable_shared_from_this { void add_item(const ItemData& item, uint8_t area, float x, float z); ItemData remove_item(uint32_t item_id); uint32_t generate_item_id(uint8_t client_id); - void on_item_id_generated_externally(uint8_t client_id, uint32_t item_id); + void on_item_id_generated_externally(uint32_t item_id); static uint8_t game_event_for_lobby_event(uint8_t lobby_event); diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 878b5440..490d4d0c 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -743,7 +743,7 @@ static void on_create_inventory_item_t(shared_ptr c, uint8_t command, ui auto p = c->game_data.player(); ItemData item = cmd.item_data; item.decode_if_mag(c->version()); - l->on_item_id_generated_externally(c->lobby_client_id, item.id); + l->on_item_id_generated_externally(item.id); p->add_item(item); auto s = c->require_server_state(); @@ -787,7 +787,7 @@ static void on_drop_partial_stack_t(shared_ptr c, uint8_t command, uint8 // send an appropriate 6x29 alongside this? ItemData item = cmd.item_data; item.decode_if_mag(c->version()); - l->on_item_id_generated_externally(c->lobby_client_id, item.id); + l->on_item_id_generated_externally(item.id); l->add_item(item, cmd.area, cmd.x, cmd.z); auto s = c->require_server_state(); @@ -880,7 +880,7 @@ static void on_buy_shop_item(shared_ptr c, uint8_t command, uint8_t flag auto p = c->game_data.player(); ItemData item = cmd.item_data; item.decode_if_mag(c->version()); - l->on_item_id_generated_externally(c->lobby_client_id, item.id); + l->on_item_id_generated_externally(item.id); p->add_item(item); size_t price = s->item_parameter_table_for_version(c->version())->price_for_item(item); @@ -919,7 +919,7 @@ static void on_box_or_enemy_item_drop_t(shared_ptr c, uint8_t command, u if (l->check_flag(Lobby::Flag::ITEM_TRACKING_ENABLED)) { ItemData item = cmd.item.item; item.decode_if_mag(c->version()); - l->on_item_id_generated_externally(c->lobby_client_id, item.id); + l->on_item_id_generated_externally(item.id); l->add_item(item, cmd.item.area, cmd.item.x, cmd.item.z); auto s = c->require_server_state();