/* ====================================================================
 * 파    일 :	
 * 목    적 :	
 * 작 성 자 :	곽철중
 * 작 성 일 :	2007.06.25
 * 주의사항 :	
 * =================================================================== */
#pragma once
#pragma pack(push,1)

#include "BaseObject_Common.h"
#include "CommonDefines.h"
#include "CommonNetworkMsgStruct.h"

#define MAX_OWNER				6		// 최대 드롭 아이템 소유자
#define MAX_ITEMS				30		// 최대 드롭 아이템 개수

#define ITEM_VALID_DISTANCE		100.f	// 아이템 줍기 유효거리
#define MAX_ITEM_EXCHANGE		15		// 최대 거래 개수

enum eItemSellType
{
	ItemSellNone = 0,	// 판매불가
	ItemSellMoney,		// 게임머니
	ItemSellPvp,		// 전장 포인트
	ItemSellTarot,		// 점집 포인트
};
enum eItemBuyType
{
	ItemBuyNone = 0,	// 판매불가
	ItemBuyMoney,		// 게임머니
	ItemBuyPvp,			// 전장 포인트
	ItemBuyTarot,		// 점집 포인트
};

enum eItemActiveWeapon
{
	ItemActiveFront = 0,	// 활성 무기정보 - Front.
	ItemActiveBack,			// "             - Back.
	ItemActiveMax,

	ItemActiveSwitch = 1,
};

enum eItemExchangeStatus
{
	ItemExchangeNone = 0,
	ItemExchangeAsk,
	ItemExchangeBegin,
	ItemExchangeOk,
	ItemExchangeEnd,
};


#define STALL_TITLE_LEN			50						// 노점 타이틀 길이
#define MAX_STALL_TITLE_LEN		(STALL_TITLE_LEN+1)		// 노점 타이틀 최대길이(NULL 포함)
#define MAX_STALL_GUEST			10						// 노점 게스트(GEUST) 인원
#define MAX_STALL_ITEM			10						// 등록 가능한 아이템의 개수

enum eStallSellItemStatus
{
	StallSellItemNone = 0,	// 등록안됨
	StallSellItemStart,		// 판매시작
	StallSellItemPause,		// 판매일시중지
};


#ifndef __ITEM_TYPE__
#define __ITEM_TYPE__

enum ITEM_TYPE
{
	ITEM_WEAPON    = 0,					// 무기
		ITEM_WEAPON_SWORD = 0,			// 한손검
		ITEM_WEAPON_BLADE,				// 양손검
		ITEM_WEAPON_DUAL,				// 이도류
		ITEM_WEAPON_CUTTER,				// 단  검
		ITEM_WEAPON_GUN,				// 총,
		ITEM_WEAPON_STAFF,				// 지팡이
		ITEM_WEAPON_SHIELD,				// 방패

	ITEM_WEAR      = 1,					// 방어구
		ITEM_WEAR_HEAD = 0,				// 머리
		ITEM_WEAR_UPPER,				// 상의
		ITEM_WEAR_LOWER,				// 하의
		ITEM_WEAR_HANDS,				// 손
		ITEM_WEAR_FEET,					// 발
		ITEM_WEAR_ONEPIECE,				// 원피스

	ITEM_ACCESSORY  = 2,				// 액세서리
		ITEM_ACCESSORY_EARRING = 0,		// 귀걸이
		ITEM_ACCESSORY_NECKLACE,		// 목걸이
		ITEM_ACCESSORY_BROOCH,			// 브로치
		ITEM_ACCESSORY_BRACELET,		// 팔찌
		ITEM_ACCESSORY_RING,			// 반지

	ITEM_ETC1       = 3,				// 소모잡화
		ITEM_ETC1_POTION = 0,			// 물약
		ITEM_ETC1_MISC,					// 잡화
		ITEM_ETC1_QUEST,				// 퀘스트
		ITEM_ETC1_CHANGE,				// 체인지
		ITEM_ETC1_MIXSKILL,				// 조합 전문기술
		ITEM_ETC1_TITLE,				// 호칭
		ITEM_ETC1_RECIPE,				// 레시피
		ITEM_ETC1_RECIPEGROUP,			// 레시피(그룹)
		ITEM_ETC1_SKILLRESET,			// 스킬 초기화

	ITEM_MATERIAL   = 4,				// 재료
		ITEM_MATERIAL_SKILL = 0,		// 스킬
		ITEM_MATERIAL_CLOTH,			// 옷감
		ITEM_MATERIAL_LEATHER,			// 가죽
		ITEM_MATERIAL_METAL,			// 금속
		ITEM_MATERIAL_JEWEL,			// 보석
		ITEM_MATERIAL_MISC,				// 잡화
		ITEM_MATERIAL_MAP,				// 이동주문서
		ITEM_MATERIAL_VEHICLE,			// 탈것

	ITEM_QUEST      = 5,				// 퀘스트
	ITEM_ETC2       = 6,				// 일반잡화
	ITEM_SPREAD     = 7,				// 스프레드

	ITEM_CARD       = 8,				// 카드
		ITEM_CARD_TAROT = 0,			// 카드-타로(메이저)
		ITEM_CARD_COMMON,				// 카드-소모
		ITEM_CARD_EQUIP_C,				// 카드-캐릭터장착
		ITEM_CARD_EQUIP_A,				// 카드-A타입
		ITEM_CARD_EQUIP_B,				// 카드-B타입
		ITEM_CARD_EQUIP_AB,				// 카드-AB타입
		ITEM_CARD_EQUIP_O,				// 카드-O타입
		ITEM_CARD_ENHANCE_WEAPON_LV1,	// 카드-무기강화
		ITEM_CARD_ENHANCE_WEAPON_LV2,	// 카드-무기강화
		ITEM_CARD_ENHANCE_WEAPON_LV3,	// 카드-무기강화
		ITEM_CARD_ENHANCE_WEAPON_LV4,	// 카드-무기강화
		ITEM_CARD_ENHANCE_WEAPON_LV5,	// 카드-무기강화
		ITEM_CARD_ENHANCE_WEAR_LV1,		// 카드-방어구강화
		ITEM_CARD_ENHANCE_WEAR_LV2,		// 카드-방어구강화
		ITEM_CARD_ENHANCE_WEAR_LV3,		// 카드-방어구강화
		ITEM_CARD_ENHANCE_WEAR_LV4,		// 카드-방어구강화
		ITEM_CARD_ENHANCE_WEAR_LV5,		// 카드-방어구강화

