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:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user