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