/* ==========================================================================
* 작 성 자 : 이순규
* 작 성 일 : 2008.06.04
* 내    용 : 
* 주의사항 : 
*===========================================================================*/
#pragma once

#pragma pack( push, 1 )
#include "CommonDefines.h"
#include "CommonNetworkMsgStruct.h"
#include "Item_Common.h"

enum eCHEAT_SPEEDUP
{
	eCHEATSPEEDUP_NONE = 0,
	eCHEATSPEEDUP_50UP,
	eCHEATSPEEDUP_100UP,
	eCHEATSPEEDUP_150UP,
	eCHEATSPEEDUP_200UP,
	eCHEATSPEEDUP_250UP,

	eCHEATSPEEDUP_MAX,

};

const int ERROR_CHEAT_NO_ERROR = 0;
const int ERROR_CHEAT_ALREADY_RUN = 1;
const int ERROR_CHEAT_UNKNOWN_USER = 2;

/// 입장
struct MSG_REQ_CHEAT_IN : public MSGROOT
{
};

struct MSG_RES_CHEAT_IN : public MSGROOT
{
};

struct MSG_SYN_CHEAT_IN : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
};

/// 속도 증가
struct MSG_REQ_CHEAT_SPEEDUP : public MSGROOT
{
	eCHEAT_SPEEDUP		mSpeedUp;
};

/// 귓말
struct MSG_REQ_CHEAT_EAR : public MSGROOT
{
	bool mMode;
};

struct MSG_RES_CHEAT_EAR : public MSGROOT
{
	bool mMode;
};

/// 투명
struct MSG_REQ_CHEAT_HIDE : public MSGROOT
{
	bool mMode;
};

struct MSG_RES_CHEAT_HIDE : public MSGROOT
{
	bool mMode;
};

struct MSG_SYN_CHEAT_HIDE_ON : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
};

/// 무적
struct MSG_REQ_CHEAT_UNDEAD : public MSGROOT
{
	bool mMode;
};

struct MSG_RES_CHEAT_UNDEAD : public MSGROOT
{
	bool mMode;
};

/// 정보
struct MSG_REQ_CHEAT_INFO : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_RES_CHEAT_INFO : public MSGROOT
{
	wchar_t mUserID[MAX_ID_BUFFER_SIZE]; /// 아이디
	unsigned short mMapNum; /// 맵 번호
	float mPosX; /// 좌표
	float mPosY;
	unsigned int mJob; /// 직업
	unsigned char mLevel; /// 레벨
	unsigned long mMoney; /// 돈
	/// 길드
};

/// 감시
struct MSG_REQ_CHEAT_WATCH : public MSGROOT
{
	bool mMode;
};

struct MSG_RES_CHEAT_WATCH : public MSGROOT
{
	bool mMode;
};

/// 접속 종료
struct MSG_REQ_CHEAT_KICK : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

const int ERROR_CHEAT_KICK_SUCCESS = 0;
const int ERROR_CHEAT_KICK_FAIL = 1;

struct MSG_RES_CHEAT_KICK : public MSGROOT
{
};

struct MSG_RES_CHEAT_KICK_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

/// 회복
struct MSG_REQ_CHEAT_RECOVER : public MSGROOT
{
};

struct MSG_RES_CHEAT_RECOVER : public MSGROOT
{
	unsigned long mMaxHP; /// HP
	unsigned long mMaxMP; /// MP
};

struct MSG_SYN_CHEAT_RECOVER : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
	unsigned long mMaxHP; /// HP
	unsigned long mMaxMP; /// MP
};

/// 부활
struct MSG_REQ_CHEAT_REBIRTH : public MSGROOT
{
};

struct MSG_RES_CHEAT_REBIRTH : public MSGROOT
{
	unsigned long mMaxHP; /// HP
	unsigned long mMaxMP; /// MP
};

struct MSG_SYN_CHEAT_REBIRTH : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
	unsigned long mMaxHP; /// HP
	unsigned long mMaxMP; /// MP
};

/// 순간이동
struct MSG_REQ_CHEAT_TELEPORT : public MSGROOT
{
	float mStartX; /// 시작 지점
	float mStartY;
	float mDestX; /// 목표 지점
	float mDestY;
};

struct MSG_SYN_CHEAT_TELEPORT : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
	float mDestX; /// 목표 지점
	float mDestY;
};

/// 가기
struct MSG_REQ_CHEAT_GO : public MSGROOT
{
	unsigned char mMapNum; /// 맵 번호
	float mDestX; /// 목표 지점
	float mDestY;
};

/// 추적
struct MSG_REQ_CHEAT_CHASE : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_RES_CHEAT_CHASE_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

/// 이동
struct MSG_REQ_CHEAT_MOVE : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
	unsigned char mMapNum; /// 맵 번호
	float mDestX; /// 목표 지점
	float mDestY;
};

struct MSG_RES_CHEAT_MOVE_GM: public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

/// 소환
struct MSG_REQ_CHEAT_CALL : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_RES_CHEAT_CALL_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

/// 채팅 금지
struct MSG_REQ_CHEAT_NO_CHAT : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
	unsigned long mDuration; /// 지속 시간 (분)
};

struct MSG_RES_CHEAT_NO_CHAT_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_SYN_CHEAT_NO_CHAT : public MSGROOT
{
};

/// 채팅 허용
struct MSG_REQ_CHEAT_ALLOW_CHAT : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_RES_CHEAT_ALLOW_CHAT_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_SYN_CHEAT_ALLOW_CHAT : public MSGROOT
{
};

