package client.messages.commands;
import client.*;
import client.inventory.*;
import client.messages.CommandProcessorUtil;
import client.messages.PlayerGMRank;
import constants.GameConstants;
import constants.ItemConstants;
import handling.channel.ChannelServer;
import handling.world.WorldBroadcastService;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import scripting.event.EventManager;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MaplePortal;
import server.events.MapleEvent;
import server.events.MapleEventType;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.life.MapleMonsterInformationProvider;
import server.life.MapleNPC;
import server.life.OverrideMonsterStats;
import server.maps.MapleMap;
import server.maps.MapleMapObject;
import server.maps.MapleReactor;
import server.quest.MapleQuest;
import server.shop.MapleShopFactory;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.StringUtil;
/**
*
* @author Emilyx3
*/
public class GMCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.GM;
}
public static class 给予宠物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 7) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名字> <宠物ID> <宠物名称> <宠物等级> <宠物亲密度> <宠物饥饿感>");
return 0;
}
MapleCharacter petowner = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
int id = Integer.parseInt(splitted[2]);
String name = splitted[3];
int level = Integer.parseInt(splitted[4]);
int closeness = Integer.parseInt(splitted[5]);
int fullness = Integer.parseInt(splitted[6]);
long period = 20000;
short flags = MapleItemInformationProvider.getInstance().getPetFlagInfo(id);
if (id >= 5001000 || id < 5000000) {
c.getPlayer().dropMessage(5, "宠物ID错误");
return 0;
}
if (level > 30) {
level = 30;
}
if (closeness > 30000) {
closeness = 30000;
}
if (fullness > 100) {
fullness = 100;
}
if (level < 1) {
level = 1;
}
if (closeness < 0) {
closeness = 0;
}
if (fullness < 0) {
fullness = 0;
}
try {
MapleInventoryManipulator.addById(petowner.getClient(), id, (short) 1, "", MaplePet.createPet(id, name, level, closeness, fullness, MapleInventoryIdentifier.getInstance(), id == 5000054 ? (int) period : 0, flags, 0), 45, null);
} catch (NullPointerException ex) {
}
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;
}
MapleShopFactory.getInstance().getShop(Integer.parseInt(splitted[1]));
return 1;
}
}
public static class 清扫地面 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().removeDrops();
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> (技能等级:默认1) (技能最高等级:默认1)");
return 0;
}
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 增加人气 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名字> <数量>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
int fame;
try {
fame = Integer.parseInt(splitted[2]);
} catch (NumberFormatException nfe) {
c.getPlayer().dropMessage(5, "数量无效...");
return 0;
}
if (victim != null && player.allowedToTarget(victim)) {
victim.addFame(fame);
victim.updateSingleStat(MapleStat.人气, victim.getFame());
}
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;
}
c.getPlayer().setRemainingSp(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 1));
c.getPlayer().updateSingleStat(MapleStat.AVAILABLESP, 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] + " <职业ID>");
return 0;
}
int jobid = Integer.parseInt(splitted[1]);
if (!MapleJob.isExist(jobid)) {
c.getPlayer().dropMessage(5, "职业ID无效");
return 0;
}
c.getPlayer().changeJob((short) jobid, true);
c.getPlayer().setSubcategory(c.getPlayer().getSubcategory());
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;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (!MapleJob.isExist(Integer.parseInt(splitted[2]))) {
c.getPlayer().dropMessage(5, "职业ID无效");
return 0;
}
victim.changeJob((short) Integer.parseInt(splitted[2]), true);
c.getPlayer().setSubcategory(c.getPlayer().getSubcategory());
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;
}
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 升级 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().levelUp();
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;
}
//for (int i = 0; i < Integer.parseInt(splitted[1]) - c.getPlayer().getLevel(); i++) {
while (c.getPlayer().getLevel() < Integer.parseInt(splitted[1])) {
if (c.getPlayer().getLevel() < 255) {
c.getPlayer().levelUp();
}
}
//}
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]);
//for (int i = 0; i < Integer.parseInt(splitted[2]) - victim.getLevel(); i++) {
while (victim.getLevel() < Integer.parseInt(splitted[2])) {
if (victim.getLevel() < 255) {
victim.levelUp();
}
}
//}
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);
if (!c.getPlayer().isAdmin()) {
for (int i : GameConstants.itemBlock) {
if (itemId == i) {
c.getPlayer().dropMessage(5, "你的管理员等级没有制作该物品的权限");
return 0;
}
}
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (!ii.itemExists(itemId)) {
c.getPlayer().dropMessage(5, "物品(ID:" + itemId + ")不存在");
} else {
if (itemId < 5001000 && itemId >= 5000000) {
MapleInventoryManipulator.addById(c, itemId, (short) 1, "", MaplePet.createPet(itemId, MapleInventoryIdentifier.getInstance()), 45, c.getPlayer().getName() + " 使用 " + splitted[0] + " 命令制作");
return 1;
}
Item item;
short flag = (short) ItemFlag.封印.getValue();
if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) {
item = ii.getEquipById(itemId);
} else {
item = new Item(itemId, (byte) 0, quantity, (byte) 0);
}
if (!c.getPlayer().isSuperGM()) {
item.setFlag(flag);
}
item.setOwner(c.getPlayer().getName());
item.setGMLog(c.getPlayer().getName() + " 使用 " + splitted[0] + " 命令制作");
MapleInventoryManipulator.addbyItem(c, item);
}
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;
}
c.getPlayer().setLevel(Short.parseShort(splitted[1]));
c.getPlayer().updateSingleStat(MapleStat.等级, Integer.parseInt(splitted[1]));
c.getPlayer().setExp(0);
c.getPlayer().levelUp();
/*if (c.getPlayer().getExp() < 0L) {
c.getPlayer().gainExp(-(int) c.getPlayer().getExp(), false, false, 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.setLevel(Short.parseShort(splitted[2]));
victim.updateSingleStat(MapleStat.等级, Integer.parseInt(splitted[2]));
victim.setExp(0);
c.getPlayer().levelUp();
/*if (victim.getExp() < 0L) {
victim.gainExp(-(int) c.getPlayer().getExp(), false, false, true);
}*/
return 1;
}
}
public static class 设置事件 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleEvent.onStartEvent(c.getPlayer());
return 1;
}
}
public static class 开始事件 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getChannelServer().getEvent() == c.getPlayer().getMapId()) {
MapleEvent.setEvent(c.getChannelServer(), false);
c.getPlayer().dropMessage(5, "Started the event and closed off");
return 1;
} else {
c.getPlayer().dropMessage(5, "该命令必须在事件地图才能使用。");
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] + " <脚本名>");
return 0;
}
final MapleEventType type = MapleEventType.getByString(splitted[1]);
if (type == null) {
final StringBuilder sb = new StringBuilder("Wrong syntax: ");
for (MapleEventType t : MapleEventType.values()) {
sb.append(t.name()).append(",");
}
c.getPlayer().dropMessage(5, sb.toString().substring(0, sb.toString().length() - 1));
return 0;
}
final String msg = MapleEvent.scheduleEvent(type, c.getChannelServer());
if (msg.length() > 0) {
c.getPlayer().dropMessage(5, msg);
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;
}
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chr == null) {
c.getPlayer().dropMessage(6, "玩家不存在");
return 0;
}
chr.removeAll(Integer.parseInt(splitted[2]), false, false);
c.getPlayer().dropMessage(6, "玩家 " + splitted[1] + " 所有的物品(ID:" + 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;
}
World.Broadcast.broadcastSmega(MaplePacketCreator.broadcastMsg(3, c.getPlayer() == null ? c.getChannel() : c.getPlayer().getClient().getChannel(), c.getPlayer() == null ? c.getPlayer().getName() : c.getPlayer().getName() + " : " + StringUtil.joinStringFrom(splitted, 1), true));
/*if (splitted.length < 2) {
c.getPlayer().dropMessage(0, "!smega <itemid> <message>");
return 0;
}
final List<String> lines = new LinkedList<>();
for (int i = 0; i < 4; i++) {
final String text = StringUtil.joinStringFrom(splitted, 2);
if (text.length() > 55) {
continue;
}
lines.add(text);
}
final boolean ear = true;
World.Broadcast.broadcastSmega(MaplePacketCreator.getAvatarMega(c.getPlayer(), c.getChannel(), Integer.parseInt(splitted[1]), lines, ear)); */
/*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(5, "找不到玩家:" + splitted[1]);
return 0;
}
World.Broadcast.broadcastSmega(MaplePacketCreator.broadcastMsg(3, victim.getClient().getChannel(), victim.getName() + " : " + StringUtil.joinStringFrom(splitted, 2), true));
*//*
if (splitted.length < 2) {
c.getPlayer().dropMessage(0, "!smega <itemid> <victim> <message>");
return 0;
}
final List<String> lines = new LinkedList<>();
for (int i = 0; i < 4; i++) {
final String text = StringUtil.joinStringFrom(splitted, 3);
if (text.length() > 55) {
continue;
}
lines.add(text);
}
final boolean ear = true;
World.Broadcast.broadcastSmega(MaplePacketCreator.getAvatarMega(victim, victim.getClient().getChannel(), Integer.parseInt(splitted[1]), lines, ear));
*/
/*return 1;
}
}*/
public static class 说话 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
if (mch == null) {
return 0;
} else {
mch.getMap().broadcastMessage(MaplePacketCreator.getChatText(mch.getId(), StringUtil.joinStringFrom(splitted, 1), mch.isGM(), 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] + " <玩家名字> <内容>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null) {
c.getPlayer().dropMessage(5, "找不到玩家:" + splitted[1]);
return 0;
} else {
victim.getMap().broadcastMessage(MaplePacketCreator.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 2), victim.isGM(), 0));
}
return 1;
}
}
public static class 给予地图状态 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
boolean 返回 = false;
int type = 0;
if (splitted.length < 2) {
返回 = true;
} else if (splitted[1].equalsIgnoreCase("封印")) {
type = 120;
} else if (splitted[1].equalsIgnoreCase("黑暗")) {
type = 121;
} else if (splitted[1].equalsIgnoreCase("虚弱")) {
type = 122;
} else if (splitted[1].equalsIgnoreCase("昏迷")) {
type = 123;
} else if (splitted[1].equalsIgnoreCase("诅咒")) {
type = 124;
} else if (splitted[1].equalsIgnoreCase("中毒")) {
type = 125;
} else if (splitted[1].equalsIgnoreCase("缓慢")) {
type = 126;
} else if (splitted[1].equalsIgnoreCase("诱惑")) { //24, 289 and 29 are cool.
type = 128;
} else if (splitted[1].equalsIgnoreCase("反向")) {
type = 132;
} else if (splitted[1].equalsIgnoreCase("不死化")) {
type = 133;
} else if (splitted[1].equalsIgnoreCase("无法使用药水")) {
type = 134;
} else if (splitted[1].equalsIgnoreCase("SHADOW")) {
type = 135;
} else if (splitted[1].equalsIgnoreCase("致盲")) {
type = 136;
} else if (splitted[1].equalsIgnoreCase("FREEZE")) {
type = 137;
} else if (splitted[1].equalsIgnoreCase("POTENTIAL")) {
type = 138;
} else if (splitted[1].equalsIgnoreCase("变身")) {
type = 172;
} else if (splitted[1].equalsIgnoreCase("龙卷风")) {
type = 173;
} else if (splitted[1].equalsIgnoreCase("旗帜")) {
type = 799;
} else {
返回 = true;
}
if (返回) {
c.getPlayer().dropMessage(6, splitted[0] + " <类型> (等级:默认1) where 类型 = 封印/黑暗/虚弱/昏迷/诅咒/中毒/缓慢/诱惑/反向/不死化/无法使用药水/SHADOW/致盲/FREEZE/POTENTIAL/变身/龙卷风/旗帜");
return 0;
}
for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
if (mch.getMapId() == c.getPlayer().getMapId()) {
if (mch == null) {
c.getPlayer().dropMessage(5, "未找到");
return 0;
}
mch.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1));
}
}
return 1;
}
}
public static class 给予状态 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
boolean 返回 = false;
int type = 0;
if (splitted.length < 3) {
返回 = true;
} else if (splitted[2].equalsIgnoreCase("封印")) {
type = 120;
} else if (splitted[2].equalsIgnoreCase("黑暗")) {
type = 121;
} else if (splitted[2].equalsIgnoreCase("虚弱")) {
type = 122;
} else if (splitted[2].equalsIgnoreCase("昏迷")) {
type = 123;
} else if (splitted[2].equalsIgnoreCase("诅咒")) {
type = 124;
} else if (splitted[2].equalsIgnoreCase("中毒")) {
type = 125;
} else if (splitted[2].equalsIgnoreCase("缓慢")) {
type = 126;
} else if (splitted[2].equalsIgnoreCase("诱惑")) { //24, 289 and 29 are cool.
type = 128;
} else if (splitted[2].equalsIgnoreCase("反向")) {
type = 132;
} else if (splitted[2].equalsIgnoreCase("不死化")) {
type = 133;
} else if (splitted[2].equalsIgnoreCase("无法使用药水")) {
type = 134;
} else if (splitted[2].equalsIgnoreCase("SHADOW")) {
type = 135;
} else if (splitted[2].equalsIgnoreCase("致盲")) {
type = 136;
} else if (splitted[2].equalsIgnoreCase("FREEZE")) {
type = 137;
} else if (splitted[2].equalsIgnoreCase("DISABLE_POTENTIAL")) {
type = 138;
} else if (splitted[2].equalsIgnoreCase("变身")) {
type = 172;
} else if (splitted[2].equalsIgnoreCase("龙卷风")) {
type = 173;
} else if (splitted[2].equalsIgnoreCase("旗帜")) {
type = 799;
} else {
返回 = true;
}
if (返回) {
c.getPlayer().dropMessage(6, splitted[0] + " <玩家名字> <类型> (等级:默认1) where 类型 = 封印/黑暗/虚弱/昏迷/诅咒/中毒/缓慢/诱惑/反向/不死化/无法使用药水/SHADOW/致盲/FREEZE/DISABLE_POTENTIAL/变身/龙卷风/旗帜");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null) {
c.getPlayer().dropMessage(5, "未找到");
return 0;
}
victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1));
return 1;
}
}
/*public static class 克隆我 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().cloneLook();
return 1;
}
}
public static class 清除克隆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, c.getPlayer().getCloneSize() + "个克隆人被清除了");
c.getPlayer().disposeClones();
return 1;
}
}*/
/*public static class 设置事件实例属性 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, "事件实例不存在。");
} else {
em.setProperty(splitted[2], splitted[3]);
for (EventInstanceManager eim : em.getInstances()) {
eim.setProperty(splitted[2], splitted[3]);
}
}
return 1;
}
}
public static class 事件实例属性 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 离开事件实例 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getEventInstance() == null) {
c.getPlayer().dropMessage(5, "你没有在事件实例里面。");
} else {
c.getPlayer().getEventInstance().unregisterPlayer(c.getPlayer());
}
return 1;
}
}
public static class 地图上的玩家 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
StringBuilder builder = new StringBuilder("地图上的玩家: 总共").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 开始事件实例 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getEventInstance() != null) {
c.getPlayer().dropMessage(5, "你已经在一个事件实例里了。");
} 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, "不存在。");
} else {
em.getInstance(splitted[2]).registerPlayer(c.getPlayer());
}
} else {
c.getPlayer().dropMessage(5, splitted[0] + " [eventmanager] [eventinstance]");
}
return 1;
}
}*/
public static class 重置怪物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().killAllMonsters(false);
return 1;
}
}
public static class 杀死OID怪物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <怪物OID>");
return 0;
}
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 重载NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().resetNPCs();
return 1;
}
}
public static class 聊天公告 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleCharacter all : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
all.dropMessage(-6, StringUtil.joinStringFrom(splitted, 1));
}
return 1;
}
}
public static class 公告事项 extends CommandExecute {
protected static int getNoticeType(String typestring) {
switch (typestring) {
case "1":
return -1;
case "2":
return -2;
case "3":
return -3;
case "4":
return -4;
case "5":
return -5;
case "6":
return -6;
case "7":
return -7;
case "8":
return -8;
case "n":
return 0;
case "p":
return 1;
case "l":
return 2;
case "nv":
return 5;
case "v":
return 5;
case "b":
return 6;
}
return -1;
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " (对象:默认w) (类型:默认0) <公告内容>");
c.getPlayer().dropMessage(6, splitted[0] + "对象:地图所有人 - m/频道所有人 - c/服务器所有人 - w");
c.getPlayer().dropMessage(6, splitted[0] + "类型:1/2/3/4/5/6/7/8/n/弹窗 - p/小喇叭 - l/红字[公告事项] - nv/红字 - v/无[公告事项] - b");
return 0;
}
int joinmod = 1;
int range = -1;
switch (splitted[1]) {
case "m":
range = 0;
break;
case "c":
range = 1;
break;
case "w":
range = 2;
break;
}
int tfrom = 2;
if (range == -1) {
range = 2;
tfrom = 1;
}
int type = getNoticeType(splitted[tfrom]);
if (type == -1) {
joinmod = 0;
}
StringBuilder sb = new StringBuilder();
if (splitted[tfrom].equals("nv")) {
sb.append("[公告事项]");
} else {
sb.append("");
}
joinmod += tfrom;
sb.append(StringUtil.joinStringFrom(splitted, joinmod));
byte[] packet = MaplePacketCreator.serverMessageNotice(sb.toString());
if (range == 0) {
c.getPlayer().getMap().broadcastMessage(packet);
} else if (range == 1) {
ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet);
} else if (range == 2) {
WorldBroadcastService.getInstance().broadcastMessage(packet);
}
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] + " (对象:默认w) <内容>");
c.getPlayer().dropMessage(6, splitted[0] + "对象:地图所有人 - m/频道所有人 - c/服务器所有人 - w");
return 0;
}
int range = -1;
switch (splitted[1]) {
case "m":
range = 0;
break;
case "c":
range = 1;
break;
case "w":
range = 2;
break;
}
int tfrom = 2;
if (range == -1) {
range = 2;
tfrom = 1;
}
byte[] packet = MaplePacketCreator.yellowChat((splitted[0].equals("!带名黄字事项") ? ("[" + c.getPlayer().getName() + "] ") : "") + StringUtil.joinStringFrom(splitted, tfrom));
if (range == 0) {
c.getPlayer().getMap().broadcastMessage(packet);
} else if (range == 1) {
ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet);
} else if (range == 2) {
WorldBroadcastService.getInstance().broadcastMessage(packet);
}
return 1;
}
}
public static class 带名黄字事项 extends 黄字事项 {
}
public static class 我的IP 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 切换爆物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().toggleDrops();
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] + " <玩家名字> <时间(分钟,0为永久)>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
final int minutes = Math.max(0, Integer.parseInt(splitted[2]));
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
MapleMap target = ChannelServer.getInstance(c.getChannel()).getMapFactory().getMap(GameConstants.JAIL);
victim.getQuestNAdd(MapleQuest.getInstance(GameConstants.JAIL_QUEST)).setCustomData(String.valueOf(minutes * 60));
victim.changeMap(target, target.getPortal(0));
} else {
c.getPlayer().dropMessage(6, "请到玩家所在的频道");
return 0;
}
return 1;
}
}
public static class 查看NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleMapObject reactor1l : c.getPlayer().getMap().getAllNPCsThreadsafe()) {
MapleNPC reactor2l = (MapleNPC) reactor1l;
c.getPlayer().dropMessage(5, "NPC: oID: " + reactor2l.getObjectId() + " npcID: " + reactor2l.getId() + " 坐标: " + reactor2l.getPosition().toString() + " 名字: " + reactor2l.getName());
}
return 0;
}
}
public static class 查看反应堆 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleMapObject reactor1l : c.getPlayer().getMap().getAllReactorsThreadsafe()) {
MapleReactor reactor2l = (MapleReactor) reactor1l;
c.getPlayer().dropMessage(5, "反应堆Reactor: oID: " + reactor2l.getObjectId() + " 反应堆ReactorID: " + reactor2l.getReactorId() + " 坐标: " + reactor2l.getPosition().toString() + " 名字: " + reactor2l.getState() + " Name: " + reactor2l.getName());
}
return 0;
}
}
public static class 查看传送点 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MaplePortal portal : c.getPlayer().getMap().getPortals()) {
c.getPlayer().dropMessage(5, "传送点Portal: ID: " + portal.getId() + " 脚本: " + portal.getScriptName() + " 名字: " + portal.getName() + " 坐标: " + portal.getPosition().x + "," + portal.getPosition().y + " 目标地图: " + portal.getTargetMapId() + " / " + portal.getTarget());
}
return 0;
}
}
public static class 我的位置 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
Point pos = c.getPlayer().getPosition();
c.getPlayer().dropMessage(6, "X: " + pos.x + " | Y: " + pos.y + " | RX0: " + (pos.x + 50) + " | RX1: " + (pos.x - 50) + " | FH: " + c.getPlayer().getFH());
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;
}
int start;
int nstart;
if (splitted[1].equalsIgnoreCase("绿")) {
start = 3991026;
nstart = 3990019;
} else if (splitted[1].equalsIgnoreCase("红")) {
start = 3991000;
nstart = 3990009;
} else {
c.getPlayer().dropMessage(6, "未知颜色");
return 0;
}
String splitString = StringUtil.joinStringFrom(splitted, 2);
List<Integer> chars = new ArrayList();
splitString = splitString.toUpperCase();
for (int i = 0; i < splitString.length(); ++i) {
char chr = splitString.charAt(i);
if (chr == ' ') {
chars.add(-1);
} else if ((chr >= 'A') && (chr <= 'Z')) {
chars.add(Integer.valueOf(chr));
} else if ((chr >= '0') && (chr <= '9')) {
chars.add(chr + 200);
}
}
int w = 32;
int dStart = c.getPlayer().getPosition().x - (splitString.length() / 2 * 32);
for (Integer i : chars) {
if (i == -1) {
dStart += 32;
} else {
int val;
Item item;
if (i < 200) {
val = start + i - 65;
item = new Item(val, (byte) 0, (short) 1);
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), item, new Point(dStart, c.getPlayer().getPosition().y), false, false);
dStart += 32;
} else if ((i >= 200) && (i <= 300)) {
val = nstart + i - 48 - 200;
item = new Item(val, (byte) 0, (short) 1);
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), item, new Point(dStart, c.getPlayer().getPosition().y), false, false);
dStart += 32;
}
}
}
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> (数量:默认1)");
return 0;
}
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, "错误: " + e.getMessage());
return 0;
}
if (onemob == null) {
c.getPlayer().dropMessage(5, "怪物不存在");
return 0;
}
int newhp;
int newexp;
if (hp != null) {
newhp = hp.intValue();
} else if (php != null) {
newhp = (int) (onemob.getMobMaxHp() * (php / 100));
} else {
newhp = (int) onemob.getMobMaxHp();
}
if (exp != null) {
newexp = exp;
} else if (pexp != null) {
newexp = (int) (onemob.getMobExp() * (pexp / 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, false);
} else {
mob.setOverrideStats(overrideStats);
}
c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition());
}
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] + " <怪物名称> (数量:默认1)");
return 0;
}
final String mname = splitted[1];
final int num = Math.min(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), 500);
int mid = 0;
for (Map.Entry<Integer, String> mob : MapleMonsterInformationProvider.getInstance().getAllMonsters().entrySet()) {
if (mob.getValue().toLowerCase().equals(mname.toLowerCase())) {
mid = mob.getKey();
break;
}
}
MapleMonster onemob;
try {
onemob = MapleLifeFactory.getMonster(mid);
} catch (RuntimeException e) {
c.getPlayer().dropMessage(5, "错误: " + e.getMessage());
return 0;
}
if (onemob == null) {
c.getPlayer().dropMessage(5, "怪物不存在");
return 0;
}
for (int i = 0; i < num; i++) {
MapleMonster mob = MapleLifeFactory.getMonster(mid);
c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition());
}
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.canTalk(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] + " <玩家名字>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
victim.canTalk(true);
return 1;
}
}
public static class 地图禁言 extends CommandExecute {
@Override
public int execute(MapleClient c, String splitted[]) {
for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) {
chr.canTalk(false);
}
return 1;
}
}
public static class 取消地图禁言 extends CommandExecute {
@Override
public int execute(MapleClient c, String splitted[]) {
for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) {
chr.canTalk(true);
}
return 1;
}
}
public static class 无敌 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (player.isInvincible()) {
player.setInvincible(false);
player.dropMessage(6, "无敌模式已关闭。");
} else {
player.setInvincible(true);
player.dropMessage(6, "无敌模式已开启。");
}
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;
}
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chr == null) {
c.getPlayer().dropMessage(6, "输入的角色不存在或者角色不在线或者不在这个频道。");
return 0;
}
int itemid = Integer.parseInt(splitted[2]);
MapleInventoryType type = ItemConstants.getInventoryType(itemid);
for (Item item : chr.getInventory(type).listById(itemid)) {
item.setFlag((short) (byte) (item.getFlag() | ItemFlag.封印.getValue()));
chr.forceUpdateItem(item);
}
if (type == MapleInventoryType.EQUIP) {
type = MapleInventoryType.EQUIPPED;
for (Item item : chr.getInventory(type).listById(itemid)) {
item.setFlag((short) (byte) (item.getFlag() | ItemFlag.封印.getValue()));
chr.forceUpdateItem(item);
}
}
c.getPlayer().dropMessage(6, "已经成功的将ID为:" + splitted[2] + " 的所有道具锁定,执行角色为: " + splitted[1] + "。");
return 1;
}
}
public static class 线上玩家 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
int total = 0;
c.getPlayer().dropMessage(6, "---------------------------------------------------------------------------------------");
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
int curConnected = cserv.getConnectedClients();
c.getPlayer().dropMessage(6, new StringBuilder().append("频道: ").append(cserv.getChannel()).append(" 在线人数: ").append(curConnected).toString());
total += curConnected;
for (MapleCharacter chr : cserv.getPlayerStorage().getAllCharacters()) {
if (chr != null && c.getPlayer().getGMLevel() >= chr.getGMLevel()) {
StringBuilder ret = new StringBuilder();
ret.append(StringUtil.getRightPaddedStr(chr.getName(), ' ', 13));
ret.append(" ID: ");
ret.append(chr.getId());
ret.append(" 等级: ");
ret.append(StringUtil.getRightPaddedStr(String.valueOf(chr.getLevel()), ' ', 3));
if (chr.getMap() != null) {
ret.append(" 地图: ");
ret.append(chr.getMapId());
ret.append(" - ");
ret.append(chr.getMap().getMapName());
}
c.getPlayer().dropMessage(6, ret.toString());
}
}
}
c.getPlayer().dropMessage(6, new StringBuilder().append("当前服务器总计在线: ").append(total).toString());
c.getPlayer().dropMessage(6, "---------------------------------------------------------------------------------------");
return 1;
}
}
}