/* This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.te
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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package client.command;
import client.MapleBuffStat;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleJob;
import client.MapleStat;
import client.Skill;
import client.SkillFactory;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import constants.ItemConstants;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import net.server.Server;
import net.server.channel.Channel;
import net.server.world.World;
import provider.MapleData;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import provider.MapleDataTool;
import scripting.npc.NPCScriptManager;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleShopFactory;
import server.TimerManager;
import server.events.gm.MapleEvent;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.life.MapleNPC;
import server.maps.MapleMap;
import server.maps.MapleMapItem;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import tools.DatabaseConnection;
import tools.MaplePacketCreator;
import tools.Pair;
public class Commands {
public static boolean executePlayerCommand(MapleClient c, String[] sub, char heading) {
MapleCharacter chr = c.getPlayer();
if (heading == '!' && chr.gmLevel() == 0) {
chr.yellowMessage("You may not use !" + sub + ", please try /" + sub);
return false;
}
switch (sub[0]) {
case "dispose":
NPCScriptManager.getInstance().dispose(c);
c.announce(MaplePacketCreator.enableActions());
chr.message("Done.");
break;
case "why":
List<Pair<MapleBuffStat, Integer>> list = new ArrayList<>();
list.add(new Pair<>(MapleBuffStat.MORPH, 8));
list.add(new Pair<>(MapleBuffStat.CONFUSE, 1));
chr.announce(MaplePacketCreator.giveBuff(0, 0, list));
chr.getMap().broadcastMessage(chr, MaplePacketCreator.giveForeignBuff(chr.getId(), list));
break;
case "save":
if(System.currentTimeMillis() > 60000) {
chr.saveToDB();
chr.dropMessage("Saved."); }
else {
chr.dropMessage("10min wait."); }
break;
case "resetstats":
chr.resetStats();
break;
case "resetexp":
chr.setExp(0);
break;
case "goto":
case "go":
case "warp":
HashMap<String, Integer> maps = new HashMap<String, Integer>();
maps.put("henesys", 100000000);
maps.put("ellinia", 101000000);
maps.put("perion", 102000000);
maps.put("kerning", 103000000);
maps.put("lith", 104000000);
maps.put("sleepywood", 105040300);
maps.put("florina", 110000000);
maps.put("orbis", 200000000);
maps.put("happy", 209000000);
maps.put("elnath", 211000000);
maps.put("ereve", 130000000);
maps.put("ludi", 220000000);
maps.put("omega", 221000000);
maps.put("korean", 222000000);
maps.put("aqua", 230000000);
maps.put("leafre", 240000000);
maps.put("mulung", 250000000);
maps.put("herb", 251000000);
maps.put("nlc", 600000000);
maps.put("shrine", 800000000);
maps.put("showa", 801000000);
maps.put("fm", 910000000);
maps.put("guild", 200000301);
maps.put("fog", 105040306);
if (sub.length != 2) {
StringBuilder builder = new StringBuilder("Syntax: /go <mapname>");
int i = 0;
for (String mapss : maps.keySet()) {
if (1 % 10 == 0) {// 10 maps per line
chr.dropMessage(builder.toString());
} else {
builder.append(mapss + ", ");
}
}
chr.dropMessage(builder.toString());
} else if (maps.containsKey(sub[1])) {
int map = maps.get(sub[1]);
if (map == 910000000) {
chr.saveLocation("FREE_MARKET");
}
chr.changeMap(map);
} else {
chr.dropMessage("========================================================================");
chr.dropMessage(" ..::| Go Map Selections |::.. ");
chr.dropMessage("========================================================================");
chr.dropMessage("| henesys | ellinia | perion | kerning | lith | sleepywood | florina |");
chr.dropMessage("| fog | orbis | happy | elnath | ereve | ludi | omega |");
chr.dropMessage("| korean | aqua | leafre | mulung | herb | nlc | shrine |");
chr.dropMessage("| showa | fm | guild |");
}
maps.clear();
break;
case "commands":
chr.dropMessage("/dispose");
chr.dropMessage("/save");
chr.dropMessage("/go or /goto or /warp");
chr.dropMessage("/resetstats");
chr.dropMessage("/resetexp");
break;
default:
if (chr.gmLevel() == 0) {
chr.yellowMessage("Player Command " + heading + sub[0] + " does not exist. Use /commands");
}
return false;
}
return true;
}
public static boolean executeGMCommand(MapleClient c, String[] sub, char heading) {
MapleCharacter player = c.getPlayer();
Channel cserv = c.getChannelServer();
Server srv = Server.getInstance();
MapleCharacter cvictim = cserv.getPlayerStorage().getCharacterByName(sub[1]);
switch (sub[0]) {
case "apall":
player.setRemainingAp(Integer.parseInt(sub[1]));
case "buffme":
final int[] array = {9001000, 9101002, 9101003, 9101008, 2001002, 1101007, 1005, 2301003, 5121009, 1111002, 4111001, 4111002, 4211003, 4211005, 1321000, 2321004, 3121002};
for (int i : array) {
SkillFactory.getSkill(i).getEffect(SkillFactory.getSkill(i).getMaxLevel()).applyTo(player);
}
case "spawn":
MapleMonster monsterid = MapleLifeFactory.getMonster(Integer.parseInt(sub[1]));
if (monsterid == null) {
return true;
}
if (sub.length > 2) {
for (int i = 0; i < Integer.parseInt(sub[2]); i++) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
}
} else {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(Integer.parseInt(sub[1])), player.getPosition());
}
case "clear":
player.getMap().clearDrops(player);
case "gmchat":
String message = joinStringFrom(sub, 1);
Server.getInstance().gmChat(player.getName() + " : " + message, null);
case "dc":
MapleCharacter victim = c.getWorldServer().getPlayerStorage().getCharacterByName(sub[1]);
if (victim == null) {
victim = cvictim;
if (victim == null) {
victim = player.getMap().getCharacterByName(sub[1]);
if (victim != null) {
try {//sometimes bugged because the map = null
victim.getClient().getSession().close();
player.getMap().removePlayer(victim);
} catch (Exception e) {
}
} else {
return true;
}
}
}
if (player.gmLevel() < victim.gmLevel()) {
victim = player;
}
victim.getClient().disconnect(false, false);
case "exprate":
c.getWorldServer().setExpRate(Integer.parseInt(sub[1]));
for (MapleCharacter mc : c.getWorldServer().getPlayerStorage().getAllCharacters()) {
mc.setRates();
}
case "fame":
cvictim.setFame(Integer.parseInt(sub[2]));
cvictim.updateSingleStat(MapleStat.FAME, cvictim.getFame());
case "giftnx":
cvictim.getCashShop().gainCash(1, Integer.parseInt(sub[2]));
player.message("Done");
case "gmshop":
MapleShopFactory.getInstance().getShop(1337).sendShop(c);
case "heal":
player.setHpMp(30000);
case "id":
try {
try (BufferedReader dis = new BufferedReader(new InputStreamReader(new URL("http://www.mapletip.com/search_java.php?search_value=" + sub[1] + "&check=true").openConnection().getInputStream()))) {
String s;
while ((s = dis.readLine()) != null) {
player.dropMessage(s);
}
}
} catch (Exception e) {
}
case "item":
case "drop":
int itemId = Integer.parseInt(sub[1]);
short quantity = 1;
try {
quantity = Short.parseShort(sub[2]);
} catch (Exception e) {
}
if (sub[0].equals("item")) {
int petid = -1;
if (ItemConstants.isPet(itemId)) {
petid = MaplePet.createPet(itemId);
}
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, -1);
} else {
Item toDrop;
if (MapleItemInformationProvider.getInstance().getInventoryType(itemId) == MapleInventoryType.EQUIP) {
toDrop = MapleItemInformationProvider.getInstance().getEquipById(itemId);
} else {
toDrop = new Item(itemId, (byte) 0, quantity);
}
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
}
case "job":
player.changeJob(MapleJob.getById(Integer.parseInt(sub[1])));
player.equipChanged();
case "kill":
if (sub.length >= 2) {
cvictim.setHpMp(0);
}
case "killall":
List<MapleMapObject> monsters = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
MapleMap map = player.getMap();
for (MapleMapObject monstermo : monsters) {
MapleMonster monster = (MapleMonster) monstermo;
map.killMonster(monster, player, true);
monster.giveExpToCharacter(player, monster.getExp() * c.getPlayer().getExpRate(), true, 1);
}
player.dropMessage("Killed " + monsters.size() + " monsters.");
case "monsterdebug":
List<MapleMapObject> monsterz = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER));
for (MapleMapObject monstermo : monsterz) {
MapleMonster monster = (MapleMonster) monstermo;
player.message("Monster ID: " + monster.getId());
}
case "unbug":
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.enableActions());
case "level":
player.setLevel(Integer.parseInt(sub[1]));
player.gainExp(-player.getExp(), false, false);
player.updateSingleStat(MapleStat.LEVEL, player.getLevel());
case "levelperson":
cvictim.setLevel(Integer.parseInt(sub[2]));
cvictim.gainExp(-cvictim.getExp(), false, false);
cvictim.updateSingleStat(MapleStat.LEVEL, cvictim.getLevel());
case "levelpro":
while (player.getLevel() <= 249) {
player.levelUp(false);
}
case "levelup":
player.levelUp(false);
case "maxstat":
final String[] s = {"setall", String.valueOf(Short.MAX_VALUE)};
executeGMCommand(c, s, heading);
player.setLevel(255);
player.setFame(13337);
player.setMaxHp(30000);
player.setMaxMp(30000);
player.updateSingleStat(MapleStat.LEVEL, 255);
player.updateSingleStat(MapleStat.FAME, 13337);
player.updateSingleStat(MapleStat.MAXHP, 30000);
player.updateSingleStat(MapleStat.MAXMP, 30000);
case "maxskills":
for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) {
try {
Skill skill = SkillFactory.getSkill(Integer.parseInt(skill_.getName()));
player.changeSkillLevel(skill, (byte) skill.getMaxLevel(), skill.getMaxLevel(), -1);
} catch (NumberFormatException nfe) {
break;
} catch (NullPointerException npe) {
continue;
}
}
case "mesoperson":
cvictim.gainMeso(Integer.parseInt(sub[2]), true);
case "mesos":
player.gainMeso(Integer.parseInt(sub[1]), true);
case "notice":
Server.getInstance().broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(6, "[Notice] " + joinStringFrom(sub, 1)));
case "openportal":
player.getMap().getPortal(sub[1]).setPortalState(true);
case "closeportal":
player.getMap().getPortal(sub[1]).setPortalState(false);
case "startevent":
for (MapleCharacter chr : player.getMap().getCharacters()) {
player.getMap().startEvent(chr);
}
c.getChannelServer().setEvent(null);
case "scheduleevent":
if (c.getPlayer().getMap().hasEventNPC()) {
switch (sub[1]) {
case "treasure":
c.getChannelServer().setEvent(new MapleEvent(109010000, 50));
break;
case "ox":
c.getChannelServer().setEvent(new MapleEvent(109020001, 50));
srv.broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(0, "Hello Scania let's play an event in " + player.getMap().getMapName() + " CH " + c.getChannel() + "! " + player.getMap().getEventNPC()));
break;
case "ola":
c.getChannelServer().setEvent(new MapleEvent(109030101, 50)); // Wrong map but still Ola Ola
srv.broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(0, "Hello Scania let's play an event in " + player.getMap().getMapName() + " CH " + c.getChannel() + "! " + player.getMap().getEventNPC()));
break;
case "fitness":
c.getChannelServer().setEvent(new MapleEvent(109040000, 50));
srv.broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(0, "Hello Scania let's play an event in " + player.getMap().getMapName() + " CH " + c.getChannel() + "! " + player.getMap().getEventNPC()));
break;
case "snowball":
c.getChannelServer().setEvent(new MapleEvent(109060001, 50));
srv.broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(0, "Hello Scania let's play an event in " + player.getMap().getMapName() + " CH " + c.getChannel() + "! " + player.getMap().getEventNPC()));
break;
case "coconut":
c.getChannelServer().setEvent(new MapleEvent(109080000, 50));
srv.broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(0, "Hello Scania let's play an event in " + player.getMap().getMapName() + " CH " + c.getChannel() + "! " + player.getMap().getEventNPC()));
break;
default:
player.message("Wrong Syntax: /scheduleevent treasure, ox, ola, fitness, snowball or coconut");
break;
}
} else {
player.message("You can only use this command in the following maps: 60000, 104000000, 200000000, 220000000");
}
case "online":
for (Channel ch : srv.getChannelsFromWorld(player.getWorld())) {
String os = "Characters online (Channel " + ch.getId() + " Online: " + ch.getPlayerStorage().getAllCharacters().size() + ") : ";
if (ch.getPlayerStorage().getAllCharacters().size() < 50) {
for (MapleCharacter chr : ch.getPlayerStorage().getAllCharacters()) {
os += MapleCharacter.makeMapleReadable(chr.getName()) + ", ";
}
player.dropMessage(os.substring(0, os.length() - 2));
}
}
case "pap":
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8500001), player.getPosition());
case "pianus":
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8510000), player.getPosition());
case "search":
StringBuilder sb = new StringBuilder();
if (sub.length > 2) {
String search = joinStringFrom(sub, 2);
long start = System.currentTimeMillis();//for the lulz
MapleData data = null;
MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz"));
if (!sub[1].equalsIgnoreCase("ITEM")) {
if (sub[1].equalsIgnoreCase("NPC")) {
data = dataProvider.getData("Npc.img");
} else if (sub[1].equalsIgnoreCase("MOB") || sub[1].equalsIgnoreCase("MONSTER")) {
data = dataProvider.getData("Mob.img");
} else if (sub[1].equalsIgnoreCase("SKILL")) {
data = dataProvider.getData("Skill.img");
} else if (sub[1].equalsIgnoreCase("MAP")) {
sb.append("#bUse the '/m' command to find a map. If it finds a map with the same name, it will warp you to it.");
} else {
sb.append("#bInvalid search.\r\nSyntax: '/search [type] [name]', where [type] is NPC, ITEM, MOB, or SKILL.");
}
if (data != null) {
String name;
for (MapleData searchData : data.getChildren()) {
name = MapleDataTool.getString(searchData.getChildByPath("name"), "NO-NAME");
if (name.toLowerCase().contains(search.toLowerCase())) {
sb.append("#b").append(Integer.parseInt(searchData.getName())).append("#k - #r").append(name).append("\r\n");
}
}
}
} else {
for (Pair<Integer, String> itemPair : MapleItemInformationProvider.getInstance().getAllItems()) {
if (sb.length() < 32654) {//ohlol
if (itemPair.getRight().toLowerCase().contains(search.toLowerCase())) {
//#v").append(id).append("# #k-
sb.append("#b").append(itemPair.getLeft()).append("#k - #r").append(itemPair.getRight()).append("\r\n");
}
} else {
sb.append("#bCouldn't load all items, there are too many results.\r\n");
break;
}
}
}
if (sb.length() == 0) {
sb.append("#bNo ").append(sub[1].toLowerCase()).append("s found.\r\n");
}
sb.append("\r\n#kLoaded within ").append((double) (System.currentTimeMillis() - start) / 1000).append(" seconds.");//because I can, and it's free
} else {
sb.append("#bInvalid search.\r\nSyntax: '/search [type] [name]', where [type] is NPC, ITEM, MOB, or SKILL.");
}
c.announce(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, sb.toString(), "00 00", (byte) 0));
case "servermessage":
c.getWorldServer().setServerMessage(joinStringFrom(sub, 1));
case "warpsnowball":
for (MapleCharacter chr : player.getMap().getCharacters()) {
chr.changeMap(109060000, chr.getTeam());
}
case "setall":
final int x = Short.parseShort(sub[1]);
player.setStr(x);
player.setDex(x);
player.setInt(x);
player.setLuk(x);
player.updateSingleStat(MapleStat.STR, x);
player.updateSingleStat(MapleStat.DEX, x);
player.updateSingleStat(MapleStat.INT, x);
player.updateSingleStat(MapleStat.LUK, x);
case "sp":
player.setRemainingSp(Integer.parseInt(sub[1]));
player.updateSingleStat(MapleStat.AVAILABLESP, player.getRemainingSp());
case "command":
player.dropMessage("@apall");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/727615.html"]buffme[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/2000166965.html"]Spawn[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/1333429346.html"]Clear[/URL][/B][/I]");
player.dropMessage("@dc");
player.dropMessage("@exprate");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/1333384735.html"]Fame[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/734115.html"]Gift[/URL][/B][/I]nx");
player.dropMessage("@gmshop");
player.dropMessage("@heal");
player.dropMessage("@item");
player.dropMessage("@job");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/39035.html"]kill[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/501318.html"]killall[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/501312.html"]level[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/501312.html"]level[/URL][/B][/I]person");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/501312.html"]level[/URL][/B][/I]up");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/693815.html"]maxs[/URL][/B][/I]tat");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/693815.html"]maxs[/URL][/B][/I]kills");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/2000153219.html"]meso[/URL][/B][/I]person amount");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/2000153219.html"]meso[/URL][/B][/I]s amount");
player.dropMessage("@notice");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/2000107803.html"]ope[/URL][/B][/I]nportal");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/843703.html"]Clo[/URL][/B][/I]seportal");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/829527.html"]Start[/URL][/B][/I]event");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/515508.html"]Sch[/URL][/B][/I]eduleevent event");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/27501.html"]OnLine[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/412249.html"]Server[/URL][/B][/I]message");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/1333350597.html"]Set[/URL][/B][/I]all amount");
player.dropMessage("@sp amount");
player.dropMessage("@unban accountid");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/433969.html"]Pap[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/1333407204.html"]pianus[/URL][/B][/I]");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/318766.html"]war[/URL][/B][/I]psnowball");
player.dropMessage("@unbug");
player.dropMessage( @[I][B][URL="https://forum.ragezone.com/members/111754.html"]search[/URL][/B][/I]");
case "unban":
try {
try (PreparedStatement p = DatabaseConnection.getConnection().prepareStatement("UPDATE accounts SET banned = -1 WHERE id = " + MapleCharacter.getIdByName(sub[1]))) {
p.executeUpdate();
}
} catch (Exception e) {
player.message("Failed to unban " + sub[1]);
return true;
}
player.message("Unbanned " + sub[1]);
default:
player.yellowMessage("GM Command " + heading + sub[0] + " does not exist. Use @[I][B][URL="https://forum.ragezone.com/members/2000161204.html"]comman[/URL][/B][/I]d");
return false;
}
}
public static void executeAdminCommand(MapleClient c, String[] sub, char heading) {
MapleCharacter player = c.getPlayer();
switch (sub[0]) {
case "horntail":
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8810026), player.getPosition());
break;
case "packet":
player.getMap().broadcastMessage(MaplePacketCreator.customPacket(joinStringFrom(sub, 1)));
break;
case "warpworld":
Server server = Server.getInstance();
byte worldb = Byte.parseByte(sub[1]);
if (worldb <= (server.getWorlds().size() - 1)) {
try {
String[] socket = server.getIP(worldb, c.getChannel()).split(":");
c.getWorldServer().removePlayer(player);
player.getMap().removePlayer(player);//LOL FORGOT THIS ><
c.updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION);
player.setWorld(worldb);
player.saveToDB();//To set the new world :O (true because else 2 player instances are created, one in both worlds)
c.announce(MaplePacketCreator.getChannelChange(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1])));
} catch (UnknownHostException | NumberFormatException ex) {
player.message("Error when trying to change worlds, are you sure the world you are trying to warp to has the same amount of channels?");
}
} else {
player.message("Invalid world; highest number available: " + (server.getWorlds().size() - 1));
}
break;
case "saveall"://fyi this is a stupid command
for (World world : Server.getInstance().getWorlds()) {
for (MapleCharacter chr : world.getPlayerStorage().getAllCharacters()) {
chr.saveToDB();
}
}
break;
case "pmob":
int mobId = Integer.parseInt(sub[1]);
int mobTime = Integer.parseInt(sub[2]);
int xpos2 = player.getPosition().x;
int ypos2 = player.getPosition().y;
int fh2 = player.getMap().getFootholds().findBelow(player.getPosition()).getId();
if (sub[2] == null) {
mobTime = 0;
}
MapleMonster mob = MapleLifeFactory.getMonster(mobId);
if (mob != null && !mob.getName().equals("MISSINGNO")) {
mob.setPosition(player.getPosition());
mob.setCy(ypos2);
mob.setRx0(xpos2 + 50);
mob.setRx1(xpos2 - 50);
mob.setFh(fh2);
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO spawns ( idd, f, fh2, cy, rx0, rx1, type, x, y, mid, mobtime ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
ps.setInt(1, mobId);
ps.setInt(2, 0);
ps.setInt(3, fh2);
ps.setInt(4, ypos2);
ps.setInt(5, xpos2 + 50);
ps.setInt(6, xpos2 - 50);
ps.setString(7, "m");
ps.setInt(8, xpos2);
ps.setInt(9, ypos2);
ps.setInt(10, player.getMapId());
ps.setInt(11, mobTime);
ps.executeUpdate();
} catch (SQLException e) {
player.dropMessage("Failed to save MOB to the database");
}
player.getMap().addMonsterSpawn(mob, mobTime, 0);
} else {
player.dropMessage("You have entered an invalid Mob-Id");
}
break;
case "npc":
if (sub.length < 1) {
break;
}
MapleNPC npc = MapleLifeFactory.getNPC(Integer.parseInt(sub[1]));
if (npc != null) {
npc.setPosition(player.getPosition());
npc.setCy(player.getPosition().y);
npc.setRx0(player.getPosition().x + 50);
npc.setRx1(player.getPosition().x - 50);
npc.setFh(player.getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
player.getMap().addMapObject(npc);
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc));
}
break;
case "pnpc":
int pnpcId = Integer.parseInt(sub[1]);
MapleNPC pnpc = MapleLifeFactory.getNPC(pnpcId);
int xpos = player.getPosition().x;
int ypos = player.getPosition().y;
int fh = player.getMap().getFootholds().findBelow(player.getPosition()).getId();
if (pnpc != null && !pnpc.getName().equalsIgnoreCase("MISSINGNO")) {
pnpc.setPosition(player.getPosition());
pnpc.setCy(ypos);
pnpc.setRx0(xpos + 50);
pnpc.setRx1(xpos - 50);
pnpc.setFh(fh);
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO spawns ( idd, f, fh, cy, rx0, rx1, type, x, y, mid ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
ps.setInt(1, pnpcId);
ps.setInt(2, 0);
ps.setInt(3, fh);
ps.setInt(4, ypos);
ps.setInt(5, xpos + 50);
ps.setInt(6, xpos - 50);
ps.setString(7, "n");
ps.setInt(8, xpos);
ps.setInt(9, ypos);
ps.setInt(10, player.getMapId());
ps.executeUpdate();
} catch (SQLException e) {
player.dropMessage("Failed to save NPC to the database");
}
player.getMap().addMapObject(pnpc);
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(pnpc));
} else {
player.dropMessage("You have entered an invalid Npc-Id");
}
break;
case "jobperson": {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
victim.changeJob(MapleJob.getById(Integer.parseInt(sub[2])));
player.equipChanged();
break;
}
case "pinkbean":
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(8820009), player.getPosition());
break;
case "playernpc":
player.playerNPC(c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]), Integer.parseInt(sub[2]));
break;
case "setgmlevel": {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
victim.setGM(Integer.parseInt(sub[2]));
player.message("Done.");
victim.getClient().disconnect(false, false);
break;
}
case "shutdown":
case "shutdownnow":
Server.getInstance().broadcastMessage(player.getWorld(), MaplePacketCreator.serverNotice(6, "[Notice] Server is shutting down.. "
+ "Please logoff for account safety."));
int time = 60000;
if (sub[0].equals("shutdownnow")) {
time = 1;
} else if (sub.length > 1) {
time *= Integer.parseInt(sub[1]);
}
TimerManager.getInstance().schedule(Server.getInstance().shutdown(false), time);
break;
case "sql": {
final String query = Commands.joinStringFrom(sub, 1);
try {
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement(query)) {
ps.executeUpdate();
}
player.message("Done " + query);
} catch (SQLException e) {
player.message("Query Failed: " + query);
}
break;
}
case "sqlwithresult": {
String name = sub[1];
final String query = Commands.joinStringFrom(sub, 2);
try {
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement(query); ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
player.dropMessage(String.valueOf(rs.getObject(name)));
}
}
} catch (SQLException e) {
player.message("Query Failed: " + query);
}
break;
}
case "itemvac":
List<MapleMapObject> items = player.getMap().getMapObjectsInRange(player.getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM));
for (MapleMapObject item : items) {
MapleMapItem mapitem = (MapleMapItem) item;
if (!MapleInventoryManipulator.addFromDrop(c, mapitem.getItem(), true)) {
continue;
}
mapitem.setPickedUp(true);
player.getMap().broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 2, player.getId()), mapitem.getPosition());
player.getMap().removeMapObject(item);
}
break;
case "zakum":
player.getMap().spawnFakeMonsterOnGroundBelow(MapleLifeFactory.getMonster(8800000), player.getPosition());
for (int x = 8800003; x < 8800011; x++) {
player.getMap().spawnMonsterOnGroudBelow(MapleLifeFactory.getMonster(x), player.getPosition());
}
break;
case "ahelp":
case "comm":
player.dropMessage("!saveall");
player.dropMessage("!pmob mobid time");
player.dropMessage("!npc npcid");
player.dropMessage("!pnpc npcid");
player.dropMessage("!jobperson");
player.dropMessage("!playernpc charname npcid");
player.dropMessage("!setgmlevel charname level");
player.dropMessage("!shutdown time or !shutdownnow");
player.dropMessage("!sql statement");
player.dropMessage("!sqlwithresult name statement");
player.dropMessage("!zakum");
player.dropMessage("!horntail");
player.dropMessage("!pinkbean");
player.dropMessage("!packet");
player.dropMessage("!itemvac");
player.dropMessage("!warpworld");
break;
default:
player.yellowMessage("Admin Command " + heading + sub[0] + " does not exist. Use !comm or !ahelp");
break;
}
}
private static String joinStringFrom(String arr[], int start) {
StringBuilder builder = new StringBuilder();
for (int i = start; i < arr.length; i++) {
builder.append(arr[i]);
if (i != arr.length - 1) {
builder.append(" ");
}
}
return builder.toString();
}
}