	ITEM_MONSTER    = 9,				// 몬스터카드
		ITEM_MONSTER_UNKNOWN = 0,		// 몬스터-미분류
		ITEM_MONSTER_HUMAN,				// 몬스터-인간
		ITEM_MONSTER_ANIMAL,			// 몬스터-동물
		ITEM_MONSTER_PLANT,				// 몬스터-식물
		ITEM_MONSTER_INSECT,			// 몬스터-곤충
		ITEM_MONSTER_ELF,				// 몬스터-정령
		ITEM_MONSTER_UNDEAD,			// 몬스터-언데드
		ITEM_MONSTER_GIANT,				// 몬스터-거인
		ITEM_MONSTER_DRAGON,			// 몬스터-용

	ITEM_COIN		= 10,				// 코인
		ITEM_COIN_GOLD = 0,				// 코인-금
		ITEM_COIN_SILVER,				// 코인-은
		ITEM_COIN_COPPER,				// 코인-동

	ITEM_UNKNOWN   = 11,
};

#endif // __ITEM_TYPE__


#ifndef __ITEM_TARGET_TYPE__

#define ITEM_TARGET_NONE		0x00	// 사용불가
#define ITEM_TARGET_MYSELF		0x01	// 플레이어 자신
#define ITEM_TARGET_MONSTER		0x02	// 적
#define ITEM_TARGET_PLAYER		0x04	// 다른 플레이어
#define ITEM_TARGET_PARTY		0x08	// 파티구성원

#endif // __ITEM_TARGET_TYPE__


#ifndef __ITEM_TOOLTIP__

/// 툴팁컬러 ( 레어도 관련
enum eTooltipType
{
	eTOOLTIP_MALL,		/// 몰
	eTOOLTIP_ETC,		/// 잡화
	eTOOLTIP_NORMAL,	/// 일반
	eTOOLTIP_MAGIC,		/// 매직
	eTOOLTIP_RARE,		/// 레어
	eTOOLTIP_UNIQUE,	/// 유니크
	eTOOLTIP_EPIC,		/// 에픽
	eTOOLTIP_REGEND,	/// 레젼드

	eTOOLTIP_NONE, 
};

#endif __ITEM_TOOLTIP__


#ifndef __ITEM_LIMIT__

enum ITEM_RACE
{
	ITEM_RACE_HUMAN = 0,				// 인간
	ITEM_RACE_BEAST,					// 수인
	ITEM_RACE_ELF,						// 정령
	ITEM_RACE_ALL,						// 모두
};

enum ITEM_GENDER
{
	ITEM_GENDER_MALE = 0,				// 남자
	ITEM_GENDER_FEMALE,					// 여자
	ITEM_GENDER_ALL,					// 모두
};

enum ITEM_JOB
{
	ITEM_JOB_FIGHTER = 1000,			// 파이터 군
	ITEM_JOB_MAGE    = 2000,			// 메이지 군
	ITEM_JOB_RANGER  = 3000,			// 레인져 군
	ITEM_JOB_SHAMAN  = 4000,			// 샤  먼 군
	ITEM_JOB_WARRIOR = 5000,			// 워리어 군
	ITEM_JOB_THIEF   = 6000,			// 씨  프 군
	ITEM_JOB_ALL     = 0,				// 모  두 - (제한없음)
};

#endif // __ITEM_LIMIT__


#ifndef __ITEM_ENHANCED__

#define MIN_ITEM_ENHANCED		1		// 아이템 강화 유효단계 (0~15까지, 0일경우 강화없음)
#define MAX_ITEM_ENHANCED		15		// 아이템 강화 유효단계 (0~15까지, 0일경우 강화없음)

enum ITEM_ENHANCED_LEVEL
{
	ITEM_ENHANCED_LV1_BEGIN = 0,
	ITEM_ENHANCED_LV1_END   = ITEM_ENHANCED_LV1_BEGIN + 3,

	ITEM_ENHANCED_LV2_BEGIN,
	ITEM_ENHANCED_LV2_END   = ITEM_ENHANCED_LV2_BEGIN + 2,

	ITEM_ENHANCED_LV3_BEGIN,
	ITEM_ENHANCED_LV3_END   = ITEM_ENHANCED_LV3_BEGIN + 2,

	ITEM_ENHANCED_LV4_BEGIN,
	ITEM_ENHANCED_LV4_END   = ITEM_ENHANCED_LV4_BEGIN + 2,

	ITEM_ENHANCED_LV5_BEGIN,
	ITEM_ENHANCED_LV5_END   = ITEM_ENHANCED_LV5_BEGIN + 2,
};

enum ITEM_ENHANCED_TYPE
{
	ITEM_ENHANCED_NONE=0,				// 없음
	ITEM_ENHANCED_PHYSIC_ATTACK,		// 물리공격력
	ITEM_ENHANCED_MAGIC_ATTACK,			// 마법공격력
	ITEM_ENHANCED_PHYSIC_DEFENSE,		// 물리방어력
	ITEM_ENHANCED_MAGIC_DEFENSE,		// 마법방어력
};

#endif // __ITEM_ENHANCED__


#ifndef __ITEM_CARD_SLOT__

#define ITEM_CARD_SLOT_NONE	0			// 없음
#define ITEM_CARD_SLOT_A	1			// A형
#define ITEM_CARD_SLOT_B	2			// B형
#define ITEM_CARD_SLOT_AB	3			// AB형
#define ITEM_CARD_SLOT_O	4			// O형

enum ITEM_CARD_SLOT
{
	ITEM_CARD_SLOT_1 = 1,
	ITEM_CARD_SLOT_2,
	ITEM_CARD_SLOT_3,
	ITEM_CARD_SLOT_4,
	ITEM_CARD_SLOT_5
};

#define MIN_CARD_SLOT	ITEM_CARD_SLOT_1	// 카드슬롯 최소
#define MAX_CARD_SLOT	ITEM_CARD_SLOT_5	// 카드슬롯 최대

#endif // __ITEM_CARD_SLOT__


#ifndef __ITEM_CHANGE__

#define MIN_ITEM_CHANGE			1			// 최소 교환가능 수량.
#define MAX_ITEM_CHANGE			3			// 최대 교환가능 수량.

#define MAX_ITEM_CHANGE_RATE	10			// 최대 아이템 교환데이터(확률).
#define MAX_ITEM_CHANGE_DATA	40			// 최대 아이템 교환데이터(인덱스&수량).

#endif // __ITEM_CHANGE__


#ifndef __INVENTORY_NUMBER__
#define __INVENTORY_NUMBER__

#define MIN_INVENTORY				0

enum INVENTORY_NUMBER
{
	// INVENTORY_WEAR_TYPE
	INVENTORY_WEAR_BEGIN = MIN_INVENTORY,

