/* ====================================================================
* 파    일 :	
* 목    적 :	
* 작 성 자 :	정원주
* 작 성 일 :	2006.09.28
*
* 추가내용 :
*		추가날짜	작업자	추가내용
*		2006.09.28	정원주	생성
* 
* 주의사항 :	
* =================================================================== */
#pragma once

#include "BaseObject_Common.h"
#include "Player_Common.h"
#include "float.h"

#include "sqltypes.h"

#pragma pack(push,1)


const unsigned short	PERCENT_THOUSAND = 1000;
const unsigned long		NORMAL_ATTACK_SKILL = 1;
const unsigned long		NORMAL_ATTACK_SKILL_MAX = 99;
const unsigned short	SECOND_THOUSAND = 1000;
const unsigned char		SKILL_START_STEP = 0;
const unsigned char		TARGET_MAX = 255;

enum eDAMAGE_KIND;

/// 스킬 분류
enum eSKILLTYPE
{
	eSKILLTYPE_PASSIVE = 1,				/// 패시브
	eSKILLTYPE_DAMAGE,					/// 액티브-데미지
	eSKILLTYPE_NONACTIVE,				/// 액티브-비공격형(효과생성)
	eSKILLTYPE_HEAL,					/// 액티브-힐
};

/// 몬스터 스킬 분류
enum eMONSTERSKILLTYPE
{
	eMONSTERSKILLTYPE_DAMAGE = 1,		/// 액티브-데미지
	eMONSTERSKILLTYPE_NONACTIVE,		/// 액티브-비공격형(효과생성)
	eMONSTERSKILLTYPE_HEAL,				/// 액티브-힐
};

enum eATTRIBUTETYPE
{
	eATTRIBUTETYPE_PHYSICAL = 1,		/// 물리
	eATTRIBUTETYPE_MAGIC,				/// 마법
};

enum eSHOTTYPE
{
	eSHOTTYPE_NONE = 0,					/// 없음
	eSHOTTYPE_SPOT,						///	즉시시전
	eSHOTTYPE_CASTING,					/// 캐스팅
	eSHOTTYPE_CHANNEL,					///	채널링
	eSHOTTYPE_AURA,						/// 오라 
};

enum eMONSTERSHOTTYPE
{
	eMONSTERSHOTTYPE_SPOT = 1,			///	즉시시전
	eMONSTERSHOTTYPE_CASTING,			/// 캐스팅
};

/// 스킬 발동시 범위 방식
enum eBOUNDTYPE
{
	eBOUNDTYPE_NONE = 0,				/// 범위 없음
	eBOUNDTYPE_SELF_TARGET,				/// 시전자(자신) 기준범위 - 발동시 타겟 존재
	eBOUNDTYPE_SELF_NOTARGET,			/// 시전자(자신) 기준범위 - 발동시 타겟 없어도 됨
	eBOUNDTYPE_TARGET,					/// 타겟 기준범위
	eBOUNDTYPE_FIELD,					/// 필드 기준범위
};


/// 효과를 적용받는 대상
enum eAPPLYTYPE
{
	eAPPLYTYPE_SELF = 1,				/// 시전자(자신)
	eAPPLYTYPE_ENEMY,					/// 적
	eAPPLYTYPE_BUDDY,					/// 동료
	eAPPLYTYPE_PARTY,					/// 파티
	eAPPLYTYPE_DIEBUDDY,				/// 죽은동료
};

enum eRANGETYPE
{
	eRANGETYPE_CLOSE = 1,				/// 근거리
	eRANGETYPE_LONG,					/// 원거리
};

enum eEQUIPTYPE
{
	eEQUIPTYPE_NONE = 0,
	eEQUIPTYPE_SWORD,
	eEQUIPTYPE_LONGSWORD,
	eEQUIPTYPE_DOUBLESWORD,
	eEQUIPTYPE_SHORTSWORD,
	eEQUIPTYPE_GUN,
	eEQUIPTYPE_STAFF,

