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:
@@ -1663,6 +1663,18 @@ int CalculateConsumeSP(LPCHARACTER lpChar)
|
||||
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)
|
||||
{
|
||||
int iLimitRealtimeStartFirstUseFlagIndex = -1;
|
||||
@@ -1848,6 +1860,54 @@ bool CHARACTER::UseItemEx(LPITEM item, TItemPos DestCell)
|
||||
item->SetCount(item->GetCount() - 1);
|
||||
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:
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user