Files
ROSS/Src/World Server/gmcmds.cpp
T
2025-08-11 11:09:09 -05:00

3878 lines
139 KiB
C++

/*
Rose Online Server Emulator
Copyright (C) 2006,2007 OSRose Team http://www.osrose.net
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
depeloped with Main erose/hrose source server + some change from the original eich source
*/
#include "worldserver.h"
// Parse our commands to their appropriate function
bool CWorldServer::pakGMCommand( CPlayer* thisclient, CPacket* P )
{
char* tmp;
char* command = strtok( (char*)&(*P).Buffer[1] , " ");
if (command==NULL) return true;
//non GM functions
if (strcmp(command, "b")==0)
{
if(Config.Command_Broadcast > thisclient->Session->accesslevel)
return true;
time_t seconds;
seconds = time (NULL);
if((thisclient->CharInfo->LastGlobal+Config.Command_GlobalTime) <= seconds || thisclient->Session->accesslevel > 100)
{
thisclient->CharInfo->LastGlobal = time (NULL);
char outputmsg[200];
sprintf( outputmsg, "%s %s", Config.Command_GlobalPrefix, &P->Buffer[3] );
Log( MSG_INFO, "%s> %s %s", thisclient->CharInfo->charname, Config.Command_GlobalPrefix, &P->Buffer[3]);
SendGlobalMSG(thisclient, outputmsg);
}
else
{
long int remaining = (Config.Command_GlobalTime-(seconds-thisclient->CharInfo->LastGlobal));
char buffer2[200];
sprintf ( buffer2, "Please wait %i seconds before sending another global message.", remaining );
SendPM(thisclient, buffer2);
}
return true;
}
// all commands beyond here require IsGM or IsDev to be active in the character record
if (thisclient->CharInfo->IsGM == 0)
{
SendPM(thisclient, "Sorry. you do not have GM priveleges with this character");
return true;
}
//SendPM(thisclient, "Well it looks like you do have GM or DEV priveleges with this character");
if (strcmp(command, "here")==0)
{
if(Config.Command_Here > thisclient->Session->accesslevel)
return true;
return pakGMTele(thisclient, thisclient->Position->Map, thisclient->Position->current.x, thisclient->Position->current.y);
}
else if (strcmp(command, "tele")==0) // **** TELEPORT TO MAX AND X Y POINTS *****
{
if(Config.Command_Tele > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned map=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; float x=(float)atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; float y=(float)atoi(tmp);
Log( MSG_GMACTION, " %s : /tele %i,%i,%i" , thisclient->CharInfo->charname, map, x, y);
return pakGMTele(thisclient, map, x, y);
}
else if (strcmp(command, "usebuff")==0) // apply a status effect. icon plus visual
{
//SendPM(thisclient, "effect used");
//if(thisclient->Session->accesslevel < 300)
//return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
unsigned effect = atoi(tmp);
SendPM(thisclient, "Effect called for skill effect %i",effect);
return pakGMEffect(thisclient, effect);
}
else if (strcmp(command, "mute")==0) //==== Mute a player ==== [by Paul_T]
{
//SendPM(thisclient, "trying to use mute");
if(Config.Command_Mute > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
char* id=tmp;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
int min=atoi(tmp);
Log( MSG_GMACTION, " %s : /mute %s %i" , thisclient->CharInfo->charname, id, min);
return pakGMMute(thisclient, id, min);
}
else if (strcmp(command, "configreset")==0) // *** REALOAD DATA FILES ******
{
//SendPM(thisclient, "trying to use configreset");
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
char* action;
if ((tmp = strtok(NULL, " ")) == NULL)return true; action = tmp;
if(strcmp(action, "maxlevel")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.MaxLevel = newval;
const char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET maxlevel=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "xprate")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.EXP_RATE = newval;
const char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET exp_rate=%i WHERE conf='%s'",newval,confname);
}
}
else if(strcmp(action, "cmd")==0)
{
LoadConfigurations( "commands.ini" );
}
else
{
Log( MSG_INFO, "Unrecognized configreset command by GM %s" , thisclient->CharInfo->charname);
SendPM(thisclient, "/reload %s is not a valid command", tmp);
return true;
}
Log( MSG_GMACTION, " %s : /configreset %s" , thisclient->CharInfo->charname, action);
SendPM(thisclient, "%s data has been reloaded", action);
return true;
}
else if (strcmp(command,"readobjvar")==0)
{
//SendPM(thisclient, "trying to use readobjvar");
if(thisclient->Session->accesslevel < 300 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
int objVar = atoi(tmp);
if (objVar > 1999)return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
int thisIndex = atoi(tmp);
if (thisIndex > 19)return true;
int thisValue = GServer->ObjVar[objVar][thisIndex];
SendPM(thisclient, "Global Object Variable [%i][%i] current value is %i" , objVar,thisIndex,thisValue);
}
else if (strcmp(command,"setobjvar")==0)
{
//SendPM(thisclient, "trying to use setobjvar");
if(thisclient->Session->accesslevel < 300 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
int objVar = atoi(tmp);
if (objVar > 1999)return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
int thisIndex = atoi(tmp);
if (thisIndex > 19)return true;
if ((tmp = strtok(NULL, " ")) == NULL)
return true;
int thisValue = atoi(tmp);
SendPM(thisclient, "Global Object Variable [%i][%i] set to value %i" , objVar,thisIndex,thisValue);
GServer->ObjVar[objVar][thisIndex] = thisValue;
}
/*else if (strcmp(command, "configreset")==0) // *** REALOAD DATA FILES ******
{
if(thisclient->Session->accesslevel < 900)
return true;
char* action;
char* buffer;
if ((tmp = strtok(NULL, " ")) == NULL)return true; action = tmp;
if(strcmp(action, "maxlevel")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.MaxLevel = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET maxlevel=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "xprate")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.EXP_RATE = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET exp_rate=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "droprate")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.DROP_RATE = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET drop_rate=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "droptype")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.DROP_TYPE = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET drop_type=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "zulyrate")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.ZULY_RATE = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET zuly_rate=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "savetime")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.SAVETIME = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET savetime=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "partygap")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.PARTYGAP = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET partygap=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "maxstat")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.MAXSTAT = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET maxstat=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "playerdmg")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.PLAYERDMG = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET player_damage=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "monsterdmg")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.MONSTERDMG = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET monster_damage=%i WHERE conf='%s'",newval,confname);
}
}
if(strcmp(action, "cfmode")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT newval = atoi(tmp);
{
Config.CFMODE = newval;
char* confname = "default";
GServer->DB->QExecute("UPDATE list_config SET cfmode=%i WHERE conf='%s'",newval,confname);
}
}
else if(strcmp(action, "cmd")==0)
{
LoadConfigurations( "commands.ini" );
}
else
{
Log( MSG_INFO, "Unrecognized configreset command by GM %s" , thisclient->CharInfo->charname);
sprintf ( buffer, "/reload %s is not a valid command", tmp );
SendPM(thisclient, buffer);
return true;
}
Log( MSG_GMACTION, " %s : /configreset %s" , thisclient->CharInfo->charname, action);
sprintf ( buffer, "%s data has been reloaded", action );
SendPM(thisclient, buffer);
return true;
}*/
else if (strcmp(command, "save")==0) // *** SAVE USER DATA *****
{
if(Config.Command_Save > thisclient->Session->accesslevel)
return true;
thisclient->savedata();
SendPM(thisclient, "Character data saved");
return true;
}
else if (strcmp(command, "savequest")==0) // *** SAVE USER DATA *****
{
if(Config.Command_Save > thisclient->Session->accesslevel)
return true;
thisclient->savequests(thisclient);
SendPM(thisclient, "Character Quest data saved");
return true;
}
else if (strcmp(command, "aiwatch")==0) // set a skill for mobs to use. testing
{
//SendPM(thisclient, "trying to use aiwatch");
if(thisclient->Session->accesslevel < 300 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
UINT newval = atoi(tmp);
Config.AIWatch = newval;
SendPM(thisclient, "AI script watching set to %i",newval);
}
else if (strcmp(command, "reload")==0) // *** REALOAD DATA FILES ******
{
//SendPM(thisclient, "trying to use reload");
if(Config.Command_Reload > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0 )
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
if(strcmp(tmp, "config")==0)
{
LoadConfigurations( (const char*)filename.c_str() );
GServer->LoadConfig( );
}
else if(strcmp(tmp, "mobs")==0)
GServer->LoadNPCData( );
else if(strcmp(tmp, "drops")==0)
//GServer->LoadPYDropsData( );
GServer->LoadNewDrops( );
else if(strcmp(tmp, "cmd")==0)
LoadConfigurations( "commands.ini" );
else if(strcmp(tmp, "spawns")==0)
{
GServer->LoadMonsterSpawn();
}
else if(strcmp(tmp, "tdef")==0)
LoadWayPoints( );
//else if(strcmp(tmp, "equip")==0)
//{
// GServer->LoadEquip();
//}
else
{
Log( MSG_INFO, "Unrecognized reload command by GM %s" , thisclient->CharInfo->charname);
SendPM(thisclient, "/reload %s is not a valid command", tmp);
return true;
}
Log( MSG_GMACTION, " %s : /reload %s" , thisclient->CharInfo->charname, tmp);
SendPM(thisclient, "%s data has been reloaded", tmp);
return true;
}
else if(strcmp(command, "setspeedmod")==0)
{
if((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned mSpeedModif = atoi(tmp);
Log( MSG_GMACTION, " mSpeedModif changed to %i by %s" , mSpeedModif, thisclient->CharInfo->charname);
return pakGMChangeMSpeedModif(thisclient, mSpeedModif);
}
else if(strcmp(command, "mystat")==0)
{
//SendPM(thisclient, "trying to use mystat");
if ((tmp = strtok(NULL, " "))==NULL)return true;
if(strcmp(tmp, "ap")==0)
{
char buffer2[200];
sprintf ( buffer2, "My Attack Power is %i", thisclient->Stats->Attack_Power );
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "acc")==0)
{
char buffer2[200];
sprintf ( buffer2, "My Accuracy is %i", thisclient->Stats->Accury );
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "hp")==0)
{
char buffer2[200];
sprintf ( buffer2, "My current HP is %i", thisclient->Stats->HP );
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "mp")==0)
{
char buffer2[200];
sprintf ( buffer2, "My current MP is %i", thisclient->Stats->MP );
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "maxhp")==0)
{
char buffer2[200];
sprintf ( buffer2, "My Maximum HP is %i", thisclient->GetMaxHP());
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "maxmp")==0)
{
char buffer2[200];
sprintf ( buffer2, "My maximum MP is %i", thisclient->GetMaxMP());
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "dodge")==0)
{
char buffer2[200];
sprintf ( buffer2, "My dodge is %i", thisclient->Stats->Dodge);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "def")==0)
{
char buffer2[200];
sprintf ( buffer2, "My defense is %i", thisclient->Stats->Defense);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "mdef")==0)
{
char buffer2[200];
sprintf ( buffer2, "My Magic defense is %i", thisclient->Stats->Magic_Defense);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "crit")==0)
{
char buffer2[200];
sprintf ( buffer2, "My critical is %i", thisclient->Stats->Critical);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "mspd")==0)
{
char buffer2[200];
sprintf ( buffer2, "My move speed is %i", thisclient->Stats->Move_Speed);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "aspd")==0)
{
char buffer2[200];
sprintf ( buffer2, "My attack speed is %i", thisclient->Stats->Attack_Speed);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "xprate")==0)
{
char buffer2[200];
sprintf ( buffer2, "My xp rate is %i", thisclient->Stats->xprate);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "stamina")==0)
{
char buffer2[200];
sprintf ( buffer2, "My Stamina is %i", thisclient->CharInfo->stamina);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "weight")==0)
{
int weight = thisclient->GetCurrentWeight();
int maxweight = thisclient->GetMaxWeight();
char buffer2[200];
sprintf ( buffer2, "My current weight is %i. max weight = %i", weight,maxweight);
SendPM(thisclient, buffer2);
}
else if(strcmp(tmp, "zulydrop")==0)
{
SendPM(thisclient, "My zuly drop rate is %i", thisclient->Stats->zulydroprate);
}
else if(strcmp(tmp, "itemdrop")==0)
{
SendPM(thisclient, "My item drop rate is %i", thisclient->Stats->itemdroprate);
}
else if(strcmp(tmp, "serverdrop")==0)
{
SendPM(thisclient, "Server item drop rate is %i", GServer->Config.DROP_RATE);
}
else if(strcmp(tmp, "clan")==0)
{
SendPM(thisclient, "My clan id is: %i My clan rank is: %i", thisclient->Clan->clanid, thisclient->Clan->clanrank);
}
else if(strcmp(tmp, "map")==0)
{
SendPM(thisclient, "My current is: %i ", thisclient->Position->Map);
}
else if(strcmp(tmp, "job")==0)
{
SendPM(thisclient, "My class id is: %i ", thisclient->CharInfo->Job);
}
}
else if (strcmp(command, "ann")==0) // *** SEND A ANNUNCEMENT ***
{
if(Config.Command_Ann > thisclient->Session->accesslevel)
return true;
Log( MSG_GMACTION, " %s : /ann %s" , thisclient->CharInfo->charname, &P->Buffer[5] );
return pakGMAnn(thisclient, P);
}
else if(strcmp(command, "bodysize")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT size=atoi(tmp);
BEGINPACKET(pak, 0x721);
ADDWORD(pak, 36);
ADDWORD(pak, size);
ADDWORD(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x0730);
ADDWORD(pak, 5);
ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x40b3);
thisclient->client->SendPacket(&pak);
SendSysMsg(thisclient, "Body size changed!");
}
else if(strcmp(command, "headsize")==0)
{
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT size=atoi(tmp);
BEGINPACKET(pak, 0x721);
ADDWORD(pak, 35);
ADDWORD(pak, size);
ADDWORD(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x0730);
ADDWORD(pak, 5);
ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x40b3);
thisclient->client->SendPacket(&pak);
SendSysMsg(thisclient, "Head size changed!");
}
else if(strcmp(command, "face") == 0)
{
if(Config.Command_Face > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT face = atoi(tmp);
if (face > 15) return true;
UINT style;
if ((tmp = strtok(NULL, " ")) == NULL) style = 0; else style = atoi(tmp);
if (style > 3) style = 3;
thisclient->CharInfo->Face = ((face*7) + style + 1);
BEGINPACKET(pak, 0x721);
ADDWORD(pak, 8);
ADDWORD(pak, thisclient->CharInfo->Face);
ADDWORD(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x0730);
ADDWORD(pak, 5);
ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x40b3);
thisclient->client->SendPacket(&pak);
SendPM(thisclient, "Face changed!");
DB->QExecute("UPDATE characters SET face = %i WHERE id = %i", thisclient->CharInfo->Face, thisclient->CharInfo->charid);
}
else if(strcmp(command, "hair")==0)
{
if(Config.Command_Hair > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true; UINT hair = atoi(tmp);
if (hair > 6) return true;
thisclient->CharInfo->Hair = (hair*5);
BEGINPACKET(pak, 0x721);
ADDWORD(pak, 9);
ADDWORD(pak, thisclient->CharInfo->Hair);
ADDWORD(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x0730);
ADDWORD(pak, 5);
ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x40b3);
thisclient->client->SendPacket(&pak);
DB->QExecute("UPDATE characters SET hairStyle=%i WHERE id=%i", thisclient->CharInfo->Hair, thisclient->CharInfo->charid);
SendPM(thisclient, "Hair changed!");
}
else if(strcmp(command, "pvp")==0)
{
if(Config.Command_Pvp > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
CMap* map = MapList.Index[thisclient->Position->Map];
BEGINPACKET(pak, 0x721);
ADDWORD(pak, 34);
if(map->allowpvp!=0)
{
map->allowpvp = 0;
ADDWORD(pak, 2);
SendSysMsg(thisclient, "PVP off");
}
else
{
map->allowpvp = 1;
ADDWORD(pak, 51);
SendSysMsg(thisclient, "PVP on");
}
ADDWORD(pak, 0);
SendToMap(&pak, thisclient->Position->Map);
RESETPACKET(pak, 0x0730);
ADDWORD(pak, 5);
ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x40b3);
SendToMap(&pak, thisclient->Position->Map);
}
else if(strcmp(command, "who")==0)
{
if(Config.Command_Who > thisclient->Session->accesslevel)
return true;
int count = 1;
int gmcount = 0;
int playercount = 0;
char line0[200];
while(count <= (ClientList.size()-1))
{
CPlayer* whoclient = (CPlayer*)ClientList.at(count)->player;
if(whoclient != NULL)
{
if(whoclient->isInvisibleMode != true)
{
if(whoclient->Session->accesslevel > 100)
{
gmcount++;
}
else
{
playercount++;
}
}
count++;
}
}
sprintf(line0, "There are currently %i players and %i game moderators currently connected.", playercount, gmcount);
Log( MSG_GMACTION, " %s : /who" , thisclient->CharInfo->charname);
SendPM(thisclient, line0 );
return true;
}
else if (strcmp(command, "go")==0) // AtCommandGo
{
SendPM(thisclient,"Got to the go command");
if(Config.Command_Go > thisclient->Session->accesslevel)
return true;
SendPM(thisclient,"Got past the accesslevel check");
if ((tmp = strtok(NULL, " ")) == NULL) tmp = 0; int loc=atoi(tmp);
int x = 0;
int y = 0;
int map = 0;
if(loc == 1)
{
map = 22;
x = 5749;
y = 5101;
}
else if(loc == 2)
{
map = 1;
x = 5240;
y = 5192;
}
else if (loc == 3)
{
map = 2;
x = 5516;
y = 5236;
}
else if (loc == 4)
{
map = 51;
x = 5357;
y = 5013;
}
else if (loc == 5)
{
map = 6;
x = 5243;
y = 5240;
}
else if (loc == 6)
{
map = 24;
x = 5525;
y = 5376;
}
else if (loc == 7)
{
map = 31;
x = 5516;
y = 5437;
}
else if (loc == 8)
{
map = 28;
x = 5639;
y = 4761;
}
else
{
SendPM(thisclient, "Please input a number after the go command, below is a list of places and their appropriate number");
SendPM(thisclient, "1 = Adventurers plains");
SendPM(thisclient, "2 = The city of Zant");
SendPM(thisclient, "3 = Junon Polis");
SendPM(thisclient, "4 = The city of Eucar");
SendPM(thisclient, "5 = Training grounds");
SendPM(thisclient, "6 = El Verloon Desert");
SendPM(thisclient, "7 = Goblin Cave (B1)");
SendPM(thisclient, "8 = Gorge of Silence");
SendPM(thisclient, "Example; /go 3");
}
if( (x != 0) && (y != 0) && (map != 0) )
{
fPoint coord;
coord.x = x;
coord.y = y;
SendPM(thisclient, "teleport to map: %i",map);
MapList.Index[map]->TeleportPlayer( thisclient, coord, false );
Log( MSG_GMACTION, " %s : /go %i" , thisclient->CharInfo->charname, loc);
}
return true;
}
else if(strcmp(command, "p")==0) //*** READ THE PACKET.TXT AND SEND IT
{
if(Config.Command_Pak > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
char buffer;
std::string fname = "packet/packet";
fname += tmp;
fname += ".txt";
FILE *packet1 = fopen(fname.c_str(),"r");
if(packet1==NULL)
{
printf("Error opening packet.txt!\n");
return true;
}
unsigned int comm = 0;
fread( &comm, 1, 2, packet1 );
BEGINPACKET(pak,comm);
while((fscanf(packet1,"%c",&buffer))!=EOF)
ADDBYTE(pak,buffer);
thisclient->client->SendPacket( &pak );
fclose(packet1);
}
else if (strcmp(command, "mybuffs")==0)
{
if(thisclient->Session->accesslevel < 300)
return true;
for(int i=0;i<15;i++)
{
if(thisclient->MagicStatus[i].Buff != 0)
{
// don't do anything for now. Still working on this concept.
Log(MSG_GMACTION, "MyBuffs command called. Not yet functional");
}
}
}
else if (strcmp(command, "level")==0)
{
if(Config.Command_Level > thisclient->Session->accesslevel)
return true;
char* name;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned level=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) name = thisclient->CharInfo->charname; else name = tmp;
Log( MSG_GMACTION, " %s : /level %i %s" , thisclient->CharInfo->charname, level, name);
return pakGMLevel( thisclient, level, name );
}
else if (strcmp(command, "info")==0)
{
if(Config.Command_Info > thisclient->Session->accesslevel)
return true;
Log( MSG_GMACTION, " %s : /info" , thisclient->CharInfo->charname);
thisclient->GetPlayerInfo( );
return true;
}
else if (strcmp(command, "exp")==0)
{
if(Config.Command_Exp > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned exp=atoi(tmp);
char* name;
if ((tmp = strtok(NULL, " "))==NULL)
name = thisclient->CharInfo->charname;
else
name = tmp;
CPlayer* otherclient = GetClientByCharName( name );
if (otherclient == NULL)
return true;
otherclient->CharInfo->Exp += exp;
BEGINPACKET( pak, 0x79b );
ADDDWORD ( pak, otherclient->CharInfo->Exp );
ADDWORD ( pak, otherclient->CharInfo->stamina );
ADDWORD ( pak, 0 );
otherclient->client->SendPacket( &pak );
Log( MSG_GMACTION, " %s : /exp %i %s" , thisclient->CharInfo->charname, exp, name);
}
else if (strcmp(command, "tdmon") == 0)
{
if(Config.Command_Mon > thisclient->Session->accesslevel)
return true;
unsigned montype = 0;
unsigned moncount = 1;
unsigned monAI = 331; //TD Mob AI
if ((tmp = strtok(NULL, " "))==NULL) return true; montype = atoi(tmp);
if ((tmp = strtok(NULL, " "))!=NULL)moncount = atoi(tmp);
Log( MSG_GMACTION, " %s : spawned %i TD Mobs of type %i" , thisclient->CharInfo->charname, moncount, montype);
return pakGMMon( thisclient, montype, moncount, monAI );
}
else if (strcmp(command, "mon") == 0)
{
if(Config.Command_Mon > thisclient->Session->accesslevel)
return true;
unsigned montype = 0;
unsigned moncount = 1;
unsigned monAI = 0; //default AI. Monster gets whatever AI is normal for its type
if ((tmp = strtok(NULL, " "))==NULL) return true; montype = atoi(tmp);
if ((tmp = strtok(NULL, " "))!=NULL)moncount = atoi(tmp);
if ((tmp = strtok(NULL, " "))!=NULL)monAI = atoi(tmp);
Log( MSG_GMACTION, " %s : spawned %i monsters of type %i with AI %i" , thisclient->CharInfo->charname, moncount, montype, monAI);
return pakGMMon( thisclient, montype, moncount, monAI );
}
else if (strcmp(command, "kick")==0)
{
if(Config.Command_Kick > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
CPlayer* otherclient = GServer->GetClientByCharName(name);
if (otherclient == NULL)
return true;
if(thisclient->Session->accesslevel <= otherclient->Session->accesslevel)
{
SendPM(thisclient,"You cannot kick that player. His access level is as high as yours");
SendPM(otherclient,"LOL %s just tried to kick you but his access level isn't higher than yours");
Log( MSG_GMACTION, " %s : /kick %s" , thisclient->CharInfo->charname, name);
return true;
}
else
{
Log( MSG_GMACTION, " %s : /kick %s" , thisclient->CharInfo->charname, name);
return pakGMKick( thisclient, name );
}
}
else if (strcmp(command, "job")==0) // *** Change Job *****
{
if(Config.Command_Job > thisclient->Session->accesslevel)
return true;
//char* tmp;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* job=tmp;
Log( MSG_GMACTION, " %s : /job %s" , thisclient->CharInfo->charname, job);
if(thisclient->CharInfo->Job != 0 || thisclient->Stats->Level<10)
return true;
if(strcmp(job,"soldier")==0)
{
BEGINPACKET(pak, 0x721);
ADDWORD (pak, 0x0004);
ADDWORD (pak, 0x006f);
ADDWORD (pak, 0x0000);
thisclient->client->SendPacket(&pak);
RESETPACKET( pak, 0x730);
ADDBYTE(pak, 0x05);
ADDBYTE(pak, 0x00);
ADDWORD(pak, 0xf52f);
ADDWORD(pak, 0x2964);
thisclient->client->SendPacket( &pak );
thisclient->CharInfo->Job=111;
}
else
if(strcmp(job,"muse")==0)
{
BEGINPACKET(pak, 0x721);
ADDWORD (pak, 0x0004);
ADDWORD (pak, 0x00D3);
ADDWORD (pak, 0x0000);
thisclient->client->SendPacket(&pak);
RESETPACKET( pak, 0x730);
ADDBYTE(pak, 0x05);
ADDBYTE(pak, 0x00);
ADDWORD(pak, 0xdc3b);
ADDWORD(pak, 0x20cd);
thisclient->client->SendPacket( &pak );
thisclient->CharInfo->Job=211;
}
else
if(strcmp(job,"hawker")==0)
{
BEGINPACKET(pak, 0x721);
ADDWORD (pak, 0x0004);
ADDWORD (pak, 0x0137);
ADDWORD (pak, 0x0000);
thisclient->client->SendPacket(&pak);
RESETPACKET( pak, 0x730);
ADDBYTE(pak, 0x05);
ADDBYTE(pak, 0x00);
ADDWORD(pak, 0x1104);
ADDWORD(pak, 0x5150);
thisclient->client->SendPacket( &pak );
thisclient->CharInfo->Job=311;
}
else
if(strcmp(job,"dealer")==0)
{
BEGINPACKET(pak, 0x721);
ADDWORD (pak, 0x0004);
ADDWORD (pak, 0x019b);
ADDWORD (pak, 0x0000);
thisclient->client->SendPacket(&pak);
RESETPACKET( pak, 0x730);
ADDBYTE(pak, 0x05);
ADDBYTE(pak, 0x00);
ADDWORD(pak, 0x4c1c);
ADDWORD(pak, 0xef69);
thisclient->client->SendPacket( &pak );
thisclient->CharInfo->Job=411;
}
}
else if (strcmp(command, "set")==0)
{
if(Config.Command_Set > thisclient->Session->accesslevel)
return true;
int refine;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
int id=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
refine = 0;
else
refine=atoi(tmp);
refine *= 16;
BEGINPACKET( pak, 0);
if(EquipList[2].Index[id+100]!=NULL)
{
if(id > 200)
{
thisclient->items[2].itemnum = id+100; //hats are always 100 positions higher so this should make set line up
}
else
{
thisclient->items[2].itemnum = id;
}
thisclient->items[2].itemtype = 2;
thisclient->items[2].refine =refine;
thisclient->items[2].durability = 50;
thisclient->items[2].lifespan = 100;
thisclient->items[2].count = 1;
thisclient->items[2].stats = 0;
thisclient->items[2].socketed = false;
thisclient->items[2].appraised = true;
thisclient->items[2].gem = 0;
thisclient->UpdateInventory( 2 );
RESETPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, 0x0002);
ADDWORD( pak, id+100); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[2] ) ); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE
SendToVisible( &pak,thisclient );
}
if(EquipList[3].Index[id]!=NULL)
{
thisclient->items[3].itemnum = id;
thisclient->items[3].itemtype = 3;
thisclient->items[3].refine =refine;
thisclient->items[3].durability = 50;
thisclient->items[3].lifespan = 100;
thisclient->items[3].count = 1;
thisclient->items[3].stats = 0;
thisclient->items[3].socketed = false;
thisclient->items[3].appraised = true;
thisclient->items[3].gem = 0;
thisclient->UpdateInventory( 3 );
RESETPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, 0x0003);
ADDWORD( pak, id); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[3] )); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE
SendToVisible( &pak,thisclient );
}
if(EquipList[4].Index[id]!=NULL)
{
thisclient->items[5].itemnum = id;
thisclient->items[5].itemtype = 4;
thisclient->items[5].refine =refine;
thisclient->items[5].durability = 50;
thisclient->items[5].lifespan = 100;
thisclient->items[5].count = 1;
thisclient->items[5].stats = 0;
thisclient->items[5].socketed = false;
thisclient->items[5].appraised = true;
thisclient->items[5].gem = 0;
thisclient->UpdateInventory( 4 );
RESETPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, 5);
ADDWORD( pak, id); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[5] )); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE 2602
SendToVisible( &pak,thisclient );
}
if(EquipList[5].Index[id]!=NULL)
{
thisclient->items[6].itemnum = id;
thisclient->items[6].itemtype = 5;
thisclient->items[6].refine =refine;
thisclient->items[6].durability = 50;
thisclient->items[6].lifespan = 100;
thisclient->items[6].count = 1;
thisclient->items[6].stats = 0;
thisclient->items[6].socketed = false;
thisclient->items[6].appraised = true;
thisclient->items[6].gem = 0;
thisclient->UpdateInventory( 6 );
RESETPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, 6);
ADDWORD( pak, id); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[6] )); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed); // REFINE
SendToVisible( &pak,thisclient );
}
thisclient->SetStats( );
}
else if (strcmp(command, "cha")==0)
{
if(Config.Command_Cha > thisclient->Session->accesslevel)
return true;
int slot;
int tipo;
int id;
int stats;
int socket;
int refine;
if ((tmp = strtok(NULL, " "))==NULL)return true;
if(strcmp(tmp, "mask")==0)
{
slot=1;
tipo=1;
}
else
if(strcmp(tmp, "cap")==0)
{
slot=2;
tipo=2;
}
else
if(strcmp(tmp, "suit")==0)
{
slot=3;
tipo=3;
}
else
if(strcmp(tmp, "back")==0)
{
slot=4;
tipo=6;
}
else
if(strcmp(tmp, "glov")==0)
{
slot=5;
tipo=4;
}
else
if(strcmp(tmp, "shoe")==0)
{
slot=6;
tipo=5;
}
else
if(strcmp(tmp, "weap")==0)
{
slot=7;
tipo=8;
}
else
if(strcmp(tmp, "shield")==0)
{
slot=8;
tipo=9;
}
else
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
id=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
stats=0;
else
stats=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
socket=0;
else
socket=1;
if ((tmp = strtok(NULL, " "))==NULL)
refine=0;
else
refine=atoi(tmp);
thisclient->items[slot].itemnum = id;
thisclient->items[slot].itemtype = tipo;
thisclient->items[slot].refine = refine;
thisclient->items[slot].durability = 50;
thisclient->items[slot].lifespan = 100;
thisclient->items[slot].count = 1;
thisclient->items[slot].stats = stats;
thisclient->items[slot].socketed = socket;
thisclient->items[slot].appraised = true;
if(stats > 300)
{
thisclient->items[slot].gem = stats;
thisclient->items[slot].socketed = 1;
}
else
{
thisclient->items[slot].gem = 0;
}
BEGINPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, slot);
ADDWORD( pak, id); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[slot] )); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE 2602
SendToVisible( &pak,thisclient );
thisclient->UpdateInventory( slot );
thisclient->SetStats( );
return true;
}
else if (strcmp(command, "learnskill")==0)
{
if (thisclient->Session->accesslevel < 300)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT skillId = atoi(tmp);
Log( MSG_GMACTION, " %s : /learnskill %i", thisclient->CharInfo->charname, skillId);
if (skillId < 0) return false;
if (skillId > SkillList.size()) return false;
LearnSkill(thisclient, skillId);
return true;
}
else if (strcmp(command, "spawn")==0)
{
if(Config.Command_ESpawn > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
int mobid;
int max;
int radius;
int stime;
int spawntype;
int triggermontype;
int triggeramount;
int lim;
int spawnk;
int aggro;
int refvar; //Objvar NPC reference
int refval; //Objvar array reference
if ((tmp = strtok(NULL, " "))==NULL)
return true;
else
mobid = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
return true;
else
max = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
return true;
else
radius = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
return true;
else
stime = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
return true;
else
spawntype = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
triggermontype = 0;
else
triggermontype = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
triggeramount = 0;
else
triggeramount = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
lim = 0;
else
lim = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
spawnk = 1;
else
spawnk = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
aggro = 1;
else
aggro = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
refvar = 0;
else
refvar = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
refval = 0;
else
refval = atoi(tmp);
GServer->DB->QExecute("INSERT INTO list_special_spawns (map,montype,min,max,respawntime,x,y,radius,agressive,triggerammount,triggermontype,spawntype,areatrigger,lim,spawnk,refvar,refval) VALUES(%i,%i,%i,%i,%i,%f,%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i)",
thisclient->Position->Map,mobid,0,max,stime,thisclient->Position->current.x,thisclient->Position->current.y,radius,aggro,triggeramount,triggermontype,spawntype,1,lim,spawnk,refvar,refval );
CSpawnArea* thisspawn = new (nothrow) CSpawnArea;
if(thisspawn == NULL)
{
Log(MSG_ERROR, "Error allocing memory" );
DB->QFree( );
return false;
}
GServer->maxSpawnId++;
thisspawn->id = GServer->maxSpawnId;
thisspawn->map = thisclient->Position->Map;
thisspawn->montype = mobid;
thisspawn->min = 0;//atoi(row[3]);
thisspawn->max = max;
thisspawn->respawntime = stime;
thisspawn->point.x = thisclient->Position->current.x;
thisspawn->point.y = thisclient->Position->current.y;
thisspawn->radius = radius;
thisspawn->amon = 0;
thisspawn->lastRespawnTime = 0;
thisspawn->type = spawntype;
thisspawn->triggertype = triggermontype;
thisspawn->triggeramount = triggeramount;
thisspawn->aggressive = aggro;
thisspawn->typeoftrigger = 1;
thisspawn->limit = lim;
thisspawn->spawnkey = spawnk;
thisspawn->triggercount = 0;
thisspawn->thisnpc = GetNPCDataByID( thisspawn->montype );
thisspawn->RefVar = refvar;
thisspawn->RefVal = refval;
if(thisspawn->thisnpc == NULL)
{
SendPM(thisclient, "Invalid montype - Spawn %i will not be added", thisspawn->id );
delete thisspawn;
return true;
}
MapList.Index[thisspawn->map]->MonsterSpawnList.push_back( thisspawn );
SendPM(thisclient,"Spawn successfully saved with spawn id %i.",thisspawn->id);
return true;
}
else if (strcmp(command, "refine")==0)
{
if(thisclient->Session->accesslevel < 300)
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
int slot = 7; //defaults to weapon
int tipo;
int itemrefine;
if(strcmp(tmp, "mask")==0)
{
slot=1;
}
else
if(strcmp(tmp, "cap")==0)
{
slot=2;
}
else
if(strcmp(tmp, "suit")==0)
{
slot=3;
}
else
if(strcmp(tmp, "back")==0)
{
slot=4;
}
else
if(strcmp(tmp, "glov")==0)
{
slot=5;
}
else
if(strcmp(tmp, "shoe")==0)
{
slot=6;
}
else
if(strcmp(tmp, "weap")==0)
{
slot=7;
}
else
if(strcmp(tmp, "shield")==0)
{
slot=8;
}
if ((tmp = strtok(NULL, " "))==NULL)
itemrefine =0;
else
itemrefine = atoi(tmp)<10?atoi(tmp)*16:9*16;
thisclient->items[slot].refine = itemrefine;
BEGINPACKET( pak, 0x7a5);
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, slot);
ADDWORD( pak, thisclient->items[slot].itemnum); // ITEM NUM
ADDWORD( pak, BuildItemRefine( thisclient->items[slot] )); // REFINE
ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE 2602
SendToVisible( &pak,thisclient );
thisclient->UpdateInventory( slot );
thisclient->SetStats( );
return true;
}
else if (strcmp(command, "itemstat")==0)
{
if(thisclient->Session->accesslevel < 300)
return true;
if ((tmp = strtok(NULL, " "))==NULL)return true;
int slot = 7; //defaults to weapon
int tipo;
int itemstat;
if(strcmp(tmp, "mask")==0)
{
slot=1;
}
else
if(strcmp(tmp, "cap")==0)
{
slot=2;
}
else
if(strcmp(tmp, "suit")==0)
{
slot=3;
}
else
if(strcmp(tmp, "back")==0)
{
slot=4;
}
else
if(strcmp(tmp, "glov")==0)
{
slot=5;
}
else
if(strcmp(tmp, "shoe")==0)
{
slot=6;
}
else
if(strcmp(tmp, "weap")==0)
{
slot=7;
}
else
if(strcmp(tmp, "shield")==0)
{
slot=8;
}
if ((tmp = strtok(NULL, " "))==NULL)
itemstat = 0;
else
itemstat = atoi(tmp);
thisclient->items[slot].stats= itemstat;
if(itemstat > 300)
{
thisclient->items[slot].socketed = 1;
thisclient->items[slot].gem = itemstat;
}
else
thisclient->items[slot].gem = 0;
thisclient->items[slot].appraised = true;
//BEGINPACKET( pak, 0x7a5);
//ADDWORD( pak, thisclient->clientid );
//ADDWORD( pak, slot);
//ADDWORD( pak, thisclient->items[slot].itemnum); // ITEM NUM
//ADDWORD( pak, BuildItemRefine( thisclient->items[slot] )); // REFINE
//ADDWORD( pak, thisclient->Stats->Move_Speed ); // REFINE 2602
//SendToVisible( &pak,thisclient );
BEGINPACKET( pak,0x7a5 );
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, slot );
ADDDWORD( pak, BuildItemShow(thisclient->items[slot])); // ITEM
ADDWORD ( pak, thisclient->Stats->Move_Speed);
SendToVisible( &pak, thisclient );
thisclient->UpdateInventory( slot );
thisclient->SetStats( );
return true;
}
else if (strcmp(command, "item")==0)//Modified by Hiei (added refine/socket/stats)
{
if(Config.Command_Item > thisclient->Session->accesslevel)
return true;
UINT itemrefine, itemstats, itemls, itemsocket;
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemid =atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemtype =atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemamount =atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
itemrefine =0;
else
itemrefine = atoi(tmp) < 10?atoi(tmp)*16:9*16;
if ((tmp = strtok(NULL, " ")) == NULL)
itemls = 100;
else
itemls = atoi(tmp);
if ((tmp = strtok(NULL, " ")) == NULL)
itemsocket = 0;
else
itemsocket = atoi(tmp)==0?false:true;
if ((tmp = strtok(NULL, " "))==NULL)
itemstats =0;
else
itemstats =atoi(tmp);
Log( MSG_GMACTION, " %s : /item %i,%i,%i,%i,%i,%i" , thisclient->CharInfo->charname, itemid, itemtype, itemamount , itemrefine , itemsocket ,itemstats);
return pakGMItem( thisclient , itemid , itemtype , itemamount , itemrefine , itemls, itemstats , itemsocket );
}
else if (strcmp(command, "levelup")==0 || strcmp(command,"l")==0)
{
if(Config.Command_LevelUp > thisclient->Session->accesslevel)
return true;
Log( MSG_GMACTION, " %s : /levelup" , thisclient->CharInfo->charname);
thisclient->CharInfo->Exp += thisclient->GetLevelEXP();
}
else if (strcmp(command, "drop")==0)
{
if(Config.Command_Drop > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned itemtype=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned itemid=atoi(tmp);
unsigned int itemcount = 0;
if ((tmp = strtok(NULL, " "))==NULL)
itemcount = 1;
else
itemcount = atoi(tmp);
if(itemtype < 10 || itemtype > 12 )
itemcount = 1;
Log( MSG_GMACTION, " %s : /drop %i,%i" , thisclient->CharInfo->charname, itemtype, itemid);
CDrop* thisdrop = new CDrop;
assert(thisdrop);
thisdrop->clientid = GetNewClientID();
thisdrop->type = 2;
thisdrop->pos.x = thisclient->Position->current.x;
thisdrop->pos.y = thisclient->Position->current.y;
thisdrop->posMap = thisclient->Position->Map;
thisdrop->droptime = time(NULL);
ClearItem(thisdrop->item);
thisdrop->item.itemnum = itemid;
thisdrop->item.itemtype = itemtype;
thisdrop->item.count = itemcount;
thisdrop->item.refine = 0;
thisdrop->item.durability = 35;
thisdrop->item.lifespan = 100;
thisdrop->item.appraised = true;
thisdrop->item.socketed = false;
thisdrop->item.stats = 0;
thisdrop->item.gem = 0;
thisdrop->amount = 1;
thisdrop->owner = 0;
CMap* map = MapList.Index[thisdrop->posMap];
map->AddDrop( thisdrop );
}
else if(strcmp(command, "givezuly")==0)
{
if(Config.Command_GiveZuly > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true; char* name = tmp;
if((tmp = strtok(NULL, " ")) == NULL) return true; int zuly = atoi(tmp);
Log( MSG_GMACTION, " %s : /givezuly %s, %i" , thisclient->CharInfo->charname, name, zuly);
return pakGMZulygive(thisclient, name, zuly);
}
else if(strcmp(command, "unionpoints") == 0)
{
if(Config.Command_GiveZuly > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " ")) == NULL) return true; char* name = tmp;
if((tmp = strtok(NULL, " ")) == NULL) return true; int Upoints = atoi(tmp);
Log( MSG_GMACTION, " %s : /unionpoints %s, %i" , thisclient->CharInfo->charname, name, Upoints);
return pakGMUnionPoints(thisclient, name, Upoints);
}
else if(strcmp(command, "npc")==0)
{
if(Config.Command_Npc > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned npcid=atoi(tmp);
unsigned npcdialog = 0;
if((tmp = strtok(NULL, " "))!=NULL)
npcdialog=atoi(tmp);
Log( MSG_GMACTION, " %s : /npc %i, %i" , thisclient->CharInfo->charname, npcid, npcdialog);
return pakGMNpc(thisclient, npcid, npcdialog);
}
else if(strcmp(command, "givefairy") == 0)
{
if(Config.Command_GiveFairy > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true; char* name = tmp;
if((tmp = strtok(NULL, " ")) == NULL) return true; unsigned mode = atoi(tmp);
Log( MSG_GMACTION, " %s : /givefairy %s, %i" , thisclient->CharInfo->charname, name, mode);
return pakGMFairyto(thisclient, name, mode);
}
else if(strcmp(command, "fairymode") == 0)
{
if(Config.Command_ManageFairy > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned mode=atoi(tmp);
Log( MSG_GMACTION, " %s : /fairymode mode: %i" , thisclient->CharInfo->charname, mode);
return pakGMManageFairy(thisclient, mode);
}
else if(strcmp(command, "fairywait")==0)
{
if(Config.Command_ChangeFairyWait > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned value=atoi(tmp);
Log( MSG_GMACTION, " %s : /fairywait value: %i" , thisclient->CharInfo->charname, value);
return pakGMChangeFairyWait(thisclient, value);
}
else if(strcmp(command, "fairystay")==0)
{
if(Config.Command_ChangeFairyStay > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned value=atoi(tmp);
Log( MSG_GMACTION, " %s : /fairystay value: %i" , thisclient->CharInfo->charname, value);
return pakGMChangeFairyStay(thisclient, value);
}
else if(strcmp(command, "fairytestmode")==0)
{
if(Config.Command_ChangeFairyTestMode > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned mode=atoi(tmp);
Log( MSG_GMACTION, " %s : /fairytestmode mode: %i" , thisclient->CharInfo->charname, mode);
return pakGMChangeFairyTestMode(thisclient, mode);
}
else if (strcmp(command, "move")==0)
{
if(Config.Command_Move > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned map=atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; float x=(float)atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; float y=(float)atoi(tmp);
Log( MSG_GMACTION, " %s : /move %s,%i,%i,%i" , thisclient->CharInfo->charname, name, map, x, y);
return pakGMTeleOtherPlayer(thisclient, name, map, x, y);
}
else if (strcmp(command, "goto")==0)
{
if(Config.Command_Goto > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
Log( MSG_GMACTION, " %s : /goto %s" , thisclient->CharInfo->charname, name);
return pakGMTeleToPlayer(thisclient, name);
}
else if (strcmp(command, "teletome")==0)
{
if(Config.Command_TeleToMe > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
Log( MSG_GMACTION, " %s : /teletome %s" , thisclient->CharInfo->charname, name);
if(strcmp(name,"all")==0)
{
return pakGMTeleAllHere(thisclient);
}
return pakGMTelePlayerHere(thisclient, name);
}
else if(strcmp(command, "CharInfo")==0)
{
if(Config.Command_PlayerInfo > thisclient->Session->accesslevel)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
Log( MSG_GMACTION, " %s : /CharInfo %s" , thisclient->CharInfo->charname, name);
return pakGMInfo(thisclient, name);
}
/*else if (strcmp(command, "give2")==0)
{
if(Config.Command_Give2 > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned itemid = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned itemtype = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned itemamount = atoi(tmp);
Log( MSG_GMACTION, " %s : /give2 %s,%i,%i,%i" , thisclient->CharInfo->charname, name, itemid, itemtype, itemamount);
return pakGMItemtoplayer( thisclient , name , itemid , itemtype , itemamount );
}*/
else if (strcmp(command, "give2")==0)
{
if(Config.Command_Item > thisclient->Session->accesslevel)
return true;
UINT itemrefine, itemstats, itemls, itemsocket;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name = tmp;
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemid = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemtype = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true; UINT itemamount = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
itemrefine =0;
else
itemrefine = atoi(tmp)<10?atoi(tmp)*16:9*16;
if ((tmp = strtok(NULL, " "))==NULL)
itemls = 100;
else
itemls = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)
itemsocket = 0;
else
itemsocket =atoi(tmp)==0?false:true;
if ((tmp = strtok(NULL, " "))==NULL)
itemstats = 0;
else
itemstats =atoi(tmp);
Log( MSG_GMACTION, " %s : /give2 %s,%i,%i,%i,%i,%i,%i,%i" , thisclient->CharInfo->charname, name, itemid , itemtype , itemamount , itemrefine , itemls, itemstats , itemsocket);
return pakGMItemtoplayer( thisclient , name , itemid , itemtype , itemamount , itemrefine , itemls, itemstats , itemsocket );
}
else if (strcmp(command, "ban")==0)
{
if(Config.Command_Ban > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* name=tmp;
Log( MSG_GMACTION, " %s : /ban %s" , thisclient->CharInfo->charname, name);
return pakGMBan( thisclient, name );
}
else if (strcmp(command, "ani")==0)
{
if(Config.Command_Ani > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned anid =atoi(tmp);
Log( MSG_GMACTION, " %s : /ani %i" , thisclient->CharInfo->charname, anid);
pakGMDoEmote( thisclient, anid );
}
else if(strcmp(command,"summon")==0)
{
if(Config.Command_Summon > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned int summon = atoi(tmp);
Log( MSG_GMACTION, " %s : /summon %i" , thisclient->CharInfo->charname, summon);
fPoint position = RandInCircle( thisclient->Position->current, 5 );
CMap* map = MapList.Index[thisclient->Position->Map];
map->AddMonster( summon, position, thisclient->clientid, 0,0,168 );
//Start Animation
BEGINPACKET( pak, 0x7b2 );
ADDWORD ( pak, thisclient->clientid );
ADDWORD ( pak, 2802 );
SendToVisible( &pak, thisclient );
//Finish Animation
RESETPACKET( pak, 0x7bb );
ADDWORD ( pak, thisclient->clientid );
SendToVisible( &pak, thisclient );
//????
RESETPACKET( pak, 0x7b9);
ADDWORD ( pak, thisclient->clientid);
ADDWORD ( pak, 1286 );
SendToVisible( &pak, thisclient );
// Add our Mob to the mobs list
}
else if (strcmp(command,"setxprate")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
unsigned int newxprate = atoi(tmp);
GServer->Config.EXP_RATE = newxprate;
Log( MSG_GMACTION, "EXP Rate set to %i" , newxprate);
}
else if (strcmp(command,"setdroprate")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
unsigned int newdroprate = atoi(tmp);
GServer->Config.DROP_RATE= newdroprate;
Log( MSG_GMACTION, "Drop Rate set to %i" , newdroprate);
}
else if (strcmp(command,"setzulyrate")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
unsigned int newzulyrate = atoi(tmp);
GServer->Config.ZULY_RATE = newzulyrate;
Log( MSG_GMACTION, "Zuly Rate set to %i" , newzulyrate);
}
else if (strcmp(command,"delwp")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
int counter = 0;
for(int i=0;i<100;i++)
{
if(GServer->WPList[thisclient->Position->Map][i].WPType != 0)
{
GServer->WPList[thisclient->Position->Map][i].WPType = 0;
GServer->WPList[thisclient->Position->Map][i].X = 0;
GServer->WPList[thisclient->Position->Map][i].Y = 0;
counter++;
}
}
if(counter > 0)
{
SendPM(thisclient, "All WayPoints in this map have been deleted. Use /savewp to make the change in the DB too");
return true;
}
SendPM(thisclient, "No Waypoints were found for this map");
return true;
}
else if (strcmp(command,"setwp")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
{
SendPM(thisclient, "Sorry! You do not have access to this command");
return true;
}
if ((tmp = strtok(NULL, " "))==NULL)
return true;
unsigned int wptype = atoi(tmp);
if(wptype > 3 )
{
SendPM(thisclient, "Data not saved. WP Type cannot be greater than 3");
return true;
}
if(wptype == 0)
{
SendPM(thisclient, "Data not saved. WP Type cannot be zero");
return true;
}
SendPM(thisclient, "REMINDER. Changes made here are not permanent. please use /savewp to make the change in the DB too");
UINT nextentry = 1;
bool firstentry = false;
bool finalentry = false;
UINT mapid = thisclient->Position->Map;
for(int i=1;i<100;i++) //let's see what is already set for this map
{
int j = GServer->WPList[mapid][i].WPType;
if(j > 0)
{
nextentry++;
if(j == 1)
firstentry = true;
if(j == 3)
finalentry = true;
}
}
if(wptype == 1) //first Way Point
{
if(firstentry == true)
{
SendPM(thisclient, "The path for this map already contains a start point. You will need to delete the list before adding a new one");
return true;
}
GServer->WPList[mapid][nextentry].WPType = 1;
GServer->WPList[mapid][nextentry].X = thisclient->Position->current.x;
GServer->WPList[mapid][nextentry].Y = thisclient->Position->current.y;
SendPM(thisclient, "A new TDef Start point has been added for this map");
return true;
}
if(wptype == 2) //regular Way Point
{
if(firstentry == false)
{
SendPM(thisclient, "The path for this map does not contain a start point. You will need to add one before you can add regular waypoints");
return true;
}
if(finalentry == true)
{
SendPM(thisclient, "The path for this map already contains a Final destination point. You cannot add more regular way points until you delete it");
return true;
}
GServer->WPList[mapid][nextentry].WPType = 2;
GServer->WPList[mapid][nextentry].X = thisclient->Position->current.x;
GServer->WPList[mapid][nextentry].Y = thisclient->Position->current.y;
SendPM(thisclient, "A new TDef Way Point has been added for this map");
return true;
}
if(wptype == 3) //Final Way Point
{
if(finalentry == true)
{
SendPM(thisclient, "The path for this map already contains a Final destination point. You will need to delete the list before adding a new one");
return true;
}
GServer->WPList[mapid][nextentry].WPType = 3;
GServer->WPList[mapid][nextentry].X = thisclient->Position->current.x;
GServer->WPList[mapid][nextentry].Y = thisclient->Position->current.y;
SendPM(thisclient, "A new TDef Final Point has been added for this map");
return true;
}
SendPM(thisclient, "Unrecognised SetWP command");
return true; //just to catch any non handled stuff
}
else if (strcmp(command,"savewp")==0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
bool firstentry = false;
bool finalentry = false;
UINT mapid = thisclient->Position->Map;
for(int i=1;i<100;i++) //let's see what is already set for this map
{
int j = GServer->WPList[mapid][i].WPType;
if(j > 0)
{
if(j == 1)
firstentry = true;
if(j == 3)
finalentry = true;
}
}
if(firstentry == false)
{
SendPM(thisclient, "Cannot save to the database. The WayPoint list for this map contains no start point.");
return true;
}
if(finalentry == false)
{
SendPM(thisclient, "Cannot save to the database. The WayPoint list for this map contains no final destination point.");
return true;
}
//save the data
GServer->DB->QExecute("DELETE FROM list_waypoints WHERE mapid=%i", mapid);
for(int j=1;j<100;j++)
{
if(GServer->WPList[mapid][j].WPType != 0)
GServer->DB->QExecute("INSERT INTO list_waypoints (mapid,wpnum,mapx,mapy,wptype) VALUES(%i,%i,%f,%f,%i)",
mapid, j, GServer->WPList[mapid][j].X, GServer->WPList[mapid][j].Y,GServer->WPList[mapid][j].WPType);
}
SendPM(thisclient, "The Waypoint list for this map has been saved to the database.");
return true;
}
else if (strcmp(command,"checkwp") == 0)
{
if(thisclient->Session->accesslevel < 900 || thisclient->CharInfo->IsDev == 0)
return true;
UINT mapid = thisclient->Position->Map;
for(unsigned int i=0;i<20;i++)
{
SendPM(thisclient, "Waypoint %i type is %i",i,GServer->WPList[mapid][i].WPType);
}
}
else if (strcmp(command, "shutdown")==0)
{
if(Config.Command_Shutdown > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned int minutes =atoi(tmp);
char text[200];
sprintf( text, "Server will shutdown in %i minutes, Please logout NOW to be sure your information is saved correctly.",
minutes );
BEGINPACKET( pak, 0x702 );
ADDSTRING ( pak, thisclient->CharInfo->charname );
ADDSTRING ( pak, "> " );
ADDSTRING ( pak, text );
ADDBYTE ( pak, 0x00 );
SendToAll ( &pak );
pthread_create( &WorldThread[SHUTDOWN_THREAD], NULL, (void *(__cdecl *)(void *))ShutdownServer, (PVOID)minutes);
Log( MSG_GMACTION, " %s : /shutdown %u" , thisclient->CharInfo->charname, shutdown);
}
else if(strcmp(command, "dquest")==0) // toggle quest debug mode
{
if(Config.Command_DQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
char buffer2[200];
if( thisclient->questdebug )
{
thisclient->questdebug = false;
sprintf ( buffer2, "Quest Debug Mode disabled" );
SendPM(thisclient, buffer2);
}
else
{
thisclient->questdebug = true;
sprintf ( buffer2, "Quest Debug Mode enabled" );
SendPM(thisclient, buffer2);
}
return true;
}
else if(strcmp(command, "debugmode")==0) //sets the GM into debugmode. PMs will be sent at various parts of the code
{
if(thisclient->Session->accesslevel <= 100)
return true;
char buffer2[200];
if( thisclient->Session->codedebug || thisclient->CharInfo->IsDev == 0)
{
thisclient->Session->codedebug = false;
sprintf ( buffer2, "Debug Mode disabled" );
SendPM(thisclient, buffer2);
}
else
{
thisclient->Session->codedebug = true;
sprintf ( buffer2, "Debug Mode enabled" );
SendPM(thisclient, buffer2);
}
return true;
}
else if(strcmp(command, "iquest")==0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
int n=1;
if ((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned int itemquest = atoi(tmp);
if ((tmp = strtok(NULL, " ")) != NULL)
n = atoi(tmp);
if( thisclient->questdebug )
{
for(int i=0;i<n;i++)
{
BEGINPACKET( pak, 0x731 )
ADDWORD ( pak, itemquest );
thisclient->client->SendPacket( &pak );
}
}
return true;
}
else if(strcmp(command, "addquest")==0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned int questnum =atoi(tmp);
Log( MSG_GMACTION, "add quest %i" , questnum);
for(int i=0;i<10;i++)
{
if (thisclient->quest.quests[i].QuestID != 0) continue;
thisclient->quest.quests[i].QuestID = questnum;
thisclient->quest.quests[i].StartTime = clock_t();
Log( MSG_GMACTION, "quest added %i" , thisclient->quest.quests[i].QuestID);
}
}
else if(strcmp(command, "listquest")==0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
SendPM( thisclient, "Current Quests:" );
for(int i=0;i<10;i++)
{
if (thisclient->quest.quests[i].QuestID == 0) continue;
SendPM( thisclient, "Quest[%i]: %i[%i] %i[%i] %i[%i] %i[%i] %i[%i]" , thisclient->quest.quests[i].QuestID, thisclient->quest.quests[i].Items[0].itemnum, thisclient->quest.quests[i].Items[0].count, thisclient->quest.quests[i].Items[1].itemnum, thisclient->quest.quests[i].Items[1].count, thisclient->quest.quests[i].Items[2].itemnum,thisclient->quest.quests[i].Items[2].count,thisclient->quest.quests[i].Items[3].itemnum,thisclient->quest.quests[i].Items[3].count,thisclient->quest.quests[i].Items[4].itemnum,thisclient->quest.quests[i].Items[4].count);
}
}
else if(strcmp(command, "listqflag") == 0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
SendPM( thisclient, "The following quest flags are set: ");
//for (dword i = 0; i < 0x40; i++)
//{
// char buf2[5];
// sprintf(buf2, "%i ", thisclient->quest.flags[i]);
// buffer.append(buf2);
// if (i > 0 && i%10 == 0)
// {
// SendPM(thisclient, (char*)buffer.c_str());
// buffer = "";
// }
//}
for (int i=0;i<64;i++)
{
for(int j=0;j<8;j++)
{
if(thisclient->quest.Qflags[i][j] == 1)
{
int flagval = i*8 + j;
SendPM( thisclient, "flag %i",flagval);
}
}
}
}
else if(strcmp(command, "listqswitch") == 0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
SendPM( thisclient, "The following quest switches are set: ");
char buffer[200];
for(unsigned int j=0;j<=5;j++)
{
sprintf(buffer, "Switch [%i] = %02x ", j, thisclient->quest.quests[0].Switches[j]);
SendPM( thisclient, buffer);
}
}
else if(strcmp(command, "listqvar") == 0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
SendPM( thisclient, "Quest Variables");
string buffer = "Episode: ";
for(dword i = 0; i < 5; i++)
{
char buf2[5];
sprintf(buf2, "%02x ", thisclient->quest.EpisodeVar[i]);
buffer.append(buf2);
}
SendPM( thisclient, (char*)buffer.c_str() );
buffer = "Job: ";
for(dword i = 0; i < 3; i++)
{
char buf2[5];
sprintf(buf2, "%02x ", thisclient->quest.JobVar[i]);
buffer.append(buf2);
}
SendPM( thisclient, (char*)buffer.c_str());
buffer = "Planet: ";
for(dword i = 0; i < 7; i++)
{
char buf2[5];
sprintf(buf2, "%02x ", thisclient->quest.PlanetVar[i]);
buffer.append(buf2);
}
SendPM( thisclient, (char*)buffer.c_str());
buffer = "Union: ";
for(dword i = 0; i < 10; i++)
{
char buf2[5];
sprintf(buf2, "%02x ", thisclient->quest.UnionVar[i]);
buffer.append(buf2);
}
SendPM( thisclient, (char*)buffer.c_str());
for (dword j = 0; j < 10; j++)
{
if (thisclient->quest.quests[j].QuestID == 0) continue;
buffer = "Quest: ";
char buf3[5];
sprintf(buf3, "%i ",thisclient->quest.quests[j].QuestID);
buffer.append(buf3);
for(dword i = 0; i < 10; i++)
{
char buf2[5];
sprintf(buf2, "%02x ", thisclient->quest.quests[j].Variables[i]);
buffer.append(buf2);
}
SendPM( thisclient, (char*)buffer.c_str());
}
}
else if(strcmp(command, "setqvar") == 0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned int vartype = atoi(tmp);
if ((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned int var = atoi(tmp);
if ((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned int val = atoi(tmp);
if (vartype > 3) return true;
switch (vartype)
{
case 0:
if (var >= 5) return true;
thisclient->quest.EpisodeVar[var] = val;
break;
case 1:
if (var >= 3) return true;
thisclient->quest.JobVar[var] = val;
break;
case 2:
if (var >= 7) return true;
thisclient->quest.PlanetVar[var] = val;
break;
case 3:
if (var >= 10) return true;
thisclient->quest.UnionVar[var] = val;
break;
default:
return true;
break;
}
SendPM( thisclient, "Set Var[%i][%i] = %i", vartype, var, val);
}
else if (strcmp(command, "qtrigger")==0)
{
if(Config.Command_IQuest > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
char* tempName;
int mode;
int success;
if ((tmp = strtok(NULL, " ")) == NULL)return true; tempName = tmp;
dword hash = MakeStrHash(tempName);
if ((tmp = strtok(NULL, " ")) == NULL)
mode = 0;
else
mode = 1;
SendPM(thisclient, "Execute Quest Trigger %s hash: [%08x]", tempName, hash);
success = thisclient->ExecuteQuestTrigger(hash);
SendPM(thisclient, "Quest returned %i", success);
if(mode = 1)
success = atoi(tmp);
SendPM(thisclient, "Quest value sent %i", success);
CPacket pakout(0x730);
pakout.AddByte(success);
pakout.AddByte(0);
pakout.AddDWord(hash);
thisclient->client->SendPacket(&pakout);
}
else if (strcmp(command, "shoptype")==0)
{
if(Config.Command_ShopType > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL) return true;
unsigned int shoptype = atoi(tmp);
thisclient->Shop->ShopType = shoptype;
Log( MSG_GMACTION, " %s : /shoptype %i" , thisclient->CharInfo->charname, shoptype);
}
else if (strcmp(command, "stat")==0) /// Code By Minoc
{
if(Config.Command_Stat > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; char* statname =(char*)tmp;
if ((tmp = strtok(NULL, " "))==NULL) return true; int statvalue = atoi(tmp);
Log( MSG_GMACTION, " %s : /stat %s,%i" , thisclient->CharInfo->charname, statname, statvalue);
return pakGMStat( thisclient , statname , statvalue);
}
else if (strcmp(command, "statp")==0)
{
if (Config.Command_Stat > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; int statvalue = atoi(tmp);
char* name;
if ((tmp = strtok(NULL, " "))==NULL)
name = thisclient->CharInfo->charname;
else
name = tmp;
CPlayer* otherclient = GetClientByCharName(name);
if (otherclient == NULL)
return true;
if ((int)otherclient->CharInfo->StatPoints + statvalue < 0)
otherclient->CharInfo->StatPoints = 0;
else
otherclient->CharInfo->StatPoints += statvalue;
BEGINPACKET( pak, 0x720 );
ADDWORD( pak, 32 );
ADDWORD( pak, statvalue );
ADDWORD( pak, 0 );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x0730 );
ADDWORD( pak, 5 );
ADDWORD( pak, 0xa24d );
ADDWORD( pak, 0x40b3 );
otherclient->client->SendPacket( &pak );
Log(MSG_GMACTION, " %s : /stats %i %s", thisclient->CharInfo->charname, statvalue, name);
return true;
}
else if (strcmp(command, "skillp")==0)
{
if (Config.Command_Stat > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; int skillp = atoi(tmp);
char* name;
if ((tmp = strtok(NULL, " "))==NULL)
name = thisclient->CharInfo->charname;
else
name = tmp;
CPlayer* otherclient = GetClientByCharName(name);
if (otherclient == NULL)
return true;
if ((int)otherclient->CharInfo->SkillPoints + skillp < 0)
otherclient->CharInfo->SkillPoints = 0;
else
otherclient->CharInfo->SkillPoints += skillp;
BEGINPACKET( pak, 0x720 );
ADDWORD( pak, 37 );
ADDWORD( pak, skillp );
ADDWORD( pak, 0 );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x0730 );
ADDWORD( pak, 5 );
ADDWORD( pak, 0xa24d );
ADDWORD( pak, 0x40b3 );
otherclient->client->SendPacket( &pak );
Log(MSG_GMACTION, " %s : /skillp %i %s", thisclient->CharInfo->charname, skillp, name);
return true;
}
else if (strcmp(command, "killinrange")==0)
{
if(Config.Command_KillInRange > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned range=atoi(tmp);
Log( MSG_GMACTION, " %s : /killinrange %i" , thisclient->CharInfo->charname, range);
return pakGMKillInRange( thisclient, range );
}
else if (strcmp(command, "gotomap")==0) // *** TELEPORT WITH MAP ID *****
{ // credits to Blackie
if(Config.Command_GoToMap > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; unsigned map=atoi(tmp);
Log( MSG_GMACTION, " %s : /gotomap %i" , thisclient->CharInfo->charname, map);
return pakGMGotomap(thisclient, map);
}
else if(strcmp(command, "heal")==0)
{
int hpamount = 0;
int mpamount = 0;
if(Config.Command_Heal > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " ")) == NULL)
{
hpamount = thisclient->Stats->MaxHP;
}
else
{
hpamount = atoi(tmp);
}
if ((tmp = strtok(NULL, " ")) == NULL)
{
mpamount = thisclient->Stats->MaxMP;
}
else
{
mpamount = atoi(tmp);
}
Log( MSG_GMACTION, " %s : /heal", thisclient->CharInfo->charname );
return pakGMHeal( thisclient, hpamount, mpamount );
}
else if(strcmp(command, "serverinfo")==0)
{
if(Config.Command_ServerInfo > thisclient->Session->accesslevel)
return true;
Log( MSG_GMACTION, " %s : /serverinfo" , thisclient->CharInfo->charname);
return pakGMServerInfo( thisclient );
}
else if(strcmp(command, "targetinfo")==0)
{
if(Config.Command_TargetInfo > thisclient->Session->accesslevel)
return true;
return GMShowTargetInfo( thisclient );
}
else if (strcmp(command, "hide")==0)
{
if(Config.Command_Hide > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
int mode= atoi( tmp );
return pakGMHide( thisclient, mode );
}
else if (strcmp(command, "class")==0)
{
if(Config.Command_Class > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL)
return true;
char* classid = (char*)tmp;
Log( MSG_GMACTION, " %s : /class %s" , thisclient->CharInfo->charname, classid);
return pakGMClass( thisclient, classid );
}
else if(strcmp(command, "convert")==0)
{
if(Config.Command_Convert > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if(thisclient->Battle->target==0) return true;
if ((tmp = strtok(NULL, " " ))==NULL)
return true;
UINT newmon = atoi(tmp);
if(newmon==0) return true;
CMonster* thismon = GetMonsterByID( thisclient->Battle->target, thisclient->Position->Map );
if(thismon == NULL)
{
CNPC* thisnpc = GetNPCByID( thisclient->Battle->target, thisclient->Position->Map );
if(thisnpc==NULL) return true;
MapList.Index[thisclient->Position->Map]->ConverToMonster( thisnpc, newmon );
}
else
{
MapList.Index[thisclient->Position->Map]->ConverToMonster( thismon, newmon );
}
return true;
}
else if(strcmp(command, "who2")==0)
{
if(Config.Command_Who2 > thisclient->Session->accesslevel)
return true;
SendPM(thisclient, "The following players are currently connected;");
int count=1;
int hiddenam=0;
char line0[200];
while(count <= (ClientList.size()-1))
{
CPlayer* whoclient = (CPlayer*)ClientList.at(count)->player;
if(whoclient != NULL)
{
if(whoclient->Session->accesslevel > 100)
{
//sprintf(line0, "%s - GM[%i]", whoclient->CharInfo->charname, whoclient->Session->accesslevel);
sprintf(line0, "%s - (GM %i, lvl %u), map %u[%.2f,%.2f]", whoclient->CharInfo->charname, whoclient->Session->accesslevel,
whoclient->Stats->Level,
whoclient->Position->Map,
whoclient->Position->current.x,
whoclient->Position->current.y);
}
else
{
//sprintf(line0, "%s", whoclient->CharInfo->charname);
sprintf(line0, "%s (job %u, lvl %u), map %u[%.2f,%.2f]", whoclient->CharInfo->charname,
whoclient->CharInfo->Job,
whoclient->Stats->Level,
whoclient->Position->Map,
whoclient->Position->current.x,
whoclient->Position->current.y);
}
if(!whoclient->isInvisibleMode || thisclient->Session->accesslevel >= whoclient->Session->accesslevel)
{
SendPM(thisclient, line0 );
}
else
{
hiddenam++;
}
count++;
}
}
sprintf(line0, "There are currently %i players connected!", ((ClientList.size()-1)-hiddenam));
Log( MSG_GMACTION, " %s : /who2" , thisclient->CharInfo->charname);
SendPM(thisclient, line0 );
return true;
}
else if(strcmp(command, "rate")==0) //Highly expandable function to change most config values related to rates
{
if(Config.Command_Rate > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
char* type = tmp;
if(strcmp(type,"death")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.DeathDelay = atoi(tmp);
SendPM(thisclient, "Monster Death Delay has been reset to %i",Config.DeathDelay );
}
else
if(strcmp(type,"drop")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.DROP_RATE = atoi(tmp);
SendPM(thisclient, "Drop rate has been reset to %i",Config.DROP_RATE );
}
else
if(strcmp(type,"exp")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.EXP_RATE = atoi(tmp);
SendPM(thisclient, "EXP rate has been reset to %i",Config.EXP_RATE );
}
else
if(strcmp(type,"blue")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.BlueChance = atoi(tmp);
SendPM(thisclient, "Blue item conversion rate has been reset to %i",Config.BlueChance );
}
if(strcmp(type,"attkmult")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.AttkMult = atoi(tmp);
SendPM(thisclient, "Attack delay multiplier has been reset to %i",Config.AttkMult );
}
if(strcmp(type,"skillmult")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.SkillMult = atoi(tmp);
SendPM(thisclient, "Skill delay multiplier has been reset to %i",Config.SkillMult );
}
if(strcmp(type,"dropdelay")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.DropDelay = atoi(tmp);
SendPM(thisclient, "Drop delay multiplier has been reset to %i",Config.DropDelay );
}
if(strcmp(type,"floordrop")==0)
{
if ((tmp = strtok(NULL, " "))==NULL) return true;
Config.BASE_DROP_CHANCE = atoi(tmp);
SendPM(thisclient, "Minimum drop rate has been reset to %i",Config.BASE_DROP_CHANCE );
}
return true;
}
else if(strcmp(command, "moveto")==0)
{
if(Config.Command_Moveto > thisclient->Session->accesslevel)
return true;
fPoint position;
if ((tmp = strtok(NULL, " "))==NULL) return true;
position.x = atof(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true;
position.y = atof(tmp);
if ((tmp = strtok(NULL, " "))==NULL) return true;
position.z = atof(tmp);
pakGMMoveTo( thisclient, position );
}
else if(strcmp(command, "settime")==0)
{
if(Config.Command_Settime > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned int time = atoi(tmp);
if(MapList.Index[thisclient->Position->Map]!=NULL)
{
switch(time)
{
case MORNING:
MapList.Index[thisclient->Position->Map]->MapTime = MapList.Index[thisclient->Position->Map]->morningtime;
SendSysMsg( thisclient, "Time changed!, rejoin to see change [MORNING]" );
break;
case DAY:
MapList.Index[thisclient->Position->Map]->MapTime = MapList.Index[thisclient->Position->Map]->daytime;
SendSysMsg( thisclient, "Time changed!, rejoin to see change [DAY]" );
break;
case EVENING:
MapList.Index[thisclient->Position->Map]->MapTime = MapList.Index[thisclient->Position->Map]->eveningtime;
SendSysMsg( thisclient, "Time changed!, rejoin to see change [EVENING]" );
break;
case NIGHT:
MapList.Index[thisclient->Position->Map]->MapTime = MapList.Index[thisclient->Position->Map]->nighttime;
SendSysMsg( thisclient, "Time changed!, rejoin to see change [NIGHT]" );
break;
default:
SendSysMsg( thisclient, "Time: 0=MORNING | 1=DAY | 2=EVENING | 3=NIGHT" );
}
}
}
else if(strcmp(command, "transx")==0)
{
if(Config.Command_Transx > thisclient->Session->accesslevel)
return true;
thisclient->CharInfo->Sex = thisclient->CharInfo->Sex==0?1:0;
BEGINPACKET( pak, 0x720 );
ADDWORD( pak, 2 );
ADDWORD( pak, thisclient->CharInfo->Sex );
ADDWORD( pak, 0 );
thisclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x0730 );
ADDWORD( pak, 5 );
ADDWORD( pak, 0xa24d );
ADDWORD( pak, 0x40b3 );
thisclient->client->SendPacket( &pak );
}
else if (strcmp(command, "partylvl")==0)
{
if(Config.Command_Partylvl > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true; int level= atoi( tmp );
return pakGMPartylvl( thisclient, level );
}
else if(strcmp(command, "pdmg")==0)
{
if(Config.Command_Pdmg > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned rate=atoi(tmp);
Log( MSG_GMACTION, " Rate for Player Dmg is now set at %i by %s" , rate, thisclient->CharInfo->charname);
return pakGMChangePlayerDmg(thisclient, rate);
}
else if(strcmp(command, "mdmg")==0)
{
if(Config.Command_Mdmg > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned rate=atoi(tmp);
Log( MSG_GMACTION, " Rate for Monster Dmg is now set at %i by %s" , rate, thisclient->CharInfo->charname);
return pakGMChangeMonsterDmg(thisclient, rate);
}
else if(strcmp(command, "rules")==0) // Rules Command by Matt
{
if(Config.Command_Rules > thisclient->Session->accesslevel)
return true;
SendPM(thisclient, "Please follow the following rules to ensure you have a fun time on this server!");
SendPM(thisclient, "Rule 1: No hacking");
SendPM(thisclient, "Rule 2: Do not abuse any bugs in the game");
SendPM(thisclient, "Rule 3: Be respectful to all players and GMs");
SendPM(thisclient, "Rule 4: Do not beg for items");
SendPM(thisclient, "Rule 5: Do not harass any players or GM's");
SendPM(thisclient, "Rule 6: Do not abuse any bugs in the game");
}
else if(strcmp(command, "cfmode")==0)
{
if(Config.Command_Cfmode > thisclient->Session->accesslevel || thisclient->CharInfo->IsDev == 0)
return true;
if((tmp = strtok(NULL, " "))==NULL) return true; unsigned mode=atoi(tmp);
Log( MSG_GMACTION, " Clan field mode changed to %i by %s" , mode, thisclient->CharInfo->charname);
return pakGMChangeCfmode(thisclient, mode);
}
else if(strcmp(command, "skill")==0)
{
if (Config.Command_KillInRange > thisclient->Session->accesslevel)
return true;
if ((tmp = strtok(NULL, " "))==NULL) return true;
unsigned skillid = atoi(tmp);
Log(MSG_GMACTION, "%s cast skill %i", thisclient->CharInfo->charname, skillid);
SendPM(thisclient, "Casting skill %i", skillid);
CCharacter* Target = thisclient->GetCharTarget( );
CSkills* thisskill = GetSkillByID(skillid);
if(thisskill == NULL)return true;
thisclient->UseSkill(thisskill, Target);
}
else if(strcmp(command, "sendhp")==0)
{
SendPM(thisclient, "Testing HP send");
// SET PLAYER HEALTH
thisclient->Stats->HP = thisclient->Stats->MaxHP;
BEGINPACKET( pak, 0x79f );
ADDWORD( pak, thisclient->clientid );
ADDWORD( pak, thisclient->Stats->HP );
ADDWORD( pak, 0 );
thisclient->client->SendPacket( &pak );
}
else if (strcmp(command, "dialog")==0 && thisclient->Session->accesslevel >= 300 || thisclient->CharInfo->IsDev == 0)
{
//can be a very dangerous tool to use
UINT npc;
UINT dialog;
UINT eventid;
if ((tmp = strtok(NULL, " "))==NULL)return true;
npc = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)return true;
dialog = atoi(tmp);
if ((tmp = strtok(NULL, " "))==NULL)return true;
eventid = atoi(tmp);
if(thisclient->ChangeDialog(npc, dialog, eventid))
{
char buffer2[200];
sprintf ( buffer2, "dialog for npc %i set to %i event set to %i", npc, dialog, eventid );
SendPM(thisclient, buffer2);
}
else
{
char buffer2[200];
sprintf ( buffer2, "dialog and event for npc %i not changed", npc );
SendPM(thisclient, buffer2);
}
//thisclient->refresh = true; //doesn't exist in osprose. trying a different approach first
//thisclient->VisiblityList( );
}
else
{
Log( MSG_WARNING, "Invalid GM Command '%s' by '%s'", command, thisclient->CharInfo->charname);
}
return true;
}
// GM: Announcment
bool CWorldServer::pakGMAnn( CPlayer* thisclient, CPacket *P )
{
BEGINPACKET( pak, 0x702 );
ADDSTRING( pak, thisclient->CharInfo->charname );
ADDSTRING( pak, "> " );
ADDSTRING( pak, (&P->Buffer[5]));
ADDBYTE( pak, 0x00);
SendToAll( &pak );
return true;
}
// GM: Spawn x mobs
bool CWorldServer::pakGMMon( CPlayer* thisclient, int montype, int moncount, int monAI )
{
CMap* map = MapList.Index[thisclient->Position->Map]; //find current map
if(monAI == 331) //it's a TD mob
{
SendPM(thisclient,"%i monsters of type %i summoned in Map: %i ",moncount,montype,map->id);
for (int i=0; i<moncount; i++) //add the TD spawns to the Map TDSpawnlist
{
if(map->TDMobList[map->TDNextMon] == 0)
{
map->TDMobList[map->TDNextMon] = montype;
map->TDNextMon ++;
if(map->TDNextMon > 100)map->TDNextMon = 0;
}
else
{
SendPM(thisclient,"Sorry! Cannot add monster %i. the TD Spawn list is full",i);
}
}
}
else // normal spawn
{
for (int i=0; i<moncount; i++)
{
fPoint position = RandInCircle( thisclient->Position->current, 10 );
map->AddMonster( montype, position, 0, 0, 1, 0, 0, monAI );
}
SendPM(thisclient,"%i monsters of type %i summoned in Map: %i using AI %i",moncount,montype,map->id,monAI);
}
SendPM(thisclient,"Spawning successful");
return true;
}
// GM: Teleport somewhere
bool CWorldServer::pakGMTele( CPlayer* thisclient, int map, float x, float y )
{
fPoint coord;
coord.x = x;
coord.y = y;
CMap* mapid = GServer->MapList.Index[map];
if(mapid == NULL)
{
SendPM(thisclient,"%i is not a valid map id",map);
return true;
}
if(thisclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
MapList.Index[map]->TeleportPlayer( thisclient, coord, false );
return true;
}
// GM: apply Status effects for a skill id defined in 'effect'
bool CWorldServer::pakGMEffect(CPlayer* thisclient, int effect)
{
if(thisclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
// build buffs first
BYTE buff1 = 0;
BYTE buff2 = 0;
BYTE buff3 = 0;
BYTE buff4 = 0;
//Build Debuffs and Buffs
//Up
if(effect == 18)//A_ATTACK:
buff2 += ATTACK_UP;
if(effect == 20)//A_DEFENSE:
buff2 += DEFENSE_UP;
if(effect == 22)//A_MDEFENSE_UP
buff2 += MDEFENSE_UP;
if(effect == 24)//A_ACCUR:
buff3 += HITRATE_UP;
if(effect == 14)//A_DASH:
buff1 += DASH_UP;
if(effect == 16)//A_HASTE:
buff2 += HASTE_UP;
if(effect == 12)//A_HP:
buff1 += HP_UP;
if(effect == 13)//A_MP:
buff1 += MP_UP;
if(effect == 26)//A_CRITICAL:
buff3 += CRITICAL_UP;
if(effect == 28)//A_DODGE:
buff1 += DODGE_UP;
if(effect == 36)//A_Extra_Damage:
buff4 += DAMAGE_UP;
//Down
if(effect == 19) // A_ATTACK:
buff2 += ATTACK_DOWN;
if(effect == 21)//A_DEFENSE:
buff2 += DEFENSE_DOWN;
if(effect == 23)
buff2 += MDEFENSE_DOWN;
if(effect == 25)//A_ACCUR:
buff3 += HITRATE_DOWN;
if(effect == 15)//A_DASH:
buff1 += DASH_DOWN;
if(effect == 17)//A_HASTE:
buff2 += HASTE_DOWN;
if(effect == 27)//A_CRITICAL:
buff3 += CRITICAL_DOWN;
if(effect == 32)//A_STUN
buff4+= STUN;
if(effect >= 7 && effect <= 11)//A_POISON
buff1+= POISONED;
if(effect == 30)//A_MUTE
buff3+= MUTED;
int thisbuff = (buff1 * 0x01) + (buff2 * 0x100 ) + (buff3 * 0x10000) + (buff4 * 0x1000000);
BEGINPACKET( pak,0x7b7 );
ADDWORD ( pak, thisclient->clientid );
ADDDWORD ( pak, thisbuff );
GServer->SendToVisible( &pak, thisclient );
SendPM(thisclient,"Buff effect applied %i",thisbuff);
}
// [by Paul_T] [Thanks to AridTag for the packet :D]
bool CWorldServer::pakGMMute( CPlayer* thisclient, char* name, int time)
{
CPlayer* otherclient = GetClientByCharName ( name );
if(otherclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
BEGINPACKET( pak, 0x70d );
ADDBYTE ( pak, 0 );
ADDWORD ( pak, time );
ADDSTRING ( pak, thisclient->CharInfo->charname );
ADDBYTE ( pak, 0 );
otherclient->client->SendPacket( &pak );
return true;
}
// GM: Item - Modified by Hiei (added refine/socket/stats)
bool CWorldServer::pakGMItem( CPlayer* thisclient, UINT itemid, UINT itemtype, UINT itemamount, UINT itemrefine, UINT itemls, UINT itemstats, UINT itemsocket )
{
CItem item;
item.count = itemamount;
item.durability = 40;
item.itemnum = itemid;
item.itemtype = itemtype;
item.lifespan = itemls;
item.refine = itemrefine;
item.stats = itemstats;
item.socketed = itemsocket;
item.appraised = 1;
item.gem = 0;
unsigned newslot = thisclient->GetNewItemSlot( item );
if (newslot != 0xffff)
{
thisclient->items[newslot] = item;
thisclient->UpdateInventory( newslot );
char buffer[200];
sprintf( buffer, "Item added! (ID: %i) (Type: %i) (Refine: %i) (Socket: %i)", item.itemnum, item.itemtype, item.refine, item.socketed );
BEGINPACKET ( pak, 0x702 );
ADDSTRING( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
}else{
BEGINPACKET( pak, 0x7a7 );
ADDWORD( pak, thisclient->clientid );
ADDBYTE( pak, 5 );
thisclient->client->SendPacket( &pak );
RESETPACKET ( pak, 0x702 );
ADDSTRING( pak, "No free slot !" );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
}
return true;
}
// GM: Kick
bool CWorldServer::pakGMKick( CPlayer* thisclient, char* name )
{
CPlayer* otherclient = GetClientByCharName( name );
if(otherclient == NULL)
return true;
BEGINPACKET( pak, 0x702 );
ADDSTRING( pak, "You were disconnected from the server !" );
ADDBYTE( pak, 0 );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x707 );
ADDWORD( pak, 0 );
otherclient->client->SendPacket( &pak );
otherclient->client->isActive = false;
return true;
}
// GM: Ban
bool CWorldServer::pakGMBan( CPlayer* thisclient, char* name )
{
CPlayer* otherclient = GetClientByCharName( name );
if(otherclient == NULL)
return true;
otherclient->Session->accesslevel = -1;
DB->QExecute( "UPDATE accounts SET accesslevel='0' WHERE id=%i", otherclient->Session->userid);
BEGINPACKET( pak, 0x702 );
ADDSTRING( pak, "You were banned from the server !" );
ADDBYTE( pak, 0 );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x707 );
ADDWORD( pak, 0 );
otherclient->client->SendPacket( &pak );
otherclient->client->isActive = false;
return true;
}
// GM: Add/Remove/Drop/Set zuly
bool CWorldServer::pakGMZuly( CPlayer* thisclient, int mode, int amount, char* charname )
{
CPlayer* otherclient = GetClientByCharName(charname);
if(otherclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
if (mode == 1)
{
//ADD
otherclient->CharInfo->Zulies += amount;
BEGINPACKET( pak, 0x71d );
ADDQWORD( pak, otherclient->CharInfo->Zulies );
otherclient->client->SendPacket( &pak );
}
if (mode == 2)
{
//REMOVE
otherclient->CharInfo->Zulies -= amount;
BEGINPACKET( pak, 0x71d );
ADDQWORD( pak, otherclient->CharInfo->Zulies );
otherclient->client->SendPacket( &pak );
}
if (mode == 3)
{
//DROP
CDrop* thisdrop = new CDrop;
assert(thisdrop);
thisdrop->clientid = GetNewClientID();
thisdrop->type = 1; // ZULY
thisdrop->pos.x = otherclient->Position->current.x;
thisdrop->pos.y = otherclient->Position->current.y;
thisdrop->posMap = otherclient->Position->Map;
thisdrop->droptime = time(NULL);
thisdrop->amount = amount;
thisdrop->owner = 0;
CMap* map = MapList.Index[thisdrop->posMap];
map->AddDrop( thisdrop );
}
if (mode == 4)
{
//SET
otherclient->CharInfo->Zulies = amount;
BEGINPACKET( pak, 0x71d );
ADDQWORD( pak, otherclient->CharInfo->Zulies );
otherclient->client->SendPacket( &pak );
}
return true;
}
// Change player Level
bool CWorldServer::pakGMLevel( CPlayer* thisclient, int level, char* name )
{
CPlayer* otherclient = GetClientByCharName( name );
if(otherclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
if (((int)otherclient->Stats->Level + level) > 0)
otherclient->Stats->Level += level;
else
otherclient->Stats->Level = 1;
if (otherclient->Stats->Level > 250)
otherclient->Stats->Level = 250;
otherclient->CharInfo->Exp = 0;
if (level < 0) {
otherclient->CharInfo->StatPoints = 0;
otherclient->CharInfo->SkillPoints = 0;
if(otherclient->Stats->Level > 1)
{
for(int s = 2; s <= otherclient->Stats->Level; s++)
{
otherclient->CharInfo->StatPoints += 10;
otherclient->CharInfo->StatPoints += s / 2;
if (s >= 10)
{
switch (s) {
case 10:
case 14:
otherclient->CharInfo->SkillPoints += 2;
break;
case 18:
otherclient->CharInfo->SkillPoints += 3;
break;
case 22:
otherclient->CharInfo->SkillPoints += 4;
break;
default:
break;
}
// 5 skill points every 4 levels from 22
if (s > 22 && s < 99 && ((s - 22) % 4) == 0)
otherclient->CharInfo->SkillPoints += 5;
// 5 skill points every 2 levels from 98
if (s > 98 && (s % 2) == 0)
otherclient->CharInfo->SkillPoints += 5;
}
}
}
pakGMStat(otherclient, "str", 15);
pakGMStat(otherclient, "dex", 15);
pakGMStat(otherclient, "con", 15);
pakGMStat(otherclient, "int", 15);
pakGMStat(otherclient, "cha", 10);
pakGMStat(otherclient, "sen", 10);
} else {
for(int s = (otherclient->Stats->Level - level + 1); s <= otherclient->Stats->Level; s++)
{
otherclient->CharInfo->StatPoints += 10;
otherclient->CharInfo->StatPoints += s / 2;
if (s >= 10)
{
switch (s)
{
case 10:
case 14:
otherclient->CharInfo->SkillPoints += 2;
break;
case 18:
otherclient->CharInfo->SkillPoints += 3;
break;
case 22:
otherclient->CharInfo->SkillPoints += 4;
break;
default:
break;
}
// 5 skill points every 4 levels from 22
if (s > 22 && s < 99 && ((s - 22) % 4) == 0)
otherclient->CharInfo->SkillPoints += 5;
// 5 skill points every 2 levels from 98
if (s > 98 && (s % 2) == 0)
otherclient->CharInfo->SkillPoints += 5;
}
}
}
BEGINPACKET( pak, 0x79e );
ADDWORD( pak, otherclient->clientid );
ADDWORD( pak, otherclient->Stats->Level );
ADDDWORD( pak, otherclient->CharInfo->Exp );
ADDWORD( pak, otherclient->CharInfo->StatPoints );
ADDWORD( pak, otherclient->CharInfo->SkillPoints );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x79e );
ADDWORD( pak, otherclient->clientid );
SendToVisible( &pak, otherclient, false );
otherclient->SetStats( );
otherclient->Stats->HP = otherclient->Stats->MaxHP;
otherclient->Stats->MP = otherclient->Stats->MaxMP;
return true;
}
// Reload Mob Spawn
bool CWorldServer::ReloadMobSpawn( CPlayer* thisclient, int id )
{
CSpawnArea* thisspawn = new (nothrow) CSpawnArea;
if(thisspawn == NULL)
{
Log(MSG_WARNING, "Error allocing memory" );
return true;
}
thisspawn->thisnpc = GetNPCDataByID( thisclient->GMRespawnPoints.mobID );
if(thisspawn->thisnpc == NULL)
{
SendSysMsg( thisclient, "Invalid Respawn" );
return true;
}
thisspawn->id = id;
thisspawn->map = thisclient->GMRespawnPoints.map;
thisspawn->montype = thisclient->GMRespawnPoints.mobID;
thisspawn->min = thisclient->GMRespawnPoints.min;
thisspawn->max = thisclient->GMRespawnPoints.max;
thisspawn->respawntime = thisclient->GMRespawnPoints.respawntime;
thisspawn->pcount = thisclient->GMRespawnPoints.n;
thisspawn->points = thisclient->GMRespawnPoints.points;
CMap* map = MapList.Index[thisspawn->map];
for(int j=0; j<thisspawn->max; j++)
{
fPoint position = RandInPoly( thisspawn->points, thisspawn->pcount );
map->AddMonster( thisspawn->montype, position, 0, thisspawn->id, 1 );
}
thisspawn->lastRespawnTime=clock();
return true;
}
// Teleport To player to other place
bool CWorldServer::pakGMTeleOtherPlayer( CPlayer *thisclient, char* name, int map, float x, float y )
{
CPlayer* otherclient = GetClientByCharName( name );
if (otherclient != NULL)
{
fPoint coord;
coord.x = x;
coord.y = y;
MapList.Index[map]->TeleportPlayer( otherclient, coord, false );
}
else
{
SendSysMsg( thisclient, "User does not exist or is not online!" );
}
return true;
}
// Teleport Me to player
bool CWorldServer::pakGMTeleToPlayer( CPlayer* thisclient, char* name )
{
CPlayer* otherclient = GetClientByCharName( name );
if (otherclient != NULL)
{
MapList.Index[otherclient->Position->Map]->TeleportPlayer( thisclient, otherclient->Position->current, false );
}
else
{
SendSysMsg( thisclient, "User does not exist or is not online!" );
}
return true;
}
// Teleport Player Here
bool CWorldServer::pakGMTelePlayerHere( CPlayer* thisclient, char* name )
{
CPlayer* otherclient = GetClientByCharName( name );
if (otherclient != NULL)
{
CMap* map = MapList.Index[thisclient->Position->Map];
map->TeleportPlayer( otherclient, thisclient->Position->current, false );
}
else
{
SendSysMsg( thisclient, "User does not exist or is not online!");
}
return true;
}
// Show Player info
bool CWorldServer::pakGMInfo(CPlayer* thisclient, char* name)
{
CPlayer* otherclient = GetClientByCharName(name);
if(otherclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
char buffer[200];
const char* jobname;
if(otherclient != 0) {
if((otherclient->CharInfo->Job - 0) == 0) { jobname = "Visitor"; }
else if((otherclient->CharInfo->Job - 0) == 111) { jobname = "Soldier"; }
else if((otherclient->CharInfo->Job - 0) == 121) { jobname = "Knight"; }
else if((otherclient->CharInfo->Job - 0) == 122) { jobname = "Champion"; }
else if((otherclient->CharInfo->Job - 0) == 211) { jobname = "Muse"; }
else if((otherclient->CharInfo->Job - 0) == 221) { jobname = "Mage"; }
else if((otherclient->CharInfo->Job - 0) == 222) { jobname = "Cleric"; }
else if((otherclient->CharInfo->Job - 0) == 311) { jobname = "Hawker"; }
else if((otherclient->CharInfo->Job - 0) == 321) { jobname = "Raider"; }
else if((otherclient->CharInfo->Job - 0) == 322) { jobname = "Scout"; }
else if((otherclient->CharInfo->Job - 0) == 411) { jobname = "Dealer"; }
else if((otherclient->CharInfo->Job - 0) == 421) { jobname = "Bourgeois"; }
else if((otherclient->CharInfo->Job - 0) == 422) { jobname = "Artisan"; }
else { jobname = "Unknown"; }
BEGINPACKET(pak, 0x702);
sprintf(buffer, "Info about <%s>" , otherclient->CharInfo->charname);
ADDSTRING(pak, buffer);
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x702);
sprintf(buffer, "Account: %s | ID: %i" , otherclient->Session->username, otherclient->Session->userid);
ADDSTRING(pak, buffer);
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x702);
sprintf(buffer, "Level: %i | Job: %s" , (otherclient->Stats->Level-0) , jobname);
ADDSTRING(pak, buffer);
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x702);
sprintf(buffer,"Map: %i , X: %i , Y: %i", (otherclient->Position->Map-0), (int)otherclient->Position->current.x, (int)otherclient->Position->current.y);
ADDSTRING(pak, buffer);
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
}
else {
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User does not exist or is not online!");
ADDBYTE(pak, 0)
thisclient->client->SendPacket(&pak);
}
return true;
}
// Add Fairy
bool CWorldServer::pakGMFairyto(CPlayer* thisclient, char* name, int mode)
{
if (GServer->Config.FairyMode== 0){
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "Fairy feature is de-activated.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
CPlayer* otherclient = GetClientByCharName (name);
if(otherclient == NULL){
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User does not exist or is not online.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
if(mode == 0 && otherclient->Fairy == false){
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User already not fairied.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
if(mode == 1 && otherclient->Fairy == true)
{
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User already fairied.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
if(!otherclient->Fairy && mode == 1)
{
int FairyIndex=100;
for (int i=0; i<GServer->Config.FairyMax; i++)
{
if (GServer->FairyList.at(i)->assigned == false)
{
FairyIndex=i;
i=GServer->Config.FairyMax;
}
}
if (FairyIndex == 100)
{
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "No free Fairy.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User fairied.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
int ListIndex;
for (int i=0; i<ClientList.size(); i++)
{
if (GServer->ClientList.at(i)->player == otherclient)
{
ListIndex = i;
i = GServer->ClientList.size();
}
}
otherclient->Fairy = true;
otherclient->FairyListIndex = FairyIndex;
GServer->FairyList.at(FairyIndex)->ListIndex = ListIndex;
GServer->FairyList.at(FairyIndex)->assigned = true;
GServer->FairyList.at(FairyIndex)->LastTime = clock();
GServer->FairyList.at(FairyIndex)->WaitTime = GServer->Config.FairyWait;
GServer->DoFairyStuff( otherclient, mode );
otherclient->SetStats();
Log( MSG_INFO, "HP: %i MP: %i ATK: %i DEF: %i CRI: %i MSPD: %i", otherclient->Stats->MaxHP, otherclient->Stats->MaxMP, otherclient->Stats->Attack_Power, otherclient->Stats->Defense, otherclient->Stats->Critical, otherclient->Stats->Move_Speed);
}
if(otherclient->Fairy && mode == 0){
GServer->DoFairyFree(otherclient->FairyListIndex);
GServer->FairyList.at(otherclient->FairyListIndex)->WaitTime = GServer->Config.FairyWait;
otherclient->Fairy = false;
otherclient->FairyListIndex = 0;
GServer->DoFairyStuff( otherclient, mode );
BEGINPACKET(pak, 0x702);
ADDSTRING(pak, "User unfairied.");
ADDBYTE(pak, 0);
otherclient->client->SendPacket(&pak);
otherclient->SetStats();
Log( MSG_INFO, "HP: %i MP: %i ATK: %i DEF: %i CRI: %i MSPD: %i", otherclient->Stats->MaxHP, otherclient->Stats->MaxMP, otherclient->Stats->Attack_Power, otherclient->Stats->Defense, otherclient->Stats->Critical, otherclient->Stats->Move_Speed);
}
otherclient->SetStats();
return true;
}
// Activate de-activate Fairy mode in game
bool CWorldServer::pakGMManageFairy(CPlayer* thisclient, int mode)
{
BEGINPACKET (pak, 0x702);
if(mode == 0)
{
if (GServer->Config.FairyMode != mode)
{
GServer->Config.FairyMode = 0;
ADDSTRING(pak, "You have de-activated the Fairy mode ingame.");
}
else
{
ADDSTRING(pak, "The Fairy mode is already de-activated.");
}
}
else
{
if (GServer->Config.FairyMode != mode)
{
GServer->Config.FairyMode = 1;
for (int i=0; i<GServer->Config.FairyMax; i++)
{
GServer->DoFairyFree(i);
GServer->FairyList.at(i)->WaitTime = GServer->Config.FairyWait;
}
ADDSTRING(pak, "You have activated the Fairy mode ingame.");
}
else
{
ADDSTRING(pak, "The Fairy mode is already activated.");
}
}
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
// Change FairyWait
bool CWorldServer::pakGMChangeFairyWait(CPlayer* thisclient, int newvalue)
{
GServer->Config.FairyWait = newvalue;
for (int i=0; i<GServer->FairyList.size(); i++)
{
GServer->FairyList.at(i)->WaitTime = newvalue;
}
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the time between each Fairies");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
// Change FairyStay
bool CWorldServer::pakGMChangeFairyStay(CPlayer* thisclient, int newvalue)
{
GServer->Config.FairyStay = newvalue;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the time of Fairies for Buffing ");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
// Change Fairy Test mode.
// 0 -> normal random x * Fairywait
// 1 -> Test mode activated: 1 * Fairywait only
bool CWorldServer::pakGMChangeFairyTestMode(CPlayer* thisclient, int mode)
{
GServer->Config.FairyTestMode = mode;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the Fairy test mode.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
// Give Zuly
bool CWorldServer::pakGMZulygive(CPlayer* thisclient, char* name, int zuly)
{
CPlayer* otherclient = GetClientByCharName (name);
if(otherclient == NULL)
{
SendPM(thisclient,"Target Player does not exist or is offline");
return true;
}
otherclient->CharInfo->Zulies += zuly;
BEGINPACKET(pak, 0x7a7);
ADDWORD(pak, otherclient->clientid);
ADDWORD(pak, 0);
ADDBYTE(pak, 0);
ADDWORD(pak, 0xccdf );//0xccccccdf);
ADDDWORD(pak, zuly);
otherclient->client->SendPacket(&pak);
return true;
}
// Spawn a NPC
bool CWorldServer::pakGMNpc(CPlayer* thisclient, int npcid,int dialogid)
{
CNPC* thisnpc = new CNPC;
assert(thisnpc);
thisnpc->clientid = GetNewClientID();
thisnpc->dir = 0;
thisnpc->npctype = npcid;
thisnpc->pos = thisclient->Position->current;
thisnpc->posMap = thisclient->Position->Map;
thisnpc->thisnpc = GetNPCDataByID( npcid );
if( thisnpc->thisnpc == NULL )
{
SendPM(thisclient,"Cannot create NPC");
delete thisnpc;
return true;
}
thisnpc->thisnpc->dialogid = dialogid;
CMap* map = MapList.Index[thisclient->Position->Map];
map->AddNPC( thisnpc );
SendPM(thisclient,"NPC type %i added to map %i",npcid,thisnpc->posMap);
return true;
}
// Give Item to Player
bool CWorldServer::pakGMItemtoplayer(CPlayer* thisclient, char* name , UINT itemid, UINT itemtype, UINT itemamount, UINT itemrefine, UINT itemls, UINT itemstats, UINT itemsocket)
{
CItem item;
item.count = itemamount;
item.durability = 40;
item.itemnum = itemid;
item.itemtype = itemtype;
item.lifespan = 100; //itemls Set lifespan to 100
item.refine = itemrefine;
item.stats = itemstats;
item.socketed = itemsocket;
item.appraised = 1;
if(itemstats > 300)
{
item.gem = itemstats;
}
else
{
item.gem = 0;
}
CPlayer* otherclient = GetClientByCharName ( name );
if(otherclient != NULL)
{
unsigned newslot = otherclient->GetNewItemSlot( item );
if(newslot != 0xffff)
{
otherclient->items[newslot] = item;
otherclient->UpdateInventory( newslot );
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have recieved an item from a GM !");
ADDBYTE(pak, 0);
otherclient->client->SendPacket(&pak);
RESETPACKET (pak, 0x702);
ADDSTRING(pak, "Item has been given!");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
}
else
{
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "No free slot !");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
}
}
return true;
}
// Do Emotion
bool CWorldServer::pakGMDoEmote( CPlayer* thisclient, int emotionid )
{
ClearBattle( thisclient->Battle );
BEGINPACKET( pak, 0x781 );
ADDDWORD( pak, emotionid );
ADDWORD( pak, thisclient->clientid );
SendToVisible( &pak, thisclient );
return true;
}
// Change GM Stats (Coded by Minoc)
bool CWorldServer::pakGMStat( CPlayer* thisclient, const char* statname, int statvalue )
{
int statid;
if (strcmp( statname, "Str" )==0 || strcmp( statname, "str" )==0)
{
thisclient->Attr->Str = statvalue;
statid = 0;
}
else if (strcmp( statname, "Dex" )==0 || strcmp( statname, "dex" )==0)
{
thisclient->Attr->Dex = statvalue;
statid = 1;
}
else if (strcmp( statname, "Int" )==0 || strcmp( statname, "int" )==0)
{
thisclient->Attr->Int = statvalue;
statid = 2;
}
else if (strcmp( statname, "Con" )==0 || strcmp( statname, "con" )==0)
{
thisclient->Attr->Con = statvalue;
statid = 3;
}
else if (strcmp( statname, "Cha" )==0 || strcmp( statname, "cha" )==0)
{
thisclient->Attr->Cha = statvalue;
statid = 4;
}
else if (strcmp( statname, "Sen" )==0 || strcmp( statname, "sen" )==0)
{
thisclient->Attr->Sen = statvalue;
statid = 5;
}
else
{
return true;
}
BEGINPACKET( pak, 0x7a9 );
ADDBYTE( pak, statid );
ADDWORD( pak, (unsigned short)statvalue );
thisclient->client->SendPacket( &pak );
thisclient->SetStats( );
return true;
}
// GM: Teleport using map id credits to Blackie
bool CWorldServer::pakGMGotomap( CPlayer* thisclient, int map )
{
CMap* thismap = GServer->MapList.Index[map];
if(thismap == NULL)
{
SendSysMsg( thisclient, "Invalid map id" );
return true;
}
CRespawnPoint* thisrespawn = MapList.Index[map]->GetFirstRespawn( );
if(thisrespawn==NULL)
{
SendSysMsg( thisclient, "This map have no respawn" );
return true;
}
MapList.Index[map]->TeleportPlayer( thisclient, thisrespawn->dest, false );
return true;
}
// Heal a player ( by rl2171 )
bool CWorldServer::pakGMHeal( CPlayer* thisclient, int hpamount, int mpamount )
{
//this one works with the modified trose. pak 0x7ec does not work with base 112 client
thisclient->Stats->HP = hpamount;
thisclient->Stats->MP = mpamount;
BEGINPACKET( pak, 0x7ec );
ADDWORD( pak, hpamount );
ADDWORD( pak, mpamount );
thisclient->client->SendPacket( &pak );
//experimental heal command. Might not work but if it does then we are sorted.
//BEGINPACKET( pak, 0x7d5 );
//ADDDWORD ( pak, thisclient->CharInfo->charid );
//ADDWORD ( pak, thisclient->clientid );
//ADDWORD ( pak, thisclient->Stats->MaxHP );
//ADDWORD ( pak, thisclient->Stats->HP );
//ADDDWORD ( pak, 0x01000000 );
//ADDDWORD ( pak, 0x0000000f );
//ADDWORD ( pak, 0x1388 );
// didn't work either
//let's try this
//BEGINPACKET( pak, 0x753 );
//ADDWORD ( pak, thisclient->clientid ); // USER ID
//ADDWORD ( pak, thisclient->Stats->HP ); // CURRENT HP
//ADDWORD ( pak, thisclient->Stats->MP ); // CURRENT MP
//well it kind of works. You get healed OK but with a pillar of light.
//works Ok here but we need a heal without effects for other places
//also resets the zone time lol. Apparently this is not a good plan
//thisclient->client->SendPacket( &pak );
Log(MSG_INFO,"GM Heal used for HP %i MP %i",hpamount,mpamount);
SendPM(thisclient, "Set HP to %i and MP to %i",hpamount,mpamount);
return true;
}
// GM: Server Information ( by rl2171 ) modified by me
bool CWorldServer::pakGMServerInfo( CPlayer* thisclient )
{
char buffer[200];
// Players Online
BEGINPACKET( pak, 0x0784 );
ADDSTRING( pak, "[SYS]ServerInfo" );
ADDBYTE( pak, 0 );
ADDSTRING( pak, "SERVER INFORMATION" );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Online Players: %i", (int)ClientList.size()-1 );// -1 (we don't count charserver)
RESETPACKET( pak, 0x0784 );
ADDSTRING( pak, "[SYS]ServerInfo" );
ADDBYTE( pak, 0 );
ADDSTRING( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
// Exp / Zulies / Drop rates
sprintf( buffer, "Exp %i | Zulies %i | Drops %i", Config.EXP_RATE, Config.ZULY_RATE, Config.DROP_RATE );
RESETPACKET( pak, 0x0784 );
ADDSTRING( pak, "[SYS]ServerInfo" );
ADDBYTE( pak, 0 );
ADDSTRING( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
// Send map time
if(MapList.Index[thisclient->Position->Map]!=NULL)
{
RESETPACKET( pak, 0x0784 );
ADDSTRING( pak, "[SYS]ServerInfo" );
ADDBYTE( pak, 0 );
switch(MapList.Index[thisclient->Position->Map]->CurrentTime)
{
case MORNING:
sprintf( buffer, "The Time is: Morning[%i]", MapList.Index[thisclient->Position->Map]->MapTime%MapList.Index[thisclient->Position->Map]->dayperiod );
ADDSTRING( pak, buffer );
break;
case DAY:
sprintf( buffer, "The Time is: Day[%i]", MapList.Index[thisclient->Position->Map]->MapTime%MapList.Index[thisclient->Position->Map]->dayperiod );
ADDSTRING( pak, buffer );
break;
case EVENING:
sprintf( buffer, "The Time is: Evening[%i]", MapList.Index[thisclient->Position->Map]->MapTime%MapList.Index[thisclient->Position->Map]->dayperiod );
ADDSTRING( pak, buffer );
break;
case NIGHT:
sprintf( buffer, "The Time is: Night[%i]", MapList.Index[thisclient->Position->Map]->MapTime%MapList.Index[thisclient->Position->Map]->dayperiod );
ADDSTRING( pak, buffer );
break;
default:
sprintf( buffer, "Invalid Time is the End of world [%i]", MapList.Index[thisclient->Position->Map]->MapTime );
ADDSTRING( pak, buffer );
}
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
}
return true;
}
// Show Target Info
bool CWorldServer::GMShowTargetInfo( CPlayer* thisclient )
{
if(thisclient->Battle->target==0) return true;
char buffer[200];
CMonster* monster = GetMonsterByID( thisclient->Battle->target, thisclient->Position->Map );
if(monster == NULL) return true;
float dist = distance( thisclient->Position->current, monster->Position->current );
sprintf( buffer, "Target Position: %.4f, %.4f", monster->Position->current.x, monster->Position->current.y );
BEGINPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Distance: %.0f", dist );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target Defense: %i", monster->Stats->Defense );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target Level: %i", monster->thisnpc->level );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target Attack Power: %i", monster->Stats->Attack_Power );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target Attack Speed: %.0f", monster->Stats->Attack_Speed );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target Move Speed: %i", monster->Stats->Move_Speed );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
sprintf( buffer, "Target HP/MAXHP: %i/%i", monster->Stats->HP, monster->Stats->MaxHP );
RESETPACKET( pak, 0x784 );
ADDSTRING ( pak, "[SYS]TargetInfo" );
ADDBYTE ( pak, 0 );
ADDSTRING ( pak, buffer );
ADDBYTE( pak, 0 );
thisclient->client->SendPacket( &pak );
return true;
}
// GM: Make yourself invisible from tomiz
bool CWorldServer::pakGMHide( CPlayer* thisclient, int mode )
{
BEGINPACKET( pak, 0x702 );
if ( mode == 1 )
{
thisclient -> isInvisibleMode = true;
ADDSTRING( pak, "You are now invisible !" );
Log( MSG_GMACTION, " %s : /hide invisible" , thisclient->CharInfo->charname);
}
else
{
thisclient -> isInvisibleMode = false;
ADDSTRING( pak, "You are now visible !" );
Log( MSG_GMACTION, " %s : /hide visible" , thisclient->CharInfo->charname);
}
ADDBYTE( pak, 0 );
thisclient->client->SendPacket ( &pak );
return true;
}
// GM : Change the party lvl
bool CWorldServer::pakGMPartylvl( CPlayer* partyclient, int level )
{
if (partyclient->Party->party == NULL) return true;
if (level < 0 || level >50) return true;
partyclient->Party->party->PartyLevel = level;
if( partyclient->Party->party->PartyLevel == 50)
partyclient->Party->party->Exp = 0;
//Send Party Level and Party Exp
BEGINPACKET( pak, 0x7d4 ); //
ADDBYTE ( pak, partyclient->Party->party->PartyLevel);
ADDDWORD ( pak, partyclient->Party->party->Exp );
partyclient->Party->party->SendToMembers( &pak );
return true;
}
// GM: Kill all mobs in a range of x-Fields
bool CWorldServer::pakGMKillInRange( CPlayer* thisclient, int range )
{
for(UINT j = 0; j < MapList.Index[thisclient->Position->Map]->MonsterList.size(); j++)
{
CMonster* thismon = MapList.Index[thisclient->Position->Map]->MonsterList.at(j);
if(thismon == NULL)
{
//SendPM(thisclient,"Target Monster does not exist");
continue;
}
if( IsMonInCircle( thisclient, thismon, (float)range ))
{
//Kill the mob
thismon->Stats->HP = -1;
BEGINPACKET( pak, 0x799 );
ADDWORD ( pak, thismon->clientid );
ADDWORD ( pak, thismon->clientid );
ADDWORD ( pak, 0x8005);
//ADDDWORD ( pak, thismon->thisnpc->hp*thismon->thisnpc->level );
//ADDDWORD ( pak, 16 );
SendToVisible( &pak, thismon );
CMap* map = MapList.Index[thisclient->Position->Map];
map->DeleteMonster( thismon );
}
}
return true;
}
// GM: Change Class (from Crash)
bool CWorldServer::pakGMClass( CPlayer* thisclient, char* classid )
{
int classid_new;
if ( strcmp ( classid , "Visitor" ) == 0 || strcmp ( classid , "visitor" ) == 0)
{
classid_new = 0;
}
else if ( strcmp ( classid , "Soldier" ) == 0 || strcmp ( classid , "soldier" ) == 0)
{
classid_new = 111;
}
else if ( strcmp ( classid , "Knight" ) == 0 || strcmp ( classid , "knight" ) == 0)
{
classid_new = 121;
}
else if ( strcmp ( classid , "Champion" ) == 0 || strcmp ( classid , "champion" ) == 0)
{
classid_new = 122;
}
else if ( strcmp ( classid , "Muse" ) == 0 || strcmp ( classid , "muse" ) == 0)
{
classid_new = 211;
}
else if ( strcmp ( classid , "Mage" ) == 0 || strcmp ( classid , "mage" ) == 0)
{
classid_new = 221;
}
else if ( strcmp ( classid , "Cleric" ) == 0 || strcmp ( classid , "cleric" ) == 0)
{
classid_new = 222;
}
else if ( strcmp ( classid , "Hawker" ) == 0 || strcmp ( classid , "hawker" ) == 0)
{
classid_new = 311;
}
else if ( strcmp ( classid , "Raider" ) == 0 || strcmp ( classid , "raider" ) == 0)
{
classid_new = 321;
}
else if ( strcmp ( classid , "Scout" ) == 0 || strcmp ( classid , "scout" ) == 0)
{
classid_new = 322;
}
else if ( strcmp ( classid , "Dealer" ) == 0 || strcmp ( classid , "dealer" ) == 0)
{
classid_new = 411;
}
else if ( strcmp ( classid , "Bourgeois" ) == 0 || strcmp ( classid , "bourgeois" ) == 0)
{
classid_new = 421;
}
else if ( strcmp ( classid , "Artisan" ) == 0 || strcmp ( classid , "artisan" ) == 0)
{
classid_new = 422;
}
else
{
return true;
}
// Set the quest vars for the new class
dword jVarSw = classid_new % 10;
thisclient->quest.JobVar[0] = 0;
thisclient->quest.JobVar[1] = 0;
if (jVarSw == 1)
{
thisclient->quest.JobVar[0] = 1;
}
else if (jVarSw == 2)
{
thisclient->quest.JobVar[0] = 1;
thisclient->quest.JobVar[1] = 2;
}
thisclient->CharInfo->Job = classid_new;
BEGINPACKET(pak, 0x0721);
ADDWORD(pak,4);
ADDWORD(pak, thisclient->CharInfo->Job);
ADDWORD(pak,0);
thisclient->client->SendPacket(&pak);
RESETPACKET(pak, 0x0730);//05 00 2f f5 64 29
ADDWORD(pak, 5);
ADDWORD(pak, 0xf52f);//ADDWORD(pak, 0xa24d);
ADDWORD(pak, 0x2964);//ADDWORD(pak, 0x40b3);
thisclient->client->SendPacket(&pak);
SendPM(thisclient, "Class changed!" );
return true;
}
bool CWorldServer::pakGMTeleAllHere( CPlayer* thisclient )
{
int count=1;
while(count <= (ClientList.size()-1))
{
CPlayer* otherclient = (CPlayer*)ClientList.at(count)->player;
if ((otherclient != NULL) && (otherclient != thisclient))
{
CMap* map = MapList.Index[thisclient->Position->Map];
map->TeleportPlayer( otherclient, thisclient->Position->current, false );
}
count++;
}
return true;
}
bool CWorldServer::pakGMMoveTo( CPlayer* thisclient, fPoint position )
{
if( thisclient->Shop->open || (!thisclient->Ride->Drive && thisclient->Ride->Ride) || !thisclient->Status->CanMove )
return true;
if( thisclient->Status->Stance==1 )
thisclient->Status->Stance=3;
thisclient->Position->destiny = position;
ClearBattle( thisclient->Battle );
BEGINPACKET( pak, 0x79a );
ADDWORD ( pak, thisclient->clientid );
ADDWORD ( pak, thisclient->Battle->target );
ADDWORD ( pak, thisclient->Stats->Move_Speed );
ADDFLOAT ( pak, thisclient->Position->destiny.x*100 );
ADDFLOAT ( pak, thisclient->Position->destiny.y*100 );
ADDFLOAT ( pak, thisclient->Position->destiny.z*100 );
SendToVisible( &pak, thisclient );
return true;
}
//change the player dmg rate
bool CWorldServer::pakGMChangePlayerDmg(CPlayer* thisclient, int rate)
{
GServer->Config.PlayerDmg = rate;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the player dmg rate.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
//change the monster dmg rate
bool CWorldServer::pakGMChangeMonsterDmg(CPlayer* thisclient, int rate)
{
GServer->Config.MonsterDmg = rate;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the Monster dmg rate.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
//change the mSpeedModif || For test only
bool CWorldServer::pakGMChangeMSpeedModif(CPlayer* thisclient, int modif)
{
GServer->MOVE_SPEED_MOD = modif;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "mSpeedModif Changed.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
//change the Cfmode
bool CWorldServer::pakGMChangeCfmode(CPlayer* thisclient, int mode)
{
if(mode<0) mode = 0;
if(mode>1) mode = 1;
GServer->Config.Cfmode = mode;
BEGINPACKET (pak, 0x702);
ADDSTRING(pak, "You have changed the Clan Field Mode.");
ADDBYTE(pak, 0);
thisclient->client->SendPacket(&pak);
return true;
}
//LMA: Giving union points to a player.
bool CWorldServer::pakGMUnionPoints(CPlayer* thisclient, char* name, int nb_points)
{
CPlayer* otherclient = GetClientByCharName (name);
if(otherclient == NULL)
{
SendPM(otherclient,"Target Player does not exist or is offline");
return true;
}
if(otherclient->Union_s->unionvar[0] == 0)
{
// Otherclient not in a union
Log(MSG_INFO,"Could not give union Points as this player is not in a Union");
return true;
}
otherclient->Union_s->unionvar[otherclient->Union_s->unionvar[0]] += nb_points;
int new_amount = otherclient->Union_s->unionvar[otherclient->Union_s->unionvar[0]];
//Need to run a quest trigger to make this happen client side too. Have to write the QSD first though.
BEGINPACKET( pak, 0x720 ); // i think this should be 720 and not 721 as Lmame had it. 721 will change your union ID
ADDWORD( pak, otherclient->Union_s->unionvar[0] );
ADDWORD( pak, new_amount );
ADDWORD( pak, 0x0000 );
otherclient->client->SendPacket( &pak );
RESETPACKET( pak, 0x730 );
ADDWORD ( pak, 0x0005 );
ADDDWORD ( pak, 0x40b3a24d );
otherclient->client->SendPacket( &pak );
SendPM(otherclient, "You have been given %i Faction Points by %s",nb_points,thisclient->CharInfo->charname);
Log( MSG_GMACTION, "%i Faction points given to %s by %s" , nb_points,name,thisclient->CharInfo->charname);
return true;
}