	eEQUIPTYPE_SHIELD,
	eEQUIPTYPE_SWORD_LONGSWORD,
	eEQUIPTYPE_SWORD_DOUBLESWORD,
	eEQUIPTYPE_LONGSWORD_DOUBLESWORD,
	eEQUIPTYPE_SWORD_LONGSWORD_DOUBLESWORD,
	eEQUIPTYPE_SHORTSWORD_GUN,

	eEQUIPTYPE_CLOTH,
	eEQUIPTYPE_LIGHTARMOR,
	eEQUIPTYPE_HEAVYARMOR,
};

enum /* eINFLUENCETYPE */
{
	eINFLUENCETYPE_BUF = 1,		/// 버프
	eINFLUENCETYPE_DEBUF,		/// 디버프
};

enum /* eINFLUENCETYPEDETAIL */
{
	eINFLUENCETYPEDETAIL_BUILD = 1,		/// 강화
	eINFLUENCETYPEDETAIL_AURA,			/// 오라
	eINFLUENCETYPEDETAIL_MAGIC,			/// 마법
	eINFLUENCETYPEDETAIL_POTION,		/// 물약
	eINFLUENCETYPEDETAIL_TRAUMA = 101,	/// 외상
	eINFLUENCETYPEDETAIL_INJURY,		/// 손상
	eINFLUENCETYPEDETAIL_POISON,		/// 중독
	eINFLUENCETYPEDETAIL_MIND,			/// 정신
	eINFLUENCETYPEDETAIL_SANCTITY,		/// 신성
	eINFLUENCETYPEDETAIL_ELEMENT,		/// 원소
};

enum /* eSKILLRACE */
{
	eSKILLRACE_ALL = 0,
	eSKILLRACE_HUMAN,
	eSKILLRACE_BEAST,
	eSKILLRACE_ELF,
	eSKILLRACE_HUMAN_BEAST,
	eSKILLRACE_HUMAN_ELF,
	eSKILLRACE_BEAST_ELF,
};

enum eAURATYPE
{
	eAURATYPE_NONE,				/// 오라 효과 아님
	eAURATYPE_PARENT,			/// 오라 복사가 가능한 모체
	eAURATYPE_CHILD,			/// 오라 복사를 받은 자식
};


enum eMONSTERATTACK_TYPE
{
	eMONSTERATTACK_NORMAL1 = 0,
	eMONSTERATTACK_NORMAL2,

	eMONSTERATTACK_SKILL1,
	eMONSTERATTACK_SKILL2,
	eMONSTERATTACK_SKILL3,

	eMONSTERATTACK_MAX,
};

enum eMONSTERHPCHECK
{
	eMONSTERHPCHECK_NONE = 0,	/// 조건 없음
	eMONSTERHPCHECK_LOWHP40,	///	hp40%이하
	eMONSTERHPCHECK_LOWHP80,	/// hp80%이하
};

enum eSTATUS_PLUS;

/// skill의 단계별 정보
struct sPlayerSkillStepInfo
{
	/// 툴팁Index
	unsigned long	mToolTipIdx;
	/// SP필요값	
	unsigned short	mRequireSP;
	/// 직업 Index
	unsigned long	mJobType;
	/// 캐릭터 필요Lv	
	unsigned char	mPlayerLevel;
	/// 소모금액
	unsigned long	mUseMoney;
	/// 상태수치값	
	unsigned short	mUseStateValue;
	/// 소모MP값
	unsigned long	mUseMP;
	/// 소모HP값
	unsigned long	mUseHP;
	/// 소모아이템개수	
	unsigned char	mUseItemCount;
	/// 사거리
	float			mTargetDist;
	/// 캐스팅시간
	float			mCastingTime;
	/// 쿨타임	
	float			mCoolTime;
	/// 범위거리
	unsigned short	mBoundDist;
	/// 고유명중률	
	unsigned short	mAccuracyValue;
	/// 고유크리티컬	
	unsigned short	mCriticalValue;
	/// 고유어그로
	int				mDistressValue;
	/// 적용값 type1
	unsigned short	mApplyValueType1;
	/// 적용값1	
	int				mApplyValue1;
	/// 적용값 type2
	unsigned short	mApplyValueType2;
	/// 적용값2	
	int				mApplyValue2;

	/// 효과 Index
	unsigned long	mInfulenceIdx;

};

