#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GameClientDispatch.h" #include "SendCharEtc.h" #include "ParseCharEtc.h" // ij¸¯ÅÍ ÀÚ»ì bool GameClientParsePacket::ParseCharSuicide(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktSC), GameClientDispatch); PktSC* lpPktSC = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCharID = lpPktSC->m_dwCharID; Position Pos = Position::Position(); lpCharacter->Dead(NULL); if (0 != lpCharacter->GetMapIndex()) { VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea( lpCharacter->GetMapIndex() ); if (NULL != lpVirtualArea) { Pos = lpVirtualArea->GetRespawnPosition(lpCharacter->GetRace(), 0); } } lpCharacter->Respawn(CCharRespawnMgr::RST_TOWN, Pos); lpCharacter->SaveToDBData(); if (0 != lpCharacter->GetPID()) { // ÆÄƼ¿ø ¸®½ºÆùÀ» ¾Ë¸°´Ù. GameClientSendPacket::SendCharDeadToParty(lpCharacter, 0, PktDeadInfo::RESPAWN); } return true; } // ij¸¯ÅÍ ¹ÙÀÎµå Æ÷Áö¼Ç bool GameClientParsePacket::ParseCharBindPosition(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktBP), GameClientDispatch); PktBP* lpPktBP = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwNPCID = lpPktBP->m_dwNPCID; unsigned char cCmd = lpPktBP->m_cCmd; POS &Pos = lpPktBP->m_Pos; char cZone = lpPktBP->m_cZone; Position DestPos = Pos; switch (cCmd) { case PktBP::BP_SAVE_POSITION: // »õ À§Ä¡ ÀúÀå lpCharacter->BindPositionToNPC(dwNPCID); break; case PktBP::BP_WARP: // ¿öÇÁ DETLOG5(g_Log, "CID:0x%08x ¿öÇÁ ¸í·ÉÀ» »ç¿ëÇÏ¿´½À´Ï´Ù. NewPos : %.1f, %.1f, %.1f, Zone : %d", lpCharacter->GetCID(), Pos.fPointX, Pos.fPointY, Pos.fPointZ, cZone); lpCharacter->MoveTo(DestPos, false); break; } return GameClientSendPacket::SendCharBindPosition(*lpCharacter, dwNPCID, cCmd, Pos, cZone, 0); } // ij¸¯ÅÍ Äü ½½·Ô À̵¿ bool GameClientParsePacket::ParseCharQuickSlotMove(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktQSM), GameClientDispatch); PktQSM* lpPktQSM = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); TakeType takeType = lpPktQSM->m_TakeType; unsigned short usSkillID = lpPktQSM->m_usSkillID; unsigned char cLockCount = lpPktQSM->m_cLockCount; unsigned char cSkillLevel = lpPktQSM->m_cSkillLevel; unsigned short usError = 0; if (false == lpCharacter->MoveQuickSlot(takeType, usSkillID, cLockCount, cSkillLevel)) { usError = PktQSM::FAIL_MOVE; } return GameClientSendPacket::SendCharQuickSlotMove( GameClientDispatch.GetSendStream(), takeType, usSkillID, usError); } // ij¸¯ÅÍ ¿É¼Ç Á¶Á¤ bool GameClientParsePacket::ParseCharControlOption(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCOp), GameClientDispatch); PktCOp* lpPktCOp = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCharID = lpPktCOp->m_dwCharID; RejectOption Reject = lpPktCOp->m_RejectOption; unsigned short usError = 0; // °ÅºÎ ¿É¼Ç Á¶Á¤ if (false == lpCharacter->ControlOption(Reject, false)) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅÍ °ÅºÎ ¿É¼Ç Á¶Á¤ ½ÇÆÐ.", dwCharID); return false; } return GameClientSendPacket::SendCharControlOption(GameClientDispatch.GetSendStream(), dwCharID, Reject); } // ÀÎÁõ ÆÇ³Ú¿¡ ´ëÇÑ ½ÂÀÎ bool GameClientParsePacket::ParseCharAuthorizePanel(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktAP), GameClientDispatch); PktAP* lpPktAP = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwAffectedID = lpPktAP->m_dwAffectedID; unsigned long dwCasterID = lpPktAP->m_dwCasterID; unsigned char cCmd = lpPktAP->m_cCmd; switch (cCmd) { case PktAP::AP_RESURRECTION: { if (0 == lpCharacter->GetStatus().m_nNowHP) { if (SERVER_ID::ZONE3 == CServerSetup::GetInstance().GetServerZone()) { CCreatureManager::GetInstance().PopRespawnQueue(lpCharacter); } if (false == lpCharacter->Respawn(CCharRespawnMgr::RST_RESURRECTION, lpCharacter->GetCurrentPos())) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅÍ ·¹Àú·º¼Ç (Àü¼Û) ½ÇÆÐ.", dwAffectedID); } if (0 != lpCharacter->GetPID()) { // ÆÄƼ¿ø¿¡°Ô ¸®½ºÆùÀ» ¾Ë¸°´Ù. GameClientSendPacket::SendCharDeadToParty(lpCharacter, CCreatureManager::GetInstance().GetCharacter(dwCasterID), PktDeadInfo::RESURRECT); } } } break; case PktAP::AP_RECALL: { CCharacter* lpCaster = CCreatureManager::GetInstance().GetCharacter(dwCasterID); if (NULL == lpCaster) { ERRLOG1(g_Log, "CID:0x%08x ¸®ÄÝ¿¡ ½ÇÆÐÇß½À´Ï´Ù.", dwCasterID); break; } const Position& Pos = lpCaster->GetCastingPos(); lpCharacter->MoveTo(Pos, false); // edith 2009.03.07 ¸®ÄÝ ³ôÀÌ Á¶Àý POS DestPos; DestPos.fPointX = Pos.m_fPointX; DestPos.fPointY = Pos.m_fPointY+0.3f; DestPos.fPointZ = Pos.m_fPointZ; return GameClientSendPacket::SendCharBindPosition(*lpCharacter, dwCasterID, PktBP::BP_RECALL, DestPos, CServerSetup::GetInstance().GetServerZone(), 0); } break; } return true; } // ij¸¯ÅÍ ¸í¼º(°øÇåµµ) Á¤º¸ ¿äû bool GameClientParsePacket::ParseCharFameInfo(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktFI), GameClientDispatch); PktFI* lpPktFI = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCharID = lpPktFI->m_dwCharID; return GameClientSendPacket::SendCharFameInfo(GameClientDispatch.GetSendStream(), lpCharacter, "", "", 0, 0, PktFIAck::FAME_INFO, PktBase::NO_SERVER_ERR); } // ·©Å· Á¤º¸ bool GameClientParsePacket::ParseCharRankingInfo(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktRankingInfo), GameClientDispatch); PktRankingInfo* lpRankingInfo = static_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCharID = lpRankingInfo->m_dwCharID; unsigned char cClass = lpRankingInfo->m_cClass; unsigned char cPage = lpRankingInfo->m_cPage; return CRankingMgr::GetInstance().SendRankingInfo(dwCharID, cClass, cPage); } bool GameClientParsePacket::ParseCastObjectInfo(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCOInfo), GameClientDispatch); PktCOInfo* lpPktCOInfo = static_cast(lpPktBase); CCharacter*lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); if(lpCharacter->GetCID() == lpPktCOInfo->m_dwSenderID) { // Àü¼ÛÀÚ ID°¡ ³ªÀÎ °æ¿ì¿¡¸¸ Àü¼Û. CCell* lpCell = lpCharacter->GetCellPos().m_lpCell; if(0 != lpCell) { lpCell->SendCastObjectInfo(lpPktCOInfo->m_dwSenderID, lpPktCOInfo->m_dwReceiverID, lpPktCOInfo->m_sCastObject); } } else if (lpCharacter->IsRideArms() && lpCharacter->GetRideArmsCID() == lpPktCOInfo->m_dwSenderID) { // Àü¼ÛÀÚ ID°¡ ³»°¡ Ÿ°í ÀÖ´Â º´±âÀÎ °æ¿ì¿¡¸¸ Àü¼Û. CCell* lpCell = lpCharacter->GetCellPos().m_lpCell; if(0 != lpCell) { lpCell->SendCastObjectInfo(lpPktCOInfo->m_dwSenderID, lpPktCOInfo->m_dwReceiverID, lpPktCOInfo->m_sCastObject); } } return true; }