		INVENTORY_WEAR_HAT = INVENTORY_WEAR_BEGIN,
		INVENTORY_WEAR_BODY1,
		INVENTORY_WEAR_BODY2,
		INVENTORY_WEAR_HAND,
		INVENTORY_WEAR_FOOT,

		INVENTORY_WEAR_EARRING,
		INVENTORY_WEAR_NECKLACE,
		INVENTORY_WEAR_BROOCH,
		INVENTORY_WEAR_BRACELET,
		INVENTORY_WEAR_RING,

		INVENTORY_WEAR_CARD1,
		INVENTORY_WEAR_CARD2,
		INVENTORY_WEAR_CARD3,

	INVENTORY_WEAR_END = INVENTORY_WEAR_CARD3,

	// INVENTORY_HAND_TYPE
	INVENTORY_HAND_BEGIN,

		INVENTORY_HAND_LEFT1 = INVENTORY_HAND_BEGIN,
		INVENTORY_HAND_RIGHT1,

		INVENTORY_HAND_LEFT2,
		INVENTORY_HAND_RIGHT2,

	INVENTORY_HAND_END = INVENTORY_HAND_RIGHT2,

	// INVENTORY_AVATAR - 예약번호(아직 내용없음)
	INVENTORY_AVATAR_BEGIN,
	INVENTORY_AVATAR_END = INVENTORY_AVATAR_BEGIN + 15,

	// INVENTORY_BAG_TYPE
	INVENTORY_BAG0_BEGIN,
	INVENTORY_BAG0_END = INVENTORY_BAG0_BEGIN + 24,

	INVENTORY_BAG1_BEGIN,
	INVENTORY_BAG1_END = INVENTORY_BAG1_BEGIN + 24,

	INVENTORY_BAG2_BEGIN,
	INVENTORY_BAG2_END = INVENTORY_BAG2_BEGIN + 24,

	INVENTORY_BAG3_BEGIN,
	INVENTORY_BAG3_END = INVENTORY_BAG3_BEGIN + 24,

	// INVENTORY_MALL_TYPE
	INVENTORY_MALL_BEGIN,
	INVENTORY_MALL_END = INVENTORY_MALL_BEGIN + 24,

	// INVENTORY_QUEST_TYPE
	INVENTORY_QUEST_BEGIN,
	INVENTORY_QUEST_END = INVENTORY_QUEST_BEGIN + 24,

	// INVENTORY_WAREHOUSE_TYPE - 일반
	INVENTORY_WAREHOUSE0_BEGIN,
	INVENTORY_WAREHOUSE0_END = INVENTORY_WAREHOUSE0_BEGIN + 49,

	INVENTORY_WAREHOUSE1_BEGIN,
	INVENTORY_WAREHOUSE1_END = INVENTORY_WAREHOUSE1_BEGIN + 49,

	// INVENTORY_WAREHOUSE_TYPE - 몰 전용
	INVENTORY_WAREHOUSE2_BEGIN,
	INVENTORY_WAREHOUSE2_END = INVENTORY_WAREHOUSE2_BEGIN + 49,

	INVENTORY_WAREHOUSE3_BEGIN,
	INVENTORY_WAREHOUSE3_END = INVENTORY_WAREHOUSE3_BEGIN + 49,

	// INVENTORY_COLLECTION_TYPE - 예약번호(아직 내용없음)
	INVENTORY_COLLECTION_BEGIN,

		INVENTORY_TAROT_BEGIN = INVENTORY_COLLECTION_BEGIN,
		INVENTORY_TAROT_END   = INVENTORY_TAROT_BEGIN + 21,

		INVENTORY_SPREAD_BEGIN,
		INVENTORY_SPREAD_END  = INVENTORY_SPREAD_BEGIN + 4,

	INVENTORY_COLLECTION_END = INVENTORY_COLLECTION_BEGIN + 99
};

#define INVENTORY_EQUIP_NONE		(-1)
#define INVENTORY_EQUIP_BEGIN		INVENTORY_WEAR_BEGIN
#define INVENTORY_EQUIP_END			INVENTORY_HAND_END

#define INVENTORY_BAG_NONE          (-1)
#define INVENTORY_BAG_BEGIN			INVENTORY_BAG0_BEGIN
#define INVENTORY_BAG_END			INVENTORY_BAG3_END

#define INVENTORY_CHARACTER_BEGIN	INVENTORY_WEAR_BEGIN
#define INVENTORY_CHARACTER_END		INVENTORY_BAG3_END

#define INVENTORY_WAREHOUSE_NONE     (-1)
#define INVENTORY_WAREHOUSE_BEGIN	INVENTORY_WAREHOUSE0_BEGIN
#define INVENTORY_WAREHOUSE_END		INVENTORY_WAREHOUSE1_END

#define MAX_INVENTORY				INVENTORY_COLLECTION_END

#endif // __INVENTORY_NUMBER__


struct sInventory
{
	unsigned long  idx;								// 인벤토리 고유번호
	unsigned long  ItemIndex;						// 아이템 정의 인덱스
	unsigned short number;							// 아이템 번호 (슬롯인덱스)
	unsigned short count;							// 아이템 수량
	unsigned char  enhanced;						// 아이템 강화단계 (0~15까지)
	unsigned long  cardSlot1;						// 카드슬롯1
	unsigned long  cardSlot2;						// 카드슬롯2
	unsigned long  cardSlot3;						// 카드슬롯3
	unsigned long  cardSlot4;						// 카드슬롯4
	unsigned long  cardSlot5;						// 카드슬롯5
	unsigned char  seal;							// 아이템 봉인 (0봉인해제/1봉인됨)
};

struct sInventoryCooltime
{
	unsigned long ItemIndex;						// 아이템 정의 인덱스
	unsigned long cooltime2;						// 그룹 쿨타임 인덱스
	unsigned long cooltime;							// 쿨타임 남은시간
	unsigned long cooltime1;						// 쿨타임 적용시간
};


#ifndef __ITEM_ABILITY_OPT__

// 순서는 기획서 참조 - 기획서 기준 정렬
enum ITEM_ABILITY_OPT
{
	ITEM_OPT_NONE=0,						// 사용안함
	ITEM_OPT_STR,							// 힘
	ITEM_OPT_DEX,							// 민첩
	ITEM_OPT_CON,							// 체력
	ITEM_OPT_INT,							// 지능
	ITEM_OPT_WIS,							// 지혜
	ITEM_OPT_ALL,							// 모두(힘,민첩,체력,지능,지혜)