/// 정지
struct MSG_REQ_CHEAT_STOP : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
	unsigned long mDuration; /// 지속 시간 (밀리초)
};

struct MSG_RES_CHEAT_STOP_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

const int ERROR_CHEAT_STOP_SUCCESS = 0; /// 성공
const int ERROR_CHEAT_STOP_FAIL = 1; /// 실패
const int ERROR_CHEAT_STOP_NOT = 2; /// 치트 정지상태 아님

struct MSG_SYN_CHEAT_STOP : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
};

/// 정지 해제
struct MSG_REQ_CHEAT_CANCEL_STOP : public MSGROOT
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_RES_CHEAT_CANCEL_STOP_GM : public MSG_ERROR
{
	wchar_t mCharName[MAX_NAME_BUFFER_SIZE]; /// 캐릭터 명
};

struct MSG_SYN_CHEAT_CANCEL_STOP : public MSGROOT
{
	unsigned long mObjIndex; /// 오브젝트 인덱스
};

/// 서버 공지
struct MSG_REQ_CHEAT_NOTICE_SERVER : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_REQ_CHEAT_NOTICE_SERVER) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

struct MSG_SYN_CHEAT_NOTICE_SERVER : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_CHEAT_NOTICE_SERVER) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

/// 채널 공지
struct MSG_REQ_CHEAT_NOTICE_CHANNEL : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_REQ_CHEAT_NOTICE_CHANNEL) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

struct MSG_SYN_CHEAT_NOTICE_CHANNEL : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_CHEAT_NOTICE_CHANNEL) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

/// 지역 공지
struct MSG_REQ_CHEAT_NOTICE_AREA : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_REQ_CHEAT_NOTICE_AREA) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

struct MSG_SYN_CHEAT_NOTICE_AREA : public MSGROOT
{
	wchar_t mMessage[MAX_CHAT_BUFFER_SIZE]; /// 메시지
	unsigned long GetMsgLength() { return sizeof(MSG_SYN_CHEAT_NOTICE_AREA) - sizeof(mMessage) + ::wcslen(mMessage)*sizeof(wchar_t); }
};

/// 아이템 제거
struct MSG_REQ_CHEAT_REMOVE_ITEM : public MSGROOT
{
};

/// 몬스터 제거
struct MSG_REQ_CHEAT_REMOVE_MONSTER : public MSGROOT
{
};

/// 레벨업
struct MSG_REQ_CHEAT_LEVELUP : public MSGROOT
{
	unsigned char mAddedValue; /// 더할 값
};

/// 스킬업
struct MSG_REQ_CHEAT_SKILLUP : public MSGROOT
{
	unsigned char mAddedValue; /// 더할 값
};

/// 아이템 생성
struct MSG_REQ_CHEAT_MAKE : public MSGROOT
{
	unsigned long mItemIndex;	/// 아이템 인덱스
	unsigned short mCount;		/// 수량
	unsigned char mEnhance;		/// 강화( 0 ~ 15 )

	/// 카드장착
	unsigned long mCardSlot[5];	/// 장착한 카드정보
};

const int ERROR_CHEAT_MAKE_SUCCESS = 0; /// 성공
const int ERROR_CHEAT_MAKE_FAIL = 1; /// 실패
const int ERROR_CHEAT_MAKE_NOTYET = 2; /// DB사용중

struct MSG_RES_CHEAT_MAKE : public MSG_ERROR
{
	BYTE       rowCount;		// 영향받은 행 수
	sInventory inventory[1];	// 인벤토리

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

/// 돈 생성
struct MSG_REQ_CHEAT_GOLD : public MSGROOT
{
	unsigned long mValue; /// 더할 값
};

/// 몬스터를 소환
struct MSG_REQ_CHEAT_SUMMON : public MSGROOT
{
	unsigned long mMonsterNum; /// 몬스터 번호
	unsigned char mValue; /// 값
};

/// 몬스터를 제거
struct MSG_REQ_CHEAT_REMOVE : public MSGROOT
{
	unsigned long mObjIndex;  /// 오브젝트 인덱스
};

struct MSG_REQ_CHEAT_KILL : public MSGROOT
{
	unsigned long mObjIndex;
};

/// Exp 증가
struct MSG_REQ_CHEAT_EXP : public MSGROOT
{
	short mExpUpPercent;
};

const int ERROR_CHEAT_EXP_SUCCESS = 0; /// 성공
const int ERROR_CHEAT_EXP_FAIL = 1; /// 실패
struct MSG_RES_CHEAT_EXP_GM : public MSG_ERROR
{
	short mExpUpPercent;
};

/// SXP 증가
struct MSG_REQ_CHEAT_SXP : public MSGROOT
{
	short mSxpUpPercent;
};

const int ERROR_CHEAT_SXP_SUCCESS = 0; /// 성공
const int ERROR_CHEAT_SXP_FAIL = 1; /// 실패
struct MSG_RES_CHEAT_SXP_GM : public MSG_ERROR
{
	short mSxpUpPercent;
};

/// 드롭율 증가
struct MSG_REQ_CHEAT_DROP : public MSGROOT
{
	short mDropUpPercent;
};

const int ERROR_CHEAT_DROP_SUCCESS = 0; /// 성공
const int ERROR_CHEAT_DROP_FAIL = 1; /// 실패
struct MSG_RES_CHEAT_DROP_GM : public MSG_ERROR
{
	short mDropUpPercent;
};


#pragma pack( pop )
