#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GameClientDispatch.h" #include "ParseCharAdmin.h" #include struct Respawn { bool operator() (CCharacter* lpCharacter) { if (NULL != lpCharacter) { lpCharacter->Respawn(); if (0 != lpCharacter->GetPID()) { // ÆÄƼ¿ø ¸®½ºÆùÀ» ¾Ë¸°´Ù. GameClientSendPacket::SendCharDeadToParty(lpCharacter, 0, PktDeadInfo::RESPAWN); } } return true; } }; bool GameClientParsePacket::ParseCharAdminCmd(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktAdmin), GameClientDispatch); PktAdmin* lpPktAdmin = static_cast(lpPktBase); CCharacter* lpAdmin = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpAdmin, GameClientDispatch, lpPktBase->GetCmd()); if (false == lpAdmin->IsAdmin()) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ¾îµå¹Î ij¸¯ÅͰ¡ ¾Æ´Õ´Ï´Ù.", lpAdmin->GetCID()); return true; } BOOL bResult = FALSE; switch(lpAdmin->GetAdminLevel()) { /* case 4: switch(lpPktAdmin->m_usCmd) { case PktAdmin::DBAGENT_KILL: bResult = TRUE; break; } */ case 5: // °³¹ßÀÚ case 4: // ¾îµå¹Î3 switch(lpPktAdmin->m_usCmd) { case PktAdmin::RESPAWN_CHAR: //= 5, // ij¸¯ÅÍ ¸®½ºÆù case PktAdmin::DUEL_INIT: //= 9, // µà¾ó ÃʱâÈ­ case PktAdmin::KILL_CHAR: //= 7, // ij¸¯ÅÍ Å³ case PktAdmin::CREATE_ITEM: //= 10, // ¾ÆÀÌÅÛ µå·Ó case PktAdmin::CREATE_MON: //= 11, // ¸ó½ºÅÍ »ý¼º case PktAdmin::GET_EXP: //= 13, // °æÇèÄ¡ ¾ò±â case PktAdmin::GET_GOLD: //= 14, // µ· ¾ò±â case PktAdmin::LEVEL_UP: //= 15, // ·¹º§¾÷ case PktAdmin::GET_FAME: //= 18, // ¸í¼º ¾ò±â case PktAdmin::GET_MILEAGE: //= 19, // ¸¶Àϸ®Áö ¾ò±â case PktAdmin::APOCALYPSE: //= 26, // ÁÖÀ§ »ý¹°Ã¼ ¸ðµÎ ų case PktAdmin::CREATE_EQUIP: //= 27, // ·£´ý ¿É¼ÇÀÌ ºÙ´Â Àåºñ µå·Ó case PktAdmin::ELITE_BONUS: //= 28, // ¿¤¸®Æ® º¸³Ê½º Á¶Àý case PktAdmin::STATUE_INIT: //= 29, // ¸í¿¹ÀÇ ¼®»ó ÃʱâÈ­ case PktAdmin::RESPAWN_ALL: //= 30, // ¸ðµç ij¸¯ÅÍ ¸®½ºÆù case PktAdmin::CHANGE_CLASS: //= 31, // ÀüÁ÷ Çϱâ case PktAdmin::LEARN_SKILL: //= 32, // ÇØ´ç ½ºÅ³ ¹è¿ì±â case PktAdmin::ERASE_SKILL: //= 33, // ÇØ´ç ½ºÅ³ Áö¿ì±â case PktAdmin::LEVEL_DOWN: //= 34, // ·¹º§ ´Ù¿î case PktAdmin::GET_QUEST: //= 35, // Äù½ºÆ® ¹ÞÀ½ case PktAdmin::ADD_QUEST: //= 36, // ¿Ï·á Äù½ºÆ®¿¡ Ãß°¡ case PktAdmin::DELETE_QUEST: //= 37, // ¼öÇà/¿Ï·á Äù½ºÆ®¸¦ »èÁ¦ case PktAdmin::SET_ITEM_TEMP_INVEN: //= 45, // Àӽà Àκ¥Å丮¿¡ ¾ÆÀÌÅÛ ³Ö±â case PktAdmin::ADD_SPELL: //= 46, // ÇØ´ç ½ºÆçÀ» ºÎ¿© case PktAdmin::REALM_POINT: //= 58, // ±¹°¡ ÀüÀï °øÇå ÈÆÀå. case PktAdmin::LEARN_ABILITY: //= 60, // ÇØ´ç ½ºÅ³ ¹è¿ì±â. case PktAdmin::ERASE_ABILITY: //= 61, // ÇØ´ç ½ºÅ³ Áö¿ì±â // BG case PktAdmin::FINISH_GAME: //= 38, // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (½ÂÆÐ °áÁ¤) case PktAdmin::DRAW_GAME: //= 39, // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (¹«½ÂºÎ) case PktAdmin::IGNORE_GAME: //= 40, // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (½ÂÆÐ ¹«½Ã) case PktAdmin::SET_MAX: //= 41, // ÇØ´ç ¹æÀÇ ÃÖ´ë Àοø¼ö ¼³Á¤ case PktAdmin::SET_SCORE: //= 42, // ÇØ´ç ¹æÀÇ ¸ñÇ¥ Á¡¼ö ¼³Á¤ case PktAdmin::SET_LIMIT_TIME: //= 43, // ÇØ´ç ¹æÀÇ ½Ã°£ Á¦ÇÑ ¼³Á¤ case PktAdmin::SET_REST_TIME: //= 44, // ÇØ´ç ¹æÀÇ ½¬´Â ½Ã°£ ¼³Á¤ bResult = TRUE; break; } case 3: // ¾îµå¹Î2 switch(lpPktAdmin->m_usCmd) { case PktAdmin::MOVE_ZONE_CHAR: //= 1, // ij¸¯ÅÍ Á¸ À̵¿ case PktAdmin::MOVE_ZONE_PARTY: //= 2, // ÆÄƼ Á¸ À̵¿ case PktAdmin::MOVE_CHAR: //= 3, // ij¸¯ÅÍ À̵¿ case PktAdmin::MOVE_PARTY: //= 4, // ÆÄƼ À̵¿ case PktAdmin::DELETE_SPELL: //= 47, // ºÎ¿©µÈ ÇØ´ç ½ºÆçÀ» ÆÄ±« case PktAdmin::STOP: //= 48, // ÇØ´ç ij¸¯ÅÍ ¹­¾îµÎ±â case PktAdmin::STOP_OFF: //= 49, // ¹­¾îµÐ ÇØ´ç ij¸¯Å͸¦ Ç®¾îÁÖ±â bResult = TRUE; break; } case 2: // ¾îµå¹Î1 switch(lpPktAdmin->m_usCmd) { case PktAdmin::HIDE_CHAR: //= 21, // ij¸¯ÅÍ Åõ¸í case PktAdmin::SHOW_CHAR: //= 22, // ij¸¯ÅÍ Åõ¸í ÇØÁ¦ case PktAdmin::INFO_CHAR: //= 12, // ij¸¯ÅÍ Á¤º¸ case PktAdmin::PEACE_MODE: //= 16, // ¹ÝÀü´Üü °¡ÀÔ case PktAdmin::WAR_MODE: //= 17, // ¹ÝÀü´Üü Å»Åð case PktAdmin::TRACE_CHAR: //= 20, // ij¸¯ÅÍ ÃßÀû case PktAdmin::INVINCIBLE_CHAR: //= 23, // ij¸¯ÅÍ ¹«Àû case PktAdmin::LOGOUT_CHAR: //= 25, // ij¸¯ÅÍ °­Á¦ ·Î±×¾Æ¿ô case PktAdmin::NORMAL_CHAR: //= 24, // ij¸¯ÅÍ ¹«Àû ÇØÁ¦ case PktAdmin::CHAT_BAN: //= 50, // äÆÃ ±ÝÁö case PktAdmin::CHAT_OK: //= 51, // ä±Ý ÇØÁ¦ case PktAdmin::NEO: //= 52, // ³×¿À case PktAdmin::SMITH: //= 53, // ½º¹Ì½º¸ðµå case PktAdmin::RELATION: //= 55, // Àû¾Æ±º ½Äº°. case PktAdmin::GM_FORM: //= 56, // PC ¿¡¼­ GM À¸·Î. case PktAdmin::PC_FORM: //= 57, // GM ¿¡¼­ PC ·Î. bResult = TRUE; break; } } if(bResult == FALSE) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %d ·¹º§ ¾îµå¹Î À¯ÀúÀÔ´Ï´Ù.", lpAdmin->GetCID(), lpAdmin->GetAdminLevel()); return true; } /* // ¼­Æ÷Æ® ÀÌ¸é ¸®ÅÏ if(lpAdmin->GetAdminLevel() <= 1) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ¼­Æ÷Æ® À¯ÀúÀÔ´Ï´Ù.", lpAdmin->GetCID()); return true; } */ // ÇØ´ç ij¸¯ÅͰ¡ ÇöÀç °ÔÀÓ ¼­¹ö¿¡ ¾ø´Ù¸é.. Áß°è ¼­¹ö·Î ÆÐŶÀ» º¸³½´Ù. CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(lpPktAdmin->m_stName); if (NULL == lpCharacter) { // edith ÀÌÆÐŶÀº ¹«½Ã switch(lpPktAdmin->m_usCmd) { case PktAdmin::INFO_CHAR: case PktAdmin::DBAGENT_KILL: return true; } ERRLOG2(g_Log, "Admin:0x%08x ÇöÀç ¼­¹ö¿¡ %s ij¸¯ÅͰ¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.\n´Ù¸¥ °ÔÀÓ ¼­¹ö·Î ÆÐŶÀ» Àü¼ÛÇÕ´Ï´Ù.", lpAdmin->GetCID(), lpPktAdmin->m_stName); GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (NULL == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); } else { DETLOG3(g_Log, "¾îµå¹Î ¸í·É ¿äû - ¾îµå¹Î:0x%08x ij¸¯ÅÍ:%s Cmd:%d", lpAdmin->GetCID(), lpPktAdmin->m_stName, lpPktAdmin->GetCmd()); // Admin ij¸¯ÅÍÀÇ CID ¸¦ ±â¾ïÇØµÐ´Ù. lpPktAdmin->m_dwAdminCID = lpAdmin->GetCID(); // Áß°è ¼­¹ö·Î Àü¼Û GameClientSendPacket::SendCharAdminCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), lpPktBase); } return true; } return ProcessAdminCmd(lpAdmin, lpCharacter, lpPktAdmin); } bool GameClientParsePacket::ProcessAdminCmd(CCharacter* lpAdmin, CCharacter* lpTarget, PktAdmin* lpPktAdmin) { // Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¿Â ÆÐŶ / Áß°è ¼­¹ö¿¡¼­ ¿Â ÆÐŶ unsigned long dwAdminCID = (NULL != lpAdmin) ? lpAdmin->GetCID() : lpPktAdmin->m_dwAdminCID; POS& DestPos = lpPktAdmin->m_Position; unsigned long dwAmount = lpPktAdmin->m_dwAmount; char szCommand[PktAdminCommandLog::MAX_COMMAND_SIZE] = {0, }; switch (lpPktAdmin->m_usCmd) { case PktAdmin::NEO: //= 52, // ³×¿À { lpAdmin->GetSpellMgr().GetAffectedInfo().ClearAll(); lpAdmin->GetSpellMgr().GetCastingInfo().ClearAll(); lpAdmin->GetEnchantInfo().ClearFlag(); lpAdmin->GetEnchantInfo().SetFlag(Skill::SpellID::Hide); sprintf(szCommand, "/neo"); // ÇØ´ç ¸Þ½ÃÁö µéÀº ´Ù½Ã Ŭ¶óÀÌ¾ðÆ®·Î µÇµ¹·Áº¸³½´Ù CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharAdmin(lpDispatch->GetSendStream(), lpPktAdmin, 0); } } break; case PktAdmin::SMITH: //= 53, // ½º¹Ì½º¸ðµå { sprintf(szCommand, "/smith"); // ÇØ´ç ¸Þ½ÃÁö µéÀº ´Ù½Ã Ŭ¶óÀÌ¾ðÆ®·Î µÇµ¹·Áº¸³½´Ù CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharAdmin(lpDispatch->GetSendStream(), lpPktAdmin, 0); } } break; case PktAdmin::MOVE_ZONE_CHAR: { if (false == lpTarget->MoveZone(DestPos, lpPktAdmin->m_ZoneInfo.m_cZone, lpPktAdmin->m_ZoneInfo.m_cChannel)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %s¸¦ Á¸ À̵¿½Ã۴µ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/move %s %d %f %f %f", lpTarget->GetCharacterName(), lpPktAdmin->m_ZoneInfo.m_cZone, DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); break; } case PktAdmin::MOVE_ZONE_PARTY: { CParty* lpParty = lpTarget->GetParty(); if (NULL == lpParty) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ ÆÄƼ ¾ò±â¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } lpParty->MoveZone(DestPos, lpPktAdmin->m_ZoneInfo.m_cZone, lpPktAdmin->m_ZoneInfo.m_cChannel); sprintf(szCommand, "/moveparty %s %d %f %f %f", lpTarget->GetCharacterName(), lpPktAdmin->m_ZoneInfo.m_cZone, DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); break; } case PktAdmin::MOVE_CHAR: { if (false == lpTarget->MovePos(DestPos, lpPktAdmin->m_ZoneInfo.m_cZone, false)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %s¸¦ À§Ä¡ À̵¿½Ã۴µ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/moveit %s %f %f %f", lpTarget->GetCharacterName(), DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); break; } case PktAdmin::MOVE_PARTY: { CParty* lpParty = lpTarget->GetParty(); if (NULL == lpParty) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ ÆÄƼ ¾ò±â¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } lpParty->MovePos(DestPos, lpPktAdmin->m_ZoneInfo.m_cZone, false); sprintf(szCommand, "/moveitparty %s %f %f %f", lpTarget->GetCharacterName(), DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); break; } case PktAdmin::RESPAWN_CHAR: { if (false == lpTarget->Respawn()) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %s¸¦ ¸®½ºÆù½Ã۴µ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } else { if (0 != lpTarget->GetPID()) { // ÆÄƼ¿ø ¸®½ºÆùÀ» ¾Ë¸°´Ù. GameClientSendPacket::SendCharDeadToParty(lpTarget, 0, PktDeadInfo::RESPAWN); } sprintf(szCommand, "/respawn %s", lpTarget->GetCharacterName()); } break; } case PktAdmin::RESPAWN_PARTY: break; case PktAdmin::KILL_CHAR: { if (false == lpTarget->Kill(lpAdmin)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %s¸¦ Á×À̴µ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/kick %s", lpTarget->GetCharacterName()); break; } case PktAdmin::KILL_PARTY: break; case PktAdmin::DUEL_INIT: { if (false == lpTarget->DuelInit(PktDuC::DUC_CANCEL)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ µà¾ó ÃʱâÈ­¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/duelinit %s", lpTarget->GetCharacterName()); break; } case PktAdmin::CREATE_ITEM: { if (false == lpTarget->DropItem(lpPktAdmin->m_usProtoTypeID, static_cast(dwAmount))) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %s ¾Õ¿¡ ¾ÆÀÌÅÛÀ» »ý¼ºÇÏ¿© ¶³±¸´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/dropitem %s %d %d", lpTarget->GetCharacterName(), lpPktAdmin->m_usProtoTypeID, dwAmount); DETLOG3(g_Log, "CID:0x%08x ¾îµå¹ÎÀÌ ¾ÆÀÌÅÛÀ» »ý¼ºÇÏ¿´½À´Ï´Ù. ¾ÆÀÌÅÛ(ID:%d, °¹¼ö:%d)", lpTarget->GetCID(), lpPktAdmin->m_usProtoTypeID, dwAmount); break; } case PktAdmin::CREATE_MON: { // ¹èƲ ±×¶ó¿îµå ¼­¹ö±ºÀÇ °¡»óÁ¸¿¡¼­´Â ¸ó½ºÅ͸¦ ¸¸µé¾î ³¾¼ö ¾ø´Ù!! if (0 != lpAdmin->GetMapIndex()) { /* VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(lpAdmin->GetMapIndex()); if (lpVirtualArea) { CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager(); if (NULL == lpVirtualMonsterMgr || false == lpVirtualMonsterMgr->AdminSummonMonster(lpPktAdmin->m_usProtoTypeID, DestPos, lpAdmin->GetMapIndex())) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ¸ó½ºÅ͸¦ »ý¼ºÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID); return true; } } */ } else { if (false == CCellManager::GetInstance().AdminSummonMonster(lpPktAdmin->m_usProtoTypeID, DestPos)) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ¸ó½ºÅ͸¦ »ý¼ºÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID); return true; } } sprintf(szCommand, "/createmob %d %f %f %f", lpPktAdmin->m_usProtoTypeID, DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); DETLOG5(g_Log, "CID:0x%08x ¾îµå¹ÎÀÌ ¸ó½ºÅ͸¦ ¼ÒȯÇÏ¿´½À´Ï´Ù. ¸ó½ºÅÍ(ID:%d, (%.1f, %.1f, %.1f))", dwAdminCID, lpPktAdmin->m_usProtoTypeID, DestPos.fPointX, DestPos.fPointY, DestPos.fPointZ); break; } // PC ¿¡¼­ GM À¸·Î. case PktAdmin::GM_FORM: { CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwAdminCID); if(lpCharacter) { lpCharacter->SetGMModelFlag(1); } sprintf(szCommand, "/gmform"); break; } // GM ¿¡¼­ PC ·Î. case PktAdmin::PC_FORM: { CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwAdminCID); if(lpCharacter) { lpCharacter->SetGMModelFlag(0); } sprintf(szCommand, "/pcform"); break; } case PktAdmin::INFO_CHAR: { if (false == lpTarget->NotifyInfo(dwAdminCID)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ Á¤º¸ Àü´Þ¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/hp %s", lpTarget->GetCharacterName()); break; } case PktAdmin::RELATION: { unsigned char cResult = 0; unsigned long dwResult = lpAdmin->IsEnemy(lpTarget, &cResult); char szMessage[PktChat::PktChatMaxSize] = ""; char szType[MAX_PATH] = { 0, }; int nLen = _snprintf(szMessage, PktChat::PktChatMaxSize, "[Client] Type : %d, Relation : %d, Result : %d, [Server] Type : %d, Relation : %d, Result : %d", lpPktAdmin->m_usProtoTypeID, lpPktAdmin->m_dwAmount, lpPktAdmin->m_ZoneInfo.m_cZone, EnemyCheck::CCheckTable::GetInstance().GetEnemyCheckRule(), dwResult, cResult); if (0 < nLen) { szMessage[PktChat::PktChatMaxSize - 1] = 0; // äÆÃ ¼­¹ö·Î Á¤º¸¸¦ º¸³½´Ù. GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (0 != lpChatDispatch) { const Position& pos = lpTarget->GetCurrentPos(); char strAdminCID[CHAR_INFOST::MAX_NAME_LEN] = ""; strcpy(strAdminCID, "0x"); char* strHexPos = (strAdminCID + 2); Math::Convert::Hex32ToStr(strHexPos, dwAdminCID); CChatRequestPacket chatReqPacket(szMessage, PktChat::ENEMY_CHECK, 0, lpTarget->GetUID(), lpTarget->GetCID(), 0, 0, 0, strAdminCID, 1); if (chatReqPacket.IsValid()) { return lpChatDispatch->GetSendStream().PutBuffer( chatReqPacket.GetCompressedPacket(), chatReqPacket.GetCompressedSize(), CmdCharChat); } } } sprintf(szCommand, "/relation %s", lpTarget->GetCharacterName()); break; } case PktAdmin::GET_EXP: { lpTarget->IncrementExp(dwAmount); sprintf(szCommand, "/giveexp %s %d", lpTarget->GetCharacterName(), dwAmount); break; } case PktAdmin::GET_GOLD: { unsigned long dwSrcGold = lpTarget->GetGold(); lpTarget->AddGold(dwAmount, true); GAMELOG::LogTakeGold(*lpTarget, dwSrcGold, lpTarget->GetGold(), dwAmount, TakeType::TS_INVEN, TakeType::TS_INVEN, GAMELOG::sTakeGoldLogV2::ADMIN_GIVEGOLD, 0); sprintf(szCommand, "/givegold %s %d", lpTarget->GetCharacterName(), dwAmount); break; } case PktAdmin::LEVEL_UP: { if (dwAmount < 1 || dwAmount > EXP::GetUsingMaxLevel()) { break; } while (static_cast(lpTarget->GetStatus().m_nLevel) < dwAmount) { if (false == lpTarget->IncrementExp( static_cast(EXP::ExpTable[lpTarget->GetStatus().m_nLevel - 1]))) { break; } } sprintf(szCommand, "/levelup %s %d", lpTarget->GetCharacterName(), dwAmount); break; } // DELETE_ME : ´õÀÌ»ó Ŭ¶óÀÌ¾ðÆ®°¡ ¹ÝÀü ¸ðµå·ÎÀÇ º¯°æÀº ºÒ°¡´ÉÇÏ´Ù. °³³ä¸¸ ³²¾ÆÀÖÀ» »Ó. (2005-05-31 by ·Îµò) /* case PktAdmin::PEACE_MODE: { PeaceModeInfo peaceModeInfo = lpTarget->GetPeaceMode(); peaceModeInfo.m_bPeace = true; lpTarget->SetPeaceMode(peaceModeInfo, false); CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharPeaceMode(lpDispatch->GetSendStream(), lpTarget->GetCID(), 0, true, 0); } break; } case PktAdmin::WAR_MODE: { PeaceModeInfo peaceModeInfo = lpTarget->GetPeaceMode(); peaceModeInfo.m_bPeace = false; lpTarget->SetPeaceMode(peaceModeInfo, false); CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharPeaceMode(lpDispatch->GetSendStream(), lpTarget->GetCID(), 0, false, 0); } break; } */ case PktAdmin::GET_FAME: { lpTarget->SetFame(dwAmount); CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpTarget, "", "", 0, 0, PktFIAck::FAME_INFO, PktBase::NO_SERVER_ERR); } sprintf(szCommand, "/setfame %s %d", lpTarget->GetCharacterName(), dwAmount); break; } case PktAdmin::GET_MILEAGE: { lpTarget->SetMileage(dwAmount); CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpTarget, "", "", 0, 0, PktFIAck::FAME_INFO, PktBase::NO_SERVER_ERR); } sprintf(szCommand, "/setmileage %s %d", lpTarget->GetCharacterName(), dwAmount); break; } case PktAdmin::TRACE_CHAR: { // ¸ñÇ¥¿Í °°Àº Á¸¿¡ ÀÖ´Â °æ¿ì if (NULL != lpAdmin) { Position DestPostion = lpTarget->GetCurrentPos(); // ¾à°£ ¿·À¸·Î À̵¿½ÃÄÑÁØ´Ù. DestPostion.m_fPointX += 5; sprintf(szCommand, "/trace %s", lpTarget->GetCharacterName()); if (false == lpAdmin->MovePos(DestPostion, lpPktAdmin->m_ZoneInfo.m_cZone, false)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ À§Ä¡·Î À̵¿Çϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); return true; } } // ¸ñÇ¥¿Í ´Ù¸¥ Á¸¿¡ ÀÖ´Â °æ¿ì else { // Admin ij¸¯Å͸¦ ¸ñÇ¥ ij¸¯ÅͰ¡ ÀÖ´Â Á¸°ú À§Ä¡·Î À̵¿ ½ÃŲ´Ù. CCharacter* lpAdmin = CCreatureManager::GetInstance().GetCharacter(dwAdminCID); if (NULL == lpAdmin) { ERRLOG1(g_Log, "¾îµå¹Î ¸í·É ¿À·ù : %s ij¸¯Å͸¦ ÃßÀûÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. ¾îµå¹Î ij¸¯ÅͰ¡ NULL ÀÔ´Ï´Ù.", lpPktAdmin->m_stName); return true; } sprintf(szCommand, "/trace %s", lpAdmin->GetCharacterName()); if (0 == DestPos.fPointX && 0 == DestPos.fPointY && 0 == DestPos.fPointZ) { CGameClientDispatch* lpDispatch = lpAdmin->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharAdmin(lpDispatch->GetSendStream(), lpPktAdmin, PktAdmin::E_LOGOUT_CHAR); } return true; } else { // ¾à°£ ¿·À¸·Î À̵¿½ÃÄÑÁØ´Ù. DestPos.fPointX += 5; if (false == lpAdmin->MoveZone(DestPos, lpPktAdmin->m_ZoneInfo.m_cZone, lpPktAdmin->m_ZoneInfo.m_cChannel)) { ERRLOG1(g_Log, "¾îµå¹Î ¸í·É ¿À·ù : %s ij¸¯Å͸¦ ÃßÀûÇϴµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", lpPktAdmin->m_stName); return true; } } } break; } case PktAdmin::REQUEST_TRACE_POS: { if (NULL != lpPktAdmin) { lpPktAdmin->m_Position.fPointX = lpTarget->GetCurrentPos().m_fPointX; lpPktAdmin->m_Position.fPointY = lpTarget->GetCurrentPos().m_fPointY; lpPktAdmin->m_Position.fPointZ = lpTarget->GetCurrentPos().m_fPointZ; GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch) { GameClientSendPacket::SendCharAdminCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), lpPktAdmin); } } break; } case PktAdmin::HIDE_CHAR: { lpAdmin->GetSpellMgr().GetAffectedInfo().ClearAll(); lpAdmin->GetSpellMgr().GetCastingInfo().ClearAll(); lpAdmin->GetEnchantInfo().ClearFlag(); lpAdmin->GetEnchantInfo().SetFlag(Skill::SpellID::Hide); sprintf(szCommand, "/hide"); break; } case PktAdmin::SHOW_CHAR: { lpAdmin->GetEnchantInfo().ResetFlag(Skill::SpellID::Hide); sprintf(szCommand, "/show"); break; } case PktAdmin::INVINCIBLE_CHAR: { Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpAdmin, Skill::SpellType::MAGICAL_SPELL, Skill::SpellID::Invincible, 1, CSpell::INFINITE_DURATION))(lpAdmin); sprintf(szCommand, "/god"); break; } case PktAdmin::NORMAL_CHAR: { lpAdmin->GetSpellMgr().GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::Invincible); sprintf(szCommand, "/human"); break; } case PktAdmin::LOGOUT_CHAR: { CGameClientDispatch* lpDispatch = lpTarget->GetDispatcher(); if (NULL != lpDispatch) { DETLOG2(g_Log, "CID:0x%08x ¾îµå¹ÎÀÌ °­Á¦ ·Î±×¾Æ¿ô ½ÃÄ×½À´Ï´Ù. ¾îµå¹ÎCID:0x%08x", lpTarget->GetCID(), dwAdminCID); lpDispatch->Disconnect(); lpDispatch->Disconnected(); } sprintf(szCommand, "/logout %s", lpTarget->GetCharacterName()); break; } case PktAdmin::APOCALYPSE: { CCell* lpCell = lpAdmin->GetCellPos().m_lpCell; if (NULL == lpCell) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ¾îµå¹Î ij¸¯ÅͰ¡ ÀÖ´Â ¼¿ÀÌ ÀÌ»óÇÕ´Ï´Ù.", dwAdminCID); break; } lpCell->KillAll(lpAdmin); sprintf(szCommand, "/apo"); break; } case PktAdmin::CREATE_EQUIP: { CCell* lpCell = lpTarget->GetCellPos().m_lpCell; if (NULL == lpCell) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ij¸¯ÅͰ¡ ÀÖ´Â ¼¿ÀÌ ÀÌ»óÇÕ´Ï´Ù.", lpTarget->GetCID()); break; } lpPktAdmin->m_usProtoTypeID = std::max(lpPktAdmin->m_usProtoTypeID, static_cast(Item::EquipType::AAA_GRADE)); lpPktAdmin->m_usProtoTypeID = std::min(lpPktAdmin->m_usProtoTypeID, static_cast(Item::EquipType::F_GRADE)); Item::EquipType::Grade eGrade = static_cast(lpPktAdmin->m_usProtoTypeID); unsigned char cMonsterLevel = std::min(static_cast(Creature::MONSTER_MAX_LEVEL), static_cast(lpPktAdmin->m_dwAmount)); unsigned short wItemKind = AwardTable::CAward::GetInstance().GetAwardEquipment( Item::EquipType::STANDARD_OPTION, cMonsterLevel, lpTarget, true); Item::CItem* lpItem = Item::CItemFactory::GetInstance().CreateItem(wItemKind); if (NULL != lpItem) { Item::CEquipment* lpEquip = Item::CEquipment::DowncastToEquipment(lpItem); if (NULL != lpEquip) { // ¸ÅÁ÷Âù½º 50ÇÁ·Î È®À² Å×½ºÆ®. if(lpEquip->AddRandomOption(eGrade, (unsigned char)lpPktAdmin->m_dwAmount2, 50)) lpEquip->SetNewEquip(2); else lpEquip->SetNewEquip(); } lpTarget->GiveItem(lpItem); // GievItem À¸·Î ½ºÅÃµÈ °æ¿ì if (lpItem->IsSet(Item::DetailData::STACKABLE) && 0 == lpItem->GetNumOrDurability()) { DELETE_ITEM(lpItem); } } sprintf(szCommand, "/createitem %s %d %d", lpTarget->GetCharacterName(), lpPktAdmin->m_dwAmount, lpPktAdmin->m_usProtoTypeID); break; } case PktAdmin::ELITE_BONUS: { CCreatureManager& CreatureManager = CCreatureManager::GetInstance(); EliteBonus::EliteBonusData eliteBonus(lpPktAdmin->m_EliteBonusInfo.m_cNation, lpPktAdmin->m_EliteBonusInfo.m_cLevel); if ((eliteBonus.m_cNation == CClass::HUMAN || eliteBonus.m_cNation == CClass::AKHAN) && (eliteBonus.m_cLevel >= 0 && eliteBonus.m_cLevel <= EliteBonus::MAX_BONUS_LEVEL)) { CreatureManager.SetAutoBalance(false); CreatureManager.SetEliteBonus(eliteBonus); } else { CreatureManager.SetAutoBalance(true); } sprintf(szCommand, "/elitebonus %d %d", lpPktAdmin->m_EliteBonusInfo.m_cNation, lpPktAdmin->m_EliteBonusInfo.m_cLevel); break; } case PktAdmin::STATUE_INIT: { if (SERVER_ID::ZONE3 == CServerSetup::GetInstance().GetServerZone()) { CCreatureManager::GetInstance().ProcessAllMonster( std::bind2nd(std::mem_fun1(&CMonster::Dead), reinterpret_cast(NULL))); } sprintf(szCommand, "/resstatue"); break; } case PktAdmin::RESPAWN_ALL: { CCreatureManager::GetInstance().ProcessAllCharacter(Respawn()); sprintf(szCommand, "/resmen"); break; } case PktAdmin::CHANGE_CLASS: { if (lpTarget->GetStatus().m_nLevel < 10) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : ·¹º§ÀÌ 20º¸´Ù ÀÛ½À´Ï´Ù.", dwAdminCID); break; } unsigned char cClassType = static_cast(lpPktAdmin->m_usProtoTypeID); if (lpTarget->GetClass() == cClassType) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : °°Àº Ŭ·¡½º(%d)·Î ÀüÁ÷ÇÒ·Á°í ÇÕ´Ï´Ù.", dwAdminCID, cClassType); break; } if (lpTarget->GetRace() != CClass::GetRace(cClassType)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : üÀÎÁö ÇÒ·Á´Â Ŭ·¡½º(%d)¿Í Á¾Á·ÀÌ ´Ù¸¨´Ï´Ù.", dwAdminCID, cClassType); break; } // ±âº» Ŭ·¡½º¿¡¼­ ÇØ´ç »óÀ§ Ŭ·¡½º·Î ÀüÁ÷ÇÏ´Â °æ¿ì if (CClass::GetJobLevel(static_cast(lpTarget->GetClass())) == CClass::DEFAULT_CLASS && CClass::GetPreviousJob(cClassType) == lpTarget->GetClass()) { if (false == lpTarget->ChangeClass(cClassType)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %d ·Î Ŭ·¡½º üÀÎÁö¸¦ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_usProtoTypeID); } } // °°Àº Á¾Á·ÀÇ ´Ù¸¥ Ŭ·¡½º·Î ÀüÁ÷ÇÏ´Â °æ¿ì else { unsigned char cPrevClassType = CClass::GetPreviousJob(cClassType); int nCurrentLevel = lpTarget->GetStatus().m_nLevel; // 1 Step // ·¹º§ 1ÀÇ Ãʱâ ij¸¯ÅÍ·Î ¸¸µé¸é¼­, ¸ðµç ½ºÅ³À» Áö¿î´Ù. if (false == lpTarget->InitLevel1Char(cPrevClassType)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : CID:0x%08x ij¸¯Å͸¦ 1·¹º§·Î ¸¸µå´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpTarget->GetCID()); break; } // 2 Step // ÇØ´ç ·¹º§±îÁö level up while (lpTarget->GetStatus().m_nLevel < nCurrentLevel) { if (false == lpTarget->IncrementExp( static_cast(EXP::ExpTable[lpTarget->GetStatus().m_nLevel - 1]))) { break; } } // 3 Step // ÇØ´ç Ŭ·¡½º·Î ÀüÁ÷ if (lpTarget->GetStatus().m_nLevel >= 10 && cClassType != cPrevClassType) { if (false == lpTarget->ChangeClass(cClassType)) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : CID:0x%08x ij¸¯ÅÍ Å¬·¡½º üÀÎÁö ½ÇÆÐ. ÇöÀç ij¸¯ÅÍÀÇ Å¬·¡½º´Â %d, ¹Ù²Ù°íÀÚ Çϴ Ŭ·¡½º´Â %dÀÔ´Ï´Ù.", dwAdminCID, lpTarget->GetCID(), lpTarget->GetClass(), cClassType); break; } } } sprintf(szCommand, "/class %s %d", lpTarget->GetCharacterName(), cClassType); break; } case PktAdmin::LEARN_SKILL: { unsigned short nSkillID = lpPktAdmin->m_usProtoTypeID; unsigned char cLockCount = static_cast(lpPktAdmin->m_Position.fPointX) - 1; // 1ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½ unsigned char cSkillLevel = static_cast(lpPktAdmin->m_Position.fPointY); // 0ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½ // ÀÌ¹Ì ¹è¿öµÐ ½ºÅ³ÀÎÁö üũ if (cLockCount < lpTarget->GetSkillLockCount(nSkillID) || (cLockCount == lpTarget->GetSkillLockCount(nSkillID) && cSkillLevel <= lpTarget->GetSkillLevel(nSkillID))) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : SkillID:0x%08x LockCount:%d SkillLevel:%d ½ºÅ³À» ¹è¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, nSkillID, cLockCount, cSkillLevel); break; } // ½ºÅ³ ¹è¿ì±â int count = cLockCount * CSkillMgr::MAX_SKILL_LEVEL + cSkillLevel + 1; cLockCount = lpTarget->GetSkillLockCount(nSkillID) == -1 ? 0 : lpTarget->GetSkillLockCount(nSkillID); cSkillLevel = lpTarget->GetSkillLevel(nSkillID) == -1 ? 0 : lpTarget->GetSkillLevel(nSkillID); count -= cLockCount * CSkillMgr::MAX_SKILL_LEVEL + cSkillLevel + 1; using namespace Item; ItemInfo tempItemInfo(nSkillID); tempItemInfo.m_UseItemInfo.m_usSkill_ID = nSkillID; tempItemInfo.m_UseItemInfo.m_usSkill_LockCount = cLockCount; tempItemInfo.m_DetailData.m_dwFlags |= DetailData::USE_ITEM; // ItemSerial ÀÌ 0 ÀÎ Àӽà ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. CUseItem* lpUseItem = CUseItem::DowncastToUseItem( CItemFactory::GetInstance().CreateTempItem(tempItemInfo)); for (int i=0; iSkillCreate(lpUseItem)) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : SkillID:0x%08x LockCount:%d SkillLevel:%d ½ºÅ³À» ¹è¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, nSkillID, cLockCount, cSkillLevel); } ++cSkillLevel; if (cLockCount != CSkillMgr::MAX_SKILL_LOCKCOUNT-1 && cSkillLevel == CSkillMgr::MAX_SKILL_LEVEL) { cSkillLevel = 0; ++cLockCount; DELETE_ITEM(lpUseItem); tempItemInfo.m_usProtoTypeID = nSkillID; tempItemInfo.m_UseItemInfo.m_usSkill_ID = nSkillID; tempItemInfo.m_UseItemInfo.m_usSkill_LockCount = cLockCount; lpUseItem = CUseItem::DowncastToUseItem( CItemFactory::GetInstance().CreateTempItem(tempItemInfo)); } } sprintf(szCommand, "/learnskill 0x%08x %d %d", nSkillID, cLockCount+1, cSkillLevel); DELETE_ITEM(lpUseItem); break; } case PktAdmin::ERASE_SKILL: { unsigned short nSkillID = lpPktAdmin->m_usProtoTypeID; unsigned char cLockCount = static_cast(lpPktAdmin->m_Position.fPointX) - 1; // 1ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½ unsigned char cSkillLevel = static_cast(lpPktAdmin->m_Position.fPointY); // 0ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½ if (cLockCount > lpTarget->GetSkillLockCount(nSkillID) || (cLockCount == lpTarget->GetSkillLockCount(nSkillID) && cSkillLevel >= lpTarget->GetSkillLevel(nSkillID))) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : SkillID:0x%08x LockCount:%d SkillLevel:%d ½ºÅ³À» Áö¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, nSkillID, cLockCount, cSkillLevel); break; } unsigned char cIndex = static_cast(lpTarget->GetSkillSlotIndex(nSkillID)); int count = lpTarget->GetSkillLockCount(nSkillID) * CSkillMgr::MAX_SKILL_LEVEL + lpTarget->GetSkillLevel(nSkillID) + 1; count -= cLockCount * CSkillMgr::MAX_SKILL_LEVEL + cSkillLevel + 1; for (int i=0; iSkillErase(cIndex, itemPos)) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : SkillID:0x%08x LockCount:%d SkillLevel:%d ½ºÅ³À» Áö¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, nSkillID, cLockCount, cSkillLevel); } --cSkillLevel; if (cSkillLevel < 0) { cSkillLevel = 0; --cLockCount; } } sprintf(szCommand, "/eraseskill 0x%08x %d %d", nSkillID, cLockCount+1, cSkillLevel); break; } case PktAdmin::LEARN_ABILITY: { unsigned short wAbilityID = lpPktAdmin->m_usProtoTypeID; unsigned short wAbilityLV = static_cast(lpPktAdmin->m_Position.fPointX) - 1; // ÀÌ¹Ì ¹è¿öµÐ ¾îºô¸®Æ¼ÀÎÁö üũ if ( wAbilityLV <= lpTarget->GetSkillLockCount(wAbilityID) ) { ERRLOG3(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : AbilityID:0x%08x wAbilityLV:%d ¾îºô¸®Æ¼¸¦ ¹è¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, wAbilityID, wAbilityLV); break; } using namespace Item; ItemInfo tempItemInfo(wAbilityID); tempItemInfo.m_UseItemInfo.m_usSkill_ID = wAbilityID; tempItemInfo.m_UseItemInfo.m_usSkill_LockCount = wAbilityLV; tempItemInfo.m_DetailData.m_dwFlags |= DetailData::USE_ITEM; // ItemSerial ÀÌ 0 ÀÎ Àӽà ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. CUseItem* lpUseItem = CUseItem::DowncastToUseItem( CItemFactory::GetInstance().CreateTempItem(tempItemInfo)); if (!lpTarget->AbilityCreate(lpUseItem)) { ERRLOG3(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : AbilityID:0x%08x wAbilityLV:%d ¾îºô¸®Æ¼¸¦ ¹è¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, wAbilityID, wAbilityLV); } sprintf(szCommand, "/learnability 0x%08x %d", wAbilityID, wAbilityLV+1); DELETE_ITEM(lpUseItem); break; } case PktAdmin::ERASE_ABILITY: { unsigned short wAbilityID = lpPktAdmin->m_usProtoTypeID; unsigned short wAbilityLV = static_cast(lpPktAdmin->m_Position.fPointX) - 1; // ÀÌ¹Ì ¹è¿öµÐ ¾îºô¸®Æ¼ÀÎÁö üũ if ( wAbilityLV > lpTarget->GetSkillLockCount(wAbilityID) ) { ERRLOG3(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : AbilityID:0x%08x wAbilityLV:%d ¾îºô¸®Æ¼¸¦ Áö¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, wAbilityID, wAbilityLV); break; } unsigned char cIndex = static_cast(lpTarget->GetSkillSlotIndex(wAbilityID)); int count = lpTarget->GetSkillLockCount(wAbilityID)-wAbilityLV; for (int i=0; iAbilityErase(cIndex, itemPos)) { ERRLOG3(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : SkillID:0x%08x LockCount:%d ¾îºô¸®Æ¼¸¦ Áö¿ì´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, wAbilityID, wAbilityLV); } --wAbilityLV; } sprintf(szCommand, "/eraseability 0x%08x %d", wAbilityID, wAbilityLV+1); break; } case PktAdmin::LEVEL_DOWN: { if (dwAmount < 1 || dwAmount > EXP::GetUsingMaxLevel()) { break; } unsigned char cClassType = static_cast(lpTarget->GetClass()); unsigned char cPrevClassType = cClassType; if (CClass::GetJobLevel(cClassType) == CClass::JOB_CHANGE_1ST) { cPrevClassType = CClass::GetPreviousJob(cClassType); } /* // edith 100 ·¾ ÀÌÆÑÆ® // 100·¹º§ ÄÁÅÙÃ÷¸¦ »ç¿ëÇÒ°æ¿ì ¸¸·¦ ÀÎæƮ¸¦ Á¦°ÅÇÑ´Ù. if (true == CServerSetup::GetInstance().UseContents(GameRYL::LEVEL_LIMIT_100)) { lpTarget->GetSpellMgr().GetAffectedInfo().RemoveChantBySpellType(Skill::SpellID::HundredLevel); lpTarget->GetSpellMgr().GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::HundredLevel); } */ // 1 Step // ·¹º§ 1ÀÇ Ãʱâ ij¸¯ÅÍ·Î ¸¸µé¸é¼­, ¸ðµç ½ºÅ³À» Áö¿î´Ù. if (false == lpTarget->InitLevel1Char(cPrevClassType)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : CID:0x%08x ij¸¯Å͸¦ 1·¹º§·Î ¸¸µå´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpTarget->GetCID()); break; } // 2 Step // ÇØ´ç ·¹º§±îÁö level up while (static_cast(lpTarget->GetStatus().m_nLevel) < dwAmount) { if (false == lpTarget->IncrementExp( static_cast(EXP::ExpTable[lpTarget->GetStatus().m_nLevel - 1]))) { break; } } // 3 Step // ÇØ´ç Ŭ·¡½º·Î ÀüÁ÷ if (lpTarget->GetStatus().m_nLevel >= 10 && cClassType != cPrevClassType) { if (false == lpTarget->ChangeClass(cClassType)) { ERRLOG4(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : CID:0x%08x ij¸¯ÅÍ Å¬·¡½º üÀÎÁö ½ÇÆÐ. " "ÇöÀç ij¸¯ÅÍÀÇ Å¬·¡½º´Â %d, ¹Ù²Ù°íÀÚ Çϴ Ŭ·¡½º´Â %dÀÔ´Ï´Ù.", dwAdminCID, lpTarget->GetCID(), lpTarget->GetClass(), cClassType); break; } } sprintf(szCommand, "/leveldown %s %d", lpTarget->GetCharacterName(), dwAmount); break; } // Äù½ºÆ® °ü·Ã ¾îµå¹Î ¸í·É case PktAdmin::GET_QUEST: // Äù½ºÆ® ¹Þ±â { // ij¸¯ÅÍ À̸§, Äù½ºÆ® ID unsigned short wQuestID = lpPktAdmin->m_usProtoTypeID; Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(wQuestID); if (NULL == lpQuest) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } if (true == lpTarget->HasQuest(wQuestID)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x ¸¦ ÀÌ¹Ì °¡Áö°í ÀÖ½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } if (false == lpTarget->GiveQuest(lpQuest)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®¸¦ Áִµ¥ ½ÇÆÐÇß½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } CGameClientDispatch* lpGameClientDispatch = lpTarget->GetDispatcher(); if (NULL != lpGameClientDispatch) { GameClientSendPacket::SendCharStartQuest(lpGameClientDispatch->GetSendStream(), lpTarget->GetCID(), 0, wQuestID, PktBase::NO_SERVER_ERR); } if (false == lpTarget->StartPhase(wQuestID, 1)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®ÀÇ Ã¹¹øÂ° ´Ü°è¸¦ ½ÇÇàÇϴµ¥ ½ÇÆÐÇß½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); // ÇØ´ç Äù½ºÆ® Á¦°Å lpTarget->CancelQuest(wQuestID); GameClientSendPacket::SendCharCancelQuest(lpGameClientDispatch->GetSendStream(), lpTarget->GetCID(), wQuestID, PktAdmin::NO_SERVER_ERR); break; } sprintf(szCommand, "/getquest %s 0x%08x", lpTarget->GetCharacterName(), wQuestID); break; } case PktAdmin::ADD_QUEST: // ¿Ï·á Äù½ºÆ®¿¡ Ãß°¡ { unsigned short wQuestID = lpPktAdmin->m_usProtoTypeID; Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(wQuestID); if (NULL == lpQuest) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } CGameClientDispatch* lpGameClientDispatch = lpTarget->GetDispatcher(); if (NULL == lpGameClientDispatch) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : GameClientDispatch °¡ NULL ÀÔ´Ï´Ù.", lpTarget->GetCID()); break; } // ÀÌ¹Ì ¿Ï·á Äù½ºÆ®¿¡ Á¸ÀçÇÏ´ÂÁö üũÇÑ´Ù. if (true == lpTarget->HasHistoryQuest(wQuestID)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®¸¦ ÀÌ¹Ì ¿Ï·áÇÏ¿´½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } // ÇöÀç ¼öÇàÁßÀÎ Äù½ºÆ®¿¡ Á¸ÀçÇÏ´ÂÁö üũÇÑ´Ù. if (true == lpTarget->HasExecutingQuest(wQuestID)) { // ¼öÇàÁßÀÌ´ø Äù½ºÆ®¸¦ ¾ø¾Ø´Ù. lpTarget->CancelQuest(wQuestID); GameClientSendPacket::SendCharCancelQuest(lpGameClientDispatch->GetSendStream(), lpTarget->GetCID(), wQuestID, PktAdmin::NO_SERVER_ERR); } if (false == lpTarget->InsertHistoryQuest(wQuestID)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®¸¦ ¿Ï·áµÈ Äù½ºÆ®·Î ³Ö´Âµ¥ ½ÇÆÐÇß½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } // Äù½ºÆ® Á¤º¸¸¦ º¸³½´Ù. GameClientSendPacket::SendCharQuestInfo(lpGameClientDispatch->GetSendStream(), lpTarget); sprintf(szCommand, "/addquest %s 0x%08x", lpTarget->GetCharacterName(), wQuestID); break; } case PktAdmin::DELETE_QUEST: // Äù½ºÆ® »èÁ¦ { unsigned short wQuestID = lpPktAdmin->m_usProtoTypeID; Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(wQuestID); if (NULL == lpQuest) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } CGameClientDispatch* lpGameClientDispatch = lpTarget->GetDispatcher(); if (NULL == lpGameClientDispatch) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : GameClientDispatch °¡ NULL ÀÔ´Ï´Ù.", lpTarget->GetCID()); break; } if (false == lpTarget->HasQuest(wQuestID)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : QuestID:0x%x Äù½ºÆ®¸¦ °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù.", lpTarget->GetCID(), wQuestID); break; } if (true == lpTarget->HasExecutingQuest(wQuestID)) { lpTarget->CancelQuest(wQuestID); GameClientSendPacket::SendCharCancelQuest(lpGameClientDispatch->GetSendStream(), lpTarget->GetCID(), wQuestID, PktAdmin::NO_SERVER_ERR); break; } if (true == lpTarget->HasHistoryQuest(wQuestID)) { if (true == lpTarget->DeleteHistoryQuest(wQuestID)) { // Äù½ºÆ®¿¡ ÀÇÇØ ¹Þ´Â ¿µÇâÀ» °è»ê lpTarget->CalculateStatusData(false); if (true == lpTarget->CalculateMaxSkillSlot()) { GameClientSendPacket::SendCharStateRedistribution(lpGameClientDispatch->GetSendStream(), lpTarget->GetCID(), lpTarget->GetState(), lpTarget->GetSkill(), PktBase::NO_SERVER_ERR); } } } GameClientSendPacket::SendCharQuestInfo(lpGameClientDispatch->GetSendStream(), lpTarget); sprintf(szCommand, "/deletequest %s 0x%08x", lpTarget->GetCharacterName(), wQuestID); break; } // BATTLEGROUND_SERVER ¿î¿µÀÚ ¸í·É case PktAdmin::FINISH_GAME: // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (½ÂÆÐ °áÁ¤) { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); VirtualArea::MapInfo& mapInfo = lpBGServerMap->GetMapInfo(); VirtualArea::ResultInfo& resultInfo = lpBGServerMap->GetResultInfo(); resultInfo.m_cWinRace = lpBGServerMap->RuleCheck(true); std::copy(&mapInfo.m_wScore[0], &mapInfo.m_wScore[CClass::MAX_RACE], &resultInfo.m_wScore[0]); lpBGServerMap->SendResultInfo(); sprintf(szCommand, "/finish %d", wMapNumber); } break; } case PktAdmin::DRAW_GAME: // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (¹«½ÂºÎ) { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); VirtualArea::MapInfo& mapInfo = lpBGServerMap->GetMapInfo(); VirtualArea::ResultInfo& resultInfo = lpBGServerMap->GetResultInfo(); resultInfo.m_cWinRace = lpBGServerMap->RuleCheck(true); resultInfo.m_cWinRace = CClass::MAX_RACE; std::copy(&mapInfo.m_wScore[0], &mapInfo.m_wScore[CClass::MAX_RACE], &resultInfo.m_wScore[0]); lpBGServerMap->SendResultInfo(); sprintf(szCommand, "/draw %d", wMapNumber); } break; } case PktAdmin::IGNORE_GAME: // ÇØ´ç ¹æÀÇ °æ±â Á¾·á (½ÂÆÐ ¹«½Ã) { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); lpBGServerMap->RuleCheck(true); sprintf(szCommand, "/ignore %d", wMapNumber); } break; } case PktAdmin::SET_MAX: // ÇØ´ç ¹æÀÇ ÃÖ´ë Àοø¼ö ¼³Á¤ { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); unsigned char cMaxCharNum = static_cast(dwAmount); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); lpBGServerMap->GetMapInfo().m_cMaxCharNumOfNation = cMaxCharNum; lpBGServerMap->SendMapInfo(); sprintf(szCommand, "/max %d %d", wMapNumber, cMaxCharNum); } break; } case PktAdmin::SET_SCORE: // ÇØ´ç ¹æÀÇ ¸ñÇ¥ Á¡¼ö ¼³Á¤ { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); unsigned short wTargetScore = static_cast(dwAmount); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); lpBGServerMap->GetMapInfo().m_wTargetScore = wTargetScore; lpBGServerMap->SendMapInfo(); sprintf(szCommand, "/score %d %d", wMapNumber, wTargetScore); } break; } case PktAdmin::SET_LIMIT_TIME: // ÇØ´ç ¹æÀÇ ½Ã°£ Á¦ÇÑ ¼³Á¤ { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); unsigned char cLimitMin = static_cast(dwAmount); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); lpBGServerMap->GetMapInfo().m_cLimitMin = cLimitMin; lpBGServerMap->GetMapInfo().m_cRemainPlayMin = cLimitMin; lpBGServerMap->ResetEnteringMin(cLimitMin); // µé¾î¿Ã ½ÃÁ¡ÀÇ ³²Àº ½Ã°£À» cLimit ·Î ÀüºÎ ¸®¼Â if (lpBGServerMap->IsPlaying()) { lpBGServerMap->SetRemainTime( timeGetTime() + cLimitMin * VirtualArea::MILLISEC_PER_MINUTE ); } lpBGServerMap->SendMapInfo(); sprintf(szCommand, "/time %d %d", wMapNumber, cLimitMin); } break; } case PktAdmin::SET_REST_TIME: // ÇØ´ç ¹æÀÇ ½¬´Â ½Ã°£ ¼³Á¤ { unsigned short wMapNumber = lpPktAdmin->m_usProtoTypeID; unsigned short wMapIndex = static_cast(VirtualArea::BGSERVERMAP | wMapNumber); unsigned char cRestMin = static_cast(dwAmount); VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex); if (NULL != lpVirtualArea) { VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast(lpVirtualArea); lpBGServerMap->GetMapInfo().m_cRestMin = cRestMin; lpBGServerMap->GetMapInfo().m_cRemainRestMin = cRestMin; if (lpBGServerMap->IsResting()) { lpBGServerMap->SetRemainTime( timeGetTime() + cRestMin * VirtualArea::MILLISEC_PER_MINUTE ); } lpBGServerMap->SendMapInfo(); sprintf(szCommand, "/rest %d %d", wMapNumber, cRestMin); } break; } case PktAdmin::SET_ITEM_TEMP_INVEN: { Item::CItem* lpItem = Item::CItemFactory::GetInstance().CreateItem(lpPktAdmin->m_usProtoTypeID); if (NULL != lpItem) { if (lpItem->IsSet(Item::DetailData::STACKABLE)) { lpItem->SetNumOrDurability(static_cast(dwAmount)); } if (false == lpTarget->SetItem(Item::ItemPos(TakeType::TS_TEMPINVEN, 0), lpItem)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·É ¿À·ù : %sÀÇ Àӽà Àκ¥Å丮¿¡ ¾ÆÀÌÅÛÀ» ³Ö¾îÁִµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù.", dwAdminCID, lpPktAdmin->m_stName); DELETE_ITEM(lpItem); return true; } sprintf(szCommand, "/addtempinven %s %d %d", lpTarget->GetCharacterName(), lpPktAdmin->m_usProtoTypeID, dwAmount); DETLOG3(g_Log, "CID:0x%08x ¾îµå¹ÎÀÌ ¾ÆÀÌÅÛÀ» »ý¼ºÇÏ¿© Àӽà Àκ¥Å丮¿¡ ³Ö¾îÁÖ¾ú½À´Ï´Ù. ¾ÆÀÌÅÛ(ID:%d, °¹¼ö:%d)", lpTarget->GetCID(), lpPktAdmin->m_usProtoTypeID, dwAmount); } break; } // ½ºÆç °ü·Ã ¿î¿µÀÚ ¸í·· case PktAdmin::ADD_SPELL: { unsigned short wSpellID = static_cast(min(static_cast(lpPktAdmin->m_dwAmount), USHRT_MAX)); unsigned short wSpellLevel = static_cast(min(static_cast(lpPktAdmin->m_dwAmount2), USHRT_MAX)); unsigned long dwDurationSec = lpPktAdmin->m_dwAmount3; dwDurationSec = dwDurationSec == 0 ? CSpell::INFINITE_DURATION : dwDurationSec; if (false == AddSpell(lpAdmin, lpTarget, wSpellID, wSpellLevel, dwDurationSec)) { ERRLOG2(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·ÉÀ¸·Î ½ºÆç ºÎ¿© ½ÇÆÐ (SpellID : %d)", lpTarget->GetCID(), wSpellID); return true; } sprintf(szCommand, "/addspell %s 0x%08x %d %d", lpTarget->GetCharacterName(), wSpellID, wSpellLevel, dwDurationSec); break; } case PktAdmin::DELETE_SPELL: { unsigned char cSpellType = static_cast(lpPktAdmin->m_usProtoTypeID); lpTarget->GetSpellMgr().GetAffectedInfo().RemoveChantBySpellType(cSpellType); lpTarget->GetSpellMgr().GetAffectedInfo().RemoveEnchantBySpellType(cSpellType); sprintf(szCommand, "/deletespell %s %d", lpTarget->GetCharacterName(), cSpellType); break; } // ij¸¯ÅÍ ¹­¾îµÎ±â °ü·Ã ¿î¿µÀÚ ¸í·É case PktAdmin::STOP: { if (false == AddSpell(lpAdmin, lpTarget, Skill::SpellID::Hold, 1, Skill::Disenchant::INFINITE_NUM)) { ERRLOG1(g_Log, "CID:0x%08x ¾îµå¹Î ¸í·ÉÀ¸·Î ij¸¯ÅÍ ¹­¾îµÎ±â ½ÇÆÐ", lpTarget->GetCID()); return true; } sprintf(szCommand, "/stop %s", lpTarget->GetCharacterName()); break; } case PktAdmin::STOP_OFF: { lpTarget->GetSpellMgr().GetAffectedInfo().RemoveChantBySpellType(Skill::SpellID::Hold); lpTarget->GetSpellMgr().GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::Hold); sprintf(szCommand, "/stopoff %s", lpTarget->GetCharacterName()); break; } case PktAdmin::CHAT_BAN: { GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpChatDispatch) { GameClientSendPacket::SendCharChatBan(lpChatDispatch->GetSendStream(), dwAdminCID, lpTarget->GetCID(), dwAmount); } break; } case PktAdmin::CHAT_OK: { GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpChatDispatch) { GameClientSendPacket::SendCharChatBan(lpChatDispatch->GetSendStream(), dwAdminCID, lpTarget->GetCID(), 0); } break; } // °øÇåÈÆÀå Æ÷ÀÎÆ®. case PktAdmin::REALM_POINT: { if(dwAmount>=0 && dwAmount<=5) { // DB Agent º¸³½´Ù. GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if(lpDBAgentDispatch) { CSendStream& SendStream = lpDBAgentDispatch->GetSendStream(); char* lpBuffer = SendStream.GetBuffer(sizeof(PktRealmPoint)); if (lpBuffer) { PktRealmPoint* lpPktRealmPoint = reinterpret_cast(lpBuffer); lpPktRealmPoint->m_dwCID = lpTarget->GetCID(); lpPktRealmPoint->m_cRealmPoint = static_cast(dwAmount); lpPktRealmPoint->m_cType = PktRealmPoint::REALM_JOIN; return SendStream.WrapCrypt(sizeof(PktRealmPoint), CmdRealmPoint, 0, 0); } } sprintf(szCommand, "/realmpoint %s %d", lpTarget->GetCharacterName(), dwAmount); } break; } default: break; } // Admin ¸í·É¾î ·Î±× ÆÐŶ // if(lpAdmin && lpTarget) { GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if(lpDBAgentDispatch) { char* lpBuffer = lpDBAgentDispatch->GetSendStream().GetBuffer(sizeof(PktAdminCommandLog)); if(lpBuffer) { PktAdminCommandLog* lpPktAdminCommandLog = reinterpret_cast(lpBuffer); lpPktAdminCommandLog->m_dwAdminCID = lpAdmin->GetCID(); lpPktAdminCommandLog->m_dwCID = lpTarget->GetCID(); memcpy(lpPktAdminCommandLog->m_szCommand, szCommand, PktAdminCommandLog::MAX_COMMAND_SIZE); lpDBAgentDispatch->GetSendStream().WrapHeader(sizeof(PktAdminCommandLog), CmdAdminCommandLog, 0, PktBase::NO_SERVER_ERR); } } } return true; } bool GameClientParsePacket::AddSpell(CCharacter* lpCaster, CCharacter* lpVictim, unsigned short wSpellID, unsigned short wSpellLevel, unsigned long dwDurationSec) { if (!lpCaster || !lpVictim) { return false; } CSpell* pSpell = NULL ; unsigned short wResult = CSpell::NO_ENCHANT_ERROR ; switch (wSpellID) { // Chant case Skill::SpellID::BattleSong : { pSpell = new CBattleSongSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; case Skill::SpellID::StealHand : { pSpell = new CStealHandSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; case Skill::SpellID::MaintenanceChant : { pSpell = new CMaintenanceChantSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; case Skill::SpellID::AccelerationChant : { pSpell = new CAccelerationChantSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; case Skill::SpellID::LifeAura : { pSpell = new CLifeAuraSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; case Skill::SpellID::SpeedBuff : { pSpell = new CSpeedBuffChantSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec), 0); } break; // Enchant case Skill::SpellID::ExpOrb : { //CExpOrbSpell wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::PAYBUFF_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::LuckyOrb : { //CLuckyOrbSpell wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::PAYBUFF_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::PowerStatue : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::STATUE_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::IntStatue : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::STATUE_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::ExpStatue : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::STATUE_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::WealthStatue : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::STATUE_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::CD_8D12: case Skill::SpellID::CD_8D14: case Skill::SpellID::CD_8D16: case Skill::SpellID::CD_99A1: case Skill::SpellID::CD_99A2: case Skill::SpellID::CD_99A3: case Skill::SpellID::DemagePotion: case Skill::SpellID::ArmorPotion: case Skill::SpellID::HitRatePotion: case Skill::SpellID::EvadePotion: case Skill::SpellID::MaxHPPotion: case Skill::SpellID::MaxMPPotion: case Skill::SpellID::MPRegenPotion: case Skill::SpellID::HPRegenPotion: case Skill::SpellID::CriticalPotion: case Skill::SpellID::BlockPotion: case Skill::SpellID::SpeedPotion: case Skill::SpellID::DeCoolDownPotion: case Skill::SpellID::MagicPowerPotion: case Skill::SpellID::MagicResistPotion: { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::BUFF_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Regeneration : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Slow : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::ArmorBroken : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Blaze : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Charging : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Stealth : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::ManaShell : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Encourage : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::EnchantWeapon : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::BrightArmor : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::HardenSkin : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Flexibility : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Guard : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Hold : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::PHYSICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Stun : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Frozen : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Poisoned : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::LowerStrength : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Invincible : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Hide : { return true; } break; case Skill::SpellID::StoneForm : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::CounterAttack : { return true; } break; case Skill::SpellID::Envenom : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::BombSet : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::Fired : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::CurseOfBlind : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::HundredLevel : return true; /* // edith 100·¦´Þ¼º ÀÌÆÑÆ® case Skill::SpellID::HundredLevel : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::ETERNAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; */ case Skill::SpellID::DeCoolDown : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::MAGICAL_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; case Skill::SpellID::MichaelBless : { wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpCaster, Skill::SpellType::PAYBUFF_SPELL, wSpellID, wSpellLevel, dwDurationSec))(lpVictim); return (wResult == CSpell::ENCHANT_FAIL_BY_ENEMY_ENCHANT) ? false : true; } break; } // Chant Spell if (pSpell) { CParty* pParty = lpVictim->GetParty(); if (pParty) { pParty->GetPartySpellMgr().AddAffectedToAllMember(pSpell, lpCaster->GetMapIndex()); } else { unsigned short wError = CSpell::NO_ENCHANT_ERROR; pSpell->AddAffected(lpVictim, wError); } CGlobalSpellMgr::GetInstance().Add(pSpell); return true; } return false; } bool GameClientParsePacket::ParseCharNameChange(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCharNameChange), GameClientDispatch); PktCharNameChange* lpPktCharNameChange = reinterpret_cast(lpPktBase); /* // ÆÐŶ ÁøÇà¼ø¼­ -Game bool GameClientParsePacket::ParseCharNameChange(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) -DBAgent bool CGameDispatch::ChangeName(PktBase* lpPktBase) -Game bool DBAgentPacketParse::ParseCharNameChangeAck(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) */ const char* szChangeName = lpPktCharNameChange->m_szCharName; unsigned long dwUID = lpPktCharNameChange->m_dwUID; unsigned long dwCID = lpPktCharNameChange->m_dwCID; Item::ItemPos ItemPos = lpPktCharNameChange->m_ItemPos; // Çã°¡¼­ À§Ä¡ unsigned short usError = 0; CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); if (0 == lpCharacter || lpCharacter->GetUID() != dwUID || lpCharacter->GetCID() != dwCID) { ERRLOG3(g_Log, "UID:%10u / CID:%10u / CharacterPointer:0x%08X / ij¸¯ÅÍ À̸§ º¯°æ ½ÇÆÐ : ÀÏÄ¡Çϴ ij¸¯ÅÍ ¾øÀ½", dwUID, dwCID, lpCharacter); usError = PktCharNameChange::ERR_CANNOT_FIND_CHARACTER; } /* // »èÁ¦ ¾ÆÀÌÅÛ ±â´ÉÀÌ µé¾î°¨À¸·Î¼­ ÇØ´ç ·ÎÁ÷Àº Á¦¿Ü else if (0 == lpCharacter->GetNameChangeCount()) { ERRLOG2(g_Log, "UID:%10u / CID:%10u / À̸§ º¯°æ Ä«¿îÆ®°¡ 0ÀÔ´Ï´Ù", dwUID, dwCID); usError = PktCharNameChange::ERR_NAMECHANGE_COUNT; } */ else if (!CharCreate::CheckCharCreateName(szChangeName, CServerSetup::GetInstance().GetHanCheck())) { // »ý¼º ij¸¯ÅÍ À̸§ °Ë»ç ERRLOG3(g_Log, "UID:%10u / CID:%10u / À߸øµÈ ij¸¯ÅÍ À̸§ %s", dwUID, dwCID, szChangeName); usError = PktCharNameChange::ERR_INVALID_NAME; } else if (!Filter::NameCheck(szChangeName)) { // »ý¼º ij¸¯ÅÍ À̸§ °Ë»ç ERRLOG3(g_Log, "UID:%10u / CID:%10u / »ç¿ëÇÒ ¼ö ¾ø´Â ij¸¯ÅÍ À̸§ %s", dwUID, dwCID, szChangeName); usError = PktCharNameChange::ERR_INVALID_NAME; } else if(!lpCharacter->CheckRenameWarrant(ItemPos, false)) { // »ý¼º ij¸¯ÅÍ À̸§ °Ë»ç ERRLOG2(g_Log, "UID:%10u / CID:%10u / °è¸íÇã°¡¼­ ¾ÆÀÌÅÛ¿¡ ¹®Á¦°¡ÀÖ´Ù.", dwUID, dwCID); usError = PktCharNameChange::ERR_NAMECHANGE_ITEM; } else { GET_SINGLE_DISPATCH(lpAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if(0 == lpAgentDispatch || !GameClientSendPacket::SendCharNameChange( lpAgentDispatch->GetSendStream(), dwUID, dwCID, szChangeName, 0, &ItemPos, 0)) { usError = PktCharNameChange::ERR_SERVER; } } if(0 != usError) { // Ŭ¶óÀÌ¾ðÆ®·Î ¿¡·¯Äڵ带 º¸³½´Ù. GameClientSendPacket::SendCharNameChange(GameClientDispatch.GetSendStream(), dwUID, dwCID, szChangeName, 0, &ItemPos, usError); } return true; }