	ITEM_OPT_PLUS_PHYSIC_ATTACK=101,		// 물리공격력
	ITEM_OPT_PLUS_MAGIC_ATTACK,				// 마법공격력
	ITEM_OPT_PLUS_PHYSIC_DEFENSE,			// 물리방어력
	ITEM_OPT_PLUS_MAGIC_DEFENSE,			// 마법방어력
	ITEM_OPT_PLUS_PHYSIC_ATTACK_RATE,		// 물리명중률
	ITEM_OPT_PLUS_MAGIC_ATTACK_RATE,		// 마법명중률
	ITEM_OPT_PLUS_PHYSIC_CRITICAL,			// 물리크리티컬
	ITEM_OPT_PLUS_MAGIC_CRITICAL,			// 마법크리티컬
	ITEM_OPT_PLUS_DOD,						// 회피
	ITEM_OPT_PLUS_WEI,						// 무게
	ITEM_OPT_PLUS_MAX_HP,					// 최대량 HP
	ITEM_OPT_PLUS_MAX_MP,					// 최대량 MP
	ITEM_OPT_PLUS_MOV,						// 이동
	ITEM_OPT_PLUS_HP,						// HP 회복
	ITEM_OPT_PLUS_MP,						// MP 회복

	ITEM_OPT_PERCENT_PHYSIC_ATTACK=201,		// 물리공격력
	ITEM_OPT_PERCENT_MAGIC_ATTACK,			// 마법공격력
	ITEM_OPT_PERCENT_PHYSIC_DEFENSE,		// 물리방어력
	ITEM_OPT_PERCENT_MAGIC_DEFENSE,			// 마법방어력
	ITEM_OPT_PERCENT_PHYSIC_ATTACK_RATE,	// 물리명중률
	ITEM_OPT_PERCENT_MAGIC_ATTACK_RATE,		// 마법명중률
	ITEM_OPT_PERCENT_PHYSIC_CRITICAL,		// 물리크리티컬
	ITEM_OPT_PERCENT_MAGIC_CRITICAL,		// 마법크리티컬
	ITEM_OPT_PERCENT_DOD,					// 회피
	ITEM_OPT_PERCENT_WEI,					// 무게
	ITEM_OPT_PERCENT_MAX_HP,				// 최대량 HP
	ITEM_OPT_PERCENT_MAX_MP,				// 최대량 MP
	ITEM_OPT_PERCENT_MOV,					// 이동
	ITEM_OPT_PERCENT_HP,					// HP 회복
	ITEM_OPT_PERCENT_MP,					// MP 회복

	ITEM_OPT_PERCENT_DRAIN_HP = 301,		// HP 흡수
	ITEM_OPT_PERCENT_DRAIN_MP,				// MP 흡수
	ITEM_OPT_PERCENT_SKILL_HEAL_INC,		// 스킬 힐 회복량 증가
	ITEM_OPT_PERCENT_DAMAGE_DEC,			// 데미지 흡수/감소
	ITEM_OPT_PERCENT_DAMAGE_REF,			// 데미지 반사
};

#endif // __ITEM_ABILITY_OPT__


// 장착한 아이템의 총합 어빌리티 - 스크립트 기준 정렬
struct sEquipAbility
{
	// 기본 값 적용.
	short mPhysicDefense;							// 물리:방어력
	short mMagicDefense;							// 마법:방어력
	short mAttackRange;								// 공격 거리
	short mAttackSpeed;								// 공격 속도

	short mPhysicMinAttack;							// 물리:최소공격력
	short mPhysicMaxAttack;							// 물리:최대공격력
	short mMagicMinAttack;							// 마법:최소공격력
	short mMagicMaxAttack;							// 마법:최대공격력

	short mPhysicAttackRate;						// 물리:공격률
	short mMagicAttackRate;							// 마법:공격률
	short mPhysicCritical;							// 물리:크리티컬
	short mMagicCritical;							// 마법:크리티컬

	// 옵션 값 적용.
	short mOptStr;									// 증가:힘
	short mOptDex;									// 증가:민첩
	short mOptCon;									// 증가:체력
	short mOptInt;									// 증가:지능
	short mOptWis;									// 증가:지혜

	// 옵션 값 - Plus
	short mOptPlusPhysicAttack;						// 물리공격력
	short mOptPlusMagicAttack;						// 마법공격력
	short mOptPlusPhysicDefense;					// 물리방어력
	short mOptPlusMagicDefense;						// 마법방어력
	short mOptPlusPhysicAttackRate;					// 물리명중률
	short mOptPlusMagicAttackRate;					// 마법명중률
	short mOptPlusPhysicCritical;					// 물리크리티컬
	short mOptPlusMagicCritical;					// 마법크리티컬
	short mOptPlusDod;								// 회피
	short mOptPlusWei;								// 무게
	short mOptPlusMaxHp;							// 최대량 HP
	short mOptPlusMaxMp;							// 최대량 MP
	short mOptPlusMov;								// 이동
	short mOptPlusHp;								// HP 회복
	short mOptPlusMp;								// MP 회복

	// 옵션 값 - Percent
	short mOptPercentPhysicAttack;					// 물리공격력
	short mOptPercentMagicAttack;					// 마법공격력
	short mOptPercentPhysicDefense;					// 물리방어력
	short mOptPercentMagicDefense;					// 마법방어력
	short mOptPercentPhysicAttackRate;				// 물리명중률
	short mOptPercentMagicAttackRate;				// 마법명중률
	short mOptPercentPhysicCritical;				// 물리크리티컬
	short mOptPercentMagicCritical;					// 마법크리티컬
	short mOptPercentDod;							// 회피
	short mOptPercentWei;							// 무게
	short mOptPercentMaxHp;							// 최대량 HP
	short mOptPercentMaxMp;							// 최대량 MP
	short mOptPercentMov;							// 이동
	short mOptPercentHp;							// HP 회복
	short mOptPercentMp;							// MP 회복

	// 옵션 값 - Etc
	short mOptPercentDrainHp;						// HP 흡수
	short mOptPercentDrainMp;						// MP 흡수
	short mOptPercentSkillHealInc;					// 스킬 힐 회복량 증가
	short mOptPercentDamageDec;						// 데미지 흡수/감소
	short mOptPercentDamageRef;						// 데미지 반사
};

// 분해한 아이템의 보상 아이템
#define MAX_DISJOINT_ITEM	6

struct eDisjointItem
{
	long  itemDefineIndex;
	short inventoryCount;
};

struct MSG_REQ_INVENTORY : public MSGROOT
{};
struct MSG_RES_INVENTORY : public MSGROOT
{
	eItemActiveWeapon activeWeapon;					// 활성 무기정보(0 Front, 1Back).
	long              RowCount;						// 갯수
	sInventory        Inventory[1];					// 인벤토리
};

