server/game/src/cmd_gm.cpp

4412 lines
96 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 "utils.h"
#include "config.h"
#include "desc_client.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "item_manager.h"
#include "sectree_manager.h"
#include "mob_manager.h"
#include "packet.h"
#include "cmd.h"
#include "regen.h"
#include "guild.h"
#include "guild_manager.h"
#include "p2p.h"
#include "buffer_manager.h"
#include "fishing.h"
#include "mining.h"
#include "questmanager.h"
#include "vector.h"
#include "affect.h"
#include "db.h"
#include "priv_manager.h"
#include "building.h"
#include "battle.h"
#include "arena.h"
#include "start_position.h"
#include "party.h"
#include "monarch.h"
#include "castle.h"
#include "BattleArena.h"
#include "xmas_event.h"
#include "log.h"
#include "pcbang.h"
#include "threeway_war.h"
#include "unique_item.h"
#include "DragonSoul.h"
extern bool DropEvent_RefineBox_SetValue(const std::string& name, int value);
// ADD_COMMAND_SLOW_STUN
enum
{
COMMANDAFFECT_STUN,
COMMANDAFFECT_SLOW,
};
void Command_ApplyAffect(LPCHARACTER ch, const char* argument, const char* affectName, int cmdAffect)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
sys_log(0, arg1);
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: %s <name>", affectName);
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s is not in same map", arg1);
return;
}
switch (cmdAffect)
{
case COMMANDAFFECT_STUN:
SkillAttackAffect(tch, 1000, IMMUNE_STUN, AFFECT_STUN, POINT_NONE, 0, AFF_STUN, 30, "GM_STUN");
break;
case COMMANDAFFECT_SLOW:
SkillAttackAffect(tch, 1000, IMMUNE_SLOW, AFFECT_SLOW, POINT_MOV_SPEED, -30, AFF_SLOW, 30, "GM_SLOW");
break;
}
sys_log(0, "%s %s", arg1, affectName);
ch->ChatPacket(CHAT_TYPE_INFO, "%s %s", arg1, affectName);
}
// END_OF_ADD_COMMAND_SLOW_STUN
ACMD(do_pcbang_update)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
unsigned int PCBangID = 0;
if (*arg1 == '\0')
PCBangID = 0;
else
str_to_number(PCBangID, arg1);
if (PCBangID == 0)
{
CPCBangManager::instance().RequestUpdateIPList(0);
ch->ChatPacket(CHAT_TYPE_INFO, "PCBang Info Update For All");
}
else
{
CPCBangManager::instance().RequestUpdateIPList(PCBangID);
ch->ChatPacket(CHAT_TYPE_INFO, "PCBang Info Update For %u", PCBangID);
}
TPacketPCBangUpdate packet;
packet.bHeader = HEADER_GG_PCBANG_UPDATE;
packet.ulPCBangID = PCBangID;
P2P_MANAGER::instance().Send(&packet, sizeof(TPacketPCBangUpdate));
}
ACMD(do_pcbang_check)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (CPCBangManager::instance().IsPCBangIP(arg1) == true)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s is a PCBang IP", arg1);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s is not a PCBang IP", arg1);
}
}
ACMD(do_stun)
{
Command_ApplyAffect(ch, argument, "stun", COMMANDAFFECT_STUN);
}
ACMD(do_slow)
{
Command_ApplyAffect(ch, argument, "slow", COMMANDAFFECT_SLOW);
}
ACMD(do_transfer)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: transfer <name>");
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
if (pkCCI)
{
if (pkCCI->bChannel != g_bChannel)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
return;
}
TPacketGGTransfer pgg;
pgg.bHeader = HEADER_GG_TRANSFER;
strncpy(pgg.szName, arg1, sizeof(pgg.szName));
pgg.lX = ch->GetX();
pgg.lY = ch->GetY();
P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGTransfer));
ch->ChatPacket(CHAT_TYPE_INFO, "Transfer requested.");
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no character(%s) by that name", arg1);
sys_log(0, "There is no character(%s) by that name", arg1);
}
return;
}
if (ch == tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Transfer me?!?");
return;
}
//tch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
tch->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
}
// LUA_ADD_GOTO_INFO
struct GotoInfo
{
std::string st_name;
BYTE empire;
int mapIndex;
DWORD x, y;
GotoInfo()
{
st_name = "";
empire = 0;
mapIndex = 0;
x = 0;
y = 0;
}
GotoInfo(const GotoInfo& c_src)
{
__copy__(c_src);
}
void operator = (const GotoInfo& c_src)
{
__copy__(c_src);
}
void __copy__(const GotoInfo& c_src)
{
st_name = c_src.st_name;
empire = c_src.empire;
mapIndex = c_src.mapIndex;
x = c_src.x;
y = c_src.y;
}
};
static std::vector<GotoInfo> gs_vec_gotoInfo;
void CHARACTER_AddGotoInfo(const std::string& c_st_name, BYTE empire, int mapIndex, DWORD x, DWORD y)
{
GotoInfo newGotoInfo;
newGotoInfo.st_name = c_st_name;
newGotoInfo.empire = empire;
newGotoInfo.mapIndex = mapIndex;
newGotoInfo.x = x;
newGotoInfo.y = y;
gs_vec_gotoInfo.push_back(newGotoInfo);
sys_log(0, "AddGotoInfo(name=%s, empire=%d, mapIndex=%d, pos=(%d, %d))", c_st_name.c_str(), empire, mapIndex, x, y);
}
bool FindInString(const char * c_pszFind, const char * c_pszIn)
{
const char * c = c_pszIn;
const char * p;
p = strchr(c, '|');
if (!p)
return (0 == strncasecmp(c_pszFind, c_pszIn, strlen(c_pszFind)));
else
{
char sz[64 + 1];
do
{
strncpy(sz, c, MIN(sizeof(sz), (p - c) + 1));
if (!strncasecmp(c_pszFind, sz, strlen(c_pszFind)))
return true;
c = p + 1;
} while ((p = strchr(c, '|')));
strncpy(sz, c, sizeof(sz));
if (!strncasecmp(c_pszFind, sz, strlen(c_pszFind)))
return true;
}
return false;
}
bool CHARACTER_GoToName(LPCHARACTER ch, BYTE empire, int mapIndex, const char* gotoName)
{
std::vector<GotoInfo>::iterator i;
for (i = gs_vec_gotoInfo.begin(); i != gs_vec_gotoInfo.end(); ++i)
{
const GotoInfo& c_eachGotoInfo = *i;
if (mapIndex != 0)
{
if (mapIndex != c_eachGotoInfo.mapIndex)
continue;
}
else if (!FindInString(gotoName, c_eachGotoInfo.st_name.c_str()))
continue;
if (c_eachGotoInfo.empire == 0 || c_eachGotoInfo.empire == empire)
{
int x = c_eachGotoInfo.x * 100;
int y = c_eachGotoInfo.y * 100;
ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
ch->WarpSet(x, y);
ch->Stop();
return true;
}
}
return false;
}
// END_OF_LUA_ADD_GOTO_INFO
/*
= {
{ "A1|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 0, 1, 4693, 9642 },
{ "A3|<7C>ھ<EFBFBD><DABE><EFBFBD>", 0, 3, 3608, 8776 },
{ "B1|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 0, 21, 557, 1579 },
{ "B3|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 0, 23, 1385, 2349 },
{ "C1|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 0, 41, 9696, 2784 },
{ "C3|<7C>ڶ<EFBFBD><DAB6><EFBFBD>", 0, 43, 8731, 2426 },
// Snow
{ "Snow|<7C><><EFBFBD>ѻ<EFBFBD>", 1, 61, 4342, 2906 },
{ "Snow|<7C><><EFBFBD>ѻ<EFBFBD>", 2, 61, 3752, 1749 },
{ "Snow|<7C><><EFBFBD>ѻ<EFBFBD>", 3, 61, 4918, 1736 },
// Flame
{ "Flame|<7C><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD><><C8AD>", 1, 62, 5994, 7563 },
{ "Flame|<7C><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD><><C8AD>", 2, 62, 5978, 6222 },
{ "Flame|<7C><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD><><C8AD>", 3, 62, 7307, 6898 },
// Desert
{ "Desert|<7C><><EFBFBD><EFBFBD><EFBFBD>縷|<7C>縷", 1, 63, 2178, 6272 },
{ "Desert|<7C><><EFBFBD><EFBFBD><EFBFBD>縷|<7C>縷", 2, 63, 2219, 5027 },
{ "Desert|<7C><><EFBFBD><EFBFBD><EFBFBD>縷|<7C>縷", 3, 63, 3440, 5025 },
// Threeway
{ "Three|<7C>·<EFBFBD><C2B7><EFBFBD>", 1, 64, 4021, 6739 },
{ "Three|<7C>·<EFBFBD><C2B7><EFBFBD>", 2, 64, 2704, 7399 },
{ "Three|<7C>·<EFBFBD><C2B7><EFBFBD>", 3, 64, 3213, 8080 },
// <20>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
{ "Milgyo|<7C>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>", 1, 65, 5536, 1436 },
{ "Milgyo|<7C>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>", 2, 65, 5536, 1436 },
{ "Milgyo|<7C>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>", 3, 65, 5536, 1436 },
// <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>Ա<EFBFBD>
{ "<22><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>Ա<EFBFBD>", 1, 65, 5905, 1108 },
{ "<22><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>Ա<EFBFBD>", 2, 65, 5905, 1108 },
{ "<22><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>Ա<EFBFBD>", 3, 65, 5905, 1108 },
{ NULL, 0, 0, 0, 0 },
};
*/
ACMD(do_goto)
{
char arg1[256], arg2[256];
int x = 0, y = 0, z = 0;
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 && !*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: goto <x meter> <y meter>");
return;
}
if (isdigit(*arg1) && isdigit(*arg2))
{
str_to_number(x, arg1);
str_to_number(y, arg2);
PIXEL_POSITION p;
if (SECTREE_MANAGER::instance().GetMapBasePosition(ch->GetX(), ch->GetY(), p))
{
x += p.x / 100;
y += p.y / 100;
}
ch->ChatPacket(CHAT_TYPE_INFO, "You goto ( %d, %d )", x, y);
}
else
{
int mapIndex = 0;
BYTE empire = 0;
if (*arg1 == '#')
str_to_number(mapIndex, (arg1 + 1));
if (*arg2 && isdigit(*arg2))
{
str_to_number(empire, arg2);
empire = MINMAX(1, empire, 3);
}
else
empire = ch->GetEmpire();
if (CHARACTER_GoToName(ch, empire, mapIndex, arg1))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Cannot find map command syntax: /goto <mapname> [empire]");
return;
}
return;
/*
int iMapIndex = 0;
for (int i = 0; aWarpInfo[i].c_pszName != NULL; ++i)
{
if (iMapIndex != 0)
{
if (iMapIndex != aWarpInfo[i].iMapIndex)
continue;
}
else if (!FindInString(arg1, aWarpInfo[i].c_pszName))
continue;
if (aWarpInfo[i].bEmpire == 0 || aWarpInfo[i].bEmpire == bEmpire)
{
x = aWarpInfo[i].x * 100;
y = aWarpInfo[i].y * 100;
ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
ch->WarpSet(x, y);
ch->Stop();
return;
}
}
*/
}
x *= 100;
y *= 100;
ch->Show(ch->GetMapIndex(), x, y, z);
ch->Stop();
}
ACMD(do_warp)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: warp <character name> | <x meter> <y meter>");
return;
}
int x = 0, y = 0;
if (isdigit(*arg1) && isdigit(*arg2))
{
str_to_number(x, arg1);
str_to_number(y, arg2);
}
else
{
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (NULL == tch)
{
const CCI* pkCCI = P2P_MANAGER::instance().Find(arg1);
if (NULL != pkCCI)
{
if (pkCCI->bChannel != g_bChannel)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
return;
}
ch->WarpToPID( pkCCI->dwPID );
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no one by that name");
}
return;
}
else
{
x = tch->GetX() / 100;
y = tch->GetY() / 100;
}
}
x *= 100;
y *= 100;
ch->ChatPacket(CHAT_TYPE_INFO, "You warp to ( %d, %d )", x, y);
ch->WarpSet(x, y);
ch->Stop();
}
ACMD(do_item)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: item <item vnum>");
return;
}
int iCount = 1;
if (*arg2)
{
str_to_number(iCount, arg2);
iCount = MINMAX(1, iCount, ITEM_MAX_COUNT);
}
DWORD dwVnum;
if (isdigit(*arg1))
str_to_number(dwVnum, arg1);
else
{
if (!ITEM_MANAGER::instance().GetVnum(arg1, dwVnum))
{
ch->ChatPacket(CHAT_TYPE_INFO, "#%u item not exist by that vnum.", dwVnum);
return;
}
}
LPITEM item = ITEM_MANAGER::instance().CreateItem(dwVnum, iCount, 0, true);
if (item)
{
if (item->IsDragonSoul())
{
int iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
if (iEmptyPos != -1)
{
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
}
else
{
M2_DESTROY_ITEM(item);
if (!ch->DragonSoul_IsQualified())
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.");
}
else
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
else
{
int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
if (iEmptyPos != -1)
{
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
}
else
{
M2_DESTROY_ITEM(item);
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "#%u item not exist by that vnum.", dwVnum);
}
}
ACMD(do_group_random)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: grrandom <group vnum>");
return;
}
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
CHARACTER_MANAGER::instance().SpawnGroupGroup(dwVnum, ch->GetMapIndex(), ch->GetX() - 500, ch->GetY() - 500, ch->GetX() + 500, ch->GetY() + 500);
}
ACMD(do_group)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: group <group vnum>");
return;
}
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
if (test_server)
sys_log(0, "COMMAND GROUP SPAWN %u at %u %u %u", dwVnum, ch->GetMapIndex(), ch->GetX(), ch->GetY());
CHARACTER_MANAGER::instance().SpawnGroup(dwVnum, ch->GetMapIndex(), ch->GetX() - 500, ch->GetY() - 500, ch->GetX() + 500, ch->GetY() + 500);
}
ACMD(do_mob_coward)
{
char arg1[256], arg2[256];
DWORD vnum = 0;
LPCHARACTER tch;
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mc <vnum>");
return;
}
const CMob * pkMob;
if (isdigit(*arg1))
{
str_to_number(vnum, arg1);
if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
vnum = 0;
}
else
{
pkMob = CMobManager::Instance().Get(arg1, true);
if (pkMob)
vnum = pkMob->m_table.dwVnum;
}
if (vnum == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
return;
}
int iCount = 0;
if (*arg2)
str_to_number(iCount, arg2);
else
iCount = 1;
iCount = MIN(20, iCount);
while (iCount--)
{
tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
ch->GetMapIndex(),
ch->GetX() - number(200, 750),
ch->GetY() - number(200, 750),
ch->GetX() + number(200, 750),
ch->GetY() + number(200, 750),
true,
pkMob->m_table.bType == CHAR_TYPE_STONE);
if (tch)
tch->SetCoward();
}
}
ACMD(do_mob_map)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: mm <vnum>");
return;
}
DWORD vnum = 0;
str_to_number(vnum, arg1);
LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition(vnum, ch->GetMapIndex());
if (tch)
ch->ChatPacket(CHAT_TYPE_INFO, "%s spawned in %dx%d", tch->GetName(), tch->GetX(), tch->GetY());
else
ch->ChatPacket(CHAT_TYPE_INFO, "Spawn failed.");
}
ACMD(do_mob_aggresive)
{
char arg1[256], arg2[256];
DWORD vnum = 0;
LPCHARACTER tch;
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
return;
}
const CMob * pkMob;
if (isdigit(*arg1))
{
str_to_number(vnum, arg1);
if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
vnum = 0;
}
else
{
pkMob = CMobManager::Instance().Get(arg1, true);
if (pkMob)
vnum = pkMob->m_table.dwVnum;
}
if (vnum == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
return;
}
int iCount = 0;
if (*arg2)
str_to_number(iCount, arg2);
else
iCount = 1;
iCount = MIN(20, iCount);
while (iCount--)
{
tch = CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
ch->GetMapIndex(),
ch->GetX() - number(200, 750),
ch->GetY() - number(200, 750),
ch->GetX() + number(200, 750),
ch->GetY() + number(200, 750),
true,
pkMob->m_table.bType == CHAR_TYPE_STONE);
if (tch)
tch->SetAggressive();
}
}
ACMD(do_mob)
{
char arg1[256], arg2[256];
DWORD vnum = 0;
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
return;
}
const CMob* pkMob = NULL;
if (isdigit(*arg1))
{
str_to_number(vnum, arg1);
if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
vnum = 0;
}
else
{
pkMob = CMobManager::Instance().Get(arg1, true);
if (pkMob)
vnum = pkMob->m_table.dwVnum;
}
if (vnum == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
return;
}
int iCount = 0;
if (*arg2)
str_to_number(iCount, arg2);
else
iCount = 1;
if (test_server)
iCount = MIN(40, iCount);
else
iCount = MIN(20, iCount);
while (iCount--)
{
CHARACTER_MANAGER::instance().SpawnMobRange(vnum,
ch->GetMapIndex(),
ch->GetX() - number(200, 750),
ch->GetY() - number(200, 750),
ch->GetX() + number(200, 750),
ch->GetY() + number(200, 750),
true,
pkMob->m_table.bType == CHAR_TYPE_STONE);
}
}
ACMD(do_mob_ld)
{
char arg1[256], arg2[256], arg3[256], arg4[256];
DWORD vnum = 0;
two_arguments(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3), arg4, sizeof(arg4));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: mob <mob vnum>");
return;
}
const CMob* pkMob = NULL;
if (isdigit(*arg1))
{
str_to_number(vnum, arg1);
if ((pkMob = CMobManager::instance().Get(vnum)) == NULL)
vnum = 0;
}
else
{
pkMob = CMobManager::Instance().Get(arg1, true);
if (pkMob)
vnum = pkMob->m_table.dwVnum;
}
if (vnum == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such mob by that vnum");
return;
}
int dir = 1;
int x, y;
if (*arg2)
str_to_number(x, arg2);
if (*arg3)
str_to_number(y, arg3);
if (*arg4)
str_to_number(dir, arg4);
CHARACTER_MANAGER::instance().SpawnMob(vnum,
ch->GetMapIndex(),
x*100,
y*100,
ch->GetZ(),
pkMob->m_table.bType == CHAR_TYPE_STONE,
dir);
}
struct FuncPurge
{
LPCHARACTER m_pkGM;
bool m_bAll;
FuncPurge(LPCHARACTER ch) : m_pkGM(ch), m_bAll(false)
{
}
void operator () (LPENTITY ent)
{
if (!ent->IsType(ENTITY_CHARACTER))
return;
LPCHARACTER pkChr = (LPCHARACTER) ent;
int iDist = DISTANCE_APPROX(pkChr->GetX() - m_pkGM->GetX(), pkChr->GetY() - m_pkGM->GetY());
if (!m_bAll && iDist >= 1000) // 10<31><30><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> purge <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
return;
sys_log(0, "PURGE: %s %d", pkChr->GetName(), iDist);
if (pkChr->IsNPC() && !pkChr->IsPet() && pkChr->GetRider() == NULL)
{
M2_DESTROY_CHARACTER(pkChr);
}
}
};
ACMD(do_purge)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
FuncPurge func(ch);
if (*arg1 && !strcmp(arg1, "all"))
func.m_bAll = true;
LPSECTREE sectree = ch->GetSectree();
if (sectree) // #431
sectree->ForEachAround(func);
else
sys_err("PURGE_ERROR.NULL_SECTREE(mapIndex=%d, pos=(%d, %d)", ch->GetMapIndex(), ch->GetX(), ch->GetY());
}
ACMD(do_item_purge)
{
int i;
LPITEM item;
for (i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
{
if ((item = ch->GetInventoryItem(i)))
{
ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
}
}
for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
{
if ((item = ch->GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i ))))
{
ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
}
}
}
ACMD(do_state)
{
char arg1[256];
LPCHARACTER tch;
one_argument(argument, arg1, sizeof(arg1));
if (*arg1)
{
if (arg1[0] == '#')
{
tch = CHARACTER_MANAGER::instance().Find(strtoul(arg1+1, NULL, 10));
}
else
{
LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
if (!d)
tch = NULL;
else
tch = d->GetCharacter();
}
}
else
tch = ch;
if (!tch)
return;
char buf[256];
snprintf(buf, sizeof(buf), "%s's State: ", tch->GetName());
if (tch->IsPosition(POS_FIGHTING))
strncat(buf, "Battle", sizeof(buf) - strlen(buf) - 1);
else if (tch->IsPosition(POS_DEAD))
strncat(buf, "Dead", sizeof(buf) - strlen(buf) - 1);
else
strncat(buf, "Standing", sizeof(buf) - strlen(buf) - 1);
if (ch->GetShop())
strncat(buf, ", Shop", sizeof(buf) - strlen(buf) - 1);
if (ch->GetExchange())
strncat(buf, ", Exchange", sizeof(buf) - strlen(buf) - 1);
ch->ChatPacket(CHAT_TYPE_INFO, "%s", buf);
int len;
len = snprintf(buf, sizeof(buf), "Coordinate %dx%d (%dx%d)",
tch->GetX(), tch->GetY(), tch->GetX() / 100, tch->GetY() / 100);
if (len < 0 || len >= (int) sizeof(buf))
len = sizeof(buf) - 1;
LPSECTREE pSec = SECTREE_MANAGER::instance().Get(tch->GetMapIndex(), tch->GetX(), tch->GetY());
if (pSec)
{
TMapSetting& map_setting = SECTREE_MANAGER::instance().GetMap(tch->GetMapIndex())->m_setting;
snprintf(buf + len, sizeof(buf) - len, " MapIndex %d Attribute %08X Local Position (%d x %d)",
tch->GetMapIndex(), pSec->GetAttribute(tch->GetX(), tch->GetY()), (tch->GetX() - map_setting.iBaseX)/100, (tch->GetY() - map_setting.iBaseY)/100);
}
ch->ChatPacket(CHAT_TYPE_INFO, "%s", buf);
ch->ChatPacket(CHAT_TYPE_INFO, "LEV %d", tch->GetLevel());
ch->ChatPacket(CHAT_TYPE_INFO, "HP %d/%d", tch->GetHP(), tch->GetMaxHP());
ch->ChatPacket(CHAT_TYPE_INFO, "SP %d/%d", tch->GetSP(), tch->GetMaxSP());
ch->ChatPacket(CHAT_TYPE_INFO, "ATT %d MAGIC_ATT %d SPD %d CRIT %d%% PENE %d%% ATT_BONUS %d%%",
tch->GetPoint(POINT_ATT_GRADE),
tch->GetPoint(POINT_MAGIC_ATT_GRADE),
tch->GetPoint(POINT_ATT_SPEED),
tch->GetPoint(POINT_CRITICAL_PCT),
tch->GetPoint(POINT_PENETRATE_PCT),
tch->GetPoint(POINT_ATT_BONUS));
ch->ChatPacket(CHAT_TYPE_INFO, "DEF %d MAGIC_DEF %d BLOCK %d%% DODGE %d%% DEF_BONUS %d%%",
tch->GetPoint(POINT_DEF_GRADE),
tch->GetPoint(POINT_MAGIC_DEF_GRADE),
tch->GetPoint(POINT_BLOCK),
tch->GetPoint(POINT_DODGE),
tch->GetPoint(POINT_DEF_BONUS));
ch->ChatPacket(CHAT_TYPE_INFO, "RESISTANCES:");
ch->ChatPacket(CHAT_TYPE_INFO, " WARR:%3d%% ASAS:%3d%% SURA:%3d%% SHAM:%3d%%",
tch->GetPoint(POINT_RESIST_WARRIOR),
tch->GetPoint(POINT_RESIST_ASSASSIN),
tch->GetPoint(POINT_RESIST_SURA),
tch->GetPoint(POINT_RESIST_SHAMAN));
ch->ChatPacket(CHAT_TYPE_INFO, " SWORD:%3d%% THSWORD:%3d%% DAGGER:%3d%% BELL:%3d%% FAN:%3d%% BOW:%3d%%",
tch->GetPoint(POINT_RESIST_SWORD),
tch->GetPoint(POINT_RESIST_TWOHAND),
tch->GetPoint(POINT_RESIST_DAGGER),
tch->GetPoint(POINT_RESIST_BELL),
tch->GetPoint(POINT_RESIST_FAN),
tch->GetPoint(POINT_RESIST_BOW));
ch->ChatPacket(CHAT_TYPE_INFO, " FIRE:%3d%% ELEC:%3d%% MAGIC:%3d%% WIND:%3d%% CRIT:%3d%% PENE:%3d%%",
tch->GetPoint(POINT_RESIST_FIRE),
tch->GetPoint(POINT_RESIST_ELEC),
tch->GetPoint(POINT_RESIST_MAGIC),
tch->GetPoint(POINT_RESIST_WIND),
tch->GetPoint(POINT_RESIST_CRITICAL),
tch->GetPoint(POINT_RESIST_PENETRATE));
ch->ChatPacket(CHAT_TYPE_INFO, " ICE:%3d%% EARTH:%3d%% DARK:%3d%%",
tch->GetPoint(POINT_RESIST_ICE),
tch->GetPoint(POINT_RESIST_EARTH),
tch->GetPoint(POINT_RESIST_DARK));
ch->ChatPacket(CHAT_TYPE_INFO, "MALL:");
ch->ChatPacket(CHAT_TYPE_INFO, " ATT:%3d%% DEF:%3d%% EXP:%3d%% ITEMx%d GOLDx%d",
tch->GetPoint(POINT_MALL_ATTBONUS),
tch->GetPoint(POINT_MALL_DEFBONUS),
tch->GetPoint(POINT_MALL_EXPBONUS),
tch->GetPoint(POINT_MALL_ITEMBONUS) / 10,
tch->GetPoint(POINT_MALL_GOLDBONUS) / 10);
ch->ChatPacket(CHAT_TYPE_INFO, "BONUS:");
ch->ChatPacket(CHAT_TYPE_INFO, " SKILL:%3d%% NORMAL:%3d%% SKILL_DEF:%3d%% NORMAL_DEF:%3d%%",
tch->GetPoint(POINT_SKILL_DAMAGE_BONUS),
tch->GetPoint(POINT_NORMAL_HIT_DAMAGE_BONUS),
tch->GetPoint(POINT_SKILL_DEFEND_BONUS),
tch->GetPoint(POINT_NORMAL_HIT_DEFEND_BONUS));
ch->ChatPacket(CHAT_TYPE_INFO, " HUMAN:%3d%% ANIMAL:%3d%% ORC:%3d%% MILGYO:%3d%% UNDEAD:%3d%%",
tch->GetPoint(POINT_ATTBONUS_HUMAN),
tch->GetPoint(POINT_ATTBONUS_ANIMAL),
tch->GetPoint(POINT_ATTBONUS_ORC),
tch->GetPoint(POINT_ATTBONUS_MILGYO),
tch->GetPoint(POINT_ATTBONUS_UNDEAD));
ch->ChatPacket(CHAT_TYPE_INFO, " DEVIL:%3d%% INSECT:%3d%% FIRE:%3d%% ICE:%3d%% DESERT:%3d%%",
tch->GetPoint(POINT_ATTBONUS_DEVIL),
tch->GetPoint(POINT_ATTBONUS_INSECT),
tch->GetPoint(POINT_ATTBONUS_FIRE),
tch->GetPoint(POINT_ATTBONUS_ICE),
tch->GetPoint(POINT_ATTBONUS_DESERT));
ch->ChatPacket(CHAT_TYPE_INFO, " TREE:%3d%% MONSTER:%3d%%",
tch->GetPoint(POINT_ATTBONUS_TREE),
tch->GetPoint(POINT_ATTBONUS_MONSTER));
ch->ChatPacket(CHAT_TYPE_INFO, " WARR:%3d%% ASAS:%3d%% SURA:%3d%% SHAM:%3d%%",
tch->GetPoint(POINT_ATTBONUS_WARRIOR),
tch->GetPoint(POINT_ATTBONUS_ASSASSIN),
tch->GetPoint(POINT_ATTBONUS_SURA),
tch->GetPoint(POINT_ATTBONUS_SHAMAN));
for (int i = 0; i < MAX_PRIV_NUM; ++i)
if (CPrivManager::instance().GetPriv(tch, i))
{
int iByEmpire = CPrivManager::instance().GetPrivByEmpire(tch->GetEmpire(), i);
int iByGuild = 0;
if (tch->GetGuild())
iByGuild = CPrivManager::instance().GetPrivByGuild(tch->GetGuild()->GetID(), i);
int iByPlayer = CPrivManager::instance().GetPrivByCharacter(tch->GetPlayerID(), i);
if (iByEmpire)
ch->ChatPacket(CHAT_TYPE_INFO, "%s for empire : %d", LC_TEXT(c_apszPrivNames[i]), iByEmpire);
if (iByGuild)
ch->ChatPacket(CHAT_TYPE_INFO, "%s for guild : %d", LC_TEXT(c_apszPrivNames[i]), iByGuild);
if (iByPlayer)
ch->ChatPacket(CHAT_TYPE_INFO, "%s for player : %d", LC_TEXT(c_apszPrivNames[i]), iByPlayer);
}
}
struct notice_packet_func
{
const char * m_str;
notice_packet_func(const char * str) : m_str(str)
{
}
void operator () (LPDESC d)
{
if (!d->GetCharacter())
return;
d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
}
};
struct monarch_notice_packet_func
{
const char * m_str;
BYTE m_bEmpire;
monarch_notice_packet_func(BYTE bEmpire, const char * str) : m_str(str), m_bEmpire(bEmpire)
{
}
void operator () (LPDESC d)
{
if (!d->GetCharacter())
return;
if (m_bEmpire == d->GetCharacter()->GetEmpire())
{
d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
}
}
};
void SendNotice(const char * c_pszBuf)
{
const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_packet_func(c_pszBuf));
}
void SendMonarchNotice(BYTE bEmpire, const char* c_pszBuf)
{
const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
std::for_each(c_ref_set.begin(), c_ref_set.end(), monarch_notice_packet_func(bEmpire, c_pszBuf));
}
struct notice_map_packet_func
{
const char* m_str;
int m_mapIndex;
bool m_bBigFont;
notice_map_packet_func(const char* str, int idx, bool bBigFont) : m_str(str), m_mapIndex(idx), m_bBigFont(bBigFont)
{
}
void operator() (LPDESC d)
{
if (d->GetCharacter() == NULL) return;
if (d->GetCharacter()->GetMapIndex() != m_mapIndex) return;
d->GetCharacter()->ChatPacket(m_bBigFont == true ? CHAT_TYPE_BIG_NOTICE : CHAT_TYPE_NOTICE, "%s", m_str);
}
};
void SendNoticeMap(const char* c_pszBuf, int nMapIndex, bool bBigFont)
{
const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_map_packet_func(c_pszBuf, nMapIndex, bBigFont));
}
struct log_packet_func
{
const char * m_str;
log_packet_func(const char * str) : m_str(str)
{
}
void operator () (LPDESC d)
{
if (!d->GetCharacter())
return;
if (d->GetCharacter()->GetGMLevel() > GM_PLAYER)
d->GetCharacter()->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_str);
}
};
void SendLog(const char * c_pszBuf)
{
const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
std::for_each(c_ref_set.begin(), c_ref_set.end(), log_packet_func(c_pszBuf));
}
void BroadcastNotice(const char * c_pszBuf)
{
TPacketGGNotice p;
p.bHeader = HEADER_GG_NOTICE;
p.lSize = strlen(c_pszBuf) + 1;
TEMP_BUFFER buf;
buf.write(&p, sizeof(p));
buf.write(c_pszBuf, p.lSize);
P2P_MANAGER::instance().Send(buf.read_peek(), buf.size()); // HEADER_GG_NOTICE
SendNotice(c_pszBuf);
}
void BroadcastMonarchNotice(BYTE bEmpire, const char * c_pszBuf)
{
TPacketGGMonarchNotice p;
p.bHeader = HEADER_GG_MONARCH_NOTICE;
p.bEmpire = bEmpire;
p.lSize = strlen(c_pszBuf) + 1;
TEMP_BUFFER buf;
buf.write(&p, sizeof(p));
buf.write(c_pszBuf, p.lSize);
P2P_MANAGER::instance().Send(buf.read_peek(), buf.size());
SendMonarchNotice(bEmpire, c_pszBuf);
}
ACMD(do_notice)
{
BroadcastNotice(argument);
}
ACMD(do_map_notice)
{
SendNoticeMap(argument, ch->GetMapIndex(), false);
}
ACMD(do_big_notice)
{
ch->ChatPacket(CHAT_TYPE_BIG_NOTICE, "%s", argument);
}
ACMD(do_monarch_notice)
{
if (ch->IsMonarch() == true)
{
BroadcastMonarchNotice(ch->GetEmpire(), argument);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>"));
}
}
ACMD(do_who)
{
int iTotal;
int * paiEmpireUserCount;
int iLocal;
DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal);
ch->ChatPacket(CHAT_TYPE_INFO, "Total [%d] %d / %d / %d (this server %d)",
iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal);
}
class user_func
{
public:
LPCHARACTER m_ch;
static int count;
static char str[128];
static int str_len;
user_func()
: m_ch(NULL)
{}
void initialize(LPCHARACTER ch)
{
m_ch = ch;
str_len = 0;
count = 0;
str[0] = '\0';
}
void operator () (LPDESC d)
{
if (!d->GetCharacter())
return;
int len = snprintf(str + str_len, sizeof(str) - str_len, "%-16s ", d->GetCharacter()->GetName());
if (len < 0 || len >= (int) sizeof(str) - str_len)
len = (sizeof(str) - str_len) - 1;
str_len += len;
++count;
if (!(count % 4))
{
m_ch->ChatPacket(CHAT_TYPE_INFO, str);
str[0] = '\0';
str_len = 0;
}
}
};
int user_func::count = 0;
char user_func::str[128] = { 0, };
int user_func::str_len = 0;
ACMD(do_user)
{
const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();
user_func func;
func.initialize(ch);
std::for_each(c_ref_set.begin(), c_ref_set.end(), func);
if (func.count % 4)
ch->ChatPacket(CHAT_TYPE_INFO, func.str);
ch->ChatPacket(CHAT_TYPE_INFO, "Total %d", func.count);
}
ACMD(do_disconnect)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "ex) /dc <player name>");
return;
}
LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
LPCHARACTER tch = d ? d->GetCharacter() : NULL;
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s: no such a player.", arg1);
return;
}
if (tch == ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "cannot disconnect myself");
return;
}
DESC_MANAGER::instance().DestroyDesc(d);
}
ACMD(do_kill)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "ex) /kill <player name>");
return;
}
LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);
LPCHARACTER tch = d ? d->GetCharacter() : NULL;
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s: no such a player", arg1);
return;
}
tch->Dead();
}
#define MISC 0
#define BINARY 1
#define NUMBER 2
const struct set_struct
{
const char *cmd;
const char type;
} set_fields[] = {
{ "gold", NUMBER },
{ "race", BINARY },
{ "sex", BINARY },
{ "exp", NUMBER },
{ "max_hp", NUMBER },
{ "max_sp", NUMBER },
{ "skill", NUMBER },
{ "alignment", NUMBER },
{ "align", NUMBER },
{ "\n", MISC }
};
ACMD(do_set)
{
char arg1[256], arg2[256], arg3[256];
LPCHARACTER tch = NULL;
int i, len;
const char* line;
line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
one_argument(line, arg3, sizeof(arg3));
if (!*arg1 || !*arg2 || !*arg3)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: set <name> <field> <value>");
return;
}
tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s not exist", arg1);
return;
}
len = strlen(arg2);
for (i = 0; *(set_fields[i].cmd) != '\n'; i++)
if (!strncmp(arg2, set_fields[i].cmd, len))
break;
switch (i)
{
case 0: // gold
{
int gold = 0;
str_to_number(gold, arg3);
DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold);
int before_gold = tch->GetGold();
tch->PointChange(POINT_GOLD, gold, true);
int after_gold = tch->GetGold();
if (0 == after_gold && 0 != before_gold)
{
LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM");
}
}
break;
case 1: // race
break;
case 2: // sex
break;
case 3: // exp
{
int amount = 0;
str_to_number(amount, arg3);
tch->PointChange(POINT_EXP, amount, true);
}
break;
case 4: // max_hp
{
int amount = 0;
str_to_number(amount, arg3);
tch->PointChange(POINT_MAX_HP, amount, true);
}
break;
case 5: // max_sp
{
int amount = 0;
str_to_number(amount, arg3);
tch->PointChange(POINT_MAX_SP, amount, true);
}
break;
case 6: // active skill point
{
int amount = 0;
str_to_number(amount, arg3);
tch->PointChange(POINT_SKILL, amount, true);
}
break;
case 7: // alignment
case 8: // alignment
{
int amount = 0;
str_to_number(amount, arg3);
tch->UpdateAlignment(amount - ch->GetRealAlignment());
}
break;
}
if (set_fields[i].type == NUMBER)
{
int amount = 0;
str_to_number(amount, arg3);
ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%d]", tch->GetName(), set_fields[i].cmd, amount);
}
}
ACMD(do_reset)
{
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
ch->Save();
}
ACMD(do_advance)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: advance <name> <level>");
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s not exist", arg1);
return;
}
int level = 0;
str_to_number(level, arg2);
tch->ResetPoint(MINMAX(0, level, PLAYER_MAX_LEVEL_CONST));
}
ACMD(do_respawn)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (*arg1 && !strcasecmp(arg1, "all"))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Respaw everywhere");
regen_reset(0, 0);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "Respaw around");
regen_reset(ch->GetX(), ch->GetY());
}
}
ACMD(do_safebox_size)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int size = 0;
if (*arg1)
str_to_number(size, arg1);
if (size > 3 || size < 0)
size = 0;
ch->ChatPacket(CHAT_TYPE_INFO, "Safebox size set to %d", size);
ch->ChangeSafeboxSize(size);
}
ACMD(do_makeguild)
{
if (ch->GetGuild())
return;
CGuildManager& gm = CGuildManager::instance();
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
TGuildCreateParameter cp;
memset(&cp, 0, sizeof(cp));
cp.master = ch;
strncpy(cp.name, arg1, sizeof(cp.name));
if (!check_name(cp.name))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>Դϴ<D4B4>."));
return;
}
gm.CreateGuild(cp);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("(%s) <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. [<5B>ӽ<EFBFBD>]"), cp.name);
}
ACMD(do_deleteguild)
{
if (ch->GetGuild())
ch->GetGuild()->RequestDisband(ch->GetPlayerID());
}
ACMD(do_greset)
{
if (ch->GetGuild())
ch->GetGuild()->Reset();
}
// REFINE_ROD_HACK_BUG_FIX
ACMD(do_refine_rod)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
BYTE cell = 0;
str_to_number(cell, arg1);
LPITEM item = ch->GetInventoryItem(cell);
if (item)
fishing::RealRefineRod(ch, item);
}
// END_OF_REFINE_ROD_HACK_BUG_FIX
// REFINE_PICK
ACMD(do_refine_pick)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
BYTE cell = 0;
str_to_number(cell, arg1);
LPITEM item = ch->GetInventoryItem(cell);
if (item)
{
mining::CHEAT_MAX_PICK(ch, item);
mining::RealRefinePick(ch, item);
}
}
ACMD(do_max_pick)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
BYTE cell = 0;
str_to_number(cell, arg1);
LPITEM item = ch->GetInventoryItem(cell);
if (item)
{
mining::CHEAT_MAX_PICK(ch, item);
}
}
// END_OF_REFINE_PICK
ACMD(do_fishing_simul)
{
char arg1[256];
char arg2[256];
char arg3[256];
argument = one_argument(argument, arg1, sizeof(arg1));
two_arguments(argument, arg2, sizeof(arg2), arg3, sizeof(arg3));
int count = 1000;
int prob_idx = 0;
int level = 100;
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: fishing_simul <level> <prob index> <count>");
if (*arg1)
str_to_number(level, arg1);
if (*arg2)
str_to_number(prob_idx, arg2);
if (*arg3)
str_to_number(count, arg3);
fishing::Simulation(level, count, prob_idx, ch);
}
ACMD(do_invisibility)
{
if (ch->IsAffectFlag(AFF_INVISIBILITY))
{
ch->RemoveAffect(AFFECT_INVISIBILITY);
}
else
{
ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
}
}
ACMD(do_event_flag)
{
char arg1[256];
char arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!(*arg1) || !(*arg2))
return;
int value = 0;
str_to_number(value, arg2);
if (!strcmp(arg1, "mob_item") ||
!strcmp(arg1, "mob_exp") ||
!strcmp(arg1, "mob_gold") ||
!strcmp(arg1, "mob_dam") ||
!strcmp(arg1, "mob_gold_pct") ||
!strcmp(arg1, "mob_item_buyer") ||
!strcmp(arg1, "mob_exp_buyer") ||
!strcmp(arg1, "mob_gold_buyer") ||
!strcmp(arg1, "mob_gold_pct_buyer")
)
value = MINMAX(0, value, 1000);
//quest::CQuestManager::instance().SetEventFlag(arg1, atoi(arg2));
quest::CQuestManager::instance().RequestSetEventFlag(arg1, value);
ch->ChatPacket(CHAT_TYPE_INFO, "RequestSetEventFlag %s %d", arg1, value);
sys_log(0, "RequestSetEventFlag %s %d", arg1, value);
}
ACMD(do_get_event_flag)
{
quest::CQuestManager::instance().SendEventFlagList(ch);
}
ACMD(do_private)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: private <map index>");
return;
}
int lMapIndex;
int map_index = 0;
str_to_number(map_index, arg1);
if ((lMapIndex = SECTREE_MANAGER::instance().CreatePrivateMap(map_index)))
{
ch->SaveExitLocation();
LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(lMapIndex);
ch->WarpSet(pkSectreeMap->m_setting.posSpawn.x, pkSectreeMap->m_setting.posSpawn.y, lMapIndex);
}
else
ch->ChatPacket(CHAT_TYPE_INFO, "Can't find map by index %d", map_index);
}
ACMD(do_qf)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
return;
quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
std::string questname = pPC->GetCurrentQuestName();
if (!questname.empty())
{
int value = quest::CQuestManager::Instance().GetQuestStateIndex(questname, arg1);
pPC->SetFlag(questname + ".__status", value);
pPC->ClearTimer();
quest::PC::QuestInfoIterator it = pPC->quest_begin();
unsigned int questindex = quest::CQuestManager::instance().GetQuestIndexByName(questname);
while (it!= pPC->quest_end())
{
if (it->first == questindex)
{
it->second.st = value;
break;
}
++it;
}
ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag %s %s %d", questname.c_str(), arg1, value);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag failed");
}
}
LPCHARACTER chHori, chForge, chLib, chTemple, chTraining, chTree, chPortal, chBall;
ACMD(do_b1)
{
//ȣ<><C8A3><EFBFBD><EFBFBD> 478 579
chHori = CHARACTER_MANAGER::instance().SpawnMobRange(14017, ch->GetMapIndex(), 304222, 742858, 304222, 742858, true, false);
chHori->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_CONSTRUCTION_SMALL, 65535, 0, true);
chHori->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
for (int i = 0; i < 30; ++i)
{
int rot = number(0, 359);
float fx, fy;
GetDeltaByDegree(rot, 800, &fx, &fy);
LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(number(701, 706),
ch->GetMapIndex(),
304222 + (int)fx,
742858 + (int)fy,
304222 + (int)fx,
742858 + (int)fy,
true,
false);
tch->SetAggressive();
}
for (int i = 0; i < 5; ++i)
{
int rot = number(0, 359);
float fx, fy;
GetDeltaByDegree(rot, 800, &fx, &fy);
LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(8009,
ch->GetMapIndex(),
304222 + (int)fx,
742858 + (int)fy,
304222 + (int)fx,
742858 + (int)fy,
true,
false);
tch->SetAggressive();
}
}
ACMD(do_b2)
{
chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
}
ACMD(do_b3)
{
// <20><><EFBFBD><EFBFBD> 492 547
chForge = CHARACTER_MANAGER::instance().SpawnMobRange(14003, ch->GetMapIndex(), 307500, 746300, 307500, 746300, true, false);
chForge->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
//<2F><><EFBFBD><EFBFBD>ž 509 589 -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14007, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
//<2F><><EFBFBD><EFBFBD> 513 606 -> <20><><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD>
chTemple = CHARACTER_MANAGER::instance().SpawnMobRange(14004, ch->GetMapIndex(), 307700, 741600, 307700, 741600, true, false);
chTemple->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 490 625
chTraining= CHARACTER_MANAGER::instance().SpawnMobRange(14010, ch->GetMapIndex(), 307100, 739500, 307100, 739500, true, false);
chTraining->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
//<2F><><EFBFBD><EFBFBD> 466 614
chTree= CHARACTER_MANAGER::instance().SpawnMobRange(14013, ch->GetMapIndex(), 300800, 741600, 300800, 741600, true, false);
chTree->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
//<2F><>Ż 439 615
chPortal= CHARACTER_MANAGER::instance().SpawnMobRange(14001, ch->GetMapIndex(), 300900, 744500, 300900, 744500, true, false);
chPortal->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
// <20><><EFBFBD><EFBFBD> 436 600
chBall = CHARACTER_MANAGER::instance().SpawnMobRange(14012, ch->GetMapIndex(), 302500, 746600, 302500, 746600, true, false);
chBall->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
}
ACMD(do_b4)
{
chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_UPGRADE, 65535, 0, true);
for (int i = 0; i < 30; ++i)
{
int rot = number(0, 359);
float fx, fy;
GetDeltaByDegree(rot, 1200, &fx, &fy);
LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(number(701, 706),
ch->GetMapIndex(),
307900 + (int)fx,
744500 + (int)fy,
307900 + (int)fx,
744500 + (int)fy,
true,
false);
tch->SetAggressive();
}
for (int i = 0; i < 5; ++i)
{
int rot = number(0, 359);
float fx, fy;
GetDeltaByDegree(rot, 1200, &fx, &fy);
LPCHARACTER tch = CHARACTER_MANAGER::instance().SpawnMobRange(8009,
ch->GetMapIndex(),
307900 + (int)fx,
744500 + (int)fy,
307900 + (int)fx,
744500 + (int)fy,
true,
false);
tch->SetAggressive();
}
}
ACMD(do_b5)
{
M2_DESTROY_CHARACTER(chLib);
//chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14008, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
}
ACMD(do_b6)
{
chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_BUILDING_UPGRADE, 65535, 0, true);
}
ACMD(do_b7)
{
M2_DESTROY_CHARACTER(chLib);
//chHori->RemoveAffect(AFFECT_DUNGEON_UNIQUE);
chLib = CHARACTER_MANAGER::instance().SpawnMobRange(14009, ch->GetMapIndex(), 307900, 744500, 307900, 744500, true, false);
chLib->AddAffect(AFFECT_DUNGEON_UNIQUE, POINT_NONE, 0, AFF_DUNGEON_UNIQUE, 65535, 0, true);
}
ACMD(do_book)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
CSkillProto * pkProto;
if (isdigit(*arg1))
{
DWORD vnum = 0;
str_to_number(vnum, arg1);
pkProto = CSkillManager::instance().Get(vnum);
}
else
pkProto = CSkillManager::instance().Get(arg1);
if (!pkProto)
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no such a skill.");
return;
}
LPITEM item = ch->AutoGiveItem(50300);
item->SetSocket(0, pkProto->dwVnum);
}
ACMD(do_setskillother)
{
char arg1[256], arg2[256], arg3[256];
argument = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
one_argument(argument, arg3, sizeof(arg3));
if (!*arg1 || !*arg2 || !*arg3 || !isdigit(*arg3))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setskillother <target> <skillname> <lev>");
return;
}
LPCHARACTER tch;
tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
return;
}
CSkillProto * pk;
if (isdigit(*arg2))
{
DWORD vnum = 0;
str_to_number(vnum, arg2);
pk = CSkillManager::instance().Get(vnum);
}
else
pk = CSkillManager::instance().Get(arg2);
if (!pk)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such a skill by that name.");
return;
}
BYTE level = 0;
str_to_number(level, arg3);
tch->SetSkillLevel(pk->dwVnum, level);
tch->ComputePoints();
tch->SkillLevelPacket();
}
ACMD(do_setskill)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2 || !isdigit(*arg2))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setskill <name> <lev>");
return;
}
CSkillProto * pk;
if (isdigit(*arg1))
{
DWORD vnum = 0;
str_to_number(vnum, arg1);
pk = CSkillManager::instance().Get(vnum);
}
else
pk = CSkillManager::instance().Get(arg1);
if (!pk)
{
ch->ChatPacket(CHAT_TYPE_INFO, "No such a skill by that name.");
return;
}
BYTE level = 0;
str_to_number(level, arg2);
ch->SetSkillLevel(pk->dwVnum, level);
ch->ComputePoints();
ch->SkillLevelPacket();
}
ACMD(do_set_skill_point)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int skill_point = 0;
if (*arg1)
str_to_number(skill_point, arg1);
ch->SetRealPoint(POINT_SKILL, skill_point);
ch->SetPoint(POINT_SKILL, ch->GetRealPoint(POINT_SKILL));
ch->PointChange(POINT_SKILL, 0);
}
ACMD(do_set_skill_group)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int skill_group = 0;
if (*arg1)
str_to_number(skill_group, arg1);
ch->SetSkillGroup(skill_group);
ch->ClearSkill();
ch->ChatPacket(CHAT_TYPE_INFO, "skill group to %d.", skill_group);
}
ACMD(do_reload)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (*arg1)
{
switch (LOWER(*arg1))
{
case 'u':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading state_user_count.");
LoadStateUserCount();
break;
case 'p':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading prototype tables,");
db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0);
break;
case 's':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading notice string.");
DBManager::instance().LoadDBString();
break;
case 'q':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading quest.");
quest::CQuestManager::instance().Reload();
break;
case 'f':
fishing::Initialize();
break;
//RELOAD_ADMIN
case 'a':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading Admin infomation.");
db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0);
sys_log(0, "Reloading admin infomation.");
break;
//END_RELOAD_ADMIN
case 'c': // cube
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
Cube_init ();
break;
}
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading state_user_count.");
LoadStateUserCount();
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading prototype tables,");
db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0);
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading notice string.");
DBManager::instance().LoadDBString();
}
}
ACMD(do_cooltime)
{
ch->DisableCooltime();
}
ACMD(do_level)
{
char arg2[256];
one_argument(argument, arg2, sizeof(arg2));
if (!*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: level <level>");
return;
}
int level = 0;
str_to_number(level, arg2);
ch->ResetPoint(MINMAX(1, level, PLAYER_MAX_LEVEL_CONST));
ch->ClearSkill();
ch->ClearSubSkill();
}
ACMD(do_gwlist)
{
ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Դϴ<D4B4>"));
CGuildManager::instance().ShowGuildWarList(ch);
}
ACMD(do_stop_guild_war)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
return;
int id1 = 0, id2 = 0;
str_to_number(id1, arg1);
str_to_number(id2, arg2);
if (!id1 || !id2)
return;
if (id1 > id2)
{
std::swap(id1, id2);
}
ch->ChatPacket(CHAT_TYPE_TALKING, "%d %d", id1, id2);
CGuildManager::instance().RequestEndWar(id1, id2);
}
ACMD(do_cancel_guild_war)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
int id1 = 0, id2 = 0;
str_to_number(id1, arg1);
str_to_number(id2, arg2);
if (id1 > id2)
std::swap(id1, id2);
CGuildManager::instance().RequestCancelWar(id1, id2);
}
ACMD(do_guild_state)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
CGuild* pGuild = CGuildManager::instance().FindGuildByName(arg1);
if (pGuild != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "GuildID: %d", pGuild->GetID());
ch->ChatPacket(CHAT_TYPE_INFO, "GuildMasterPID: %d", pGuild->GetMasterPID());
ch->ChatPacket(CHAT_TYPE_INFO, "IsInWar: %d", pGuild->UnderAnyWar());
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Դϴ<D4B4>."), arg1);
}
}
struct FuncWeaken
{
LPCHARACTER m_pkGM;
bool m_bAll;
FuncWeaken(LPCHARACTER ch) : m_pkGM(ch), m_bAll(false)
{
}
void operator () (LPENTITY ent)
{
if (!ent->IsType(ENTITY_CHARACTER))
return;
LPCHARACTER pkChr = (LPCHARACTER) ent;
int iDist = DISTANCE_APPROX(pkChr->GetX() - m_pkGM->GetX(), pkChr->GetY() - m_pkGM->GetY());
if (!m_bAll && iDist >= 1000) // 10<31><30><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> purge <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
return;
if (pkChr->IsNPC())
pkChr->PointChange(POINT_HP, (10 - pkChr->GetHP()));
}
};
ACMD(do_weaken)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
FuncWeaken func(ch);
if (*arg1 && !strcmp(arg1, "all"))
func.m_bAll = true;
ch->GetSectree()->ForEachAround(func);
}
ACMD(do_getqf)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
LPCHARACTER tch;
if (!*arg1)
tch = ch;
else
{
tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
return;
}
}
quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
if (pPC)
pPC->SendFlagList(ch);
}
ACMD(do_set_state)
{
char arg1[256];
char arg2[256];
//argument = one_argument(argument, arg1, sizeof(arg1));
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
return;
quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
std::string questname = arg1;
std::string statename = arg2;
if (!questname.empty())
{
int value = quest::CQuestManager::Instance().GetQuestStateIndex(questname, statename);
pPC->SetFlag(questname + ".__status", value);
pPC->ClearTimer();
quest::PC::QuestInfoIterator it = pPC->quest_begin();
unsigned int questindex = quest::CQuestManager::instance().GetQuestIndexByName(questname);
while (it!= pPC->quest_end())
{
if (it->first == questindex)
{
it->second.st = value;
break;
}
++it;
}
ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag %s %s %d", questname.c_str(), arg1, value);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "setting quest state flag failed");
}
}
ACMD(do_setqf)
{
char arg1[256];
char arg2[256];
char arg3[256];
one_argument(two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: setqf <flagname> <value> [<character name>]");
return;
}
LPCHARACTER tch = ch;
if (*arg3)
tch = CHARACTER_MANAGER::instance().FindPC(arg3);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
return;
}
quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
if (pPC)
{
int value = 0;
str_to_number(value, arg2);
pPC->SetFlag(arg1, value);
ch->ChatPacket(CHAT_TYPE_INFO, "Quest flag set: %s %d", arg1, value);
}
}
ACMD(do_delqf)
{
char arg1[256];
char arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: delqf <flagname> [<character name>]");
return;
}
LPCHARACTER tch = ch;
if (*arg2)
tch = CHARACTER_MANAGER::instance().FindPC(arg2);
if (!tch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "There is no such character.");
return;
}
quest::PC* pPC = quest::CQuestManager::instance().GetPC(tch->GetPlayerID());
if (pPC)
{
if (pPC->DeleteFlag(arg1))
ch->ChatPacket(CHAT_TYPE_INFO, "Delete success.");
else
ch->ChatPacket(CHAT_TYPE_INFO, "Delete failed. Quest flag does not exist.");
}
}
ACMD(do_forgetme)
{
ch->ForgetMyAttacker();
}
ACMD(do_aggregate)
{
ch->AggregateMonster();
}
ACMD(do_attract_ranger)
{
ch->AttractRanger();
}
ACMD(do_pull_monster)
{
ch->PullMonster();
}
ACMD(do_polymorph)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (*arg1)
{
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
bool bMaintainStat = false;
if (*arg2)
{
int value = 0;
str_to_number(value, arg2);
bMaintainStat = (value>0);
}
ch->SetPolymorph(dwVnum, bMaintainStat);
}
}
ACMD(do_polymorph_item)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (*arg1)
{
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
LPITEM item = ITEM_MANAGER::instance().CreateItem(70104, 1, 0, true);
if (item)
{
item->SetSocket(0, dwVnum);
int iEmptyPos = ch->GetEmptyInventory(item->GetSize());
if (iEmptyPos != -1)
{
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
LogManager::instance().ItemLog(ch, item, "GM", item->GetName());
}
else
{
M2_DESTROY_ITEM(item);
ch->ChatPacket(CHAT_TYPE_INFO, "Not enough inventory space.");
}
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "#%d item not exist by that vnum.", 70103);
}
//ch->SetPolymorph(dwVnum, bMaintainStat);
}
}
ACMD(do_priv_empire)
{
char arg1[256] = {0};
char arg2[256] = {0};
char arg3[256] = {0};
char arg4[256] = {0};
int empire = 0;
int type = 0;
int value = 0;
int duration = 0;
const char* line = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
goto USAGE;
if (!line)
goto USAGE;
two_arguments(line, arg3, sizeof(arg3), arg4, sizeof(arg4));
if (!*arg3 || !*arg4)
goto USAGE;
str_to_number(empire, arg1);
str_to_number(type, arg2);
str_to_number(value, arg3);
value = MINMAX(0, value, 1000);
str_to_number(duration, arg4);
if (empire < 0 || 3 < empire)
goto USAGE;
if (type < 1 || 4 < type)
goto USAGE;
if (value < 0)
goto USAGE;
if (duration < 0)
goto USAGE;
// <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
duration = duration * (60*60);
sys_log(0, "_give_empire_privileage(empire=%d, type=%d, value=%d, duration=%d) by command",
empire, type, value, duration);
CPrivManager::instance().RequestGiveEmpirePriv(empire, type, value, duration);
return;
USAGE:
ch->ChatPacket(CHAT_TYPE_INFO, "usage : priv_empire <empire> <type> <value> <duration>");
ch->ChatPacket(CHAT_TYPE_INFO, " <empire> 0 - 3 (0==all)");
ch->ChatPacket(CHAT_TYPE_INFO, " <type> 1:item_drop, 2:gold_drop, 3:gold10_drop, 4:exp");
ch->ChatPacket(CHAT_TYPE_INFO, " <value> percent");
ch->ChatPacket(CHAT_TYPE_INFO, " <duration> hour");
}
/**
* @version 05/06/08 Bang2ni - <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.(<28><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20>ۼ<EFBFBD><DBBC>ȵ<EFBFBD>.)
* quest/priv_guild.quest <20><> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
ACMD(do_priv_guild)
{
static const char msg[] = { '\0' };
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (*arg1)
{
CGuild * g = CGuildManager::instance().FindGuildByName(arg1);
if (!g)
{
DWORD guild_id = 0;
str_to_number(guild_id, arg1);
g = CGuildManager::instance().FindGuild(guild_id);
}
if (!g)
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>׷<EFBFBD> <20≯<EFBFBD> <20>Ǵ<EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
else
{
char buf[1024+1];
snprintf(buf, sizeof(buf), msg, g->GetID());
using namespace quest;
PC * pc = CQuestManager::instance().GetPC(ch->GetPlayerID());
QuestState qs = CQuestManager::instance().OpenState("ADMIN_QUEST", QUEST_FISH_REFINE_STATE_INDEX);
luaL_loadbuffer(qs.co, buf, strlen(buf), "ADMIN_QUEST");
pc->SetQuest("ADMIN_QUEST", qs);
QuestState & rqs = *pc->GetRunningQuestState();
if (!CQuestManager::instance().RunState(rqs))
{
CQuestManager::instance().CloseState(rqs);
pc->EndRunning();
return;
}
}
}
}
ACMD(do_mount_test)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (*arg1)
{
DWORD vnum = 0;
str_to_number(vnum, arg1);
ch->MountVnum(vnum);
}
}
ACMD(do_observer)
{
ch->SetObserverMode(!ch->IsObserverMode());
}
ACMD(do_socket_item)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (*arg1)
{
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
int iSocketCount = 0;
str_to_number(iSocketCount, arg2);
if (!iSocketCount || iSocketCount >= ITEM_SOCKET_MAX_NUM)
iSocketCount = 3;
if (!dwVnum)
{
if (!ITEM_MANAGER::instance().GetVnum(arg1, dwVnum))
{
ch->ChatPacket(CHAT_TYPE_INFO, "#%d item not exist by that vnum.", dwVnum);
return;
}
}
LPITEM item = ch->AutoGiveItem(dwVnum);
if (item)
{
for (int i = 0; i < iSocketCount; ++i)
item->SetSocket(i, 1);
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "#%d cannot create item.", dwVnum);
}
}
}
ACMD(do_xmas)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int flag = 0;
if (*arg1)
str_to_number(flag, arg1);
switch (subcmd)
{
case SCMD_XMAS_SNOW:
quest::CQuestManager::instance().RequestSetEventFlag("xmas_snow", flag);
break;
case SCMD_XMAS_BOOM:
quest::CQuestManager::instance().RequestSetEventFlag("xmas_boom", flag);
break;
case SCMD_XMAS_SANTA:
quest::CQuestManager::instance().RequestSetEventFlag("xmas_santa", flag);
break;
}
}
// BLOCK_CHAT
ACMD(do_block_chat_list)
{
// GM<47><4D> <20>ƴϰų<CFB0> block_chat_privilege<67><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
if (!ch || (ch->GetGMLevel() < GM_HIGH_WIZARD && ch->GetQuestFlag("chat_privilege.block") <= 0))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>׷<EFBFBD> <20><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"));
return;
}
DBManager::instance().ReturnQuery(QID_BLOCK_CHAT_LIST, ch->GetPlayerID(), NULL,
"SELECT p.name, a.lDuration FROM affect%s as a, player%s as p WHERE a.bType = %d AND a.dwPID = p.id",
get_table_postfix(), get_table_postfix(), AFFECT_BLOCK_CHAT);
}
ACMD(do_vote_block_chat)
{
return;
char arg1[256];
argument = one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: vote_block_chat <name>");
return;
}
const char* name = arg1;
int lBlockDuration = 10;
sys_log(0, "vote_block_chat %s %d", name, lBlockDuration);
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(name);
if (!tch)
{
CCI * pkCCI = P2P_MANAGER::instance().Find(name);
if (pkCCI)
{
TPacketGGBlockChat p;
p.bHeader = HEADER_GG_BLOCK_CHAT;
strncpy(p.szName, name, sizeof(p.szName));
p.lBlockDuration = lBlockDuration;
P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGBlockChat));
}
else
{
TPacketBlockChat p;
strncpy(p.szName, name, sizeof(p.szName));
p.lDuration = lBlockDuration;
db_clientdesc->DBPacket(HEADER_GD_BLOCK_CHAT, ch ? ch->GetDesc()->GetHandle() : 0, &p, sizeof(p));
}
if (ch)
ch->ChatPacket(CHAT_TYPE_INFO, "Chat block requested.");
return;
}
if (tch && ch != tch)
tch->AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, lBlockDuration, 0, true);
}
ACMD(do_block_chat)
{
// GM<47><4D> <20>ƴϰų<CFB0> block_chat_privilege<67><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
if (ch && (ch->GetGMLevel() < GM_HIGH_WIZARD && ch->GetQuestFlag("chat_privilege.block") <= 0))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>׷<EFBFBD> <20><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"));
return;
}
char arg1[256];
argument = one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
if (ch)
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: block_chat <name> <time> (0 to off)");
return;
}
const char* name = arg1;
int lBlockDuration = parse_time_str(argument);
if (lBlockDuration < 0)
{
if (ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0>Դϴ<D4B4>. h, m, s<><73> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽʽÿ<CABD>.");
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD>) 10s, 10m, 1m 30s");
}
return;
}
sys_log(0, "BLOCK CHAT %s %d", name, lBlockDuration);
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(name);
if (!tch)
{
CCI * pkCCI = P2P_MANAGER::instance().Find(name);
if (pkCCI)
{
TPacketGGBlockChat p;
p.bHeader = HEADER_GG_BLOCK_CHAT;
strncpy(p.szName, name, sizeof(p.szName));
p.lBlockDuration = lBlockDuration;
P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGBlockChat));
}
else
{
TPacketBlockChat p;
strncpy(p.szName, name, sizeof(p.szName));
p.lDuration = lBlockDuration;
db_clientdesc->DBPacket(HEADER_GD_BLOCK_CHAT, ch ? ch->GetDesc()->GetHandle() : 0, &p, sizeof(p));
}
if (ch)
ch->ChatPacket(CHAT_TYPE_INFO, "Chat block requested.");
return;
}
if (tch && ch != tch)
tch->AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, lBlockDuration, 0, true);
}
// END_OF_BLOCK_CHAT
// BUILD_BUILDING
ACMD(do_build)
{
using namespace building;
char arg1[256], arg2[256], arg3[256], arg4[256];
const char * line = one_argument(argument, arg1, sizeof(arg1));
BYTE GMLevel = ch->GetGMLevel();
CLand * pkLand = CManager::instance().FindLand(ch->GetMapIndex(), ch->GetX(), ch->GetY());
// NOTE: <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (!pkLand)
{
sys_err("%s trying to build on not buildable area.", ch->GetName());
return;
}
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax: no command");
return;
}
// <20>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if (GMLevel == GM_PLAYER)
{
// <20>÷<EFBFBD><C3B7>̾ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if ((!ch->GetGuild() || ch->GetGuild()->GetID() != pkLand->GetOwner()))
{
sys_err("%s trying to build on not owned land.", ch->GetName());
return;
}
// <20><><EFBFBD><EFBFBD> <20><EFBFBD>ΰ<EFBFBD>?
if (ch->GetGuild()->GetMasterPID() != ch->GetPlayerID())
{
sys_err("%s trying to build while not the guild master.", ch->GetName());
return;
}
}
switch (LOWER(*arg1))
{
case 'c':
{
// /build c vnum x y x_rot y_rot z_rot
char arg5[256], arg6[256];
line = one_argument(two_arguments(line, arg1, sizeof(arg1), arg2, sizeof(arg2)), arg3, sizeof(arg3)); // vnum x y
one_argument(two_arguments(line, arg4, sizeof(arg4), arg5, sizeof(arg5)), arg6, sizeof(arg6)); // x_rot y_rot z_rot
if (!*arg1 || !*arg2 || !*arg3 || !*arg4 || !*arg5 || !*arg6)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax");
return;
}
DWORD dwVnum = 0;
str_to_number(dwVnum, arg1);
using namespace building;
const TObjectProto * t = CManager::instance().GetObjectProto(dwVnum);
if (!t)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>ǹ<EFBFBD><C7B9>Դϴ<D4B4>."));
return;
}
const DWORD BUILDING_MAX_PRICE = 100000000;
if (t->dwGroupVnum)
{
if (pkLand->FindObjectByGroup(t->dwGroupVnum))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>."));
return;
}
}
// <20>ǹ<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD> üũ (<28><> <20>ǹ<EFBFBD><C7B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>)
if (t->dwDependOnGroupVnum)
{
// const TObjectProto * dependent = CManager::instance().GetObjectProto(dwVnum);
// if (dependent)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ°<D6B4>?
if (!pkLand->FindObjectByGroup(t->dwDependOnGroupVnum))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ǹ<EFBFBD><C7B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>."));
return;
}
}
}
if (test_server || GMLevel == GM_PLAYER)
{
// GM<47><4D> <20>ƴҰ<C6B4><D2B0>츸 (<28>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GM<47><4D> <20>Ҹ<EFBFBD>)
// <20>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if (t->dwPrice > BUILDING_MAX_PRICE)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD> <20>Ǽ<EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>."));
return;
}
if (ch->GetGold() < (int)t->dwPrice)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
int i;
for (i = 0; i < OBJECT_MATERIAL_MAX_NUM; ++i)
{
DWORD dwItemVnum = t->kMaterials[i].dwItemVnum;
DWORD dwItemCount = t->kMaterials[i].dwCount;
if (dwItemVnum == 0)
break;
if ((int) dwItemCount > ch->CountSpecifyItem(dwItemVnum))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>Ǽ<EFBFBD><C7BC><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
}
}
float x_rot = atof(arg4);
float y_rot = atof(arg5);
float z_rot = atof(arg6);
// 20050811.myevan.<2E>ǹ<EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/*
if (x_rot != 0.0f || y_rot != 0.0f || z_rot != 0.0f)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<22>ǹ<EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>");
return;
}
*/
int map_x = 0;
str_to_number(map_x, arg2);
int map_y = 0;
str_to_number(map_y, arg3);
bool isSuccess = pkLand->RequestCreateObject(dwVnum,
ch->GetMapIndex(),
map_x,
map_y,
x_rot,
y_rot,
z_rot, true);
if (!isSuccess)
{
if (test_server)
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>ǹ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>Դϴ<D4B4>."));
return;
}
if (test_server || GMLevel == GM_PLAYER)
// <20>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>ϱ<EFBFBD> (<28>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GM<47><4D> <20>Ҹ<EFBFBD>)
{
// <20>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD>
ch->PointChange(POINT_GOLD, -t->dwPrice);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
{
int i;
for (i = 0; i < OBJECT_MATERIAL_MAX_NUM; ++i)
{
DWORD dwItemVnum = t->kMaterials[i].dwItemVnum;
DWORD dwItemCount = t->kMaterials[i].dwCount;
if (dwItemVnum == 0)
break;
sys_log(0, "BUILD: material %d %u %u", i, dwItemVnum, dwItemCount);
ch->RemoveSpecifyItem(dwItemVnum, dwItemCount);
}
}
}
}
break;
case 'd' :
// build (d)elete ObjectID
{
one_argument(line, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Invalid syntax");
return;
}
DWORD vid = 0;
str_to_number(vid, arg1);
pkLand->RequestDeleteObjectByVID(vid);
}
break;
// BUILD_WALL
// build w n/e/w/s
case 'w' :
if (GMLevel > GM_PLAYER)
{
int mapIndex = ch->GetMapIndex();
one_argument(line, arg1, sizeof(arg1));
sys_log(0, "guild.wall.build map[%d] direction[%s]", mapIndex, arg1);
switch (arg1[0])
{
case 's':
pkLand->RequestCreateWall(mapIndex, 0.0f);
break;
case 'n':
pkLand->RequestCreateWall(mapIndex, 180.0f);
break;
case 'e':
pkLand->RequestCreateWall(mapIndex, 90.0f);
break;
case 'w':
pkLand->RequestCreateWall(mapIndex, 270.0f);
break;
default:
ch->ChatPacket(CHAT_TYPE_INFO, "guild.wall.build unknown_direction[%s]", arg1);
sys_err("guild.wall.build unknown_direction[%s]", arg1);
break;
}
}
break;
case 'e':
if (GMLevel > GM_PLAYER)
{
pkLand->RequestDeleteWall();
}
break;
case 'W' :
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// build (w)all <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> <20><EFBFBD><EBB9AE> <20><EFBFBD><EBB9AE> <20><EFBFBD><EBB9AE> <20><EFBFBD><EBB9AE>
if (GMLevel > GM_PLAYER)
{
int setID = 0, wallSize = 0;
char arg5[256], arg6[256];
line = two_arguments(line, arg1, sizeof(arg1), arg2, sizeof(arg2));
line = two_arguments(line, arg3, sizeof(arg3), arg4, sizeof(arg4));
two_arguments(line, arg5, sizeof(arg5), arg6, sizeof(arg6));
str_to_number(setID, arg1);
str_to_number(wallSize, arg2);
if (setID != 14105 && setID != 14115 && setID != 14125)
{
sys_log(0, "BUILD_WALL: wrong wall set id %d", setID);
break;
}
else
{
bool door_east = false;
str_to_number(door_east, arg3);
bool door_west = false;
str_to_number(door_west, arg4);
bool door_south = false;
str_to_number(door_south, arg5);
bool door_north = false;
str_to_number(door_north, arg6);
pkLand->RequestCreateWallBlocks(setID, ch->GetMapIndex(), wallSize, door_east, door_west, door_south, door_north);
}
}
break;
case 'E' :
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// build (e)rase <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
if (GMLevel > GM_PLAYER)
{
one_argument(line, arg1, sizeof(arg1));
DWORD id = 0;
str_to_number(id, arg1);
pkLand->RequestDeleteWallBlocks(id);
}
break;
default:
ch->ChatPacket(CHAT_TYPE_INFO, "Invalid command %s", arg1);
break;
}
}
// END_OF_BUILD_BUILDING
ACMD(do_clear_quest)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
return;
quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(ch->GetPlayerID());
pPC->ClearQuest(arg1);
}
ACMD(do_horse_state)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Horse Information:");
ch->ChatPacket(CHAT_TYPE_INFO, " Level %d", ch->GetHorseLevel());
ch->ChatPacket(CHAT_TYPE_INFO, " Health %d/%d (%d%%)", ch->GetHorseHealth(), ch->GetHorseMaxHealth(), ch->GetHorseHealth() * 100 / ch->GetHorseMaxHealth());
ch->ChatPacket(CHAT_TYPE_INFO, " Stam %d/%d (%d%%)", ch->GetHorseStamina(), ch->GetHorseMaxStamina(), ch->GetHorseStamina() * 100 / ch->GetHorseMaxStamina());
}
ACMD(do_horse_level)
{
char arg1[256] = {0};
char arg2[256] = {0};
LPCHARACTER victim;
int level = 0;
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "usage : /horse_level <name> <level>");
return;
}
victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (NULL == victim)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>Դϴ<D4B4>."));
return;
}
str_to_number(level, arg2);
level = MINMAX(0, level, HORSE_MAX_LEVEL);
ch->ChatPacket(CHAT_TYPE_INFO, "horse level set (%s: %d)", victim->GetName(), level);
victim->SetHorseLevel(level);
victim->ComputePoints();
victim->SkillLevelPacket();
return;
/*-----
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int level = MINMAX(0, atoi(arg1), HORSE_MAX_LEVEL);
ch->ChatPacket(CHAT_TYPE_INFO, "horse level set to %d.", level);
ch->SetHorseLevel(level);
ch->ComputePoints();
ch->SkillLevelPacket();
return;
-----*/
}
ACMD(do_horse_ride)
{
if (ch->IsHorseRiding())
ch->StopRiding();
else
ch->StartRiding();
}
ACMD(do_horse_summon)
{
ch->HorseSummon(true, true);
}
ACMD(do_horse_unsummon)
{
ch->HorseSummon(false, true);
}
ACMD(do_horse_set_stat)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (*arg1 && *arg2)
{
int hp = 0;
str_to_number(hp, arg1);
int stam = 0;
str_to_number(stam, arg2);
ch->UpdateHorseHealth(hp - ch->GetHorseHealth());
ch->UpdateHorseStamina(stam - ch->GetHorseStamina());
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage : /horse_set_stat <hp> <stamina>");
}
}
ACMD(do_save_attribute_to_image) // command "/saveati" for alias
{
char szFileName[256];
char szMapIndex[256];
two_arguments(argument, szMapIndex, sizeof(szMapIndex), szFileName, sizeof(szFileName));
if (!*szMapIndex || !*szFileName)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /saveati <map_index> <filename>");
return;
}
int lMapIndex = 0;
str_to_number(lMapIndex, szMapIndex);
if (SECTREE_MANAGER::instance().SaveAttributeToImage(lMapIndex, szFileName))
ch->ChatPacket(CHAT_TYPE_INFO, "Save done.");
else
ch->ChatPacket(CHAT_TYPE_INFO, "Save failed.");
}
ACMD(do_affect_remove)
{
char arg1[256];
char arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /affect_remove <player name>");
ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: /affect_remove <type> <point>");
LPCHARACTER tch = ch;
if (*arg1)
if (!(tch = CHARACTER_MANAGER::instance().FindPC(arg1)))
tch = ch;
ch->ChatPacket(CHAT_TYPE_INFO, "-- Affect List of %s -------------------------------", tch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "Type Point Modif Duration Flag");
const std::list<CAffect *> & cont = tch->GetAffectContainer();
itertype(cont) it = cont.begin();
while (it != cont.end())
{
CAffect * pkAff = *it++;
ch->ChatPacket(CHAT_TYPE_INFO, "%4d %5d %5d %8d %u",
pkAff->dwType, pkAff->bApplyOn, pkAff->lApplyValue, pkAff->lDuration, pkAff->dwFlag);
}
return;
}
bool removed = false;
CAffect * af;
DWORD type = 0;
str_to_number(type, arg1);
BYTE point = 0;
str_to_number(point, arg2);
while ((af = ch->FindAffect(type, point)))
{
ch->RemoveAffect(af);
removed = true;
}
if (removed)
ch->ChatPacket(CHAT_TYPE_INFO, "Affect successfully removed.");
else
ch->ChatPacket(CHAT_TYPE_INFO, "Not affected by that type and point.");
}
ACMD(do_change_attr)
{
LPITEM weapon = ch->GetWear(WEAR_WEAPON);
if (weapon)
weapon->ChangeAttribute();
}
ACMD(do_add_attr)
{
LPITEM weapon = ch->GetWear(WEAR_WEAPON);
if (weapon)
weapon->AddAttribute();
}
ACMD(do_add_socket)
{
LPITEM weapon = ch->GetWear(WEAR_WEAPON);
if (weapon)
weapon->AddSocket();
}
ACMD(do_show_arena_list)
{
CArenaManager::instance().SendArenaMapListTo(ch);
}
ACMD(do_end_all_duel)
{
CArenaManager::instance().EndAllDuel();
}
ACMD(do_end_duel)
{
char szName[256];
one_argument(argument, szName, sizeof(szName));
LPCHARACTER pChar = CHARACTER_MANAGER::instance().FindPC(szName);
if (pChar == NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>Դϴ<D4B4>."));
return;
}
if (CArenaManager::instance().EndDuel(pChar->GetPlayerID()) == false)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"));
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"));
}
}
ACMD(do_duel)
{
char szName1[256];
char szName2[256];
char szSet[256];
char szMinute[256];
int set = 0;
int minute = 0;
argument = two_arguments(argument, szName1, sizeof(szName1), szName2, sizeof(szName2));
two_arguments(argument, szSet, sizeof(szSet), szMinute, sizeof(szMinute));
str_to_number(set, szSet);
if (set < 0) set = 1;
if (set > 5) set = 5;
if (!str_to_number(minute, szMinute))
{
// ij<><C4B3><EFBFBD>ٴ<EFBFBD> <20>⺻ 10<31><30>.
if (LC_IsCanada() == true)
{
minute = 10;
}
else
{
minute = 5;
}
}
if (minute < 5)
minute = 5;
LPCHARACTER pChar1 = CHARACTER_MANAGER::instance().FindPC(szName1);
LPCHARACTER pChar2 = CHARACTER_MANAGER::instance().FindPC(szName2);
if (pChar1 != NULL && pChar2 != NULL)
{
pChar1->RemoveGoodAffect();
pChar2->RemoveGoodAffect();
pChar1->RemoveBadAffect();
pChar2->RemoveBadAffect();
LPPARTY pParty = pChar1->GetParty();
if (pParty != NULL)
{
if (pParty->GetMemberCount() == 2)
{
CPartyManager::instance().DeleteParty(pParty);
}
else
{
pChar1->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<<3C><>Ƽ> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD>ϴ<EFBFBD>."));
pParty->Quit(pChar1->GetPlayerID());
}
}
pParty = pChar2->GetParty();
if (pParty != NULL)
{
if (pParty->GetMemberCount() == 2)
{
CPartyManager::instance().DeleteParty(pParty);
}
else
{
pChar2->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<<3C><>Ƽ> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD>ϴ<EFBFBD>."));
pParty->Quit(pChar2->GetPlayerID());
}
}
if (CArenaManager::instance().StartDuel(pChar1, pChar2, set, minute) == true)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>."));
}
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
}
}
ACMD(do_stat_plus_amount)
{
char szPoint[256];
one_argument(argument, szPoint, sizeof(szPoint));
if (*szPoint == '\0')
return;
if (ch->IsPolymorphed())
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>а<EFBFBD> <20>߿<EFBFBD><DFBF><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
int nRemainPoint = ch->GetPoint(POINT_STAT);
if (nRemainPoint <= 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
int nPoint = 0;
str_to_number(nPoint, szPoint);
if (nRemainPoint < nPoint)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
if (nPoint < 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20>Է<EFBFBD><D4B7>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
switch (subcmd)
{
case POINT_HT : // ü<><C3BC>
if (nPoint + ch->GetPoint(POINT_HT) > 90)
{
nPoint = 90 - ch->GetPoint(POINT_HT);
}
break;
case POINT_IQ : // <20><><EFBFBD><EFBFBD>
if (nPoint + ch->GetPoint(POINT_IQ) > 90)
{
nPoint = 90 - ch->GetPoint(POINT_IQ);
}
break;
case POINT_ST : // <20>ٷ<EFBFBD>
if (nPoint + ch->GetPoint(POINT_ST) > 90)
{
nPoint = 90 - ch->GetPoint(POINT_ST);
}
break;
case POINT_DX : // <20><>ø
if (nPoint + ch->GetPoint(POINT_DX) > 90)
{
nPoint = 90 - ch->GetPoint(POINT_DX);
}
break;
default :
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ尡 <20>߸<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
break;
}
if (nPoint != 0)
{
ch->SetRealPoint(subcmd, ch->GetRealPoint(subcmd) + nPoint);
ch->SetPoint(subcmd, ch->GetPoint(subcmd) + nPoint);
ch->ComputePoints();
ch->PointChange(subcmd, 0);
ch->PointChange(POINT_STAT, -nPoint);
ch->ComputePoints();
}
}
struct tTwoPID
{
int pid1;
int pid2;
};
ACMD(do_break_marriage)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
tTwoPID pids = { 0, 0 };
str_to_number(pids.pid1, arg1);
str_to_number(pids.pid2, arg2);
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> %d <20><> <20>÷<EFBFBD><C3B7>̾<EFBFBD> %d<><64> <20><>ȥ<EFBFBD><C8A5>ŵ<EFBFBD>ϴ<EFBFBD>.."), pids.pid1, pids.pid2);
db_clientdesc->DBPacket(HEADER_GD_BREAK_MARRIAGE, 0, &pids, sizeof(pids));
}
ACMD(do_effect)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
int effect_type = 0;
str_to_number(effect_type, arg1);
ch->EffectPacket(effect_type);
}
struct FCountInMap
{
int m_Count[4];
FCountInMap() { memset(m_Count, 0, sizeof(int) * 4); }
void operator()(LPENTITY ent)
{
if (ent->IsType(ENTITY_CHARACTER))
{
LPCHARACTER ch = (LPCHARACTER) ent;
if (ch && ch->IsPC())
++m_Count[ch->GetEmpire()];
}
}
int GetCount(BYTE bEmpire) { return m_Count[bEmpire]; }
};
ACMD(do_threeway_war_info)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"));
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> %d <20><><EFBFBD><EFBFBD> %d %d %d"), GetSungziMapIndex(), GetPassMapIndex(1), GetPassMapIndex(2), GetPassMapIndex(3));
ch->ChatPacket(CHAT_TYPE_INFO, "ThreewayPhase %d", CThreeWayWar::instance().GetRegenFlag());
for (int n = 1; n < 4; ++n)
{
LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(GetSungziMapIndex());
FCountInMap c;
if (pSecMap)
{
pSecMap->for_each(c);
}
ch->ChatPacket(CHAT_TYPE_INFO, "%s killscore %d usercount %d",
EMPIRE_NAME(n),
CThreeWayWar::instance().GetKillScore(n),
c.GetCount(n));
}
}
ACMD(do_threeway_war_myinfo)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
ch->ChatPacket(CHAT_TYPE_INFO, "Deadcount %d",
CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()));
}
ACMD(do_rmcandidacy)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: rmcandidacy <name>");
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!tch)
{
CCI * pkCCI = P2P_MANAGER::instance().Find(arg1);
if (pkCCI)
{
if (pkCCI->bChannel != g_bChannel)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Target is in %d channel (my channel %d)", pkCCI->bChannel, g_bChannel);
return;
}
}
}
db_clientdesc->DBPacket(HEADER_GD_RMCANDIDACY, 0, NULL, 32);
db_clientdesc->Packet(arg1, 32);
}
ACMD(do_setmonarch)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: setmonarch <name>");
return;
}
db_clientdesc->DBPacket(HEADER_GD_SETMONARCH, 0, NULL, 32);
db_clientdesc->Packet(arg1, 32);
}
ACMD(do_rmmonarch)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: rmmonarch <name>");
return;
}
db_clientdesc->DBPacket(HEADER_GD_RMMONARCH, 0, NULL, 32);
db_clientdesc->Packet(arg1, 32);
}
ACMD(do_check_monarch_money)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
return;
int empire = 0;
str_to_number(empire, arg1);
int NationMoney = CMonarch::instance().GetMoney(empire);
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d <20><>", NationMoney);
}
ACMD(do_reset_subskill)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: reset_subskill <name>");
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg1);
if (tch == NULL)
return;
tch->ClearSubSkill();
ch->ChatPacket(CHAT_TYPE_INFO, "Subskill of [%s] was reset", tch->GetName());
}
ACMD(do_siege)
{
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
int empire = strtol(arg1, NULL, 10);
int tower_count = strtol(arg2, NULL, 10);
if (empire == 0) empire = number(1, 3);
if (tower_count < 5 || tower_count > 10) tower_count = number(5, 10);
TPacketGGSiege packet;
packet.bHeader = HEADER_GG_SIEGE;
packet.bEmpire = empire;
packet.bTowerCount = tower_count;
P2P_MANAGER::instance().Send(&packet, sizeof(TPacketGGSiege));
switch (castle_siege(empire, tower_count))
{
case 0 :
ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE FAILED");
break;
case 1 :
ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE START Empire(%d) Tower(%d)", empire, tower_count);
break;
case 2 :
ch->ChatPacket(CHAT_TYPE_INFO, "SIEGE END");
break;
}
}
ACMD(do_temp)
{
if (false == test_server)
return;
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (0 == arg1[0] || 0 == arg2[0])
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire money");
return;
}
int empire = 0;
str_to_number(empire, arg1);
int money = 0;
str_to_number(money, arg2);
CMonarch::instance().SendtoDBAddMoney(money, empire, ch);
}
ACMD(do_frog)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (0 == arg1[0])
{
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire(1, 2, 3)");
return;
}
int empire = 0;
str_to_number(empire, arg1);
switch (empire)
{
case 1:
case 2:
case 3:
if (IS_CASTLE_MAP(ch->GetMapIndex()))
{
castle_spawn_frog(empire);
castle_save();
}
else
ch->ChatPacket(CHAT_TYPE_INFO, "You must spawn frog in castle");
break;
default:
ch->ChatPacket(CHAT_TYPE_INFO, "Usage: empire(1, 2, 3)");
break;
}
}
ACMD(do_flush)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (0 == arg1[0])
{
ch->ChatPacket(CHAT_TYPE_INFO, "usage : /flush player_id");
return;
}
DWORD pid = (DWORD) strtoul(arg1, NULL, 10);
db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
db_clientdesc->Packet(&pid, sizeof(DWORD));
}
ACMD(do_eclipse)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (strtol(arg1, NULL, 10) == 1)
{
quest::CQuestManager::instance().RequestSetEventFlag("eclipse", 1);
}
else
{
quest::CQuestManager::instance().RequestSetEventFlag("eclipse", 0);
}
}
ACMD(do_weeklyevent)
{
char arg1[256];
int empire = 0;
if (CBattleArena::instance().IsRunning() == false)
{
one_argument(argument, arg1, sizeof(arg1));
empire = strtol(arg1, NULL, 10);
if (empire == 1 || empire == 2 || empire == 3)
{
CBattleArena::instance().Start(empire);
}
else
{
CBattleArena::instance().Start(rand()%3 + 1);
}
ch->ChatPacket(CHAT_TYPE_INFO, "Weekly Event Start");
}
else
{
CBattleArena::instance().ForceEnd();
ch->ChatPacket(CHAT_TYPE_INFO, "Weekly Event End");
}
}
ACMD(do_event_helper)
{
char arg1[256];
int mode = 0;
one_argument(argument, arg1, sizeof(arg1));
str_to_number(mode, arg1);
if (mode == 1)
{
xmas::SpawnEventHelper(true);
ch->ChatPacket(CHAT_TYPE_INFO, "Event Helper Spawn");
}
else
{
xmas::SpawnEventHelper(false);
ch->ChatPacket(CHAT_TYPE_INFO, "Event Helper Delete");
}
}
struct FMobCounter
{
int nCount;
void operator () (LPENTITY ent)
{
if (ent->IsType(ENTITY_CHARACTER))
{
LPCHARACTER pChar = static_cast<LPCHARACTER>(ent);
if (pChar->IsMonster() == true || pChar->IsStone())
{
nCount++;
}
}
}
};
ACMD(do_get_mob_count)
{
LPSECTREE_MAP pSectree = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
if (pSectree == NULL)
return;
FMobCounter f;
f.nCount = 0;
pSectree->for_each(f);
ch->ChatPacket(CHAT_TYPE_INFO, "MapIndex: %d MobCount %d", ch->GetMapIndex(), f.nCount);
}
ACMD(do_clear_land)
{
const building::CLand* pLand = building::CManager::instance().FindLand(ch->GetMapIndex(), ch->GetX(), ch->GetY());
if( NULL == pLand )
{
return;
}
ch->ChatPacket(CHAT_TYPE_INFO, "Guild Land(%d) Cleared", pLand->GetID());
building::CManager::instance().ClearLand(pLand->GetID());
}
ACMD(do_special_item)
{
ITEM_MANAGER::instance().ConvSpecialDropItemFile();
}
ACMD(do_set_stat)
{
char szName [256];
char szChangeAmount[256];
two_arguments (argument, szName, sizeof (szName), szChangeAmount, sizeof(szChangeAmount));
if (*szName == '\0' || *szChangeAmount == '\0')
{
ch->ChatPacket (CHAT_TYPE_INFO, "Invalid argument.");
return;
}
LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(szName);
if (!tch)
{
CCI * pkCCI = P2P_MANAGER::instance().Find(szName);
if (pkCCI)
{
ch->ChatPacket (CHAT_TYPE_INFO, "Cannot find player(%s). %s is not in your game server.", szName, szName);
return;
}
else
{
ch->ChatPacket (CHAT_TYPE_INFO, "Cannot find player(%s). Perhaps %s doesn't login or exist.", szName, szName);
return;
}
}
else
{
if (tch->IsPolymorphed())
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD>а<EFBFBD> <20>߿<EFBFBD><DFBF><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
if (subcmd != POINT_HT && subcmd != POINT_IQ && subcmd != POINT_ST && subcmd != POINT_DX)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ尡 <20>߸<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
int nRemainPoint = tch->GetPoint(POINT_STAT);
int nCurPoint = tch->GetRealPoint(subcmd);
int nChangeAmount = 0;
str_to_number(nChangeAmount, szChangeAmount);
int nPoint = nCurPoint + nChangeAmount;
int n;
switch (subcmd)
{
case POINT_HT:
if (nPoint < JobInitialPoints[tch->GetJob()].ht)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
return;
}
n = 0;
break;
case POINT_IQ:
if (nPoint < JobInitialPoints[tch->GetJob()].iq)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
return;
}
n = 1;
break;
case POINT_ST:
if (nPoint < JobInitialPoints[tch->GetJob()].st)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
return;
}
n = 2;
break;
case POINT_DX:
if (nPoint < JobInitialPoints[tch->GetJob()].dx)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat."));
return;
}
n = 3;
break;
}
if (nPoint > 90)
{
nChangeAmount -= nPoint - 90;
nPoint = 90;
}
if (nRemainPoint < nChangeAmount)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
return;
}
tch->SetRealPoint(subcmd, nPoint);
tch->SetPoint(subcmd, tch->GetPoint(subcmd) + nChangeAmount);
tch->ComputePoints();
tch->PointChange(subcmd, 0);
tch->PointChange(POINT_STAT, -nChangeAmount);
tch->ComputePoints();
const char* stat_name[4] = {"con", "int", "str", "dex"};
ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s change %d to %d", szName, stat_name[n], nCurPoint, nPoint);
}
}
ACMD(do_get_item_id_list)
{
for (int i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; i++)
{
LPITEM item = ch->GetInventoryItem(i);
if (item != NULL)
ch->ChatPacket(CHAT_TYPE_INFO, "cell : %d, name : %s, id : %d", item->GetCell(), item->GetName(), item->GetID());
}
}
ACMD(do_set_socket)
{
char arg1 [256];
char arg2 [256];
char arg3 [256];
one_argument (two_arguments (argument, arg1, sizeof (arg1), arg2, sizeof(arg2)), arg3, sizeof (arg3));
int item_id, socket_num, value;
if (!str_to_number (item_id, arg1) || !str_to_number (socket_num, arg2) || !str_to_number (value, arg3))
return;
LPITEM item = ITEM_MANAGER::instance().Find (item_id);
if (item)
item->SetSocket (socket_num, value);
}
ACMD (do_can_dead)
{
if (subcmd)
ch->SetArmada();
else
ch->ResetArmada();
}
ACMD (do_full_set)
{
extern void do_all_skill_master(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
do_all_skill_master(ch, NULL, 0, 0);
extern void do_item_full_set(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
do_item_full_set(ch, NULL, 0, 0);
extern void do_attr_full_set(LPCHARACTER ch, const char *argument, int cmd, int subcmd);
do_attr_full_set(ch, NULL, 0, 0);
}
ACMD (do_all_skill_master)
{
ch->SetHorseLevel(SKILL_MAX_LEVEL);
for (int i = 0; i < SKILL_MAX_NUM; i++)
{
if (true == ch->CanUseSkill(i))
{
ch->SetSkillLevel(i, SKILL_MAX_LEVEL);
}
else
{
switch(i)
{
case SKILL_HORSE_WILDATTACK:
case SKILL_HORSE_CHARGE:
case SKILL_HORSE_ESCAPE:
case SKILL_HORSE_WILDATTACK_RANGE:
ch->SetSkillLevel(i, SKILL_MAX_LEVEL);
break;
}
}
}
ch->ComputePoints();
ch->SkillLevelPacket();
}
ACMD (do_item_full_set)
{
BYTE job = ch->GetJob();
LPITEM item;
for (int i = 0; i < 6; i++)
{
item = ch->GetWear(i);
if (item != NULL)
ch->UnequipItem(item);
}
item = ch->GetWear(WEAR_SHIELD);
if (item != NULL)
ch->UnequipItem(item);
switch (job)
{
case JOB_SURA:
{
item = ITEM_MANAGER::instance().CreateItem(11699);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(13049);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(15189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(12529 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(14109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(17209 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(16209 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
}
break;
case JOB_WARRIOR:
{
item = ITEM_MANAGER::instance().CreateItem(11299);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(13049);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(15189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(3159 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(12249 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(14109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(17109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(16109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
}
break;
case JOB_SHAMAN:
{
item = ITEM_MANAGER::instance().CreateItem(11899);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(13049);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(15189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(7159 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(12669 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(14109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(17209 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(16209 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
}
break;
case JOB_ASSASSIN:
{
item = ITEM_MANAGER::instance().CreateItem(11499);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(13049);
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(15189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(1139 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(12389 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(14109 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(17189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
item = ITEM_MANAGER::instance().CreateItem(16189 );
if (!item || !item->EquipTo(ch, item->FindEquipCell(ch)))
M2_DESTROY_ITEM(item);
}
break;
}
}
ACMD (do_attr_full_set)
{
BYTE job = ch->GetJob();
LPITEM item;
switch (job)
{
case JOB_WARRIOR:
case JOB_ASSASSIN:
case JOB_SURA:
case JOB_SHAMAN:
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20>̰͸<CCB0> <20><><EFBFBD><EFBFBD> <20>־ <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>̷<EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>.
item = ch->GetWear(WEAR_HEAD);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_ATT_SPEED, 8);
item->SetForceAttribute( 1, APPLY_HP_REGEN, 30);
item->SetForceAttribute( 2, APPLY_SP_REGEN, 30);
item->SetForceAttribute( 3, APPLY_DODGE, 15);
item->SetForceAttribute( 4, APPLY_STEAL_SP, 10);
}
item = ch->GetWear(WEAR_WEAPON);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_CAST_SPEED, 20);
item->SetForceAttribute( 1, APPLY_CRITICAL_PCT, 10);
item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
item->SetForceAttribute( 4, APPLY_STR, 12);
}
item = ch->GetWear(WEAR_SHIELD);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_CON, 12);
item->SetForceAttribute( 1, APPLY_BLOCK, 15);
item->SetForceAttribute( 2, APPLY_REFLECT_MELEE, 10);
item->SetForceAttribute( 3, APPLY_IMMUNE_STUN, 1);
item->SetForceAttribute( 4, APPLY_IMMUNE_SLOW, 1);
}
item = ch->GetWear(WEAR_BODY);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
item->SetForceAttribute( 1, APPLY_CAST_SPEED, 20);
item->SetForceAttribute( 2, APPLY_STEAL_HP, 10);
item->SetForceAttribute( 3, APPLY_REFLECT_MELEE, 10);
item->SetForceAttribute( 4, APPLY_ATT_GRADE_BONUS, 50);
}
item = ch->GetWear(WEAR_FOOTS);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
item->SetForceAttribute( 2, APPLY_MOV_SPEED, 8);
item->SetForceAttribute( 3, APPLY_ATT_SPEED, 8);
item->SetForceAttribute( 4, APPLY_CRITICAL_PCT, 10);
}
item = ch->GetWear(WEAR_WRIST);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
item->SetForceAttribute( 2, APPLY_PENETRATE_PCT, 10);
item->SetForceAttribute( 3, APPLY_STEAL_HP, 10);
item->SetForceAttribute( 4, APPLY_MANA_BURN_PCT, 10);
}
item = ch->GetWear(WEAR_NECK);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_MAX_HP, 2000);
item->SetForceAttribute( 1, APPLY_MAX_SP, 80);
item->SetForceAttribute( 2, APPLY_CRITICAL_PCT, 10);
item->SetForceAttribute( 3, APPLY_PENETRATE_PCT, 10);
item->SetForceAttribute( 4, APPLY_STEAL_SP, 10);
}
item = ch->GetWear(WEAR_EAR);
if (item != NULL)
{
item->ClearAttribute();
item->SetForceAttribute( 0, APPLY_MOV_SPEED, 20);
item->SetForceAttribute( 1, APPLY_MANA_BURN_PCT, 10);
item->SetForceAttribute( 2, APPLY_POISON_REDUCE, 5);
item->SetForceAttribute( 3, APPLY_ATTBONUS_DEVIL, 20);
item->SetForceAttribute( 4, APPLY_ATTBONUS_UNDEAD, 20);
}
}
break;
}
}
ACMD (do_use_item)
{
char arg1 [256];
one_argument (argument, arg1, sizeof (arg1));
int cell;
str_to_number(cell, arg1);
LPITEM item = ch->GetInventoryItem(cell);
if (item)
{
ch->UseItem(TItemPos (INVENTORY, cell));
}
else
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.");
}
}
ACMD (do_clear_affect)
{
ch->ClearAffect(true);
}
ACMD (do_dragon_soul)
{
char arg1[512];
const char* rest = one_argument (argument, arg1, sizeof(arg1));
switch (arg1[0])
{
case 'a':
{
one_argument (rest, arg1, sizeof(arg1));
int deck_idx;
if (str_to_number(deck_idx, arg1) == false)
{
return;
}
ch->DragonSoul_ActivateDeck(deck_idx);
}
break;
case 'd':
{
ch->DragonSoul_DeactivateAll();
}
break;
}
}
ACMD (do_ds_list)
{
for (int i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; i++)
{
TItemPos cell(DRAGON_SOUL_INVENTORY, i);
LPITEM item = ch->GetItem(cell);
if (item != NULL)
ch->ChatPacket(CHAT_TYPE_INFO, "cell : %d, name : %s, id : %d", item->GetCell(), item->GetName(), item->GetID());
}
}