From 194e4088630b3367e5d40b0dcad0325119406760 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 7 Jan 2024 10:36:32 -0800 Subject: [PATCH] make $rarenotifs also notify on rare tools regardless of source --- README.md | 2 +- src/Main.cc | 8 +++++++- src/ReceiveSubcommands.cc | 24 +++++++++++------------- system/item-tables/ItemPMT-v2.prs | Bin 8776 -> 8454 bytes 4 files changed, 19 insertions(+), 15 deletions(-) mode change 100644 => 100755 system/item-tables/ItemPMT-v2.prs diff --git a/README.md b/README.md index 1a77929e..f247ca47 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ Some commands only work on the game server and not on the proxy server. The chat * `$si` (game server only): Shows basic information about the server. * `$ping`: Shows round-trip ping time from the server to you. On the proxy server, shows the ping time from you to the proxy and from the proxy to the server. * `$matcount` (game server only): Shows how many of each type of material you've used. - * `$rarenotifs` (game server only): Enables or disables rare drop notifications. When enabled, you'll see a message whenever a rare item drops. In private drop mode, you will only see a notification if the item is visible to you; you won't be notified of other players' rare drops. + * `$rarenotifs` (game server only): Enables or disables rare drop notifications. Only applies to server drop modes (see `$dropmode`); notifications are not supported in client drop mode. When enabled, you'll see a message whenever a rare item drops. In private drop mode, you will only see a notification if the item is visible to you; you won't be notified of other players' rare drops. * `$what` (game server only): Shows the type, name, and stats of the nearest item on the ground. * `$where` (game server only): Shows your current floor number and coordinates. Mainly useful for debugging. diff --git a/src/Main.cc b/src/Main.cc index 96acd5bc..b3bdc330 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1477,9 +1477,15 @@ Action a_name_all_items( const auto& index = s.item_name_indexes.at(v_s); if (index) { Version version = static_cast(v_s); + auto pmt = s.item_parameter_table(version); ItemData item = ItemData::from_primary_identifier(version, primary_identifier); string name = index->describe_item(item); - fprintf(stderr, " %30s", name.c_str()); + try { + bool is_rare = pmt->is_item_rare(item); + fprintf(stderr, " %30s%s", name.c_str(), is_rare ? " (*)" : " "); + } catch (const out_of_range&) { + fprintf(stderr, " "); + } } } fputc('\n', stderr); diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 2f7ef119..0ae4ed48 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1574,9 +1574,10 @@ static void on_buy_shop_item(shared_ptr c, uint8_t command, uint8_t flag forward_subcommand_with_item_transcode_t(c, command, flag, cmd); } -static void send_rare_notification_if_needed(shared_ptr to_c, const ItemData& item) { +static void send_rare_notification_if_needed(shared_ptr to_c, const ItemData& item, bool is_from_rare_table) { auto s = to_c->require_server_state(); if (!to_c->config.check_flag(Client::Flag::RARE_DROP_NOTIFICATIONS_ENABLED) || + (!is_from_rare_table && (item.data1[0] != 0x03)) || !s->item_parameter_table(to_c->version())->is_item_rare(item)) { return; } @@ -1631,7 +1632,10 @@ static void on_box_or_enemy_item_drop_t(shared_ptr c, uint8_t command, u send_command_t(lc, command, flag, cmd); } } - send_rare_notification_if_needed(lc, item); + // TODO: Make rare drop notifications work in client drop mode. The problem + // is that we can't know if items are from the rare table or not when the + // client generates them, and some common items like Celestial Shield have + // 9 stars on v2 so they would be considered rare without that check. } } @@ -2227,9 +2231,7 @@ static void on_entity_drop_item_request(shared_ptr c, uint8_t command, u res.item.id.load(), cmd.floor, cmd.x.load(), cmd.z.load(), lc->channel.name.c_str()); l->add_item(cmd.floor, res.item, cmd.x, cmd.z, (1 << lc->lobby_client_id)); send_drop_item_to_channel(s, lc->channel, res.item, !is_box, cmd.floor, cmd.x, cmd.z, cmd.entity_id); - if (res.is_from_rare_table) { - send_rare_notification_if_needed(lc, res.item); - } + send_rare_notification_if_needed(lc, res.item, res.is_from_rare_table); } } @@ -2239,11 +2241,9 @@ static void on_entity_drop_item_request(shared_ptr c, uint8_t command, u res.item.id.load(), cmd.floor, cmd.x.load(), cmd.z.load()); l->add_item(cmd.floor, res.item, cmd.x, cmd.z, 0x00F); send_drop_item_to_lobby(l, res.item, !is_box, cmd.floor, cmd.x, cmd.z, cmd.entity_id); - if (res.is_from_rare_table) { - for (auto lc : l->clients) { - if (lc) { - send_rare_notification_if_needed(lc, res.item); - } + for (auto lc : l->clients) { + if (lc) { + send_rare_notification_if_needed(lc, res.item, res.is_from_rare_table); } } } @@ -2264,9 +2264,7 @@ static void on_entity_drop_item_request(shared_ptr c, uint8_t command, u res.item.id.load(), cmd.floor, cmd.x.load(), cmd.z.load(), lc->channel.name.c_str()); l->add_item(cmd.floor, res.item, cmd.x, cmd.z, (1 << lc->lobby_client_id)); send_drop_item_to_channel(s, lc->channel, res.item, !is_box, cmd.floor, cmd.x, cmd.z, cmd.entity_id); - if (res.is_from_rare_table) { - send_rare_notification_if_needed(lc, res.item); - } + send_rare_notification_if_needed(lc, res.item, res.is_from_rare_table); } } } diff --git a/system/item-tables/ItemPMT-v2.prs b/system/item-tables/ItemPMT-v2.prs old mode 100644 new mode 100755 index a61299cb7d791d325d964e0192a8a8faace90037..9de810974decba46dd14a432ea3a576de0387799 GIT binary patch literal 8454 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