struct MSG_REQ_INVENTORY_COOLTIME : public MSGROOT
{};
struct MSG_RES_INVENTORY_COOLTIME : public MSGROOT
{
	long               RowCount;					// 갯수
	sInventoryCooltime InventoryCooltime[1];		// 인벤토리 쿨타임
};

/*-- 아이템 이동(인벤토리)
*/
#define ERROR_ITEM_MOV_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_MOV_INVENTORY_FAIL			1   // 실패
#define ERROR_ITEM_MOV_INVENTORY_NOTYET			2   // DB처리중
#define ERROR_ITEM_MOV_INVENTORY_MERGE			3	// 병합중

struct MSG_REQ_ITEM_MOV_INVENTORY : public MSGROOT
{
	unsigned short number1;							// [in] 이동 전
	unsigned short number2;							// [in] 이동 후
};
struct MSG_RES_ITEM_MOV_INVENTORY : public MSG_ERROR
{};


#define ERROR_ITEM_MERGE_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_MERGE_INVENTORY_FAIL			1   // 실패

struct MSG_RES_ITEM_MERGE_INVENTORY : public MSG_ERROR
{};

/*-- 아이템 사용(인벤토리)
*/
#define ERROR_ITEM_USE_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_USE_INVENTORY_FAIL			1	// 실패
#define ERROR_ITEM_USE_INVENTORY_NOTYET			2   // DB처리중
#define ERROR_ITEM_USE_INVENTORY_COOLTIME		3	// 쿨타임 적용중
#define ERROR_ITEM_USE_INVENTORY_TITLE			4	// 호칭 보유중

struct MSG_REQ_ITEM_USE_INVENTORY : public MSGROOT
{
	unsigned long  targetType;						// 대상 타  입 'sObject 참조'
	unsigned long  targetIndex;						// 대상 인덱스 "
	unsigned short number;							// 인벤토리 번호
};
struct MSG_RES_ITEM_USE_INVENTORY : public MSG_ERROR
{};


/*-- 아이템 삭제(인벤토리)
*/
#define ERROR_ITEM_DEL_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_DEL_INVENTORY_FAIL			1   // 실패
#define ERROR_ITEM_DEL_INVENTORY_NOTYET			2   // DB처리중

struct MSG_REQ_ITEM_DEL_INVENTORY : public MSGROOT
{
	unsigned short number;							// 인벤토리 번호
};
struct MSG_RES_ITEM_DEL_INVENTORY : public MSG_ERROR
{};


/*-- 아이템 스위칭/착용무기만 적용(인벤토리)
*/
#define ERROR_ITEM_SWI_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_SWI_INVENTORY_FAIL			1   // 실패
#define ERROR_ITEM_SWI_INVENTORY_NOTYET			2   // DB처리중

struct MSG_REQ_ITEM_SWI_INVENTORY : MSGROOT
{};
struct MSG_RES_ITEM_SWI_INVENTORY : MSG_ERROR
{
	eItemActiveWeapon activeWeapon;					// 활성 무기정보(0 Front, 1Back).
};


/*-- 아이템 나누기(인벤토리)
*/
#define ERROR_ITEM_DIVIDE_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_DIVIDE_INVENTORY_FAIL		1	// 실패
#define ERROR_ITEM_DIVIDE_INVENTORY_NOTYET		2   // DB처리중

struct MSG_REQ_ITEM_DIVIDE_INVENTORY : MSGROOT
{
	unsigned short number1;							// 인벤토리 번호(원본)
	unsigned short number2;							// 인벤토리 번호(대상)
	unsigned short divide;							// 누눌수량
};

struct MSG_RES_ITEM_DIVIDE_INVENTORY : MSG_ERROR
{
	unsigned long RowCount;							// 영향받은 행 수
	sInventory    Inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_DIVIDE_INVENTORY) - sizeof(Inventory) + (RowCount * sizeof(sInventory)); }
};


/*-- 아이템 강화(인벤토리)
*/

/// MSG_REQ_ITEM_ENHANCED_START = MSGROOT

#define ERROR_ITEM_ENHANCED_START_SUCCESS		0	// 성공
#define ERROR_ITEM_ENHANCED_START_FAIL			1	// 실패
/// MSG_RES_ITEM_ENHANCED_START = MSG_ERROR

struct MSG_SYN_ITEM_ENHANCED_START : public MSGROOT
{
	unsigned long	mCharacterIdx;
};


struct MSG_REQ_ITEM_ENHANCED_END : MSGROOT
{
	unsigned short number1;							// 인벤토리 번호(강화아이템)
	unsigned short number2;							// 인벤토리 번호(소모아이템)
};

#define ERROR_ITEM_ENHANCED_END_SUCCESS	0	// 성공
#define ERROR_ITEM_ENHANCED_END_FAIL		1	// 실패
#define ERROR_ITEM_ENHANCED_END_NOTYET	2	// DB처리중

struct MSG_RES_ITEM_ENHANCED_END : MSG_ERROR
{
	sInventory Inventory[2];						// 인벤토리 (0강화장비/1강화카드)
};

struct MSG_SYN_ITEM_ENHANCED_END : public MSG_ERROR
{
	unsigned long	mCharacterIdx;
};

/// MSG_REQ_ITEM_ENHANCED_CANCEL = MSGROOT
#define ERROR_ITEM_ENHANCED_CANCEL_SUCCESS	0	/// 성공
#define ERROR_ITEM_ENHANCED_CANCEL_FAIL		1	/// 실패
/// MSG_RES_ITEM_ENHANCED_CANCEL = MSG_ERROR

struct MSG_SYN_ITEM_ENHANCED_CANCEL : MSGROOT
{
	unsigned long	mCharacterIdx;
};

/*-- 아이템 분해(인벤토리)
*/
#define ERROR_ITEM_DISJOINT_INVENTORY_SUCCESS	0	// 성공
#define ERROR_ITEM_DISJOINT_INVENTORY_FAIL		1	// 실패
#define ERROR_ITEM_DISJOINT_INVENTORY_NOTYET	2	// DB처리중

struct MSG_REQ_ITEM_DISJOINT_INVENTORY : MSGROOT
{
	unsigned short number;							// 인벤토리 번호(원본)
};
struct MSG_RES_ITEM_DISJOINT_INVENTORY : MSG_ERROR
{
	unsigned long RowCount;							// 영향받은 행 수
	sInventory    Inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_DISJOINT_INVENTORY) - sizeof(Inventory) + (RowCount * sizeof(sInventory)); }
};


