Jump to content

XeXe

Member
  • Posts

    8
  • Joined

  • Last visited

  • Feedback

    0%

2 Followers

About XeXe

Informations

  • Gender
    Male
  • Country
    Germany
  • Nationality
    German

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

XeXe's Achievements

Apprentice

Apprentice (3/16)

  • Reacting Well
  • One Month Later
  • Week One Done
  • Dedicated
  • First Post

Recent Badges

25

Reputation

  1. Its already fixed. But yes it was a mistake in char.cpp with the GetPart function. But thanks.
  2. Since no one has contacted me in the Q&A section regarding this, I am now offering payment for the 2 fixes. Problem 1: Problem 2: I can be reached exclusively in this forum here (Metin2.dev). Regards
  3. Good evening, Since I have installed the TP display in the ui target, this spins a little with the alignment. The first time I target another player, it is misaligned. Then I click again on this player, it aligns correctly. GIF: [Hidden Content] What could be the reason for this? Does anyone have a solution or an approach? PS: I have attached my uiTarget without the system (with which the problem does not exist), and the HowTo for the uiTarget with the system, which causes the problem. Maybe someone can paste me the part so that the position should fit. Would be cool. PS2: The error does not occur with monsters. This only happens with players. PS3: I have already removed the green button from the Hide System. It is not because of him. It is definitely the decimal display. LG. uiTarget.py: [Hidden Content] uiTarget_HowTo_Decimalbar: [Hidden Content] uiTarget with the System and the Problem: [Hidden Content]
  4. Good day, I have installed the weapon costume from Martysama and now have the following problem: As soon as I wear a weapon costume it twitches/spikes 2-3x as soon as I log in again, teleport or e.g. descend from the mount. GIF (click here) I noticed that this only happens when I wear an armor costume or a hairstyle. It sort of goes through them before it stands still. Does anyone know how I can fix this? Kind regards.
  5. Good afternoon, I have currently noticed that I have problems which are triggered by the offlineshop. As soon as an offline store exists (is created, is in Map1 or whatever), the client constantly closes during actions such as; Teleport via quest (warpring), change character, edit offline store name etc and other actions. This happens ONLY when an offlineshop exists. As long as no offlineshop exists, there are none of these client crashes. I've been doing some work on the source lately (all noted) and unfortunately I only noticed this now when I opened a store again. Maybe even you are still active @ Ikarus_ ? (Yes, I am a buyer) The Client Syserr is empty. The Ch1 Syserr as well as the Syslog from Ch1 and DB say something. Maybe someone can help me through this (see attachment). I thank you for any message. Kind regards Syslog (db): [Hidden Content] Syslog (ch1): [Hidden Content] Syserr (ch1): [Hidden Content]
  6. Good day I currently have 2 problems since I installed the weapon costume system. (Weapon costume system from MartySama) Here times a GIF: click the gif The explanation is quite simple. Namely, previously all 3 weapon shinnings (blue) went into the left side of the window, and 2 armor shinnings (yellow) + one special shining (orange), went into the right side of the slots.Since the installation of the weapon costume system, the special shining is no longer visible in any slot. The 3rd weapon shining is now on the wrong side of the armor, and the bottom slot of the weapon shining is empty. In addition, the taking on and off of the one weapon shining is a bit spackly since then. It can't be hovered over properly (only sometimes). The 2nd problem is that when teleporting, logging in or similar, the weapon costume constantly 2-3x spacks around and virtually twitches. In addition, another gif: click the gif By the way, I could mention that the weapon shhinings are not displayed by the weapon costume. Maybe someone here has a tip. In the file attachments I upload the files I think I need. If something is missing, please let me know. Kind regards. costumewindow.py import uiScriptLocale import item COSTUME_START_INDEX = item.COSTUME_SLOT_START SHINING_START_INDEX = item.SHINING_SLOT_START window = { "name" : "CostumeWindow", "x" : SCREEN_WIDTH - 175 - 140, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 140, "height" : 290, "children" : ( { "name" : "board", "type" : "board_with_titlebar", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 140, "height" : 290, "title" : uiScriptLocale.COSTUME_WINDOW_TITLE, "children" : ( ## Equipment Slot { "name" : "Costume_Base", "type" : "image", "x" : 13, "y" : 38, "image" : uiScriptLocale.LOCALE_UISCRIPT_PATH + "costume/costume_bg.jpg", "children" : ( { "name" : "Costume_Page", "type" : "window", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 127, "height" : 230, "children" : ( { "name" : "CostumeSlot", "type" : "slot", "x" : 0, "y" : 0, "width" : 127, "height" : 230, "slot" : ( {"index":COSTUME_START_INDEX+0, "x":65, "y":47, "width":32, "height":64}, {"index":COSTUME_START_INDEX+1, "x":65, "y":10, "width":32, "height":32}, {"index":COSTUME_START_INDEX+2, "x":5, "y":145, "width":32, "height":32}, {"index":COSTUME_START_INDEX+5, "x":17, "y":15, "width":32, "height":96}, #Waffe {"index":SHINING_START_INDEX+0, "x":16, "y":189, "width":32, "height":32}, {"index":SHINING_START_INDEX+1, "x":16, "y":156, "width":32, "height":32}, {"index":SHINING_START_INDEX+2, "x":16, "y":123, "width":32, "height":32}, #Armor {"index":SHINING_START_INDEX+3, "x":65, "y":189, "width":32, "height":32}, {"index":SHINING_START_INDEX+4, "x":65, "y":156, "width":32, "height":32}, #Special {"index":SHINING_START_INDEX+5, "x":65, "y":123, "width":32, "height":32}, ), }, ), }, ), }, ), }, ), } ItemData.h #pragma once // NOTE : Item의 통합 관리 클래스다. // Icon, Model (droped on ground), Game Data #include "../eterLib/GrpSubImage.h" #include "../eterGrnLib/Thing.h" class CItemData { public: enum { ITEM_NAME_MAX_LEN = 24, ITEM_LIMIT_MAX_NUM = 2, ITEM_VALUES_MAX_NUM = 6, ITEM_SMALL_DESCR_MAX_LEN = 256, ITEM_APPLY_MAX_NUM = 3, ITEM_SOCKET_MAX_NUM = 3, #ifdef ENABLE_SHINING_SYSTEM_2 ITEM_SHINING_MAX_COUNT = 3, #endif }; enum EItemType { ITEM_TYPE_NONE, //0 ITEM_TYPE_WEAPON, //1//무기 ITEM_TYPE_ARMOR, //2//갑옷 ITEM_TYPE_USE, //3//아이템 사용 ITEM_TYPE_AUTOUSE, //4 ITEM_TYPE_MATERIAL, //5 ITEM_TYPE_SPECIAL, //6 //스페셜 아이템 ITEM_TYPE_TOOL, //7 ITEM_TYPE_LOTTERY, //8//복권 ITEM_TYPE_ELK, //9//돈 ITEM_TYPE_METIN, //10 ITEM_TYPE_CONTAINER, //11 ITEM_TYPE_FISH, //12//낚시 ITEM_TYPE_ROD, //13 ITEM_TYPE_RESOURCE, //14 ITEM_TYPE_CAMPFIRE, //15 ITEM_TYPE_UNIQUE, //16 ITEM_TYPE_SKILLBOOK, //17 ITEM_TYPE_QUEST, //18 ITEM_TYPE_POLYMORPH, //19 ITEM_TYPE_TREASURE_BOX, //20//보물상자 ITEM_TYPE_TREASURE_KEY, //21//보물상자 열쇠 ITEM_TYPE_SKILLFORGET, //22 ITEM_TYPE_GIFTBOX, //23 ITEM_TYPE_PICK, //24 ITEM_TYPE_HAIR, //25//머리 ITEM_TYPE_TOTEM, //26//토템 ITEM_TYPE_BLEND, //27//생성될때 랜덤하게 속성이 붙는 약물 ITEM_TYPE_COSTUME, //28//코스츔 아이템 (2011년 8월 추가된 코스츔 시스템용 아이템) ITEM_TYPE_DS, //29 //용혼석 ITEM_TYPE_SPECIAL_DS, //30 // 특수한 용혼석 (DS_SLOT에 착용하는 UNIQUE 아이템이라 생각하면 됨) ITEM_TYPE_EXTRACT, //31 추출도구. ITEM_TYPE_SECONDARY_COIN, //32 명도전. ITEM_TYPE_RING, //33 반지 (유니크 슬롯이 아닌 순수 반지 슬롯) ITEM_TYPE_BELT, //34 벨트 #ifdef ENABLE_SHINING_SYSTEM ITEM_TYPE_SHINING, //35 #endif ITEM_TYPE_MAX_NUM, }; enum EWeaponSubTypes { WEAPON_SWORD, WEAPON_DAGGER, //이도류 WEAPON_BOW, WEAPON_TWO_HANDED, WEAPON_BELL, WEAPON_FAN, WEAPON_ARROW, WEAPON_NUM_TYPES, WEAPON_NONE = WEAPON_NUM_TYPES+1, }; enum EMaterialSubTypes { MATERIAL_LEATHER, MATERIAL_BLOOD, MATERIAL_ROOT, MATERIAL_NEEDLE, MATERIAL_JEWEL, MATERIAL_DS_REFINE_NORMAL, MATERIAL_DS_REFINE_BLESSED, MATERIAL_DS_REFINE_HOLLY, }; enum EArmorSubTypes { ARMOR_BODY, ARMOR_HEAD, ARMOR_SHIELD, ARMOR_WRIST, ARMOR_FOOTS, ARMOR_NECK, ARMOR_EAR, ARMOR_NUM_TYPES }; enum ECostumeSubTypes { COSTUME_BODY, //0 갑옷(main look) COSTUME_HAIR, //1 헤어(탈착가능) #ifdef ENABLE_WEAPON_COSTUME_SYSTEM COSTUME_WEAPON = 4, //4 #endif COSTUME_NUM_TYPES, }; enum EUseSubTypes { USE_POTION, // 0 USE_TALISMAN, USE_TUNING, USE_MOVE, USE_TREASURE_BOX, USE_MONEYBAG, USE_BAIT, USE_ABILITY_UP, USE_AFFECT, USE_CREATE_STONE, USE_SPECIAL, // 10 USE_POTION_NODELAY, USE_CLEAR, USE_INVISIBILITY, USE_DETACHMENT, USE_BUCKET, USE_POTION_CONTINUE, USE_CLEAN_SOCKET, USE_CHANGE_ATTRIBUTE, USE_ADD_ATTRIBUTE, USE_ADD_ACCESSORY_SOCKET, // 20 USE_PUT_INTO_ACCESSORY_SOCKET, USE_ADD_ATTRIBUTE2, USE_RECIPE, USE_CHANGE_ATTRIBUTE2, USE_BIND, USE_UNBIND, USE_TIME_CHARGE_PER, USE_TIME_CHARGE_FIX, // 28 USE_PUT_INTO_BELT_SOCKET, // 29 벨트 소켓에 사용할 수 있는 아이템 USE_PUT_INTO_RING_SOCKET, // 30 반지 소켓에 사용할 수 있는 아이템 (유니크 반지 말고, 새로 추가된 반지 슬롯) #ifdef ENABLE_BUFF_SYSTEM USE_BUFF, USE_UPGRADE_BUFF, #endif }; enum EDragonSoulSubType { DS_SLOT1, DS_SLOT2, DS_SLOT3, DS_SLOT4, DS_SLOT5, DS_SLOT6, DS_SLOT_NUM_TYPES = 6, }; enum EMetinSubTypes { METIN_NORMAL, METIN_GOLD, }; #ifdef ENABLE_SHINING_SYSTEM enum EShiningSubTypes { SHINING_WEAPON, SHINING_ARMOR, SHINING_SPECIAL, //Special like GM Logo or somethings }; #endif enum ELimitTypes { LIMIT_NONE, LIMIT_LEVEL, LIMIT_STR, LIMIT_DEX, LIMIT_INT, LIMIT_CON, LIMIT_REAL_TIME = 7, LIMIT_REAL_TIME_START_FIRST_USE, LIMIT_TIMER_BASED_ON_WEAR, LIMIT_MAX_NUM }; enum EItemAntiFlag { ITEM_ANTIFLAG_FEMALE = (1 << 0), // 여성 사용 불가 ITEM_ANTIFLAG_MALE = (1 << 1), // 남성 사용 불가 ITEM_ANTIFLAG_WARRIOR = (1 << 2), // 무사 사용 불가 ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // 자객 사용 불가 ITEM_ANTIFLAG_SURA = (1 << 4), // 수라 사용 불가 ITEM_ANTIFLAG_SHAMAN = (1 << 5), // 무당 사용 불가 ITEM_ANTIFLAG_GET = (1 << 6), // 집을 수 없음 ITEM_ANTIFLAG_DROP = (1 << 7), // 버릴 수 없음 ITEM_ANTIFLAG_SELL = (1 << 8), // 팔 수 없음 ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A 제국 사용 불가 ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B 제국 사용 불가 ITEM_ANTIFLAG_EMPIRE_R = (1 << 11), // C 제국 사용 불가 ITEM_ANTIFLAG_SAVE = (1 << 12), // 저장되지 않음 ITEM_ANTIFLAG_GIVE = (1 << 13), // 거래 불가 ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK시 떨어지지 않음 ITEM_ANTIFLAG_STACK = (1 << 15), // 합칠 수 없음 ITEM_ANTIFLAG_MYSHOP = (1 << 16), // 개인 상점에 올릴 수 없음 ITEM_ANTIFLAG_SAFEBOX = (1 << 17), }; enum EItemFlag { ITEM_FLAG_REFINEABLE = (1 << 0), // 개량 가능 ITEM_FLAG_SAVE = (1 << 1), ITEM_FLAG_STACKABLE = (1 << 2), // 여러개 합칠 수 있음 ITEM_FLAG_COUNT_PER_1GOLD = (1 << 3), // 가격이 개수 / 가격으로 변함 ITEM_FLAG_SLOW_QUERY = (1 << 4), // 게임 종료시에만 SQL에 쿼리함 ITEM_FLAG_RARE = (1 << 5), ITEM_FLAG_UNIQUE = (1 << 6), ITEM_FLAG_MAKECOUNT = (1 << 7), ITEM_FLAG_IRREMOVABLE = (1 << 8), ITEM_FLAG_CONFIRM_WHEN_USE = (1 << 9), ITEM_FLAG_QUEST_USE = (1 << 10), // 퀘스트 스크립트 돌리는지? ITEM_FLAG_QUEST_USE_MULTIPLE= (1 << 11), // 퀘스트 스크립트 돌리는지? ITEM_FLAG_UNUSED03 = (1 << 12), // UNUSED03 ITEM_FLAG_LOG = (1 << 13), // 사용시 로그를 남기는 아이템인가? ITEM_FLAG_APPLICABLE = (1 << 14), }; enum EWearPositions { WEAR_BODY, // 0 WEAR_HEAD, // 1 WEAR_FOOTS, // 2 WEAR_WRIST, // 3 WEAR_WEAPON, // 4 WEAR_NECK, // 5 WEAR_EAR, // 6 WEAR_UNIQUE1, // 7 WEAR_UNIQUE2, // 8 WEAR_ARROW, // 9 WEAR_SHIELD, // 10 WEAR_ABILITY1, // 11 WEAR_ABILITY2, // 12 WEAR_ABILITY3, // 13 WEAR_ABILITY4, // 14 WEAR_ABILITY5, // 15 WEAR_ABILITY6, // 16 WEAR_ABILITY7, // 17 WEAR_ABILITY8, // 18 WEAR_COSTUME_BODY, // 19 WEAR_COSTUME_HAIR, // 20 WEAR_RING1, // 21 : 신규 반지슬롯1 (왼쪽) WEAR_RING2, // 22 : 신규 반지슬롯2 (오른쪽) WEAR_BELT, // 23 : 신규 벨트슬롯 #ifdef ENABLE_WEAPON_COSTUME_SYSTEM WEAR_COSTUME_WEAPON, // 24 #endif #ifdef __ITEM_SHINING__ WEAR_SHINING_WEAPON_1, //25 WEAR_SHINING_WEAPON_2, //26 WEAR_SHINING_WEAPON_3, //27 WEAR_SHINING_ARMOR_1, //28 WEAR_SHINING_ARMOR_2, //29 WEAR_SHINING_SPECIAL, //30 #endif WEAR_MAX_NUM, }; enum EItemWearableFlag { WEARABLE_BODY = (1 << 0), WEARABLE_HEAD = (1 << 1), WEARABLE_FOOTS = (1 << 2), WEARABLE_WRIST = (1 << 3), WEARABLE_WEAPON = (1 << 4), WEARABLE_NECK = (1 << 5), WEARABLE_EAR = (1 << 6), WEARABLE_UNIQUE = (1 << 7), WEARABLE_SHIELD = (1 << 8), WEARABLE_ARROW = (1 << 9), }; enum EApplyTypes { APPLY_NONE, // 0 APPLY_MAX_HP, // 1 APPLY_MAX_SP, // 2 APPLY_CON, // 3 APPLY_INT, // 4 APPLY_STR, // 5 APPLY_DEX, // 6 APPLY_ATT_SPEED, // 7 APPLY_MOV_SPEED, // 8 APPLY_CAST_SPEED, // 9 APPLY_HP_REGEN, // 10 APPLY_SP_REGEN, // 11 APPLY_POISON_PCT, // 12 APPLY_STUN_PCT, // 13 APPLY_SLOW_PCT, // 14 APPLY_CRITICAL_PCT, // 15 APPLY_PENETRATE_PCT, // 16 APPLY_ATTBONUS_HUMAN, // 17 APPLY_ATTBONUS_ANIMAL, // 18 APPLY_ATTBONUS_ORC, // 19 APPLY_ATTBONUS_MILGYO, // 20 APPLY_ATTBONUS_UNDEAD, // 21 APPLY_ATTBONUS_DEVIL, // 22 APPLY_STEAL_HP, // 23 APPLY_STEAL_SP, // 24 APPLY_MANA_BURN_PCT, // 25 APPLY_DAMAGE_SP_RECOVER, // 26 APPLY_BLOCK, // 27 APPLY_DODGE, // 28 APPLY_RESIST_SWORD, // 29 APPLY_RESIST_TWOHAND, // 30 APPLY_RESIST_DAGGER, // 31 APPLY_RESIST_BELL, // 32 APPLY_RESIST_FAN, // 33 APPLY_RESIST_BOW, // 34 APPLY_RESIST_FIRE, // 35 APPLY_RESIST_ELEC, // 36 APPLY_RESIST_MAGIC, // 37 APPLY_RESIST_WIND, // 38 APPLY_REFLECT_MELEE, // 39 APPLY_REFLECT_CURSE, // 40 APPLY_POISON_REDUCE, // 41 APPLY_KILL_SP_RECOVER, // 42 APPLY_EXP_DOUBLE_BONUS, // 43 APPLY_GOLD_DOUBLE_BONUS, // 44 APPLY_ITEM_DROP_BONUS, // 45 APPLY_POTION_BONUS, // 46 APPLY_KILL_HP_RECOVER, // 47 APPLY_IMMUNE_STUN, // 48 APPLY_IMMUNE_SLOW, // 49 APPLY_IMMUNE_FALL, // 50 APPLY_SKILL, // 51 APPLY_BOW_DISTANCE, // 52 APPLY_ATT_GRADE_BONUS, // 53 APPLY_DEF_GRADE_BONUS, // 54 APPLY_MAGIC_ATT_GRADE, // 55 APPLY_MAGIC_DEF_GRADE, // 56 APPLY_CURSE_PCT, // 57 APPLY_MAX_STAMINA, // 58 APPLY_ATT_BONUS_TO_WARRIOR, // 59 APPLY_ATT_BONUS_TO_ASSASSIN,// 60 APPLY_ATT_BONUS_TO_SURA, // 61 APPLY_ATT_BONUS_TO_SHAMAN, // 62 APPLY_ATT_BONUS_TO_MONSTER, // 63 APPLY_MALL_ATTBONUS, // 64 공격력 +x% APPLY_MALL_DEFBONUS, // 65 방어력 +x% APPLY_MALL_EXPBONUS, // 66 경험치 +x% APPLY_MALL_ITEMBONUS, // 67 아이템 드롭율 x/10배 APPLY_MALL_GOLDBONUS, // 68 돈 드롭율 x/10배 APPLY_MAX_HP_PCT, // 69 최대 생명력 +x% APPLY_MAX_SP_PCT, // 70 최대 정신력 +x% APPLY_SKILL_DAMAGE_BONUS, // 71 스킬 데미지 * (100+x)% APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 평타 데미지 * (100+x)% APPLY_SKILL_DEFEND_BONUS, // 73 스킬 데미지 방어 * (100-x)% APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 평타 데미지 방어 * (100-x)% APPLY_EXTRACT_HP_PCT, //75 APPLY_PC_BANG_EXP_BONUS, //76 APPLY_PC_BANG_DROP_BONUS, //77 APPLY_RESIST_WARRIOR, //78 APPLY_RESIST_ASSASSIN , //79 APPLY_RESIST_SURA, //80 APPLY_RESIST_SHAMAN, //81 APPLY_ENERGY, //82 APPLY_DEF_GRADE, // 83 방어력. DEF_GRADE_BONUS는 클라에서 두배로 보여지는 의도된 버그(...)가 있다. APPLY_COSTUME_ATTR_BONUS, // 84 코스튬 아이템에 붙은 속성치 보너스 APPLY_MAGIC_ATTBONUS_PER, // 85 마법 공격력 +x% APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 마법 + 밀리 공격력 +x% APPLY_RESIST_ICE, // 87 냉기 저항 APPLY_RESIST_EARTH, // 88 대지 저항 APPLY_RESIST_DARK, // 89 어둠 저항 APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항 APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항 MAX_APPLY_NUM, // }; enum EImmuneFlags { IMMUNE_PARA = (1 << 0), IMMUNE_CURSE = (1 << 1), IMMUNE_STUN = (1 << 2), IMMUNE_SLEEP = (1 << 3), IMMUNE_SLOW = (1 << 4), IMMUNE_POISON = (1 << 5), IMMUNE_TERROR = (1 << 6), }; #pragma pack(push) #pragma pack(1) typedef struct SItemLimit { BYTE bType; long lValue; } TItemLimit; typedef struct SItemApply { BYTE bType; long lValue; } TItemApply; typedef struct SItemTable { DWORD dwVnum; DWORD dwVnumRange; char szName[ITEM_NAME_MAX_LEN + 1]; #ifdef ENABLE_MULTI_LANGUAGE_PACK_ITEM char szLocaleName[5][ITEM_NAME_MAX_LEN + 1]; #else char szLocaleName[ITEM_NAME_MAX_LEN + 1]; #endif BYTE bType; BYTE bSubType; BYTE bWeight; BYTE bSize; DWORD dwAntiFlags; DWORD dwFlags; DWORD dwWearFlags; DWORD dwImmuneFlag; DWORD dwIBuyItemPrice; DWORD dwISellItemPrice; TItemLimit aLimits[ITEM_LIMIT_MAX_NUM]; TItemApply aApplies[ITEM_APPLY_MAX_NUM]; long alValues[ITEM_VALUES_MAX_NUM]; long alSockets[ITEM_SOCKET_MAX_NUM]; DWORD dwRefinedVnum; WORD wRefineSet; BYTE bAlterToMagicItemPct; BYTE bSpecular; BYTE bGainSocketPct; } TItemTable; // typedef struct SItemTable // { // DWORD dwVnum; // char szItemName[ITEM_NAME_MAX_LEN + 1]; // BYTE bType; // BYTE bSubType; // BYTE bSize; // DWORD dwAntiFlags; // DWORD dwFlags; // DWORD dwWearFlags; // DWORD dwIBuyItemPrice; // DWORD dwISellItemPrice; // TItemLimit aLimits[ITEM_LIMIT_MAX_NUM]; // TItemApply aApplies[ITEM_APPLY_MAX_NUM]; // long alValues[ITEM_VALUES_MAX_NUM]; // long alSockets[ITEM_SOCKET_MAX_NUM]; // DWORD dwRefinedVnum; // BYTE bSpecular; // DWORD dwIconNumber; // } TItemTable; #pragma pack(pop) public: CItemData(); virtual ~CItemData(); void Clear(); void SetSummary(const std::string& c_rstSumm); void SetDescription(const std::string& c_rstDesc); CGraphicThing * GetModelThing(); CGraphicThing * GetSubModelThing(); CGraphicThing * GetDropModelThing(); CGraphicSubImage * GetIconImage(); #ifdef ENABLE_LOD_MODELS DWORD GetLODModelThingCount(); BOOL GetLODModelThingPointer(DWORD dwIndex, CGraphicThing ** ppModelThing); #endif DWORD GetAttachingDataCount(); BOOL GetCollisionDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData); BOOL GetAttachingDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData); ///// const TItemTable* GetTable() const; DWORD GetIndex() const; const char * GetName() const; const char * GetDescription() const; const char * GetSummary() const; BYTE GetType() const; BYTE GetSubType() const; UINT GetRefine() const; const char* GetUseTypeString() const; DWORD GetWeaponType() const; BYTE GetSize() const; BOOL IsAntiFlag(DWORD dwFlag) const; BOOL IsFlag(DWORD dwFlag) const; BOOL IsWearableFlag(DWORD dwFlag) const; BOOL HasNextGrade() const; DWORD GetWearFlags() const; DWORD GetIBuyItemPrice() const; DWORD GetISellItemPrice() const; BOOL GetLimit(BYTE byIndex, TItemLimit * pItemLimit) const; BOOL GetApply(BYTE byIndex, TItemApply * pItemApply) const; long GetValue(BYTE byIndex) const; long GetSocket(BYTE byIndex) const; long SetSocket(BYTE byIndex,DWORD value); int GetSocketCount() const; DWORD GetIconNumber() const; UINT GetSpecularPoweru() const; float GetSpecularPowerf() const; ///// BOOL IsEquipment() const; ///// //BOOL LoadItemData(const char * c_szFileName); void SetDefaultItemData(const char * c_szIconFileName, const char * c_szModelFileName = NULL); void SetItemTableData(TItemTable * pItemTable); #ifdef ENABLE_SHINING_SYSTEM_2 struct TItemShiningTable { char szShinings[ITEM_SHINING_MAX_COUNT][256]; public: bool Any() const { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(szShinings[i], "")) { return true; } } return false; } }; void SetItemShiningTableData(BYTE bIndex, const char* szEffectname); CItemData::TItemShiningTable GetItemShiningTable() { return m_ItemShiningTable; } #endif protected: void __LoadFiles(); void __SetIconImage(const char * c_szFileName); protected: std::string m_strModelFileName; std::string m_strSubModelFileName; std::string m_strDropModelFileName; std::string m_strIconFileName; std::string m_strDescription; std::string m_strSummary; std::vector<std::string> m_strLODModelFileNameVector; CGraphicThing * m_pModelThing; CGraphicThing * m_pSubModelThing; CGraphicThing * m_pDropModelThing; CGraphicSubImage * m_pIconImage; std::vector<CGraphicThing *> m_pLODModelThingVector; NRaceData::TAttachingDataVector m_AttachingDataVector; DWORD m_dwVnum; TItemTable m_ItemTable; #ifdef ENABLE_SHINING_SYSTEM_2 TItemShiningTable m_ItemShiningTable; #endif public: static void DestroySystem(); static CItemData* New(); static void Delete(CItemData* pkItemData); static CDynamicPool<CItemData> ms_kPool; }; GameTyp.h #pragma once #include "../GameLib/ItemData.h" struct SAffects { enum { AFFECT_MAX_NUM = 32, }; SAffects() : dwAffects(0) {} SAffects(const DWORD & c_rAffects) { __SetAffects(c_rAffects); } int operator = (const DWORD & c_rAffects) { __SetAffects(c_rAffects); } BOOL IsAffect(BYTE byIndex) { return dwAffects & (1 << byIndex); } void __SetAffects(const DWORD & c_rAffects) { dwAffects = c_rAffects; } DWORD dwAffects; }; extern std::string g_strGuildSymbolPathName; const DWORD c_Name_Max_Length = 64; const DWORD c_FileName_Max_Length = 128; const DWORD c_Short_Name_Max_Length = 32; const DWORD c_Inventory_Page_Size = 5*9; // x*y const DWORD c_Inventory_Page_Count = 4; const DWORD c_ItemSlot_Count = c_Inventory_Page_Size * c_Inventory_Page_Count; const DWORD c_Equipment_Count = 12; const DWORD c_Equipment_Start = c_ItemSlot_Count; const DWORD c_Equipment_Body = c_Equipment_Start + 0; const DWORD c_Equipment_Head = c_Equipment_Start + 1; const DWORD c_Equipment_Shoes = c_Equipment_Start + 2; const DWORD c_Equipment_Wrist = c_Equipment_Start + 3; const DWORD c_Equipment_Weapon = c_Equipment_Start + 4; const DWORD c_Equipment_Neck = c_Equipment_Start + 5; const DWORD c_Equipment_Ear = c_Equipment_Start + 6; const DWORD c_Equipment_Unique1 = c_Equipment_Start + 7; const DWORD c_Equipment_Unique2 = c_Equipment_Start + 8; const DWORD c_Equipment_Arrow = c_Equipment_Start + 9; const DWORD c_Equipment_Shield = c_Equipment_Start + 10; // 새로 추가된 신규 반지 & 벨트 // 장착형 아이템에 할당할 수 있는 위치가 기존 장비, 채기랍 퀘스트 보상, 코스튬 시스템 등으로 인해서 공간이 잘려있다. // 이게 다 채기랍 보상 버프를 장착아이템처럼 구현한 ㅅㄲ 때문에 난리났따... ㅆㅂ // // 정리하면, 기존 장비창들은 서버DB상 아이템 포지션이 90 ~ 102 이고, // 2013년 초에 새로 추가되는 슬롯들은 111 ~ 부터 시작한다. 착용 장비에서 최대로 사용할 수 있는 값은 121 까지이고, 122부터는 용혼석에서 사용한다. #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM const DWORD c_New_Equipment_Start = c_Equipment_Start + 21; const DWORD c_New_Equipment_Count = 3; const DWORD c_Equipment_Ring1 = c_New_Equipment_Start + 0; const DWORD c_Equipment_Ring2 = c_New_Equipment_Start + 1; const DWORD c_Equipment_Belt = c_New_Equipment_Start + 2;; #endif #ifdef ENABLE_SKILL_COLOR_SYSTEM enum ESkillColorLength { MAX_SKILL_COUNT = 6, MAX_EFFECT_COUNT = 5, BUFF_BEGIN = MAX_SKILL_COUNT, MAX_BUFF_COUNT = 5, }; #endif enum EDragonSoulDeckType { DS_DECK_1, DS_DECK_2, DS_DECK_MAX_NUM = 2, }; enum EDragonSoulGradeTypes { DRAGON_SOUL_GRADE_NORMAL, DRAGON_SOUL_GRADE_BRILLIANT, DRAGON_SOUL_GRADE_RARE, DRAGON_SOUL_GRADE_ANCIENT, DRAGON_SOUL_GRADE_LEGENDARY, DRAGON_SOUL_GRADE_MAX, }; enum EDragonSoulStepTypes { DRAGON_SOUL_STEP_LOWEST, DRAGON_SOUL_STEP_LOW, DRAGON_SOUL_STEP_MID, DRAGON_SOUL_STEP_HIGH, DRAGON_SOUL_STEP_HIGHEST, DRAGON_SOUL_STEP_MAX, }; #ifdef ENABLE_COSTUME_SYSTEM const DWORD c_Costume_Slot_Start = c_Equipment_Start + 19; // [주의] 숫자(19) 하드코딩 주의. 현재 서버에서 코스츔 슬롯은 19부터임. 서버 common/length.h 파일의 EWearPositions 열거형 참고. const DWORD c_Costume_Slot_Body = c_Costume_Slot_Start + 0; const DWORD c_Costume_Slot_Hair = c_Costume_Slot_Start + 1; #ifdef ENABLE_WEAPON_COSTUME_SYSTEM const DWORD c_Costume_Slot_Weapon = c_Costume_Slot_Start + 5; // 24 #endif const DWORD c_Costume_Slot_Count = 6; const DWORD c_Costume_Slot_End = c_Costume_Slot_Start + c_Costume_Slot_Count; #endif #ifdef ENABLE_SHINING_SYSTEM const DWORD c_New_Equipment_End = c_New_Equipment_Start + c_New_Equipment_Count; const DWORD c_Shining_Slot_Start = c_New_Equipment_End; const DWORD c_Shining_Slot_Count = 6; const DWORD c_Shining_Slot_End = c_Shining_Slot_Start + c_Shining_Slot_Count; #endif // [주의] 숫자(32) 하드코딩 주의. 현재 서버에서 용혼석 슬롯은 32부터임. // 서버 common/length.h 파일의 EWearPositions 열거형이 32까지 확장될 것을 염두하고(32 이상은 확장 하기 힘들게 되어있음.), // 그 이후부터를 용혼석 장착 슬롯으로 사용. const DWORD c_Wear_Max = 32; const DWORD c_DragonSoul_Equip_Start = c_ItemSlot_Count + c_Wear_Max; const DWORD c_DragonSoul_Equip_Slot_Max = 6; const DWORD c_DragonSoul_Equip_End = c_DragonSoul_Equip_Start + c_DragonSoul_Equip_Slot_Max * DS_DECK_MAX_NUM; // NOTE: 2013년 2월 5일 현재... 용혼석 데크는 2개가 존재하는데, 향후 확장 가능성이 있어서 3개 데크 여유분을 할당 해 둠. 그 뒤 공간은 벨트 인벤토리로 사용 const DWORD c_DragonSoul_Equip_Reserved_Count = c_DragonSoul_Equip_Slot_Max * 3; #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM // 벨트 아이템이 제공하는 인벤토리 const DWORD c_Belt_Inventory_Slot_Start = c_DragonSoul_Equip_End + c_DragonSoul_Equip_Reserved_Count; const DWORD c_Belt_Inventory_Width = 4; const DWORD c_Belt_Inventory_Height = 4; const DWORD c_Belt_Inventory_Slot_Count = c_Belt_Inventory_Width * c_Belt_Inventory_Height; const DWORD c_Belt_Inventory_Slot_End = c_Belt_Inventory_Slot_Start + c_Belt_Inventory_Slot_Count; #endif #ifdef ENABLE_SPECIAL_INVENTORY enum ESpecialInventoryTypes { INVENTORY_TYPE_INVENTORY, INVENTORY_TYPE_SKILLBOOK, INVENTORY_TYPE_STONE, INVENTORY_TYPE_MATERIAL, INVENTORY_TYPE_COUNT, }; enum ESpecialInventorySize { SPECIAL_INVENTORY_WIDTH = 5, SPECIAL_INVENTORY_HEIGHT = 9, SPECIAL_INVENTORY_PAGE_SIZE = SPECIAL_INVENTORY_WIDTH * SPECIAL_INVENTORY_HEIGHT, }; #endif #if defined(ENABLE_NEW_EQUIPMENT_SYSTEM) && defined(ENABLE_SPECIAL_INVENTORY) const DWORD c_Special_Inventory_Slot_Start = c_Belt_Inventory_Slot_End; const DWORD c_Special_Inventory_Skillbook_Slot_Start = c_Special_Inventory_Slot_Start; const DWORD c_Special_Inventory_Skillbook_Slot_End = c_Special_Inventory_Skillbook_Slot_Start + SPECIAL_INVENTORY_PAGE_SIZE * c_Inventory_Page_Count; const DWORD c_Special_Inventory_Stone_Slot_Start = c_Special_Inventory_Skillbook_Slot_End; const DWORD c_Special_Inventory_Stone_Slot_End = c_Special_Inventory_Stone_Slot_Start + SPECIAL_INVENTORY_PAGE_SIZE * c_Inventory_Page_Count; const DWORD c_Special_Inventory_Material_Slot_Start = c_Special_Inventory_Stone_Slot_End; const DWORD c_Special_Inventory_Material_Slot_End = c_Special_Inventory_Material_Slot_Start + SPECIAL_INVENTORY_PAGE_SIZE * c_Inventory_Page_Count; const DWORD c_Special_Inventory_Slot_End = c_Special_Inventory_Material_Slot_End; const DWORD c_Inventory_Count = c_Special_Inventory_Slot_End; #elif defined(ENABLE_NEW_EQUIPMENT_SYSTEM) const DWORD c_Inventory_Count = c_Belt_Inventory_Slot_End; #else const DWORD c_Inventory_Count = c_DragonSoul_Inventory_End; #endif // 용혼석 전용 인벤토리 const DWORD c_DragonSoul_Inventory_Start = 0; const DWORD c_DragonSoul_Inventory_Box_Size = 32; const DWORD c_DragonSoul_Inventory_Count = CItemData::DS_SLOT_NUM_TYPES * DRAGON_SOUL_GRADE_MAX * c_DragonSoul_Inventory_Box_Size; const DWORD c_DragonSoul_Inventory_End = c_DragonSoul_Inventory_Start + c_DragonSoul_Inventory_Count; enum ESlotType { SLOT_TYPE_NONE, SLOT_TYPE_INVENTORY, SLOT_TYPE_SKILL, SLOT_TYPE_EMOTION, SLOT_TYPE_SHOP, SLOT_TYPE_EXCHANGE_OWNER, SLOT_TYPE_EXCHANGE_TARGET, SLOT_TYPE_QUICK_SLOT, SLOT_TYPE_SAFEBOX, SLOT_TYPE_PRIVATE_SHOP, SLOT_TYPE_MALL, SLOT_TYPE_DRAGON_SOUL_INVENTORY, #ifdef ENABLE_SWITCHBOT SLOT_TYPE_SWITCHBOT, #endif SLOT_TYPE_MAX, }; enum EWindows { RESERVED_WINDOW, INVENTORY, // 기본 인벤토리. (45칸 짜리가 2페이지 존재 = 90칸) EQUIPMENT, SAFEBOX, MALL, DRAGON_SOUL_INVENTORY, BELT_INVENTORY, // NOTE: W2.1 버전에 새로 추가되는 벨트 슬롯 아이템이 제공하는 벨트 인벤토리 GROUND, // NOTE: 2013년 2월5일 현재까지 unused.. 왜 있는거지??? #ifdef ENABLE_SWITCHBOT SWITCHBOT, #endif WINDOW_TYPE_MAX, }; enum EDSInventoryMaxNum { DS_INVENTORY_MAX_NUM = c_DragonSoul_Inventory_Count, DS_REFINE_WINDOW_MAX_NUM = 15, }; #pragma pack (push, 1) #define WORD_MAX 0xffff #ifdef ENABLE_SWITCHBOT enum ESwitchbotValues { SWITCHBOT_SLOT_COUNT = 5, SWITCHBOT_ALTERNATIVE_COUNT = 2, MAX_NORM_ATTR_NUM = 5, }; enum EAttributeSet { ATTRIBUTE_SET_WEAPON, ATTRIBUTE_SET_BODY, ATTRIBUTE_SET_WRIST, ATTRIBUTE_SET_FOOTS, ATTRIBUTE_SET_NECK, ATTRIBUTE_SET_HEAD, ATTRIBUTE_SET_SHIELD, ATTRIBUTE_SET_EAR, ATTRIBUTE_SET_MAX_NUM, }; #endif typedef struct SItemPos { BYTE window_type; WORD cell; SItemPos () { window_type = INVENTORY; cell = WORD_MAX; } SItemPos (BYTE _window_type, WORD _cell) { window_type = _window_type; cell = _cell; } // 기존에 cell의 형을 보면 BYTE가 대부분이지만, oi // 어떤 부분은 int, 어떤 부분은 WORD로 되어있어, // 가장 큰 자료형인 int로 받는다. // int operator=(const int _cell) // { //window_type = INVENTORY; // cell = _cell; // return cell; // } bool IsValidCell() { switch (window_type) { case INVENTORY: return cell < c_Inventory_Count; break; case EQUIPMENT: return cell < c_DragonSoul_Equip_End; break; case DRAGON_SOUL_INVENTORY: return cell < (DS_INVENTORY_MAX_NUM); break; #ifdef ENABLE_SWITCHBOT case SWITCHBOT: return cell < SWITCHBOT_SLOT_COUNT; break; #endif default: return false; } } bool IsEquipCell() { switch (window_type) { case INVENTORY: case EQUIPMENT: return (c_Equipment_Start + c_Wear_Max > cell) && (c_Equipment_Start <= cell); break; case BELT_INVENTORY: case DRAGON_SOUL_INVENTORY: return false; break; default: return false; } } #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM bool IsBeltInventoryCell() { bool bResult = c_Belt_Inventory_Slot_Start <= cell && c_Belt_Inventory_Slot_End > cell; return bResult; } #endif bool operator==(const struct SItemPos& rhs) const { return (window_type == rhs.window_type) && (cell == rhs.cell); } bool operator<(const struct SItemPos& rhs) const { return (window_type < rhs.window_type) || ((window_type == rhs.window_type) && (cell < rhs.cell)); } } TItemPos; #pragma pack(pop) const DWORD c_QuickBar_Line_Count = 3; const DWORD c_QuickBar_Slot_Count = 12; const float c_Idle_WaitTime = 5.0f; const int c_Monster_Race_Start_Number = 6; const int c_Monster_Model_Start_Number = 20001; const float c_fAttack_Delay_Time = 0.2f; const float c_fHit_Delay_Time = 0.1f; const float c_fCrash_Wave_Time = 0.2f; const float c_fCrash_Wave_Distance = 3.0f; const float c_fHeight_Step_Distance = 50.0f; enum { DISTANCE_TYPE_FOUR_WAY, DISTANCE_TYPE_EIGHT_WAY, DISTANCE_TYPE_ONE_WAY, DISTANCE_TYPE_MAX_NUM, }; const float c_fMagic_Script_Version = 1.0f; const float c_fSkill_Script_Version = 1.0f; const float c_fMagicSoundInformation_Version = 1.0f; const float c_fBattleCommand_Script_Version = 1.0f; const float c_fEmotionCommand_Script_Version = 1.0f; const float c_fActive_Script_Version = 1.0f; const float c_fPassive_Script_Version = 1.0f; // Used by PushMove const float c_fWalkDistance = 175.0f; const float c_fRunDistance = 310.0f; #define FILE_MAX_LEN 128 enum { ITEM_SOCKET_SLOT_MAX_NUM = 3, ITEM_ATTRIBUTE_SLOT_MAX_NUM = 7, ITEM_ATTRIBUTE_SLOT_NORM_NUM = 5, }; #pragma pack(push) #pragma pack(1) typedef struct SQuickSlot { BYTE Type; BYTE Position; } TQuickSlot; typedef struct TPlayerItemAttribute { BYTE bType; short sValue; } TPlayerItemAttribute; typedef struct packet_item { DWORD vnum; BYTE count; DWORD flags; DWORD anti_flags; long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TItemData; typedef struct packet_shop_item { DWORD vnum; DWORD price; BYTE count; BYTE display_pos; long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; } TShopItemData; #pragma pack(pop) inline float GetSqrtDistance(int ix1, int iy1, int ix2, int iy2) // By sqrt { float dx, dy; dx = float(ix1 - ix2); dy = float(iy1 - iy2); return sqrtf(dx*dx + dy*dy); } // DEFAULT_FONT void DefaultFont_Startup(); void DefaultFont_Cleanup(); void DefaultFont_SetName(const char * c_szFontName); CResource* DefaultFont_GetResource(); CResource* DefaultItalicFont_GetResource(); // END_OF_DEFAULT_FONT void SetGuildSymbolPath(const char * c_szPathName); const char * GetGuildSymbolFileName(DWORD dwGuildID); BYTE SlotTypeToInvenType(BYTE bSlotType); BYTE ApplyTypeToPointType(BYTE bApplyType); Length.h #pragma once #define WORD_MAX 0xffff #include "service.h" #ifdef ENABLE_SPECIAL_INVENTORY enum ESpecialInventory { SPECIAL_INVENTORY_TYPE_SKILLBOOK, SPECIAL_INVENTORY_TYPE_STONE, SPECIAL_INVENTORY_TYPE_MATERIAL, SPECIAL_INVENTORY_TYPE_COUNT, SPECIAL_INVENTORY_WIDTH = 5, SPECIAL_INVENTORY_HEIGHT = 9, SPECIAL_INVENTORY_PAGE_SIZE = SPECIAL_INVENTORY_WIDTH * SPECIAL_INVENTORY_HEIGHT, SPECIAL_INVENTORY_SLOT_COUNT = SPECIAL_INVENTORY_PAGE_SIZE * SPECIAL_INVENTORY_TYPE_COUNT, }; #endif enum EMisc { MAX_HOST_LENGTH = 15, IP_ADDRESS_LENGTH = 15, LOGIN_MAX_LEN = 30, PASSWD_MAX_LEN = 16, #ifdef ENABLE_HWID_BAN HWID_MAX_LEN = 64, #endif PLAYER_PER_ACCOUNT = 4, ACCOUNT_STATUS_MAX_LEN = 8, CHARACTER_NAME_MAX_LEN = 24, SHOP_SIGN_MAX_LEN = 32, INVENTORY_MAX_NUM = 180, ABILITY_MAX_NUM = 50, EMPIRE_MAX_NUM = 4, BANWORD_MAX_LEN = 24, SMS_MAX_LEN = 80, MOBILE_MAX_LEN = 32, SOCIAL_ID_MAX_LEN = 18, LANGUAGE_MAX_LEN = 2, LANGUAGE_MAX_NUM = 5, GUILD_NAME_MAX_LEN = 12, SHOP_HOST_ITEM_MAX_NUM = 40, /* 호스트의 최대 아이템 개수 */ SHOP_GUEST_ITEM_MAX_NUM = 18, /* 게스트의 최대 아이템 개수 */ SHOP_PRICELIST_MAX_NUM = 40, ///< 개인상점 가격정보 리스트에서 유지할 가격정보의 최대 갯수 CHAT_MAX_LEN = 512, QUICKSLOT_MAX_NUM = 36, JOURNAL_MAX_NUM = 2, QUERY_MAX_LEN = 8192, FILE_MAX_LEN = 128, PLAYER_EXP_TABLE_MAX = 150, PLAYER_MAX_LEVEL_CONST = 150, GUILD_MAX_LEVEL = 20, MOB_MAX_LEVEL = 100, ATTRIBUTE_MAX_VALUE = 20, CHARACTER_PATH_MAX_NUM = 64, SKILL_MAX_NUM = 255, SKILLBOOK_DELAY_MIN = 64800, SKILLBOOK_DELAY_MAX = 108000, SKILL_MAX_LEVEL = 40, APPLY_NAME_MAX_LEN = 32, EVENT_FLAG_NAME_MAX_LEN = 32, MOB_SKILL_MAX_NUM = 5, POINT_MAX_NUM = 255, DRAGON_SOUL_BOX_SIZE = 32, DRAGON_SOUL_BOX_COLUMN_NUM = 8, DRAGON_SOUL_BOX_ROW_NUM = DRAGON_SOUL_BOX_SIZE / DRAGON_SOUL_BOX_COLUMN_NUM, DRAGON_SOUL_REFINE_GRID_SIZE = 15, MAX_AMOUNT_OF_MALL_BONUS = 20, INVENTORY_PAGE_COUNT = 4, WEAR_MAX_NUM = 32, #ifdef __ENABLE_NEW_OFFLINESHOP__ OFFLINE_SHOP_NAME_MAX_LEN = 40 + CHARACTER_NAME_MAX_LEN +1, OFFLINESHOP_DURATION_MAX_MINUTES = 8* 24 * 60, OFFLINESHOP_MAX_SEARCH_RESULT = 250, OFFLINESHOP_SECONDS_PER_SEARCH = 15, //*new check about auction offers OFFLINESHOP_SECONDS_PER_OFFER = 7, #endif //LIMIT_GOLD GOLD_MAX = 2000000000, MAX_PASSPOD = 8 , #ifdef __TITLE_SYSTEM TITLE_MAX_NUM = 25, TITLE_COLOR_MAX_NUM = 4, // r, g, b, a #endif //END_LIMIT_GOLD OPENID_AUTHKEY_LEN = 32, SHOP_TAB_NAME_MAX = 32, SHOP_TAB_COUNT_MAX = 3, BELT_INVENTORY_SLOT_WIDTH = 4, BELT_INVENTORY_SLOT_HEIGHT= 4, BELT_INVENTORY_SLOT_COUNT = BELT_INVENTORY_SLOT_WIDTH * BELT_INVENTORY_SLOT_HEIGHT, /** **** 현재까지 할당 된 아이템 영역 정리 (DB상 Item Position) **** +------------------------------------------------------+ 0 | 캐릭터 기본 인벤토리 (45칸 * 2페이지) 90칸 | +------------------------------------------------------+ 90 = INVENTORY_MAX_NUM(90) | 캐릭터 장비 창 (착용중인 아이템) 32칸 | +------------------------------------------------------+ 122 = INVENTORY_MAX_NUM(90) + WEAR_MAX_NUM(32) | 용혼석 장비 창 (착용중인 용혼석) 12칸 | +------------------------------------------------------+ 134 = 122 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_MAX_NUM(2) | 용혼석 장비 창 예약 (아직 미사용) 18칸 | +------------------------------------------------------+ 152 = 134 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_RESERVED_MAX_NUM(3) | 벨트 인벤토리 (벨트 착용시에만 벨트 레벨에 따라 활성)| +------------------------------------------------------+ 168 = 152 + BELT_INVENTORY_SLOT_COUNT(16) = INVENTORY_AND_EQUIP_CELL_MAX | 미사용 | +------------------------------------------------------+ ?? */ #ifdef __ENABLE_NEW_OFFLINESHOP__ #ifdef __ENABLE_CHEQUE_SYSTEM__ YANG_PER_CHEQUE = 100000000, #endif #endif }; #ifdef ENABLE_SWITCHBOT enum SwitchbotValues { SWITCHBOT_SLOT_COUNT = 5, SWITCHBOT_ALTERNATIVE_COUNT = 2, //1 = Switching Item //2 = Yang SWITCHBOT_PRICE_TYPE = 1, //Amount Swtichting Items the Yang-Price SWITCHBOT_PRICE_AMOUNT = 1, }; const DWORD c_arSwitchingItems[3] = { 39028, 71084, 76014, }; #endif enum EMatrixCard { MATRIX_CODE_MAX_LEN = 192, MATRIX_ANSWER_MAX_LEN = 8, }; enum EWearPositions { WEAR_BODY, // 0 WEAR_HEAD, // 1 WEAR_FOOTS, // 2 WEAR_WRIST, // 3 WEAR_WEAPON, // 4 WEAR_NECK, // 5 WEAR_EAR, // 6 WEAR_UNIQUE1, // 7 WEAR_UNIQUE2, // 8 WEAR_ARROW, // 9 WEAR_SHIELD, // 10 WEAR_ABILITY1, // 11 WEAR_ABILITY2, // 12 WEAR_ABILITY3, // 13 WEAR_ABILITY4, // 14 WEAR_ABILITY5, // 15 WEAR_ABILITY6, // 16 WEAR_ABILITY7, // 17 WEAR_ABILITY8, // 18 WEAR_COSTUME_BODY, // 19 WEAR_COSTUME_HAIR, // 20 WEAR_RING1, // 21 : 신규 반지슬롯1 (왼쪽) WEAR_RING2, // 22 : 신규 반지슬롯2 (오른쪽) WEAR_BELT, // 23 : 신규 벨트슬롯 #ifdef __ENABLE_WEAPON_COSTUME_SYSTEM__ WEAR_COSTUME_WEAPON, //24 #endif #ifdef __ITEM_SHINING__ WEAR_SHINING_WEAPON_1, //25 WEAR_SHINING_WEAPON_2, //26 WEAR_SHINING_WEAPON_3, //27 WEAR_SHINING_ARMOR_1, //28 WEAR_SHINING_ARMOR_2, //29 WEAR_SHINING_SPECIAL, //30 #endif WEAR_MAX = 32 // }; enum EDragonSoulDeckType { DRAGON_SOUL_DECK_0, DRAGON_SOUL_DECK_1, DRAGON_SOUL_DECK_MAX_NUM = 2, DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: 중요! 아직 사용중이진 않지만, 3페이지 분량을 예약 해 둠. DS DECK을 늘릴 경우 반드시 그 수만큼 RESERVED에서 차감해야 함! }; enum ESex { SEX_MALE, SEX_FEMALE }; enum EDirection { DIR_NORTH, DIR_NORTHEAST, DIR_EAST, DIR_SOUTHEAST, DIR_SOUTH, DIR_SOUTHWEST, DIR_WEST, DIR_NORTHWEST, DIR_MAX_NUM }; #define ABILITY_MAX_LEVEL 10 /* 기술 최대 레벨 */ enum EAbilityDifficulty { DIFFICULTY_EASY, DIFFICULTY_NORMAL, DIFFICULTY_HARD, DIFFICULTY_VERY_HARD, DIFFICULTY_NUM_TYPES }; enum EAbilityCategory { CATEGORY_PHYSICAL, /* 신체적 어빌리티 */ CATEGORY_MENTAL, /* 정신적 어빌리티 */ CATEGORY_ATTRIBUTE, /* 능력 어빌리티 */ CATEGORY_NUM_TYPES }; enum EJobs { JOB_WARRIOR, JOB_ASSASSIN, JOB_SURA, JOB_SHAMAN, JOB_MAX_NUM }; enum ESkillGroups { SKILL_GROUP_MAX_NUM = 2, }; enum ERaceFlags { RACE_FLAG_ANIMAL = (1 << 0), RACE_FLAG_UNDEAD = (1 << 1), RACE_FLAG_DEVIL = (1 << 2), RACE_FLAG_HUMAN = (1 << 3), RACE_FLAG_ORC = (1 << 4), RACE_FLAG_MILGYO = (1 << 5), RACE_FLAG_INSECT = (1 << 6), RACE_FLAG_FIRE = (1 << 7), RACE_FLAG_ICE = (1 << 8), RACE_FLAG_DESERT = (1 << 9), RACE_FLAG_TREE = (1 << 10), RACE_FLAG_ATT_ELEC = (1 << 11), RACE_FLAG_ATT_FIRE = (1 << 12), RACE_FLAG_ATT_ICE = (1 << 13), RACE_FLAG_ATT_WIND = (1 << 14), RACE_FLAG_ATT_EARTH = (1 << 15), RACE_FLAG_ATT_DARK = (1 << 16), }; enum ELoads { LOAD_NONE, LOAD_LIGHT, LOAD_NORMAL, LOAD_HEAVY, LOAD_MASSIVE }; enum { QUICKSLOT_TYPE_NONE, QUICKSLOT_TYPE_ITEM, QUICKSLOT_TYPE_SKILL, QUICKSLOT_TYPE_COMMAND, QUICKSLOT_TYPE_MAX_NUM, }; enum EParts { PART_MAIN, PART_WEAPON, PART_HEAD, PART_HAIR, PART_MAX_NUM, PART_WEAPON_SUB, }; enum EChatType { CHAT_TYPE_TALKING, /* 그냥 채팅 */ CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ CHAT_TYPE_NOTICE, /* 공지사항 */ CHAT_TYPE_PARTY, /* 파티말 */ CHAT_TYPE_GUILD, /* 길드말 */ CHAT_TYPE_COMMAND, /* 일반 명령 */ CHAT_TYPE_SHOUT, /* 외치기 */ CHAT_TYPE_WHISPER, CHAT_TYPE_BIG_NOTICE, CHAT_TYPE_MONARCH_NOTICE, CHAT_TYPE_MAX_NUM }; enum EWhisperType { WHISPER_TYPE_NORMAL = 0, WHISPER_TYPE_NOT_EXIST = 1, WHISPER_TYPE_TARGET_BLOCKED = 2, WHISPER_TYPE_SENDER_BLOCKED = 3, WHISPER_TYPE_ERROR = 4, WHISPER_TYPE_GM = 5, WHISPER_TYPE_SYSTEM = 0xFF }; enum ECharacterPosition { POSITION_GENERAL, POSITION_BATTLE, POSITION_DYING, POSITION_SITTING_CHAIR, POSITION_SITTING_GROUND, POSITION_INTRO, POSITION_MAX_NUM }; enum EGMLevels { GM_PLAYER, GM_LOW_WIZARD, GM_WIZARD, GM_HIGH_WIZARD, GM_GOD, GM_IMPLEMENTOR }; enum EMobRank { MOB_RANK_PAWN, MOB_RANK_S_PAWN, MOB_RANK_KNIGHT, MOB_RANK_S_KNIGHT, MOB_RANK_BOSS, MOB_RANK_KING, MOB_RANK_MAX_NUM }; enum ECharType { CHAR_TYPE_MONSTER, CHAR_TYPE_NPC, CHAR_TYPE_STONE, CHAR_TYPE_WARP, CHAR_TYPE_DOOR, CHAR_TYPE_BUILDING, CHAR_TYPE_PC, CHAR_TYPE_POLYMORPH_PC, CHAR_TYPE_HORSE, CHAR_TYPE_GOTO }; enum EBattleType { BATTLE_TYPE_MELEE, BATTLE_TYPE_RANGE, BATTLE_TYPE_MAGIC, BATTLE_TYPE_SPECIAL, BATTLE_TYPE_POWER, BATTLE_TYPE_TANKER, BATTLE_TYPE_SUPER_POWER, BATTLE_TYPE_SUPER_TANKER, BATTLE_TYPE_MAX_NUM }; enum EApplyTypes { APPLY_NONE, // 0 APPLY_MAX_HP, // 1 APPLY_MAX_SP, // 2 APPLY_CON, // 3 APPLY_INT, // 4 APPLY_STR, // 5 APPLY_DEX, // 6 APPLY_ATT_SPEED, // 7 APPLY_MOV_SPEED, // 8 APPLY_CAST_SPEED, // 9 APPLY_HP_REGEN, // 10 APPLY_SP_REGEN, // 11 APPLY_POISON_PCT, // 12 APPLY_STUN_PCT, // 13 APPLY_SLOW_PCT, // 14 APPLY_CRITICAL_PCT, // 15 APPLY_PENETRATE_PCT, // 16 APPLY_ATTBONUS_HUMAN, // 17 APPLY_ATTBONUS_ANIMAL, // 18 APPLY_ATTBONUS_ORC, // 19 APPLY_ATTBONUS_MILGYO, // 20 APPLY_ATTBONUS_UNDEAD, // 21 APPLY_ATTBONUS_DEVIL, // 22 APPLY_STEAL_HP, // 23 APPLY_STEAL_SP, // 24 APPLY_MANA_BURN_PCT, // 25 APPLY_DAMAGE_SP_RECOVER, // 26 APPLY_BLOCK, // 27 APPLY_DODGE, // 28 APPLY_RESIST_SWORD, // 29 APPLY_RESIST_TWOHAND, // 30 APPLY_RESIST_DAGGER, // 31 APPLY_RESIST_BELL, // 32 APPLY_RESIST_FAN, // 33 APPLY_RESIST_BOW, // 34 APPLY_RESIST_FIRE, // 35 APPLY_RESIST_ELEC, // 36 APPLY_RESIST_MAGIC, // 37 APPLY_RESIST_WIND, // 38 APPLY_REFLECT_MELEE, // 39 APPLY_REFLECT_CURSE, // 40 APPLY_POISON_REDUCE, // 41 APPLY_KILL_SP_RECOVER, // 42 APPLY_EXP_DOUBLE_BONUS, // 43 APPLY_GOLD_DOUBLE_BONUS, // 44 APPLY_ITEM_DROP_BONUS, // 45 APPLY_POTION_BONUS, // 46 APPLY_KILL_HP_RECOVER, // 47 APPLY_IMMUNE_STUN, // 48 APPLY_IMMUNE_SLOW, // 49 APPLY_IMMUNE_FALL, // 50 APPLY_SKILL, // 51 APPLY_BOW_DISTANCE, // 52 APPLY_ATT_GRADE_BONUS, // 53 APPLY_DEF_GRADE_BONUS, // 54 APPLY_MAGIC_ATT_GRADE, // 55 APPLY_MAGIC_DEF_GRADE, // 56 APPLY_CURSE_PCT, // 57 APPLY_MAX_STAMINA, // 58 APPLY_ATTBONUS_WARRIOR, // 59 APPLY_ATTBONUS_ASSASSIN, // 60 APPLY_ATTBONUS_SURA, // 61 APPLY_ATTBONUS_SHAMAN, // 62 APPLY_ATTBONUS_MONSTER, // 63 APPLY_MALL_ATTBONUS, // 64 공격력 +x% APPLY_MALL_DEFBONUS, // 65 방어력 +x% APPLY_MALL_EXPBONUS, // 66 경험치 +x% APPLY_MALL_ITEMBONUS, // 67 아이템 드롭율 x/10배 APPLY_MALL_GOLDBONUS, // 68 돈 드롭율 x/10배 APPLY_MAX_HP_PCT, // 69 최대 생명력 +x% APPLY_MAX_SP_PCT, // 70 최대 정신력 +x% APPLY_SKILL_DAMAGE_BONUS, // 71 스킬 데미지 * (100+x)% APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 평타 데미지 * (100+x)% APPLY_SKILL_DEFEND_BONUS, // 73 스킬 데미지 방어 * (100-x)% APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 평타 데미지 방어 * (100-x)% APPLY_PC_BANG_EXP_BONUS, // 75 PC방 아이템 EXP 보너스 APPLY_PC_BANG_DROP_BONUS, // 76 PC방 아이템 드롭율 보너스 APPLY_EXTRACT_HP_PCT, // 77 사용시 HP 소모 APPLY_RESIST_WARRIOR, // 78 무사에게 저항 APPLY_RESIST_ASSASSIN, // 79 자객에게 저항 APPLY_RESIST_SURA, // 80 수라에게 저항 APPLY_RESIST_SHAMAN, // 81 무당에게 저항 APPLY_ENERGY, // 82 기력 APPLY_DEF_GRADE, // 83 방어력. DEF_GRADE_BONUS는 클라에서 두배로 보여지는 의도된 버그(...)가 있다. APPLY_COSTUME_ATTR_BONUS, // 84 코스튬 아이템에 붙은 속성치 보너스 APPLY_MAGIC_ATTBONUS_PER, // 85 마법 공격력 +x% APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 마법 + 밀리 공격력 +x% APPLY_RESIST_ICE, // 87 냉기 저항 APPLY_RESIST_EARTH, // 88 대지 저항 APPLY_RESIST_DARK, // 89 어둠 저항 APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항 APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항 MAX_APPLY_NUM, // }; enum EOnClickEvents { ON_CLICK_NONE, ON_CLICK_SHOP, ON_CLICK_TALK, ON_CLICK_MAX_NUM }; enum EOnIdleEvents { ON_IDLE_NONE, ON_IDLE_GENERAL, ON_IDLE_MAX_NUM }; enum EWindows { RESERVED_WINDOW, INVENTORY, EQUIPMENT, SAFEBOX, MALL, DRAGON_SOUL_INVENTORY, BELT_INVENTORY, #ifdef __AUCTION__ AUCTION, #endif GROUND, #ifdef ENABLE_SWITCHBOT SWITCHBOT, #endif #ifdef __ENABLE_NEW_OFFLINESHOP__ NEW_OFFSHOP, SHOP_SAFEBOX, #endif }; enum EMobSizes { MOBSIZE_RESERVED, MOBSIZE_SMALL, MOBSIZE_MEDIUM, MOBSIZE_BIG }; enum EAIFlags { AIFLAG_AGGRESSIVE = (1 << 0), AIFLAG_NOMOVE = (1 << 1), AIFLAG_COWARD = (1 << 2), AIFLAG_NOATTACKSHINSU = (1 << 3), AIFLAG_NOATTACKJINNO = (1 << 4), AIFLAG_NOATTACKCHUNJO = (1 << 5), AIFLAG_ATTACKMOB = (1 << 6 ), AIFLAG_BERSERK = (1 << 7), AIFLAG_STONESKIN = (1 << 8), AIFLAG_GODSPEED = (1 << 9), AIFLAG_DEATHBLOW = (1 << 10), AIFLAG_REVIVE = (1 << 11), }; enum EMobStatType { MOB_STATTYPE_POWER, MOB_STATTYPE_TANKER, MOB_STATTYPE_SUPER_POWER, MOB_STATTYPE_SUPER_TANKER, MOB_STATTYPE_RANGE, MOB_STATTYPE_MAGIC, MOB_STATTYPE_MAX_NUM }; enum EImmuneFlags { IMMUNE_STUN = (1 << 0), IMMUNE_SLOW = (1 << 1), IMMUNE_FALL = (1 << 2), IMMUNE_CURSE = (1 << 3), IMMUNE_POISON = (1 << 4), IMMUNE_TERROR = (1 << 5), IMMUNE_REFLECT = (1 << 6), }; enum EMobEnchants { MOB_ENCHANT_CURSE, MOB_ENCHANT_SLOW, MOB_ENCHANT_POISON, MOB_ENCHANT_STUN, MOB_ENCHANT_CRITICAL, MOB_ENCHANT_PENETRATE, MOB_ENCHANTS_MAX_NUM }; enum EMobResists { MOB_RESIST_SWORD, MOB_RESIST_TWOHAND, MOB_RESIST_DAGGER, MOB_RESIST_BELL, MOB_RESIST_FAN, MOB_RESIST_BOW, MOB_RESIST_FIRE, MOB_RESIST_ELECT, MOB_RESIST_MAGIC, MOB_RESIST_WIND, MOB_RESIST_POISON, MOB_RESISTS_MAX_NUM }; enum { SKILL_ATTR_TYPE_NORMAL = 1, SKILL_ATTR_TYPE_MELEE, SKILL_ATTR_TYPE_RANGE, SKILL_ATTR_TYPE_MAGIC }; enum { SKILL_NORMAL, SKILL_MASTER, SKILL_GRAND_MASTER, SKILL_PERFECT_MASTER, }; enum EGuildWarType { GUILD_WAR_TYPE_FIELD, GUILD_WAR_TYPE_BATTLE, GUILD_WAR_TYPE_FLAG, GUILD_WAR_TYPE_MAX_NUM }; enum EGuildWarState { GUILD_WAR_NONE, GUILD_WAR_SEND_DECLARE, GUILD_WAR_REFUSE, GUILD_WAR_RECV_DECLARE, GUILD_WAR_WAIT_START, GUILD_WAR_CANCEL, GUILD_WAR_ON_WAR, GUILD_WAR_END, GUILD_WAR_OVER, GUILD_WAR_RESERVE, GUILD_WAR_DURATION = 30*60, // 1시간 GUILD_WAR_WIN_POINT = 1000, GUILD_WAR_LADDER_HALF_PENALTY_TIME = 12*60*60, }; enum EAttributeSet { ATTRIBUTE_SET_WEAPON, ATTRIBUTE_SET_BODY, ATTRIBUTE_SET_WRIST, ATTRIBUTE_SET_FOOTS, ATTRIBUTE_SET_NECK, ATTRIBUTE_SET_HEAD, ATTRIBUTE_SET_SHIELD, ATTRIBUTE_SET_EAR, ATTRIBUTE_SET_MAX_NUM }; enum EPrivType { PRIV_NONE, PRIV_ITEM_DROP, PRIV_GOLD_DROP, PRIV_GOLD10_DROP, PRIV_EXP_PCT, MAX_PRIV_NUM, }; enum EMoneyLogType { MONEY_LOG_RESERVED, MONEY_LOG_MONSTER, MONEY_LOG_SHOP, MONEY_LOG_REFINE, MONEY_LOG_QUEST, MONEY_LOG_GUILD, MONEY_LOG_MISC, MONEY_LOG_MONSTER_KILL, MONEY_LOG_DROP, MONEY_LOG_TYPE_MAX_NUM, }; enum EPremiumTypes { PREMIUM_EXP, // 경험치가 1.2배 PREMIUM_ITEM, // 아이템 드롭율이 2배 PREMIUM_SAFEBOX, // 창고가 1칸에서 3칸 PREMIUM_AUTOLOOT, // 돈 자동 줍기 PREMIUM_FISH_MIND, // 고급 물고기 낚일 확률 상승 PREMIUM_MARRIAGE_FAST, // 금실 증가 양을 빠르게합니다. PREMIUM_GOLD, // 돈 드롭율이 1.5배 PREMIUM_MAX_NUM = 9 }; enum SPECIAL_EFFECT { SE_NONE, SE_HPUP_RED, SE_SPUP_BLUE, SE_SPEEDUP_GREEN, SE_DXUP_PURPLE, SE_CRITICAL, SE_PENETRATE, SE_BLOCK, SE_DODGE, SE_CHINA_FIREWORK, SE_SPIN_TOP, SE_SUCCESS, SE_FAIL, SE_FR_SUCCESS, SE_LEVELUP_ON_14_FOR_GERMANY, SE_LEVELUP_UNDER_15_FOR_GERMANY, SE_PERCENT_DAMAGE1, SE_PERCENT_DAMAGE2, SE_PERCENT_DAMAGE3, SE_AUTO_HPUP, SE_AUTO_SPUP, SE_EQUIP_RAMADAN_RING, SE_EQUIP_HALLOWEEN_CANDY, SE_EQUIP_HAPPINESS_RING, SE_EQUIP_LOVE_PENDANT, } ; enum ETeenFlags { TEENFLAG_NONE = 0, TEENFLAG_1HOUR, TEENFLAG_2HOUR, TEENFLAG_3HOUR, TEENFLAG_4HOUR, TEENFLAG_5HOUR, }; #include "item_length.h" enum EDragonSoulRefineWindowSize { DRAGON_SOUL_REFINE_GRID_MAX = 15, }; enum EMisc2 { DRAGON_SOUL_EQUIP_SLOT_START = INVENTORY_MAX_NUM + WEAR_MAX_NUM, DRAGON_SOUL_EQUIP_SLOT_END = DRAGON_SOUL_EQUIP_SLOT_START + (DS_SLOT_MAX * DRAGON_SOUL_DECK_MAX_NUM), DRAGON_SOUL_EQUIP_RESERVED_SLOT_END = DRAGON_SOUL_EQUIP_SLOT_END + (DS_SLOT_MAX * DRAGON_SOUL_DECK_RESERVED_MAX_NUM), BELT_INVENTORY_SLOT_START = DRAGON_SOUL_EQUIP_RESERVED_SLOT_END, BELT_INVENTORY_SLOT_END = BELT_INVENTORY_SLOT_START + BELT_INVENTORY_SLOT_COUNT, #ifndef ENABLE_SPECIAL_INVENTORY INVENTORY_AND_EQUIP_SLOT_MAX = BELT_INVENTORY_SLOT_END, #else SPECIAL_INVENTORY_SLOT_START = BELT_INVENTORY_SLOT_END, SPECIAL_INVENTORY_SKILLBOOK_START = SPECIAL_INVENTORY_SLOT_START, SPECIAL_INVENTORY_SKILLBOOK_END = SPECIAL_INVENTORY_SKILLBOOK_START + SPECIAL_INVENTORY_PAGE_SIZE * INVENTORY_PAGE_COUNT, SPECIAL_INVENTORY_STONE_START = SPECIAL_INVENTORY_SKILLBOOK_END, SPECIAL_INVENTORY_STONE_END = SPECIAL_INVENTORY_STONE_START + SPECIAL_INVENTORY_PAGE_SIZE * INVENTORY_PAGE_COUNT, SPECIAL_INVENTORY_MATERIAL_START = SPECIAL_INVENTORY_STONE_END, SPECIAL_INVENTORY_MATERIAL_END = SPECIAL_INVENTORY_MATERIAL_START + SPECIAL_INVENTORY_PAGE_SIZE * INVENTORY_PAGE_COUNT, SPECIAL_INVENTORY_SLOT_END = SPECIAL_INVENTORY_MATERIAL_END, INVENTORY_AND_EQUIP_SLOT_MAX = SPECIAL_INVENTORY_SLOT_END, #endif }; #pragma pack(push, 1) typedef struct SItemPos { BYTE window_type; WORD cell; SItemPos () { window_type = INVENTORY; cell = WORD_MAX; } SItemPos (BYTE _window_type, WORD _cell) { window_type = _window_type; cell = _cell; } bool IsValidItemPosition() const { switch (window_type) { case RESERVED_WINDOW: return false; case INVENTORY: case EQUIPMENT: case BELT_INVENTORY: return cell < INVENTORY_AND_EQUIP_SLOT_MAX; case DRAGON_SOUL_INVENTORY: return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM); // 동적으로 크기가 정해지는 window는 valid 체크를 할 수가 없다. case SAFEBOX: case MALL: return false; #ifdef ENABLE_SWITCHBOT case SWITCHBOT: return cell < SWITCHBOT_SLOT_COUNT; #endif default: return false; } return false; } bool IsEquipPosition() const { return ((INVENTORY == window_type || EQUIPMENT == window_type) && cell >= INVENTORY_MAX_NUM && cell < INVENTORY_MAX_NUM + WEAR_MAX_NUM) || IsDragonSoulEquipPosition(); } bool IsDragonSoulEquipPosition() const { return (DRAGON_SOUL_EQUIP_SLOT_START <= cell) && (DRAGON_SOUL_EQUIP_SLOT_END > cell); } bool IsBeltInventoryPosition() const { return (BELT_INVENTORY_SLOT_START <= cell) && (BELT_INVENTORY_SLOT_END > cell); } bool IsDefaultInventoryPosition() const { return INVENTORY == window_type && cell < INVENTORY_MAX_NUM; } #ifdef ENABLE_SWITCHBOT bool IsSwitchbotPosition() const { return SWITCHBOT == window_type && cell < SWITCHBOT_SLOT_COUNT; } #endif #ifdef ENABLE_SPECIAL_INVENTORY bool IsSpecialInventoryPosition() const { return INVENTORY == window_type && cell >= SPECIAL_INVENTORY_SLOT_START && cell < SPECIAL_INVENTORY_SLOT_END; } int GetSpecialInventoryType() { if (cell >= SPECIAL_INVENTORY_SKILLBOOK_START && cell < SPECIAL_INVENTORY_SKILLBOOK_END) { return SPECIAL_INVENTORY_TYPE_SKILLBOOK; } else if (cell >= SPECIAL_INVENTORY_STONE_START && cell < SPECIAL_INVENTORY_STONE_END) { return SPECIAL_INVENTORY_TYPE_STONE; } else if (cell >= SPECIAL_INVENTORY_MATERIAL_START && cell < SPECIAL_INVENTORY_MATERIAL_END) { return SPECIAL_INVENTORY_TYPE_MATERIAL; } else { return -1; } } #endif bool operator==(const struct SItemPos& rhs) const { return (window_type == rhs.window_type) && (cell == rhs.cell); } bool operator<(const struct SItemPos& rhs) const { return (window_type < rhs.window_type) || ((window_type == rhs.window_type) && (cell < rhs.cell)); } } TItemPos; const TItemPos NPOS (RESERVED_WINDOW, WORD_MAX); #ifdef ENABLE_SPECIAL_INVENTORY struct SpecialInventoryRange { BYTE type; WORD start; WORD end; SpecialInventoryRange() { type = 0; start = 0; end = 0; } SpecialInventoryRange(BYTE _type) { type = _type; if (type == SPECIAL_INVENTORY_TYPE_SKILLBOOK) { start = SPECIAL_INVENTORY_SKILLBOOK_START; end = SPECIAL_INVENTORY_SKILLBOOK_END; } else if (type == SPECIAL_INVENTORY_TYPE_STONE) { start = SPECIAL_INVENTORY_STONE_START; end = SPECIAL_INVENTORY_STONE_END; } else if (type == SPECIAL_INVENTORY_TYPE_MATERIAL) { start = SPECIAL_INVENTORY_MATERIAL_START; end = SPECIAL_INVENTORY_MATERIAL_END; } } }; #endif typedef enum { SHOP_COIN_TYPE_GOLD, // DEFAULT VALUE SHOP_COIN_TYPE_SECONDARY_COIN, } EShopCoinType; #ifdef __SKILL_COLOR_SYSTEM__ namespace ESkillColorLength { enum ESkillColorLength { MAX_SKILL_COUNT = 6, MAX_EFFECT_COUNT = 5, MAX_BUFF_COUNT = 5, BUFF_BEGIN = MAX_SKILL_COUNT, }; } #endif #pragma pack(pop)
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.