/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package server.commands;
import client.*;
import client.anticheat.CheatingOffense;
import client.inventory.*;
import com.mysql.jdbc.PreparedStatement;
import constants.GameConstants;
import constants.ItemConstants;
import database.DatabaseConnection;
import handling.RecvPacketOpcode;
import handling.SendPacketOpcode;
import handling.channel.ChannelServer;
import handling.world.World;
import java.awt.Point;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
import java.util.Map.Entry;
import scripting.PortalScriptManager;
import scripting.ReactorScriptManager;
import server.*;
import server.Timer;
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.commands.InternCommand.封號;
import server.life.*;
import server.maps.*;
import server.quest.MapleQuest;
import server.shops.MapleShopFactory;
import tools.FileoutputUtil;
import tools.HexTool;
import tools.MockIOSession;
import tools.Pair;
import tools.StringUtil;
import tools.packet.CField;
import tools.packet.CField.NPCPacket;
import tools.packet.MobPacket;
import tools.packet.CWvsContext;
/**
*
* @author Emilyx3
*/
public class SuperGMCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.SUPERGM;
}
public static class 伺服器公告 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 4) {
c.getPlayer().dropMessage(6, splitted[0] + " <類型> <頻道> <內容>");
return 0;
}
for (MapleCharacter all : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
all.getClient().getChannelServer().broadcastMessage(CWvsContext.broadcastMsg(Integer.parseInt(splitted[1]), Integer.parseInt(splitted[2]), StringUtil.joinStringFrom(splitted, 3)));
}
return 1;
}
}
public static class SpecialMessage extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter all : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
all.getClient().getChannelServer().broadcastMessage(CWvsContext.getSpecialMsg(StringUtil.joinStringFrom(splitted, 2), Integer.parseInt(splitted[1]), true));
}
return 1;
}
}
public static class HideSpecialMessage extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter all : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
all.getClient().getChannelServer().broadcastMessage(CWvsContext.getSpecialMsg("", 0, false));
}
return 1;
}
}
public static class 定時更變地圖 extends CommandExecute {
@Override
public int execute(final MapleClient c, String splitted[]) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " (初始地圖ID:默認當前地圖) <更變后的地圖ID> <時間:秒>");
return 0;
}
final int map;
final int nextmap;
final int time;
if (splitted.length == 4) {
map = Integer.parseInt(splitted[1]);
nextmap = Integer.parseInt(splitted[2]);
time = Integer.parseInt(splitted[3]);
} else {
map = c.getPlayer().getMapId();
nextmap = Integer.parseInt(splitted[1]);
time = Integer.parseInt(splitted[2]);
}
c.getChannelServer().getMapFactory().getMap(map).broadcastMessage(CField.getClock(time));
c.getChannelServer().getMapFactory().getMap(map).startMapEffect("計時結束後將被傳送離開此地圖", 5120041);
EventTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
for (MapleCharacter mch : c.getChannelServer().getMapFactory().getMap(map).getCharacters()) {
if (mch == null) {
return;
} else {
mch.changeMap(nextmap, 0);
}
}
}
}, time * 1000); // seconds
return 1;
}
}
public static class 設置名稱 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <玩家新名稱>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null) {
c.getPlayer().dropMessage(0, "找不到玩家");
return 0;
}
if (c.getPlayer().getGMLevel() < 6 && !victim.isGM()) {
c.getPlayer().dropMessage(6, "沒有權限更改比自己高等級的管理員的名稱");
return 0;
}
victim.getClient().getSession().close(true);
victim.getClient().disconnect(true, false);
victim.setName(splitted[2]);
return 1;
}
}
public static class Popup extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
if (splitted.length > 1) {
StringBuilder sb = new StringBuilder();
sb.append(StringUtil.joinStringFrom(splitted, 1));
mch.dropMessage(1, sb.toString());
} else {
c.getPlayer().dropMessage(6, splitted[0] + " <內容>");
return 0;
}
}
return 1;
}
}
public static class 存檔 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
mch.saveToDB(false, false);
}
c.getPlayer().dropMessage(0, "存檔成功");
return 1;
}
}
public static class 機器人存檔 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
mch.getAndroid().saveToDb();
mch.dropMessage(0, "機器人存檔成功");
}
return 1;
}
}
public static class 匿名封號 extends 封號 {
public 匿名封號() {
hellban = true;
}
}
public static class 解匿名封號 extends 解封 {
public 解匿名封號() {
hellban = true;
}
}
public static class 解封 extends CommandExecute {
protected boolean hellban = false;
private String getCommand() {
if (hellban) {
return "解匿名封號";
} else {
return "解封";
}
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>");
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() + "] 數據庫出錯");
return 0;
} else if (ret == -1) {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] 玩家不存在");
return 0;
} else {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] 解封成功");
}
byte ret_ = MapleClient.unbanIPMacs(splitted[1]);
if (ret_ == -2) {
c.getPlayer().dropMessage(6, "[取消封IP] 數據庫出錯");
} else if (ret_ == -1) {
c.getPlayer().dropMessage(6, "[取消封IP] 玩家不存在");
} else if (ret_ == 0) {
c.getPlayer().dropMessage(6, "[取消封IP] 此玩家IP或Mac不存在");
} else if (ret_ == 1) {
c.getPlayer().dropMessage(6, "[取消封IP] IP或Mac已解封");
} else if (ret_ == 2) {
c.getPlayer().dropMessage(6, "[取消封IP] IP和Macs已解封");
}
return ret_ > 0 ? 1 : 0;
}
}
public static class 解封IP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>");
return 0;
}
byte ret = MapleClient.unbanIPMacs(splitted[1]);
if (ret == -2) {
c.getPlayer().dropMessage(6, "[取消封IP] 數據庫出錯");
} else if (ret == -1) {
c.getPlayer().dropMessage(6, "[取消封IP] 玩家不存在");
} else if (ret == 0) {
c.getPlayer().dropMessage(6, "[取消封IP] 此玩家IP或Mac不存在");
} else if (ret == 1) {
c.getPlayer().dropMessage(6, "[取消封IP] IP或Mac已解封");
} else if (ret == 2) {
c.getPlayer().dropMessage(6, "[取消封IP] IP和Macs已解封");
}
if (ret > 0) {
return 1;
}
return 0;
}
}
public static class 給予技能 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <角色名稱> <技能ID> (技能等級:默認1) (技能最高等級:默認1)");
return 0;
}
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 解封印道具 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
java.util.Map<Item, MapleInventoryType> eqs = new HashMap<>();
boolean add = false;
if (splitted.length < 2 || splitted[1].equals("全部")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.getValue()));
add = true;
//c.getSession().write(CField.updateSpecialItemUse(item, type.getType()));
}
if (add) {
eqs.put(item, type);
}
add = false;
}
}
} else if (splitted[1].equals("身上裝備")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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("裝備")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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("消耗")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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("裝飾")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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("其他")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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("特殊")) {
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.UNTRADABLE.check(item.getFlag())) {
item.setFlag((byte) (item.getFlag() - ItemFlag.UNTRADABLE.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, splitted[0] + " (道具類型:全部(空)/身上裝備/裝備/消耗/其他/裝飾/特殊)");
}
for (Entry<Item, MapleInventoryType> eq : eqs.entrySet()) {
c.getPlayer().forceReAddItem_NoUpdate(eq.getKey().copy(), eq.getValue());
}
return 1;
}
}
public static class 扔 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <道具ID> (數量:默認)");
return 0;
}
final int itemId = Integer.parseInt(splitted[1]);
final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1);
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (!ii.itemExists(itemId)) {
c.getPlayer().dropMessage(5, "此道具不存在");
} 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, quantity, (byte) 0);
}
toDrop.setGMLog(c.getPlayer().getName() + " 使用 " + splitted[0] + " 指令製作, 時間:" + FileoutputUtil.CurrentReadable_Time());
if (!c.getPlayer().isAdmin()) {
toDrop.setOwner(c.getPlayer().getName());
}
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
}
return 1;
}
}
public static class 扔道具 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <數量> <道具名稱>");
return 0;
}
final String itemName = StringUtil.joinStringFrom(splitted, 2);
final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 1, 1);
int itemId = 0;
for (Pair<Integer, String> item : MapleItemInformationProvider.getInstance().getAllItems2()) {
if (item.getRight().toLowerCase().equals(itemName.toLowerCase())) {
itemId = item.getLeft();
break;
}
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (!ii.itemExists(itemId)) {
c.getPlayer().dropMessage(5, "此道具不存在");
} else {
Item toDrop;
if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
toDrop = ii.getEquipById(itemId);
} else {
toDrop = new client.inventory.Item(itemId, (byte) 0, quantity, (byte) 0);
}
if (ItemConstants.類型.寵物(itemId)) {
MaplePet pet = MaplePet.createPet(itemId);
if (pet != null) {
toDrop.setPet(pet);
}
}
toDrop.setGMLog(c.getPlayer().getName() + " 使用 " + splitted[0] + " 指令製作, 時間:" + FileoutputUtil.CurrentReadable_Time());
if (!c.getPlayer().isAdmin()) {
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 (!ItemConstants.類型.特效戒指(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) {
}
}
}
return 1;
}
}
public static class 吸怪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
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 GiveEP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "Please enter the players name + amount you want to give.");
return 0;
}
MapleCharacter chrs = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chrs == null) {
c.getPlayer().dropMessage(6, "Make sure the player is in the correct channel.");
} else {
chrs.setEPoints(chrs.getEPoints() + Integer.parseInt(splitted[2]));
c.getPlayer().dropMessage(6, splitted[1] + " has " + chrs.getEPoints() + " epoints, after giving " + splitted[2] + ".");
}
return 1;
}
}
public static class GiveVP 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() + " VotePoints, after giving " + splitted[2] + ".");
}
return 1;
}
}
public static class 全圖說話 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 全頻說話 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 全世界說話 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 監視 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>");
return 0;
}
MapleCharacter target = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (target != null) {
if (target.getClient().isMonitored()) {
target.getClient().setMonitored(false);
c.getPlayer().dropMessage(5, "停止了對 " + target.getName() + " 的監視");
} else {
target.getClient().setMonitored(true);
c.getPlayer().dropMessage(5, "正在對 " + target.getName() + " 進行監視");
}
} else {
c.getPlayer().dropMessage(5, "在當前頻道中找不到此玩家");
return 0;
}
return 1;
}
}
public static class 重置玩家任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <任務ID>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[2])).forfeit(c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]));
return 1;
}
}
public static class 開始玩家任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 4) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <任務ID> <NPCID> (customData:默認空)");
return 0;
}
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 完成玩家任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 4) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <任務ID> <NPCID>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[2])).forceComplete(c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]), Integer.parseInt(splitted[3]));
return 1;
}
}
public static class 線程 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().contains(filter.toLowerCase())) {
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 檢測作弊行為 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
StringBuilder sb = new StringBuilder();
for (CheatingOffense co : CheatingOffense.values()) {
sb.append(co.name()).append("/");
}
c.getPlayer().dropMessage(6, splitted[0] + " <行為>");
c.getPlayer().dropMessage(6, "行為: " + sb.toString());
return 0;
}
try {
CheatingOffense co = CheatingOffense.valueOf(splitted[1]);
co.setEnabled(!co.isEnabled());
} catch (IllegalArgumentException iae) {
c.getPlayer().dropMessage(6, "作弊行為 " + splitted[1] + " 沒找到");
}
return 1;
}
}
public static class 開關喇叭 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
World.toggleMegaphoneMuteState();
c.getPlayer().dropMessage(6, "喇叭狀態 : " + (c.getChannelServer().getMegaphoneMuteState() ? "可用" : "不可用"));
return 1;
}
}
public static class 放置反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <反應堆ID>");
return 0;
}
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<>(c.getChannelServer().getAllSquads().values());
for (MapleSquad squads : squadz) {
squads.clear();
}
return 1;
}
}*/
public static class 傷OID怪物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <怪物OID> <傷害值>");
return 0;
}
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 傷全圖怪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
int damage = 0;
if (splitted.length > 2) {
int irange = Integer.parseInt(splitted[1]);
if (irange != 0) {
range = irange * irange;
}
if (splitted.length <= 2) {
damage = Integer.parseInt(splitted[2]);
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
damage = Integer.parseInt(splitted[3]);
}
} else if (splitted.length == 2) {
damage = Integer.parseInt(splitted[1]);
} else {
c.getPlayer().dropMessage(6, splitted[0] + " (<範圍:默認0全圖> (地圖ID:默認當前地圖)) <傷害值>");
return 0;
}
if (map == null) {
c.getPlayer().dropMessage(6, "地圖不存在");
return 0;
}
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 傷怪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <傷害> <怪物ID>");
return 0;
}
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 殺怪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <怪物ID>");
return 0;
}
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(), (int) mob.getHp(), false);
}
}
return 1;
}
}
public static class 清怪獲得經驗 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " (<範圍:默認0全圖> (地圖:默認當前地圖))");
}
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, "地圖不存在");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
mob.damage(c.getPlayer(), (int) mob.getHp(), false);
}
return 1;
}
}
public static class 清怪掉寶 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " (<範圍:默認0全圖> (地圖:默認當前地圖))");
}
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, "地圖不存在");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
if (!mob.getStats().isBoss() || mob.getStats().isPartyBonus() || c.getPlayer().isGM()) {
map.killMonster(mob, c.getPlayer(), true, false, (byte) 1);
}
}
return 1;
}
}
public static class 添加臨時NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <NPCID>");
return 0;
}
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, "NPCID無效");
return 0;
}
return 1;
}
}
public static class 添加NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 1) {
c.getPlayer().dropMessage(6, splitted[0] + " <NPCID>");
return 0;
}
int npcId = Integer.parseInt(splitted[1]);
MapleNPC npc = MapleLifeFactory.getNPC(npcId);
if (npc != null && !npc.getName().equals("MISSINGNO")) {
final int xpos = c.getPlayer().getPosition().x;
final int ypos = c.getPlayer().getPosition().y;
final int fh = c.getPlayer().getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId();
npc.setPosition(c.getPlayer().getPosition());
npc.setCy(ypos);
npc.setRx0(xpos);
npc.setRx1(xpos);
npc.setFh(fh);
npc.setCustom(true);
try {
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = (PreparedStatement) con.prepareStatement("INSERT INTO wz_customlife (dataid, f, hide, fh, cy, rx0, rx1, type, x, y, mid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) {
ps.setInt(1, npcId);
ps.setInt(2, 0); // 1 = right , 0 = left
ps.setInt(3, 0); // 1 = hide, 0 = show
ps.setInt(4, fh);
ps.setInt(5, ypos);
ps.setInt(6, xpos);
ps.setInt(7, xpos);
ps.setString(8, "n");
ps.setInt(9, xpos);
ps.setInt(10, ypos);
ps.setInt(11, c.getPlayer().getMapId());
ps.executeUpdate();
}
} catch (SQLException e) {
c.getPlayer().dropMessage(6, "將NPC添加到數據庫失敗");
}
c.getPlayer().getMap().addMapObject(npc);
c.getPlayer().getMap().broadcastMessage(NPCPacket.spawnNPC(npc, true));
c.getPlayer().dropMessage(6, "請不要重載此地圖, 否則伺服器重啟後NPC會消失");
} else {
c.getPlayer().dropMessage(6, "NPCID無效");
return 0;
}
return 1;
}
}
public static class 添加怪物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <怪物ID> <數量>");
return 0;
}
int mobid = Integer.parseInt(splitted[1]);
int mobTime = Integer.parseInt(splitted[2]);
MapleMonster npc;
try {
npc = MapleLifeFactory.getMonster(mobid);
} catch (RuntimeException e) {
c.getPlayer().dropMessage(5, "錯誤: " + e.getMessage());
return 0;
}
if (npc != null) {
final int xpos = c.getPlayer().getPosition().x;
final int ypos = c.getPlayer().getPosition().y;
final int fh = c.getPlayer().getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId();
npc.setPosition(c.getPlayer().getPosition());
npc.setCy(ypos);
npc.setRx0(xpos);
npc.setRx1(xpos);
npc.setFh(fh);
try {
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = (PreparedStatement) con.prepareStatement("INSERT INTO wz_customlife (dataid, f, hide, fh, cy, rx0, rx1, type, x, y, mid, mobtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) {
ps.setInt(1, mobid);
ps.setInt(2, 0); // 1 = right , 0 = left
ps.setInt(3, 0); // 1 = hide, 0 = show
ps.setInt(4, fh);
ps.setInt(5, ypos);
ps.setInt(6, xpos);
ps.setInt(7, xpos);
ps.setString(8, "m");
ps.setInt(9, xpos);
ps.setInt(10, ypos);
ps.setInt(11, c.getPlayer().getMapId());
ps.setInt(12, mobTime);
ps.executeUpdate();
}
} catch (SQLException e) {
c.getPlayer().dropMessage(6, "將怪物添加到數據庫失敗");
}
c.getPlayer().getMap().addMonsterSpawn(npc, mobTime, (byte) -1, null);
c.getPlayer().dropMessage(6, "請不要重載此地圖, 否則伺服器重啟後怪物會消失");
} else {
c.getPlayer().dropMessage(6, "怪物ID無效");
return 0;
}
return 1;
}
}
public static class 玩家NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <NPCID>");
return 0;
}
try {
c.getPlayer().dropMessage(6, "正在製作玩家NPC...");
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, "玩家不存在");
return 0;
}
PlayerNPC npc = new PlayerNPC(chhr, Integer.parseInt(splitted[2]), c.getPlayer().getMap(), c.getPlayer());
npc.addToServer();
c.getPlayer().dropMessage(6, "完成");
} catch (NumberFormatException e) {
c.getPlayer().dropMessage(6, "製作NPC失敗... : " + e.getMessage());
}
return 1;
}
}
public static class 移除玩家NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <NPCoid>");
return 0;
}
try {
c.getPlayer().dropMessage(6, "正在移除玩家NPC...");
final MapleNPC npc = c.getPlayer().getMap().getNPCByOid(Integer.parseInt(splitted[1]));
if (npc instanceof PlayerNPC) {
((PlayerNPC) npc).destroy(true);
c.getPlayer().dropMessage(6, "完成");
} else {
c.getPlayer().dropMessage(6, splitted[0] + " <NPCoid>");
}
} catch (NumberFormatException e) {
c.getPlayer().dropMessage(6, "移除NPC失敗... : " + e.getMessage());
}
return 1;
}
}
public static class 伺服器訊息 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
String outputMessage = StringUtil.joinStringFrom(splitted, 1);
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
cserv.setServerMessage(c.getWorld(), outputMessage);
}
return 1;
}
}
public static class 發送數據包 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, "請輸入數據包數據");
}
return 1;
}
}
public static class 添加數據 extends 發送數據包 {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
builder.append(StringUtil.joinStringFrom(splitted, 1));
c.getPlayer().dropMessage(6, "當前數據包數據: " + builder.toString());
} else {
c.getPlayer().dropMessage(6, "請輸入數據包數據");
}
return 1;
}
}
public static class 創建數據包 extends 發送數據包 {
@Override
public int execute(MapleClient c, String[] splitted) {
builder = new StringBuilder();
return 1;
}
}
public static class 數據包 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, "請輸入數據包數據");
}
return 1;
}
}
public static class P extends 數據包 {
}
public static class 數據包轉字符串 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
try {
c.getSession().getHandler().messageReceived(c.getSession(), CField.getPacketFromHexString(StringUtil.joinStringFrom(splitted, 1)));
} catch (Exception e) {
c.getPlayer().dropMessage(6, "錯誤: " + e);
}
} else {
c.getPlayer().dropMessage(6, "請輸入數據包數據");
}
return 1;
}
}
public static class PTS extends 數據包轉字符串 {
}
public static class 重載地圖 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <地圖ID>");
return 0;
}
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, "目標地圖的" + cserv.getChannel() + "頻道有角色在,無法重載");
return 0;
}
}
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
if (cserv.getMapFactory().isMapLoaded(mapId)) {
cserv.getMapFactory().removeMap(mapId);
}
}
return 1;
}
}
public static class 生怪 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) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <時間:秒>");
return 0;
}
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() {
@Override
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, "受害者不存在");
return 0;
}
}
}
/*public static class ReloadIPMonitor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleServerHandler.reloadLoggedIPs();
return 1;
}
}
public static class AddIPMonitor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleServerHandler.addIP(splitted[1]);
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<>(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 (Objects.equals(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 最大楓幣 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
victim.gainMeso(99999999999L - c.getPlayer().getMeso(), true);
return 1;
}
}
public static class 給予楓幣 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <金額>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
victim.gainMeso(Long.parseLong(splitted[2]), true);
return 1;
}
}
public static class 給予樂豆點 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <點數>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
victim.modifyCSPoints(1, Integer.parseInt(splitted[2]), 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 設置伺服端包頭 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <包名> <包頭值>");
return 0;
}
SendPacketOpcode.valueOf(splitted[1]).setValue(Short.parseShort(splitted[2]));
return 1;
}
}
public static class 設置用戶端包頭 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <包名> <包頭值>");
return 0;
}
RecvPacketOpcode.valueOf(splitted[1]).setValue(Short.parseShort(splitted[2]));
return 1;
}
}
public static class 重載掉寶 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMonsterInformationProvider.getInstance().clearDrops();
ReactorScriptManager.getInstance().clearDrops();
return 1;
}
}
public static class 重載傳送點 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
PortalScriptManager.getInstance().clearScripts();
return 1;
}
}
public static class 重載商店 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleShopFactory.getInstance().clear();
return 1;
}
}
public static class 重載事件 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (ChannelServer instance : ChannelServer.getAllInstances()) {
instance.reloadEvents();
}
return 1;
}
}
public static class 重置地圖 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetFully();
return 1;
}
}
public static class 重置任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <任務ID>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[1])).forfeit(c.getPlayer());
return 1;
}
}
public static class 開始任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <任務ID> <NPCID>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[1])).start(c.getPlayer(), Integer.parseInt(splitted[2]));
return 1;
}
}
public static class 完成任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 4) {
c.getPlayer().dropMessage(6, splitted[0] + " <任務ID> <NPCID> <selection>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[1])).complete(c.getPlayer(), Integer.parseInt(splitted[2]), Integer.parseInt(splitted[3]));
return 1;
}
}
public static class 開始數據任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <任務ID> <NPCID> (customData:默認空)");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[1])).forceStart(c.getPlayer(), Integer.parseInt(splitted[2]), splitted.length >= 4 ? splitted[3] : null);
return 1;
}
}
public static class 完成數據任務 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <任務ID> <NPCID>");
return 0;
}
MapleQuest.getInstance(Integer.parseInt(splitted[1])).start(c.getPlayer(), Integer.parseInt(splitted[2]));
return 1;
}
}
public static class 攻擊反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <反應堆OID>");
return 0;
}
c.getPlayer().getMap().getReactorByOid(Integer.parseInt(splitted[1])).hitReactor(c);
return 1;
}
}
public static class 攻擊腳本反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <反應堆OID>");
return 0;
}
c.getPlayer().getMap().getReactorByOid(Integer.parseInt(splitted[1])).forceHitReactor(Byte.parseByte(splitted[2]));
return 1;
}
}
public static class 破壞反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <全部/反應堆名稱>");
return 0;
}
MapleMap map = c.getPlayer().getMap();
List<MapleMapObject> reactors = map.getMapObjectsInRange(c.getPlayer().getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.REACTOR));
if (splitted[1].equals("全部")) {
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 設置反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <ReactorID>");
return 0;
}
c.getPlayer().getMap().setReactorState(Byte.parseByte(splitted[1]));
return 1;
}
}
public static class 重置反應堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetReactors();
return 1;
}
}
public static class 發送留言 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (splitted.length >= 2) {
String text = StringUtil.joinStringFrom(splitted, 1);
c.getPlayer().sendNote(victim.getName(), text);
} else {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <內容>");
return 0;
}
return 1;
}
}
public static class 給所有人發送留言 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, splitted[0] + " <內容>");
return 0;
}
return 1;
}
}
public static class 技能增益 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <技能ID> <技能等級>");
return 0;
}
SkillFactory.getSkill(Integer.parseInt(splitted[1])).getEffect(Integer.parseInt(splitted[2])).applyTo(c.getPlayer());
return 0;
}
}
public static class 道具增益 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <道具ID>");
return 0;
}
MapleItemInformationProvider.getInstance().getItemEffect(Integer.parseInt(splitted[1])).applyTo(c.getPlayer());
return 0;
}
}
public static class 道具增益EX extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <道具ID>");
return 0;
}
MapleItemInformationProvider.getInstance().getItemEffectEX(Integer.parseInt(splitted[1])).applyTo(c.getPlayer());
return 0;
}
}
public static class 取消技能增益 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dispelBuff(Integer.parseInt(splitted[1]));
return 1;
}
}
public static class 全圖技能增益 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <技能ID> <技能等級>");
return 0;
}
for (MapleCharacter mch : c.getPlayer().getMap().getCharacters()) {
SkillFactory.getSkill(Integer.parseInt(splitted[1])).getEffect(Integer.parseInt(splitted[2])).applyTo(mch);
}
return 0;
}
}
public static class 全圖道具增益 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <道具ID>");
return 0;
}
for (MapleCharacter mch : c.getPlayer().getMap().getCharacters()) {
MapleItemInformationProvider.getInstance().getItemEffect(Integer.parseInt(splitted[1])).applyTo(mch);
}
return 0;
}
}
public static class 全圖道具增益EX extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <道具ID>");
return 0;
}
for (MapleCharacter mch : c.getPlayer().getMap().getCharacters()) {
MapleItemInformationProvider.getInstance().getItemEffectEX(Integer.parseInt(splitted[1])).applyTo(mch);
}
return 0;
}
}
public static class MapItemSize extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Number of items: " + MapleItemInformationProvider.getInstance().getAllItems().size());
return 0;
}
}
public static class openUIOption extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(CField.UIPacket.openUIOption(Integer.parseInt(splitted[1]), 9010000));
return 1;
}
}
public static class openUIWindow extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getSession().write(CField.UIPacket.openUI(Integer.parseInt(splitted[1])));
return 1;
}
}
}