/*-- 아이템 카드장착(인벤토리)
*/
#define ERROR_ITEM_PUT_CARD_INVENTORY_SUCCESS	0	// 성공
#define ERROR_ITEM_PUT_CARD_INVENTORY_FAIL		1	// 실패
#define ERROR_ITEM_PUT_CARD_INVENTORY_NOTYET	2	// DB처리중

struct MSG_REQ_ITEM_PUT_CARD_INVENTORY : MSGROOT
{
	unsigned short number1;							// 인벤토리 번호(장비)
	unsigned char  cardSlot;						// 인벤토리 카드슬롯 번호(1~5)
	unsigned short number2;							// 인벤토리 번호(카드)
};
struct MSG_RES_ITEM_PUT_CARD_INVENTORY : MSG_ERROR
{
	sInventory Inventory;							// 인벤토리
};


/*-- 아이템 체인지(인벤토리)
*/
#define ERROR_ITEM_CHANGE_INVENTORY_SUCCESS		0	// 성공
#define ERROR_ITEM_CHANGE_INVENTORY_FAIL		1	// 실패
#define ERROR_ITEM_CHANGE_INVENTORY_NOTYET		2	// DB처리중

struct MSG_REQ_ITEM_CHANGE_INVENTORY : MSGROOT
{
	unsigned short number;							// 인벤토리 번호
};
struct MSG_RES_ITEM_CHANGE_INVENTORY : MSG_ERROR
{
	unsigned long RowCount;							// 영향받은 행 수
	sInventory    Inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_CHANGE_INVENTORY) - sizeof(Inventory) + (RowCount * sizeof(sInventory)); }
};


/*-- 거래-사용자간
*/
#define ERROR_ITEM_EXCHANGE_ASK_SUCCESS			0	// 성공 - 신청후 대기중
#define ERROR_ITEM_EXCHANGE_ASK_FAIL			1	// 실패 - 대상이 없거나 오류인경우
#define ERROR_ITEM_EXCHANGE_ASK_EXIST			2	// 실패 - 이미 거래중
#define ERROR_ITEM_EXCHANGE_ASK_DISTANCE		3	// 실패 - 거리
#define ERROR_ITEM_EXCHANGE_ASK_OPTIONREFUSE	4	// 실패 - 상대방 거부상태
#define ERROR_ITEM_EXCHANGE_ASK_REPLAY			5	// 답변요청

struct MSG_REQ_ITEM_EXCHANGE_ASK : MSGROOT
{
	sObject mTarget;								// 거래 상대 캐릭터
};
struct MSG_RES_ITEM_EXCHANGE_ASK : MSG_ERROR
{
	unsigned long characterIdx;						// 거래 신청 캐릭터 - ERROR_ITEM_EXCHANGE_ASK_REPLAY 일때만...
};


#define TYPE_ITEM_EXCHANGE_REP_ACCEPT			0	// 승락
#define TYPE_ITEM_EXCHANGE_REP_REJECT			1	// 거절

#define ERROR_ITEM_EXCHANGE_REP_SUCCESS			0	// 성공 또는 요청 승락
#define ERROR_ITEM_EXCHANGE_REP_FAIL			1	// 실패 또는 요청 거절
#define ERROR_ITEM_EXCHANGE_REP_NOTEXIST		2	// 대상이 없음

struct MSG_REQ_ITEM_EXCHANGE_REP : MSGROOT
{
	BYTE type;									// 답변
};
struct MSG_RES_ITEM_EXCHANGE_REP : MSG_ERROR
{};


struct MSG_RES_ITEM_EXCHANGE_BEGIN : MSGROOT
{};


#define TYPE_ITEM_EXCHANGE_ADD_ITEM				0	// 거래아이템
#define TYPE_ITEM_EXCHANGE_ADD_MONEY			1	// 거래금  액

#define ERROR_ITEM_EXCHANGE_ADD_SUCCESS			0	// 성공
#define ERROR_ITEM_EXCHANGE_ADD_FAIL			1	// 실패

struct MSG_REQ_ITEM_EXCHANGE_ADD : MSGROOT
{
	BYTE type;									// 종류(아이템/금액)
	union
	{
		unsigned short number;					// 인벤토리 번호 (슬롯인덱스)
		unsigned long  money;					// 금액
	};
};
struct MSG_RES_ITEM_EXCHANGE_ADD : MSG_ERROR
{};
struct MSG_SYN_ITEM_EXCHANGE_ADD : MSGROOT
{
	BYTE type;									// 종류(아이템/금액)
	union
	{
		sInventory     inventory;				// 인벤토리
		unsigned long  money;					// 금액
	};
};


#define ERROR_ITEM_EXCHANGE_DEL_SUCCESS			0	// 성공
#define ERROR_ITEM_EXCHANGE_DEL_FAIL			1	// 실패

struct MSG_REQ_ITEM_EXCHANGE_DEL : MSGROOT
{
	unsigned short number;						// 인벤토리 번호 (슬롯인덱스)
};
struct MSG_RES_ITEM_EXCHANGE_DEL : MSG_ERROR
{};
struct MSG_SYN_ITEM_EXCHANGE_DEL : MSGROOT
{
	sInventory inventory;						// 인벤토리
};


#define ERROR_ITEM_EXCHANGE_OK_SUCCESS			0	// 성공
#define ERROR_ITEM_EXCHANGE_OK_FAIL				1	// 실패
#define ERROR_ITEM_EXCHANGE_OK_PLAYER			2	// 대상

struct MSG_REQ_ITEM_EXCHANGE_OK : MSGROOT
{};
struct MSG_RES_ITEM_EXCHANGE_OK : MSG_ERROR
{};


#define ERROR_ITEM_EXCHANGE_RETRY_SUCCESS		0	// 성공
#define ERROR_ITEM_EXCHANGE_RETRY_FAIL			1	// 실패
#define ERROR_ITEM_EXCHANGE_RETRY_PLAYER		2	// 대상

struct MSG_REQ_ITEM_EXCHANGE_RETRY : MSGROOT
{};
struct MSG_RES_ITEM_EXCHANGE_RETRY : MSG_ERROR
{};


#define ERROR_ITEM_EXCHANGE_CANCEL_SUCCESS		0	// 성공
#define ERROR_ITEM_EXCHANGE_CANCEL_FAIL			1	// 실패
#define ERROR_ITEM_EXCHANGE_CANCEL_PLAYER		2	// 대상

struct MSG_REQ_ITEM_EXCHANGE_CANCEL : MSGROOT
{};
struct MSG_RES_ITEM_EXCHANGE_CANCEL : MSG_ERROR
{};


