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); AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true); 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 else
{ {
@@ -1728,7 +1737,8 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
if (NULL != pkActiveItem) if (NULL != pkActiveItem)
{ {
pkActiveItem->Lock(false); pkActiveItem->Lock(false);
pkActiveItem->SetSocket(0, 0); pkActiveItem->SetSocket(2, 0);
pkActiveItem->StopTimerBasedOnWearExpireEvent();
} }
if (pkActiveItem != item) 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); AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true); 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->SetTimerBasedOnWearExpireEvent(NULL);
pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, 0); pkItem->SetSocket(ITEM_SOCKET_REMAIN_SEC, 0);
if (pkItem->IsRideItem())
pkItem->ClearMountAttributeAndAffect();
ITEM_MANAGER::instance().RemoveItem(pkItem, "TIMER_BASED_ON_WEAR_EXPIRE"); ITEM_MANAGER::instance().RemoveItem(pkItem, "TIMER_BASED_ON_WEAR_EXPIRE");
return 0; return 0;
} }
+1 -1
View File
@@ -5199,7 +5199,7 @@ ITEM
71121 사자왕이용권 ITEM_QUEST 0 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 71121 사자왕이용권 ITEM_QUEST 0 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
71122 수룡방입장권 ITEM_MATERIAL MATERIAL_LEATHER 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 71122 수룡방입장권 ITEM_MATERIAL MATERIAL_LEATHER 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
71123 수룡비늘 ITEM_MATERIAL MATERIAL_LEATHER 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 71123 수룡비늘 ITEM_MATERIAL MATERIAL_LEATHER 1 NONE ITEM_STACKABLE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
71124 백사자이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_MYSHOP QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 2400 0 0 0 0 0 0 0 0 71124 백사자이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_MYSHOP QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 0 LIMIT_TIMER_BASED_ON_WEAR 172800 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 2400 0 0 0 0 0 0 0 0
71125 흑저신이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_SELL | ANTI_STACK QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0 71125 흑저신이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_SELL | ANTI_STACK QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0
71126 흑산견신이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_SELL | ANTI_STACK QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0 71126 흑산견신이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_SELL | ANTI_STACK QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0
71127 흑투지범이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_MYSHOP QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0 71127 흑투지범이용권 ITEM_UNIQUE UNIQUE_SPECIAL_RIDE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_MYSHOP QUEST_USE_MULTIPLE | LOG WEAR_SHIELD NONE 0 0 0 0 0 LEVEL 20 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 28800 0 0 0 0 0 0 0 0