From fab3704dbdcc90fcd7e324da5da0895fca40cb1f Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 14 Jun 2018 17:11:38 -0400 Subject: [PATCH] Moved over Streamable inner classes, added test map --- build.gradle | 2 + core/assets/maps/test.mmap | Bin 264136 -> 329594 bytes .../io/anuke/mindustry/core/NetServer.java | 1 + core/src/io/anuke/mindustry/io/Maps.java | 2 +- core/src/io/anuke/mindustry/net/Net.java | 4 +- core/src/io/anuke/mindustry/net/Packets.java | 42 +++++++++++++++++ .../io/anuke/mindustry/net/Registrator.java | 4 +- .../io/anuke/mindustry/net/Streamable.java | 44 +----------------- .../anuke/mindustry/world/WorldGenerator.java | 1 - kryonet/src/io/anuke/kryonet/KryoServer.java | 4 +- .../mindustry/server/MindustryServer.java | 5 +- .../anuke/mindustry/server/ServerControl.java | 35 +++++++++----- .../mindustry/server/ServerLauncher.java | 21 ++++++++- 13 files changed, 99 insertions(+), 66 deletions(-) diff --git a/build.gradle b/build.gradle index 7fe10efa58..661851a9a4 100644 --- a/build.gradle +++ b/build.gradle @@ -189,6 +189,8 @@ project(":server") { apply plugin: "java" dependencies { + compileOnly project(":annotations") + compile project(":core") compile project(":kryonet") compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" diff --git a/core/assets/maps/test.mmap b/core/assets/maps/test.mmap index a87649b16a07eeb3702f0a5ff50c4f220c65e8f1..ab8f0627af71029d7531683131d72ce3d139498d 100644 GIT binary patch literal 329594 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 literal 264136 zcmZQzU|?WmV986&O=VyyNi8m6=w@JGU{1^|Vqj!oEiOnb&tqU>;7rQNPtGn#EGl7O zW?)My&CE$LWMF}^j2KvXD9eO_9m+Cg;DEBs7&sYtQc}|rOLI!na`N+w7`VVT zB&RZPGjQdmmL%ptgn1Y^Q&Lk4$`eacix_wrSRo8P29}(}vP1@c2Il#N=!UPl$mfvnW50L70IhCp9sJL4<)NIX^LnL6m``B(o$jFS9h4L5zXD zBqP5F#1v;>Ny#iKVUS>8DNf8wVUT2C&P+~akYZpd&dV=nkY->_FG?&fW{_dv1j&Pg zfkBpm6C?}a$T4t%ZHDmV8Tb*7fe0xuaDmN$@Dv$1bMuRfAsi(J*5Zt!(j*3D29~1y zq!uw)FmPm*<|UV8=I1e3GVmo8Wu~O3 z!nIj3@a7~Irxw8ltQpvf^NT>{*f4Mu7vyA?fY`PSJo#m*MQJ(t<>`qfsSI`uoS@)L zDay>rVX$Z5FG|hKOUo}xPECObIe=n2H8lsqb7bI!g%Cu*iGd4jD}?9Fz>`;+oRgYZ z1mU|da2Mnx7Uw2HxULL*;FO(OQBstcT#{eJ;Ksm{pP7T;yEAYlgM3_;2$J<+;7Q3Z zP0C3vDJ?2WEn)Cv;7v~~$;r%1hYENxaHr)Y=ECH?8F-5lGjq~Q^PuuR3|whBiP=z| zF9SE&tx&EX19wSkaZVzX>(9WGlUZ1rnF8epFmNYlBxb^l3S{60`#d=@FE2ljA&7w| zEx#x)u>#5uX5h`uEH2K3yETM?6CAN+`I#vUp$xoWPG(+OW?p7VDnl3pS7u3SZgGBT zQF1CnILvA&KZ1b+Bn#FW$-q)jnp?mS#lVr4Q(6ILM>DV|=jWxAW|lC-Fz^(V<`jdH z0hk{PGYXo7;uyG~zDmr?W{79tgYe+#D1m_&o{qoioS&0eRFIgLn!`}Qzz;3}kc0{u_@F7d zC>87#h9U;uw9?|t{5+UIF#`|8rO*UZ!XS{Fnx2RvR?5H+DIXA4mocy>C4#bIB||v_ z50nYEo}mJoX7ch=QW+{4_`qof#DPdxF>sZn=A;%tGIccrdvR`R4k%C8Fz_ViKS;zf-pr541CE&mHBBorI{(YnV=GlwgqgG{tfZ3h;{f*29*@ushEJqF-WIhOk^nz%D7 Un}3n@AhU_p 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 type; + + @Override + public void write(ByteBuffer buffer) { + buffer.putInt(id); + buffer.putInt(total); + buffer.put(Registrator.getID(type)); + } + + @Override + public void read(ByteBuffer buffer) { + id = buffer.getInt(); + total = buffer.getInt(); + type = (Class)Registrator.getByID(buffer.get()); + } + } + + public static class StreamChunk implements Packet{ + public int id; + public byte[] data; + + @Override + public void write(ByteBuffer buffer) { + buffer.putInt(id); + buffer.putShort((short)data.length); + buffer.put(data); + } + + @Override + public void read(ByteBuffer buffer) { + id = buffer.getInt(); + data = new byte[buffer.getShort()]; + buffer.get(data); + } + } } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index 4128f02ed3..e8596b8a92 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -3,8 +3,8 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.utils.ObjectIntMap; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.net.Streamable.StreamBegin; -import io.anuke.mindustry.net.Streamable.StreamChunk; +import io.anuke.mindustry.net.Packets.StreamBegin; +import io.anuke.mindustry.net.Packets.StreamChunk; public class Registrator { private static Class[] classes = { diff --git a/core/src/io/anuke/mindustry/net/Streamable.java b/core/src/io/anuke/mindustry/net/Streamable.java index 1d700b2087..7a697f254e 100644 --- a/core/src/io/anuke/mindustry/net/Streamable.java +++ b/core/src/io/anuke/mindustry/net/Streamable.java @@ -3,57 +3,15 @@ package io.anuke.mindustry.net; import com.badlogic.gdx.utils.reflect.ClassReflection; import com.badlogic.gdx.utils.reflect.ReflectionException; import io.anuke.mindustry.net.Packet.ImportantPacket; +import io.anuke.mindustry.net.Packets.StreamBegin; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.nio.ByteBuffer; public class Streamable implements ImportantPacket{ public transient ByteArrayInputStream stream; - /**Marks the beginning of a stream.*/ - public static class StreamBegin implements Packet{ - private static int lastid; - - public int id = lastid ++; - public int total; - public Class type; - - @Override - public void write(ByteBuffer buffer) { - buffer.putInt(id); - buffer.putInt(total); - buffer.put(Registrator.getID(type)); - } - - @Override - public void read(ByteBuffer buffer) { - id = buffer.getInt(); - total = buffer.getInt(); - type = (Class)Registrator.getByID(buffer.get()); - } - } - - public static class StreamChunk implements Packet{ - public int id; - public byte[] data; - - @Override - public void write(ByteBuffer buffer) { - buffer.putInt(id); - buffer.putShort((short)data.length); - buffer.put(data); - } - - @Override - public void read(ByteBuffer buffer) { - id = buffer.getInt(); - data = new byte[buffer.getShort()]; - buffer.get(data); - } - } - public static class StreamBuilder{ public final int id; public final Class type; diff --git a/core/src/io/anuke/mindustry/world/WorldGenerator.java b/core/src/io/anuke/mindustry/world/WorldGenerator.java index 7e3f81b46b..8deed0be0b 100644 --- a/core/src/io/anuke/mindustry/world/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/world/WorldGenerator.java @@ -114,7 +114,6 @@ public class WorldGenerator { } } } - } static class OreEntry{ diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/kryonet/src/io/anuke/kryonet/KryoServer.java index 53a4428472..efcb788baa 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/kryonet/src/io/anuke/kryonet/KryoServer.java @@ -18,8 +18,8 @@ import io.anuke.mindustry.net.NetworkIO; import io.anuke.mindustry.net.Packets.Connect; import io.anuke.mindustry.net.Packets.Disconnect; import io.anuke.mindustry.net.Streamable; -import io.anuke.mindustry.net.Streamable.StreamBegin; -import io.anuke.mindustry.net.Streamable.StreamChunk; +import io.anuke.mindustry.net.Packets.StreamBegin; +import io.anuke.mindustry.net.Packets.StreamChunk; import io.anuke.ucore.UCore; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Log; diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index 6f48c3f46a..c82c4a5695 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -1,7 +1,10 @@ package io.anuke.mindustry.server; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.core.*; +import io.anuke.mindustry.core.ContentLoader; +import io.anuke.mindustry.core.Logic; +import io.anuke.mindustry.core.NetServer; +import io.anuke.mindustry.core.World; import io.anuke.mindustry.game.Content; import io.anuke.mindustry.io.BundleLoader; import io.anuke.ucore.modules.ModuleCore; diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index accc8eaf6c..8b0933e3bb 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.server; -import com.badlogic.gdx.ApplicationLogger; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IntMap; @@ -49,16 +48,6 @@ public class ServerControl extends Module { Effects.setEffectProvider((a, b, c, d, e, f) -> {}); Sounds.setHeadless(true); - //don't do anything at all for GDX logging: don't want controller info and such - Gdx.app.setApplicationLogger(new ApplicationLogger() { - @Override public void log(String tag, String message) { } - @Override public void log(String tag, String message, Throwable exception) { } - @Override public void error(String tag, String message) { } - @Override public void error(String tag, String message, Throwable exception) { } - @Override public void debug(String tag, String message) { } - @Override public void debug(String tag, String message, Throwable exception) { } - }); - String[] commands = {}; if(args.length > 0){ @@ -140,6 +129,11 @@ public class ServerControl extends Module { return; } + if(world.maps().all().size == 0){ + err("No maps found to host with!"); + return; + } + Map result = null; if(arg.length > 0) { @@ -230,6 +224,7 @@ public class ServerControl extends Module { } //netCommon.sendMessage("[GRAY][[Server]:[] " + arg[0]); + info("&lyServer: &lb{0}", arg[0]); }); @@ -743,7 +738,23 @@ public class ServerControl extends Module { Response response = handler.handleMessage(line); if (response.type == ResponseType.unknownCommand) { - err("Invalid command. Type 'help' for help."); + + int minDst = 0; + Command closest = null; + + for(Command command : handler.getCommandList()){ + int dst = Strings.levenshtein(command.text, response.runCommand); + if(dst < 3 && (closest == null || dst < minDst)){ + minDst = dst; + closest = command; + } + } + + if(closest != null){ + err("Command not found. Did you mean \"" + closest.text + "\"?"); + }else { + err("Invalid command. Type 'help' for help."); + } }else if (response.type == ResponseType.fewArguments) { err("Too few command arguments. Usage: " + response.command.text + " " + response.command.paramText); }else if (response.type == ResponseType.manyArguments) { diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index 1abd040a47..bf3a59ac57 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -1,18 +1,21 @@ package io.anuke.mindustry.server; +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.ApplicationLogger; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.headless.HeadlessApplication; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.net.Net; -public class ServerLauncher{ +public class ServerLauncher extends HeadlessApplication{ public static void main(String[] args){ Net.setClientProvider(new KryoClient()); Net.setServerProvider(new KryoServer()); - new HeadlessApplication(new MindustryServer(args)); + new ServerLauncher(new MindustryServer(args)); //find and handle uncaught exceptions in libGDX thread for(Thread thread : Thread.getAllStackTraces().keySet()){ @@ -25,4 +28,18 @@ public class ServerLauncher{ } } } + + public ServerLauncher(ApplicationListener listener) { + super(listener); + + //don't do anything at all for GDX logging: don't want controller info and such + Gdx.app.setApplicationLogger(new ApplicationLogger() { + @Override public void log(String tag, String message) { } + @Override public void log(String tag, String message, Throwable exception) { } + @Override public void error(String tag, String message) { } + @Override public void error(String tag, String message, Throwable exception) { } + @Override public void debug(String tag, String message) { } + @Override public void debug(String tag, String message, Throwable exception) { } + }); + } } \ No newline at end of file