/// skill의 기본 정보
struct sPlayerSkillBaseInfo
{
	/// 스킬 종류Idx
	unsigned long	mSkillIdx;
	/// 스킬 이름Idx
	unsigned long	mNameIdx;
	/// 스킬 아이콘Idx
	unsigned long	mIconIdx;

	/// 스킬습득조건 - 종족
	unsigned char	mRace;
	/// 스킬습득조건 - 필요스킬idx 1
	unsigned long	mLearnSkillIdx1;
	/// 스킬습득조건 - 필요단계 1
	unsigned char	mLearnSkillStep1;
	/// 스킬습득조건 - 필요스킬idx 2
	unsigned long	mLearnSkillIdx2;
	/// 스킬습득조건 - 필요단계 2
	unsigned char	mLearnSkillStep2;
	/// 직업 단계
	unsigned char	mJobStep;
	/// 스킬습득조건 - 이전직업 요구 SP량
	unsigned long	mBeforeReqSP;
	/// 스킬사용조건 - 필요장비	eEQUIPTYPE
	unsigned char	mUseEquipment;
	/// 스킬사용조건 - 캐릭터상태
	unsigned char	mUseState;
	/// 스킬사용조건 - 소모아이템
	unsigned long	mUseItem;

	/// 스킬속성 - 분류
	eSKILLTYPE		mType;
	/// 스킬속성 - 속성유형
	eATTRIBUTETYPE	mAttributeType;
	/// 스킬속성 - 시전유형
	eSHOTTYPE		mShotType;
	/// 스킬속성 - 범위방식
	eBOUNDTYPE		mBoundType;
	/// 스킬속성 - 효과적용타겟
	eAPPLYTYPE		mApplyType;
	/// 스킬속성 - 거리유형
	eRANGETYPE		mRangeType;

	/// 스킬속성 - 글로벌쿨타임 적용 여부
	bool			mIsGlobalCoolTime;

	/// 스킬속성 - 그룹쿨타임 번호
	unsigned int	mGroupCoolTimeIdx;

	/// 스킬의 단계별정보를 정의
	unsigned int			mStepCount;
	sPlayerSkillStepInfo*	mpSetpInfoArray;

	sPlayerSkillBaseInfo()
	{
		mStepCount = 0;
		mpSetpInfoArray = 0;
	}
	~sPlayerSkillBaseInfo()
	{
		SAFE_DELETE_ARRAY(mpSetpInfoArray);
	}
};


struct sMonsterSkillScript
{
	/// 몬스터Idx
	unsigned long	mMonsterIdx;
	/// 공격방식
	eMONSTERATTACK_TYPE		mAttackType;
	/// Drama file name
	cString					mDramaFile;
	/// 툴팁Idx
	unsigned long	mToolTipIdx;
	/// 스킬 분류
	eMONSTERSKILLTYPE	mType;
	/// 속성유형
	eATTRIBUTETYPE	mAttributeType;
	/// 거리유형
	eRANGETYPE		mRangeType;
	/// 공격력(소)
	unsigned long	mMinAttackValue;
	/// 공격력(대)
	unsigned long	mMaxAttackValue;
	/// 고유명중률
	unsigned short	mAccuracyValue;
	/// 고유크리티컬
	unsigned short	mCriticalValue;
	/// 사용조건(HP)
	eMONSTERHPCHECK	mUseHPCheck;
	/// 사용조건(소모MP)
	unsigned long	mUseMP;
	/// 사거리
	float			mTargetDist;
	/// 공격속도 
	float			mAttackSpd;
	/// 쿨타임
	float			mCoolTime;
	/// 사용확률
	unsigned char	mSkillUsePer;
	/// 시전유형
	eMONSTERSHOTTYPE	mShotType;
	/// 범위방식
	eBOUNDTYPE		mBoundType;
	/// 범위거리
	unsigned short	mBoundDist;
	/// 효과적용타겟
	eAPPLYTYPE		mApplyType;
	/// 캐스팅시간
	float			mCastingTime;
	/// 효과번호1
	unsigned short	mApplyValueType1;
	/// 효과값1
	int				mApplyValue1;
	/// 효과번호2
	unsigned short	mApplyValueType2;
	/// 효과값2
	int				mApplyValue2;
	/// 효과Idx
	unsigned long	mInfulenceIdx;
};



