/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package client.messages.commands;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventoryType;
import client.messages.CommandProcessorUtil;
import client.messages.commands.InternCommand.Ban;
import client.messages.commands.InternCommand.TempBan;
import clientside.MapleCharacter;
import clientside.MapleCharacterUtil;
import clientside.MapleClient;
import clientside.MapleStat;
import clientside.Skill;
import clientside.SkillFactory;
import constants.GameConstants;
import constants.ServerConstants.PlayerGMRank;
import handling.channel.ChannelServer;
import handling.world.World;
import scripting.EventInstanceManager;
import scripting.EventManager;
import server.MapleCarnivalChallenge;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleShopFactory;
import server.life.MapleMonster;
import server.maps.MapleMap;
import tools.packet.CField;
import tools.StringUtil;
import tools.packet.CWvsContext;
import tools.packet.CWvsContext.InventoryPacket;
/**
*
* @author Emilyx3
*/
public class GMCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.GM;
}
public static class GetSkill extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
Skill skill = SkillFactory.getSkill(Integer.parseInt(splitted[1]));
byte level = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1);
byte masterlevel = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1);
if (level > skill.getMaxLevel()) {
level = (byte) skill.getMaxLevel();
}
if (masterlevel > skill.getMaxLevel()) {
masterlevel = (byte) skill.getMaxLevel();
}
c.getPlayer().changeSingleSkillLevel(skill, level, masterlevel);
return 1;
}
}
public static class ClearDrops extends CommandExecute {
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().clearDrops(c.getPlayer(), true);
return 1;
}
}
public static class Event extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getClient().getChannelServer().eventOn == false) {
int mapid = c.getPlayer().getMapId();
c.getPlayer().getClient().getChannelServer().eventOn = true;
c.getPlayer().getClient().getChannelServer().eventMap = mapid;
try {
World.Broadcast.broadcastMessage(CWvsContext.serverNotice(6, "[Event] " + c.getPlayer().getName() + " has started an Event in Channel " + c.getChannel() + ". Please type @joinevent to participate!"));
} catch (Exception ex) {
}
} else {
c.getPlayer().getClient().getChannelServer().eventOn = false;
try {
World.Broadcast.broadcastMessage(CWvsContext.serverNotice(6, "[Event] Entry to the event has been closed."));
} catch (Exception e) {
}
}
return 1;
}
}
public static class Fame extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "Syntax: !fame <player> <amount>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
int fame = 0;
try {
fame = Integer.parseInt(splitted[2]);
} catch (NumberFormatException nfe) {
c.getPlayer().dropMessage(6, "Invalid Number...");
return 0;
}
if (victim != null && player.allowedToTarget(victim)) {
victim.addFame(fame);
victim.updateSingleStat(MapleStat.FAME, victim.getFame());
}
return 1;
}
}
public static class Invincible extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (player.isInvincible()) {
player.setInvincible(false);
player.dropMessage(6, "Invincibility deactivated.");
} else {
player.setInvincible(true);
player.dropMessage(6, "Invincibility activated.");
}
return 1;
}
}
public static class SP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().setRemainingSp(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 1));
c.getPlayer().updateSingleStat(MapleStat.AVAILABLESP, 0); // we don't care the value here
return 1;
}
}
public static class Job extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (MapleCarnivalChallenge.getJobNameById(Integer.parseInt(splitted[1])).length() == 0) {
c.getPlayer().dropMessage(5, "Invalid Job");
return 0;
}
c.getPlayer().changeJob((short) Integer.parseInt(splitted[1]));
return 1;
}
}
public static class Shop extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleShopFactory shop = MapleShopFactory.getInstance();
int shopId = Integer.parseInt(splitted[1]);
if (shop.getShop(shopId) != null) {
shop.getShop(shopId).sendShop(c);
}
return 1;
}
}
public static class LevelUp extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getLevel() < 200) {
c.getPlayer().gainExp(500000000, true, false, true);
}
return 1;
}
}
public static class item 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);
if (!c.getPlayer().isAdmin()) {
for (int i : GameConstants.itemBlock) {
if (itemId == i) {
c.getPlayer().dropMessage(5, "Sorry but this item is blocked for your GM level.");
return 0;
}
}
}
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 item;
short flag = (short) ItemFlag.LOCK.getValue();
if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
item = ii.randomizeStats((Equip) ii.getEquipById(itemId));
} else {
item = new client.inventory.Item(itemId, (byte) 0, quantity, (byte) 0);
}
if (!c.getPlayer().isSuperGM()) {
item.setFlag(flag);
}
if (!c.getPlayer().isAdmin()) {
item.setOwner(c.getPlayer().getName());
item.setGMLog(c.getPlayer().getName() + " used !getitem");
}
MapleInventoryManipulator.addbyItem(c, item);
}
return 1;
}
}
public static class Level extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().setLevel(Short.parseShort(splitted[1]));
c.getPlayer().levelUp();
if (c.getPlayer().getExp() < 0) {
c.getPlayer().gainExp((int) -c.getPlayer().getExp(), false, false, true);
}
return 1;
}
}
public static class RemoveItem extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Need <name> <itemid>");
return 0;
}
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chr == null) {
c.getPlayer().dropMessage(6, "This player does not exist");
return 0;
}
chr.removeAll(Integer.parseInt(splitted[2]), false);
c.getPlayer().dropMessage(6, "All items with the ID " + splitted[2] + " has been removed from the inventory of " + splitted[1] + ".");
return 1;
}
}
public static class LockItem extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Need <name> <itemid>");
return 0;
}
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chr == null) {
c.getPlayer().dropMessage(6, "This player does not exist");
return 0;
}
int itemid = Integer.parseInt(splitted[2]);
MapleInventoryType type = GameConstants.getInventoryType(itemid);
for (Item item : chr.getInventory(type).listById(itemid)) {
item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue()));
chr.getClient().getSession().write(InventoryPacket.updateSpecialItemUse(item, type.getType(), item.getPosition(), true, chr));
}
if (type == MapleInventoryType.EQUIP) {
type = MapleInventoryType.EQUIPPED;
for (Item item : chr.getInventory(type).listById(itemid)) {
item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue()));
//chr.getClient().getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
}
c.getPlayer().dropMessage(6, "All items with the ID " + splitted[2] + " has been locked from the inventory of " + splitted[1] + ".");
return 1;
}
}
public static class KillMap extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter map : c.getPlayer().getMap().getCharactersThreadsafe()) {
if (map != null && !map.isGM()) {
map.getStat().setHp((short) 0, map);
map.getStat().setMp((short) 0, map);
map.updateSingleStat(MapleStat.HP, 0);
map.updateSingleStat(MapleStat.MP, 0);
}
}
return 1;
}
}
public static class SpeakMega extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
World.Broadcast.broadcastSmega(CWvsContext.serverNotice(3, victim == null ? c.getChannel() : victim.getClient().getChannel(), victim == null ? splitted[1] : victim.getName() + " : " + StringUtil.joinStringFrom(splitted, 2), true));
return 1;
}
}
public static class Speak extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null) {
c.getPlayer().dropMessage(5, "unable to find '" + splitted[1]);
return 0;
} else {
victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 2), victim.isGM(), 0));
}
return 1;
}
}
public static class Disease extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "!disease <type> [charname] <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL");
return 0;
}
int type = 0;
if (splitted[1].equalsIgnoreCase("SEAL")) {
type = 120;
} else if (splitted[1].equalsIgnoreCase("DARKNESS")) {
type = 121;
} else if (splitted[1].equalsIgnoreCase("WEAKEN")) {
type = 122;
} else if (splitted[1].equalsIgnoreCase("STUN")) {
type = 123;
} else if (splitted[1].equalsIgnoreCase("CURSE")) {
type = 124;
} else if (splitted[1].equalsIgnoreCase("POISON")) {
type = 125;
} else if (splitted[1].equalsIgnoreCase("SLOW")) {
type = 126;
} else if (splitted[1].equalsIgnoreCase("SEDUCE")) {
type = 128;
} else if (splitted[1].equalsIgnoreCase("REVERSE")) {
type = 132;
} else if (splitted[1].equalsIgnoreCase("ZOMBIFY")) {
type = 133;
} else if (splitted[1].equalsIgnoreCase("POTION")) {
type = 134;
} else if (splitted[1].equalsIgnoreCase("SHADOW")) {
type = 135;
} else if (splitted[1].equalsIgnoreCase("BLIND")) {
type = 136;
} else if (splitted[1].equalsIgnoreCase("FREEZE")) {
type = 137;
} else if (splitted[1].equalsIgnoreCase("POTENTIAL")) {
type = 138;
} else {
c.getPlayer().dropMessage(6, "!disease <type> [charname] <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL");
return 0;
}
if (splitted.length == 4) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[2]);
if (victim == null) {
c.getPlayer().dropMessage(5, "Not found.");
return 0;
}
victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1));
} else {
for (MapleCharacter victim : c.getPlayer().getMap().getCharactersThreadsafe()) {
victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1));
}
}
return 1;
}
}
public static class CloneMe extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().cloneLook();
return 1;
}
}
public static class DisposeClones extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, c.getPlayer().getCloneSize() + " clones disposed.");
c.getPlayer().disposeClones();
return 1;
}
}
public static class SetInstanceProperty extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
EventManager em = c.getChannelServer().getEventSM().getEventManager(splitted[1]);
if (em == null || em.getInstances().size() <= 0) {
c.getPlayer().dropMessage(5, "none");
} else {
em.setProperty(splitted[2], splitted[3]);
for (EventInstanceManager eim : em.getInstances()) {
eim.setProperty(splitted[2], splitted[3]);
}
}
return 1;
}
}
public static class ListInstanceProperty extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
EventManager em = c.getChannelServer().getEventSM().getEventManager(splitted[1]);
if (em == null || em.getInstances().size() <= 0) {
c.getPlayer().dropMessage(5, "none");
} else {
for (EventInstanceManager eim : em.getInstances()) {
c.getPlayer().dropMessage(5, "Event " + eim.getName() + ", eventManager: " + em.getName() + " iprops: " + eim.getProperty(splitted[2]) + ", eprops: " + em.getProperty(splitted[2]));
}
}
return 0;
}
}
public static class LeaveInstance extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getEventInstance() == null) {
c.getPlayer().dropMessage(5, "You are not in one");
} else {
c.getPlayer().getEventInstance().unregisterPlayer(c.getPlayer());
}
return 1;
}
}
public static class WhosThere extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
StringBuilder builder = new StringBuilder("Players on Map: ").append(c.getPlayer().getMap().getCharactersThreadsafe().size()).append(", ");
for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) {
if (builder.length() > 150) { // wild guess :o
builder.setLength(builder.length() - 2);
c.getPlayer().dropMessage(6, builder.toString());
builder = new StringBuilder();
}
builder.append(MapleCharacterUtil.makeMapleReadable(chr.getName()));
builder.append(", ");
}
builder.setLength(builder.length() - 2);
c.getPlayer().dropMessage(6, builder.toString());
return 1;
}
}
public static class StartInstance extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getEventInstance() != null) {
c.getPlayer().dropMessage(5, "You are in one");
} else if (splitted.length > 2) {
EventManager em = c.getChannelServer().getEventSM().getEventManager(splitted[1]);
if (em == null || em.getInstance(splitted[2]) == null) {
c.getPlayer().dropMessage(5, "Not exist");
} else {
em.getInstance(splitted[2]).registerPlayer(c.getPlayer());
}
} else {
c.getPlayer().dropMessage(5, "!startinstance [eventmanager] [eventinstance]");
}
return 1;
}
}
public static class ResetMobs extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().killAllMonsters(false);
return 1;
}
}
public static class KillMonsterByOID extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
int targetId = Integer.parseInt(splitted[1]);
MapleMonster monster = map.getMonsterByOid(targetId);
if (monster != null) {
map.killMonster(monster, c.getPlayer(), false, false, (byte) 1);
}
return 1;
}
}
public static class RemoveNPCs extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetNPCs();
return 1;
}
}
public static class Notice extends CommandExecute {
protected static int getNoticeType(String typestring) {
if (typestring.equals("n")) {
return 0;
} else if (typestring.equals("p")) {
return 1;
} else if (typestring.equals("l")) {
return 2;
} else if (typestring.equals("nv")) {
return 5;
} else if (typestring.equals("v")) {
return 5;
} else if (typestring.equals("b")) {
return 6;
}
return -1;
}
@Override
public int execute(MapleClient c, String[] splitted) {
int joinmod = 1;
int range = -1;
if (splitted[1].equals("m")) {
range = 0;
} else if (splitted[1].equals("c")) {
range = 1;
} else if (splitted[1].equals("w")) {
range = 2;
}
int tfrom = 2;
if (range == -1) {
range = 2;
tfrom = 1;
}
int type = getNoticeType(splitted[tfrom]);
if (type == -1) {
type = 0;
joinmod = 0;
}
StringBuilder sb = new StringBuilder();
if (splitted[tfrom].equals("nv")) {
sb.append("[Notice]");
} else {
sb.append("");
}
joinmod += tfrom;
sb.append(StringUtil.joinStringFrom(splitted, joinmod));
byte[] packet = CWvsContext.serverNotice(type, sb.toString());
if (range == 0) {
c.getPlayer().getMap().broadcastMessage(packet);
} else if (range == 1) {
ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet);
} else if (range == 2) {
World.Broadcast.broadcastMessage(packet);
}
return 1;
}
}
public static class Yellow extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
int range = -1;
if (splitted[1].equals("m")) {
range = 0;
} else if (splitted[1].equals("c")) {
range = 1;
} else if (splitted[1].equals("w")) {
range = 2;
}
if (range == -1) {
range = 2;
}
byte[] packet = CWvsContext.yellowChat((splitted[0].equals("!y") ? ("[" + c.getPlayer().getName() + "] ") : "") + StringUtil.joinStringFrom(splitted, 2));
if (range == 0) {
c.getPlayer().getMap().broadcastMessage(packet);
} else if (range == 1) {
ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet);
} else if (range == 2) {
World.Broadcast.broadcastMessage(packet);
}
return 1;
}
}
public static class Y extends Yellow {
}
public static class WhatsMyIP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(5, "IP: " + c.getSession().getRemoteAddress().toString().split(":")[0]);
return 1;
}
}
public static class TempBanIP extends TempBan {
public TempBanIP() {
ipBan = true;
}
}
public static class BanIP extends Ban {
public BanIP() {
ipBan = true;
}
}
public static class TDrops extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().toggleDrops();
return 1;
}
}
}