From 29a4347f2b173d0e22bd9a1a2d624385d844f29b Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Thu, 28 Dec 2023 09:45:11 -0800 Subject: [PATCH] allow overwriting equips on DC NTE and 11/2000 --- src/PlayerSubordinates.cc | 12 ++++++++---- src/PlayerSubordinates.hh | 4 ++-- src/ReceiveSubcommands.cc | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/PlayerSubordinates.cc b/src/PlayerSubordinates.cc index e78ceb02..82d6ae9a 100644 --- a/src/PlayerSubordinates.cc +++ b/src/PlayerSubordinates.cc @@ -563,11 +563,11 @@ bool PlayerInventory::has_equipped_item(EquipSlot slot) const { } } -void PlayerInventory::equip_item_id(uint32_t item_id, EquipSlot slot) { - this->equip_item_index(this->find_item(item_id), slot); +void PlayerInventory::equip_item_id(uint32_t item_id, EquipSlot slot, bool allow_overwrite) { + this->equip_item_index(this->find_item(item_id), slot, allow_overwrite); } -void PlayerInventory::equip_item_index(size_t index, EquipSlot slot) { +void PlayerInventory::equip_item_index(size_t index, EquipSlot slot, bool allow_overwrite) { auto& item = this->items[index]; if (slot == EquipSlot::UNKNOWN) { @@ -578,7 +578,11 @@ void PlayerInventory::equip_item_index(size_t index, EquipSlot slot) { throw runtime_error("incorrect item type for equip slot"); } if (this->has_equipped_item(slot)) { - throw runtime_error("equip slot is already in use"); + if (allow_overwrite) { + this->unequip_item_slot(slot); + } else { + throw runtime_error("equip slot is already in use"); + } } item.flags |= 0x00000008; diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index 2f3dd54d..2f8db744 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -82,8 +82,8 @@ struct PlayerInventory { size_t find_equipped_item(EquipSlot slot) const; bool has_equipped_item(EquipSlot slot) const; - void equip_item_id(uint32_t item_id, EquipSlot slot); - void equip_item_index(size_t index, EquipSlot slot); + void equip_item_id(uint32_t item_id, EquipSlot slot, bool allow_overwrite); + void equip_item_index(size_t index, EquipSlot slot, bool allow_overwrite); void unequip_item_id(uint32_t item_id); void unequip_item_slot(EquipSlot slot); void unequip_item_index(size_t index); diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 5c153f61..1a59b6cd 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1436,7 +1436,7 @@ static void on_equip_item(shared_ptr c, uint8_t command, uint8_t flag, v auto l = c->require_lobby(); EquipSlot slot = static_cast(cmd.equip_slot.load()); auto p = c->character(); - p->inventory.equip_item_id(cmd.item_id, slot); + p->inventory.equip_item_id(cmd.item_id, slot, is_pre_v1(c->version())); c->log.info("Equipped item %08" PRIX32, cmd.item_id.load()); forward_subcommand(c, command, flag, data, size);