From ebbfab5b45974dea1c1de4a12e44c406a7e1b857 Mon Sep 17 00:00:00 2001 From: Andreas Lierschaft Date: Mon, 17 Aug 2026 21:33:22 +0200 Subject: [PATCH] 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. --- server/game/src/char_item.cpp | 77 +++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/server/game/src/char_item.cpp b/server/game/src/char_item.cpp index b69ce99..bcc72eb 100755 --- a/server/game/src/char_item.cpp +++ b/server/game/src/char_item.cpp @@ -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; }