package server.commands;
import client.MapleCharacter;
import client.MapleClient;
import client.SkillFactory;
import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import constants.EventConstants;
import constants.GameConstants;
import constants.ServerConstants;
import constants.ServerConstants.PlayerGMRank;
import custom.LoadPacket;
import database.DatabaseConnection;
import handling.cashshop.CashShopServer;
import handling.channel.ChannelServer;
import handling.login.handler.AutoRegister;
import handling.world.CharacterTransfer;
import handling.world.MapleMessengerCharacter;
import handling.world.PlayerBuffStorage;
import handling.world.World;
import java.awt.Color;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MaplePortal;
import server.Randomizer;
import server.ShutdownServer;
import server.Timer.EventTimer;
import server.Timer.WorldTimer;
import tools.HexTool;
import tools.StringUtil;
import tools.packet.CField;
import tools.packet.CField.NPCPacket;
import tools.packet.CWvsContext;
import tools.packet.PetPacket;
public class AdminCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.ADMIN;
}
public static class UpdatePet extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MaplePet pet = c.getPlayer().getPet(0);
if (pet == null) {
return 0;
}
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PetPacket.petColor(c.getPlayer().getId(), (byte) 0, Color.yellow.getAlpha()), true);
return 1;
}
}
public static class DamageBuff extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
SkillFactory.getSkill(9101003).getEffect(1).applyTo(c.getPlayer());
return 1;
}
}
public static class MagicWheel extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
List<Integer> items = new LinkedList();
for (int i = 1; i <= 10; i++) {
try {
items.add(Integer.parseInt(splitted[i]));
} catch (NumberFormatException ex) {
items.add(GameConstants.eventRareReward[GameConstants.eventRareReward.length]);
}
}
int end = Randomizer.nextInt(10);
String data = "Magic Wheel";
c.getPlayer().setWheelItem(items.get(end));
c.getSession().write(CWvsContext.magicWheel((byte) 3, items, data, end));
return 1;
}
}
public static class UnsealItem extends CommandExecute {
@Override
public int execute(final MapleClient c, String[] splitted) {
short slot = Short.parseShort(splitted[1]);
Item item = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
if (item == null) {
return 0;
}
final int itemId = item.getItemId();
Integer[] itemArray = {1002140, 1302000, 1302001,
1302002, 1302003, 1302004, 1302005, 1302006,
1302007};
final List<Integer> items = Arrays.asList(itemArray);
c.getSession().write(CField.sendSealedBox(slot, 2028162, items)); //sealed box
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
WorldTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
MapleInventoryManipulator.removeById(c, GameConstants.getInventoryType(itemId), itemId, 1, false, false);
Item item = ii.getEquipById(items.get(Randomizer.nextInt(items.size())));
MapleInventoryManipulator.addbyItem(c, item);
c.getSession().write(CField.unsealBox(item.getItemId()));
c.getSession().write(CField.EffectPacket.showRewardItemAnimation(2028162, "")); //sealed box
}
}, 10000);
return 1;
}
}
public static class CutScene extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(NPCPacket.getCutSceneSkip());
return 1;
}
}
public static class DemonJob extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(NPCPacket.getDemonSelection());
return 1;
}
}
public static class CPacket extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(LoadPacket.getPacket());
return 1;
}
}
public static class NearestPortal extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MaplePortal portal = c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition());
c.getPlayer().dropMessage(6, portal.getName() + " id: " + portal.getId() + " script: " + portal.getScriptName());
return 1;
}
}
public static class Uptime extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Server has been up for " + StringUtil.getReadableMillis(ChannelServer.serverStartTime, System.currentTimeMillis()));
return 1;
}
}
public static class Reward extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
chr.addReward(Integer.parseInt(splitted[2]), Integer.parseInt(splitted[3]), Integer.parseInt(splitted[4]), Integer.parseInt(splitted[5]), Integer.parseInt(splitted[6]), StringUtil.joinStringFrom(splitted, 7));
chr.updateReward();
return 1;
}
}
public static class GMPerson extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]).setGM(Byte.parseByte(splitted[2]));
return 1;
}
}
public static class ToggleMultiLevel extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
ServerConstants.MultiLevel = !ServerConstants.MultiLevel;
return 1;
}
}
public static class DoubleTime extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
EventConstants.DoubleTime = !EventConstants.DoubleTime;
//if (EventConstants.DoubleMiracleTime) {
World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(4, "It's Miracle Time! Between 2:00 PM and 4:00 PM (Pacific) today, Miracle, Premium, Revolutionary Miracle, Super Miracle, Enlightening Miracle and Carved Slot Miracle Cubes have increased chances to raise your item to the next potential tier!"));
//}
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) {
mch.dropMessage(0, "Double Time Event has " + (EventConstants.DoubleTime ? "began!" : "ended"));
}
}
return 1;
}
}
public static class DoubleMiracleTime extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
EventConstants.DoubleMiracleTime = !EventConstants.DoubleMiracleTime;
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) {
mch.dropMessage(0, "Double Miracle Time Event has " + (EventConstants.DoubleMiracleTime ? "began!" : "ended"));
}
}
return 1;
}
}
public static class WarpCashShop extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
MapleClient client = chr.getClient();
final ChannelServer ch = ChannelServer.getInstance(client.getChannel());
chr.changeRemoval();
if (chr.getMessenger() != null) {
MapleMessengerCharacter messengerplayer = new MapleMessengerCharacter(chr);
World.Messenger.leaveMessenger(chr.getMessenger().getId(), messengerplayer);
}
PlayerBuffStorage.addBuffsToStorage(chr.getId(), chr.getAllBuffs());
PlayerBuffStorage.addCooldownsToStorage(chr.getId(), chr.getCooldowns());
PlayerBuffStorage.addDiseaseToStorage(chr.getId(), chr.getAllDiseases());
World.ChannelChange_Data(new CharacterTransfer(chr), chr.getId(), -10);
ch.removePlayer(chr);
client.updateLoginState(MapleClient.CHANGE_CHANNEL, client.getSessionIPAddress());
chr.saveToDB(false, false);
chr.getMap().removePlayer(chr);
client.getSession().write(CField.getChannelChange(client, Integer.parseInt(CashShopServer.getIP().split(":")[1])));
client.setPlayer(null);
client.setReceiving(false);
return 1;
}
}
public static class TestDirection extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(CField.UIPacket.getDirectionInfo(StringUtil.joinStringFrom(splitted, 5), Integer.parseInt(splitted[1]), Integer.parseInt(splitted[2]), Integer.parseInt(splitted[3]), Integer.parseInt(splitted[4]), Integer.parseInt(splitted[5])));
return 1;
}
}
public static class ToggleAutoRegister extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
AutoRegister.autoRegister = !AutoRegister.autoRegister;
c.getPlayer().dropMessage(0, "Auto Register has been " + (AutoRegister.autoRegister ? "enabled" : "disabled") + ".");
System.out.println("Auto Register has been " + (AutoRegister.autoRegister ? "enabled" : "disabled") + ".");
return 1;
}
}
public static class Packet extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(HexTool.getByteArrayFromHexString(StringUtil.joinStringFrom(splitted, 1)));
return 1;
}
}
public static class StripEveryone extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
ChannelServer cs = c.getChannelServer();
for (MapleCharacter mchr : cs.getPlayerStorage().getAllCharacters()) {
if (c.getPlayer().isGM()) {
continue;
}
MapleInventory equipped = mchr.getInventory(MapleInventoryType.EQUIPPED);
MapleInventory equip = mchr.getInventory(MapleInventoryType.EQUIP);
List<Short> ids = new ArrayList<>();
for (Item item : equipped.newList()) {
ids.add(item.getPosition());
}
for (short id : ids) {
MapleInventoryManipulator.unequip(mchr.getClient(), id, equip.getNextFreeSlot());
}
}
return 1;
}
}
public static class Strip extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
MapleInventory equipped = victim.getInventory(MapleInventoryType.EQUIPPED);
MapleInventory equip = victim.getInventory(MapleInventoryType.EQUIP);
List<Short> ids = new ArrayList<>();
for (Item item : equipped.newList()) {
ids.add(item.getPosition());
}
for (short id : ids) {
MapleInventoryManipulator.unequip(victim.getClient(), id, equip.getNextFreeSlot());
}
boolean notice = false;
if (splitted.length > 1) {
notice = true;
}
if (notice) {
World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(0, victim.getName() + " has been stripped by " + c.getPlayer().getName()));
}
return 1;
}
}
public static class MesoEveryone extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) {
mch.gainMeso(Integer.parseInt(splitted[1]), true);
}
}
return 1;
}
}
public static class ScheduleHotTime extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 1) {
c.getPlayer().dropMessage(0, "!ScheduleHotTime <Item Id>");
return 0;
}
if (!MapleItemInformationProvider.getInstance().itemExists(Integer.parseInt(splitted[1]))) {
c.getPlayer().dropMessage(0, "Item does not exists.");
return 0;
}
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) {
if (c.canClickNPC()) {
mch.gainItem(Integer.parseInt(splitted[1]), 1);
mch.getClient().getSession().write(CField.NPCPacket.getNPCTalk(9010010, (byte) 0, "You got the #t" + Integer.parseInt(splitted[1]) + "#, right? Click it to see what's inside. Go ahead and check your item inventory now, if you're curious.", "00 00", (byte) 1, 9010010));
}
}
}
System.out.println("Hot Time had been scheduled successfully.");
return 1;
}
}
public static class WarpAllHere extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
if (mch.getMapId() != c.getPlayer().getMapId()) {
mch.changeMap(c.getPlayer().getMap(), c.getPlayer().getPosition());
}
}
return 1;
}
}
public static class DCAll extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
int range = -1;
switch (splitted[1]) {
case "m":
range = 0;
break;
case "c":
range = 1;
break;
case "w":
range = 2;
break;
}
if (range == -1) {
range = 1;
}
if (range == 0) {
c.getPlayer().getMap().disconnectAll();
} else if (range == 1) {
c.getChannelServer().getPlayerStorage().disconnectAll(true);
} else if (range == 2) {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
cserv.getPlayerStorage().disconnectAll(true);
}
}
return 1;
}
}
public static class Shutdown extends CommandExecute {
protected static Thread t = null;
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Shutting down...");
if (t == null || !t.isAlive()) {
t = new Thread(ShutdownServer.getInstance());
ShutdownServer.getInstance().shutdown();
t.start();
} else {
c.getPlayer().dropMessage(6, "A shutdown thread is already in progress or shutdown has not been done. Please wait.");
}
return 1;
}
}
public static class ShutdownTime extends Shutdown {
private static ScheduledFuture<?> ts = null;
private int minutesLeft = 0;
@Override
public int execute(MapleClient c, String[] splitted) {
minutesLeft = Integer.parseInt(splitted[1]);
c.getPlayer().dropMessage(6, "Shutting down... in " + minutesLeft + " minutes");
if (ts == null && (t == null || !t.isAlive())) {
t = new Thread(ShutdownServer.getInstance());
ts = EventTimer.getInstance().register(new Runnable() {
@Override
public void run() {
if (minutesLeft == 0) {
ShutdownServer.getInstance().shutdown();
t.start();
ts.cancel(false);
return;
}
World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(0, "The server will shutdown in " + minutesLeft + " minutes. Please log off safely."));
minutesLeft--;
}
}, 60000);
} else {
c.getPlayer().dropMessage(6, "A shutdown thread is already in progress or shutdown has not been done. Please wait.");
}
return 1;
}
}
public static class Sql extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
Connection con = (Connection) DatabaseConnection.getConnection();
PreparedStatement ps = (PreparedStatement) con.prepareStatement(StringUtil.joinStringFrom(splitted, 1));
ps.executeUpdate();
} catch (SQLException e) {
c.getPlayer().dropMessage(0, "Failed to execute SQL command.");
return 0;
}
return 1;
}
}
}