struct sTargetDamage
{
	sObject			mTarget;
	unsigned long	mDamage;
	eDAMAGE_KIND	mDamageKind;
	unsigned long	mObjectHP;
	unsigned long	mObjectMaxHP;
	bool			mDie;
	bool			mInfluenceMiss;			/// 효과 생성시 실패 유무
	bool			mIsOnlyClientObjectDel;	/// 타겟은 이미 죽었고 클라이언트 객체만 지우기 위함
};



struct sTargetHeal
{
	sObject			mTarget;
	unsigned long	mHeal;
	unsigned long	mObjectHP;
	unsigned long	mObjectMaxHP;
	bool			mInfluenceMiss;			/// 효과 생성시 실패 유무
};


struct sTargetApply
{
	sObject			mTarget;
	bool			mInfluenceMiss;			/// 효과 생성시 실패 유무
};


struct sInfluenceScript
{
	/// 효과Idx
	unsigned long	mInfluenceIdx;
	/// 효과 연출 파일명
	cString			mDramaturgyFile;
	/// 이름Idx
	unsigned long	mNameidx;
	/// 효과아이콘Idx
	unsigned long	mIconIdx;
	/// 툴팁효과Idx
	unsigned long	mToolTipIdx;
	/// 속성
	unsigned char	mType;			/// eINFLUENCETYPE
	/// 분류
	unsigned char	mTypeDetail;	/// eINFLUENCETYPEDETAIL
	/// 죽는경우 효과제거
	bool			mDieDelete;
	/// 효력 그룹
	unsigned long	mGroupIdx;
	/// 효력
	unsigned long	mGroupOrder;
	/// 중복불가그룹
	unsigned long	mNotOverlapGroupIdx;
	/// 지속(채널링)시간
	float			mContinuanceTime;
	/// 발동확률
	unsigned char	mActivityPer;
	/// 지속효과번호1
	unsigned short	mStatusPlusIdx1;
	/// 시간1
	float			mTime1;
	/// 효과값1
	long			mValue1;
	/// 지속효과번호2
	unsigned short	mStatusPlusIdx2;
	/// 시간2
	unsigned long	mTime2;
	/// 효과값2
	long			mValue2;
	/// 지속효과번호3
	unsigned short	mStatusPlusIdx3;
	/// 효과값3
	long			mValue3;
};



/// 스킬
struct sHaveSkill
{
	unsigned long	mSkillIdx;				/// 스킬 인덱스 
	unsigned char	mSkillStep;				/// 스킬 단계
	float			mRestCoolTime;			/// 쿨타임 남은 시간
};

struct sHaveSkillCoolTime 
{
	unsigned long	mSkillIdx;				/// 스킬 인덱스
	float			mRestCoolTime;			/// 쿨타임 남은 시간
};


/// 효과
struct sInfluence
{
	unsigned long	mUniqueIdx;
	unsigned long	mDbIdx;
	unsigned long	mInfluenceClassIdx;
	sObject			mAttacker;
	bool			mIsRealTime;
	float			mRestTime;
	TIMESTAMP_STRUCT	mStartDate;
	TIMESTAMP_STRUCT	mEndDate;
	float			mTime1;
	float			mTime2;
	eAURATYPE		mAuraType;				///	오라 형태
	unsigned long	mParentUniqueIdx;		/// 부모 오라의 uniqueidx
	unsigned short	mAuraRange;				/// 오라 범위
};

/// 클라이언트 전송용 효과
struct sInfluenceClient
{
	unsigned long	mUniqueIdx;				/// 효과 고유 번호
	unsigned long	mInfluenceClassIdx;		/// 효과 종류 번호
	unsigned long	mAuraSkillClassIdx;		/// 오라 스킬 인덱스
	float			mRestTime;				/// 효과 남은 시간

	sInfluenceClient()
	{
		memset( this, 0, sizeof(sInfluenceClient) );
	}
};

