Reit-Siegel (weisser Loewe) unabhaengig vom WEAR_UNIQUE-Equip-Slot aktivierbar machen

Bisher wurde ein UNIQUE_SPECIAL_RIDE-Item beim Benutzen ueber EquipItem/
UnequipItem in den WEAR_UNIQUE-Slot verschoben. Neu: das Item bleibt im
Inventar, wird per Socket0-Flag als aktiv markiert (fuer den Client-Rahmen)
und aktiviert stattdessen direkt AFFECT_MOUNT/POINT_MOUNT, sodass der
Charakter den zugehoerigen Mount (weisser Loewe, mob_proto 20114) reitet.
Deaktivierung ueber erneutes Benutzen oder /unmount (Strg+H), auch bei
Tod und dem bestehenden Reit-Toggle-Befehl beruecksichtigt.
This commit is contained in:
Andreas Lierschaft
2026-08-17 21:33:22 +02:00
parent ff1237686b
commit ebbfab5b45
+77
View File
@@ -1663,6 +1663,18 @@ int CalculateConsumeSP(LPCHARACTER lpChar)
return needSP; return needSP;
} }
// Reit-Siegel (UNIQUE_SPECIAL_RIDE): vnum des Siegel-Items -> vnum des Mount-Mobs (mob_proto),
// das per AddAffect(AFFECT_MOUNT, POINT_MOUNT, ...) angezeigt wird. 0 = kein Reit-Siegel.
static DWORD GetMountSealMobVnum(DWORD itemVnum)
{
switch (itemVnum)
{
case 71124: return 20114; // Weisser Loewe Siegel -> Weisser Loewe
default: return 0;
}
}
bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell) bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
{ {
int iLimitRealtimeStartFirstUseFlagIndex = -1; int iLimitRealtimeStartFirstUseFlagIndex = -1;
@@ -1848,6 +1860,54 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
item->SetCount(item->GetCount() - 1); item->SetCount(item->GetCount() - 1);
break; break;
case UNIQUE_SPECIAL_RIDE:
{
const DWORD dwMountMobVnum = GetMountSealMobVnum(item->GetVnum());
if (0 == dwMountMobVnum)
break;
CAffect* pAffect = FindAffect(AFFECT_MOUNT);
if (NULL == pAffect)
{
if (IsRiding())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Du reitest bereits."));
break;
}
AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true);
item->SetSocket(0, 1);
}
else
{
const DWORD dwActiveItemID = pAffect->dwFlag;
RemoveAffect(AFFECT_MOUNT);
RemoveAffect(AFFECT_MOUNT_BONUS);
LPITEM pkActiveItem = FindItemByID(dwActiveItemID);
if (NULL != pkActiveItem)
{
pkActiveItem->Lock(false);
pkActiveItem->SetSocket(0, 0);
}
if (pkActiveItem != item)
{
AddAffect(AFFECT_MOUNT, POINT_MOUNT, dwMountMobVnum, item->GetID(), INFINITE_AFFECT_DURATION, 0, true, false);
item->Lock(true);
item->SetSocket(0, 1);
}
}
}
break;
default: default:
{ {
if (item->GetSubType() == USE_SPECIAL) if (item->GetSubType() == USE_SPECIAL)
@@ -7389,6 +7449,23 @@ bool CHARACTER::UnEquipSpecialRideUniqueItem()
} }
} }
// Reit-Siegel, das nicht mehr ueber WEAR_UNIQUE laeuft, sondern per Socket0-Flag aktiviert ist
CAffect* pAffect = FindAffect(AFFECT_MOUNT);
if (NULL != pAffect)
{
LPITEM pkActiveItem = FindItemByID(pAffect->dwFlag);
RemoveAffect(AFFECT_MOUNT);
RemoveAffect(AFFECT_MOUNT_BONUS);
if (NULL != pkActiveItem)
{
pkActiveItem->Lock(false);
pkActiveItem->SetSocket(0, 0);
}
}
return true; return true;
} }