1. #ifndef __INC_METIN_II_GAME_INPUT_PROCESSOR__
  2. #define __INC_METIN_II_GAME_INPUT_PROCESSOR__
  3. #include "packet_info.h"
  4. enum
  5. {
  6. INPROC_CLOSE,
  7. INPROC_HANDSHAKE,
  8. INPROC_LOGIN,
  9. INPROC_MAIN,
  10. INPROC_DEAD,
  11. INPROC_DB,
  12. INPROC_UDP,
  13. INPROC_P2P,
  14. INPROC_AUTH,
  15. INPROC_TEEN,
  16. };
  17. void LoginFailure(LPDESC d, const char * c_pszStatus);
  18. class CInputProcessor
  19. {
  20. public:
  21. CInputProcessor();
  22. virtual ~CInputProcessor() {};
  23. virtual bool Process(LPDESC d, const void * c_pvOrig, int iBytes, int & r_iBytesProceed);
  24. virtual BYTE GetType() = 0;
  25. void BindPacketInfo(CPacketInfo * pPacketInfo);
  26. void Pong(LPDESC d);
  27. void Handshake(LPDESC d, const char * c_pData);
  28. void Version(LPCHARACTER ch, const char* c_pData);
  29. protected:
  30. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData) = 0;
  31. CPacketInfo * m_pPacketInfo;
  32. int m_iBufferLeft;
  33. CPacketInfoCG m_packetInfoCG;
  34. };
  35. class CInputClose : public CInputProcessor
  36. {
  37. public:
  38. virtual BYTE GetType() { return INPROC_CLOSE; }
  39. protected:
  40. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData) { return m_iBufferLeft; }
  41. };
  42. class CInputHandshake : public CInputProcessor
  43. {
  44. public:
  45. CInputHandshake();
  46. virtual ~CInputHandshake();
  47. virtual BYTE GetType() { return INPROC_HANDSHAKE; }
  48. protected:
  49. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  50. protected:
  51. void GuildMarkLogin(LPDESC d, const char* c_pData);
  52. CPacketInfo * m_pMainPacketInfo;
  53. };
  54. class CInputLogin : public CInputProcessor
  55. {
  56. public:
  57. virtual BYTE GetType() { return INPROC_LOGIN; }
  58. protected:
  59. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  60. protected:
  61. void Login(LPDESC d, const char * data);
  62. void LoginByKey(LPDESC d, const char * data);
  63. void CharacterSelect(LPDESC d, const char * data);
  64. void CharacterCreate(LPDESC d, const char * data);
  65. void CharacterDelete(LPDESC d, const char * data);
  66. void Entergame(LPDESC d, const char * data);
  67. void Empire(LPDESC d, const char * c_pData);
  68. void GuildMarkCRCList(LPDESC d, const char* c_pData);
  69. // MARK_BUG_FIX
  70. void GuildMarkIDXList(LPDESC d, const char* c_pData);
  71. // END_OF_MARK_BUG_FIX
  72. void GuildMarkUpload(LPDESC d, const char* c_pData);
  73. int GuildSymbolUpload(LPDESC d, const char* c_pData, size_t uiBytes);
  74. void GuildSymbolCRC(LPDESC d, const char* c_pData);
  75. void ChangeName(LPDESC d, const char * data);
  76. };
  77. class CInputMain : public CInputProcessor
  78. {
  79. public:
  80. virtual BYTE GetType() { return INPROC_MAIN; }
  81. protected:
  82. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  83. protected:
  84. void Attack(LPCHARACTER ch, const BYTE header, const char* data);
  85. int Whisper(LPCHARACTER ch, const char * data, size_t uiBytes);
  86. int Chat(LPCHARACTER ch, const char * data, size_t uiBytes);
  87. void ItemUse(LPCHARACTER ch, const char * data);
  88. void ItemDrop(LPCHARACTER ch, const char * data);
  89. void ItemDrop2(LPCHARACTER ch, const char * data);
  90. void ItemMove(LPCHARACTER ch, const char * data);
  91. void ItemPickup(LPCHARACTER ch, const char * data);
  92. void ItemToItem(LPCHARACTER ch, const char * pcData);
  93. void QuickslotAdd(LPCHARACTER ch, const char * data);
  94. void QuickslotDelete(LPCHARACTER ch, const char * data);
  95. void QuickslotSwap(LPCHARACTER ch, const char * data);
  96. int Shop(LPCHARACTER ch, const char * data, size_t uiBytes);
  97. void OnClick(LPCHARACTER ch, const char * data);
  98. void Exchange(LPCHARACTER ch, const char * data);
  99. void Position(LPCHARACTER ch, const char * data);
  100. void Move(LPCHARACTER ch, const char * data);
  101. int SyncPosition(LPCHARACTER ch, const char * data, size_t uiBytes);
  102. void FlyTarget(LPCHARACTER ch, const char * pcData, BYTE bHeader);
  103. void UseSkill(LPCHARACTER ch, const char * pcData);
  104. void ScriptAnswer(LPCHARACTER ch, const void * pvData);
  105. void ScriptButton(LPCHARACTER ch, const void * pvData);
  106. void ScriptSelectItem(LPCHARACTER ch, const void * pvData);
  107. void QuestInputString(LPCHARACTER ch, const void * pvData);
  108. void QuestConfirm(LPCHARACTER ch, const void* pvData);
  109. void Target(LPCHARACTER ch, const char * pcData);
  110. void Warp(LPCHARACTER ch, const char * pcData);
  111. void SafeboxCheckin(LPCHARACTER ch, const char * c_pData);
  112. void SafeboxCheckout(LPCHARACTER ch, const char * c_pData, bool bMall);
  113. void SafeboxItemMove(LPCHARACTER ch, const char * data);
  114. int Messenger(LPCHARACTER ch, const char* c_pData, size_t uiBytes);
  115. void PartyInvite(LPCHARACTER ch, const char * c_pData);
  116. void PartyInviteAnswer(LPCHARACTER ch, const char * c_pData);
  117. void PartyRemove(LPCHARACTER ch, const char * c_pData);
  118. void PartySetState(LPCHARACTER ch, const char * c_pData);
  119. void PartyUseSkill(LPCHARACTER ch, const char * c_pData);
  120. void PartyParameter(LPCHARACTER ch, const char * c_pData);
  121. int Guild(LPCHARACTER ch, const char * data, size_t uiBytes);
  122. void AnswerMakeGuild(LPCHARACTER ch, const char* c_pData);
  123. void Fishing(LPCHARACTER ch, const char* c_pData);
  124. void ItemGive(LPCHARACTER ch, const char* c_pData);
  125. void Hack(LPCHARACTER ch, const char * c_pData);
  126. int MyShop(LPCHARACTER ch, const char * c_pData, size_t uiBytes);
  127. void Refine(LPCHARACTER ch, const char* c_pData);
  128. void Roulette(LPCHARACTER ch, const char* c_pData);
  129. #ifdef __SEND_TARGET_INFO__
  130. void TargetInfoLoad(LPCHARACTER ch, const char* c_pData);
  131. #endif
  132. int OfflineShop(LPCHARACTER ch, const char * data, size_t uiBytes);
  133. int MyOfflineShop(LPCHARACTER ch, const char * c_pData, size_t uiBytes);
  134. };
  135. class CInputDead : public CInputMain
  136. {
  137. public:
  138. virtual BYTE GetType() { return INPROC_DEAD; }
  139. protected:
  140. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  141. };
  142. class CInputDB : public CInputProcessor
  143. {
  144. public:
  145. virtual bool Process(LPDESC d, const void * c_pvOrig, int iBytes, int & r_iBytesProceed);
  146. virtual BYTE GetType() { return INPROC_DB; }
  147. protected:
  148. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  149. protected:
  150. void MapLocations(const char * c_pData);
  151. void LoginSuccess(DWORD dwHandle, const char *data);
  152. void PlayerCreateFailure(LPDESC d, BYTE bType); // 0 = 일반 실패 1 = 이미 있음
  153. void PlayerDeleteSuccess(LPDESC d, const char * data);
  154. void PlayerDeleteFail(LPDESC d);
  155. void PlayerLoad(LPDESC d, const char* data);
  156. void PlayerCreateSuccess(LPDESC d, const char * data);
  157. void Boot(const char* data);
  158. void QuestLoad(LPDESC d, const char * c_pData);
  159. void SafeboxLoad(LPDESC d, const char * c_pData);
  160. void SafeboxChangeSize(LPDESC d, const char * c_pData);
  161. void SafeboxWrongPassword(LPDESC d);
  162. void SafeboxChangePasswordAnswer(LPDESC d, const char* c_pData);
  163. void MallLoad(LPDESC d, const char * c_pData);
  164. void EmpireSelect(LPDESC d, const char * c_pData);
  165. void P2P(const char * c_pData);
  166. void ItemLoad(LPDESC d, const char * c_pData);
  167. void AffectLoad(LPDESC d, const char * c_pData);
  168. void GuildLoad(const char * c_pData);
  169. void GuildSkillUpdate(const char* c_pData);
  170. void GuildSkillRecharge();
  171. void GuildExpUpdate(const char* c_pData);
  172. void GuildAddMember(const char* c_pData);
  173. void GuildRemoveMember(const char* c_pData);
  174. void GuildChangeGrade(const char* c_pData);
  175. void GuildChangeMemberData(const char* c_pData);
  176. void GuildDisband(const char* c_pData);
  177. void GuildLadder(const char* c_pData);
  178. void GuildWar(const char* c_pData);
  179. void GuildWarScore(const char* c_pData);
  180. void GuildSkillUsableChange(const char* c_pData);
  181. void GuildMoneyChange(const char* c_pData);
  182. void GuildWithdrawMoney(const char* c_pData);
  183. void GuildWarReserveAdd(TGuildWarReserve * p);
  184. void GuildWarReserveUpdate(TGuildWarReserve * p);
  185. void GuildWarReserveDelete(DWORD dwID);
  186. void GuildWarBet(TPacketGDGuildWarBet * p);
  187. void GuildChangeMaster(TPacketChangeGuildMaster* p);
  188. void LoginAlready(LPDESC d, const char * c_pData);
  189. void PartyCreate(const char* c_pData);
  190. void PartyDelete(const char* c_pData);
  191. void PartyAdd(const char* c_pData);
  192. void PartyRemove(const char* c_pData);
  193. void PartyStateChange(const char* c_pData);
  194. void PartySetMemberLevel(const char* c_pData);
  195. void Time(const char * c_pData);
  196. void ReloadProto(const char * c_pData);
  197. void ChangeName(LPDESC d, const char * data);
  198. void AuthLogin(LPDESC d, const char * c_pData);
  199. void AuthLoginOpenID(LPDESC d, const char * c_pData);
  200. void ItemAward(const char * c_pData);
  201. void ChangeEmpirePriv(const char* c_pData);
  202. void ChangeGuildPriv(const char* c_pData);
  203. void ChangeCharacterPriv(const char* c_pData);
  204. void MoneyLog(const char* c_pData);
  205. void SetEventFlag(const char* c_pData);
  206. void BillingRepair(const char * c_pData);
  207. void BillingExpire(const char * c_pData);
  208. void BillingLogin(const char * c_pData);
  209. void BillingCheck(const char * c_pData);
  210. void VCard(const char * c_pData);
  211. void CreateObject(const char * c_pData);
  212. void DeleteObject(const char * c_pData);
  213. void UpdateLand(const char * c_pData);
  214. void Notice(const char * c_pData);
  215. void MarriageAdd(TPacketMarriageAdd * p);
  216. void MarriageUpdate(TPacketMarriageUpdate * p);
  217. void MarriageRemove(TPacketMarriageRemove * p);
  218. void WeddingRequest(TPacketWeddingRequest* p);
  219. void WeddingReady(TPacketWeddingReady* p);
  220. void WeddingStart(TPacketWeddingStart* p);
  221. void WeddingEnd(TPacketWeddingEnd* p);
  222. void TakeMonarchMoney(LPDESC d, const char * data );
  223. void AddMonarchMoney(LPDESC d, const char * data );
  224. void DecMonarchMoney(LPDESC d, const char * data );
  225. void SetMonarch( LPDESC d, const char * data );
  226. void ChangeMonarchLord(TPacketChangeMonarchLordACK* data);
  227. void UpdateMonarchInfo(TMonarchInfo* data);
  228. void AddBlockCountryIp(TPacketBlockCountryIp * data);
  229. void BlockException(TPacketBlockException * data);
  230. // MYSHOP_PRICE_LIST
  231. /// 아이템 가격정보 리스트 요청에 대한 응답 패킷(HEADER_DG_MYSHOP_PRICELIST_RES) 처리함수
  232. /**
  233. * @param d 아이템 가격정보 리스트를 요청한 플레이어의 descriptor
  234. * @param p 패킷데이터의 포인터
  235. */
  236. void MyshopPricelistRes( LPDESC d, const TPacketMyshopPricelistHeader* p );
  237. // END_OF_MYSHOP_PRICE_LIST
  238. //
  239. //RELOAD_ADMIN
  240. void ReloadAdmin( const char * c_pData );
  241. //END_RELOAD_ADMIN
  242. void DetailLog(const TPacketNeedLoginLogInfo* info);
  243. // 독일 선물 기능 테스트
  244. void ItemAwardInformer(TPacketItemAwardInfromer* data);
  245. void RespondChannelStatus(LPDESC desc, const char* pcData);
  246. protected:
  247. DWORD m_dwHandle;
  248. };
  249. class CInputUDP : public CInputProcessor
  250. {
  251. public:
  252. CInputUDP();
  253. virtual bool Process(LPDESC d, const void * c_pvOrig, int iBytes, int & r_iBytesProceed);
  254. virtual BYTE GetType() { return INPROC_UDP; }
  255. void SetSockAddr(struct sockaddr_in & rSockAddr) { m_SockAddr = rSockAddr; };
  256. protected:
  257. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  258. protected:
  259. void Handshake(LPDESC lpDesc, const char * c_pData);
  260. void StateChecker(const char * c_pData);
  261. protected:
  262. struct sockaddr_in m_SockAddr;
  263. CPacketInfoUDP m_packetInfoUDP;
  264. };
  265. class CInputP2P : public CInputProcessor
  266. {
  267. public:
  268. CInputP2P();
  269. virtual BYTE GetType() { return INPROC_P2P; }
  270. protected:
  271. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  272. public:
  273. void Setup(LPDESC d, const char * c_pData);
  274. void Login(LPDESC d, const char * c_pData);
  275. void Logout(LPDESC d, const char * c_pData);
  276. int Relay(LPDESC d, const char * c_pData, size_t uiBytes);
  277. int Notice(LPDESC d, const char * c_pData, size_t uiBytes);
  278. int MonarchNotice(LPDESC d, const char * c_pData, size_t uiBytes);
  279. int MonarchTransfer(LPDESC d, const char * c_pData);
  280. int Guild(LPDESC d, const char* c_pData, size_t uiBytes);
  281. void Shout(const char * c_pData);
  282. void Disconnect(const char * c_pData);
  283. void MessengerAdd(const char * c_pData);
  284. void MessengerRemove(const char * c_pData);
  285. #ifdef ENABLE_MESSENGER_BLOCK
  286. void MessengerBlockAdd(const char * c_pData);
  287. void MessengerBlockRemove(const char * c_pData);
  288. #endif
  289. void MessengerMobile(const char * c_pData);
  290. void FindPosition(LPDESC d, const char* c_pData);
  291. void WarpCharacter(const char* c_pData);
  292. void GuildWarZoneMapIndex(const char* c_pData);
  293. void Transfer(const char * c_pData);
  294. void XmasWarpSanta(const char * c_pData);
  295. void XmasWarpSantaReply(const char * c_pData);
  296. void LoginPing(LPDESC d, const char * c_pData);
  297. void BlockChat(const char * c_pData);
  298. void PCBangUpdate(const char* c_pData);
  299. void IamAwake(LPDESC d, const char * c_pData);
  300. void RemoveOfflineShop(LPDESC d, const char * c_pData);
  301. void ChangeOfflineShopTime(LPDESC d, const char * c_pData);
  302. protected:
  303. CPacketInfoGG m_packetInfoGG;
  304. };
  305. class CInputAuth : public CInputProcessor
  306. {
  307. public:
  308. CInputAuth();
  309. virtual BYTE GetType() { return INPROC_AUTH; }
  310. protected:
  311. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
  312. int auth_OpenID(const char *authKey, const char *ipAddr, char *rID);
  313. public:
  314. void Login(LPDESC d, const char * c_pData);
  315. void LoginOpenID(LPDESC d, const char * c_pData); //2012.07.19 OpenID : 김용욱
  316. void PasspodAnswer(LPDESC d, const char * c_pData );
  317. };
  318. class CInputTeen : public CInputProcessor
  319. {
  320. public :
  321. virtual BYTE GetType() { return INPROC_TEEN; }
  322. void SetStep(int step);
  323. protected :
  324. virtual bool Process(LPDESC lpDesc, const void * c_pvOrig, int iBytes, int & r_iBytesProceed);
  325. virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData) { return 0; };
  326. private:
  327. int m_step;
  328. bool ProcessHandshake(LPDESC lpDesc, const void * c_pvOrig, size_t uiBytes, int & r_iBytesProceed);
  329. bool ProcessMain(LPDESC lpDesc, const void * c_pvOrig, size_t uiBytes, int & r_iBytesProceed);
  330. };
  331. #endif /* __INC_METIN_II_GAME_INPUT_PROCESSOR__ */