From 82e911e67f84888ff63191c8c632efa9fa55cc08 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+wintersolstice8@users.noreply.github.com> Date: Thu, 30 Apr 2026 09:36:21 -0600 Subject: [PATCH] [core] equip sync: remove stale references from items being deleted --- src/map/inventory_sync_state.cpp | 9 +++++++++ src/map/inventory_sync_state.h | 1 + src/map/utils/charutils.cpp | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/src/map/inventory_sync_state.cpp b/src/map/inventory_sync_state.cpp index 0420c907d0e..b6ace460f80 100644 --- a/src/map/inventory_sync_state.cpp +++ b/src/map/inventory_sync_state.cpp @@ -54,6 +54,15 @@ void InventorySyncState::queueEquipChange(CONTAINER_ID container, uint8 containe dirtyContainers_.insert(equipping ? container : static_cast(item->getLocationID())); } +void InventorySyncState::removeEquipChange(const CItem* item) +{ + std::erase_if(pendingEquipChanges_, + [&](const equip_change_t& x) + { + return x.item == item; + }); +} + void InventorySyncState::clearEquipChanges() { pendingEquipChanges_.clear(); diff --git a/src/map/inventory_sync_state.h b/src/map/inventory_sync_state.h index 9efd7a57aa7..0429400f56e 100644 --- a/src/map/inventory_sync_state.h +++ b/src/map/inventory_sync_state.h @@ -53,6 +53,7 @@ class InventorySyncState // Equipment change queue void queueEquipChange(CONTAINER_ID container, uint8 containerSlotId, SLOTTYPE equipSlot, CItem* item, Equipping equipping); + void removeEquipChange(const CItem* item); void clearEquipChanges(); auto hasPendingEquipChanges() const -> bool; auto pendingEquipChanges() const -> const std::vector&; diff --git a/src/map/utils/charutils.cpp b/src/map/utils/charutils.cpp index 00543933959..cc3880611bb 100644 --- a/src/map/utils/charutils.cpp +++ b/src/map/utils/charutils.cpp @@ -47,6 +47,7 @@ #include "packets/s2c/0x020_item_attr.h" #include "packets/s2c/0x026_item_subcontainer.h" #include "packets/s2c/0x02d_battle_message2.h" +#include "packets/s2c/0x04f_equip_clear.h" #include "packets/s2c/0x050_equip_list.h" #include "packets/s2c/0x051_grap_list.h" #include "packets/s2c/0x055_scenarioitem.h" @@ -1989,6 +1990,9 @@ uint32 UpdateItem(CCharEntity* PChar, uint8 LocationID, uint8 slotID, int32 quan } } luautils::OnItemDrop(PChar, PItem); + + // Remove soon to be stale PItem pointer from sync state + PChar->inventorySyncState().removeEquipChange(PItem); } return ItemID; }