#define ERROR_ITEM_EXCHANGE_END_SUCCESS			0	// 성공
#define ERROR_ITEM_EXCHANGE_END_FAIL			1	// 실패
#define ERROR_ITEM_EXCHANGE_END_WAIT			2	// 대기

struct MSG_REQ_ITEM_EXCHANGE_END : MSGROOT
{};
struct MSG_RES_ITEM_EXCHANGE_END : MSG_ERROR
{
	unsigned long RowCount;							// 영향받은 행 수
	sInventory    Inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_EXCHANGE_END) - sizeof(Inventory) + (RowCount * sizeof(sInventory)); }
};


/*-- 노점-판매
*/
#define ERROR_ITEM_STALL_SELL_SEARCH_SUCCESS	0	// 성공
#define ERROR_ITEM_STALL_SELL_SEARCH_FAIL		1	// 실패
#define ERROR_ITEM_STALL_SELL_SEARCH_NOTYET		2   // DB처리중

struct MSG_REQ_ITEM_STALL_SELL_SEARCH : MSGROOT
{
	unsigned long itemDefineIndex;					// 아이템 인덱스
	unsigned char enhanced;							// 강화단계
};
struct MSG_RES_ITEM_STALL_SELL_SEARCH : MSG_ERROR
{
	long rowCount;								// 영향받은 행 수
	struct {
		unsigned long  idx;						// 고유번호
		wchar_t	       characterName[ 17 ];		// 판매 캐릭터 이름
		unsigned long  price;					// 판매가격
		unsigned short mapNumber;				// 맵번호
		float          xPos;					// X위치
		float          yPos;					// Y위치
	} table[ 1 ];
};


#define ERROR_ITEM_STALL_SELL_OPEN_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_OPEN_FAIL			1	// 실패
#define ERROR_ITEM_STALL_SELL_OPEN_EXIST		2	// 이미 오픈중

struct MSG_REQ_ITEM_STALL_SELL_OPEN : MSGROOT
{
	wchar_t title[ MAX_STALL_TITLE_LEN ];			// 노점명
};
struct MSG_RES_ITEM_STALL_SELL_OPEN : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_OPEN : MSGROOT
{
	unsigned long characterIdx;						// 캐릭터 고유번호
	wchar_t       title[ MAX_STALL_TITLE_LEN ];		// 노점명
};


#define ERROR_ITEM_STALL_SELL_CLOSE_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_CLOSE_FAIL		1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_CLOSE : MSGROOT
{};
struct MSG_RES_ITEM_STALL_SELL_CLOSE : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_CLOSE : MSGROOT
{
	unsigned long characterIdx;						// 캐릭터 고유번호
};


#define ERROR_ITEM_STALL_SELL_RENAME_SUCCESS	0	// 성공
#define ERROR_ITEM_STALL_SELL_RENAME_FAIL		1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_RENAME : MSGROOT
{
	wchar_t title[ MAX_STALL_TITLE_LEN ];			// 노점명
};
struct MSG_RES_ITEM_STALL_SELL_RENAME : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_RENAME : MSGROOT
{
	unsigned long characterIdx;						// 캐릭터 고유번호
	wchar_t       title[ MAX_STALL_TITLE_LEN ];		// 노점명
};


#define ERROR_ITEM_STALL_SELL_ADD_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_ADD_FAIL			1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_ADD : MSGROOT
{
	unsigned short number;							// 인벤토리 번호(슬롯넘버)
	unsigned long  price;							// 판매가격
};
struct MSG_RES_ITEM_STALL_SELL_ADD : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_ADD : MSGROOT
{
	sInventory inventory;							// 인벤토리
	unsigned long price;							// 판매가격
};


#define ERROR_ITEM_STALL_SELL_DEL_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_DEL_FAIL			1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_DEL : MSGROOT
{
	unsigned short number;							// 인벤토리 번호(슬롯넘버)
};
struct MSG_RES_ITEM_STALL_SELL_DEL : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_DEL : MSGROOT
{
	sInventory inventory;							// 인벤토리
};


#define ERROR_ITEM_STALL_SELL_MOD_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_MOD_FAIL			1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_MOD : MSGROOT
{
	unsigned short number;							// 인벤토리 번호(슬롯넘버)
};
struct MSG_RES_ITEM_STALL_SELL_MOD : MSG_ERROR
{};
struct MSG_SYN_ITEM_STALL_SELL_MOD : MSGROOT
{
	sInventory inventory;							// 인벤토리
};

struct MSG_RES_ITEM_STALL_SELL_COM : MSGROOT
{
	wchar_t characterName[ 17 ];					// 구입자 이름
	sInventory inventory;							// 인벤토리
};

struct MSG_SYN_ITEM_STALL_SELL_DAT : MSGROOT
{
	sInventory    inventory;						// 인벤토리
	unsigned long price;							// 가격
};


#define ERROR_ITEM_STALL_SELL_JOIN_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_JOIN_FAIL			1	// 실패
#define ERROR_ITEM_STALL_SELL_JOIN_OVER			2	// 실패-인원제한

struct sStallSellData
{
	eStallSellItemStatus status;					// 상태
	sInventory           inventory;					// 인벤토리
	unsigned long        price;						// 가격
};

struct MSG_REQ_ITEM_STALL_SELL_JOIN : MSGROOT
{
	sObject mTarget;								// 타켓
};
struct MSG_RES_ITEM_STALL_SELL_JOIN : MSG_ERROR
{
	wchar_t        title[ MAX_STALL_TITLE_LEN ];	// 노점명

	BYTE           rowCount;						// 영향받은 행 수
	sStallSellData stallSellData[1];

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_STALL_SELL_JOIN) - sizeof(stallSellData) + (rowCount * sizeof(sStallSellData)); }
};


#define ERROR_ITEM_STALL_SELL_LEAVE_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_LEAVE_FAIL		1	// 실패
#define ERROR_ITEM_STALL_SELL_LEAVE_CLOSED		2	// 닫힘

struct MSG_REQ_ITEM_STALL_SELL_LEAVE : MSGROOT
{};
struct MSG_RES_ITEM_STALL_SELL_LEAVE : MSG_ERROR
{};


#define ERROR_ITEM_STALL_SELL_GET_SUCCESS		0	// 성공
#define ERROR_ITEM_STALL_SELL_GET_FAIL			1	// 실패

struct MSG_REQ_ITEM_STALL_SELL_GET : MSGROOT
{
	unsigned short number;							// 구매번호
	unsigned short count;							// 수량
};
struct MSG_RES_ITEM_STALL_SELL_GET : MSG_ERROR
{
	BYTE       RowCount;							// 영향받은 행 수
	sInventory Inventory;							// 인벤토리
};


