From a891ab4d3ad41002bd311b11f74d62d5f3f0b177 Mon Sep 17 00:00:00 2001 From: Sen Date: Tue, 18 Mar 2025 01:29:36 +0100 Subject: [PATCH] command system --- java/src/game/Server.java | 8 +- java/src/game/command/DimensionParser.java | 17 +- java/src/game/command/DoubleParser.java | 32 ++++ java/src/game/command/Parameter.java | 2 +- java/src/game/command/ScriptArgs.java | 112 +++++++++++- java/src/game/command/ScriptEnvironment.java | 35 +++- java/src/game/command/ScriptExecutor.java | 3 + java/src/game/command/WorldParser.java | 19 ++- .../game/command/commands/CommandSpawn.java | 57 +++++++ java/src/game/entity/Entity.java | 4 + .../game/network/NetHandlerPlayServer.java | 159 +++++++++++------- 11 files changed, 361 insertions(+), 87 deletions(-) create mode 100644 java/src/game/command/commands/CommandSpawn.java diff --git a/java/src/game/Server.java b/java/src/game/Server.java index 45dc61b..9da17ca 100755 --- a/java/src/game/Server.java +++ b/java/src/game/Server.java @@ -24,6 +24,7 @@ import com.google.common.util.concurrent.ListenableFutureTask; import com.google.common.util.concurrent.ThreadFactoryBuilder; import game.color.TextColor; +import game.command.ScriptEnvironment; import game.dimension.Dimension; import game.dimension.Space; import game.entity.Entity; @@ -107,6 +108,7 @@ public final class Server implements Runnable, IThreadListener { private final List ticked = Lists.newArrayList(); private final List unload = Lists.newArrayList(); private final Map warps = Maps.newTreeMap(); + private final ScriptEnvironment scriptEnv = new ScriptEnvironment(this); // private final String owner; private final File playerDir; private final File baseDir; @@ -150,9 +152,9 @@ public final class Server implements Runnable, IThreadListener { // this.port = port; } -// public String getOwner() { -// return this.owner; -// } + public ScriptEnvironment getScriptEnvironment() { + return this.scriptEnv; + } public boolean isStarted() { return this.started; diff --git a/java/src/game/command/DimensionParser.java b/java/src/game/command/DimensionParser.java index dc91110..52c56c2 100644 --- a/java/src/game/command/DimensionParser.java +++ b/java/src/game/command/DimensionParser.java @@ -2,10 +2,14 @@ package game.command; import game.dimension.Dimension; import game.init.UniverseRegistry; +import game.world.Position; -public class DimensionParser extends NonDefaultingParser { - public DimensionParser(String name) { +public class DimensionParser extends CompletingParser { + private final boolean useSender; + + public DimensionParser(String name, boolean useSender) { super(name); + this.useSender = useSender; } public Object parse(ScriptEnvironment env, String input) { @@ -24,6 +28,15 @@ public class DimensionParser extends NonDefaultingParser { return dim; } + public Object getDefault(ScriptEnvironment env) { + if(!this.useSender) + return null; + Position pos = env.getExecutor().getExecPos(); + return pos == null ? null : UniverseRegistry.getDimension(pos.dim); +// if(dim == null) +// throw new ScriptException("Unbekannte Dimension '%s'"); + } + public String[] getCompletions(ScriptEnvironment env) { return UniverseRegistry.getWorldNames().toArray(new String[UniverseRegistry.getWorldNames().size()]); } diff --git a/java/src/game/command/DoubleParser.java b/java/src/game/command/DoubleParser.java index aa44322..c799abc 100644 --- a/java/src/game/command/DoubleParser.java +++ b/java/src/game/command/DoubleParser.java @@ -1,11 +1,26 @@ package game.command; +import game.world.Position; + public class DoubleParser extends DefaultingParser { + public static enum DefType { + X, Y, Z, YAW, PITCH; + } + + private final DefType defType; private final Double min; private final Double max; public DoubleParser(String name, Double def, Double min, Double max, Object ... completions) { super(name, def, completions); + this.defType = null; + this.min = min; + this.max = max; + } + + public DoubleParser(String name, DefType type, Double min, Double max, Object ... completions) { + super(name, null, completions); + this.defType = type; this.min = min; this.max = max; } @@ -30,4 +45,21 @@ public class DoubleParser extends DefaultingParser { throw new ScriptException("Die Zahl darf höchstens %f betragen, habe %f", this.max, value); return value; } + + public Double getDefault(ScriptEnvironment env) { + Position pos = this.defType == null ? null : env.getExecutor().getExecPos(); + switch(this.defType) { + case X: + return pos == null ? null : pos.x; + case Y: + return pos == null ? null : pos.y; + case Z: + return pos == null ? null : pos.z; + case YAW: + return pos == null ? null : (double)pos.yaw; + case PITCH: + return pos == null ? null : (double)pos.pitch; + } + return (Double)super.getDefault(env); + } } diff --git a/java/src/game/command/Parameter.java b/java/src/game/command/Parameter.java index 3e86ed9..442f04f 100644 --- a/java/src/game/command/Parameter.java +++ b/java/src/game/command/Parameter.java @@ -18,7 +18,7 @@ public class Parameter { } public boolean isPositional() { - return this.position > 0; + return this.position >= 0; } public int getPosition() { diff --git a/java/src/game/command/ScriptArgs.java b/java/src/game/command/ScriptArgs.java index d792cdc..6015240 100644 --- a/java/src/game/command/ScriptArgs.java +++ b/java/src/game/command/ScriptArgs.java @@ -2,8 +2,11 @@ package game.command; import java.util.List; import java.util.Map; +import java.util.Set; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import game.block.Block; import game.entity.Entity; @@ -15,14 +18,17 @@ import game.world.BlockPos; import game.world.State; import game.world.Vec3; import game.world.WorldPos; +import game.world.WorldServer; public class ScriptArgs { private final String command; private final Map arguments; + private final ScriptEnvironment env; - protected ScriptArgs(Map arguments, String command) { + protected ScriptArgs(Map arguments, String command, ScriptEnvironment env) { this.arguments = arguments; this.command = command; + this.env = env; } private static String joinArgs(Iterable iter) { @@ -37,7 +43,7 @@ public class ScriptArgs { public static ScriptArgs parseArgs(ScriptEnvironment env, String str, String[] argv, CachedExecutable cached) { Map parameters = cached.getParameters(); - List positionals = cached.getPositionals(); + List positionals = Lists.newArrayList(cached.getPositionals()); // String[] argv = ArgumentParser.splitString(str); Map args = Maps.newHashMap(); int ppos = 0; @@ -75,7 +81,7 @@ public class ScriptArgs { int nargs = param.getParsers().size(); // if(!pos) // z += 1; - if(z + (pos ? 0 : 1) + nargs >= argv.length) + if(z + (pos ? 0 : 1) + nargs > argv.length) if(nargs == 1 && param.getName().equals(param.getParsers().get(0).getName())) throw new ScriptException("Position %d: Argument '%s' benötigt einen Parameter", z, param.getName()); else @@ -109,7 +115,7 @@ public class ScriptArgs { if(!pos) inputs[0] = arg; args.put(param.getName(), new ScriptArg(param, z, inputs, params)); - z += nargs; + z += nargs - (pos ? 1 : 0); } for(Parameter param : parameters.values()) { if(!args.containsKey(param.getName())) { @@ -126,7 +132,83 @@ public class ScriptArgs { args.put(param.getName(), new ScriptArg(param, -1, null, params)); } } - return new ScriptArgs(args, str); + return new ScriptArgs(args, str, env); + } + + private static String[] getParam(ScriptEnvironment env, String[] argv, CachedExecutable cached) { + Map parameters = cached.getParameters(); + List positionals = Lists.newArrayList(cached.getPositionals()); + Set args = Sets.newHashSet(); + int ppos = 0; + boolean parse = true; + for(int z = 1; z < argv.length; z++) { + String arg = argv[z]; + Parameter param = null; + boolean pos = false; + if(z == argv.length - 1) { + if(ppos < positionals.size()) { + param = positionals.get(ppos); + if(param.getParsers().isEmpty()) // np + return null; + return param.getParsers().get(0).getCompletions(env); + } + else { + return null; + } + } + else if(parse && arg.equals("--")) { + parse = false; + continue; + } + else if(parse && (arg.startsWith("--") || (arg.startsWith("-") && arg.length() == 2))) { + param = parameters.get(arg.substring(arg.startsWith("--") ? 2 : 1)); + if(param != null && param.isPositional() && !args.contains(param.getName())) { + for(int n = 0; n < positionals.size(); n++) { + if(param == positionals.get(n)) { + positionals.remove(n); + break; + } + } + } + } + else if(ppos < positionals.size()) { + param = positionals.get(ppos++); + pos = true; + } + else { + return null; + } + if(param == null || args.contains(param.getName())) + return null; + int nargs = param.getParsers().size(); +// if(z + (pos ? 0 : 1) + nargs > argv.length - 1) { +// return param.getParsers().get(argv.length - z).getCompletions(env); +// } + int apos = 0; + for(int n = pos ? 0 : 1; n < nargs + (pos ? 0 : 1); n++) { + if(z + n == argv.length - 1) + return param.getParsers().get(apos).getCompletions(env); + String par = argv[z + n]; + if(parse && (par.startsWith("--") || (par.startsWith("-") && par.length() == 2))) + return null; + apos += 1; + } + args.add(param.getName()); + z += nargs - (pos ? 1 : 0); + } + return null; + } + + public static String[] parseComplete(ScriptEnvironment env, String[] argv, CachedExecutable cached) { + String[] comp = getParam(env, argv, cached); + if(comp == null || comp.length == 0) { + Set params = Sets.newTreeSet(); + for(String param : cached.getParameters().keySet()) { + params.add(param.length() == 1 ? "-" + param : ("--" + param)); + } + comp = params.toArray(new String[params.size()]); + } + return comp; } public ScriptArg getArg(String name) { @@ -137,7 +219,15 @@ public class ScriptArgs { return this.arguments.containsKey(name); } - protected T getDefault(String name, String par, T def) { + public boolean has(String name, String par) { + return this.arguments.containsKey(name) && this.arguments.get(name).getValues().containsKey(par); + } + + public boolean has(String name) { + return this.has(name, name); + } + + public T getDefault(String name, String par, T def) { ScriptArg arg = this.arguments.get(name); if(arg == null) return def; @@ -145,15 +235,15 @@ public class ScriptArgs { return value == null ? def : (T)value; } - protected T getDefault(String name, T def) { + public T getDefault(String name, T def) { return this.getDefault(name, name, def); } - protected T getUnchecked(String name, String par) { + public T getUnchecked(String name, String par) { return this.getDefault(name, par, null); } - protected T getUnchecked(String name) { + public T getUnchecked(String name) { return this.getDefault(name, null); } @@ -309,4 +399,8 @@ public class ScriptArgs { public Vec3 getVector(String name) { return new Vec3(this.getUnchecked(name, "x"), this.getUnchecked(name, "y"), this.getUnchecked(name, "z")); } + + public WorldServer getWorld(String name) { + return this.getUnchecked(name); + } } diff --git a/java/src/game/command/ScriptEnvironment.java b/java/src/game/command/ScriptEnvironment.java index 399db08..850a848 100644 --- a/java/src/game/command/ScriptEnvironment.java +++ b/java/src/game/command/ScriptEnvironment.java @@ -9,6 +9,7 @@ import com.google.common.collect.Maps; import game.Server; import game.color.TextColor; +import game.command.commands.CommandSpawn; public class ScriptEnvironment { private final Server server; @@ -20,6 +21,7 @@ public class ScriptEnvironment { public ScriptEnvironment(Server server) { this.server = server; + this.registerDefaults(); } public void registerExecutable(Executable executable) { @@ -107,8 +109,35 @@ public class ScriptEnvironment { } } - public void complete(String cmd, ScriptExecutor exec) { - + public List complete(String cmd, ScriptExecutor exec) { + List list = Lists.newArrayList(); + try { + String[][] cmds = ArgumentParser.splitString(cmd.endsWith(" ") ? cmd + "END" : cmd); + if(cmds.length == 0) + return list; + String[] argv = cmds[cmds.length - 1]; + if(argv.length == 0) + return list; + String[] comp; + if(argv.length > 1) { + CachedExecutable cached = this.executables.get(argv[0]); + if(cached == null) + return list; + comp = ScriptArgs.parseComplete(this, argv, cached); + } + else { + comp = this.executables.keySet().toArray(new String[this.executables.keySet().size()]); + } + String param = cmd.endsWith(" ") ? "" : argv[argv.length - 1]; + for(String cmp : comp) { + if(cmp.regionMatches(true, 0, param, 0, param.length())) + list.add(cmp); + } + } + catch(Throwable t) { + list.clear(); + } + return list; } public void registerDefaults() { @@ -127,5 +156,7 @@ public class ScriptEnvironment { return ScriptEnvironment.this.previousOutput == null ? null : ScriptEnvironment.this.previousOutput.toString(); } }); + + this.registerExecutable(new CommandSpawn()); } } diff --git a/java/src/game/command/ScriptExecutor.java b/java/src/game/command/ScriptExecutor.java index d4fe046..59e2ee1 100644 --- a/java/src/game/command/ScriptExecutor.java +++ b/java/src/game/command/ScriptExecutor.java @@ -1,9 +1,12 @@ package game.command; +import game.world.Position; + public interface ScriptExecutor { void logConsole(String msg); String getExecId(); String getExecName(); + Position getExecPos(); default void logConsole(String fmt, Object ... args) { this.logConsole(String.format(fmt, args)); diff --git a/java/src/game/command/WorldParser.java b/java/src/game/command/WorldParser.java index d43b574..9e09ea2 100644 --- a/java/src/game/command/WorldParser.java +++ b/java/src/game/command/WorldParser.java @@ -4,32 +4,37 @@ import java.util.List; import com.google.common.collect.Lists; -import game.Server; import game.dimension.Dimension; import game.world.WorldServer; public class WorldParser extends DimensionParser { private final boolean loadedOnly; - private final Server server; - public WorldParser(String name, Server server, boolean loadedOnly) { - super(name); - this.server = server; + public WorldParser(String name, boolean loadedOnly, boolean useSender) { + super(name, useSender); this.loadedOnly = loadedOnly; } public WorldServer parse(ScriptEnvironment env, String input) { Dimension dim = (Dimension)super.parse(env, input); - WorldServer world = this.loadedOnly ? this.server.getWorldNoLoad(dim.getDimensionId()) : this.server.getWorld(dim.getDimensionId()); + WorldServer world = this.loadedOnly ? env.getServer().getWorldNoLoad(dim.getDimensionId()) : env.getServer().getWorld(dim.getDimensionId()); if(world == null) throw new ScriptException("Dimension '%s' ist nicht geladen", dim.getFormattedName(false)); return world; } + public WorldServer getDefault(ScriptEnvironment env) { + Dimension dim = (Dimension)super.getDefault(env); + return this.loadedOnly ? env.getServer().getWorldNoLoad(dim.getDimensionId()) : env.getServer().getWorld(dim.getDimensionId()); +// if(world == null) +// throw new ScriptException("Dimension '%s' ist nicht geladen", dim.getFormattedName(false)); +// return world; + } + public String[] getCompletions(ScriptEnvironment env) { if(this.loadedOnly) { List loaded = Lists.newArrayList(); - for(WorldServer world : this.server.getWorlds()) { + for(WorldServer world : env.getServer().getWorlds()) { loaded.add(world.dimension.getDimensionName()); } return loaded.toArray(new String[loaded.size()]); diff --git a/java/src/game/command/commands/CommandSpawn.java b/java/src/game/command/commands/CommandSpawn.java new file mode 100644 index 0000000..b6cb8d6 --- /dev/null +++ b/java/src/game/command/commands/CommandSpawn.java @@ -0,0 +1,57 @@ +package game.command.commands; + +import java.util.Set; + +import com.google.common.collect.Sets; + +import game.command.DoubleParser; +import game.command.DoubleParser.DefType; +import game.command.EnumParser; +import game.command.IntParser; +import game.command.ScriptArgs; +import game.command.ScriptEnvironment; +import game.command.ScriptException; +import game.command.ScriptExecutable; +import game.command.WorldParser; +import game.entity.Entity; +import game.entity.types.EntityLiving; +import game.init.EntityRegistry; +import game.world.Vec3; +import game.world.World; +import game.world.WorldServer; + +public class CommandSpawn extends ScriptExecutable { + public CommandSpawn() { + super("spawn"); + Set names = Sets.newTreeSet(); + for(Class clazz : EntityRegistry.getAllClasses()) { + names.add(EntityRegistry.getEntityString(clazz)); + } + this.addParameter("type", new EnumParser("type", null, (Object[])names.toArray(new String[names.size()]))); + this.setParamsOptional(); + this.addParameter("position", new DoubleParser("x", DefType.X, (double)(-World.MAX_SIZE), (double)World.MAX_SIZE), new DoubleParser("y", DefType.Y, 0.0, (double)World.HEIGHT), new DoubleParser("z", DefType.Z, (double)(-World.MAX_SIZE), (double)World.MAX_SIZE)); + this.addParameter("dim", new WorldParser("dim", false, true)); + + this.addParameter("noinit", 'n'); + this.addParameter("count", 'c', new IntParser("count", false, 1, 1, 1024)); + } + + public Object exec(ScriptEnvironment env, ScriptArgs args) { + String type = args.getString("type"); + WorldServer world = args.getWorld("dim"); + Vec3 pos = args.getVector("position"); + int count = args.getInt("count"); + boolean init = !args.has("noinit"); + for(int z = 0; z < count; z++) { + Entity entity = EntityRegistry.createEntityByName(type, world); + if(entity == null) + throw new ScriptException("Objekt konnte nicht erzeugt werden"); + entity.setLocationAndAngles(pos.xCoord, pos.yCoord, pos.zCoord, world.rand.floatv() * 360.0f, 0.0f); + if(init && (entity instanceof EntityLiving)) + ((EntityLiving)entity).onInitialSpawn(null); + world.spawnEntityInWorld(entity); + } + env.getExecutor().logConsole("%s%s bei %d, %d, %d in %s erschaffen", count == 1 ? "" : (count + "x "), EntityRegistry.getEntityName(type), (int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord, world.dimension.getFormattedName(false)); + return null; + } +} diff --git a/java/src/game/entity/Entity.java b/java/src/game/entity/Entity.java index a3999a9..718d5a1 100755 --- a/java/src/game/entity/Entity.java +++ b/java/src/game/entity/Entity.java @@ -2670,4 +2670,8 @@ public abstract class Entity return null; return ItemRegistry.getRegisteredItem(id.toLowerCase() + "_spawner"); } + + public Position getPos() { + return new Position(this.posX, this.posY, this.posZ, this.rotYaw, this.rotPitch, this.worldObj.dimension.getDimensionId()); + } } diff --git a/java/src/game/network/NetHandlerPlayServer.java b/java/src/game/network/NetHandlerPlayServer.java index f558b7d..70d1fa5 100755 --- a/java/src/game/network/NetHandlerPlayServer.java +++ b/java/src/game/network/NetHandlerPlayServer.java @@ -23,6 +23,7 @@ import game.clipboard.Rotation; import game.clipboard.RotationValue; import game.clipboard.Vector; import game.color.TextColor; +import game.command.ScriptExecutor; import game.dimension.Dimension; import game.entity.Entity; import game.entity.animal.EntityHorse; @@ -125,7 +126,7 @@ import game.world.WorldServer; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -public class NetHandlerPlayServer extends NetHandler implements ICrafting +public class NetHandlerPlayServer extends NetHandler implements ICrafting, ScriptExecutor { private static enum EditAction { SELECT("Auswahlmodus"), COPYPASTE("Kopiermodus"), TRANSFORM("Drehmodus"); @@ -1630,7 +1631,7 @@ public class NetHandlerPlayServer extends NetHandler implements ICrafting private boolean setVar(String line) { if(!this.isAdmin()) return false; - if(line.length() < 2) { + if(line.length() < 1) { for(Entry entry : Config.VARS.entrySet()) { Config.Value cvar = entry.getValue(); String v = cvar.getValue(); @@ -1953,6 +1954,31 @@ public class NetHandlerPlayServer extends NetHandler implements ICrafting } return false; } + + private void runCommand(String command) { + this.server.getScriptEnvironment().execute(command, this); + } + + private List completeCommand(String command) { + return this.server.getScriptEnvironment().complete(command, this); +// return Lists.newArrayList(); + } + + public void logConsole(String msg) { + this.addFeed(msg); + } + + public String getExecId() { + return this.user; + } + + public String getExecName() { + return this.entity != null ? this.entity.getCommandName() : this.user; + } + + public Position getExecPos() { + return this.entity != null ? this.entity.getPos() : null; + } public void processMessage(CPacketMessage packetIn) { @@ -1967,7 +1993,7 @@ public class NetHandlerPlayServer extends NetHandler implements ICrafting switch(packetIn.getType()) { case COMMAND: if(!this.teleport(msg) && !this.setVar(msg) && !this.setAdmin(msg)) - this.addFeed(TextColor.RED + "Befehl wurde nicht gefunden"); + this.runCommand(msg); // this.addFeed(TextColor.RED + "Befehl wurde nicht gefunden"); break; case CHAT: @@ -1990,6 +2016,73 @@ public class NetHandlerPlayServer extends NetHandler implements ICrafting throw new IllegalArgumentException("Ungültiger Nachrichten-Typ!"); } } + + private Iterable getWarpList(char pre) { + switch(pre) { + case '+': + return Lists.newArrayList(this.server.getUsers()); + case '@': + List warps = Lists.newArrayList("spawn"); + for(String warp : this.server.getWarps().keySet()) { + warps.add(warp); + } + return warps; + case '*': + return UniverseRegistry.getWorldNames(); + } + return Lists.newArrayList(); + } + + private static List getVarList() { + List list = Lists.newArrayList(Config.VARS.keySet()); + list.add("time"); + return list; + } + + private List getVarCompletion(String var) { + Config.Value v = Config.VARS.get(var); + if(v == null) + return Lists.newArrayList(); + if(v.type == ValueType.BOOLEAN) + return Boolean.parseBoolean(v.getValue()) ? Lists.newArrayList("false", "true") : Lists.newArrayList("true", "false"); + else if(v.type == ValueType.INTEGER || v.type == ValueType.FLOAT) + return Lists.newArrayList(v.def); + return Lists.newArrayList(); + } + + public void processComplete(CPacketComplete packetIn) + { + NetHandler.checkThread(packetIn, this, this.server); + if(packetIn.getMessage().startsWith(" ")) { + this.entity.connection.sendPacket(new S3APacketTabComplete(new String[0])); + return; + } + List list = Lists.newArrayList(); // Command.getCompletions(this.playerEntity, packetIn.getMessage()); + +// for (String s : ) +// { +// list.add(s); +// } + +// if(list == null) { +// list = Lists.newArrayList(); + String s = packetIn.getMessage(); + char pre = s.startsWith("#") || s.startsWith("!") || s.startsWith("+") || s.startsWith("*") || s.startsWith("@") ? s.charAt(0) : 0; + s = pre == 0 ? s : s.substring(1); + String[] argv = s.split(" ", -1); + s = argv[argv.length - 1]; + Iterable res = pre == '#' && (Config.teleportAllowed || this.isAdmin()) ? (argv.length == 5 ? UniverseRegistry.getWorldNames() : Lists.newArrayList()) : ((pre == '+' || pre == '*' || pre == '@') && (Config.teleportAllowed || this.isAdmin()) ? (argv.length == 1 ? this.getWarpList(pre) : Lists.newArrayList()) : (pre == '!' && this.isAdmin() ? this.server.getAllUsernames() : ((this.isAdmin() ? (argv.length == 1 ? getVarList() : (argv.length == 2 ? (argv[0].equals("time") ? Lists.newArrayList("day", "night", "noon", "midnight", "sunrise", "sunset") : getVarCompletion(argv[0])) : Lists.newArrayList())) : Lists.newArrayList())))); + for(String s1 : res) { + if(s1.regionMatches(true, 0, s, 0, s.length())) + list.add((argv.length == 1 && pre != 0 ? pre : "") + s1); + } +// if(list.isEmpty()) { + list.addAll(this.completeCommand(packetIn.getMessage())); +// } +// } + + this.entity.connection.sendPacket(new S3APacketTabComplete((String[])list.toArray(new String[list.size()]))); + } private static boolean isFinite(double value) { return Double.NEGATIVE_INFINITY < value & value < Double.POSITIVE_INFINITY; @@ -2902,66 +2995,6 @@ public class NetHandlerPlayServer extends NetHandler implements ICrafting } } - private Iterable getWarpList(char pre) { - switch(pre) { - case '+': - return Lists.newArrayList(this.server.getUsers()); - case '@': - List warps = Lists.newArrayList("spawn"); - for(String warp : this.server.getWarps().keySet()) { - warps.add(warp); - } - return warps; - case '*': - return UniverseRegistry.getWorldNames(); - } - return Lists.newArrayList(); - } - - private static List getVarList() { - List list = Lists.newArrayList(Config.VARS.keySet()); - list.add("time"); - return list; - } - - private static List getVarCompletion(String var) { - Config.Value v = Config.VARS.get(var); - if(v == null) - return Lists.newArrayList(); - if(v.type == ValueType.BOOLEAN) - return Boolean.parseBoolean(v.getValue()) ? Lists.newArrayList("false", "true") : Lists.newArrayList("true", "false"); - else if(v.type == ValueType.INTEGER || v.type == ValueType.FLOAT) - return Lists.newArrayList(v.def); - return Lists.newArrayList(); - } - - public void processComplete(CPacketComplete packetIn) - { - NetHandler.checkThread(packetIn, this, this.server); - List list = Lists.newArrayList(); // Command.getCompletions(this.playerEntity, packetIn.getMessage()); - -// for (String s : ) -// { -// list.add(s); -// } - -// if(list == null) { -// list = Lists.newArrayList(); - String s = packetIn.getMessage(); - char pre = s.startsWith("#") || s.startsWith("!") || s.startsWith("+") || s.startsWith("*") || s.startsWith("@") ? s.charAt(0) : 0; - s = pre == 0 ? s : s.substring(1); - String[] argv = s.split(" ", -1); - s = argv[argv.length - 1]; - Iterable res = pre == '#' && (Config.teleportAllowed || this.isAdmin()) ? (argv.length == 5 ? UniverseRegistry.getWorldNames() : Lists.newArrayList()) : ((pre == '+' || pre == '*' || pre == '@') && (Config.teleportAllowed || this.isAdmin()) ? (argv.length == 1 ? this.getWarpList(pre) : Lists.newArrayList()) : (pre == '!' && this.isAdmin() ? this.server.getAllUsernames() : ((this.isAdmin() ? (argv.length == 1 ? getVarList() : (argv.length == 2 ? (argv[0].equals("time") ? Lists.newArrayList("day", "night", "noon", "midnight", "sunrise", "sunset") : getVarCompletion(argv[0])) : Lists.newArrayList())) : Lists.newArrayList())))); - for(String s1 : res) { - if(s1.regionMatches(true, 0, s, 0, s.length())) - list.add((argv.length == 1 && pre != 0 ? pre : "") + s1); - } -// } - - this.entity.connection.sendPacket(new S3APacketTabComplete((String[])list.toArray(new String[list.size()]))); - } - public boolean respawnPlayer() { if(this.entity.getHealth() > 0) return false;