From 58e3316c4562772a486e54cfe31d9976c97653a3 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:22:31 +0100 Subject: [PATCH 1/3] fix crashlog --- src/server/game/Entities/Item/Item.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 6258b57c8..bbe1ebb3d 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1277,11 +1277,16 @@ void Item::ClearSoulboundTradeable(Player* currentOwner) bool Item::CheckSoulboundTradeExpire() { - // called from owner's update - GetOwner() MUST be valid + // we have to check the owner for mod_playerbots since bots programically call methods like DestroyItem, + // MoveItemToMail, DestroyItemCount which do not handle soulboundTradeable clearing. + Player* owner = GetOwner(); + if (!owner) + return true; // expired + if (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2 * HOUR < GetOwner()->GetTotalPlayedTime()) { ClearSoulboundTradeable(GetOwner()); - return true; // remove from tradeable list + return true; // expired } return false; From befa0158e2485e9496facbb4f6bcbfdab5346724 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:24:17 +0100 Subject: [PATCH 2/3] Update Item.cpp --- src/server/game/Entities/Item/Item.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index bbe1ebb3d..5f85b9cdf 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1281,12 +1281,12 @@ bool Item::CheckSoulboundTradeExpire() // MoveItemToMail, DestroyItemCount which do not handle soulboundTradeable clearing. Player* owner = GetOwner(); if (!owner) - return true; // expired + return true; // remove from tradeable list if (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2 * HOUR < GetOwner()->GetTotalPlayedTime()) { ClearSoulboundTradeable(GetOwner()); - return true; // expired + return true; // remove from tradeable list } return false; From 7aaefb76d9defdee8cc5d7be7092b5b7a33f115b Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Wed, 24 Dec 2025 22:36:45 +0100 Subject: [PATCH 3/3] Update Item.cpp --- src/server/game/Entities/Item/Item.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 5f85b9cdf..9c0c27fb7 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1283,9 +1283,9 @@ bool Item::CheckSoulboundTradeExpire() if (!owner) return true; // remove from tradeable list - if (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2 * HOUR < GetOwner()->GetTotalPlayedTime()) + if (GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) + 2 * HOUR < owner->GetTotalPlayedTime()) { - ClearSoulboundTradeable(GetOwner()); + ClearSoulboundTradeable(owner); return true; // remove from tradeable list }