Fix white lion mount seal (71124): timer now runs only while riding

The seal previously toggled the mount via a manual AddAffect+socket
flag entirely inside UseItemEx, bypassing Equip()/Unequip() and the
item's LIMIT_TIMER_BASED_ON_WEAR machinery entirely - so with
item_proto set to LIMIT_NONE, the mount never expired at all.

Now: activating starts the item's own wear-based countdown (via
StartTimerBasedOnWearExpireEvent, reusing socket0 as remaining-seconds
exactly like the existing wear-timer convention), deactivating pauses
it (StopTimerBasedOnWearExpireEvent), and it only ticks down while the
seal is active - matching the intended "usage time" behavior. Moved
the seal's own active-flag from socket0 to socket2 to stop colliding
with that convention. item_proto now grants 2 days (172800s) per
activation. When the usage time fully runs out while riding, both the
mount and the seal item are removed (timer_based_on_wear_expire_event
now calls ClearMountAttributeAndAffect() for ride items before
destroying them, mirroring the existing Unequip() cleanup path).
This commit is contained in:
Andreas Lierschaft
2026-08-18 00:59:07 +02:00
parent 77de1b8133
commit 039d537b54
3 changed files with 26 additions and 4 deletions
+22 -3
View File
@@ -1714,7 +1714,16 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true);
item->SetSocket(0, 1);
item->SetSocket(2, 1);
if (0 == item->GetSocket(0))
{
const long duration = item->GetDuration();
if (duration > 0)
item->SetSocket(0, duration);
}
item->StartTimerBasedOnWearExpireEvent();
}
else
{
@@ -1728,7 +1737,8 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
if (NULL != pkActiveItem)
{
pkActiveItem->Lock(false);
pkActiveItem->SetSocket(0, 0);
pkActiveItem->SetSocket(2, 0);
pkActiveItem->StopTimerBasedOnWearExpireEvent();
}
if (pkActiveItem != item)
@@ -1736,7 +1746,16 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true);
item->SetSocket(0, 1);
item->SetSocket(2, 1);
if (0 == item->GetSocket(0))
{
const long duration = item->GetDuration();
if (duration > 0)
item->SetSocket(0, duration);
}
item->StartTimerBasedOnWearExpireEvent();
}
}
}
+3
View File
@@ -1314,6 +1314,9 @@ EVENTFUNC(timer_based_on_wear_expire_event)
pkItem->SetTimerBasedOnWearExpireEvent(NULL);
pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, 0);
if (pkItem->IsRideItem())
pkItem->ClearMountAttributeAndAffect();
ITEM_MANAGER::instance().RemoveItem(pkItem, "TIMER_BASED_ON_WEAR_EXPIRE");
return 0;
}