/// 클라이언트 전송용 효과시간
struct sInfluenceTimeClient
{
	unsigned long	mUniqueIdx;
	float			mRestTime;				/// 효과 남은 시간
};

/*

/// 클라이언트에서 서버에 타겟 중심 스킬 요청 
struct MSG_REQ_SKILL_USED : public MSGROOT
{
	unsigned long	mSkillClassIndex;		/// 스킬 종류index
	unsigned long	mManagedKey;			/// 클라이언트에서 생성된 임시 고유키
	sObject			mTarget;				/// 타겟 정보
	float			mClientPosX;			/// 공격자 위치 좌표
	float			mClientPosY;
};
/// 타겟중심의 스킬(+일반공격) 싱크
struct MSG_SYN_SKILL_USED : public MSGROOT
{
	unsigned long	mSkillClassIndex;		/// 스킬 종류index
	unsigned long	mSkillIndex;			/// 스킬 고유index
	sObject			mAttacker;				/// 공격자 정보
	float			mAttackerPosX;			/// 공격자 좌표
	float			mAttackerPosY;
	float			mAttackSpeedFactor;		/// 공격속도
	sObject			mTarget;				/// 타겟 정보
	float			mTargetPosX;			/// 타겟 좌표
	float			mTargetPosY;
	unsigned long	mObjectMP;				/// 공격자의 mp수치
	unsigned long	mObjectMaxMP;
};


/// 몬스터 - 타겟중심의 스킬(+일반공격) 싱크
struct MSG_SYN_MONSTER_SKILL_USED : public MSGROOT
{
	unsigned long			mSkillIndex;			/// 스킬 고유index
	eMONSTERATTACK_TYPE		mAttackType;			/// 공격방식
	sObject					mAttacker;				/// 공격자 정보
	float					mAttackerPosX;			/// 몬스터 좌표
	float					mAttackerPosY;
	float					mAttackSpeedFactor;		/// 공격속도
	sObject					mTarget;				/// 타겟 정보
};


/// 클라이언트에서 서버에 좌표 중심 스킬 요청 
struct MSG_REQ_POS_USED : public MSGROOT
{
	unsigned long	mSkillClassIndex;		/// 스킬 종류index
	unsigned long	mManagedKey;			/// 클라이언트에서 생성된 임시 고유키
	float			mTargetPosX;			/// 타겟(필드) 좌표
	float			mTargetPosY;
	float			mClientPosX;			/// 공격자 위치 좌표
	float			mClientPosY;
};
/// 좌표중심의 스킬 싱크
struct MSG_SYN_POS_USED : public MSGROOT
{
	unsigned long	mSkillClassIndex;		/// 스킬 종류index
	unsigned long	mSkillIndex;			/// 스킬 고유index
	unsigned long	mManagedKey;			/// 클라이언트에서 생성된 임시 고유키
	sObject			mAttacker;				/// 공격자 정보
	float			mAttackerPosX;			/// 공격자 좌표
	float			mAttackerPosY;
	float			mTargetPosX;			/// 타겟(필드) 좌표
	float			mTargetPosY;
	unsigned long	mObjectMP;				/// 공격자의 mp수치
	unsigned long	mObjectMaxMP;
};

const int SKILL_USED_ERR_SUCCESS = 0;
const int SKILL_USED_ERR_SKILLTYPE = 1;			/// 스킬 종류 / 인덱스가 틀림
const int SKILL_USED_ERR_SCRIPT = 2;			/// 스크립트 오류
const int SKILL_USED_ERR_UNIQUEIDX = 3;			/// 스킬 객체 고유번호 오류
const int SKILL_USED_ERR_OBJECTINIT = 4;		/// 스킬 객체 초기화 실패

const int SKILL_USED_ERR_ATTAKCERPOS = 101;		/// 공격자 위치가 안맞음
const int SKILL_USED_ERR_USING = 102;			/// 스킬 사용중
const int SKILL_USED_ERR_TARGETDIST = 103;		/// 스킬 사거리밖에 타겟
const int SKILL_USED_ERR_COOLTIME = 104;		/// 쿨타임
const int SKILL_USED_ERR_ATTACKERSTATE = 105;	/// 공격자 상태 변경 불가
const int SKILL_USED_ERR_USEVALUE = 106;		/// 소모값 부족
const int SKILL_USED_ERR_TARGETOBJECT = 107;	/// 타겟 객체 오류
const int SKILL_USED_ERR_TARGETSELECT = 108;	/// 타겟선정 오류
const int SKILL_USED_ERR_PASSIVE = 109;			/// 패시브 사용
const int SKILL_USED_ERR_DONTHAVE = 110;		/// 보유스킬이 아님
const int SKILL_USED_ERR_EQUIPMENT = 111;		/// 장비 오류

/// 스킬(+일반공격) 성공/실패
struct MSG_RES_SKILL_USED : public MSG_ERROR
{
	unsigned long	mSkillClassIndex;		/// 스킬 종류index
	unsigned long	mSkillIndex;			/// 스킬 고유index
	unsigned long	mManagedKey;			/// 클라이언트에서 생성된 임시 고유키
	unsigned long	mObjectMP;				/// 공격자의 mp수치
};


/// 타겟 중심의 캐스팅 스킬 발동 싱크 
struct MSG_SYN_SKILL_CAST_ACTIVE : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index
	sObject			mAttacker;				/// 공격자 정보
	float			mAttackerPosX;			/// 공격자 좌표
	float			mAttackerPosY;
	unsigned long	mObjectMP;				/// 공격자의 mp수치
	unsigned long	mObjectMaxMp;
};


/// 스킬 캐스팅 실패
#define FAIL_SKILL_CASTING_MP_EMPTY		1	/// 사용조건 부족
#define FAIL_SKILL_CASTING_DONT_TARGET	2	/// 타겟이 없다.

struct MSG_SYN_SKILL_CAST_ACTIVITY_FAIL : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index
	unsigned char	mFailCode;				/// 스킬 실패 코드
};

struct MSG_REQ_SKILL_CAST_CANCEL : public MSGROOT
{
	sObject			mAttacker;				/// 캐스팅 시전자 정보
};

/// 캐스팅 취소 응답 메세지는 취소 성공시에만 발송된다.
struct MSG_RES_SKILL_CAST_CANCEL : public MSGROOT	
{
	unsigned long	mSkillIndex;			/// 스킬 고유index
};

struct MSG_SYN_SKILL_CAST_CANCEL : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index
};

struct MSG_SYN_SKILL_DAMAGE : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index

	eOBJECTTYPE		mAttackerType;

	unsigned long	mSkillClassIndex;
	unsigned long	mDramaKey;				/// (player: race/gender/weapon) || (monster : class index)
	
	unsigned char	mTargetCount;			/// 데미지를 받는 타겟의 갯수
	sTargetDamage	mTargetDamage[1];		/// 데미지 정보

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_SKILL_DAMAGE) - sizeof(mTargetDamage) + (mTargetCount * sizeof(sTargetDamage)); }
};


struct MSG_SYN_SKILL_HEAL : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index

	eOBJECTTYPE		mAttackerType;

	unsigned long	mSkillClassIndex;
	unsigned long	mDramaKey;				/// (player: race/gender/weapon) || (monster : class index)

	unsigned char	mTargetCount;			/// 힐을 받는 타겟의 갯수
	sTargetHeal		mTargetHeal[1];			/// 힐 정보

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_SKILL_HEAL) - sizeof(mTargetHeal) + (mTargetCount * sizeof(sTargetHeal)); }
};


struct MSG_SYN_SKILL_APPLY : public MSGROOT
{
	unsigned long	mSkillIndex;			/// 스킬 고유index

	eOBJECTTYPE		mAttackerType;

	unsigned long	mSkillClassIndex;
	unsigned long	mDramaKey;				/// (player: race/gender/weapon) || (monster : class index)

	unsigned char	mApplyCount;			/// 적용을 받는 타겟의 갯수
	sTargetApply	mApplyObject[1];		/// 적용 오브젝트 정보

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_SKILL_APPLY) - sizeof(mApplyObject) + (mApplyCount * sizeof(sTargetApply)); }
};


/// 스킬 발동 실패시 좌표 보간
struct MSG_RES_SKILL_POS : public MSGROOT
{
	sObject			mAttacker;				/// 공격자 정보
	float			mAttackerPosX;			/// 공격자 좌표
	float			mAttackerPosY;
	sObject			mTarget;				/// 자겟 정보
	float			mTargetPosX;			/// 타겟 좌표
	float			mTargetPosY;
};



struct MSG_SYN_INFLUENCE_CREATE : public MSGROOT
{
	sObject			mTarget;
	unsigned long	mUniqueIdx;
	unsigned long	mInfluenceClassIdx;
	unsigned long	mAuraSkillClassIdx;

	MSG_SYN_INFLUENCE_CREATE()
	{
		memset( this, 0, sizeof( MSG_SYN_INFLUENCE_CREATE ) );
	}
};



struct MSG_SYN_INFLUENCE_UPDATE : public MSGROOT
{
	unsigned long	mUniqueIdx;
	unsigned long	mInfluenceClassIdx;
};



struct MSG_REQ_INFLUENCE_DELETE : public MSGROOT
{
	unsigned long	mUniqueIdx;
};

struct MSG_RES_INFLUENCE_DELETE : public MSGROOT
{
	unsigned long	mUniqueIdx;
};

struct MSG_SYN_INFLUENCE_DELETE : public MSGROOT
{
	sObject			mTarget;
	unsigned long	mUniqueIdx;	
	unsigned long	mAuraSkillClassIdx;

	MSG_SYN_INFLUENCE_DELETE()
	{
		memset( this, 0, sizeof( MSG_SYN_INFLUENCE_DELETE ) );
	}
};


struct MSG_SYN_INFLUENCE_DAMAGE_HP : public MSGROOT
{
	sObject			mTarget;
	unsigned long	mUniqueIdx;
	unsigned long	mTargetHP;
	bool			mTargetDie;
};

struct MSG_SYN_INFLUENCE_DAMAGE_MP : public MSGROOT
{
	sObject			mTarget;
	unsigned long	mUniqueIdx;
	unsigned long	mTargetMP;
};


struct MSG_SYN_INFLUENCE_RESTORE : public MSGROOT
{
	long			mRowCount;			/// 보유 효과 갯수
	sObject			mTarget;				/// 타겟 정보
	sInfluenceClient	mTable[1];			/// 보유 효과 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_INFLUENCE_RESTORE) - sizeof(mTable) + (mRowCount * sizeof(sInfluenceClient)); }
};

struct MSG_RES_SKILL_LIST : public MSGROOT
{
	long			mRowCount;			/// 보유스킬 갯수
	sHaveSkill		mTable[1];			/// 보유스킬 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_SKILL_LIST) - sizeof(mTable) + (mRowCount * sizeof(sHaveSkill)); }
};

struct MSG_RES_SKILLCOOLTIME_LIST : public MSGROOT
{
	long			mRowCount;			/// 보유스킬 쿨타임 갯수
	sHaveSkillCoolTime	mTable[1];		/// 보유스킬 쿨타임 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_SKILLCOOLTIME_LIST) - sizeof(mTable) + (mRowCount * sizeof(sHaveSkillCoolTime)); }
};

struct MSG_RES_INFLUENCE_LIST : public MSGROOT
{
	long			mRowCount;			/// 보유효과 갯수
	sInfluenceClient	mTable[1];		/// 보유효과 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_INFLUENCE_LIST) - sizeof(mTable) + (mRowCount * sizeof(sInfluenceClient)); }
};

struct MSG_SYN_INFLUENCE_ADDLIST : public MSGROOT
{
	sObject			mObject;
	long			mRowCount;			/// 보유효과 갯수
	sInfluenceClient	mTable[1];		/// 보유효과 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_INFLUENCE_ADDLIST) - sizeof(mTable) + (mRowCount * sizeof(sInfluenceClient)); }
};

struct MSG_SYN_INFLUENCE_DELLIST : public MSGROOT
{
	sObject			mObject;
	long			mRowCount;		/// 보유효과 갯수
	unsigned long	mUniqueIdx[1];		/// 보유효과 리스트

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

struct MSG_RES_INFLUENCETIME_LIST : public MSGROOT
{
	long			mRowCount;			/// 보유효과 갯수
	sInfluenceTimeClient	mTable[1];	/// 보유효과 리스트

	/// 실제보내는 메세지 크기
	unsigned long GetMsgLength() { return sizeof(MSG_RES_INFLUENCETIME_LIST) - sizeof(mTable) + (mRowCount * sizeof(sInfluenceClient)); }
};

const unsigned char SKILL_ADD_ERR_SUCCESS = 0;
const unsigned char	SKILL_ADD_ERR_DBERROR = 1;
const unsigned char SKILL_ADD_ERR_PLAYER = 2;
const unsigned char SKILL_ADD_ERR_SCRIPT = 3;
const unsigned char SKILL_ADD_ERR_MAPINSERT = 4;

const unsigned char SKILL_ADD_ERR_MONEY = 101;			/// 소지금액 부족
const unsigned char SKILL_ADD_ERR_SP = 102;				/// skill point 부족
const unsigned char SKILL_ADD_ERR_SKILLSTEP = 103;		/// 스킬 습득 단계 오류
const unsigned char SKILL_ADD_ERR_LEARNSKILL = 104;		/// 선행 보유 스킬 오류
const unsigned char SKILL_ADD_ERR_LEARNSTEP = 105;		/// 선행 보유 스킬 단계 오류
const unsigned char SKILL_ADD_ERR_RACE = 106;			/// 종족 오류
const unsigned char SKILL_ADD_ERR_JOB = 107;			/// 직업 오류
const unsigned char SKILL_ADD_ERR_LEVEL = 108;			/// 레벨 오류
const unsigned char SKILL_ADD_ERR_ALREADY = 109;		/// 이미 배운 스킬을 다시 배우려함

struct MSG_RES_SKILL_ADD : public MSGROOT
{
	unsigned long	mSkillClassIdx;
	unsigned char	mSkillStep;
};

struct MSG_REQ_SKILL_ADD : public MSGROOT
{
	unsigned long	mSkillClassIdx;
	unsigned char	mSkillStep;
};

struct MSG_SYN_SKILL_INFLUENCE_HPCHANGE : public MSGROOT
{
	unsigned long	mInfluenceIdx;	/// 효과 고유번호
	sObject			mTarget;		/// 타겟
	long			mChangeValue;	/// 변동값
	unsigned long	mObjectHP;		/// 타겟 hp
	unsigned long	mObjectMaxHP;	/// 타겟 최대 hp
	bool			mDie;			
};

struct MSG_SYN_SKILL_INFLUENCE_MPCHANGE : public MSGROOT
{
	unsigned long	mInfluenceIdx;	/// 효과 고유번호
	sObject			mTarget;		/// 타겟
	long			mChangeValue;	/// 변동값
	unsigned long	mObjectMP;		/// 타겟 mp
	unsigned long	mObjectMaxMP;	/// 타겟 최대 mp
};

struct MSG_SYN_SKILL_NONSKILL_HPCHANGE : public MSGROOT
{
	unsigned long	mInfluenceClassIdx;		/// 효과 종류 번호
	sObject			mTarget;				/// 타겟
	long			mChangeValue;			/// 변동값
	unsigned long	mObjectHP;				/// 타겟 hp
	unsigned long	mObjectMaxHP;			/// 타겟 최대 hp
};

struct MSG_SYN_SKILL_NONSKILL_MPCHANGE : public MSGROOT
{
	unsigned long	mInfluenceClassIdx;		/// 효과 종류 번호
	sObject			mTarget;				/// 타겟
	long			mChangeValue;			/// 변동값
	unsigned long	mObjectMP;				/// 타겟 mp
	unsigned long	mObjectMaxMP;			/// 타겟 최대 mp
};

struct MSG_SYN_SKILL_RESURRECTION : public MSGROOT
{
	sObject				mTarget;		/// 부활된 타겟
	unsigned long		mTargetHP;		/// hp회복량
	unsigned long		mTargetMaxHp;
	unsigned long		mTargetMP;		/// mp회복량
	unsigned long		mTargetMaxMp;
};
*/
#pragma pack(pop)
