From 762603aaf5b5e0ddf2aa8f464219c945c6050295 Mon Sep 17 00:00:00 2001 From: server Date: Thu, 16 Apr 2026 22:29:08 +0200 Subject: [PATCH] issue-10: add talisman slot support --- src/common/item_length.h | 1 + src/common/length.h | 1 + src/db/ProtoReader.cpp | 5 +++-- src/game/char_item.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/game/item.cpp | 2 ++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/common/item_length.h b/src/common/item_length.h index dd73779..13f110a 100644 --- a/src/common/item_length.h +++ b/src/common/item_length.h @@ -327,6 +327,7 @@ enum EItemWearableFlag WEARABLE_COSTUME_HAIR = (1 << 13), WEARABLE_BELT = (1 << 14), WEARABLE_COSTUME_SASH = (1 << 15), + WEARABLE_TALISMAN = (1 << 16), }; enum ELimitTypes diff --git a/src/common/length.h b/src/common/length.h index d6d215b..4793650 100644 --- a/src/common/length.h +++ b/src/common/length.h @@ -124,6 +124,7 @@ enum EWearPositions WEAR_BELT, // 23 : 신규 벨트슬롯 WEAR_COSTUME_SASH, // 24 + WEAR_TALISMAN, // 25 WEAR_MAX = 32 // }; diff --git a/src/db/ProtoReader.cpp b/src/db/ProtoReader.cpp index 33bbffa..ff757be 100644 --- a/src/db/ProtoReader.cpp +++ b/src/db/ProtoReader.cpp @@ -298,8 +298,9 @@ int get_Item_Flag_Value(string inputString) int get_Item_WearFlag_Value(string inputString) { - string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE", - "WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY"}; + string arWearrFlag[] = {"WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_UNIQUE", + "WEAR_SHIELD", "WEAR_ARROW", "WEAR_HAIR", "WEAR_ABILITY", "WEAR_COSTUME_BODY", "WEAR_COSTUME_HAIR", + "WEAR_BELT", "WEAR_COSTUME_SASH", "WEAR_TALISMAN"}; int retValue = 0; diff --git a/src/game/char_item.cpp b/src/game/char_item.cpp index b7eeb82..70d1666 100644 --- a/src/game/char_item.cpp +++ b/src/game/char_item.cpp @@ -54,6 +54,37 @@ namespace constexpr int kPickupPatternMinRouteStep = 250; constexpr int kPickupPatternMaxIntervalMs = 15000; + enum ETalismanElement + { + TALISMAN_ELEMENT_FIRE = 1, + TALISMAN_ELEMENT_ICE = 2, + TALISMAN_ELEMENT_LIGHTNING = 3, + TALISMAN_ELEMENT_WIND = 4, + TALISMAN_ELEMENT_EARTH = 5, + }; + + const char* GetTalismanEffectPath(LPITEM item) + { + if (!item || item->GetType() != ITEM_TOTEM) + return nullptr; + + switch (item->GetValue(0)) + { + case TALISMAN_ELEMENT_FIRE: + return "d:/ymir work/effect/etc/firecracker/newyear_firecracker.mse"; + case TALISMAN_ELEMENT_ICE: + return "d:/ymir work/effect/etc/recuperation/drugup_blue.mse"; + case TALISMAN_ELEMENT_LIGHTNING: + return "d:/ymir work/effect/etc/recuperation/drugup_purple.mse"; + case TALISMAN_ELEMENT_WIND: + return "d:/ymir work/effect/etc/recuperation/drugup_green.mse"; + case TALISMAN_ELEMENT_EARTH: + return "d:/ymir work/effect/etc/buff/buff_item3.mse"; + default: + return "d:/ymir work/effect/etc/buff/buff_item1.mse"; + } + } + bool ValidateStoredRefineNpc(LPCHARACTER ch, DWORD dwRefineNpcVID, const char* action) { if (!ch) @@ -6618,6 +6649,11 @@ bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell) { this->EffectPacket(SE_EQUIP_LOVE_PENDANT); } + else if (ITEM_TOTEM == item->GetType()) + { + if (const char* c_szEffect = GetTalismanEffectPath(item)) + SpecificEffectPacket(c_szEffect); + } // ITEM_UNIQUE의 경우, SpecialItemGroup에 정의되어 있고, (item->GetSIGVnum() != NULL) // else if (ITEM_UNIQUE == item->GetType() && 0 != item->GetSIGVnum()) diff --git a/src/game/item.cpp b/src/game/item.cpp index e337444..6d8fe76 100644 --- a/src/game/item.cpp +++ b/src/game/item.cpp @@ -535,6 +535,8 @@ int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell) } else if (GetType() == ITEM_BELT) return WEAR_BELT; + else if (GetType() == ITEM_TOTEM) + return WEAR_TALISMAN; else if (GetWearFlag() & WEARABLE_BODY) return WEAR_BODY; else if (GetWearFlag() & WEARABLE_HEAD)