/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package client.messages.commands;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import client.Skill;
import client.SkillFactory;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventoryIdentifier;
import client.inventory.MapleInventoryType;
import client.inventory.MapleRing;
import client.messages.CommandProcessorUtil;
import client.messages.commands.InternCommand.Ban;
import constants.GameConstants;
import constants.ServerConstants.PlayerGMRank;
import handling.MapleServerHandler;
import handling.RecvPacketOpcode;
import handling.SendPacketOpcode;
import handling.channel.ChannelServer;
import handling.world.World;
import java.awt.Point;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Scanner;
import scripting.PortalScriptManager;
import scripting.ReactorScriptManager;
import server.Timer;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleShopFactory;
import server.MapleSquad;
import server.Randomizer;
import server.Timer.BuffTimer;
import server.Timer.CloneTimer;
import server.Timer.EtcTimer;
import server.Timer.EventTimer;
import server.Timer.MapTimer;
import server.Timer.WorldTimer;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.life.MapleMonsterInformationProvider;
import server.life.MapleMonsterStats;
import server.life.MapleNPC;
import server.life.OverrideMonsterStats;
import server.life.PlayerNPC;
import server.maps.MapleMap;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.maps.MapleReactor;
import server.maps.MapleReactorFactory;
import server.quest.MapleQuest;
import tools.HexTool;
import tools.packet.CField;
import tools.MockIOSession;
import tools.StringUtil;
import tools.packet.CField.NPCPacket;
import tools.packet.MobPacket;
/**
*
* @author Emilyx3
*/
public class SuperGMCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.SUPERGM;
}
public static class HellB extends HellBan {
}
public static class HellBan extends Ban {
public HellBan() {
hellban = true;
}
}
public static class UnHellB extends UnHellBan {
}
public static class UnHellBan extends UnBan {
public UnHellBan() {
hellban = true;
}
}
public static class UnB extends UnBan {
}
public static class UnBan extends CommandExecute {
protected boolean hellban = false;
private String getCommand() {
if (hellban) {
return "UnHellBan";
} else {
return "UnBan";
}
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "[Syntax] !" + getCommand() + " <IGN>");
return 0;
}
byte ret;
if (hellban) {
ret = MapleClient.unHellban(splitted[1]);
} else {
ret = MapleClient.unban(splitted[1]);
}
if (ret == -2) {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] SQL error.");
return 0;
} else if (ret == -1) {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] The character does not exist.");
return 0;
} else {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] Successfully unbanned!");
}
byte ret_ = MapleClient.unbanIPMacs(splitted[1]);
if (ret_ == -2) {
c.getPlayer().dropMessage(6, "[UnbanIP] SQL error.");
} else if (ret_ == -1) {
c.getPlayer().dropMessage(6, "[UnbanIP] The character does not exist.");
} else if (ret_ == 0) {
c.getPlayer().dropMessage(6, "[UnbanIP] No IP or Mac with that character exists!");
} else if (ret_ == 1) {
c.getPlayer().dropMessage(6, "[UnbanIP] IP/Mac -- one of them was found and unbanned.");
} else if (ret_ == 2) {
c.getPlayer().dropMessage(6, "[UnbanIP] Both IP and Macs were unbanned.");
}
return ret_ > 0 ? 1 : 0;
}
}
public static class UnbanIP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "[Syntax] !unbanip <IGN>");
return 0;
}
byte ret = MapleClient.unbanIPMacs(splitted[1]);
if (ret == -2) {
c.getPlayer().dropMessage(6, "[UnbanIP] SQL error.");
} else if (ret == -1) {
c.getPlayer().dropMessage(6, "[UnbanIP] The character does not exist.");
} else if (ret == 0) {
c.getPlayer().dropMessage(6, "[UnbanIP] No IP or Mac with that character exists!");
} else if (ret == 1) {
c.getPlayer().dropMessage(6, "[UnbanIP] IP/Mac -- one of them was found and unbanned.");
} else if (ret == 2) {
c.getPlayer().dropMessage(6, "[UnbanIP] Both IP and Macs were unbanned.");
}
if (ret > 0) {
return 1;
}
return 0;
}
}
public static class GiveSkill extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
Skill skill = SkillFactory.getSkill(Integer.parseInt(splitted[2]));
byte level = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1);
byte masterlevel = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 4, 1);
if (level > skill.getMaxLevel()) {
level = (byte) skill.getMaxLevel();
}
if (masterlevel > skill.getMaxLevel()) {
masterlevel = (byte) skill.getMaxLevel();
}
victim.changeSingleSkillLevel(skill, level, masterlevel);
return 1;
}
}
public static class UnlockInv extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
java.util.Map<Item, MapleInventoryType> eqs = new HashMap<Item, MapleInventoryType>();
boolean add = false;
if (splitted.length < 2 || splitted[1].equals("all")) {
for (MapleInventoryType type : MapleInventoryType.values()) {
for (Item item : c.getPlayer().getInventory(type)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, type);
}
add = false;
}
}
} else if (splitted[1].equals("eqp")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).newList()) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.EQUIP);
}
add = false;
}
} else if (splitted[1].equals("eq")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.EQUIP)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.EQUIP);
}
add = false;
}
} else if (splitted[1].equals("u")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.USE)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.USE);
}
add = false;
}
} else if (splitted[1].equals("s")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.SETUP)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.SETUP);
}
add = false;
}
} else if (splitted[1].equals("e")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.ETC)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.ETC);
}
add = false;
}
} else if (splitted[1].equals("c")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.CASH)) {
if (ItemFlag.LOCK.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.LOCK.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (ItemFlag.UNTRADEABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADEABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, MapleInventoryType.CASH);
}
add = false;
}
} else {
c.getPlayer().dropMessage(6, "[all/eqp/eq/u/s/e/c]");
}
for (Entry<Item, MapleInventoryType> eq : eqs.entrySet()) {
c.getPlayer().forceReAddItem_NoUpdate(eq.getKey().copy(), eq.getValue());
}
return 1;
}
}
public static class Drop extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final int itemId = Integer.parseInt(splitted[1]);
final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (GameConstants.isPet(itemId)) {
c.getPlayer().dropMessage(5, "Please purchase a pet from the cash shop instead.");
} else if (!ii.itemExists(itemId)) {
c.getPlayer().dropMessage(5, itemId + " does not exist");
} else {
Item toDrop;
if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
toDrop = ii.randomizeStats((Equip) ii.getEquipById(itemId));
} else {
toDrop = new client.inventory.Item(itemId, (byte) 0, (short) quantity, (byte) 0);
}
if (!c.getPlayer().isAdmin()) {
toDrop.setGMLog(c.getPlayer().getName() + " used !drop");
toDrop.setOwner(c.getPlayer().getName());
}
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
}
return 1;
}
}
public static class Marry extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Need <name> <itemid>");
return 0;
}
int itemId = Integer.parseInt(splitted[2]);
if (!GameConstants.isEffectRing(itemId)) {
c.getPlayer().dropMessage(6, "Invalid itemID.");
} else {
MapleCharacter fff = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (fff == null) {
c.getPlayer().dropMessage(6, "Player must be online");
} else {
int[] ringID = {MapleInventoryIdentifier.getInstance(), MapleInventoryIdentifier.getInstance()};
try {
MapleCharacter[] chrz = {fff, c.getPlayer()};
for (int i = 0; i < chrz.length; i++) {
Equip eq = (Equip) MapleItemInformationProvider.getInstance().getEquipById(itemId, ringID[i]);
if (eq == null) {
c.getPlayer().dropMessage(6, "Invalid itemID.");
return 0;
}
MapleInventoryManipulator.addbyItem(chrz[i].getClient(), eq.copy());
chrz[i].dropMessage(6, "Successfully married with " + chrz[i == 0 ? 1 : 0].getName());
}
MapleRing.addToDB(itemId, c.getPlayer(), fff.getName(), fff.getId(), ringID);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return 1;
}
}
public static class Vac extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (!c.getPlayer().isHidden()) {
c.getPlayer().dropMessage(6, "You can only vac monsters while in hide.");
return 0;
} else {
for (final MapleMapObject mmo : c.getPlayer().getMap().getAllMonstersThreadsafe()) {
final MapleMonster monster = (MapleMonster) mmo;
c.getPlayer().getMap().broadcastMessage(MobPacket.moveMonster(false, -1, 0, monster.getObjectId(), monster.getTruePosition(), c.getPlayer().getLastRes()));
monster.setPosition(c.getPlayer().getPosition());
}
}
return 1;
}
}
public static class GivePoint extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Need playername and amount.");
return 0;
}
MapleCharacter chrs = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chrs == null) {
c.getPlayer().dropMessage(6, "Make sure they are in the correct channel");
} else {
chrs.setPoints(chrs.getPoints() + Integer.parseInt(splitted[2]));
c.getPlayer().dropMessage(6, splitted[1] + " has " + chrs.getPoints() + " points, after giving " + splitted[2] + ".");
}
return 1;
}
}
public static class GiveVPoint extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Need playername and amount.");
return 0;
}
MapleCharacter chrs = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chrs == null) {
c.getPlayer().dropMessage(6, "Make sure they are in the correct channel");
} else {
chrs.setVPoints(chrs.getVPoints() + Integer.parseInt(splitted[2]));
c.getPlayer().dropMessage(6, splitted[1] + " has " + chrs.getVPoints() + " vpoints, after giving " + splitted[2] + ".");
}
return 1;
}
}
public static class SpeakMap extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter victim : c.getPlayer().getMap().getCharactersThreadsafe()) {
if (victim.getId() != c.getPlayer().getId()) {
victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0));
}
}
return 1;
}
}
public static class SpeakChn extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter victim : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
if (victim.getId() != c.getPlayer().getId()) {
victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0));
}
}
return 1;
}
}
public static class SpeakWorld extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter victim : cserv.getPlayerStorage().getAllCharacters()) {
if (victim.getId() != c.getPlayer().getId()) {
victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0));
}
}
}
return 1;
}
}
public static class Monitor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter target = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (target != null) {
if (target.getClient().isMonitored()) {
target.getClient().setMonitored(false);
c.getPlayer().dropMessage(5, "Not monitoring " + target.getName() + " anymore.");
} else {
target.getClient().setMonitored(true);
c.getPlayer().dropMessage(5, "Monitoring " + target.getName() + ".");
}
} else {
c.getPlayer().dropMessage(5, "Target not found on channel.");
return 0;
}
return 1;
}
}
public static class ResetOther extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[2])).forfeit(c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]));
return 1;
}
}
public static class FStartOther extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[2])).forceStart(c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]), Integer.parseInt(splitted[3]), splitted.length > 4 ? splitted[4] : null);
return 1;
}
}
public static class FCompleteOther extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[2])).forceComplete(c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]), Integer.parseInt(splitted[3]));
return 1;
}
}
public static class Threads extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
Thread[] threads = new Thread[Thread.activeCount()];
Thread.enumerate(threads);
String filter = "";
if (splitted.length > 1) {
filter = splitted[1];
}
for (int i = 0; i < threads.length; i++) {
String tstring = threads[i].toString();
if (tstring.toLowerCase().indexOf(filter.toLowerCase()) > -1) {
c.getPlayer().dropMessage(6, i + ": " + tstring);
}
}
return 1;
}
}
public static class ShowTrace extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
throw new IllegalArgumentException();
}
Thread[] threads = new Thread[Thread.activeCount()];
Thread.enumerate(threads);
Thread t = threads[Integer.parseInt(splitted[1])];
c.getPlayer().dropMessage(6, t.toString() + ":");
for (StackTraceElement elem : t.getStackTrace()) {
c.getPlayer().dropMessage(6, elem.toString());
}
return 1;
}
}
public static class TMegaphone extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
World.toggleMegaphoneMuteState();
c.getPlayer().dropMessage(6, "Megaphone state : " + (c.getChannelServer().getMegaphoneMuteState() ? "Enabled" : "Disabled"));
return 1;
}
}
public static class SReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleReactor reactor = new MapleReactor(MapleReactorFactory.getReactor(Integer.parseInt(splitted[1])), Integer.parseInt(splitted[1]));
reactor.setDelay(-1);
c.getPlayer().getMap().spawnReactorOnGroundBelow(reactor, new Point(c.getPlayer().getTruePosition().x, c.getPlayer().getTruePosition().y - 20));
return 1;
}
}
public static class ClearSquads extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final Collection<MapleSquad> squadz = new ArrayList<MapleSquad>(c.getChannelServer().getAllSquads().values());
for (MapleSquad squads : squadz) {
squads.clear();
}
return 1;
}
}
public static class HitMonsterByOID extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
int targetId = Integer.parseInt(splitted[1]);
int damage = Integer.parseInt(splitted[2]);
MapleMonster monster = map.getMonsterByOid(targetId);
if (monster != null) {
map.broadcastMessage(MobPacket.damageMonster(targetId, damage));
monster.damage(c.getPlayer(), damage, false);
}
return 1;
}
}
public static class HitAll extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
int irange = Integer.parseInt(splitted[1]);
if (splitted.length <= 2) {
range = irange * irange;
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
int damage = Integer.parseInt(splitted[1]);
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
map.broadcastMessage(MobPacket.damageMonster(mob.getObjectId(), damage));
mob.damage(c.getPlayer(), damage, false);
}
return 1;
}
}
public static class HitMonster extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
int damage = Integer.parseInt(splitted[1]);
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
if (mob.getId() == Integer.parseInt(splitted[2])) {
map.broadcastMessage(MobPacket.damageMonster(mob.getObjectId(), damage));
mob.damage(c.getPlayer(), damage, false);
}
}
return 1;
}
}
public static class KillMonster extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
if (mob.getId() == Integer.parseInt(splitted[1])) {
mob.damage(c.getPlayer(), mob.getHp(), false);
}
}
return 1;
}
}
public static class KillAllDrops extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
//&& !splitted[0].equals("!killmonster") && !splitted[0].equals("!hitmonster") && !splitted[0].equals("!hitmonsterbyoid") && !splitted[0].equals("!killmonsterbyoid")) {
int irange = Integer.parseInt(splitted[1]);
if (splitted.length <= 2) {
range = irange * irange;
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
map.killMonster(mob, c.getPlayer(), true, false, (byte) 1);
}
return 1;
}
}
public static class KillAllExp extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
//&& !splitted[0].equals("!killmonster") && !splitted[0].equals("!hitmonster") && !splitted[0].equals("!hitmonsterbyoid") && !splitted[0].equals("!killmonsterbyoid")) {
int irange = Integer.parseInt(splitted[1]);
if (splitted.length <= 2) {
range = irange * irange;
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
mob.damage(c.getPlayer(), mob.getHp(), false);
}
return 1;
}
}
public static class NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
int npcId = Integer.parseInt(splitted[1]);
MapleNPC npc = MapleLifeFactory.getNPC(npcId);
if (npc != null && !npc.getName().equals("MISSINGNO")) {
npc.setPosition(c.getPlayer().getPosition());
npc.setCy(c.getPlayer().getPosition().y);
npc.setRx0(c.getPlayer().getPosition().x + 50);
npc.setRx1(c.getPlayer().getPosition().x - 50);
npc.setFh(c.getPlayer().getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
npc.setCustom(true);
c.getPlayer().getMap().addMapObject(npc);
c.getPlayer().getMap().broadcastMessage(NPCPacket.spawnNPC(npc, true));
} else {
c.getPlayer().dropMessage(6, "You have entered an invalid Npc-Id");
return 0;
}
return 1;
}
}
public static class MakePNPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
c.getPlayer().dropMessage(6, "Making playerNPC...");
MapleCharacter chhr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chhr == null) {
c.getPlayer().dropMessage(6, splitted[1] + " is not online");
return 0;
}
PlayerNPC npc = new PlayerNPC(chhr, Integer.parseInt(splitted[2]), c.getPlayer().getMap(), c.getPlayer());
npc.addToServer();
c.getPlayer().dropMessage(6, "Done");
} catch (Exception e) {
c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage());
e.printStackTrace();
}
return 1;
}
}
public static class MakeOfflineP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
c.getPlayer().dropMessage(6, "Making playerNPC...");
MapleClient cs = new MapleClient(null, null, new MockIOSession());
MapleCharacter chhr = MapleCharacter.loadCharFromDB(MapleCharacterUtil.getIdByName(splitted[1]), cs, false);
if (chhr == null) {
c.getPlayer().dropMessage(6, splitted[1] + " does not exist");
return 0;
}
PlayerNPC npc = new PlayerNPC(chhr, Integer.parseInt(splitted[2]), c.getPlayer().getMap(), c.getPlayer());
npc.addToServer();
c.getPlayer().dropMessage(6, "Done");
} catch (Exception e) {
c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage());
e.printStackTrace();
}
return 1;
}
}
public static class DestroyPNPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
c.getPlayer().dropMessage(6, "Destroying playerNPC...");
final MapleNPC npc = c.getPlayer().getMap().getNPCByOid(Integer.parseInt(splitted[1]));
if (npc instanceof PlayerNPC) {
((PlayerNPC) npc).destroy(true);
c.getPlayer().dropMessage(6, "Done");
} else {
c.getPlayer().dropMessage(6, "!destroypnpc [objectid]");
}
} catch (Exception e) {
c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage());
e.printStackTrace();
}
return 1;
}
}
public static class ServerMessage extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
String outputMessage = StringUtil.joinStringFrom(splitted, 1);
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
cserv.setServerMessage(outputMessage);
}
return 1;
}
}
public static class Spawn extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final int mid = Integer.parseInt(splitted[1]);
final int num = Math.min(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), 500);
Integer level = CommandProcessorUtil.getNamedIntArg(splitted, 1, "lvl");
Long hp = CommandProcessorUtil.getNamedLongArg(splitted, 1, "hp");
Integer exp = CommandProcessorUtil.getNamedIntArg(splitted, 1, "exp");
Double php = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "php");
Double pexp = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "pexp");
MapleMonster onemob;
try {
onemob = MapleLifeFactory.getMonster(mid);
} catch (RuntimeException e) {
c.getPlayer().dropMessage(5, "Error: " + e.getMessage());
return 0;
}
if (onemob == null) {
c.getPlayer().dropMessage(5, "Mob does not exist");
return 0;
}
long newhp = 0;
int newexp = 0;
if (hp != null) {
newhp = hp.longValue();
} else if (php != null) {
newhp = (long) (onemob.getMobMaxHp() * (php.doubleValue() / 100));
} else {
newhp = onemob.getMobMaxHp();
}
if (exp != null) {
newexp = exp.intValue();
} else if (pexp != null) {
newexp = (int) (onemob.getMobExp() * (pexp.doubleValue() / 100));
} else {
newexp = onemob.getMobExp();
}
if (newhp < 1) {
newhp = 1;
}
final OverrideMonsterStats overrideStats = new OverrideMonsterStats(newhp, onemob.getMobMaxMp(), newexp, false);
for (int i = 0; i < num; i++) {
MapleMonster mob = MapleLifeFactory.getMonster(mid);
mob.setHp(newhp);
if (level != null) {
mob.changeLevel(level.intValue(), false);
} else {
mob.setOverrideStats(overrideStats);
}
c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition());
}
return 1;
}
}
public static class PS extends CommandExecute {
protected static StringBuilder builder = new StringBuilder();
@Override
public int execute(MapleClient c, String[] splitted) {
if (builder.length() > 1) {
c.getSession().write(CField.getPacketFromHexString(builder.toString()));
builder = new StringBuilder();
} else {
c.getPlayer().dropMessage(6, "Please enter packet data!");
}
return 1;
}
}
public static class APS extends PS {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
builder.append(StringUtil.joinStringFrom(splitted, 1));
c.getPlayer().dropMessage(6, "String is now: " + builder.toString());
} else {
c.getPlayer().dropMessage(6, "Please enter packet data!");
}
return 1;
}
}
public static class CPS extends PS {
@Override
public int execute(MapleClient c, String[] splitted) {
builder = new StringBuilder();
return 1;
}
}
public static class P extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
c.getSession().write(CField.getPacketFromHexString(StringUtil.joinStringFrom(splitted, 1)));
} else {
c.getPlayer().dropMessage(6, "Please enter packet data!");
}
return 1;
}
}
public static class Packet extends P {
}
public static class PTS extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
try {
c.getSession().getHandler().messageReceived(c.getSession(), (Object) CField.getPacketFromHexString(StringUtil.joinStringFrom(splitted, 1)));
} catch (Exception e) {
c.getPlayer().dropMessage(6, "Error: " + e);
}
} else {
c.getPlayer().dropMessage(6, "Please enter packet data!");
}
return 1;
}
}
public static class ReloadMap extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final int mapId = Integer.parseInt(splitted[1]);
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
if (cserv.getMapFactory().isMapLoaded(mapId) && cserv.getMapFactory().getMap(mapId).getCharactersSize() > 0) {
c.getPlayer().dropMessage(5, "There exists characters on channel " + cserv.getChannel());
return 0;
}
}
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
if (cserv.getMapFactory().isMapLoaded(mapId)) {
cserv.getMapFactory().removeMap(mapId);
}
}
return 1;
}
}
public static class Respawn extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().respawn(true);
return 1;
}
}
public abstract static class TestTimer extends CommandExecute {
protected Timer toTest = null;
@Override
public int execute(final MapleClient c, String[] splitted) {
final int sec = Integer.parseInt(splitted[1]);
c.getPlayer().dropMessage(5, "Message will pop up in " + sec + " seconds.");
c.getPlayer().dropMessage(5, "Active: " + toTest.getSES().getActiveCount() + " Core: " + toTest.getSES().getCorePoolSize() + " Largest: " + toTest.getSES().getLargestPoolSize() + " Max: " + toTest.getSES().getMaximumPoolSize() + " Current: " + toTest.getSES().getPoolSize() + " Status: " + toTest.getSES().isShutdown() + toTest.getSES().isTerminated() + toTest.getSES().isTerminating());
final long oldMillis = System.currentTimeMillis();
toTest.schedule(new Runnable() {
public void run() {
c.getPlayer().dropMessage(5, "Message has popped up in " + ((System.currentTimeMillis() - oldMillis) / 1000) + " seconds, expected was " + sec + " seconds");
c.getPlayer().dropMessage(5, "Active: " + toTest.getSES().getActiveCount() + " Core: " + toTest.getSES().getCorePoolSize() + " Largest: " + toTest.getSES().getLargestPoolSize() + " Max: " + toTest.getSES().getMaximumPoolSize() + " Current: " + toTest.getSES().getPoolSize() + " Status: " + toTest.getSES().isShutdown() + toTest.getSES().isTerminated() + toTest.getSES().isTerminating());
}
}, sec * 1000);
return 1;
}
}
public static class TestEventTimer extends TestTimer {
public TestEventTimer() {
toTest = EventTimer.getInstance();
}
}
public static class TestCloneTimer extends TestTimer {
public TestCloneTimer() {
toTest = CloneTimer.getInstance();
}
}
public static class TestEtcTimer extends TestTimer {
public TestEtcTimer() {
toTest = EtcTimer.getInstance();
}
}
public static class TestMapTimer extends TestTimer {
public TestMapTimer() {
toTest = MapTimer.getInstance();
}
}
public static class TestWorldTimer extends TestTimer {
public TestWorldTimer() {
toTest = WorldTimer.getInstance();
}
}
public static class TestBuffTimer extends TestTimer {
public TestBuffTimer() {
toTest = BuffTimer.getInstance();
}
}
public static class Crash extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
victim.getClient().getSession().write(HexTool.getByteArrayFromHexString("1A 00")); //give_buff with no data :D
return 1;
} else {
c.getPlayer().dropMessage(6, "The victim does not exist.");
return 0;
}
}
}
public static class Rev extends CommandExecute {
private static int revision = -1;
public static int getRevision() {
if (revision != -1) {
return revision;
} else {
InputStream svninfo = AdminCommand.class.getResourceAsStream("/all-wcprops");
if (svninfo == null) {
return revision;
}
Scanner sc = new Scanner(svninfo);
while (sc.hasNext()) {
String[] s = sc.next().split("/");
if (s.length > 1 && s[1].equals("svn")) {
revision = Integer.parseInt(s[5]);
break;
}
}
sc.close();
}
return revision;
}
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (getRevision() != -1) {
c.getPlayer().dropMessage(5, "This is revision " + revision + ".");
} else {
c.getPlayer().dropMessage(5, "Can't find revision T_T");
}
return 1;
}
}
public static class FillBook extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (int e : MapleItemInformationProvider.getInstance().getMonsterBook().keySet()) {
c.getPlayer().getMonsterBook().getCards().put(e, 2);
}
c.getPlayer().getMonsterBook().changed();
c.getPlayer().dropMessage(5, "Done.");
return 1;
}
}
public static class ListBook extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final List<Entry<Integer, Integer>> mbList = new ArrayList<Entry<Integer, Integer>>(MapleItemInformationProvider.getInstance().getMonsterBook().entrySet());
Collections.sort(mbList, new BookComparator());
final int page = Integer.parseInt(splitted[1]);
for (int e = (page * 8); e < Math.min(mbList.size(), (page + 1) * 8); e++) {
c.getPlayer().dropMessage(6, e + ": " + mbList.get(e).getKey() + " - " + mbList.get(e).getValue());
}
return 0;
}
public static class BookComparator implements Comparator<Entry<Integer, Integer>>, Serializable {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
if (o1.getValue() > o2.getValue()) {
return 1;
} else if (o1.getValue() == o2.getValue()) {
return 0;
} else {
return -1;
}
}
}
}
public static class Subcategory extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().setSubcategory(Byte.parseByte(splitted[1]));
return 1;
}
}
public static class GainMeso extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().gainMeso(Integer.MAX_VALUE - c.getPlayer().getMeso(), true);
return 1;
}
}
public static class GainCash extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(5, "Need amount.");
return 0;
}
c.getPlayer().modifyCSPoints(1, Integer.parseInt(splitted[1]), true);
return 1;
}
}
public static class GainMP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(5, "Need amount.");
return 0;
}
c.getPlayer().modifyCSPoints(2, Integer.parseInt(splitted[1]), true);
return 1;
}
}
public static class GainP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(5, "Need amount.");
return 0;
}
c.getPlayer().setPoints(c.getPlayer().getPoints() + Integer.parseInt(splitted[1]));
return 1;
}
}
public static class GainVP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(5, "Need amount.");
return 0;
}
c.getPlayer().setVPoints(c.getPlayer().getVPoints() + Integer.parseInt(splitted[1]));
return 1;
}
}
public static class ReloadDrops extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMonsterInformationProvider.getInstance().clearDrops();
ReactorScriptManager.getInstance().clearDrops();
return 1;
}
}
public static class ReloadPortal extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
PortalScriptManager.getInstance().clearScripts();
return 1;
}
}
public static class ReloadShops extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleShopFactory.getInstance().clear();
return 1;
}
}
public static class ReloadEvents extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (ChannelServer instance : ChannelServer.getAllInstances()) {
instance.reloadEvents();
}
return 1;
}
}
public static class ResetMap extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetFully();
return 1;
}
}
public static class ResetQuest extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[1])).forfeit(c.getPlayer());
return 1;
}
}
public static class StartQuest extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[1])).start(c.getPlayer(), Integer.parseInt(splitted[2]));
return 1;
}
}
public static class CompleteQuest extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[1])).complete(c.getPlayer(), Integer.parseInt(splitted[2]), Integer.parseInt(splitted[3]));
return 1;
}
}
public static class FStartQuest extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[1])).forceStart(c.getPlayer(), Integer.parseInt(splitted[2]), splitted.length >= 4 ? splitted[3] : null);
return 1;
}
}
public static class FCompleteQuest extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleQuest.getInstance(Integer.parseInt(splitted[1])).forceComplete(c.getPlayer(), Integer.parseInt(splitted[2]));
return 1;
}
}
public static class HReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().getReactorByOid(Integer.parseInt(splitted[1])).hitReactor(c);
return 1;
}
}
public static class FHReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().getReactorByOid(Integer.parseInt(splitted[1])).forceHitReactor(Byte.parseByte(splitted[2]));
return 1;
}
}
public static class DReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
List<MapleMapObject> reactors = map.getMapObjectsInRange(c.getPlayer().getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.REACTOR));
if (splitted[1].equals("all")) {
for (MapleMapObject reactorL : reactors) {
MapleReactor reactor2l = (MapleReactor) reactorL;
c.getPlayer().getMap().destroyReactor(reactor2l.getObjectId());
}
} else {
c.getPlayer().getMap().destroyReactor(Integer.parseInt(splitted[1]));
}
return 1;
}
}
public static class SetReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().setReactorState(Byte.parseByte(splitted[1]));
return 1;
}
}
public static class ResetReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetReactors();
return 1;
}
}
public static class SendAllNote extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length >= 1) {
String text = StringUtil.joinStringFrom(splitted, 1);
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
c.getPlayer().sendNote(mch.getName(), text);
}
} else {
c.getPlayer().dropMessage(6, "Use it like this, !sendallnote <text>");
return 0;
}
return 1;
}
}
public static class BuffSkill extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
SkillFactory.getSkill(Integer.parseInt(splitted[1])).getEffect(Integer.parseInt(splitted[2])).applyTo(c.getPlayer());
return 0;
}
}
public static class BuffItem extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleItemInformationProvider.getInstance().getItemEffect(Integer.parseInt(splitted[1])).applyTo(c.getPlayer());
return 0;
}
}
public static class BuffItemEX extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleItemInformationProvider.getInstance().getItemEffectEX(Integer.parseInt(splitted[1])).applyTo(c.getPlayer());
return 0;
}
}
public static class ItemSize extends CommandExecute { //test
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Number of items: " + MapleItemInformationProvider.getInstance().getAllItems().size());
return 0;
}
}
}