Files
Client/Server/RylServerProject/RylGameLibrary/Network/Dispatch/GameClient/ParseCharAdmin.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

2149 lines
69 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include <Creature/CreatureManager.h>
#include <Creature/Character/Character.h>
#include <Creature/Character/CharacterClass.h>
#include <Creature/Character/CharacterCreate.h>
#include <Creature/Character/ExpTable.h>
#include <Creature/Monster/Monster.h>
#include <Creature/Monster/AwardTable.h>
#include <Creature/Monster/VirtualMonsterMgr.h>
#include <Network/Dispatch/ParseUtils.h>
#include <Network/Dispatch/Chat/ChatDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentRequest.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharAttack.h>
#include <Network/Dispatch/GameClient/SendCharEtc.h>
#include <Network/Dispatch/GameClient/SendCharAdmin.h>
#include <Network/Dispatch/GameClient/SendCharQuest.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Dispatch/GameClient/SendCharLevelUp.h>
#include <Network/Packet/ChatPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#include <Skill/SkillTable.h>
#include <Skill/Spell/SpellTable.h>
#include <Skill/Spell/GlobalSpellMgr.h>
#include <Map/FieldMap/CellManager.h>
#include <Map/FieldMap/VirtualArea/VirtualArea.h>
#include <Map/FieldMap/VirtualArea/VirtualAreaMgr.h>
#include <Map/FieldMap/VirtualArea/BGServer/BGServerMap.h>
#include <Log/LogStruct.h>
#include <Log/ItemLog.h>
#include <Community/Party/Party.h>
#include <Quest/QuestMgr.h>
#include <Item/Item.h>
#include <Item/ItemFactory.h>
#include <Utility/Filter/Filter.h>
#include <Utility/Setup/ServerSetup.h>
#include "GameClientDispatch.h"
#include "ParseCharAdmin.h"
#include <Network/Packet/PacketStruct/CastlePacket.h>
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<PktAdmin*>(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<unsigned char>(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<unsigned long>(lpTarget->GetStatus().m_nLevel) < dwAmount)
{
if (false == lpTarget->IncrementExp(
static_cast<unsigned long>(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<CInvincibleSpell>(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<unsigned short>(Item::EquipType::AAA_GRADE));
lpPktAdmin->m_usProtoTypeID = std::min(lpPktAdmin->m_usProtoTypeID, static_cast<unsigned short>(Item::EquipType::F_GRADE));
Item::EquipType::Grade eGrade = static_cast<Item::EquipType::Grade>(lpPktAdmin->m_usProtoTypeID);
unsigned char cMonsterLevel =
std::min(static_cast<unsigned char>(Creature::MONSTER_MAX_LEVEL), static_cast<unsigned char>(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<CAggresiveCreature *>(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<unsigned char>(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<unsigned char>(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<unsigned long>(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<unsigned char>(lpPktAdmin->m_Position.fPointX) - 1; // 1ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½
unsigned char cSkillLevel = static_cast<unsigned char>(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; i<count; ++i)
{
if (!lpTarget->SkillCreate(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<unsigned char>(lpPktAdmin->m_Position.fPointX) - 1; // 1ºÎÅÍ ½ÃÀÛÀ¸·Î ÀÔ·Â ¹ÞÀ½
unsigned char cSkillLevel = static_cast<unsigned char>(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<unsigned char>(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; i<count; ++i)
{
Item::ItemPos itemPos(TakeType::TS_ADMIN, 0);
if (false == lpTarget->SkillErase(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<unsigned char>(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<unsigned char>(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<unsigned char>(lpTarget->GetSkillSlotIndex(wAbilityID));
int count = lpTarget->GetSkillLockCount(wAbilityID)-wAbilityLV;
for (int i=0; i<count; ++i)
{
Item::ItemPos itemPos(TakeType::TS_ADMIN, 0);
if (false == lpTarget->AbilityErase(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<unsigned char>(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<unsigned long>(lpTarget->GetStatus().m_nLevel) < dwAmount)
{
if (false == lpTarget->IncrementExp(
static_cast<unsigned long>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
unsigned char cMaxCharNum = static_cast<unsigned char>(dwAmount);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
unsigned short wTargetScore = static_cast<unsigned short>(dwAmount);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
unsigned char cLimitMin = static_cast<unsigned char>(dwAmount);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned short>(VirtualArea::BGSERVERMAP | wMapNumber);
unsigned char cRestMin = static_cast<unsigned char>(dwAmount);
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (NULL != lpVirtualArea)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(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<unsigned char>(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<unsigned short>(min(static_cast<long>(lpPktAdmin->m_dwAmount), USHRT_MAX));
unsigned short wSpellLevel = static_cast<unsigned short>(min(static_cast<long>(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<unsigned char>(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<PktRealmPoint*>(lpBuffer);
lpPktRealmPoint->m_dwCID = lpTarget->GetCID();
lpPktRealmPoint->m_cRealmPoint = static_cast<unsigned char>(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<PktAdminCommandLog*>(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<CExpOrbSpell>(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<CLuckyOrbSpell>(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<CPowerStatueSpell>(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<CIntStatueSpell>(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<CExpStatueSpell>(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<CWealthStatueSpell>(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<CBuffPotionSpell>(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<CRegenerationSpell>(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<CSlowSpell>(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<CArmorBrokenSpell>(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<CBlazeSpell>(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<CChargingSpell>(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<CStealthSpell>(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<CManaShellSpell>(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<CEncourageSpell>(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<CEnchantWeaponSpell>(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<CBrightArmorSpell>(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<CHardenSkinSpell>(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<CFlexibilitySpell>(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<CGuardSpell>(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<CHoldSpell>(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<CStunSpell>(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<CFrozenSpell>(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<CPoisonedSpell>(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<CLowerStrengthSpell>(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<CInvincibleSpell>(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<CStoneFormSpell>(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<CEnvenomSpell>(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<CBombSetSpell>(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<CFiredSpell>(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<CCurseOfBlindSpell>(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<CHundredLevelSpell>(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<CDeCoolDownSpell>(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<CMichaelBlessSpell>(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<PktCharNameChange*>(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;
}