Jump to content

XeXe

Inactive Member
  • Posts

    8
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by XeXe

  1. 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

  2. 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: https://metin2.download/picture/m7iECeCQgUr0QpvLn1U1wV4F6EL4s2f7/.gif

    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: 

    This is the hidden content, please

    uiTarget_HowTo_Decimalbar: 

    This is the hidden content, please

    uiTarget with the System and the Problem: 

    This is the hidden content, please

     

    • Metin2 Dev 5
    • Love 1
  3. 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.

  4. 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): 

    This is the hidden content, please

    Syslog (ch1): 

    This is the hidden content, please

    Syserr (ch1): 

    This is the hidden content, please

    • Metin2 Dev 12
    • Good 2
    • Love 5
  5. 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.