/*-- 아이템 드롭&습득
*/
struct sItemDrop
{
	unsigned long idx;								// 고유번호
	float         xPos;								// X 위치
	float         yPos;								// Y 위치
};
struct sItemData
{
	unsigned long  itemDefineIndex;					// 아이템 정의 인덱스
	unsigned short count;							// 수량
};

// NM_ITEM_DROP_IN_SYN & NM_ITEM_SIGHT_IN_RES 참조
struct MSG_ITEM_INFO : MSGROOT
{
	unsigned long owner[ MAX_OWNER ];				// 드롭 아이템 소유자
	unsigned long timeToOwn;						// 드롭 아이템 소유권의 남은시간(1/1000s)

	sItemDrop     itemDrop;              			// 드롭 아이템 정보
};
// NM_ITEM_DROP_OUT_SYN & NM_ITEM_SIGHT_OUT_RES 참조
struct MSG_ITEMIDX : MSGROOT
{
	unsigned long idx;								// 고유번호
};


#define ERROR_ITEM_GET_OPEN_SUCCESS		0			// 성공
#define ERROR_ITEM_GET_OPEN_FAIL		1			// 실패
#define ERROR_ITEM_GET_OPEN_OWN         2           // 실패 - 소유권 오류
#define ERROR_ITEM_GET_OPEN_DISTANCE    3           // 실패 - 거  리 오류
#define ERROR_ITEM_GET_OPEN_EXIST       4           // 실패 - 열람중 오류

// NM_ITEM_GET_OPEN_REQ 참조
struct MSG_REQ_ITEM_GET_OPEN : public MSGROOT
{
	unsigned long idx;								// 고유번호
};
// NM_ITEM_GET_OPEN_RES 참조
struct MSG_RES_ITEM_GET_OPEN : public MSG_ERROR
{
	BYTE          rowCount;							// 영향받은 행 수
	sItemData     itemData[1];                      // 아이템 정보

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_ITEM_GET_OPEN) - sizeof(itemData) + (rowCount * sizeof(sItemData)); }
};
// MSG_SYN_ITEM_GET_OPEN 참조
struct MSG_SYN_ITEM_GET_OPEN : public MSGROOT
{
	unsigned long characterIdx;						// 캐릭터 고유번호
};


#define ERROR_ITEM_GET_CLOSE_SUCCESS	0			// 성공
#define ERROR_ITEM_GET_CLOSE_FAIL       1           // 실패

// NM_ITEM_GET_CLOSE_REQ 참조
struct MSG_REQ_ITEM_GET_CLOSE : public MSGROOT
{};
// NM_ITEM_GET_CLOSE_RES 참조
struct MSG_RES_ITEM_GET_CLOSE : public MSG_ERROR
{};
// NM_ITEM_GET_CLOSE_SYN 참조
struct MSG_SYN_ITEM_GET_CLOSE : public MSGROOT
{
	unsigned long characterIdx;						// 캐릭터 고유번호
};


#define ITEM_GET_ALL					(-1)		// 모두줍기
#define ERROR_ITEM_GET_SUCCESS			0			// 성공
#define ERROR_ITEM_GET_FAIL				1			// 실패
#define ERROR_ITEM_GET_AUTO				2			// 자동

// NM_ITEM_GET_REQ 참조
struct MSG_REQ_ITEM_GET : public MSGROOT
{
	unsigned long itemIndexOrInd;					// 아이템 정의 인덱스 또는 모두줍기
};
// NM_ITEM_GET_RES
struct MSG_RES_ITEM_GET : public MSG_ERROR
{
	BYTE       RowCount;							// 영향받은 행 수
	sInventory Inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_GET) - sizeof(Inventory) + (RowCount * sizeof(sInventory)); }
};

// NM_ITEM_GET_LEAVE_RES 참조
struct MSG_RES_ITEM_GET_LEAVE : public MSGROOT
{
	BYTE          rowCount;							// 영향받은 행 수
	sItemData     itemData[1];						// 아이템 정보

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_ITEM_GET_LEAVE) - sizeof(itemData) + (rowCount * sizeof(sItemData)); }
};

// NM_ITEM_GATHERING_OPEN_RES 참조
struct MSG_RES_ITEM_GATHERING_OPEN : public MSG_RES_ITEM_GET_OPEN
{};

// NM_ITEM_USE_RES 참고
struct MSG_RES_ITEM_USE : public MSGROOT
{
	sInventory inventory;							// 인벤토리
};

// NM_ITEM_REWARD_RES 참고
struct MSG_RES_ITEM_REWARD : public MSGROOT
{
	BYTE       rowCount;							// 영향받은 행 수
	sInventory inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_REWARD) - sizeof(inventory) + (rowCount * sizeof(inventory)); }
};

// NM_ITEM_MAKESKILL_RES , NM_ITEM_RECIPE_RES 참고
struct MSG_RES_MAKESKILL_ITEM : public MSGROOT
{
	sInventory inventory;						// 인벤토리
};

// NM_ITEM_TAKE_RES 참고
struct MSG_RES_ITEM_TAKE : public MSGROOT
{
	BYTE       rowCount;							// 영향받은 행 수
	sInventory inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_TAKE) - sizeof(inventory) + (rowCount * sizeof(inventory)); }
};


#define ERROR_ITEM_GET_QUEST_SUCCESS	0			// 성공
#define ERROR_ITEM_GET_QUEST_FAIL		1			// 실패

// NM_ITEM_GET_QUEST_RES 참고
struct MSG_RES_ITEM_GET_QUEST : public MSG_ERROR
{
	sInventory Inventory;							// 인벤토리
};


#define ERROR_ITEM_COLLECT_SUCCESS	0				// 성공
#define ERROR_ITEM_COLLECT_FAIL		1				// 실패
#define ERROR_ITEM_COLLECT_NOTYET	2				// DB처리중

// NM_ITEM_COLLECT_REG_REQ 참고
struct MSG_REQ_ITEM_COLLECT : public MSGROOT
{
	unsigned short number1;							// [in] 이동 전
	unsigned short number2;							// [in] 이동 전
};

struct MSG_RES_ITEM_COLLECT : public MSG_ERROR
{};


// NM_ITEM_MIXED_RES 참고
struct MSG_RES_ITEM_MIXED : public MSGROOT
{
	BYTE       rowCount;							// 영향받은 행 수
	sInventory inventory[1];						// 인벤토리

	// 실제보내는 메세지 크기
	unsigned long GetMsgLength( ) { return sizeof(MSG_RES_ITEM_MIXED) - sizeof(inventory) + (rowCount * sizeof(inventory)); }
};

#pragma pack(pop)
