1539 lines
No EOL
71 KiB
C++
1539 lines
No EOL
71 KiB
C++
#include "StdAfx.h"
|
||
#include "DNGMCommand.h"
|
||
#include "DNCheatCommand.h"
|
||
#include "DNUserSendManager.h"
|
||
#include "DNUserQuest.h"
|
||
#include "DNGameDataManager.h"
|
||
#include "DNLogConnection.h"
|
||
#include "DNUserSession.h"
|
||
|
||
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
|
||
#include "DNMasterConnection.h"
|
||
#include "DNFieldDataManager.h"
|
||
#include "DNScriptAPI.h"
|
||
#include "DNPartyManager.h"
|
||
#include "DNUserSessionManager.h"
|
||
#include "DNField.h"
|
||
#include "DNAuthManager.h"
|
||
#include "DNCountryUnicodeSet.h"
|
||
#include "DNGuildVillage.h"
|
||
|
||
extern TVillageConfig g_Config;
|
||
|
||
#elif defined(_GAMESERVER)
|
||
|
||
#include "DNGameRoom.h"
|
||
#include "DNActor.h"
|
||
#include "TaskManager.h"
|
||
#include "DnItemTask.h"
|
||
#include "DnDropItem.h"
|
||
#include "EtActionCoreMng.h"
|
||
#include "DNGameServerScriptApi.h"
|
||
#include "DnGameTask.h"
|
||
#include "DNMasterConnection.h"
|
||
#include "DNMasterConnectionManager.h"
|
||
#include "PvPRespawnLogic.h"
|
||
#include "DnPlayerActor.h"
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
#include "PvPGameMode.h"
|
||
#endif
|
||
#endif
|
||
|
||
enum eGMCommandType
|
||
{
|
||
GM_Help = 0,
|
||
#if defined(_CH)
|
||
GM_HideOn, // 숨기
|
||
GM_HideOff, // 나타남
|
||
GM_ChangeMap, // 맵이동
|
||
GM_Trace, // 유저 추적
|
||
GM_Warp,
|
||
GM_Trace_AID, // 어카운트아이디로 유저 추적
|
||
GM_Trace_CID, // 캐릭터아이디로 유저 추적
|
||
GM_Recall, // 유저 소환
|
||
GM_UserBan, // 유저 끊기
|
||
GM_Fatigue,
|
||
GM_HP,
|
||
GM_WEventClear, // 주말이벤트 클리어
|
||
|
||
#elif defined (_US)
|
||
GM_HideOn,
|
||
GM_HideOff,
|
||
GM_ChangeMap,
|
||
GM_Trace,
|
||
GM_UserBan,
|
||
GM_SummonMob,
|
||
GM_AllKillMob,
|
||
GM_ZoneNotice,
|
||
GM_HP,
|
||
GM_SetLevel,
|
||
GM_MakeItem,
|
||
GM_Recall,
|
||
GM_Notice,
|
||
GM_MakeCoin,
|
||
GM_WhisperOn, // 귓속말시작
|
||
GM_WhisperOff, // 귓속말종료
|
||
GM_Warp,
|
||
#elif defined (_SG) || defined (_TH)
|
||
GM_Notice,
|
||
GM_WhisperOn,
|
||
GM_WhisperOff,
|
||
GM_HideOn,
|
||
GM_HideOff,
|
||
GM_SummonMob,
|
||
GM_AllKillMob,
|
||
GM_MakeItem,
|
||
GM_MakeCoin,
|
||
GM_SetLevel,
|
||
GM_ChangeMap,
|
||
GM_SetQuest,
|
||
GM_ZoneNotice,
|
||
GM_Trace,
|
||
GM_Warp,
|
||
GM_Trace_AID,
|
||
GM_Trace_CID,
|
||
GM_Recall,
|
||
GM_UserBan,
|
||
GM_Fatigue,
|
||
GM_DestroyPvP,
|
||
GM_RepairAll,
|
||
GM_GCreate,
|
||
GM_GDismiss,
|
||
#elif defined (_ID)
|
||
GM_Notice,
|
||
GM_WhisperOn,
|
||
GM_WhisperOff,
|
||
GM_HideOn,
|
||
GM_HideOff,
|
||
GM_SummonMob,
|
||
GM_AllKillMob,
|
||
GM_MakeItem,
|
||
GM_MakeCoin,
|
||
GM_SetLevel,
|
||
GM_ChangeMap,
|
||
GM_SetQuest,
|
||
GM_ZoneNotice,
|
||
GM_Trace,
|
||
GM_Warp,
|
||
GM_Trace_AID,
|
||
GM_Trace_CID,
|
||
GM_Recall,
|
||
GM_UserBan,
|
||
GM_Fatigue,
|
||
GM_DestroyPvP,
|
||
#elif defined (_EU)
|
||
GM_Notice,
|
||
GM_WhisperOn, // 귓속말시작
|
||
GM_WhisperOff, // 귓속말종료
|
||
GM_HideOn, // 숨기
|
||
GM_HideOff, // 나타남
|
||
GM_SummonMob, // 몹소환
|
||
GM_AllKillMob, // 몹소멸
|
||
GM_MakeItem, // 아이템생성
|
||
GM_MakeCoin, // 금전생성
|
||
GM_SetLevel, // 레벨
|
||
GM_ChangeMap, // 맵이동
|
||
GM_SetQuest, // 퀘스트상태
|
||
GM_ZoneNotice, // gm이 있는 존의 모든 채널에 공지
|
||
GM_Trace, // 유저 추적
|
||
GM_Warp,
|
||
GM_Trace_AID, // 어카운트아이디로 유저 추적
|
||
GM_Trace_CID, // 캐릭터아이디로 유저 추적
|
||
GM_Recall, // 유저 소환
|
||
GM_UserBan, // 유저 끊기
|
||
GM_Fatigue,
|
||
GM_DestroyPvP, // 강제 피뷔피룸파괴
|
||
#else
|
||
GM_Notice,
|
||
GM_WhisperOn, // 귓속말시작
|
||
GM_WhisperOff, // 귓속말종료
|
||
GM_HideOn, // 숨기
|
||
GM_HideOff, // 나타남
|
||
GM_SummonMob, // 몹소환
|
||
GM_AllKillMob, // 몹소멸
|
||
GM_MakeItem, // 아이템생성
|
||
GM_MakeCoin, // 금전생성
|
||
GM_SetLevel, // 레벨
|
||
GM_ChangeMap, // 맵이동
|
||
GM_SetQuest, // 퀘스트상태
|
||
GM_ZoneNotice, // gm이 있는 존의 모든 채널에 공지
|
||
GM_Trace, // 유저 추적
|
||
GM_Warp,
|
||
GM_Trace_AID, // 어카운트아이디로 유저 추적
|
||
GM_Trace_CID, // 캐릭터아이디로 유저 추적
|
||
GM_Recall, // 유저 소환
|
||
GM_UserBan, // 유저 끊기
|
||
GM_Fatigue,
|
||
GM_DestroyPvP, // 강제 피뷔피룸파괴
|
||
GM_WEventClear, // 주말이벤트 클리어
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
GM_WORLDPVPROOMALLKILLREDTEAM, // 월드통합전장 올킬전 팀셋팅
|
||
GM_WORLDPVPROOMALLKILLBLUETEAM,
|
||
GM_WORLDPVPROOMTOURNAMENTSETTING, // 월드통합전장 토너먼트 셋팅
|
||
#endif
|
||
#if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
GM_MuteUser, // [JPN]유저 체팅 금지
|
||
#endif // #if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
#endif
|
||
GM_END
|
||
};
|
||
|
||
__GMCmdLineDefineStruct g_GMCmdList[] =
|
||
{
|
||
{ GM_Help, _T("/?"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("운영자명령어도움말"), _T("Help") },
|
||
#if defined(_CH)
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("Hide On") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("Hide Off") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)")},
|
||
{ GM_Trace, _T("/trace"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)"), _T("/wapr CharacterName), (Move Character in Only GameServer)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)")},
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue")},
|
||
{ GM_HP, _T("/hp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hp (1 - 100)"), _T("/hp (1 - 100)") },
|
||
{ GM_WEventClear, _T("/clearevent"), CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/clearevent"), _T("/clearevent") },
|
||
|
||
#elif defined (_US)
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("Hide On") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("Hide Off") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)")},
|
||
{ GM_Trace, _T("/trace"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)")},
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_HP, _T("/hp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hp (1 - 100)"), _T("/hp (1 - 100)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/recall (CharacterName)"), _T("/recall (CharacterName)") },
|
||
{ GM_Notice, _T("/notice"), CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)"), _T("/wapr CharacterName), (Move Character in Only GameServer)") },
|
||
#elif defined (_SG)
|
||
{ GM_Notice, _T("/notice"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("/hideon") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("/hideoff") },
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makeitem (아이템인덱스) (아이템개수) (강화) (잠재력) (캐쉬템일때 기간)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)") },
|
||
{ GM_SetQuest, _T("/setquest"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setquest (QuestID) (0: 미완료, 1: 완료)"), _T("/setquest (QuestID) (0: Not Yet, 1:Complete)") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_Trace, _T("/trace"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)") },
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue") },
|
||
{ GM_DestroyPvP, _T("/destroypvp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/destroypvp"), _T("/destroypvp(PvP인덱스)(강제로 이기게할 길드이름)") },
|
||
{ GM_RepairAll, _T("/repairall"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/repairall), 설명(모든아이템을 수리합니다.)"), _T("Usage(/repairall), Description(Repaire all items your character has)") },
|
||
{ GM_GCreate, _T("/gcreate"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/gcreate 길드이름), 설명(길드 창설)"), _T("Usage(/gcreate GuildName), Description(Create Guild)") },
|
||
{ GM_GDismiss, _T("/gdismiss"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/gdismiss), 설명(길드 해산)"), _T("Usage(/gdismiss), Description(Dismiss Guild)") },
|
||
#elif defined (_TH)
|
||
{ GM_Notice, _T("/notice"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("/hideon") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("/hideoff") },
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Master|CmdAuth_QA, _T("/makeitem (아이템인덱스) (아이템개수) (강화) (잠재력) (캐쉬템일때 기간)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)") },
|
||
{ GM_SetQuest, _T("/setquest"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setquest (QuestID) (0: 미완료, 1: 완료)"), _T("/setquest (QuestID) (0: Not Yet, 1:Complete)") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_Trace, _T("/trace"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)") },
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue") },
|
||
{ GM_DestroyPvP, _T("/destroypvp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/destroypvp"), _T("/destroypvp(PvP인덱스)(강제로 이기게할 길드이름)") },
|
||
{ GM_RepairAll, _T("/repairall"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/repairall), 설명(모든아이템을 수리합니다.)"), _T("Usage(/repairall), Description(Repaire all items your character has)") },
|
||
{ GM_GCreate, _T("/gcreate"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/gcreate 길드이름), 설명(길드 창설)"), _T("Usage(/gcreate GuildName), Description(Create Guild)") },
|
||
{ GM_GDismiss, _T("/gdismiss"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/gdismiss), 설명(길드 해산)"), _T("Usage(/gdismiss), Description(Dismiss Guild)") },
|
||
#elif defined (_ID)
|
||
{ GM_Notice, _T("/notice"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("/hideon") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("/hideoff") },
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makeitem (아이템인덱스) (아이템개수) (강화) (잠재력) (캐쉬템일때 기간)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)") },
|
||
{ GM_SetQuest, _T("/setquest"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setquest (QuestID) (0: 미완료, 1: 완료)"), _T("/setquest (QuestID) (0: Not Yet, 1:Complete)") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_Trace, _T("/trace"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)") },
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue") },
|
||
{ GM_DestroyPvP, _T("/destroypvp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/destroypvp(PvP인덱스)(강제로 이기게할 길드이름)"), _T("/destroypvp(PvPIndex)(ForceWinGuildName)") },
|
||
#elif defined(_EU) //유럽에서는 CmdAuth_New는 RGM권한으로 사용합니다
|
||
{ GM_Notice, _T("/notice"), CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("/hideon") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("/hideoff") },
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Master|CmdAuth_QA, _T("/makeitem (아이템인덱스) (아이템개수) (강화) (잠재력) (캐쉬템일때 기간)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)") },
|
||
{ GM_SetQuest, _T("/setquest"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setquest (QuestID) (0: 미완료, 1: 완료)"), _T("/setquest (QuestID) (0: Not Yet, 1:Complete)") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_Trace, _T("/trace"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)") },
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue") },
|
||
{ GM_DestroyPvP, _T("/destroypvp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/destroypvp(PvP인덱스)(강제로 이기게할 길드이름)"), _T("/destroypvp(PvPIndex)(ForceWinGuildName)") },
|
||
#else
|
||
{ GM_Notice, _T("/notice"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/notice (Notice)"), _T("/notice (Notice)") },
|
||
{ GM_WhisperOn, _T("/w_on"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_on (CharacterName)"), _T("/w_on (CharacterName) - Whispser On") },
|
||
{ GM_WhisperOff, _T("/w_off"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/w_off (CharacterName)"), _T("/w_off (CharacterName) - Whisper Off") },
|
||
{ GM_HideOn, _T("/hideon"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideon"), _T("/hideon") },
|
||
{ GM_HideOff, _T("/hideoff"), CmdAuth_Intern|CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/hideoff"), _T("/hideoff") },
|
||
{ GM_SummonMob, _T("/summonmob"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/summonmob (MonsterID) (MonsterCount)"), _T("/summonmob (MonsterID) (MonsterCount)") },
|
||
{ GM_AllKillMob, _T("/allkillmon"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/allkillmon"), _T("/allkillmon") },
|
||
{ GM_MakeItem, _T("/makeitem"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makeitem (아이템인덱스) (아이템개수) (강화) (잠재력) (캐쉬템일때 기간)"), _T("/makeitem (ItemIndex) (Count) (Enchant) (Potential) (Cash Period)") },
|
||
|
||
{ GM_MakeCoin, _T("/makecoin"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/makecoin (Coin)"), _T("/makecoin (Coin)") },
|
||
{ GM_SetLevel, _T("/setlevel"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setlevel (Level)"), _T("/setlevel (Level)") },
|
||
{ GM_ChangeMap, _T("/go"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/go (MapID) (0-4 : 쉬움, 보통, 어려움, 마스터, 어비스)"), _T("/go (MapID) (0-4 : Easy, Normal, Hard, Master, Abyss)") },
|
||
{ GM_SetQuest, _T("/setquest"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/setquest (QuestID) (0: 미완료, 1: 완료)"), _T("/setquest (QuestID) (0: Not Yet, 1:Complete)") },
|
||
{ GM_ZoneNotice, _T("/zone"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/zone (Notice)"), _T("/zone (Notice)") },
|
||
{ GM_Trace, _T("/trace"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/trace 캐릭터이름),설명(입력한 캐릭터이름의 던젼에 난입한다.)"), _T("Usage(/trace CharacterName), Description(Trace character's dungeon)") },
|
||
{ GM_Warp, _T("/warp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/warp 캐릭터이름),설명(입력한 캐릭터이름의 위치로 이동한다.게임서버에서만 사용가능)") },
|
||
{ GM_Trace_AID, _T("/trace_aid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_aid 어카운트디비다이디),설명(입력한 어카운트아이디의 던젼에 난입한다.)"), _T("/trace_aid AccountDBID) - (Trace AccountDBID's position)") },
|
||
{ GM_Trace_CID, _T("/trace_cid"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/trace_cid 캐릭터디비아이디),설명(입력한 캐릭터디비아이디의 던젼에 난입한다.)"), _T("/trace_cid CharacterDBID) - (Trace CharacterDBID's position)") },
|
||
{ GM_Recall, _T("/recall"), CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("사용법(/recall 캐릭터이름),설명(입력한 캐릭터를 GM마을로 소환합니다."), _T("Usage(/recall CharacterName), Description(Recall character to GM Village") },
|
||
{ GM_UserBan, _T("/userban"), CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/userban 캐릭터이름),설명(입력한 캐릭터를 접속종료시킨다."), _T("/userban CharacterName)") },
|
||
{ GM_Fatigue, _T("/fatigue"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("/fatigue"), _T("/fatigue") },
|
||
{ GM_DestroyPvP, _T("/destroypvp"), CmdAuth_New|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/destroypvp(PvP인덱스)(강제로 이기게할 길드이름)"), _T("/destroypvp(PvPIndex)(ForceWinGuildName)") },
|
||
{ GM_WEventClear, _T("/clearevent"), CmdAuth_Master|CmdAuth_QA|CmdAuth_Developer, _T("/clearevent"), _T("/clearevent") },
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
{ GM_WORLDPVPROOMALLKILLREDTEAM, _T("/teamred"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/TeamRed 캐릭터명),설명(입력한 캐릭터를 팀에 합류시킨다."), _T("/TeamRed CharacterName...)") },
|
||
{ GM_WORLDPVPROOMALLKILLBLUETEAM, _T("/teamblue"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/Teamblue 캐릭터명),설명(입력한 캐릭터를 팀에 합류시킨다."), _T("/Teamblue CharacterName...)") },
|
||
{ GM_WORLDPVPROOMTOURNAMENTSETTING, _T("/tournament"), CmdAuth_New|CmdAuth_Intern|CmdAuth_Monitoring|CmdAuth_Master|CmdAuth_QA, _T("사용법(/tournament 경기번호 캐릭터명),설명(입력한 캐릭터를 팀에 합류시킨다."), _T("/tournament 1 CharacterName...)") },
|
||
#endif
|
||
#if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
{ GM_MuteUser, _T("/mute"), CmdAuth_Master|CmdAuth_QA, _T("사용법(/mute 캐릭터명 시간),설명(입력한 캐릭터를 지정된 시간동안 침묵시킨다)"), _T("/mute CharacterName Mutetime") }, // [JPN]유저 체팅 금지
|
||
#endif // #if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
#endif // _CH
|
||
};
|
||
|
||
CDNGMCommand::CDNGMCommand(CDNUserSession *pSession): m_pSession(pSession)
|
||
{
|
||
BOOST_STATIC_ASSERT( GM_END == _countof(g_GMCmdList) );
|
||
m_VecWhisperName.clear();
|
||
}
|
||
|
||
CDNGMCommand::~CDNGMCommand()
|
||
{
|
||
|
||
}
|
||
|
||
void CDNGMCommand::AddWhisperName(wstring wstrName)
|
||
{
|
||
if (wstrName.size() == 0) return;
|
||
if (IsWhisperName(wstrName.c_str())) return; // 이미 있다
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(wstrName.c_str());
|
||
if (!pUserObj) return;
|
||
#elif defined(_GAMESERVER)
|
||
|
||
#endif
|
||
m_VecWhisperName.push_back(wstrName.c_str());
|
||
}
|
||
|
||
void CDNGMCommand::DelWhisperName(wstring wstrName)
|
||
{
|
||
if (m_VecWhisperName.empty()) return;
|
||
|
||
VecWString::iterator iter = find(m_VecWhisperName.begin(), m_VecWhisperName.end(), wstrName.c_str());
|
||
if (iter != m_VecWhisperName.end())
|
||
m_VecWhisperName.erase(iter);
|
||
}
|
||
|
||
bool CDNGMCommand::IsWhisperName(wstring wstrName)
|
||
{
|
||
if (m_VecWhisperName.empty()) return false;
|
||
|
||
VecWString::iterator iter = find(m_VecWhisperName.begin(), m_VecWhisperName.end(), wstrName.c_str());
|
||
if (iter != m_VecWhisperName.end()) return true;
|
||
|
||
return false;
|
||
}
|
||
|
||
|
||
bool CDNGMCommand::GMCommand(wstring& wszCommand)
|
||
{
|
||
if ( wszCommand.find(L"/") != 0 ) return false;
|
||
|
||
wstring szResultMsg;
|
||
VecWString tokens;
|
||
|
||
TokenizeW(wszCommand, tokens, L" ");
|
||
ToLowerW(tokens[0]);
|
||
int nCount = sizeof(g_GMCmdList) / sizeof(__GMCmdLineDefineStruct);
|
||
|
||
for ( int i = 0 ; i < nCount; i++ )
|
||
{
|
||
if( wcscmp( tokens[0].c_str(), g_GMCmdList[i].szString ) == NULL )
|
||
{
|
||
if (!OnGMCommand(i, tokens)){
|
||
szResultMsg = L"Command param Error";
|
||
m_pSession->SendChat(CHATTYPE_SYSTEM, (int)szResultMsg.size()*sizeof(WCHAR), m_pSession->GetCharacterName(), (WCHAR*)szResultMsg.c_str());
|
||
}
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
bool CDNGMCommand::OnGMCommand(int nCmdID, VecWString& tokens)
|
||
{
|
||
wstring wStr;
|
||
|
||
// 권한 검사
|
||
|
||
int nCheckMask = 0;
|
||
switch( m_pSession->GetAccountLevel() )
|
||
{
|
||
case AccountLevel_New : nCheckMask = CmdAuth_New; break;
|
||
case AccountLevel_Intern : nCheckMask = CmdAuth_Intern; break;
|
||
case AccountLevel_Monitoring : nCheckMask = CmdAuth_Monitoring; break;
|
||
case AccountLevel_Master : nCheckMask = CmdAuth_Master; break;
|
||
case AccountLevel_QA : nCheckMask = CmdAuth_QA; break;
|
||
case AccountLevel_Developer : nCheckMask = CmdAuth_Developer; break;
|
||
}
|
||
if ( !(nCheckMask & g_GMCmdList[nCmdID].nAccountLevel) )
|
||
{
|
||
wStr = FormatW( L"Do not have permission");
|
||
m_pSession->SendChat(CHATTYPE_SYSTEM, (int)wStr.size()*sizeof(WCHAR), m_pSession->GetCharacterName(), (WCHAR*)wStr.c_str());
|
||
return true;
|
||
}
|
||
|
||
switch( nCmdID )
|
||
{
|
||
case GM_Help:
|
||
{
|
||
for ( int i = 0 ; i < GM_END ; i++ )
|
||
{
|
||
#if defined (_KR) || defined(_KRAZ) || defined (_WORK)
|
||
wStr = FormatW( L"[%s] - %s", g_GMCmdList[i].szString, g_GMCmdList[i].szComment);
|
||
#else
|
||
wStr = FormatW( L"[%s] - %s", g_GMCmdList[i].szString, g_GMCmdList[i].szCommentEn);
|
||
#endif
|
||
m_pSession->SendChat(CHATTYPE_SYSTEM, (int)wStr.size()*sizeof(WCHAR), m_pSession->GetCharacterName(), (WCHAR*)wStr.c_str());
|
||
}
|
||
}
|
||
break;
|
||
#if defined(_CH)
|
||
case GM_HideOn: return CmdHide(tokens, true);
|
||
case GM_HideOff: return CmdHide(tokens, false);
|
||
case GM_ChangeMap: return CmdChangeMap(tokens); // 맵이동
|
||
case GM_Trace: return CmdTrace(TRACE_CHARACTERNAME, tokens );
|
||
case GM_Trace_AID: return CmdTrace(TRACE_ACCOUNTDBID, tokens );
|
||
case GM_Trace_CID: return CmdTrace(TRACE_CHRACTERDBID, tokens );
|
||
case GM_Warp: return CmdWarp( tokens );
|
||
case GM_Recall: return CmdRecall( tokens );
|
||
case GM_UserBan: return CmdBanUser(tokens);
|
||
case GM_Fatigue: return CmdFatigue(tokens);
|
||
case GM_HP: return CmdHp(tokens);
|
||
case GM_WEventClear: return CmdWeeklyEventClear();
|
||
|
||
#elif defined (_US)
|
||
case GM_HideOn: return CmdHide(tokens, true);
|
||
case GM_HideOff: return CmdHide(tokens, false);
|
||
case GM_ChangeMap: return CmdChangeMap(tokens);
|
||
case GM_Trace: return CmdTrace(TRACE_CHARACTERNAME, tokens );
|
||
case GM_UserBan: return CmdBanUser(tokens);
|
||
case GM_SummonMob: return CmdSummonMob(tokens);
|
||
case GM_AllKillMob: return CmdAllkillMob(tokens);
|
||
case GM_ZoneNotice: return CmdZoneNotice(tokens);
|
||
case GM_HP: return CmdHp(tokens);
|
||
case GM_SetLevel: return CmdSetLevel(tokens); // 레벨
|
||
case GM_MakeItem: return CmdMakeItem(tokens);
|
||
case GM_Recall: return CmdRecall( tokens );
|
||
case GM_Notice: return CmdNotice(tokens);
|
||
case GM_MakeCoin: return CmdMakeCoin(tokens); // 금전생성
|
||
case GM_WhisperOn: return CmdWhisper(tokens, true);
|
||
case GM_WhisperOff: return CmdWhisper(tokens, false);
|
||
case GM_Warp: return CmdWarp( tokens );
|
||
#elif defined( _SG ) || defined (_TH)
|
||
case GM_Notice: return CmdNotice(tokens);
|
||
case GM_WhisperOn: return CmdWhisper(tokens, true);
|
||
case GM_WhisperOff: return CmdWhisper(tokens, false);
|
||
case GM_HideOn: return CmdHide(tokens, true);
|
||
case GM_HideOff: return CmdHide(tokens, false);
|
||
case GM_SummonMob: return CmdSummonMob(tokens);
|
||
case GM_AllKillMob: return CmdAllkillMob(tokens);
|
||
case GM_MakeItem: return CmdMakeItem(tokens);
|
||
case GM_MakeCoin: return CmdMakeCoin(tokens); // 금전생성
|
||
case GM_SetLevel: return CmdSetLevel(tokens); // 레벨
|
||
case GM_ChangeMap: return CmdChangeMap(tokens); // 맵이동
|
||
case GM_SetQuest: return CmdSetQuest(tokens); // 퀘스트상태
|
||
case GM_ZoneNotice: return CmdZoneNotice(tokens);
|
||
case GM_Trace: return CmdTrace(TRACE_CHARACTERNAME, tokens );
|
||
case GM_Trace_AID: return CmdTrace(TRACE_ACCOUNTDBID, tokens );
|
||
case GM_Trace_CID: return CmdTrace(TRACE_CHRACTERDBID, tokens );
|
||
case GM_Warp: return CmdWarp( tokens );
|
||
case GM_Recall: return CmdRecall( tokens );
|
||
case GM_UserBan: return CmdBanUser(tokens);
|
||
case GM_Fatigue: return CmdFatigue(tokens);
|
||
case GM_DestroyPvP: return CmdDestroyPvP(tokens);
|
||
case GM_RepairAll: return CmdRepairAll(tokens);
|
||
case GM_GCreate: return CmdGCreate(tokens);
|
||
case GM_GDismiss: return CmdGDismiss(tokens);
|
||
#elif defined (_ID)
|
||
case GM_Notice: return CmdNotice(tokens);
|
||
case GM_WhisperOn: return CmdWhisper(tokens, true);
|
||
case GM_WhisperOff: return CmdWhisper(tokens, false);
|
||
case GM_HideOn: return CmdHide(tokens, true);
|
||
case GM_HideOff: return CmdHide(tokens, false);
|
||
case GM_SummonMob: return CmdSummonMob(tokens);
|
||
case GM_AllKillMob: return CmdAllkillMob(tokens);
|
||
case GM_MakeItem: return CmdMakeItem(tokens);
|
||
case GM_MakeCoin: return CmdMakeCoin(tokens); // 금전생성
|
||
case GM_SetLevel: return CmdSetLevel(tokens); // 레벨
|
||
case GM_ChangeMap: return CmdChangeMap(tokens); // 맵이동
|
||
case GM_SetQuest: return CmdSetQuest(tokens); // 퀘스트상태
|
||
case GM_ZoneNotice: return CmdZoneNotice(tokens);
|
||
case GM_Trace: return CmdTrace(TRACE_CHARACTERNAME, tokens );
|
||
case GM_Warp: return CmdWarp( tokens );
|
||
case GM_Trace_AID: return CmdTrace(TRACE_ACCOUNTDBID, tokens );
|
||
case GM_Trace_CID: return CmdTrace(TRACE_CHRACTERDBID, tokens );
|
||
case GM_Recall: return CmdRecall( tokens );
|
||
case GM_UserBan: return CmdBanUser(tokens);
|
||
case GM_Fatigue: return CmdFatigue(tokens);
|
||
case GM_DestroyPvP: return CmdDestroyPvP(tokens);
|
||
#else
|
||
case GM_Notice: return CmdNotice(tokens);
|
||
case GM_WhisperOn: return CmdWhisper(tokens, true);
|
||
case GM_WhisperOff: return CmdWhisper(tokens, false);
|
||
case GM_HideOn: return CmdHide(tokens, true);
|
||
case GM_HideOff: return CmdHide(tokens, false);
|
||
case GM_SummonMob: return CmdSummonMob(tokens);
|
||
case GM_AllKillMob: return CmdAllkillMob(tokens);
|
||
case GM_MakeItem: return CmdMakeItem(tokens);
|
||
case GM_MakeCoin: return CmdMakeCoin(tokens); // 금전생성
|
||
case GM_SetLevel: return CmdSetLevel(tokens); // 레벨
|
||
case GM_ChangeMap: return CmdChangeMap(tokens); // 맵이동
|
||
case GM_SetQuest: return CmdSetQuest(tokens); // 퀘스트상태
|
||
case GM_ZoneNotice: return CmdZoneNotice(tokens);
|
||
case GM_Trace: return CmdTrace(TRACE_CHARACTERNAME, tokens );
|
||
case GM_Trace_AID: return CmdTrace(TRACE_ACCOUNTDBID, tokens );
|
||
case GM_Trace_CID: return CmdTrace(TRACE_CHRACTERDBID, tokens );
|
||
case GM_Warp: return CmdWarp( tokens );
|
||
case GM_Recall: return CmdRecall( tokens );
|
||
case GM_UserBan: return CmdBanUser(tokens);
|
||
case GM_Fatigue: return CmdFatigue(tokens);
|
||
case GM_DestroyPvP: return CmdDestroyPvP(tokens);
|
||
case GM_WEventClear: return CmdWeeklyEventClear();
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
case GM_WORLDPVPROOMALLKILLREDTEAM: return CmdWorldPvPRoomAllKillTeamSetting(PvPCommon::Team::B, tokens);
|
||
case GM_WORLDPVPROOMALLKILLBLUETEAM: return CmdWorldPvPRoomAllKillTeamSetting(PvPCommon::Team::A, tokens);
|
||
case GM_WORLDPVPROOMTOURNAMENTSETTING: return CmdWorldPvPRoomTournamentSetting(tokens);
|
||
#endif
|
||
#if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
case GM_MuteUser: return CmdMuteUser(tokens);
|
||
#endif // #if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
#endif // #if defined(_CH)
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdNotice(VecWString& tokens)
|
||
{
|
||
if (tokens.size() < 2) return false;
|
||
|
||
WCHAR szMsg[CHATLENMAX] = { 0, };
|
||
int nLen = 0;
|
||
for (int i = 1; i < (int)tokens.size(); i++)
|
||
{
|
||
int nTempLen = (int)wcslen(tokens[i].c_str());
|
||
if (nTempLen + nLen >= CHATLENMAX) return false;
|
||
_wcscpy(szMsg+nLen, CHATLENMAX-nLen, tokens[i].c_str(), nTempLen);
|
||
nLen += nTempLen;
|
||
szMsg[nLen++] = ' ';
|
||
}
|
||
if( nLen < CHATLENMAX )
|
||
szMsg[nLen] = '\0';
|
||
else
|
||
return false;
|
||
|
||
#if defined (_VILLAGESERVER)
|
||
g_pMasterConnection->SendNoticeFromClient(szMsg, nLen);
|
||
#elif defined (_GAMESERVER)
|
||
g_pMasterConnectionManager->SendNoticeFromClinet(szMsg, nLen);
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdWhisper(VecWString& tokens, bool bWhisper)
|
||
{
|
||
if (tokens.size() < 2) return false;
|
||
|
||
if (bWhisper){ // 귓속말 시작
|
||
AddWhisperName(tokens[1]);
|
||
}
|
||
else { // 귓속말 종료
|
||
DelWhisperName(tokens[1]);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdHide(VecWString& tokens, bool bHide)
|
||
{
|
||
if (tokens.size() < 1) return false;
|
||
m_pSession->SetHide(bHide);
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdSummonMob(VecWString& tokens)
|
||
{
|
||
#if defined(_GAMESERVER)
|
||
if ( tokens.size() != 3 ) return false;
|
||
|
||
int nMonsterID = _ttoi(tokens[1].c_str());
|
||
int nCount = _ttoi(tokens[2].c_str());
|
||
|
||
CDNGameRoom *pGameRoom = m_pSession->GetGameRoom();
|
||
if (!pGameRoom) return false;
|
||
if (!pGameRoom->GetTaskMng()) return false;
|
||
|
||
CDnGameTask *pTask = (CDnGameTask *)pGameRoom->GetTaskMng()->GetTask( "GameTask" );
|
||
if (!pTask) return false;
|
||
|
||
EtVector3* pvPos = m_pSession->GetActorHandle()->GetPosition();
|
||
|
||
for ( int i = 0 ; i < nCount ; i++ )
|
||
{
|
||
pTask->RequestGenerationMonsterFromMonsterID( nMonsterID, *pvPos, EtVector3( 0.f, 0.f, 0.f ), EtVector3( 0.f, 0.f, 0.f ));
|
||
}
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdAllkillMob(VecWString& tokens)
|
||
{
|
||
#if defined(_GAMESERVER)
|
||
CDNGameRoom *pGameRoom = m_pSession->GetGameRoom();
|
||
if (!pGameRoom) return false;
|
||
if (!pGameRoom->GetTaskMng()) return false;
|
||
|
||
CDnGameTask *pTask = (CDnGameTask *)pGameRoom->GetTaskMng()->GetTask( "GameTask" );
|
||
if (!pTask) return false;
|
||
|
||
pTask->RequestDestroyAllMonster(false);
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdMakeItem(VecWString& tokens)
|
||
{
|
||
wstring wszString;
|
||
|
||
if ( tokens.size() < 2 ){
|
||
wszString = FormatW(L"파라미터를 제대로 확인해주세요!!!\r\n");
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
return false;
|
||
}
|
||
|
||
int nItemID = _wtoi(tokens[1].c_str());
|
||
|
||
int nCount = ( tokens.size() >= 3 ) ? _wtoi(tokens[2].c_str()) : 1;
|
||
if (nCount <= 0) nCount = 1;
|
||
|
||
TItemData *pItemData = g_pDataManager->GetItemData(nItemID);
|
||
if (!pItemData) return false;
|
||
|
||
if (pItemData->nType == ITEMTYPE_QUEST){
|
||
m_pSession->GetItem()->AddQuestInventory(nItemID, nCount, 0, DBDNWorldDef::AddMaterializedItem::Cheat);
|
||
return true;
|
||
}
|
||
|
||
int nItemLevel = ( tokens.size() >= 4 ) ? _wtoi(tokens[3].c_str()) : 0;
|
||
int nItemPotential = ( tokens.size() >= 5 ) ? _wtoi(tokens[4].c_str()) : 0;
|
||
int nItemOption = ( tokens.size() >= 6 ) ? _wtoi(tokens[5].c_str()) : 0;
|
||
|
||
if (pItemData->IsCash){
|
||
int nPeriod = ( tokens.size() >= 7 ) ? _wtoi(tokens[6].c_str()) : 0;
|
||
//if (nPeriod <= 0) nPeriod = 1;
|
||
|
||
m_pSession->GetItem()->CreateCashInvenItemByCheat(nItemID, nCount, nPeriod, DBDNWorldDef::AddMaterializedItem::Cheat);
|
||
return true;
|
||
}
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
if ((nItemLevel > 0) || (nItemPotential > 0) || (nItemOption > 0))
|
||
{
|
||
TItem Item = { 0, };
|
||
if( CDNUserItem::MakeItemStruct(nItemID, Item) == false )
|
||
return false;
|
||
|
||
Item.wCount = nCount;
|
||
Item.cLevel = nItemLevel;
|
||
Item.cPotential = nItemPotential;
|
||
Item.cOption = nItemOption;
|
||
|
||
m_pSession->GetItem()->CreateInvenWholeItem(Item, DBDNWorldDef::AddMaterializedItem::Cheat, 0);
|
||
}
|
||
else
|
||
{
|
||
m_pSession->GetItem()->CreateInvenItem1( nItemID, nCount, -1, -1, DBDNWorldDef::AddMaterializedItem::Cheat, 0, CREATEINVEN_ETC );
|
||
}
|
||
|
||
#elif defined(_GAMESERVER)
|
||
|
||
if( !m_pSession || !m_pSession->GetActorHandle() ) return false;
|
||
CDNGameRoom *pRoom = m_pSession->GetGameRoom();
|
||
if (!pRoom) return false;
|
||
if (!pRoom->GetTaskMng()) return false;
|
||
|
||
CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask( "ItemTask" );
|
||
if (!pTask) return false;
|
||
|
||
CMultiRoom *pMultiRoom = pTask->GetRoom();
|
||
pTask->RequestDropItem(STATIC_INSTANCE_(CDnDropItem::s_dwUniqueCount)++, *(m_pSession->GetActorHandle()->GetPosition()), nItemID, _rand(pMultiRoom), nCount, 0);
|
||
|
||
char cGrade = 0;
|
||
if (pItemData) cGrade = pItemData->cRank;
|
||
|
||
#endif
|
||
return true;
|
||
}
|
||
bool CDNGMCommand::Cmdhuanhua(VecWString& tokens)
|
||
{
|
||
|
||
wstring wszString;
|
||
|
||
if (tokens.size() < 2) {
|
||
wszString = FormatW(L"헝렴흙膠틔!!!!");
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
return false;
|
||
}
|
||
int nItemID = _wtoi(tokens[1].c_str());
|
||
|
||
if (m_pSession->GetItem()->GetInventoryItemCount(335545346) <= 1)
|
||
{
|
||
wszString = FormatW(L"離<EFBFBD>矜狼좃옮±뼙뺏산판×");
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
return false;
|
||
}
|
||
|
||
m_pSession->GetItem()->DeleteInventoryByItemID(335545346,2,0,0);
|
||
|
||
|
||
WCHAR szMsg[CHATLENMAX] = { 0, };
|
||
wsprintfW(szMsg, L"鯤소[%ws]攣瞳뼙뺏±×", m_pSession->GetCharacterName());
|
||
|
||
|
||
// g_pUserSessionManager->SendChat(static_cast<eChatType>(007), 50, m_pSession->GetCharacterName(), szMsg);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
int nCount = (tokens.size() >= 3) ? _wtoi(tokens[2].c_str()) : 1;
|
||
if (nCount <= 0) nCount = 1;
|
||
|
||
TItemData *pItemData = g_pDataManager->GetItemData(nItemID);
|
||
if (!pItemData) return false;
|
||
|
||
if (pItemData->nType == ITEMTYPE_QUEST) {
|
||
m_pSession->GetItem()->AddQuestInventory(nItemID, nCount, 0, DBDNWorldDef::AddMaterializedItem::Cheat);
|
||
return true;
|
||
}
|
||
|
||
int nItemLevel = (tokens.size() >= 4) ? _wtoi(tokens[3].c_str()) : 0;
|
||
int nItemPotential = (tokens.size() >= 5) ? _wtoi(tokens[4].c_str()) : 0;
|
||
int nItemOption = (tokens.size() >= 6) ? _wtoi(tokens[5].c_str()) : 0;
|
||
|
||
if (pItemData->IsCash) {
|
||
int nPeriod = (tokens.size() >= 7) ? _wtoi(tokens[6].c_str()) : 0;
|
||
//if (nPeriod <= 0) nPeriod = 1;
|
||
|
||
m_pSession->GetItem()->CreateCashInvenItemByCheat(nItemID, nCount, nPeriod, DBDNWorldDef::AddMaterializedItem::Cheat);
|
||
return true;
|
||
}
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
if ((nItemLevel > 0) || (nItemPotential > 0) || (nItemOption > 0))
|
||
{
|
||
TItem Item = { 0, };
|
||
if (CDNUserItem::MakeItemStruct(nItemID, Item) == false)
|
||
return false;
|
||
|
||
Item.wCount = nCount;
|
||
Item.cLevel = nItemLevel;
|
||
Item.cPotential = nItemPotential;
|
||
Item.cOption = nItemOption;
|
||
|
||
m_pSession->GetItem()->CreateInvenWholeItem(Item, DBDNWorldDef::AddMaterializedItem::Cheat, 0);
|
||
}
|
||
else
|
||
{
|
||
m_pSession->GetItem()->CreateInvenItem1(nItemID, nCount, -1, -1, DBDNWorldDef::AddMaterializedItem::Cheat, 0, CREATEINVEN_ETC);
|
||
}
|
||
|
||
#elif defined(_GAMESERVER)
|
||
|
||
if (!m_pSession || !m_pSession->GetActorHandle()) return false;
|
||
CDNGameRoom *pRoom = m_pSession->GetGameRoom();
|
||
if (!pRoom) return false;
|
||
if (!pRoom->GetTaskMng()) return false;
|
||
|
||
CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask("ItemTask");
|
||
if (!pTask) return false;
|
||
|
||
CMultiRoom *pMultiRoom = pTask->GetRoom();
|
||
pTask->RequestDropItem(STATIC_INSTANCE_(CDnDropItem::s_dwUniqueCount)++, *(m_pSession->GetActorHandle()->GetPosition()), nItemID, _rand(pMultiRoom), nCount, 0);
|
||
|
||
char cGrade = 0;
|
||
if (pItemData) cGrade = pItemData->cRank;
|
||
|
||
#endif
|
||
return true;
|
||
}
|
||
bool CDNGMCommand::CmdMakeCoin(VecWString& tokens)
|
||
{
|
||
if (tokens.size() != 2) return false;
|
||
if (!m_pSession->AddCoin(_ttoi64(tokens[1].c_str()), DBDNWorldDef::CoinChangeCode::Cheat, 0)) return false;
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdSetLevel(VecWString& tokens)
|
||
{
|
||
if (tokens.size() != 2) return false;
|
||
|
||
int nLevel = _wtoi(tokens[1].c_str());
|
||
if (nLevel < 1 || nLevel > CHARLEVELMAX) return false;
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
int nExp = g_pDataManager->GetExp(m_pSession->GetUserJob(), nLevel);
|
||
m_pSession->SetExp(1, DBDNWorldDef::CharacterExpChangeCode::Cheat, 0, false);
|
||
m_pSession->SetLevel(1, DBDNWorldDef::CharacterLevelChangeCode::Cheat, false);
|
||
m_pSession->SetExp(nExp, DBDNWorldDef::CharacterExpChangeCode::Cheat, 0, true); // exp세팅해주면 레벨까지 알아서 바뀐다
|
||
|
||
#elif defined(_GAMESERVER)
|
||
int nExp = g_pDataManager->GetExp(m_pSession->GetUserJob(), nLevel);
|
||
m_pSession->GetPlayerActor()->SetExperience( 1 );
|
||
m_pSession->GetActorHandle()->SetLevel( 1 );
|
||
m_pSession->GetPlayerActor()->SetExperience(nExp); // exp 세팅해주면 알아서 바뀐다.
|
||
#endif
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdChangeMap(VecWString& tokens)
|
||
{
|
||
if ( tokens.size() < 2 ) return false;
|
||
if (_ttoi(tokens[1].c_str()) < 1) return false;
|
||
|
||
wstring wszString;
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
CDNField* pField = m_pSession->GetField();
|
||
if( pField )
|
||
{
|
||
if( pField->bIsPvPVillage() || pField->bIsPvPLobby() || pField->bIsDarkLairVillage() )
|
||
{
|
||
wszString = FormatW(L"PvP마을, PvP로비, 다크레어마을 에서는 이 명령어를 사용할 수 없습니다.");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return true;
|
||
}
|
||
}
|
||
|
||
#elif defined(_GAMESERVER)
|
||
if( m_pSession->GetGameRoom() )
|
||
{
|
||
if( m_pSession->GetGameRoom()->bIsPvPRoom() )
|
||
{
|
||
wszString = FormatW(L"PvP중에는 이 명령어를 사용할 수 없습니다.");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return true;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
int nMapIndex = _ttoi(tokens[1].c_str()); // 이동할 mapindex
|
||
TDUNGEONDIFFICULTY StageConstrucionLevel = ( tokens.size() <= 2 ) ? Dungeon::Difficulty::Easy : static_cast<TDUNGEONDIFFICULTY>(_ttoi(tokens[2].c_str()));
|
||
if (StageConstrucionLevel >= Dungeon::Difficulty::Max)
|
||
return false;
|
||
|
||
int nGateNo = ( tokens.size() <= 3 ) ? 1 : _ttoi(tokens[3].c_str());
|
||
|
||
if ( g_pDataManager->GetMapType( nMapIndex ) == GlobalEnum::MAP_UNKNOWN )
|
||
{
|
||
std::wstring wszLocalString;
|
||
wszLocalString = FormatW( L"Cannot found map index %d ", nMapIndex );
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszLocalString.size()*sizeof(WCHAR), L"", (WCHAR*)wszLocalString.c_str());
|
||
return false;
|
||
}
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
if (g_pDataManager->GetMapType(nMapIndex) != GlobalEnum::MAP_VILLAGE){ // 겜섭일 경우
|
||
char cGateNo = g_pFieldDataManager->GetRandomGateNo(nMapIndex);
|
||
|
||
if( m_pSession->GetPartyID() > 0 ) {
|
||
CDNParty *pParty = g_pPartyManager->GetParty(m_pSession->GetPartyID());
|
||
if (!pParty) return false;
|
||
pParty->SetRandomSeed( timeGetTime() );
|
||
|
||
if (g_pMasterConnection && g_pMasterConnection->GetActive())
|
||
g_pMasterConnection->SendReqGameID( GameTaskType::Normal, REQINFO_TYPE_PARTY, pParty->GetPartyID(), m_pSession->GetChannelID(), pParty->GetRandomSeed(), nMapIndex, nGateNo, StageConstrucionLevel, true, pParty ); // GameID를 요청
|
||
else
|
||
return false;
|
||
}
|
||
else {
|
||
m_pSession->m_cGateNo = nGateNo;
|
||
m_pSession->m_nSingleRandomSeed = timeGetTime();
|
||
|
||
if (g_pMasterConnection && g_pMasterConnection->GetActive())
|
||
g_pMasterConnection->SendReqGameID( GameTaskType::Normal, REQINFO_TYPE_SINGLE, m_pSession->GetAccountDBID(), m_pSession->GetChannelID(), m_pSession->m_nSingleRandomSeed, nMapIndex, nGateNo, StageConstrucionLevel, true ); // GameID를 요청
|
||
else
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{ // 빌리지섭일 경우
|
||
char cGateNo = ( tokens.size() == 2 ) ? -1 : _ttoi(tokens[2].c_str());
|
||
if( m_pSession->GetPartyID() > 0 ) {
|
||
CDNParty *pParty = g_pPartyManager->GetParty(m_pSession->GetPartyID());
|
||
if (!pParty) return false;
|
||
if (g_pMasterConnection && g_pMasterConnection->GetActive())
|
||
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_PARTY, pParty->GetPartyID(), nMapIndex, cGateNo, -1, pParty);
|
||
else
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
if (g_pMasterConnection && g_pMasterConnection->GetActive())
|
||
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_SINGLE, m_pSession->GetAccountDBID(), nMapIndex, cGateNo);
|
||
else
|
||
return false;
|
||
}
|
||
}
|
||
|
||
#elif defined(_GAMESERVER)
|
||
CDNGameRoom *pRoom = m_pSession->GetGameRoom();
|
||
if (!pRoom) return false;
|
||
if( pRoom->bIsPvPRoom() ) // PvP방에서는 changemap 치트 막는다.
|
||
return false;
|
||
|
||
CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" );
|
||
if( g_pDataManager->GetMapType( nMapIndex ) == GlobalEnum::eMapTypeEnum::MAP_VILLAGE ) {
|
||
|
||
CDNUserSession *pLeaderSession = NULL;
|
||
for( DWORD i=0; i<pRoom->GetUserCount(); i++ ) {
|
||
CDNUserSession *pSession = pRoom->GetUserData(i);
|
||
pSession->SetNextVillageData( NULL, 0, pTask->GetMapTableID(), nMapIndex, nGateNo );
|
||
|
||
if( pRoom->GetPartyData(i)->bLeader ) pLeaderSession = pSession;
|
||
}
|
||
|
||
if( pLeaderSession ) {
|
||
g_pMasterConnectionManager->SendRequestNextVillageInfo(pLeaderSession->GetWorldSetID(), nMapIndex, nGateNo, true, pRoom );
|
||
}
|
||
}
|
||
else {
|
||
for( DWORD i=0; i<pRoom->GetUserCount(); i++ )
|
||
{
|
||
CDNUserSession *pSession = pRoom->GetUserData(i);
|
||
if( !pSession ) continue;
|
||
DnActorHandle hActor = pSession->GetActorHandle();
|
||
if( !hActor ) continue;
|
||
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
|
||
pPlayer->CmdRemoveStateEffect(STATE_BLOW::BLOW_099);
|
||
}
|
||
#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
pRoom->ReserveInitStateAndSync( nMapIndex, nGateNo, CRandom::Seed(pRoom), StageConstrucionLevel, true );
|
||
#else
|
||
pRoom->InitStateAndSync( nMapIndex, nGateNo, CRandom::Seed(pRoom), StageConstrucionLevel, true );
|
||
#endif //#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
}
|
||
#endif
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdSetQuest(VecWString& tokens)
|
||
{
|
||
if (tokens.size() != 4) return false;
|
||
|
||
int nQuestID = _wtoi(tokens[1].c_str());
|
||
int nFlag = _wtoi(tokens[2].c_str());
|
||
if (nFlag < 0 || nFlag > 1) return false;
|
||
|
||
int nResult = 0;
|
||
if (nFlag == 1){
|
||
nResult = m_pSession->GetQuest()->MarkingCompleteQuest(nQuestID);
|
||
if ( nResult < 0 )
|
||
g_Log.Log(LogType::_ERROR, m_pSession, L"GM_SetQuest Error: %d MarkingCompleteQuest (Ret:%d)\r\n", nQuestID, nResult);
|
||
}
|
||
|
||
nResult = m_pSession->GetQuest()->CompleteQuest(nQuestID, true, true);
|
||
|
||
if (nResult < 0)
|
||
g_Log.Log(LogType::_ERROR, m_pSession, L"GM_SetQuest Error: %d CompleteQuest (Ret:%d)", nQuestID, nResult);
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdZoneNotice(VecWString& tokens)
|
||
{
|
||
if (tokens.size() < 2) return false;
|
||
|
||
WCHAR szMsg[CHATLENMAX] = { 0, };
|
||
int nLen = 0;
|
||
for (int i = 1; i < (int)tokens.size(); i++)
|
||
{
|
||
int nTempLen = (int)wcslen(tokens[i].c_str());
|
||
if (nTempLen + nLen >= CHATLENMAX) return false;
|
||
_wcscpy(szMsg+nLen, CHATLENMAX-nLen, tokens[i].c_str(), nTempLen);
|
||
nLen += nTempLen;
|
||
szMsg[nLen++] = ' ';
|
||
}
|
||
if( nLen < CHATLENMAX )
|
||
szMsg[nLen] = '\0';
|
||
else
|
||
return false;
|
||
|
||
#if defined (_VILLAGESERVER)
|
||
g_pMasterConnection->SendZoneNoticeFromClient(m_pSession->GetMapIndex(), szMsg, nLen);
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdFatigue(VecWString& tokens)
|
||
{
|
||
if (tokens.size() < 1) return false;
|
||
m_pSession->SetCheatMaxFatigue();
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdHp(VecWString& tokens)
|
||
{
|
||
#if defined(_GAMESERVER)
|
||
wstring wszString;
|
||
|
||
if (tokens.size() < 2){
|
||
wszString = FormatW(L"HP 값(비율0~100)을 넣어주세요.\r\n");
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
return false;
|
||
}
|
||
CDnPlayerActor *pPlayer = m_pSession->GetPlayerActor();
|
||
if( !pPlayer ) return false;
|
||
INT64 nHP = (INT64)( pPlayer->GetMaxHP() * ( _ttoi( tokens[1].c_str() ) / 100.f ) );
|
||
if( nHP > pPlayer->GetMaxHP() ) nHP = pPlayer->GetMaxHP();
|
||
else if( nHP < 1 ) nHP = 1;
|
||
pPlayer->CmdRefreshHPSP( nHP, pPlayer->GetSP() );
|
||
#endif
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdDestroyPvP(VecWString& tokens)
|
||
{
|
||
#if defined(_VILLAGESERVER)
|
||
|
||
wstring wszString;
|
||
|
||
if (tokens.size() < 2){
|
||
wszString = FormatW(L"PvP룸의 인덱스를 넣어주세요.\r\n");
|
||
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
return false;
|
||
}
|
||
|
||
g_pMasterConnection->SendForceDestroyPvP(m_pSession->GetAccountDBID(), _wtoi(tokens[1].c_str()), tokens.size() > 2 ? tokens[2].c_str() : NULL);
|
||
|
||
#endif //#if defined(_VILLAGESERVER)
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdTrace( int nType, const VecWString& tokens )
|
||
{
|
||
#if defined( _VILLAGESERVER )
|
||
|
||
if( tokens.size() != 2 )
|
||
{
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wcslen(g_GMCmdList[GM_Trace].szComment)), L"", g_GMCmdList[GM_Trace].szComment );
|
||
return false;
|
||
}
|
||
|
||
bool bIsSelf = true;
|
||
switch (nType)
|
||
{
|
||
case TRACE_CHARACTERNAME:
|
||
{
|
||
bIsSelf = (wcscmp( m_pSession->GetCharacterName(), tokens[1].c_str() ) == 0) ? true : false;
|
||
break;
|
||
}
|
||
|
||
case TRACE_ACCOUNTDBID:
|
||
{
|
||
bIsSelf = (m_pSession->GetAccountDBID() == _wtoi(tokens[1].c_str())) ? true : false;
|
||
break;
|
||
}
|
||
|
||
case TRACE_CHRACTERDBID:
|
||
{
|
||
bIsSelf = (m_pSession->GetCharacterDBID() == _wtoi64(tokens[1].c_str())) ? true : false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bIsSelf)
|
||
{
|
||
std::wstring wString = L"자기 자신을 추적할 수 없습니다..";
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
if( m_pSession->GetPartyID() > 0 )
|
||
{
|
||
std::wstring wString = L"파티 상태에서는 사용할 수 없는 치트입니다.";
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
|
||
return false;
|
||
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendTraceBreakInto( nType, m_pSession->GetAccountDBID(), tokens[1].c_str(), m_pSession->m_eSelectedLanguage );
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendTraceBreakInto( nType, m_pSession->GetAccountDBID(), tokens[1].c_str() );
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
|
||
#else
|
||
//std::wstring wString = boost::io::str( boost::wformat( L"마을에서만 사용가능한 치트입니다.") );
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4429, m_pSession->m_eSelectedLanguage) ) );
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4429) ) );
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
#endif // #if defined( _VILLAGESERVER )
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdWarp( const VecWString& tokens )
|
||
{
|
||
#if defined( _GAMESERVER )
|
||
|
||
if( tokens.size() != 2 )
|
||
{
|
||
//m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wcslen(g_GMCmdList[GM_Warp].szComment)), L"", g_GMCmdList[GM_Warp].szComment );
|
||
return false;
|
||
}
|
||
|
||
CDNGameRoom* pGameRoom = m_pSession->GetGameRoom();
|
||
if( pGameRoom == NULL )
|
||
return false;
|
||
|
||
CDNGameRoom::PartyStruct* pStruct = pGameRoom->GetPartyData( const_cast<WCHAR*>(tokens[1].c_str()) );
|
||
if( pStruct == NULL || pStruct->pSession == NULL )
|
||
return false;
|
||
|
||
DnActorHandle hTarget = pStruct->pSession->GetActorHandle();
|
||
if( !hTarget )
|
||
return false;
|
||
|
||
DnActorHandle hActor = m_pSession->GetActorHandle();
|
||
if( !hActor )
|
||
return false;
|
||
|
||
hActor->CmdWarp( *hTarget->GetPosition(), EtVec3toVec2(*hTarget->GetLookDir()) );
|
||
|
||
#endif // #if defined( _GAMESERVER )
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdRecall( const VecWString& tokens )
|
||
{
|
||
#if defined( _VILLAGESERVER )
|
||
if( tokens.size() != 2 )
|
||
{
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wcslen(g_GMCmdList[GM_Recall].szComment)), L"", g_GMCmdList[GM_Recall].szComment );
|
||
return false;
|
||
}
|
||
|
||
// GM마을에 있는지 검사
|
||
CDNField* pField = m_pSession->GetField();
|
||
if( !pField || !pField->bIsGMVillage() )
|
||
{
|
||
std::wstring wString = L"GM마을에서만 사용가능한 치트입니다.";
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
if( wcscmp( m_pSession->GetCharacterName(), tokens[1].c_str() ) == 0 )
|
||
{
|
||
std::wstring wString = L"자기 자신을 소환할 수 없습니다..";
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
|
||
return false;
|
||
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendReqRecall( m_pSession->GetAccountDBID(), pField->GetChnnelID(), tokens[1].c_str(), m_pSession->m_eSelectedLanguage);
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendReqRecall( m_pSession->GetAccountDBID(), pField->GetChnnelID(), tokens[1].c_str() );
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
|
||
#else
|
||
//std::wstring wString = boost::io::str( boost::wformat( L"마을에서만 사용가능한 치트입니다.") );
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4429, m_pSession->m_eSelectedLanguage) ) );
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4429) ) );
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
#endif // #if defined( _VILLAGESERVER )
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdBanUser(const VecWString& tokens)
|
||
{
|
||
if( tokens.size() != 2 )
|
||
{
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wcslen(g_GMCmdList[GM_UserBan].szComment)), L"", g_GMCmdList[GM_UserBan].szComment );
|
||
return false;
|
||
}
|
||
|
||
// GM마을에 있는지 검사
|
||
if( wcscmp( m_pSession->GetCharacterName(), tokens[1].c_str() ) == 0 )
|
||
{
|
||
std::wstring wString = L"자기 자신을 접속 종료할 수 없습니다.";
|
||
m_pSession->SendChat( CHATTYPE_GM, static_cast<int>(wString.size()), L"", wString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
#if defined( _VILLAGESERVER )
|
||
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
|
||
return false;
|
||
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendBanUser(m_pSession->GetAccountDBID(), tokens[1].c_str(), m_pSession->m_eSelectedLanguage);
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendBanUser(m_pSession->GetAccountDBID(), tokens[1].c_str());
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
#elif defined (_GAMESERVER)
|
||
if (g_pMasterConnectionManager == NULL)
|
||
return false;
|
||
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnectionManager->SendBanUser(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str(), m_pSession->m_eSelectedLanguage);
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnectionManager->SendBanUser(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str());
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdRepairAll(VecWString& tokens)
|
||
{
|
||
#if defined( _VILLAGESERVER )
|
||
if( !m_pSession->GetItem() )
|
||
return false;
|
||
m_pSession->GetItem()->OnRecvRepairAll( true );
|
||
#else // #if defined( _VILLAGESERVER )
|
||
wstring wszString = FormatW(L"마을에서만사용가능한 치트키입니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
#endif // #if defined( _VILLAGESERVER )
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdGCreate(VecWString& tokens)
|
||
{
|
||
if(2 > tokens.size()) {
|
||
return false;
|
||
}
|
||
const std::wstring aGuildName = tokens[1].c_str();
|
||
if(aGuildName.empty() || GUILDNAME_MAX <= aGuildName.size()) {
|
||
return false;
|
||
}
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
|
||
// 20100629 길드명 작성 시 국가별 유니코드 문자대역 확인하도록 기능 추가
|
||
if(!g_CountryUnicodeSet.Check(aGuildName.c_str()))
|
||
{
|
||
wstring wszString = FormatW(L"길드명에 사용할 수 없는 문자가 포함되었습니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
const TGuildUID GuildUID = m_pSession->GetGuildUID();
|
||
if(GuildUID.IsSet()) {
|
||
wstring wszString = FormatW(L"이미 길드에 가입된 상태입니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
int wGuildRoleAuth[GUILDROLE_TYPE_CNT] = { 0, };
|
||
g_pGuildManager->SetAuthBase(wGuildRoleAuth); // 길드 권한 적용(최초)
|
||
|
||
m_pSession->GetDBConnection()->QueryCreateGuild(m_pSession->GetDBThreadID(), m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), aGuildName.c_str(), m_pSession->GetMapIndex(), m_pSession->GetLevel(), 0, g_Config.nWorldSetID, wGuildRoleAuth);
|
||
|
||
wstring wszString = FormatW(L"길드 창설이 정상적으로 요청되었습니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
#else // #if defined( _VILLAGESERVER )
|
||
wstring wszString = FormatW(L"마을에서만 사용 가능한 치트키입니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
#endif // #if defined( _VILLAGESERVER )
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdGDismiss(VecWString& tokens)
|
||
{
|
||
if(1 > tokens.size()) {
|
||
return false;
|
||
}
|
||
|
||
#if defined(_VILLAGESERVER)
|
||
const TGuildUID GuildUID = m_pSession->GetGuildUID();
|
||
if(!GuildUID.IsSet()) {
|
||
wstring wszString = FormatW(L"길드에 가입된 상태가 아닙니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
// 이미 해체된 길드인지 체크
|
||
if(g_pGuildManager->IsDismissExist(GuildUID)) {
|
||
m_pSession->ResetGuildSelfView();
|
||
m_pSession->SendDismissGuild(m_pSession->GetSessionID(), ERROR_GUILD_ALREADYDISMISS_GUILD, NULL);
|
||
return false;
|
||
}
|
||
|
||
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
|
||
if(!pGuild)
|
||
{
|
||
wstring wszString = FormatW(L"길드 정보가 존재하지 않습니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
#if !defined( PRE_ADD_NODELETEGUILD )
|
||
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
|
||
if(FALSE == pGuild->IsEnable()) return false;
|
||
#endif
|
||
|
||
|
||
if(GUILDROLE_TYPE_MASTER != m_pSession->GetGuildSelfView().btGuildRole)
|
||
{
|
||
wstring wszString = FormatW(L"오직 길드장만 가능합니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
|
||
if(!pGuild->GetMemberInfo(m_pSession->GetCharacterDBID()))
|
||
{
|
||
wstring wszString = FormatW(L"해당 길드의 길드원이 아닙니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
if(pGuild->GetMemberCount() > 1)
|
||
{
|
||
wstring wszString = FormatW(L"길드원이 아직 존재합니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
m_pSession->GetDBConnection()->QueryDismissGuild( m_pSession );
|
||
|
||
wstring wszString = FormatW(L"길드 해산이 정상적으로 요청되었습니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
#else // #if defined( _VILLAGESERVER )
|
||
wstring wszString = FormatW(L"마을에서만 사용 가능한 치트키입니다.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
#endif // #if defined( _VILLAGESERVER )
|
||
return true;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdWeeklyEventClear()
|
||
{
|
||
#if defined(PRE_ADD_WEEKLYEVENT)
|
||
g_pDataManager->WeeklyEventClear();
|
||
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
|
||
return true;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
bool CDNGMCommand::CmdWorldPvPRoomAllKillTeamSetting( PvPCommon::Team::eTeam eType, VecWString& tokens )
|
||
{
|
||
#if defined( _GAMESERVER )
|
||
if(2 > tokens.size()) {
|
||
return false;
|
||
}
|
||
|
||
if( m_pSession->GetGameRoom() )
|
||
{
|
||
CDNGameRoom *pRoom = m_pSession->GetGameRoom();
|
||
if( pRoom && pRoom->GetWorldPvPRoomReqType() == WorldPvPMissionRoom::Common::GMRoom )
|
||
{
|
||
for( int i=1;i<tokens.size();i++ )
|
||
{
|
||
CDNGameRoom::PartyStruct* pStruct = pRoom->GetPartyData( const_cast<WCHAR*>(tokens[i].c_str()) );
|
||
if( pStruct )
|
||
{
|
||
CDNUserSession * pSession = pStruct->pSession;
|
||
if( pSession->GetActorHandle() && pSession->GetTeam() != PvPCommon::Team::Observer )
|
||
{
|
||
pSession->SetTeam( eType );
|
||
pSession->GetActorHandle()->SetTeam(eType);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
wstring wszString = FormatW(L"%s 캐릭명이 유효하지 않습니다.\r\n", (WCHAR*)tokens[i].c_str() );
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
}
|
||
}
|
||
}
|
||
else
|
||
return false;
|
||
}
|
||
else
|
||
return false;
|
||
|
||
return true;
|
||
#endif
|
||
return false;
|
||
}
|
||
|
||
bool CDNGMCommand::CmdWorldPvPRoomTournamentSetting(VecWString& tokens)
|
||
{
|
||
#if defined( _GAMESERVER )
|
||
if(4 != tokens.size())
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if( m_pSession->GetGameRoom() )
|
||
{
|
||
CDNGameRoom *pRoom = m_pSession->GetGameRoom();
|
||
if( pRoom && pRoom->GetWorldPvPRoomReqType() == WorldPvPMissionRoom::Common::GMRoom )
|
||
{
|
||
|
||
int nTournamentIndex = _wtoi(tokens[1].c_str());
|
||
if( pRoom->GetPvPMaxUser() <= 0 )
|
||
{
|
||
wstring wszString = FormatW(L"게임룸 맥스유저 오류.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
if( nTournamentIndex > pRoom->GetPvPMaxUser() / 2 )
|
||
{
|
||
wstring wszString = FormatW(L"경기번호 오류.\r\n");
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
|
||
nTournamentIndex = ((nTournamentIndex - 1) * 2);
|
||
int nCount = 0;
|
||
for( int i=2;i<tokens.size();i++ )
|
||
{
|
||
CDNGameRoom::PartyStruct* pStruct = pRoom->GetPartyData( const_cast<WCHAR*>(tokens[i].c_str()) );
|
||
if( pStruct )
|
||
{
|
||
CDNUserSession * pSession = pStruct->pSession;
|
||
if( pSession->GetActorHandle() && pSession->GetTeam() != PvPCommon::Team::Observer )
|
||
{
|
||
pRoom->GetPvPGameMode()->SetTournamentUserInfo( nTournamentIndex+nCount, pSession );
|
||
nCount++;
|
||
}
|
||
else
|
||
{
|
||
wstring wszString = FormatW(L"%s 캐릭가 유효하지 않습니다.\r\n", (WCHAR*)tokens[i].c_str() );
|
||
m_pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
return false;
|
||
}
|
||
else
|
||
return false;
|
||
|
||
return true;
|
||
#endif
|
||
return false;
|
||
}
|
||
#endif
|
||
#if defined( PRE_ADD_MUTE_USERCHATTING )
|
||
bool CDNGMCommand::CmdMuteUser(VecWString& tokens)
|
||
{
|
||
if( 3 != tokens.size() )
|
||
return false;
|
||
|
||
if( _wtoi(tokens[2].c_str()) < 0)
|
||
return false;
|
||
|
||
//제재받은 놈 찾아서 통보
|
||
#if defined( _VILLAGESERVER )
|
||
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
|
||
return false;
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendMuteUserFind(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str(), _wtoi(tokens[2].c_str()), m_pSession->m_eSelectedLanguage);
|
||
#else // #if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnection->SendMuteUserFind(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str(), _wtoi(tokens[2].c_str()));
|
||
#endif // #if defined(PRE_ADD_MULTILANGUAGE)
|
||
#elif defined (_GAMESERVER)
|
||
if (g_pMasterConnectionManager == NULL)
|
||
return false;
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnectionManager->SendMuteUserFind(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str(), _wtoi(tokens[2].c_str()), m_pSession->m_eSelectedLanguage);
|
||
#else // #if defined(PRE_ADD_MULTILANGUAGE)
|
||
g_pMasterConnectionManager->SendMuteUserFind(m_pSession->GetAccountDBID(), m_pSession->GetWorldSetID(), tokens[1].c_str(), _wtoi(tokens[2].c_str()));
|
||
#endif // #if defined(PRE_ADD_MULTILANGUAGE)
|
||
#endif
|
||
return true;
|
||
}
|
||
#endif // #if defined( PRE_ADD_MUTE_USERCHATTING )
|