From 7e13d4c5e23d8bc184ddf14fa5c173fec99921dc Mon Sep 17 00:00:00 2001 From: orangishcat Date: Mon, 11 Aug 2025 19:04:38 -0700 Subject: [PATCH 01/35] refactor: create NetworkHandler for shared properties Signed-off-by: orangishcat --- src/main/java/tanks/DebugKeybinds.java | 46 +++- src/main/java/tanks/Game.java | 4 +- src/main/java/tanks/Panel.java | 22 +- .../java/tanks/gui/screen/ScreenDebug.java | 4 +- .../java/tanks/network/ClientHandler.java | 129 ++--------- .../java/tanks/network/MessageReader.java | 13 +- .../java/tanks/network/NetworkHandler.java | 152 +++++++++++++ .../java/tanks/network/ServerHandler.java | 203 +++--------------- .../tanks/network/event/EventShootBullet.java | 40 ++-- .../network/event/EventStackedGroup.java | 54 +++++ 10 files changed, 352 insertions(+), 315 deletions(-) create mode 100644 src/main/java/tanks/network/NetworkHandler.java create mode 100644 src/main/java/tanks/network/event/EventStackedGroup.java diff --git a/src/main/java/tanks/DebugKeybinds.java b/src/main/java/tanks/DebugKeybinds.java index 984d46659..bf17cd74f 100644 --- a/src/main/java/tanks/DebugKeybinds.java +++ b/src/main/java/tanks/DebugKeybinds.java @@ -1,10 +1,11 @@ package tanks; import basewindow.*; -import it.unimi.dsi.fastutil.objects.ObjectSet; +import it.unimi.dsi.fastutil.objects.*; import tanks.gui.*; import tanks.gui.screen.*; import tanks.gui.screen.leveleditor.ScreenLevelEditor; +import tanks.network.event.INetworkEvent; import tanks.obstacle.*; import tanks.rendering.TerrainRenderer; import tanks.tank.*; @@ -251,6 +252,48 @@ else if (Game.game.window.pressedKeys.contains(InputCodes.KEY_3)) Game.game.window.fontRenderer.drawString(mx + 10, my + 10, Drawing.drawing.fontSize, Drawing.drawing.fontSize, text); } + public static final BiConsumer>, ArrayList> sortEvents = + (map, lines) -> + map.object2IntEntrySet().stream() + .sorted(Comparator.comparingInt(entry -> ((Object2IntMap.Entry) entry).getIntValue()).reversed()) + .limit(5) + .forEach(entry -> lines.add(entry.getKey().getSimpleName() + ": " + entry.getIntValue())); + + public static void drawEventCount() + { + Object2IntOpenHashMap> in = Panel.panel.eventsInCount; + Object2IntOpenHashMap> out = Panel.panel.eventsOutCount; + + if (!Game.recordEventData || (!ScreenPartyHost.isServer && !ScreenPartyLobby.isClient)) + return; + + ArrayList lines = new ArrayList<>(); + if (!in.isEmpty() || !out.isEmpty()) + { + lines.add("\u00a7255127000255Events in:\u00a7r"); + sortEvents.accept(in, lines); + lines.add("\u00a7255127000255Events out:\u00a7r"); + sortEvents.accept(out, lines); + } + else + lines.add("No events"); + + Drawing.drawing.setColor(255, 255, 255, 128); + double centerY = Drawing.drawing.getInterfaceEdgeY(true) - 350; + + Drawing.drawing.setInterfaceFontSize(20); + Drawing.drawing.setColor(0, 0, 0); + int i = -lines.size() / 2; + for (String s : lines) + { + Drawing.drawing.drawUncenteredInterfaceText( + 75, + centerY + 30 * (i++), + s + ); + } + } + public static void renderDebugging() { if (!Game.debug || Game.game.window.drawingShadow) @@ -260,6 +303,7 @@ public static void renderDebugging() Face.drawDebug(); Chunk.drawDebugStuff(); Ray.drawDebug(); + drawEventCount(); if (Game.drawAvoidObjects) { diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index f192bc7b8..4e66223f2 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -154,6 +154,7 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; + public static boolean recordEventData = false; public static final boolean cinematic = false; public static long steamLobbyInvite = -1; @@ -178,7 +179,7 @@ public int hashCode() public static boolean vsync = true; public static int maxFPS = 0; - public static int networkRate = 60; + public static int networkRate = 10; public static boolean enable3d = true; public static boolean enable3dBg = true; @@ -344,6 +345,7 @@ private Game() public static void registerEvents() { + NetworkEventMap.register(EventStackedGroup.class); NetworkEventMap.register(EventSendClientDetails.class); NetworkEventMap.register(EventPing.class); NetworkEventMap.register(EventConnectionSuccess.class); diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 48bbfe615..72d9b4c6d 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -1,6 +1,7 @@ package tanks; import basewindow.InputCodes; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import tanks.extension.Extension; import tanks.gui.*; import tanks.gui.ScreenElement.*; @@ -100,7 +101,10 @@ public class Panel /** Set to a directory to have the game screenshot the next frame and save it to that directory */ public String saveScreenshotDir = null; - public static void initialize() + public final Object2IntOpenHashMap> eventsInCount = new Object2IntOpenHashMap<>(); + public final Object2IntOpenHashMap> eventsOutCount = new Object2IntOpenHashMap<>(); + + public static void initialize() { if (!initialized) panel = new Panel(); @@ -348,11 +352,23 @@ else if (Game.deterministicMode) if (!(Game.eventsIn.get(i) instanceof IOnlineServerEvent)) { INetworkEvent e = Game.eventsIn.get(i); + INetworkEvent prev = null; if (e instanceof IStackableEvent) - stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); + prev = stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else - Game.eventsIn.get(i).execute(); + Game.eventsIn.get(i).execute(); + + if (Game.recordEventData && prev == null) + { + if (e instanceof EventStackedGroup) + { + for (INetworkEvent e2 : ((EventStackedGroup) e).events) + eventsInCount.addTo(e2.getClass(), 1); + } + else + eventsInCount.addTo(e.getClass(), 1); + } } } diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index 7d76ff8c2..02dc6f53d 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -28,13 +28,15 @@ public class ScreenDebug extends Screen Button drawAvoidObjects = createToggle("Draw avoid objects: ", b -> Game.drawAvoidObjects = b, () -> Game.drawAvoidObjects); Button disableFixes = createToggle("Disable fixes: ", b -> Game.disableErrorFixing = b, () -> Game.disableErrorFixing); Button recordMovableData = createToggle("Record movable data: ", b -> Game.recordMovableData = b, () -> Game.recordMovableData); + Button recordEventData = createToggle("Record event data: ", b -> Game.recordEventData = b, () -> Game.recordEventData); Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 5, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, + recordEventData )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/network/ClientHandler.java b/src/main/java/tanks/network/ClientHandler.java index 92cf9ae99..52167d9d9 100644 --- a/src/main/java/tanks/network/ClientHandler.java +++ b/src/main/java/tanks/network/ClientHandler.java @@ -1,36 +1,18 @@ package tanks.network; -import com.codedisaster.steamworks.SteamID; -import com.codedisaster.steamworks.SteamNetworking; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import com.codedisaster.steamworks.*; +import io.netty.buffer.*; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.ReferenceCountUtil; -import tanks.Crusade; -import tanks.Game; -import tanks.Panel; -import tanks.gui.screen.ScreenOverlayOnline; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.event.EventKick; -import tanks.network.event.EventSendClientDetails; -import tanks.network.event.INetworkEvent; -import tanks.network.event.IStackableEvent; +import tanks.*; +import tanks.gui.screen.*; +import tanks.network.event.*; import tanks.network.event.online.EventSendOnlineClientDetails; -import java.util.HashMap; import java.util.UUID; -public class ClientHandler extends ChannelInboundHandlerAdapter -{ - public String message = ""; - public MessageReader reader = new MessageReader(); - protected HashMap stackedEvents = new HashMap<>(); - protected long lastStackedEventSend = 0; - - public ChannelHandlerContext ctx; - public SteamID steamID; - +public class ClientHandler extends NetworkHandler +{ public long lastPingSent; public long lastLatency; @@ -42,6 +24,7 @@ public ClientHandler(boolean online, UUID connectionID) { this.online = online; this.connectionID = connectionID; + this.events = Game.eventsOut; } @Override @@ -93,53 +76,12 @@ else if (Client.handler.steamID != null) } } - public synchronized void sendEvent(INetworkEvent e) - { - this.sendEvent(e, true); - } - - public synchronized void sendEvent(INetworkEvent e, boolean flush) - { - if (steamID != null) - { - SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; - - if (flush) - sendType = SteamNetworking.P2PSend.Reliable; - - Game.steamNetworkHandler.send(steamID.getAccountID(), e, sendType); - return; - } - - ByteBuf b = ctx.channel().alloc().buffer(); - int i = NetworkEventMap.get(e.getClass()); - - if (i == -1) - throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); - - b.writeInt(i); - e.write(b); - - ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(b.readableBytes()); - MessageReader.upstreamBytes += b.readableBytes() + 4; - MessageReader.updateLastMessageTime(); - b2.writeBytes(b); - - if (flush) - ctx.channel().writeAndFlush(b2); - else - ctx.channel().write(b2); - - ReferenceCountUtil.release(b); - } - - public synchronized void sendEventAndClose(INetworkEvent e) + public synchronized void sendEventAndClose(INetworkEvent e) { if (steamID != null) Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); else - this.sendEvent(e); + this.sendEvent(e, true); ScreenPartyLobby.isClient = false; @@ -180,61 +122,16 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) this.reader.queueMessage(this, buffy, null); ReferenceCountUtil.release(msg); } - - public void reply() - { - synchronized (Game.eventsOut) - { - INetworkEvent prev = null; - for (int i = 0; i < Game.eventsOut.size(); i++) - { - INetworkEvent e = Game.eventsOut.get(i); - - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); - else - { - if (prev != null) - this.sendEvent(prev,false); - - prev = e; - } - } - - long time = System.currentTimeMillis() * Game.networkRate / 1000; - if (time != lastStackedEventSend) - { - lastStackedEventSend = time; - int size = this.stackedEvents.values().size(); - - if (prev != null) - this.sendEvent(prev, size == 0); - - for (IStackableEvent e: this.stackedEvents.values()) - { - size--; - this.sendEvent(e, size <= 0); - } - this.stackedEvents.clear(); - } - else if (prev != null) - this.sendEvent(prev, true); - if (steamID == null) - this.ctx.flush(); - - Game.eventsOut.clear(); - } - } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable e) { - System.err.println("A network exception has occurred: " + e.toString()); - Game.logger.println("A network exception has occurred: " + e.toString()); + System.err.println("A network exception has occurred: " + e); + Game.logger.println("A network exception has occurred: " + e); e.printStackTrace(); e.printStackTrace(Game.logger); - EventKick ev = new EventKick("A network exception has occurred: " + e.toString()); + EventKick ev = new EventKick("A network exception has occurred: " + e); ev.clientID = null; Game.eventsIn.add(ev); diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index abc5bb43e..1e9aab106 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -32,7 +32,6 @@ public void queueMessage(ClientHandler c, ByteBuf m, UUID clientID) this.queueMessage(null, c, m, clientID); } - public void queueMessage(ServerHandler s, ByteBuf m, UUID clientID) { this.queueMessage(s, null, m, clientID); @@ -121,13 +120,13 @@ else if (ScreenPartyLobby.isClient) { if (s != null) { - System.err.println("A network exception has occurred: " + e.toString() + " (" + s.rawUsername + "/" + s.clientID + ")"); - Game.logger.println("A network exception has occurred: " + e.toString() + " (" + s.rawUsername + "/" + s.clientID + ")"); + System.err.println("A network exception has occurred: " + e + " (" + s.rawUsername + "/" + s.clientID + ")"); + Game.logger.println("A network exception has occurred: " + e + " (" + s.rawUsername + "/" + s.clientID + ")"); } else { - System.err.println("A network exception has occurred: " + e.toString()); - Game.logger.println("A network exception has occurred: " + e.toString()); + System.err.println("A network exception has occurred: " + e); + Game.logger.println("A network exception has occurred: " + e); } e.printStackTrace(); @@ -135,12 +134,12 @@ else if (ScreenPartyLobby.isClient) if (ScreenPartyHost.isServer && s != null) { - s.sendEventAndClose(new EventKick("A network exception has occurred: " + e.toString())); + s.sendEventAndClose(new EventKick("A network exception has occurred: " + e)); //Game.screen = new ScreenHostingEnded("A network exception has occurred: " + e.toString()); } else if (ScreenPartyLobby.isClient) { - EventKick ev = new EventKick("A network exception has occurred: " + e.toString()); + EventKick ev = new EventKick("A network exception has occurred: " + e); ev.clientID = null; Game.eventsIn.add(ev); diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java new file mode 100644 index 000000000..540c49c0c --- /dev/null +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -0,0 +1,152 @@ +package tanks.network; + +import com.codedisaster.steamworks.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.*; +import io.netty.util.ReferenceCountUtil; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import tanks.*; +import tanks.network.event.*; + +import java.util.*; + +public abstract class NetworkHandler extends ChannelInboundHandlerAdapter +{ + public ChannelHandlerContext ctx; + public SteamID steamID; + + protected SynchronizedList events = new SynchronizedList<>(); + protected Int2ObjectOpenHashMap stackedEvents = new Int2ObjectOpenHashMap<>(); + + public boolean joined = false; + public boolean closed = false; + + public MessageReader reader = new MessageReader(); + + protected long lastStackedEventSend = 0; + protected HashMap, EventStackedGroup> groupedEvents = new HashMap<>(); + + public synchronized void sendEventAndClose(INetworkEvent e) + { + this.closed = true; + if (steamID != null) + Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); + else + this.sendEvent(e, true); + + if (ctx != null) + ctx.close(); + + if (steamID != null) + Game.steamNetworkHandler.queueClose(steamID.getAccountID()); + } + + public synchronized void sendEvent(INetworkEvent e) + { + sendEvent(e, true); + } + + public synchronized void sendEvent(INetworkEvent e, boolean flush) + { + if (steamID != null) + Game.steamNetworkHandler.send(steamID.getAccountID(), e, flush ? + SteamNetworking.P2PSend.Reliable : SteamNetworking.P2PSend.ReliableWithBuffering); + + if (Game.recordEventData) + { + if (e instanceof EventStackedGroup) + for (INetworkEvent e2 : ((EventStackedGroup) e).events) + Panel.panel.eventsOutCount.addTo(e2.getClass(), 1); + else + Panel.panel.eventsOutCount.addTo(e.getClass(), 1); + } + + ByteBuf b = ctx.channel().alloc().buffer(); + + int eventID = NetworkEventMap.get(e.getClass()); + if (eventID == -1) + throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); + + b.writeInt(eventID); + e.write(b); + + ByteBuf b2 = ctx.channel().alloc().buffer(); + b2.writeInt(b.readableBytes()); + MessageReader.upstreamBytes += b.readableBytes() + 4; + MessageReader.updateLastMessageTime(); + b2.writeBytes(b); + + if (flush) + ctx.channel().writeAndFlush(b2); + else + ctx.channel().write(b2); + + ReferenceCountUtil.release(b); + } + + public synchronized void stackEvent(INetworkEvent e) + { + groupedEvents.computeIfAbsent(e.getClass(), + k -> new EventStackedGroup(e.getClass())).events.add(e); + } + + public synchronized void flushEvents() + { + int i = 0; + for (EventStackedGroup e : this.groupedEvents.values()) + sendEvent(e, i++ >= this.groupedEvents.size() - 1); + groupedEvents.clear(); + } + + public void reply() + { + synchronized (this.events) + { + INetworkEvent prev = null; + for (INetworkEvent e : this.events) + { + INetworkEvent other = null; + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) + other = this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); + else + { + if (prev != null) + this.stackEvent(e); + + prev = e; + } + if (Game.recordEventData && other == null) + Panel.panel.eventsOutCount.addTo(e.getClass(), 1); + } + + long time = System.currentTimeMillis() * Game.networkRate / 1000; + if (time != lastStackedEventSend) + { + lastStackedEventSend = time; + + if (prev != null) + this.stackEvent(prev); + + for (IStackableEvent e : this.stackedEvents.values()) + this.stackEvent(e); + + this.stackedEvents.clear(); + flushEvents(); + } + else if (prev != null) + this.stackEvent(prev); + + if (steamID == null) + this.ctx.flush(); + + this.events.clear(); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) + { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/src/main/java/tanks/network/ServerHandler.java b/src/main/java/tanks/network/ServerHandler.java index a97e20abf..a663f9718 100644 --- a/src/main/java/tanks/network/ServerHandler.java +++ b/src/main/java/tanks/network/ServerHandler.java @@ -1,42 +1,26 @@ package tanks.network; -import com.codedisaster.steamworks.SteamID; -import com.codedisaster.steamworks.SteamNetworking; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; +import io.netty.buffer.*; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.ReferenceCountUtil; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.ChatMessage; import tanks.gui.screen.ScreenPartyHost; import tanks.network.event.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.UUID; +import java.util.*; -public class ServerHandler extends ChannelInboundHandlerAdapter +public class ServerHandler extends NetworkHandler { - public MessageReader reader = new MessageReader(); - protected ArrayList queuedEventIndices = new ArrayList<>(); protected ArrayList queuedEvents = new ArrayList<>(); - protected SynchronizedList events = new SynchronizedList<>(); - protected HashMap stackedEvents = new HashMap<>(); - protected long lastStackedEventSend = 0; - - public ChannelHandlerContext ctx; - public SteamID steamID; - public Server server; public boolean initialized = false; + public UUID clientID; public Player player; - public UUID clientID; public String rawUsername; public String username; @@ -44,9 +28,6 @@ public class ServerHandler extends ChannelInboundHandlerAdapter public long lastLatency; public boolean pingReceived = true; - public boolean joined = false; - public boolean closed = false; - public ServerHandler(Server s) { this.server = s; @@ -90,20 +71,12 @@ public void channelInactive(ChannelHandlerContext ctx) ScreenPartyHost.chat.add(0, new ChatMessage("\u00A7000127255255" + this.username + " has left the party\u00A7000000000255")); } } - -// //System.out.println(eventFrequencies); -// -// for (String s: eventFrequencies.keySet()) -// { -// System.out.println(s + ": " + eventFrequencies.get(s)); -// } - } + } /** * Queues an event to be added, to be sent exactly after all the events currently * in Game.eventsOut - * @param e - */ + */ public void queueEvent(INetworkEvent e) { this.queuedEvents.add(e); @@ -137,139 +110,29 @@ public void addEvents(ArrayList events) } } - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) - { - if (closed) - return; - - this.ctx = ctx; - ByteBuf buffy = (ByteBuf) msg; - this.reader.queueMessage(this, buffy, this.clientID); - - if (steamID == null) - ReferenceCountUtil.release(msg); - } - - public void reply() - { - synchronized (this.events) - { - INetworkEvent prev = null; - for (int i = 0; i < this.events.size(); i++) - { - INetworkEvent e = this.events.get(i); - - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); - else - { - if (prev != null) - this.sendEvent(prev,false); - - prev = e; - } - } - - long time = System.currentTimeMillis() * Game.networkRate / 1000; - if (time != lastStackedEventSend) - { - lastStackedEventSend = time; - int size = this.stackedEvents.values().size(); - - if (prev != null) - this.sendEvent(prev, size == 0); - - for (IStackableEvent e: this.stackedEvents.values()) - { - size--; - this.sendEvent(e, size <= 0); - } - this.stackedEvents.clear(); - } - else if (prev != null) - this.sendEvent(prev, true); - - if (steamID == null) - this.ctx.flush(); - - this.events.clear(); - - if (pingReceived && System.currentTimeMillis() - lastPingSent > 1000) - { - pingReceived = false; - lastPingSent = System.currentTimeMillis(); - this.sendEvent(new EventPing(false)); - } - } - } - - public synchronized void sendEvent(INetworkEvent e) - { - this.sendEvent(e, true); - } - - public HashMap eventFrequencies = new HashMap<>(); - - public synchronized void sendEvent(INetworkEvent e, boolean flush) - { - eventFrequencies.putIfAbsent(e.getClass().getSimpleName(), 0); - eventFrequencies.put(e.getClass().getSimpleName(), eventFrequencies.get(e.getClass().getSimpleName()) + 1); - - if (steamID != null) - { - SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; - - if (flush) - sendType = SteamNetworking.P2PSend.Reliable; - - Game.steamNetworkHandler.send(steamID.getAccountID(), e, sendType); - return; - } - - ByteBuf b = ctx.channel().alloc().buffer(); - - int i = NetworkEventMap.get(e.getClass()); - if (i == -1) - throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); - - b.writeInt(i); - e.write(b); - - ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(b.readableBytes()); - MessageReader.upstreamBytes += b.readableBytes() + 4; - MessageReader.updateLastMessageTime(); - b2.writeBytes(b); - - if (flush) - ctx.channel().writeAndFlush(b2); - else - ctx.channel().write(b2); - - ReferenceCountUtil.release(b); - } - - public synchronized void sendEventAndClose(INetworkEvent e) - { - this.closed = true; - if (steamID != null) - Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); - else - this.sendEvent(e); - - if (ctx != null) - ctx.close(); - - if (steamID != null) - Game.steamNetworkHandler.queueClose(steamID.getAccountID()); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) - { - cause.printStackTrace(); - - ctx.close(); - } -} \ No newline at end of file + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) + { + if (closed) + return; + + this.ctx = ctx; + this.reader.queueMessage(this, ((ByteBuf) msg), this.clientID); + + if (steamID == null) + ReferenceCountUtil.release(msg); + } + + @Override + public void reply() + { + super.reply(); + + if (pingReceived && System.currentTimeMillis() - lastPingSent > 1000) + { + pingReceived = false; + lastPingSent = System.currentTimeMillis(); + this.stackEvent(new EventPing(false)); + } + } +} diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index eb8d936f3..c40322d23 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -1,19 +1,12 @@ package tanks.network.event; import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Panel; -import tanks.bullet.Bullet; -import tanks.bullet.BulletInstant; -import tanks.item.Item; -import tanks.item.ItemBullet; -import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankAIControlled; -import tanks.tank.TankPlayer; -import tanks.tank.TankRemote; - -public class EventShootBullet extends PersonalEvent +import tanks.*; +import tanks.bullet.*; +import tanks.item.*; +import tanks.tank.*; + +public class EventShootBullet extends PersonalEvent implements IStackableEvent { public int id; public int tank; @@ -25,8 +18,10 @@ public class EventShootBullet extends PersonalEvent public double vZ; public double speed; public int item; - - public EventShootBullet() + + public boolean isStackable; + + public EventShootBullet() { } @@ -35,6 +30,7 @@ public EventShootBullet(Bullet b) { this.id = b.networkID; this.tank = b.tank.networkID; + this.isStackable = b.affectedByFrameFrequency; this.posX = b.posX; this.posY = b.posY; this.posZ = b.posZ; @@ -45,7 +41,13 @@ public EventShootBullet(Bullet b) this.item = b.item.networkIndex; } - @Override + @Override + public boolean isStackable() + { + return isStackable; + } + + @Override public void execute() { if (this.clientID != null) @@ -144,4 +146,10 @@ public void read(ByteBuf b) this.speed = b.readDouble(); this.item = b.readInt(); } + + @Override + public int getIdentifier() + { + return tank; + } } diff --git a/src/main/java/tanks/network/event/EventStackedGroup.java b/src/main/java/tanks/network/event/EventStackedGroup.java new file mode 100644 index 000000000..ffe32cd9a --- /dev/null +++ b/src/main/java/tanks/network/event/EventStackedGroup.java @@ -0,0 +1,54 @@ +package tanks.network.event; + +import io.netty.buffer.ByteBuf; +import tanks.network.NetworkEventMap; + +import java.util.ArrayList; + +public class EventStackedGroup extends PersonalEvent +{ + public Class eventCls; + public ArrayList events = new ArrayList<>(); + + public EventStackedGroup() {} + public EventStackedGroup(Class c) + { + this.eventCls = c; + } + + @Override + public void write(ByteBuf b) + { + b.writeInt(NetworkEventMap.get(this.eventCls)); + b.writeInt(this.events.size()); + for (INetworkEvent e : this.events) + e.write(b); + } + + @Override + public void read(ByteBuf b) + { + this.eventCls = NetworkEventMap.get(b.readInt()); + int size = b.readInt(); + for (int i = 0; i < size; i++) + { + try + { + INetworkEvent e = this.eventCls.getConstructor().newInstance(); + e.read(b); + this.events.add(e); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + } + + @Override + public void execute() + { + for (INetworkEvent e : this.events) + e.execute(); + } +} From 1a2425875cc702b164f446dd140c426d6f469435 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Thu, 4 Sep 2025 19:36:01 -0700 Subject: [PATCH 02/35] feat: network optimizations, reflection handlers Signed-off-by: orangishcat --- .../tanks/network/NetworkFieldHandle.java | 117 ++++++++++++++++++ src/main/java/tanks/network/NetworkUtils.java | 35 +++++- .../network/event/EventAddColoredTile.java | 30 ----- .../network/event/EventAddFixedShape.java | 30 ----- .../network/event/EventAddNPCShopItem.java | 21 +--- .../tanks/network/event/EventAddObstacle.java | 21 ---- .../network/event/EventAddObstacleBullet.java | 29 +---- .../network/event/EventAddObstacleText.java | 32 ----- .../tanks/network/event/EventAddShopItem.java | 25 +--- .../tanks/network/event/EventAirdropTank.java | 29 +---- .../event/EventAnnounceConnection.java | 18 --- .../network/event/EventArcadeBonuses.java | 17 --- .../event/EventArcadeClearMovables.java | 21 +--- .../tanks/network/event/EventArcadeEnd.java | 12 -- .../network/event/EventArcadeFrenzy.java | 16 +-- .../tanks/network/event/EventArcadeHit.java | 25 +--- .../network/event/EventArcadeRampage.java | 13 -- .../network/event/EventBeginCrusade.java | 12 -- .../event/EventBeginLevelCountdown.java | 12 -- .../EventBulletAddAttributeModifier.java | 36 +----- .../network/event/EventBulletBounce.java | 20 --- .../network/event/EventBulletDestroyed.java | 16 --- .../event/EventBulletInstantWaypoint.java | 17 --- .../event/EventBulletReboundIndicator.java | 3 +- .../network/event/EventBulletStunEffect.java | 14 --- .../network/event/EventBulletUpdate.java | 21 ---- .../event/EventBulletUpdateTarget.java | 14 --- .../event/EventChangeBackgroundColor.java | 25 ---- .../event/EventChangeScoreboardAttribute.java | 16 --- .../java/tanks/network/event/EventChat.java | 19 +-- .../network/event/EventClearNPCShop.java | 16 +-- .../tanks/network/event/EventClearShop.java | 13 -- .../network/event/EventConnectionSuccess.java | 12 -- .../event/EventCreateFreezeEffect.java | 19 +-- .../tanks/network/event/EventDisplayText.java | 28 ----- .../tanks/network/event/EventEnterLevel.java | 12 -- .../tanks/network/event/EventExplosion.java | 22 ---- .../tanks/network/event/EventItemDrop.java | 24 +--- .../network/event/EventItemDropDestroy.java | 13 -- .../tanks/network/event/EventItemPickup.java | 19 +-- .../java/tanks/network/event/EventKick.java | 17 +-- .../tanks/network/event/EventLayMine.java | 20 --- .../tanks/network/event/EventLevelExit.java | 14 --- .../network/event/EventLevelFinished.java | 11 -- .../event/EventLevelFinishedQuick.java | 12 -- .../network/event/EventLoadCrusadeHotbar.java | 19 --- .../network/event/EventLoadItemBarSlot.java | 14 --- .../tanks/network/event/EventLoadLevel.java | 16 --- .../network/event/EventMineChangeTimer.java | 14 --- .../tanks/network/event/EventMineRemove.java | 12 -- .../tanks/network/event/EventMutePlayer.java | 12 -- .../event/EventObstacleBoostPanelEffect.java | 25 +--- .../network/event/EventObstacleDestroy.java | 25 ---- .../tanks/network/event/EventObstacleHit.java | 21 ---- .../event/EventObstacleShrubberyBurn.java | 14 --- .../network/event/EventObstacleSnowMelt.java | 20 +-- .../java/tanks/network/event/EventPing.java | 16 +-- .../tanks/network/event/EventPlaySound.java | 20 +-- .../event/EventPlayerAutoReadyConfirm.java | 12 -- .../tanks/network/event/EventPlayerChat.java | 15 --- .../tanks/network/event/EventPlayerReady.java | 13 -- .../network/event/EventPlayerRevealBuild.java | 14 --- .../network/event/EventPlayerSetBuild.java | 12 -- .../network/event/EventPurchaseBuild.java | 17 --- .../network/event/EventPurchaseItem.java | 17 +-- .../network/event/EventPurchaseNPCItem.java | 14 --- .../network/event/EventReturnToCrusade.java | 18 --- .../network/event/EventReturnToLobby.java | 12 -- .../event/EventScoreboardUpdateScore.java | 16 --- .../network/event/EventSendClientDetails.java | 17 --- .../network/event/EventSendTankColors.java | 24 +--- .../tanks/network/event/EventSetItem.java | 16 --- .../network/event/EventSetItemBarSlot.java | 16 +-- .../network/event/EventSetLevelVersus.java | 16 --- .../tanks/network/event/EventSetupHotbar.java | 21 +--- .../network/event/EventShareCrusade.java | 16 --- .../tanks/network/event/EventShareLevel.java | 16 --- .../tanks/network/event/EventShootBullet.java | 30 ----- .../network/event/EventShowCrusadeStats.java | 18 --- .../event/EventSortNPCShopButtons.java | 15 +-- .../network/event/EventSortShopButtons.java | 14 --- .../network/event/EventStatusEffectBegin.java | 20 --- .../event/EventStatusEffectDeteriorate.java | 18 --- .../network/event/EventStatusEffectEnd.java | 20 +-- .../event/EventTankAddAttributeModifier.java | 32 ----- .../tanks/network/event/EventTankCharge.java | 19 +-- .../event/EventTankControllerAddVelocity.java | 19 --- .../EventTankControllerUpdateAmmunition.java | 28 ----- .../event/EventTankControllerUpdateC.java | 52 ++------ .../event/EventTankControllerUpdateS.java | 14 --- .../tanks/network/event/EventTankCreate.java | 32 +---- .../network/event/EventTankCustomCreate.java | 36 ------ .../network/event/EventTankMimicLaser.java | 21 +--- .../event/EventTankMimicTransform.java | 14 --- .../network/event/EventTankPlayerCreate.java | 36 ------ .../tanks/network/event/EventTankRemove.java | 14 --- .../tanks/network/event/EventTankSpawn.java | 24 ---- .../network/event/EventTankTeleport.java | 31 ----- .../event/EventTankTransformCustom.java | 99 ++------------- .../event/EventTankTransformPreset.java | 16 --- .../tanks/network/event/EventTankUpdate.java | 28 +---- .../network/event/EventTankUpdateColor.java | 20 --- .../network/event/EventTankUpdateHealth.java | 18 +-- .../event/EventTankUpdateVisibility.java | 14 --- .../tanks/network/event/EventUpdateCoins.java | 19 +-- .../event/EventUpdateEliminatedPlayers.java | 21 +--- .../event/EventUpdateReadyPlayers.java | 14 --- .../event/EventUpdateRemainingLives.java | 14 --- .../network/event/EventUpdateTankAbility.java | 16 --- .../network/event/EventUpdateTankColors.java | 18 --- .../tanks/network/event/INetworkEvent.java | 41 +++++- 111 files changed, 246 insertions(+), 2097 deletions(-) create mode 100644 src/main/java/tanks/network/NetworkFieldHandle.java diff --git a/src/main/java/tanks/network/NetworkFieldHandle.java b/src/main/java/tanks/network/NetworkFieldHandle.java new file mode 100644 index 000000000..d2836b54b --- /dev/null +++ b/src/main/java/tanks/network/NetworkFieldHandle.java @@ -0,0 +1,117 @@ +package tanks.network; + +import basewindow.Color; +import io.netty.buffer.ByteBuf; +import tanks.*; + +import java.lang.invoke.*; +import java.lang.reflect.Field; +import java.util.*; + +public class NetworkFieldHandle +{ + private static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + + public static class FieldHandle + { + private final Class castType; + private final Function read; + private final BiConsumer write; + + private FieldHandle(Class castType, Function read, BiConsumer write) + { + this.castType = castType; + this.read = read; + this.write = write; + } + + public T read(ByteBuf b) + { + return castType.cast(read.apply(b)); + } + + public void write(ByteBuf b, Object t) + { + write.accept(b, (T) t); + } + + @SuppressWarnings("UnusedReturnValue") + public static FieldHandle register(Class castType, Function read, BiConsumer write) + { + return register(castType, castType, read, write); + } + + public static FieldHandle register(Class originalType, Class castType, Function read, BiConsumer write) + { + FieldHandle f = new FieldHandle<>(castType, read, write); + sigs.put(originalType, f); + return f; + } + } + + static Map, FieldHandle> sigs = new HashMap<>(); + + public static void initialize() + { + if (!sigs.isEmpty()) + return; + + FieldHandle.register(int.class, ByteBuf::readInt, ByteBuf::writeInt); + FieldHandle.register(long.class, ByteBuf::readLong, ByteBuf::writeLong); + FieldHandle.register(float.class, float.class, ByteBuf::readFloat, ByteBuf::writeFloat); + FieldHandle.register(double.class, float.class, ByteBuf::readFloat, ByteBuf::writeFloat); // treat doubles as floats + FieldHandle.register(boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean); + FieldHandle.register(String.class, NetworkUtils::readString, NetworkUtils::writeString); + FieldHandle.register(Color.class, NetworkUtils::readColor, NetworkUtils::writeColor); + FieldHandle.register(UUID.class, NetworkUtils::readUUID, NetworkUtils::writeUUID); + + // bytebuf takes int for these + FieldHandle.register(byte.class, int.class, ByteBuf::readByte, ByteBuf::writeByte); + FieldHandle.register(short.class, int.class, ByteBuf::readShort, ByteBuf::writeShort); + FieldHandle.register(char.class, int.class, ByteBuf::readChar, ByteBuf::writeChar); + } + + public Object object; + private final MethodHandle read, write; + private final FieldHandle fieldHandle; + + public NetworkFieldHandle(Field field, Object o) + { + initialize(); + this.object = o; + try + { + this.read = lookup.unreflectGetter(field); + this.write = lookup.unreflectSetter(field); + this.fieldHandle = sigs.get(field.getType()); + } + catch (IllegalAccessException e) + { + throw new RuntimeException(e); + } + } + + public void read(ByteBuf b) + { + try + { + this.write.invoke(this.object, this.fieldHandle.read(b)); + } + catch (Throwable e) + { + throw new RuntimeException(e); + } + } + + public void write(ByteBuf b) + { + try + { + this.fieldHandle.write(b, this.read.invoke(this.object)); + } + catch (Throwable e) + { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/tanks/network/NetworkUtils.java b/src/main/java/tanks/network/NetworkUtils.java index e10eae4c9..709a5adc9 100644 --- a/src/main/java/tanks/network/NetworkUtils.java +++ b/src/main/java/tanks/network/NetworkUtils.java @@ -2,9 +2,10 @@ import basewindow.Color; import io.netty.buffer.ByteBuf; +import tanks.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; +import java.nio.charset.*; +import java.util.*; public class NetworkUtils { @@ -38,16 +39,42 @@ public static void writeString(ByteBuf b, String s) b.writeCharSequence(s, charset); } - public static void readColor(ByteBuf b, Color c) + public static void writeUUID(ByteBuf b, UUID u) + { + NetworkUtils.writeString(b, u.toString()); + } + + public static UUID readUUID(ByteBuf b) + { + return UUID.fromString(Objects.requireNonNull(NetworkUtils.readString(b))); + } + + public static void writeCollection(ByteBuf b, Collection l, BiConsumer write) + { + b.writeInt(l.size()); + for (T s: l) + write.accept(b, s); + } + + public static > void readCollection(ByteBuf b, V list, Function read) + { + int size = b.readInt(); + for (int i = 0; i < size; i++) + list.add(read.apply(b)); + } + + public static Color readColor(ByteBuf b) { + Color c = new Color(); c.red = b.readDouble(); c.green = b.readDouble(); c.blue = b.readDouble(); + return c; } public static void writeColor(ByteBuf b, Color c) { - b.writeDouble(c.red); + b.writeDouble(c.red); b.writeDouble(c.green); b.writeDouble(c.blue); } diff --git a/src/main/java/tanks/network/event/EventAddColoredTile.java b/src/main/java/tanks/network/event/EventAddColoredTile.java index e7dd65c0f..dc3cabf6e 100644 --- a/src/main/java/tanks/network/event/EventAddColoredTile.java +++ b/src/main/java/tanks/network/event/EventAddColoredTile.java @@ -37,36 +37,6 @@ public EventAddColoredTile(double x, double y, double length, double width, doub this.flashSpeedMultiplier = flashSpeedMultiplier; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.length); - b.writeDouble(this.width); - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - b.writeDouble(this.colorA); - b.writeBoolean(this.flashing); - b.writeDouble(this.flashSpeedMultiplier); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.length = b.readDouble(); - this.width = b.readDouble(); - this.colorR = b.readDouble(); - this.colorG = b.readDouble(); - this.colorB = b.readDouble(); - this.colorA = b.readDouble(); - this.flashing = b.readBoolean(); - this.flashSpeedMultiplier = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddFixedShape.java b/src/main/java/tanks/network/event/EventAddFixedShape.java index 9ef5a53ca..5481695f6 100644 --- a/src/main/java/tanks/network/event/EventAddFixedShape.java +++ b/src/main/java/tanks/network/event/EventAddFixedShape.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Drawing; -import tanks.network.NetworkUtils; public class EventAddFixedShape extends PersonalEvent { @@ -44,34 +42,6 @@ public EventAddFixedShape(String type, int x, int y, int r, int g, int b, boolea this.centered = centered; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.type); - b.writeInt(this.posX); - b.writeInt(this.posY); - - b.writeInt(this.colorR); - b.writeInt(this.colorG); - b.writeInt(this.colorB); - - b.writeBoolean(this.centered); - } - - @Override - public void read(ByteBuf b) - { - this.type = NetworkUtils.readString(b); - this.posX = b.readInt(); - this.posY = b.readInt(); - - this.colorR = b.readInt(); - this.colorG = b.readInt(); - this.colorB = b.readInt(); - - this.centered = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddNPCShopItem.java b/src/main/java/tanks/network/event/EventAddNPCShopItem.java index 39bd54f18..61141a90a 100644 --- a/src/main/java/tanks/network/event/EventAddNPCShopItem.java +++ b/src/main/java/tanks/network/event/EventAddNPCShopItem.java @@ -1,12 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; +import tanks.*; import tanks.gui.Button; import tanks.gui.screen.ScreenGame; -import tanks.item.Item; -import tanks.item.ItemRemote; +import tanks.item.*; import tanks.tank.TankNPC; public class EventAddNPCShopItem extends EventAddShopItem @@ -24,20 +21,6 @@ public EventAddNPCShopItem(int item, String name, String desc, int price, String this.id = npcId; } - @Override - public void write(ByteBuf b) - { - super.write(b); - b.writeInt(this.id); - } - - @Override - public void read(ByteBuf b) - { - super.read(b); - this.id = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddObstacle.java b/src/main/java/tanks/network/event/EventAddObstacle.java index 640ed1d20..9993d33e1 100644 --- a/src/main/java/tanks/network/event/EventAddObstacle.java +++ b/src/main/java/tanks/network/event/EventAddObstacle.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleStackable; import java.lang.reflect.InvocationTargetException; @@ -28,24 +25,6 @@ public EventAddObstacle(Obstacle o) this.metadata = o.getMetadata(); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - NetworkUtils.writeString(b, metadata); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.metadata = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddObstacleBullet.java b/src/main/java/tanks/network/event/EventAddObstacleBullet.java index 945b12af4..a9016a878 100644 --- a/src/main/java/tanks/network/event/EventAddObstacleBullet.java +++ b/src/main/java/tanks/network/event/EventAddObstacleBullet.java @@ -1,12 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleStackable; - -import java.lang.reflect.InvocationTargetException; +import tanks.obstacle.*; public class EventAddObstacleBullet extends PersonalEvent { @@ -32,28 +27,6 @@ public EventAddObstacleBullet(Obstacle o, boolean success) this.success = success; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - b.writeBoolean(this.success); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.colorR = b.readDouble(); - this.colorG = b.readDouble(); - this.colorB = b.readDouble(); - this.success = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddObstacleText.java b/src/main/java/tanks/network/event/EventAddObstacleText.java index 05bb90cd5..98e2488f2 100644 --- a/src/main/java/tanks/network/event/EventAddObstacleText.java +++ b/src/main/java/tanks/network/event/EventAddObstacleText.java @@ -38,38 +38,6 @@ public EventAddObstacleText(int id, String text, double posX, double posY, doubl this.duration = duration; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - - b.writeDouble(this.posX); - b.writeDouble(this.posY); - NetworkUtils.writeString(b, text); - - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - - b.writeLong(duration); - } - - @Override - public void read(ByteBuf b) - { - id = b.readInt(); - - posX = b.readDouble(); - posY = b.readDouble(); - text = NetworkUtils.readString(b); - - colorR = b.readDouble(); - colorG = b.readDouble(); - colorB = b.readDouble(); - - duration = b.readLong(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAddShopItem.java b/src/main/java/tanks/network/event/EventAddShopItem.java index 841c616fd..779b5da9e 100644 --- a/src/main/java/tanks/network/event/EventAddShopItem.java +++ b/src/main/java/tanks/network/event/EventAddShopItem.java @@ -1,12 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.Button; import tanks.gui.screen.ScreenGame; -import tanks.item.Item; -import tanks.item.ItemRemote; -import tanks.network.NetworkUtils; +import tanks.item.*; public class EventAddShopItem extends PersonalEvent { @@ -30,26 +27,6 @@ public EventAddShopItem(int item, String name, String desc, int price, String ic this.icon = icon; } - @Override - public void write(ByteBuf b) - { - b.writeInt(item); - NetworkUtils.writeString(b, name); - NetworkUtils.writeString(b, description); - b.writeInt(price); - NetworkUtils.writeString(b, icon); - } - - @Override - public void read(ByteBuf b) - { - item = b.readInt(); - name = NetworkUtils.readString(b); - description = NetworkUtils.readString(b); - price = b.readInt(); - icon = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAirdropTank.java b/src/main/java/tanks/network/event/EventAirdropTank.java index 65999e3a7..307dbab67 100644 --- a/src/main/java/tanks/network/event/EventAirdropTank.java +++ b/src/main/java/tanks/network/event/EventAirdropTank.java @@ -1,13 +1,8 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Team; -import tanks.network.NetworkUtils; -import tanks.tank.Crate; -import tanks.tank.Tank; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventAirdropTank extends EventTankCreate { @@ -35,7 +30,7 @@ public void execute() if (this.clientID == null) { Tank t = Game.registryTank.getEntry(this.type).getTank(this.posX, this.posY, this.angle); - Team tm = (Team) Game.currentLevel.teamsMap.get(this.team); + Team tm = Game.currentLevel.teamsMap.get(this.team); if (this.team.equals("**")) { tm = Game.enemyTeam; @@ -47,22 +42,4 @@ public void execute() Game.movables.add(new Crate(new TankRemote(t), height)); } } - - @Override - public void read(ByteBuf b) - { - super.read(b); - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - this.height = b.readDouble(); - } - - @Override - public void write(ByteBuf b) - { - super.write(b); - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - b.writeDouble(this.height); - } } diff --git a/src/main/java/tanks/network/event/EventAnnounceConnection.java b/src/main/java/tanks/network/event/EventAnnounceConnection.java index fa6c9e1d5..676cd9343 100644 --- a/src/main/java/tanks/network/event/EventAnnounceConnection.java +++ b/src/main/java/tanks/network/event/EventAnnounceConnection.java @@ -65,22 +65,4 @@ public void execute() } } - @Override - public void read(ByteBuf b) - { - this.joined = b.readBoolean(); - this.clientIdTarget = UUID.fromString(NetworkUtils.readString(b)); - this.name = NetworkUtils.readString(b); - this.isBot = b.readBoolean(); - } - - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.joined); - NetworkUtils.writeString(b, this.clientIdTarget.toString()); - NetworkUtils.writeString(b, this.name); - b.writeBoolean(this.isBot); - } - } diff --git a/src/main/java/tanks/network/event/EventArcadeBonuses.java b/src/main/java/tanks/network/event/EventArcadeBonuses.java index d77c93f64..1e88fef88 100644 --- a/src/main/java/tanks/network/event/EventArcadeBonuses.java +++ b/src/main/java/tanks/network/event/EventArcadeBonuses.java @@ -37,23 +37,6 @@ public ScreenArcadeBonuses.Bonus readBonus(ByteBuf b) return new ScreenArcadeBonuses.Bonus(NetworkUtils.readString(b), b.readInt(), b.readDouble(), b.readDouble(), b.readDouble()); } - - @Override - public void write(ByteBuf b) - { - writeBonus(bonus1, b); - writeBonus(bonus2, b); - writeBonus(bonus3, b); - } - - @Override - public void read(ByteBuf b) - { - this.bonus1 = readBonus(b); - this.bonus2 = readBonus(b); - this.bonus3 = readBonus(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeClearMovables.java b/src/main/java/tanks/network/event/EventArcadeClearMovables.java index 22ee6f865..b2cbb66f0 100644 --- a/src/main/java/tanks/network/event/EventArcadeClearMovables.java +++ b/src/main/java/tanks/network/event/EventArcadeClearMovables.java @@ -1,27 +1,10 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; -import tanks.tank.Crate; -import tanks.tank.TankPlayerController; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventArcadeClearMovables extends PersonalEvent { - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeEnd.java b/src/main/java/tanks/network/event/EventArcadeEnd.java index 8dbdde47d..09bf97616 100644 --- a/src/main/java/tanks/network/event/EventArcadeEnd.java +++ b/src/main/java/tanks/network/event/EventArcadeEnd.java @@ -18,18 +18,6 @@ public EventArcadeEnd() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(win); - } - - @Override - public void read(ByteBuf b) - { - win = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeFrenzy.java b/src/main/java/tanks/network/event/EventArcadeFrenzy.java index 26680cf4b..1cd90c42b 100644 --- a/src/main/java/tanks/network/event/EventArcadeFrenzy.java +++ b/src/main/java/tanks/network/event/EventArcadeFrenzy.java @@ -1,24 +1,10 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.minigames.Arcade; public class EventArcadeFrenzy extends PersonalEvent { - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeHit.java b/src/main/java/tanks/network/event/EventArcadeHit.java index a554f3cf4..268d60f2a 100644 --- a/src/main/java/tanks/network/event/EventArcadeHit.java +++ b/src/main/java/tanks/network/event/EventArcadeHit.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.minigames.Arcade; public class EventArcadeHit extends PersonalEvent @@ -28,26 +25,6 @@ public EventArcadeHit() } - @Override - public void write(ByteBuf b) - { - b.writeInt(power); - b.writeDouble(posX); - b.writeDouble(posY); - b.writeDouble(posZ); - b.writeInt(points); - } - - @Override - public void read(ByteBuf b) - { - power = b.readInt(); - posX = b.readDouble(); - posY = b.readDouble(); - posZ = b.readDouble(); - points = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeRampage.java b/src/main/java/tanks/network/event/EventArcadeRampage.java index 8498c1596..c9e6555a0 100644 --- a/src/main/java/tanks/network/event/EventArcadeRampage.java +++ b/src/main/java/tanks/network/event/EventArcadeRampage.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.minigames.Arcade; @@ -18,18 +17,6 @@ public EventArcadeRampage() } - @Override - public void write(ByteBuf b) - { - b.writeInt(power); - } - - @Override - public void read(ByteBuf b) - { - power = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBeginCrusade.java b/src/main/java/tanks/network/event/EventBeginCrusade.java index 87d792a34..7f7562241 100644 --- a/src/main/java/tanks/network/event/EventBeginCrusade.java +++ b/src/main/java/tanks/network/event/EventBeginCrusade.java @@ -11,18 +11,6 @@ public EventBeginCrusade() } - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java index c91051c2a..7768ab529 100644 --- a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java +++ b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java @@ -21,16 +21,4 @@ public void execute() ((ScreenGame) Game.screen).cancelCountdown = false; } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java b/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java index 6104cd415..640265049 100644 --- a/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java @@ -1,9 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.attribute.AttributeModifier; import tanks.bullet.Bullet; -import tanks.network.NetworkUtils; +import tanks.effect.AttributeModifier; public class EventBulletAddAttributeModifier extends PersonalEvent { @@ -42,38 +40,6 @@ public EventBulletAddAttributeModifier(Bullet b, AttributeModifier m, boolean un this.unduplicate = unduplicate; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.duration); - b.writeDouble(this.deteriorationAge); - b.writeDouble(this.warmupAge); - b.writeDouble(this.value); - NetworkUtils.writeString(b, this.effect); - b.writeDouble(this.age); - NetworkUtils.writeString(b, this.type); - b.writeBoolean(this.expired); - b.writeBoolean(this.unduplicate); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.name = NetworkUtils.readString(b); - this.duration = b.readDouble(); - this.deteriorationAge = b.readDouble(); - this.warmupAge = b.readDouble(); - this.value = b.readDouble(); - this.effect = NetworkUtils.readString(b); - this.age = b.readDouble(); - this.type = NetworkUtils.readString(b); - this.expired = b.readBoolean(); - this.unduplicate = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBulletBounce.java b/src/main/java/tanks/network/event/EventBulletBounce.java index 30a1a7a40..4805c340e 100644 --- a/src/main/java/tanks/network/event/EventBulletBounce.java +++ b/src/main/java/tanks/network/event/EventBulletBounce.java @@ -24,26 +24,6 @@ public EventBulletBounce(Bullet b) this.vX = b.vX; this.vY = b.vY; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - } @Override public void execute() diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index b8d2804d3..4b8af2d2e 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -49,20 +49,4 @@ public void execute() Bullet.idMap.remove(b.networkID); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java index 094ea3f51..cc411c693 100644 --- a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java +++ b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java @@ -22,23 +22,6 @@ public EventBulletInstantWaypoint(BulletInstant b, double x, double y) this.posX = x; this.posY = y; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java index 78ed00ab1..76d998dc2 100644 --- a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java +++ b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java @@ -45,7 +45,8 @@ public void read(ByteBuf b) b.readDouble(), b.readDouble(), b.readDouble(), - b.readDouble()); + b.readDouble() + ); } @Override diff --git a/src/main/java/tanks/network/event/EventBulletStunEffect.java b/src/main/java/tanks/network/event/EventBulletStunEffect.java index de3b98da7..b556f5d78 100644 --- a/src/main/java/tanks/network/event/EventBulletStunEffect.java +++ b/src/main/java/tanks/network/event/EventBulletStunEffect.java @@ -42,18 +42,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.length); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.length = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventBulletUpdate.java b/src/main/java/tanks/network/event/EventBulletUpdate.java index 23530188e..6db5bf742 100644 --- a/src/main/java/tanks/network/event/EventBulletUpdate.java +++ b/src/main/java/tanks/network/event/EventBulletUpdate.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.bullet.Bullet; public class EventBulletUpdate extends PersonalEvent @@ -25,26 +24,6 @@ public EventBulletUpdate(Bullet b) this.vY = b.vY; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java index f2f8f9a18..4e5a21716 100644 --- a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java +++ b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java @@ -24,20 +24,6 @@ public EventBulletUpdateTarget(Bullet b) this.target = b.homingTarget.networkID; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeInt(this.target); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.target = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java index b7ec865dc..01f22a588 100644 --- a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java +++ b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.Level; import tanks.gui.screen.leveleditor.ScreenLevelEditor; @@ -32,30 +31,6 @@ public EventChangeBackgroundColor(int r, int g, int b, int noiseR, int noiseG, i this.noiseB = noiseB; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.colorR); - b.writeInt(this.colorG); - b.writeInt(this.colorB); - - b.writeInt(this.noiseR); - b.writeInt(this.noiseG); - b.writeInt(this.noiseB); - } - - @Override - public void read(ByteBuf b) - { - this.colorR = b.readInt(); - this.colorG = b.readInt(); - this.colorB = b.readInt(); - - this.noiseR = b.readInt(); - this.noiseG = b.readInt(); - this.noiseB = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java b/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java index 684a40c54..eff10a27f 100644 --- a/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java +++ b/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java @@ -24,22 +24,6 @@ public EventChangeScoreboardAttribute(int id, String attributeName, double value this.value = value; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - NetworkUtils.writeString(b, this.attributeName); - b.writeDouble(this.value); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.attributeName = NetworkUtils.readString(b); - this.value = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventChat.java b/src/main/java/tanks/network/event/EventChat.java index bef8fee0c..fb48db169 100644 --- a/src/main/java/tanks/network/event/EventChat.java +++ b/src/main/java/tanks/network/event/EventChat.java @@ -1,11 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.ChatMessage; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; +import tanks.gui.screen.*; import tanks.network.ServerHandler; public class EventChat extends PersonalEvent @@ -49,20 +46,8 @@ else if (ScreenPartyHost.activeScreen.mutedPlayers.contains(this.clientID)) } } } + } - } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.message); - } - - @Override - public void read(ByteBuf b) - { - this.message = NetworkUtils.readString(b); - } public static boolean isStringValid(String s) { diff --git a/src/main/java/tanks/network/event/EventClearNPCShop.java b/src/main/java/tanks/network/event/EventClearNPCShop.java index 34a6c8038..8ac3f4a81 100644 --- a/src/main/java/tanks/network/event/EventClearNPCShop.java +++ b/src/main/java/tanks/network/event/EventClearNPCShop.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; +import tanks.*; import tanks.gui.ButtonList; import tanks.gui.screen.ScreenGame; import tanks.tank.TankNPC; @@ -23,18 +21,6 @@ public EventClearNPCShop(int id) this.id = id; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventClearShop.java b/src/main/java/tanks/network/event/EventClearShop.java index d1aad102f..2bf0bb0d8 100644 --- a/src/main/java/tanks/network/event/EventClearShop.java +++ b/src/main/java/tanks/network/event/EventClearShop.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.ButtonList; import tanks.gui.screen.ScreenGame; @@ -14,18 +13,6 @@ public EventClearShop() } - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventConnectionSuccess.java b/src/main/java/tanks/network/event/EventConnectionSuccess.java index 048c9f18d..bca830932 100644 --- a/src/main/java/tanks/network/event/EventConnectionSuccess.java +++ b/src/main/java/tanks/network/event/EventConnectionSuccess.java @@ -21,16 +21,4 @@ public void execute() Game.eventsOut.add(new EventSendTankColors(Game.player)); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventCreateFreezeEffect.java b/src/main/java/tanks/network/event/EventCreateFreezeEffect.java index 51ffc6b8a..828598365 100644 --- a/src/main/java/tanks/network/event/EventCreateFreezeEffect.java +++ b/src/main/java/tanks/network/event/EventCreateFreezeEffect.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.AreaEffectFreeze; -import tanks.Game; +import tanks.*; public class EventCreateFreezeEffect extends PersonalEvent { @@ -20,21 +18,6 @@ public EventCreateFreezeEffect(AreaEffectFreeze a) this.posY = a.posY; } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(posX); - b.writeDouble(posY); - } - - @Override - public void read(ByteBuf b) - { - posX = b.readDouble(); - posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventDisplayText.java b/src/main/java/tanks/network/event/EventDisplayText.java index ddd8cd792..a05296e8c 100644 --- a/src/main/java/tanks/network/event/EventDisplayText.java +++ b/src/main/java/tanks/network/event/EventDisplayText.java @@ -36,34 +36,6 @@ public EventDisplayText(String location, String text, boolean afterGameStarted, this.colorB = b; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.location); - NetworkUtils.writeString(b, this.text); - b.writeInt(this.duration); - b.writeBoolean(this.afterGameStarted); - b.writeBoolean(this.hasItems); - - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - } - - @Override - public void read(ByteBuf b) - { - this.location = NetworkUtils.readString(b); - this.text = NetworkUtils.readString(b); - this.duration = b.readInt(); - this.afterGameStarted = b.readBoolean(); - this.hasItems = b.readBoolean(); - - this.colorR = b.readDouble(); - this.colorG = b.readDouble(); - this.colorB = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventEnterLevel.java b/src/main/java/tanks/network/event/EventEnterLevel.java index 5a8633792..ed62e1b65 100644 --- a/src/main/java/tanks/network/event/EventEnterLevel.java +++ b/src/main/java/tanks/network/event/EventEnterLevel.java @@ -26,16 +26,4 @@ public void execute() Crusade.currentCrusade = null; } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventExplosion.java b/src/main/java/tanks/network/event/EventExplosion.java index dbc1b4d71..a8c5998a3 100644 --- a/src/main/java/tanks/network/event/EventExplosion.java +++ b/src/main/java/tanks/network/event/EventExplosion.java @@ -47,26 +47,4 @@ public void execute() e.explode(); } } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.radius); - b.writeDouble(this.kbRadius); - b.writeDouble(this.damage); - b.writeBoolean(this.destroysObstacles); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.radius = b.readDouble(); - this.kbRadius = b.readDouble(); - this.damage = b.readDouble(); - this.destroysObstacles = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventItemDrop.java b/src/main/java/tanks/network/event/EventItemDrop.java index 1dbefaa1f..992cc04c1 100644 --- a/src/main/java/tanks/network/event/EventItemDrop.java +++ b/src/main/java/tanks/network/event/EventItemDrop.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.ItemDrop; +import tanks.*; import tanks.item.Item; -import tanks.network.NetworkUtils; public class EventItemDrop extends PersonalEvent { @@ -26,25 +23,6 @@ public EventItemDrop(ItemDrop id) this.posY = id.posY; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - NetworkUtils.writeString(b, item); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.item = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventItemDropDestroy.java b/src/main/java/tanks/network/event/EventItemDropDestroy.java index 5e666112d..3fcb6e99e 100644 --- a/src/main/java/tanks/network/event/EventItemDropDestroy.java +++ b/src/main/java/tanks/network/event/EventItemDropDestroy.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.ItemDrop; public class EventItemDropDestroy extends PersonalEvent @@ -17,18 +16,6 @@ public EventItemDropDestroy(ItemDrop id) this.itemDrop = id.networkID; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.itemDrop); - } - - @Override - public void read(ByteBuf b) - { - this.itemDrop = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventItemPickup.java b/src/main/java/tanks/network/event/EventItemPickup.java index a6bb72929..bc497c228 100644 --- a/src/main/java/tanks/network/event/EventItemPickup.java +++ b/src/main/java/tanks/network/event/EventItemPickup.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.ItemDrop; +import tanks.*; import tanks.tank.Tank; public class EventItemPickup extends PersonalEvent @@ -20,21 +18,6 @@ public EventItemPickup(ItemDrop id, Tank pickup) this.itemDrop = id.networkID; this.tank = pickup.networkID; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.itemDrop); - b.writeInt(this.tank); - } - - @Override - public void read(ByteBuf b) - { - this.itemDrop = b.readInt(); - this.tank = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventKick.java b/src/main/java/tanks/network/event/EventKick.java index 7d103ead5..52587cb8b 100644 --- a/src/main/java/tanks/network/event/EventKick.java +++ b/src/main/java/tanks/network/event/EventKick.java @@ -1,11 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.gui.screen.ScreenKicked; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.Client; -import tanks.network.NetworkUtils; public class EventKick extends PersonalEvent { @@ -35,16 +32,4 @@ public void execute() Game.screen = new ScreenKicked(reason); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.reason); - } - - @Override - public void read(ByteBuf b) - { - this.reason = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventLayMine.java b/src/main/java/tanks/network/event/EventLayMine.java index 70fd159bd..44406f9e9 100644 --- a/src/main/java/tanks/network/event/EventLayMine.java +++ b/src/main/java/tanks/network/event/EventLayMine.java @@ -81,24 +81,4 @@ else if (t2 instanceof TankPlayer) Mine.idMap.put(id, m); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeInt(this.item); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.item = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventLevelExit.java b/src/main/java/tanks/network/event/EventLevelExit.java index bdc1fe9e1..04f7e7afb 100644 --- a/src/main/java/tanks/network/event/EventLevelExit.java +++ b/src/main/java/tanks/network/event/EventLevelExit.java @@ -1,11 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.Panel; import tanks.gui.screen.ScreenPartyInterlevel; import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; public class EventLevelExit extends PersonalEvent { @@ -46,16 +44,4 @@ public void execute() System.gc(); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.winningTeam); - } - - @Override - public void read(ByteBuf b) - { - this.winningTeam = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventLevelFinished.java b/src/main/java/tanks/network/event/EventLevelFinished.java index 6080f9ad8..3b9602e38 100644 --- a/src/main/java/tanks/network/event/EventLevelFinished.java +++ b/src/main/java/tanks/network/event/EventLevelFinished.java @@ -1,11 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; -import tanks.Panel; import tanks.gui.screen.ScreenGame; -import tanks.network.NetworkUtils; public class EventLevelFinished extends PersonalEvent { @@ -22,10 +17,4 @@ public void execute() ScreenGame.finished = true; } - - @Override - public void write(ByteBuf b) { } - - @Override - public void read(ByteBuf b) { } } diff --git a/src/main/java/tanks/network/event/EventLevelFinishedQuick.java b/src/main/java/tanks/network/event/EventLevelFinishedQuick.java index 9086203c0..7b1f397be 100644 --- a/src/main/java/tanks/network/event/EventLevelFinishedQuick.java +++ b/src/main/java/tanks/network/event/EventLevelFinishedQuick.java @@ -44,16 +44,4 @@ public void execute() ScreenGame.finishedQuick = true; } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.winningTeam); - } - - @Override - public void read(ByteBuf b) - { - this.winningTeam = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java b/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java index b5a8a0534..982144f20 100644 --- a/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java +++ b/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java @@ -26,25 +26,6 @@ public EventLoadCrusadeHotbar(String title, String subtitle, int index, boolean this.index = index; this.translate = translate; } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.title); - NetworkUtils.writeString(b, this.subtitle); - b.writeInt(this.index); - b.writeBoolean(this.translate); - } - - @Override - public void read(ByteBuf b) - { - this.title = NetworkUtils.readString(b); - this.subtitle = NetworkUtils.readString(b); - this.index = b.readInt(); - this.translate = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventLoadItemBarSlot.java b/src/main/java/tanks/network/event/EventLoadItemBarSlot.java index 5fa2cf031..d6d5ab0ef 100644 --- a/src/main/java/tanks/network/event/EventLoadItemBarSlot.java +++ b/src/main/java/tanks/network/event/EventLoadItemBarSlot.java @@ -22,20 +22,6 @@ public EventLoadItemBarSlot(UUID clientID, int slot) this.targetID = clientID; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, targetID.toString()); - b.writeInt(this.slot); - } - - @Override - public void read(ByteBuf b) - { - this.targetID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventLoadLevel.java b/src/main/java/tanks/network/event/EventLoadLevel.java index a541bf686..9e6ce938e 100644 --- a/src/main/java/tanks/network/event/EventLoadLevel.java +++ b/src/main/java/tanks/network/event/EventLoadLevel.java @@ -95,20 +95,4 @@ public void execute() Game.screen = new ScreenFailedToLoadLevel("Level is remote!", level, e, new ScreenPartyLobby()); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.level); - b.writeDouble(this.startTime); - b.writeBoolean(this.disableFriendlyFire); - } - - @Override - public void read(ByteBuf b) - { - this.level = NetworkUtils.readString(b); - this.startTime = b.readDouble(); - this.disableFriendlyFire = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventMineChangeTimer.java b/src/main/java/tanks/network/event/EventMineChangeTimer.java index 0fe71f200..7751c9293 100644 --- a/src/main/java/tanks/network/event/EventMineChangeTimer.java +++ b/src/main/java/tanks/network/event/EventMineChangeTimer.java @@ -32,18 +32,4 @@ public void execute() m.timer = countdown; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.mine); - b.writeDouble(this.countdown); - } - - @Override - public void read(ByteBuf b) - { - this.mine = b.readInt(); - this.countdown = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventMineRemove.java b/src/main/java/tanks/network/event/EventMineRemove.java index b37ca24e9..53f3dfb95 100644 --- a/src/main/java/tanks/network/event/EventMineRemove.java +++ b/src/main/java/tanks/network/event/EventMineRemove.java @@ -37,16 +37,4 @@ public void execute() Mine.idMap.remove(m.networkID); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.mine); - } - - @Override - public void read(ByteBuf b) - { - this.mine = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventMutePlayer.java b/src/main/java/tanks/network/event/EventMutePlayer.java index 3cacc4729..61e678da6 100644 --- a/src/main/java/tanks/network/event/EventMutePlayer.java +++ b/src/main/java/tanks/network/event/EventMutePlayer.java @@ -35,16 +35,4 @@ public void execute() } } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.muted); - } - - @Override - public void read(ByteBuf b) - { - this.muted = b.readBoolean(); - } - } diff --git a/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java b/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java index 8d9d10ae5..f09adbfa5 100644 --- a/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java +++ b/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java @@ -1,11 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; +import tanks.*; import tanks.bullet.Bullet; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleBoostPanel; +import tanks.obstacle.*; import tanks.tank.Tank; public class EventObstacleBoostPanelEffect extends PersonalEvent @@ -37,24 +34,6 @@ public EventObstacleBoostPanelEffect() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.isTank); - b.writeInt(this.networkID); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.isTank = b.readBoolean(); - this.networkID = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleDestroy.java b/src/main/java/tanks/network/event/EventObstacleDestroy.java index f8daceb0e..824772bf7 100644 --- a/src/main/java/tanks/network/event/EventObstacleDestroy.java +++ b/src/main/java/tanks/network/event/EventObstacleDestroy.java @@ -39,31 +39,6 @@ public EventObstacleDestroy(double x, double y, String name, double ex, double e this.radius = rad; this.name = name; } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeBoolean(this.effect); - b.writeDouble(this.effectX); - b.writeDouble(this.effectY); - b.writeDouble(this.radius); - NetworkUtils.writeString(b, this.name); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.effect = b.readBoolean(); - this.effectX = b.readDouble(); - this.effectY = b.readDouble(); - this.radius = b.readDouble(); - this.name = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleHit.java b/src/main/java/tanks/network/event/EventObstacleHit.java index 23b9f44a9..30fa4f85c 100644 --- a/src/main/java/tanks/network/event/EventObstacleHit.java +++ b/src/main/java/tanks/network/event/EventObstacleHit.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.bullet.Bullet; import tanks.obstacle.Obstacle; @@ -27,26 +26,6 @@ public EventObstacleHit(Obstacle o, Bullet b) this.bulletY = b.posY; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - - b.writeDouble(this.bulletX); - b.writeDouble(this.bulletY); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - - this.bulletX = b.readDouble(); - this.bulletY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java index dcd409f9b..3a3884f88 100644 --- a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java +++ b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java @@ -22,20 +22,6 @@ public EventObstacleShrubberyBurn(double x, double y) this.posY = y; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleSnowMelt.java b/src/main/java/tanks/network/event/EventObstacleSnowMelt.java index 29c1d707f..9a97ab7e1 100644 --- a/src/main/java/tanks/network/event/EventObstacleSnowMelt.java +++ b/src/main/java/tanks/network/event/EventObstacleSnowMelt.java @@ -1,9 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleSnow; +import tanks.obstacle.*; public class EventObstacleSnowMelt extends PersonalEvent implements IStackableEvent { @@ -23,22 +21,6 @@ public EventObstacleSnowMelt(double x, double y, double depth) this.depth = depth; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.depth); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.depth = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPing.java b/src/main/java/tanks/network/event/EventPing.java index d4e84ab16..ab8cb9a8b 100644 --- a/src/main/java/tanks/network/event/EventPing.java +++ b/src/main/java/tanks/network/event/EventPing.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.network.ClientHandler; -import tanks.network.ServerHandler; +import tanks.network.*; public class EventPing extends PersonalEvent implements IServerThreadEvent, IClientThreadEvent { @@ -18,18 +16,6 @@ public EventPing(boolean second) this.second = second; } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(second); - } - - @Override - public void read(ByteBuf b) - { - second = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPlaySound.java b/src/main/java/tanks/network/event/EventPlaySound.java index 28e52ee79..8e2cb952c 100644 --- a/src/main/java/tanks/network/event/EventPlaySound.java +++ b/src/main/java/tanks/network/event/EventPlaySound.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Drawing; -import tanks.network.NetworkUtils; public class EventPlaySound extends PersonalEvent { @@ -22,26 +20,10 @@ public EventPlaySound(String s, float pitch, float volume) this.volume = volume; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.sound); - b.writeFloat(this.pitch); - b.writeFloat(this.volume); - } - - @Override - public void read(ByteBuf b) - { - this.sound = NetworkUtils.readString(b); - this.pitch = b.readFloat(); - this.volume = b.readFloat(); - } - @Override public void execute() { - if (this.clientID == null && !this.sound.equals("")) + if (this.clientID == null && !this.sound.isEmpty()) { try { diff --git a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java index bfc9dbdfa..a00cdc51b 100644 --- a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java +++ b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java @@ -30,16 +30,4 @@ public void execute() ((ScreenGame) Game.screen).ready = true; } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, playerID.toString()); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - } } diff --git a/src/main/java/tanks/network/event/EventPlayerChat.java b/src/main/java/tanks/network/event/EventPlayerChat.java index c5a885b98..2df7b54bb 100644 --- a/src/main/java/tanks/network/event/EventPlayerChat.java +++ b/src/main/java/tanks/network/event/EventPlayerChat.java @@ -30,19 +30,4 @@ public void execute() if (this.clientID == null) ScreenPartyLobby.chat.add(0, new ChatMessage(this.username, this.message)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.username); - NetworkUtils.writeString(b, this.message); - } - - @Override - public void read(ByteBuf b) - { - this.username = NetworkUtils.readString(b); - this.message = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventPlayerReady.java b/src/main/java/tanks/network/event/EventPlayerReady.java index e185522dc..64bdb2bfa 100644 --- a/src/main/java/tanks/network/event/EventPlayerReady.java +++ b/src/main/java/tanks/network/event/EventPlayerReady.java @@ -37,17 +37,4 @@ public void execute() Game.eventsOut.add(new EventUpdateReadyPlayers(ScreenPartyHost.readyPlayers)); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - } diff --git a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java index cd83d83ae..51be49899 100644 --- a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java @@ -28,20 +28,6 @@ public EventPlayerRevealBuild(int tank, int build) this.build = build; } - @Override - public void write(ByteBuf b) - { - b.writeInt(tank); - b.writeInt(build); - } - - @Override - public void read(ByteBuf b) - { - tank = b.readInt(); - build = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPlayerSetBuild.java b/src/main/java/tanks/network/event/EventPlayerSetBuild.java index c795144fa..e8f08d0cf 100644 --- a/src/main/java/tanks/network/event/EventPlayerSetBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerSetBuild.java @@ -26,18 +26,6 @@ public EventPlayerSetBuild(int build) this.build = build; } - @Override - public void write(ByteBuf b) - { - b.writeInt(build); - } - - @Override - public void read(ByteBuf b) - { - build = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPurchaseBuild.java b/src/main/java/tanks/network/event/EventPurchaseBuild.java index e0a1ee528..c4e764352 100644 --- a/src/main/java/tanks/network/event/EventPurchaseBuild.java +++ b/src/main/java/tanks/network/event/EventPurchaseBuild.java @@ -1,11 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; - -import java.util.UUID; public class EventPurchaseBuild extends PersonalEvent { @@ -21,18 +16,6 @@ public EventPurchaseBuild(String name) this.name = name; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPurchaseItem.java b/src/main/java/tanks/network/event/EventPurchaseItem.java index b253ddb13..61d83d548 100644 --- a/src/main/java/tanks/network/event/EventPurchaseItem.java +++ b/src/main/java/tanks/network/event/EventPurchaseItem.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; -import tanks.Player; +import tanks.*; import tanks.gui.screen.ScreenGame; import tanks.tank.TankPlayerRemote; @@ -21,18 +18,6 @@ public EventPurchaseItem(int item) this.item = item; } - @Override - public void write(ByteBuf b) - { - b.writeInt(item); - } - - @Override - public void read(ByteBuf b) - { - item = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPurchaseNPCItem.java b/src/main/java/tanks/network/event/EventPurchaseNPCItem.java index 88fe90df7..3eb08ed2b 100644 --- a/src/main/java/tanks/network/event/EventPurchaseNPCItem.java +++ b/src/main/java/tanks/network/event/EventPurchaseNPCItem.java @@ -23,20 +23,6 @@ public EventPurchaseNPCItem(int item, int id) this.id = id; } - @Override - public void write(ByteBuf b) - { - super.write(b); - b.writeInt(id); - } - - @Override - public void read(ByteBuf b) - { - super.read(b); - this.id = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventReturnToCrusade.java b/src/main/java/tanks/network/event/EventReturnToCrusade.java index 4c52c1828..64af49fb8 100644 --- a/src/main/java/tanks/network/event/EventReturnToCrusade.java +++ b/src/main/java/tanks/network/event/EventReturnToCrusade.java @@ -59,22 +59,4 @@ public void execute() System.gc(); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, msg1); - NetworkUtils.writeString(b, msg2); - b.writeBoolean(win); - b.writeBoolean(lose); - } - - @Override - public void read(ByteBuf b) - { - msg1 = NetworkUtils.readString(b); - msg2 = NetworkUtils.readString(b); - win = b.readBoolean(); - lose = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventReturnToLobby.java b/src/main/java/tanks/network/event/EventReturnToLobby.java index 4d05a484b..29899b0df 100644 --- a/src/main/java/tanks/network/event/EventReturnToLobby.java +++ b/src/main/java/tanks/network/event/EventReturnToLobby.java @@ -24,16 +24,4 @@ public void execute() System.gc(); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java b/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java index 67da73516..63e05f650 100644 --- a/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java +++ b/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java @@ -25,22 +25,6 @@ public EventScoreboardUpdateScore(int scoreboardID, String name, double value) this.value = value; } - @Override - public void write(ByteBuf b) - { - b.writeInt(id); - NetworkUtils.writeString(b, name); - b.writeDouble(value); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.name = NetworkUtils.readString(b); - this.value = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSendClientDetails.java b/src/main/java/tanks/network/event/EventSendClientDetails.java index a57bd9023..e25847227 100644 --- a/src/main/java/tanks/network/event/EventSendClientDetails.java +++ b/src/main/java/tanks/network/event/EventSendClientDetails.java @@ -31,23 +31,6 @@ public EventSendClientDetails(int version, UUID clientID, String username) this.clientID = clientID; this.username = username; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.version); - NetworkUtils.writeString(b, clientID.toString()); - NetworkUtils.writeString(b, username); - } - - @Override - public void read(ByteBuf b) - { - this.version = b.readInt(); - this.clientID = UUID.fromString(NetworkUtils.readString(b)); - this.username = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSendTankColors.java b/src/main/java/tanks/network/event/EventSendTankColors.java index 30a1db547..d46019db3 100644 --- a/src/main/java/tanks/network/event/EventSendTankColors.java +++ b/src/main/java/tanks/network/event/EventSendTankColors.java @@ -1,14 +1,8 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; - -import java.util.UUID; public class EventSendTankColors extends PersonalEvent { @@ -28,22 +22,6 @@ public EventSendTankColors(Player p) this.color3.set(p.color3); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeColor(b, this.color1); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - } - - @Override - public void read(ByteBuf b) - { - NetworkUtils.readColor(b, this.color1); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetItem.java b/src/main/java/tanks/network/event/EventSetItem.java index a879ec6eb..5ffbafba9 100644 --- a/src/main/java/tanks/network/event/EventSetItem.java +++ b/src/main/java/tanks/network/event/EventSetItem.java @@ -32,22 +32,6 @@ public EventSetItem(Player p, int slot, Item.ItemStack item) this.itemStackString = item.toString(); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.slot); - NetworkUtils.writeString(b, this.itemStackString); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - this.itemStackString = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetItemBarSlot.java b/src/main/java/tanks/network/event/EventSetItemBarSlot.java index 7ca6f83d7..8dc128ecb 100644 --- a/src/main/java/tanks/network/event/EventSetItemBarSlot.java +++ b/src/main/java/tanks/network/event/EventSetItemBarSlot.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.tank.TankPlayerRemote; public class EventSetItemBarSlot extends PersonalEvent implements IStackableEvent @@ -19,18 +17,6 @@ public EventSetItemBarSlot(int slot) this.slot = slot; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.slot); - } - - @Override - public void read(ByteBuf b) - { - this.slot = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetLevelVersus.java b/src/main/java/tanks/network/event/EventSetLevelVersus.java index d20c2eb8e..f93bb3631 100644 --- a/src/main/java/tanks/network/event/EventSetLevelVersus.java +++ b/src/main/java/tanks/network/event/EventSetLevelVersus.java @@ -1,7 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; import tanks.Game; import tanks.gui.screen.ScreenGame; @@ -16,20 +14,6 @@ public EventSetLevelVersus() public void execute() { if (this.clientID == null && Game.screen instanceof ScreenGame) - { ((ScreenGame) Game.screen).isVersus = true; - } - } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - } } diff --git a/src/main/java/tanks/network/event/EventSetupHotbar.java b/src/main/java/tanks/network/event/EventSetupHotbar.java index daff92490..334645bf2 100644 --- a/src/main/java/tanks/network/event/EventSetupHotbar.java +++ b/src/main/java/tanks/network/event/EventSetupHotbar.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; +import tanks.*; import java.util.UUID; @@ -25,22 +22,6 @@ public EventSetupHotbar(Player p) this.coins = p.hotbar.enabledCoins; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeBoolean(this.items); - b.writeBoolean(this.coins); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.items = b.readBoolean(); - this.coins = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventShareCrusade.java b/src/main/java/tanks/network/event/EventShareCrusade.java index a88abdae7..304ea9582 100644 --- a/src/main/java/tanks/network/event/EventShareCrusade.java +++ b/src/main/java/tanks/network/event/EventShareCrusade.java @@ -73,20 +73,4 @@ public void execute() ScreenPartyLobby.sharedCrusades.add(new ScreenPartyHost.SharedCrusade(this.crusade, this.name, this.username)); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.crusade); - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.username); - } - - @Override - public void read(ByteBuf b) - { - this.crusade = NetworkUtils.readString(b); - this.name = NetworkUtils.readString(b); - this.username = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventShareLevel.java b/src/main/java/tanks/network/event/EventShareLevel.java index f83c42bf6..8dab52838 100644 --- a/src/main/java/tanks/network/event/EventShareLevel.java +++ b/src/main/java/tanks/network/event/EventShareLevel.java @@ -74,20 +74,4 @@ public void execute() ScreenPartyLobby.sharedLevels.add(new ScreenPartyHost.SharedLevel(this.level, this.name, this.username)); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.level); - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.username); - } - - @Override - public void read(ByteBuf b) - { - this.level = NetworkUtils.readString(b); - this.name = NetworkUtils.readString(b); - this.username = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index c40322d23..68a9151a8 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -117,36 +117,6 @@ else if (t2 instanceof TankPlayer) } } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.posZ); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.vZ); - b.writeDouble(this.speed); - b.writeInt(this.item); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.posZ = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.vZ = b.readDouble(); - this.speed = b.readDouble(); - this.item = b.readInt(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventShowCrusadeStats.java b/src/main/java/tanks/network/event/EventShowCrusadeStats.java index 620427f0b..4c3d814fc 100644 --- a/src/main/java/tanks/network/event/EventShowCrusadeStats.java +++ b/src/main/java/tanks/network/event/EventShowCrusadeStats.java @@ -96,22 +96,4 @@ public void execute() Crusade.currentCrusade.crusadePlayers.put(cp.player, cp); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.levels); - NetworkUtils.writeString(b, this.stats); - NetworkUtils.writeString(b, this.crusade); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - this.levels = NetworkUtils.readString(b); - this.stats = NetworkUtils.readString(b); - this.crusade = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventSortNPCShopButtons.java b/src/main/java/tanks/network/event/EventSortNPCShopButtons.java index 3b6459cc3..e45f6c8cd 100644 --- a/src/main/java/tanks/network/event/EventSortNPCShopButtons.java +++ b/src/main/java/tanks/network/event/EventSortNPCShopButtons.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; +import tanks.*; import tanks.tank.TankNPC; public class EventSortNPCShopButtons extends PersonalEvent @@ -18,16 +16,6 @@ public EventSortNPCShopButtons(int id) this.id = id; } - public void write(ByteBuf b) - { - b.writeInt(this.id); - } - - public void read(ByteBuf b) - { - this.id = b.readInt(); - } - public void execute() { for (Movable m : Game.movables) @@ -38,6 +26,5 @@ public void execute() break; } } - } } diff --git a/src/main/java/tanks/network/event/EventSortShopButtons.java b/src/main/java/tanks/network/event/EventSortShopButtons.java index 66c05a470..1828f6819 100644 --- a/src/main/java/tanks/network/event/EventSortShopButtons.java +++ b/src/main/java/tanks/network/event/EventSortShopButtons.java @@ -1,24 +1,10 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenGame; public class EventSortShopButtons extends PersonalEvent { - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventStatusEffectBegin.java b/src/main/java/tanks/network/event/EventStatusEffectBegin.java index 90f6cb4d4..f407e7515 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectBegin.java +++ b/src/main/java/tanks/network/event/EventStatusEffectBegin.java @@ -38,26 +38,6 @@ public EventStatusEffectBegin() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.isTank); - b.writeInt(this.networkID); - NetworkUtils.writeString(b, this.effect); - b.writeDouble(this.age); - b.writeDouble(this.warmup); - } - - @Override - public void read(ByteBuf b) - { - this.isTank = b.readBoolean(); - this.networkID = b.readInt(); - this.effect = NetworkUtils.readString(b); - this.age = b.readDouble(); - this.warmup = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java b/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java index f537eeb3f..d0ce2b06a 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java +++ b/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java @@ -36,24 +36,6 @@ public EventStatusEffectDeteriorate() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.isTank); - b.writeInt(this.networkID); - NetworkUtils.writeString(b, this.effect); - b.writeDouble(this.remainingTime); - } - - @Override - public void read(ByteBuf b) - { - this.isTank = b.readBoolean(); - this.networkID = b.readInt(); - this.effect = NetworkUtils.readString(b); - this.remainingTime = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventStatusEffectEnd.java b/src/main/java/tanks/network/event/EventStatusEffectEnd.java index ec145a161..82561b7ab 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectEnd.java +++ b/src/main/java/tanks/network/event/EventStatusEffectEnd.java @@ -1,10 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Movable; -import tanks.attribute.StatusEffect; import tanks.bullet.Bullet; -import tanks.network.NetworkUtils; +import tanks.effect.StatusEffect; import tanks.tank.Tank; public class EventStatusEffectEnd extends PersonalEvent @@ -34,22 +32,6 @@ public EventStatusEffectEnd() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.isTank); - b.writeInt(this.networkID); - NetworkUtils.writeString(b, this.effect); - } - - @Override - public void read(ByteBuf b) - { - this.isTank = b.readBoolean(); - this.networkID = b.readInt(); - this.effect = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java index 472db54f6..a5c61df41 100644 --- a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java @@ -42,38 +42,6 @@ public EventTankAddAttributeModifier(Tank t, AttributeModifier m, boolean undupl this.unduplicate = unduplicate; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.duration); - b.writeDouble(this.deteriorationAge); - b.writeDouble(this.warmupAge); - b.writeDouble(this.value); - NetworkUtils.writeString(b, this.effect); - b.writeDouble(this.age); - NetworkUtils.writeString(b, this.type); - b.writeBoolean(this.expired); - b.writeBoolean(this.unduplicate); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.name = NetworkUtils.readString(b); - this.duration = b.readDouble(); - this.deteriorationAge = b.readDouble(); - this.warmupAge = b.readDouble(); - this.value = b.readDouble(); - this.effect = NetworkUtils.readString(b); - this.age = b.readDouble(); - this.type = NetworkUtils.readString(b); - this.expired = b.readBoolean(); - this.unduplicate = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankCharge.java b/src/main/java/tanks/network/event/EventTankCharge.java index 693ffa228..6b11ac598 100644 --- a/src/main/java/tanks/network/event/EventTankCharge.java +++ b/src/main/java/tanks/network/event/EventTankCharge.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.tank.Tank; public class EventTankCharge extends PersonalEvent implements IStackableEvent @@ -40,21 +38,6 @@ public void execute() Game.effects.add(e); } - - } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.charge); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.charge = b.readDouble(); } @Override diff --git a/src/main/java/tanks/network/event/EventTankControllerAddVelocity.java b/src/main/java/tanks/network/event/EventTankControllerAddVelocity.java index 5a5434452..2f4109540 100644 --- a/src/main/java/tanks/network/event/EventTankControllerAddVelocity.java +++ b/src/main/java/tanks/network/event/EventTankControllerAddVelocity.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.tank.Tank; @@ -24,24 +23,6 @@ public EventTankControllerAddVelocity(Tank t, double vX, double vY, boolean reco this.recoil = recoil; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeBoolean(this.recoil); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.recoil = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java index 56dc26da8..e2fb6fffb 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java @@ -37,34 +37,6 @@ public EventTankControllerUpdateAmmunition(UUID clientID, int a1, int a1max, int this.cooldownBase2 = cooldownBase2; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.clientIdTarget.toString()); - b.writeInt(this.action1Live); - b.writeInt(this.action1Max); - b.writeInt(this.action2Live); - b.writeInt(this.action2Max); - b.writeDouble(this.cooldown); - b.writeDouble(this.cooldownBase); - b.writeDouble(this.cooldown2); - b.writeDouble(this.cooldownBase2); - } - - @Override - public void read(ByteBuf b) - { - this.clientIdTarget = UUID.fromString(NetworkUtils.readString(b)); - this.action1Live = b.readInt(); - this.action1Max = b.readInt(); - this.action2Live = b.readInt(); - this.action2Max = b.readInt(); - this.cooldown = b.readDouble(); - this.cooldownBase = b.readDouble(); - this.cooldown2 = b.readDouble(); - this.cooldownBase2 = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java index 92e40eafb..739b439d7 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java @@ -2,11 +2,7 @@ import io.netty.buffer.ByteBuf; import tanks.Panel; -import tanks.hotbar.Hotbar; -import tanks.tank.Tank; -import tanks.tank.TankPlayer; -import tanks.tank.TankPlayerController; -import tanks.tank.TankPlayerRemote; +import tanks.tank.*; public class EventTankControllerUpdateC extends PersonalEvent implements IStackableEvent { @@ -20,10 +16,12 @@ public class EventTankControllerUpdateC extends PersonalEvent implements IStacka public double mY; public boolean action1; public boolean action2; - public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; public double time; public long sysTime = System.currentTimeMillis(); + @NetworkIgnored + public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; + public EventTankControllerUpdateC() { @@ -48,41 +46,19 @@ public EventTankControllerUpdateC(TankPlayerController t) @Override public void write(ByteBuf b) { - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.angle); - b.writeDouble(this.mX); - b.writeDouble(this.mY); - b.writeBoolean(this.action1); - b.writeBoolean(this.action2); - for (boolean quickAction : this.quickActions) - { - b.writeBoolean(quickAction); - } - b.writeDouble(this.time); + super.write(b); + b.writeShort(quickActions.length); + for (boolean b1: quickActions) + b.writeBoolean(b1); } @Override public void read(ByteBuf b) { - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.angle = b.readDouble(); - this.mX = b.readDouble(); - this.mY = b.readDouble(); - this.action1 = b.readBoolean(); - this.action2 = b.readBoolean(); - for (int i = 0; i < this.quickActions.length; i++) - { - this.quickActions[i] = b.readBoolean(); - } - this.time = b.readDouble(); + super.read(b); + int len = b.readShort(); + for (int i = 0; i < len; i++) + this.quickActions[i] = b.readBoolean(); } @Override @@ -91,9 +67,7 @@ public void execute() Tank t = Tank.idMap.get(this.tank); if (t instanceof TankPlayerRemote && ((TankPlayerRemote) t).player.clientID.equals(this.clientID)) - { ((TankPlayerRemote) t).controllerUpdate(this.posX, this.posY, this.vX, this.vY, this.angle, this.mX, this.mY, this.action1, this.action2, this.quickActions, this.time, this.sysTime); - } } @Override @@ -107,4 +81,4 @@ public int getIdentifier() { return tank; } -} \ No newline at end of file +} diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index c79bde06c..2ce3c7388 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -21,20 +21,6 @@ public EventTankControllerUpdateS(Tank t, boolean forced, boolean recoil) this.forced = forced; } - @Override - public void read(ByteBuf b) - { - super.read(b); - this.forced = b.readBoolean(); - } - - @Override - public void write(ByteBuf b) - { - super.write(b); - b.writeBoolean(this.forced); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankCreate.java b/src/main/java/tanks/network/event/EventTankCreate.java index 65a902222..f6d4b9680 100644 --- a/src/main/java/tanks/network/event/EventTankCreate.java +++ b/src/main/java/tanks/network/event/EventTankCreate.java @@ -1,11 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Team; -import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventTankCreate extends PersonalEvent { @@ -58,28 +54,4 @@ public void execute() Game.movables.add(new TankRemote(t)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.type); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.id); - b.writeDouble(this.drawAge); - } - - @Override - public void read(ByteBuf b) - { - this.type = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.id = b.readInt(); - this.drawAge = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankCustomCreate.java b/src/main/java/tanks/network/event/EventTankCustomCreate.java index 74c7abce9..6ed92b3c9 100644 --- a/src/main/java/tanks/network/event/EventTankCustomCreate.java +++ b/src/main/java/tanks/network/event/EventTankCustomCreate.java @@ -69,40 +69,4 @@ public void execute() Game.movables.add(tank); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeDouble(this.size); - b.writeDouble(this.turretSize); - b.writeDouble(this.turretLength); - NetworkUtils.writeColor(b, this.color); - b.writeDouble(this.lives); - b.writeDouble(this.baseLives); - - b.writeInt(this.id); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.size = b.readDouble(); - this.turretSize = b.readDouble(); - this.turretLength = b.readDouble(); - NetworkUtils.readColor(b, this.color); - this.lives = b.readDouble(); - this.baseLives = b.readDouble(); - - this.id = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankMimicLaser.java b/src/main/java/tanks/network/event/EventTankMimicLaser.java index 45dd40f39..438f0e076 100644 --- a/src/main/java/tanks/network/event/EventTankMimicLaser.java +++ b/src/main/java/tanks/network/event/EventTankMimicLaser.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.GameObject; -import tanks.Movable; +import tanks.*; import tanks.bullet.Laser; import tanks.tank.Tank; @@ -53,22 +50,6 @@ public void execute() } } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeInt(this.tank2); - b.writeDouble(this.range); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.tank2 = b.readInt(); - this.range = b.readDouble(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankMimicTransform.java b/src/main/java/tanks/network/event/EventTankMimicTransform.java index 71b80f1b9..455c1eab4 100644 --- a/src/main/java/tanks/network/event/EventTankMimicTransform.java +++ b/src/main/java/tanks/network/event/EventTankMimicTransform.java @@ -91,18 +91,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeInt(this.target); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.target = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankPlayerCreate.java b/src/main/java/tanks/network/event/EventTankPlayerCreate.java index cd8070017..a61aee9d2 100644 --- a/src/main/java/tanks/network/event/EventTankPlayerCreate.java +++ b/src/main/java/tanks/network/event/EventTankPlayerCreate.java @@ -182,40 +182,4 @@ public void setColor(Tank t) if (t instanceof TankPlayable) ((TankPlayable) t).saveColors(); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.clientIdTarget.toString()); - NetworkUtils.writeString(b, this.username); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.networkID); - - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - - b.writeDouble(this.drawAge); - } - - @Override - public void read(ByteBuf b) - { - this.clientIdTarget = UUID.fromString(NetworkUtils.readString(b)); - this.username = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.networkID = b.readInt(); - - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - - this.drawAge = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankRemove.java b/src/main/java/tanks/network/event/EventTankRemove.java index 53d8200ff..647bbbe5e 100644 --- a/src/main/java/tanks/network/event/EventTankRemove.java +++ b/src/main/java/tanks/network/event/EventTankRemove.java @@ -41,18 +41,4 @@ public void execute() t.unregisterNetworkID(); } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeBoolean(this.destroyAnimation); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.destroyAnimation = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventTankSpawn.java b/src/main/java/tanks/network/event/EventTankSpawn.java index 5a3bc177d..8c8b7020e 100644 --- a/src/main/java/tanks/network/event/EventTankSpawn.java +++ b/src/main/java/tanks/network/event/EventTankSpawn.java @@ -74,28 +74,4 @@ public void execute() Game.movables.add(new TankRemote(t)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.type); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.id); - b.writeInt(this.parent); - } - - @Override - public void read(ByteBuf b) - { - this.type = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.id = b.readInt(); - this.parent = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankTeleport.java b/src/main/java/tanks/network/event/EventTankTeleport.java index 0752d8394..4dd53eddf 100644 --- a/src/main/java/tanks/network/event/EventTankTeleport.java +++ b/src/main/java/tanks/network/event/EventTankTeleport.java @@ -42,37 +42,6 @@ public EventTankTeleport(TeleporterOrb t) this.maxAge = t.maxAge; this.endAge = t.endAge; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.fX); - b.writeDouble(this.fY); - b.writeDouble(this.iX); - b.writeDouble(this.iY); - b.writeDouble(this.dX); - b.writeDouble(this.dY); - b.writeDouble(this.age); - b.writeDouble(this.maxAge); - b.writeDouble(this.endAge); - - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.fX = b.readDouble(); - this.fY = b.readDouble(); - this.iX = b.readDouble(); - this.iY = b.readDouble(); - this.dX = b.readDouble(); - this.dY = b.readDouble(); - this.age = b.readDouble(); - this.maxAge = b.readDouble(); - this.endAge = b.readDouble(); - } @Override public void execute() diff --git a/src/main/java/tanks/network/event/EventTankTransformCustom.java b/src/main/java/tanks/network/event/EventTankTransformCustom.java index 99ad59d4a..872e05449 100644 --- a/src/main/java/tanks/network/event/EventTankTransformCustom.java +++ b/src/main/java/tanks/network/event/EventTankTransformCustom.java @@ -2,13 +2,9 @@ import basewindow.Color; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankAIControlled; -import tanks.tank.TankRemote; +import tanks.tank.*; import java.util.HashSet; @@ -45,6 +41,7 @@ public class EventTankTransformCustom extends PersonalEvent public boolean requiredKill = false; + @NetworkIgnored public HashSet tankMusic; public static final int no_effect = 0; @@ -58,7 +55,7 @@ public class EventTankTransformCustom extends PersonalEvent public EventTankTransformCustom() { - + this.tankMusic = new HashSet<>(); } public EventTankTransformCustom(Tank t, Tank newTank, int effect) @@ -181,94 +178,14 @@ else if (effect == poof) @Override public void write(ByteBuf b) { - b.writeInt(this.tank); - - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - - b.writeBoolean(this.enableCol3); - - b.writeDouble(this.glowIntensity); - b.writeDouble(this.glowSize); - b.writeDouble(this.lightIntensity); - b.writeDouble(this.lightSize); - b.writeDouble(this.luminance); - - b.writeDouble(this.size); - b.writeDouble(this.turretSize); - b.writeDouble(this.turretLength); - - NetworkUtils.writeString(b, this.baseModel); - NetworkUtils.writeString(b, this.colorModel); - NetworkUtils.writeString(b, this.turretBaseModel); - NetworkUtils.writeString(b, this.turretModel); - - NetworkUtils.writeString(b, this.emblem); - NetworkUtils.writeColor(b, this.emblemColor); - - b.writeInt(this.bulletCount); - b.writeDouble(this.bulletSpread); - - b.writeBoolean(this.enableTracks); - b.writeDouble(this.trackSpacing); - - b.writeBoolean(this.requiredKill); - - b.writeInt(this.tankMusic.size()); - - for (String s: this.tankMusic) - { - NetworkUtils.writeString(b, s); - } - - b.writeInt(this.effect); + super.write(b); + NetworkUtils.writeCollection(b, tankMusic, NetworkUtils::writeString); } @Override public void read(ByteBuf b) { - this.tank = b.readInt(); - - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - - this.enableCol3 = b.readBoolean(); - - this.glowIntensity = b.readDouble(); - this.glowSize = b.readDouble(); - this.lightIntensity = b.readDouble(); - this.lightSize = b.readDouble(); - this.luminance = b.readDouble(); - - this.size = b.readDouble(); - this.turretSize = b.readDouble(); - this.turretLength = b.readDouble(); - - this.baseModel = NetworkUtils.readString(b); - this.colorModel = NetworkUtils.readString(b); - this.turretBaseModel = NetworkUtils.readString(b); - this.turretModel = NetworkUtils.readString(b); - - this.emblem = NetworkUtils.readString(b); - NetworkUtils.readColor(b, this.emblemColor); - - this.bulletCount = b.readInt(); - this.bulletSpread = b.readDouble(); - - this.enableTracks = b.readBoolean(); - this.trackSpacing = b.readDouble(); - - this.requiredKill = b.readBoolean(); - - int size = b.readInt(); - this.tankMusic = new HashSet<>(); - for (int i = 0; i < size; i++) - { - this.tankMusic.add(NetworkUtils.readString(b)); - } - - this.effect = b.readInt(); + super.read(b); + NetworkUtils.readCollection(b, tankMusic, NetworkUtils::readString); } } diff --git a/src/main/java/tanks/network/event/EventTankTransformPreset.java b/src/main/java/tanks/network/event/EventTankTransformPreset.java index f002b9c37..dcc77afc2 100644 --- a/src/main/java/tanks/network/event/EventTankTransformPreset.java +++ b/src/main/java/tanks/network/event/EventTankTransformPreset.java @@ -113,20 +113,4 @@ public void execute() t.tertiaryColor.set(target.tertiaryColor); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeBoolean(this.sight); - b.writeBoolean(this.revert); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.sight = b.readBoolean(); - this.revert = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 76aa50c9e..2f4641cfe 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.tank.Tank; -import tanks.tank.TankRemote; +import tanks.tank.*; public class EventTankUpdate extends PersonalEvent implements IStackableEvent { @@ -31,30 +29,6 @@ public EventTankUpdate(Tank t) this.angle = t.angle; this.pitch = t.pitch; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.angle); - b.writeDouble(this.pitch); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.angle = b.readDouble(); - this.pitch = b.readDouble(); - } @Override public void execute() diff --git a/src/main/java/tanks/network/event/EventTankUpdateColor.java b/src/main/java/tanks/network/event/EventTankUpdateColor.java index 027dae720..cc9de4da8 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateColor.java +++ b/src/main/java/tanks/network/event/EventTankUpdateColor.java @@ -45,26 +45,6 @@ public void execute() t.enableTertiaryColor = tertiaryColor; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - NetworkUtils.writeColor(b, this.color1); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - b.writeBoolean(this.tertiaryColor); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - NetworkUtils.readColor(b, this.color1); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - this.tertiaryColor = b.readBoolean(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index 60b8cca47..efd187ca1 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.tank.Tank; public class EventTankUpdateHealth extends PersonalEvent @@ -51,18 +49,4 @@ else if (health > t.health) t.vY = 0; } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.health); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.health = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java index 2e0529f4e..30bc6cc50 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java +++ b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java @@ -30,18 +30,4 @@ public void execute() ((TankRemote) t).invisible = !visible; } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeBoolean(this.visible); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.visible = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventUpdateCoins.java b/src/main/java/tanks/network/event/EventUpdateCoins.java index 63ba462f6..5ff3e55db 100644 --- a/src/main/java/tanks/network/event/EventUpdateCoins.java +++ b/src/main/java/tanks/network/event/EventUpdateCoins.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; +import tanks.*; import java.util.UUID; @@ -23,20 +20,6 @@ public EventUpdateCoins(Player p) this.coins = p.hotbar.coins; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.coins); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.coins = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java b/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java index 114087bf1..492281c1a 100644 --- a/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java +++ b/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java @@ -1,12 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.Player; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import java.util.ArrayList; @@ -25,7 +21,7 @@ public EventUpdateEliminatedPlayers(ArrayList players) for (ConnectedPlayer p: players) s.append(p.clientId).append(","); - if (players.size() == 0) + if (players.isEmpty()) eliminatedPlayers = ""; else eliminatedPlayers = s.substring(0, s.length() - 1); @@ -49,17 +45,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.eliminatedPlayers); - } - - @Override - public void read(ByteBuf b) - { - this.eliminatedPlayers = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java b/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java index 78732a7c7..979ba4711 100644 --- a/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java +++ b/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java @@ -1,10 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Player; import tanks.gui.screen.ScreenPartyLobby; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import java.util.ArrayList; @@ -48,16 +46,4 @@ public void execute() } } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.readyPlayers); - } - - @Override - public void read(ByteBuf b) - { - this.readyPlayers = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java index 70dd7eee0..2e1a3e7c7 100644 --- a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java +++ b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java @@ -23,20 +23,6 @@ public EventUpdateRemainingLives() } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, playerID.toString()); - b.writeInt(lives); - } - - @Override - public void read(ByteBuf b) - { - playerID = UUID.fromString(NetworkUtils.readString(b)); - lives = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventUpdateTankAbility.java b/src/main/java/tanks/network/event/EventUpdateTankAbility.java index 58f43092b..96d316e95 100644 --- a/src/main/java/tanks/network/event/EventUpdateTankAbility.java +++ b/src/main/java/tanks/network/event/EventUpdateTankAbility.java @@ -27,22 +27,6 @@ public EventUpdateTankAbility(Player p, int slot) this.count = ((TankPlayable)(p.tank)).abilities.get(slot).stackSize; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.slot); - b.writeInt(this.count); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - this.count = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventUpdateTankColors.java b/src/main/java/tanks/network/event/EventUpdateTankColors.java index 4df4742c5..cc4f706dd 100644 --- a/src/main/java/tanks/network/event/EventUpdateTankColors.java +++ b/src/main/java/tanks/network/event/EventUpdateTankColors.java @@ -31,24 +31,6 @@ public EventUpdateTankColors(Player p) this.color3.set(p.color3); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.player.toString()); - NetworkUtils.writeColor(b, this.color1); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - } - - @Override - public void read(ByteBuf b) - { - this.player = UUID.fromString(NetworkUtils.readString(b)); - NetworkUtils.readColor(b, this.color1); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index c9278e92c..2e045180d 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -1,12 +1,43 @@ package tanks.network.event; import io.netty.buffer.ByteBuf; +import tanks.network.*; + +import java.lang.annotation.*; +import java.lang.reflect.Field; +import java.util.*; public interface INetworkEvent extends IEvent { - void write(ByteBuf b); - - void read(ByteBuf b); - - void execute(); + @Retention(RetentionPolicy.RUNTIME) + @interface NetworkIgnored + { + } + + HashMap, ArrayList> fields = new HashMap<>(); + + default void write(ByteBuf b) + { + for (NetworkFieldHandle f : getFieldHandles()) + f.write(b); + } + + default void read(ByteBuf b) + { + for (NetworkFieldHandle f : getFieldHandles()) + f.read(b); + } + + void execute(); + + default ArrayList getFieldHandles() + { + return fields.computeIfAbsent(getClass(), c -> + { + ArrayList handles = new ArrayList<>(); + for (Field f : c.getFields()) + handles.add(new NetworkFieldHandle(f, this)); + return handles; + }); + } } From dc4832dec0d110b834171ef6af84e08245fe61f5 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sun, 7 Sep 2025 22:37:49 -0700 Subject: [PATCH 03/35] fix: network event fixes Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 18 ++--- src/main/java/tanks/ModAPI.java | 15 ++-- .../java/tanks/gui/screen/ScreenDebug.java | 3 +- .../java/tanks/network/NetworkEventMap.java | 22 +++++- .../tanks/network/NetworkFieldHandle.java | 75 ++++++++++++------- src/main/java/tanks/network/NetworkUtils.java | 5 +- .../java/tanks/network/event/EventAddNPC.java | 1 + .../network/event/EventArcadeBonuses.java | 16 ++++ .../EventBulletAddAttributeModifier.java | 2 +- .../network/event/EventSendClientDetails.java | 14 +--- .../network/event/EventShowCrusadeStats.java | 13 +--- .../network/event/EventStatusEffectEnd.java | 2 +- .../network/event/EventTankPlayerCreate.java | 15 +--- .../tanks/network/event/INetworkEvent.java | 20 +++-- 14 files changed, 136 insertions(+), 85 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 4e66223f2..c4f86cff8 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -29,10 +29,7 @@ import tanks.minigames.ArcadeClassic; import tanks.minigames.CastleRampage; import tanks.minigames.Minigame; -import tanks.network.Client; -import tanks.network.NetworkEventMap; -import tanks.network.SteamNetworkHandler; -import tanks.network.SynchronizedList; +import tanks.network.*; import tanks.network.event.*; import tanks.network.event.online.*; import tanks.obstacle.*; @@ -146,15 +143,15 @@ public int hashCode() //Versioning has moved to version.txt public static String version = "Tanks v-1.-1.-1"; - public static final int network_protocol = 60; + public static final int network_protocol = 59; public static boolean debug = false; public static boolean traceAllRays = false; public static boolean showNetworkIDs = false; public static boolean drawAutoZoom = false; public static boolean drawFaces = false; + public static boolean recordEventData = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; - public static boolean recordEventData = false; public static final boolean cinematic = false; public static long steamLobbyInvite = -1; @@ -179,7 +176,7 @@ public int hashCode() public static boolean vsync = true; public static int maxFPS = 0; - public static int networkRate = 10; + public static int networkRate = 20; public static boolean enable3d = true; public static boolean enable3dBg = true; @@ -238,6 +235,7 @@ public int hashCode() public static boolean fancyTerrain = true; public static boolean effectsEnabled = true; public static boolean bulletTrails = true; + public static boolean fancyBulletTrails = true; public static boolean glowEnabled = true; public static double effectMultiplier = 1; @@ -345,7 +343,6 @@ private Game() public static void registerEvents() { - NetworkEventMap.register(EventStackedGroup.class); NetworkEventMap.register(EventSendClientDetails.class); NetworkEventMap.register(EventPing.class); NetworkEventMap.register(EventConnectionSuccess.class); @@ -384,7 +381,6 @@ public static void registerEvents() NetworkEventMap.register(EventUpdateEliminatedPlayers.class); NetworkEventMap.register(EventUpdateRemainingLives.class); NetworkEventMap.register(EventBeginLevelCountdown.class); - NetworkEventMap.register(EventNudge.class); NetworkEventMap.register(EventTankUpdate.class); NetworkEventMap.register(EventTankControllerUpdateS.class); NetworkEventMap.register(EventTankControllerUpdateC.class); @@ -443,6 +439,7 @@ public static void registerEvents() NetworkEventMap.register(EventArcadeFrenzy.class); NetworkEventMap.register(EventArcadeEnd.class); NetworkEventMap.register(EventArcadeBonuses.class); + NetworkEventMap.register(EventStackedGroup.class); NetworkEventMap.register(EventSendOnlineClientDetails.class); NetworkEventMap.register(EventSilentDisconnect.class); @@ -466,6 +463,8 @@ public static void registerEvents() NetworkEventMap.register(EventUploadLevel.class); NetworkEventMap.register(EventSendLevelToDownload.class); NetworkEventMap.register(EventCleanUp.class); + + ModAPI.registerEvents(); } public static void registerObstacle(Class obstacle, String name) @@ -537,6 +536,7 @@ public static void initScript() Drawing.initialize(); Panel.initialize(); + NetworkFieldHandle.initialize(); Game.exitToTitle(); Hotbar.toggle = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY - 20, 150, 40, "", () -> Game.player.hotbar.persistent = !Game.player.hotbar.persistent); diff --git a/src/main/java/tanks/ModAPI.java b/src/main/java/tanks/ModAPI.java index b4db42447..3ff0f83c0 100644 --- a/src/main/java/tanks/ModAPI.java +++ b/src/main/java/tanks/ModAPI.java @@ -4,12 +4,9 @@ import tanks.network.NetworkEventMap; import tanks.network.event.*; import tanks.obstacle.Obstacle; -import tanks.tank.Tank; -import tanks.tank.TankModels; -import tanks.tank.TankNPC; +import tanks.tank.*; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; public class ModAPI { @@ -28,9 +25,8 @@ public static void registerMods() } - public static void setUp() + public static void registerEvents() { - registerMods(); NetworkEventMap.register(EventAddColoredTile.class); NetworkEventMap.register(EventAddFixedShape.class); NetworkEventMap.register(EventAddNPC.class); @@ -47,6 +43,11 @@ public static void setUp() NetworkEventMap.register(EventScoreboardUpdateScore.class); } + public static void setUp() + { + registerMods(); + } + public static void addObject(Object o) { if (o instanceof Movable) diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index 02dc6f53d..f44d62ba2 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -35,8 +35,7 @@ public class ScreenDebug extends Screen public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, - recordEventData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, recordEventData )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/network/NetworkEventMap.java b/src/main/java/tanks/network/NetworkEventMap.java index 73dd3b934..e3e3c070f 100644 --- a/src/main/java/tanks/network/NetworkEventMap.java +++ b/src/main/java/tanks/network/NetworkEventMap.java @@ -1,5 +1,6 @@ package tanks.network; +import io.netty.buffer.*; import tanks.Game; import tanks.network.event.INetworkEvent; @@ -10,7 +11,7 @@ public class NetworkEventMap protected static HashMap> map1 = new HashMap<>(); protected static HashMap, Integer> map2 = new HashMap<>(); protected static int id = 0; - + public static void register(Class c) { try @@ -19,10 +20,25 @@ public static void register(Class c) } catch (Exception e) { - Game.exitToCrash(new RuntimeException("The network event " + c + " does not have a no-parameter constructor. Please give it one.")); + Game.exitToCrash(new RuntimeException("The network event " + c + " does not have a no-parameter" + + " constructor. Please give it one.")); } - map1.put(id, c); + ByteBuf b = Unpooled.buffer(); + INetworkEvent e = null; + try + { + e = c.getConstructor().newInstance(); + e.write(b); + e.read(b); + } + catch (Exception exc) + { + if (e == NetworkFieldHandle.testObject && exc.getMessage().contains("Failed to find field handle")) // uses custom read/write methods + throw new RuntimeException(exc); + } + + map1.put(id, c); map2.put(c, id); id++; } diff --git a/src/main/java/tanks/network/NetworkFieldHandle.java b/src/main/java/tanks/network/NetworkFieldHandle.java index d2836b54b..616c5e03b 100644 --- a/src/main/java/tanks/network/NetworkFieldHandle.java +++ b/src/main/java/tanks/network/NetworkFieldHandle.java @@ -3,26 +3,30 @@ import basewindow.Color; import io.netty.buffer.ByteBuf; import tanks.*; +import tanks.network.event.INetworkEvent; import java.lang.invoke.*; -import java.lang.reflect.Field; +import java.lang.reflect.*; import java.util.*; public class NetworkFieldHandle { - private static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + protected static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + + // Used for network field validation upon game only. Do not use for anything else, will cause race conditions + public static Object testObject = null; public static class FieldHandle { - private final Class castType; - private final Function read; - private final BiConsumer write; + protected final Class castType; + protected Function read; + protected BiConsumer write; - private FieldHandle(Class castType, Function read, BiConsumer write) + protected FieldHandle(Class castType, Function readFunc, BiConsumer writeFunc) { this.castType = castType; - this.read = read; - this.write = write; + this.read = readFunc; + this.write = writeFunc; } public T read(ByteBuf b) @@ -51,16 +55,31 @@ public static FieldHandle register(Class originalType, Class cas static Map, FieldHandle> sigs = new HashMap<>(); + public static boolean shouldCheckField(Field f) + { + return !Modifier.isStatic(f.getModifiers()) && !f.isAnnotationPresent(INetworkEvent.NetworkIgnored.class); + } + + private static double readDouble(ByteBuf b) + { + return b.readFloat(); + } + + private static void writeDouble(ByteBuf b, double d) + { + b.writeFloat((float) d); + } + public static void initialize() { if (!sigs.isEmpty()) return; - FieldHandle.register(int.class, ByteBuf::readInt, ByteBuf::writeInt); - FieldHandle.register(long.class, ByteBuf::readLong, ByteBuf::writeLong); - FieldHandle.register(float.class, float.class, ByteBuf::readFloat, ByteBuf::writeFloat); - FieldHandle.register(double.class, float.class, ByteBuf::readFloat, ByteBuf::writeFloat); // treat doubles as floats - FieldHandle.register(boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean); + FieldHandle.register(int.class, Integer.class, ByteBuf::readInt, ByteBuf::writeInt); + FieldHandle.register(long.class, Long.class, ByteBuf::readLong, ByteBuf::writeLong); + FieldHandle.register(float.class, Float.class, ByteBuf::readFloat, ByteBuf::writeFloat); + FieldHandle.register(double.class, Double.class, NetworkFieldHandle::readDouble, NetworkFieldHandle::writeDouble); // treat doubles as floats + FieldHandle.register(boolean.class, Boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean); FieldHandle.register(String.class, NetworkUtils::readString, NetworkUtils::writeString); FieldHandle.register(Color.class, NetworkUtils::readColor, NetworkUtils::writeColor); FieldHandle.register(UUID.class, NetworkUtils::readUUID, NetworkUtils::writeUUID); @@ -71,23 +90,24 @@ public static void initialize() FieldHandle.register(char.class, int.class, ByteBuf::readChar, ByteBuf::writeChar); } - public Object object; - private final MethodHandle read, write; - private final FieldHandle fieldHandle; + public Object currentObject; + + protected final MethodHandle read, write; + protected final FieldHandle fieldHandle; + protected final Field field; - public NetworkFieldHandle(Field field, Object o) + public NetworkFieldHandle(Field field) { - initialize(); - this.object = o; try { this.read = lookup.unreflectGetter(field); this.write = lookup.unreflectSetter(field); - this.fieldHandle = sigs.get(field.getType()); + this.fieldHandle = Objects.requireNonNull(sigs.get(field.getType()), "Failed to find field handle for '" + field.getName() + "' of type '" + field.getType() + "' from class '" + field.getDeclaringClass() + "'"); + this.field = field; } catch (IllegalAccessException e) { - throw new RuntimeException(e); + throw new RuntimeException(this + ": " + e); } } @@ -95,11 +115,11 @@ public void read(ByteBuf b) { try { - this.write.invoke(this.object, this.fieldHandle.read(b)); + this.write.invoke(currentObject, this.fieldHandle.read(b)); } catch (Throwable e) { - throw new RuntimeException(e); + throw new RuntimeException(this + ", " + this.fieldHandle.read(b) + ": " + e); } } @@ -107,11 +127,16 @@ public void write(ByteBuf b) { try { - this.fieldHandle.write(b, this.read.invoke(this.object)); + this.fieldHandle.write(b, this.read.invoke(currentObject)); } catch (Throwable e) { - throw new RuntimeException(e); + throw new RuntimeException(this + ", " + e); } } + + public String toString() + { + return currentObject.getClass().getSimpleName() + ": " + this.field.getName(); + } } diff --git a/src/main/java/tanks/network/NetworkUtils.java b/src/main/java/tanks/network/NetworkUtils.java index 709a5adc9..ba0054ded 100644 --- a/src/main/java/tanks/network/NetworkUtils.java +++ b/src/main/java/tanks/network/NetworkUtils.java @@ -41,12 +41,13 @@ public static void writeString(ByteBuf b, String s) public static void writeUUID(ByteBuf b, UUID u) { - NetworkUtils.writeString(b, u.toString()); + NetworkUtils.writeString(b, u == null ? null : u.toString()); } public static UUID readUUID(ByteBuf b) { - return UUID.fromString(Objects.requireNonNull(NetworkUtils.readString(b))); + String s = NetworkUtils.readString(b); + return s == null ? null : UUID.fromString(s); } public static void writeCollection(ByteBuf b, Collection l, BiConsumer write) diff --git a/src/main/java/tanks/network/event/EventAddNPC.java b/src/main/java/tanks/network/event/EventAddNPC.java index acaed8a08..156bab0c0 100644 --- a/src/main/java/tanks/network/event/EventAddNPC.java +++ b/src/main/java/tanks/network/event/EventAddNPC.java @@ -13,6 +13,7 @@ public class EventAddNPC extends EventTankCustomCreate public String messages = ""; public String tag; + @NetworkIgnored public ArrayList shop; public EventAddNPC() diff --git a/src/main/java/tanks/network/event/EventArcadeBonuses.java b/src/main/java/tanks/network/event/EventArcadeBonuses.java index 1e88fef88..a53dab885 100644 --- a/src/main/java/tanks/network/event/EventArcadeBonuses.java +++ b/src/main/java/tanks/network/event/EventArcadeBonuses.java @@ -23,6 +23,22 @@ public EventArcadeBonuses(ScreenArcadeBonuses.Bonus b1, ScreenArcadeBonuses.Bonu this.bonus3 = b3; } + @Override + public void write(ByteBuf b) + { + writeBonus(bonus1, b); + writeBonus(bonus2, b); + writeBonus(bonus3, b); + } + + @Override + public void read(ByteBuf b) + { + bonus1 = readBonus(b); + bonus2 = readBonus(b); + bonus3 = readBonus(b); + } + public void writeBonus(ScreenArcadeBonuses.Bonus bonus, ByteBuf b) { NetworkUtils.writeString(b, bonus.name); diff --git a/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java b/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java index 640265049..4759600c3 100644 --- a/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventBulletAddAttributeModifier.java @@ -1,7 +1,7 @@ package tanks.network.event; +import tanks.attribute.AttributeModifier; import tanks.bullet.Bullet; -import tanks.effect.AttributeModifier; public class EventBulletAddAttributeModifier extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventSendClientDetails.java b/src/main/java/tanks/network/event/EventSendClientDetails.java index e25847227..50452a87c 100644 --- a/src/main/java/tanks/network/event/EventSendClientDetails.java +++ b/src/main/java/tanks/network/event/EventSendClientDetails.java @@ -1,16 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.ChatMessage; -import tanks.gui.screen.IPartyGameScreen; -import tanks.gui.screen.ScreenConnecting; -import tanks.gui.screen.ScreenPartyHost; -import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; -import tanks.network.ServerHandler; +import tanks.gui.screen.*; +import tanks.network.*; import java.util.UUID; @@ -31,6 +24,7 @@ public EventSendClientDetails(int version, UUID clientID, String username) this.clientID = clientID; this.username = username; } + @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventShowCrusadeStats.java b/src/main/java/tanks/network/event/EventShowCrusadeStats.java index 4c3d814fc..859f87aaa 100644 --- a/src/main/java/tanks/network/event/EventShowCrusadeStats.java +++ b/src/main/java/tanks/network/event/EventShowCrusadeStats.java @@ -1,14 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.CrusadePlayer; -import tanks.Player; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; +import tanks.*; +import tanks.gui.screen.ScreenPartyHost; -import java.util.ArrayList; -import java.util.UUID; +import java.util.*; public class EventShowCrusadeStats extends PersonalEvent { @@ -19,7 +14,7 @@ public class EventShowCrusadeStats extends PersonalEvent public EventShowCrusadeStats() { - if (ScreenPartyLobby.isClient) + if (!ScreenPartyHost.isServer) return; this.name = Crusade.currentCrusade.name; diff --git a/src/main/java/tanks/network/event/EventStatusEffectEnd.java b/src/main/java/tanks/network/event/EventStatusEffectEnd.java index 82561b7ab..43ab952ff 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectEnd.java +++ b/src/main/java/tanks/network/event/EventStatusEffectEnd.java @@ -1,8 +1,8 @@ package tanks.network.event; import tanks.Movable; +import tanks.attribute.StatusEffect; import tanks.bullet.Bullet; -import tanks.effect.StatusEffect; import tanks.tank.Tank; public class EventStatusEffectEnd extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventTankPlayerCreate.java b/src/main/java/tanks/network/event/EventTankPlayerCreate.java index a61aee9d2..9ad5e966c 100644 --- a/src/main/java/tanks/network/event/EventTankPlayerCreate.java +++ b/src/main/java/tanks/network/event/EventTankPlayerCreate.java @@ -1,24 +1,17 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; -import tanks.Player; -import tanks.Team; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.minigames.Arcade; -import tanks.minigames.RampageTrial; +import tanks.*; +import tanks.gui.screen.*; +import tanks.minigames.*; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import tanks.tank.*; import java.util.UUID; public class EventTankPlayerCreate extends PersonalEvent { + @NetworkIgnored public Player player; public UUID clientIdTarget; diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index 2e045180d..aa1631936 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -1,10 +1,10 @@ package tanks.network.event; import io.netty.buffer.ByteBuf; -import tanks.network.*; +import tanks.network.NetworkFieldHandle; import java.lang.annotation.*; -import java.lang.reflect.Field; +import java.lang.reflect.*; import java.util.*; public interface INetworkEvent extends IEvent @@ -14,7 +14,7 @@ public interface INetworkEvent extends IEvent { } - HashMap, ArrayList> fields = new HashMap<>(); + HashMap, ArrayList> classToFields = new HashMap<>(); default void write(ByteBuf b) { @@ -32,12 +32,22 @@ default void read(ByteBuf b) default ArrayList getFieldHandles() { - return fields.computeIfAbsent(getClass(), c -> + ArrayList fields = classToFields.computeIfAbsent(getClass(), c -> { ArrayList handles = new ArrayList<>(); for (Field f : c.getFields()) - handles.add(new NetworkFieldHandle(f, this)); + { + if (NetworkFieldHandle.shouldCheckField(f)) + handles.add(new NetworkFieldHandle(f)); + } return handles; }); + + for (NetworkFieldHandle f : fields) + f.currentObject = this; + + NetworkFieldHandle.testObject = this; + + return fields; } } From fb7aec3abb9cce7e005a4093d57560bb7ecb42ba Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sun, 7 Sep 2025 22:52:20 -0700 Subject: [PATCH 04/35] perf: use shorts for colors Signed-off-by: orangishcat --- src/main/java/tanks/network/NetworkFieldHandle.java | 3 ++- src/main/java/tanks/network/NetworkUtils.java | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/tanks/network/NetworkFieldHandle.java b/src/main/java/tanks/network/NetworkFieldHandle.java index 616c5e03b..04f817d5a 100644 --- a/src/main/java/tanks/network/NetworkFieldHandle.java +++ b/src/main/java/tanks/network/NetworkFieldHandle.java @@ -13,7 +13,7 @@ public class NetworkFieldHandle { protected static final MethodHandles.Lookup lookup = MethodHandles.lookup(); - // Used for network field validation upon game only. Do not use for anything else, will cause race conditions + // Used for network field validation upon game launch only. Do not use for anything else, will cause race conditions public static Object testObject = null; public static class FieldHandle @@ -34,6 +34,7 @@ public T read(ByteBuf b) return castType.cast(read.apply(b)); } + @SuppressWarnings("unchecked") public void write(ByteBuf b, Object t) { write.accept(b, (T) t); diff --git a/src/main/java/tanks/network/NetworkUtils.java b/src/main/java/tanks/network/NetworkUtils.java index ba0054ded..c9fc1cd9c 100644 --- a/src/main/java/tanks/network/NetworkUtils.java +++ b/src/main/java/tanks/network/NetworkUtils.java @@ -67,16 +67,16 @@ public static > void readCollection(ByteBuf b, V list public static Color readColor(ByteBuf b) { Color c = new Color(); - c.red = b.readDouble(); - c.green = b.readDouble(); - c.blue = b.readDouble(); + c.red = b.readShort(); + c.green = b.readShort(); + c.blue = b.readShort(); return c; } public static void writeColor(ByteBuf b, Color c) { - b.writeDouble(c.red); - b.writeDouble(c.green); - b.writeDouble(c.blue); + b.writeShort((int) c.red); + b.writeShort((int) c.green); + b.writeShort((int) c.blue); } } From f45056b2051f73a3a2ef868fbaa8937e05800349 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 08:44:24 -0700 Subject: [PATCH 05/35] fix(network): network-related bug fixes Signed-off-by: orangishcat --- src/main/java/tanks/DebugKeybinds.java | 76 ++++----- src/main/java/tanks/Game.java | 2 - src/main/java/tanks/Panel.java | 11 -- src/main/java/tanks/bullet/Bullet.java | 28 +--- .../tanks/bullet/BulletReboundIndicator.java | 6 +- .../java/tanks/gui/screen/ScreenDebug.java | 3 +- .../java/tanks/network/MessageReader.java | 13 +- .../java/tanks/network/NetworkEventMap.java | 19 +-- .../tanks/network/NetworkFieldHandle.java | 143 ----------------- .../java/tanks/network/NetworkHandler.java | 14 +- .../network/event/EventBulletBounce.java | 1 - .../network/event/EventBulletDestroyed.java | 1 - .../event/EventBulletReboundIndicator.java | 46 ++---- .../network/event/EventLoadCrusadeHotbar.java | 7 +- .../network/event/EventObstacleDestroy.java | 21 +-- .../event/EventTankControllerUpdateS.java | 1 - .../network/event/EventTankUpdateHealth.java | 4 +- .../tanks/network/event/INetworkEvent.java | 49 +++--- .../java/tanks/tankson/ReflectionHandle.java | 147 ++++++++++++++++++ 19 files changed, 247 insertions(+), 345 deletions(-) delete mode 100644 src/main/java/tanks/network/NetworkFieldHandle.java create mode 100644 src/main/java/tanks/tankson/ReflectionHandle.java diff --git a/src/main/java/tanks/DebugKeybinds.java b/src/main/java/tanks/DebugKeybinds.java index bf17cd74f..4befdd749 100644 --- a/src/main/java/tanks/DebugKeybinds.java +++ b/src/main/java/tanks/DebugKeybinds.java @@ -1,10 +1,11 @@ package tanks; import basewindow.*; -import it.unimi.dsi.fastutil.objects.*; +import it.unimi.dsi.fastutil.objects.ObjectSet; import tanks.gui.*; import tanks.gui.screen.*; import tanks.gui.screen.leveleditor.ScreenLevelEditor; +import tanks.network.NetworkEventMap; import tanks.network.event.INetworkEvent; import tanks.obstacle.*; import tanks.rendering.TerrainRenderer; @@ -31,10 +32,12 @@ public static void handleDebugKeybinds() "\u00A7255127000255B\u00A7r -> draw collision boxes \n " + "\u00A7255127000255V\u00A7r -> reload tiles \n " + "\u00A7255127000255K\u00A7r -> log pressed keys to console \n " + + "\u00A7255127000255Shift + K\u00A7r -> log network event mappings to console \n " + "\u00A7255127000255D\u00A7r -> clear the chat \n " + "\u00A7255127000255A\u00A7r -> reload terrain renderer \n " + "\u00A7255127000255T\u00A7r -> reload shader \n " + "\u00A7255127000255.\u00A7r -> perform a GC \n " + + "\u00A7255127000255,\u00A7r -> clear network event fields \n " + "\u00A7255127000255Hold\u00A7r -> show tile coordinates \n " + "\u00A7255127000255Hold + S\u00A7r -> show mouse coordinates \n " + "\u00A7255127000255Hold + Shift + S\u00A7r -> show offset mouse coordinates and scales \n " + @@ -74,12 +77,21 @@ public static void handleDebugKeybinds() if (Game.game.window.pressedKeys.contains(InputCodes.KEY_K)) { Game.game.window.pressedKeys.remove((Integer) InputCodes.KEY_K); - Function, List> func = l -> l.stream().map(Game.game.window::getKeyText).collect(Collectors.toList()); - System.out.println("Game.screen = " + Game.screen.getClass().getSimpleName()); - System.out.println("pressedKeys: " + func.apply(Game.game.window.pressedKeys)); - System.out.println("validPressedKeys: " + func.apply(Game.game.window.validPressedKeys)); - System.out.println("textPressedKeys: " + func.apply(Game.game.window.textPressedKeys)); - notifications.add(new ScreenElement.Notification("Pressed keys have been logged to the console", 800)); + if (!Game.game.window.pressedKeys.contains(InputCodes.KEY_LEFT_SHIFT)) + { + Function, List> func = l -> l.stream().map(Game.game.window::getKeyText).collect(Collectors.toList()); + System.out.println("Game.screen = " + Game.screen.getClass().getSimpleName()); + System.out.println("pressedKeys: " + func.apply(Game.game.window.pressedKeys)); + System.out.println("validPressedKeys: " + func.apply(Game.game.window.validPressedKeys)); + System.out.println("textPressedKeys: " + func.apply(Game.game.window.textPressedKeys)); + notifications.add(new ScreenElement.Notification("Pressed keys have been logged to the console", 800)); + } + else + { + System.out.println("Network event mappings:"); + NetworkEventMap.print(); + notifications.add(new ScreenElement.Notification("Network event mappings have been logged to the console", 800)); + } } if (Game.game.window.pressedKeys.contains(InputCodes.KEY_D)) @@ -102,6 +114,13 @@ else if (ScreenPartyHost.isServer) } } + if (Game.game.window.pressedKeys.contains(InputCodes.KEY_COMMA)) + { + Game.game.window.pressedKeys.remove((Integer) InputCodes.KEY_COMMA); + INetworkEvent.handle.fieldsInClass.clear(); + notifications.add(new ScreenElement.Notification("Cleared network event fields", 800)); + } + if (Game.game.window.pressedKeys.contains(InputCodes.KEY_A)) { Game.game.window.pressedKeys.remove((Integer) InputCodes.KEY_A); @@ -252,48 +271,6 @@ else if (Game.game.window.pressedKeys.contains(InputCodes.KEY_3)) Game.game.window.fontRenderer.drawString(mx + 10, my + 10, Drawing.drawing.fontSize, Drawing.drawing.fontSize, text); } - public static final BiConsumer>, ArrayList> sortEvents = - (map, lines) -> - map.object2IntEntrySet().stream() - .sorted(Comparator.comparingInt(entry -> ((Object2IntMap.Entry) entry).getIntValue()).reversed()) - .limit(5) - .forEach(entry -> lines.add(entry.getKey().getSimpleName() + ": " + entry.getIntValue())); - - public static void drawEventCount() - { - Object2IntOpenHashMap> in = Panel.panel.eventsInCount; - Object2IntOpenHashMap> out = Panel.panel.eventsOutCount; - - if (!Game.recordEventData || (!ScreenPartyHost.isServer && !ScreenPartyLobby.isClient)) - return; - - ArrayList lines = new ArrayList<>(); - if (!in.isEmpty() || !out.isEmpty()) - { - lines.add("\u00a7255127000255Events in:\u00a7r"); - sortEvents.accept(in, lines); - lines.add("\u00a7255127000255Events out:\u00a7r"); - sortEvents.accept(out, lines); - } - else - lines.add("No events"); - - Drawing.drawing.setColor(255, 255, 255, 128); - double centerY = Drawing.drawing.getInterfaceEdgeY(true) - 350; - - Drawing.drawing.setInterfaceFontSize(20); - Drawing.drawing.setColor(0, 0, 0); - int i = -lines.size() / 2; - for (String s : lines) - { - Drawing.drawing.drawUncenteredInterfaceText( - 75, - centerY + 30 * (i++), - s - ); - } - } - public static void renderDebugging() { if (!Game.debug || Game.game.window.drawingShadow) @@ -303,7 +280,6 @@ public static void renderDebugging() Face.drawDebug(); Chunk.drawDebugStuff(); Ray.drawDebug(); - drawEventCount(); if (Game.drawAvoidObjects) { diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index c4f86cff8..a9ee43a11 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -149,7 +149,6 @@ public int hashCode() public static boolean showNetworkIDs = false; public static boolean drawAutoZoom = false; public static boolean drawFaces = false; - public static boolean recordEventData = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; public static final boolean cinematic = false; @@ -536,7 +535,6 @@ public static void initScript() Drawing.initialize(); Panel.initialize(); - NetworkFieldHandle.initialize(); Game.exitToTitle(); Hotbar.toggle = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY - 20, 150, 40, "", () -> Game.player.hotbar.persistent = !Game.player.hotbar.persistent); diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 72d9b4c6d..f87e26040 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -358,17 +358,6 @@ else if (Game.deterministicMode) prev = stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else Game.eventsIn.get(i).execute(); - - if (Game.recordEventData && prev == null) - { - if (e instanceof EventStackedGroup) - { - for (INetworkEvent e2 : ((EventStackedGroup) e).events) - eventsInCount.addTo(e2.getClass(), 1); - } - else - eventsInCount.addTo(e.getClass(), 1); - } } } diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index fb53925c6..f0b7e4908 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -708,28 +708,12 @@ public void checkCollisionLocal() if (this.destroy) return; - for (int i = 0; i < Game.obstacles.size(); i++) - { - Obstacle o = Game.obstacles.get(i); - - if (!o.checkForObjects) - continue; - - double dx = this.posX - o.posX; - double dy = this.posY - o.posY; - - double horizontalDist = Math.abs(dx); - double verticalDist = Math.abs(dy); - - double s = this.size; - if (useCustomWallCollision) - s = this.wallCollisionSize; - - double bound = s / 2 + Game.tile_size / 2; - - if (horizontalDist < bound && verticalDist < bound) - o.onObjectEntryLocal(this); - } + double bound = this.size / 2 + Game.tile_size / 2; + for (Obstacle o : Obstacle.getObstaclesInRange(posX - bound, posY - bound, posX + bound, posY + bound)) + { + if (o.checkForObjects) + o.onObjectEntryLocal(this); + } } public void checkCollision() diff --git a/src/main/java/tanks/bullet/BulletReboundIndicator.java b/src/main/java/tanks/bullet/BulletReboundIndicator.java index fe43d296f..c6c28b63d 100644 --- a/src/main/java/tanks/bullet/BulletReboundIndicator.java +++ b/src/main/java/tanks/bullet/BulletReboundIndicator.java @@ -30,13 +30,13 @@ public BulletReboundIndicator(Bullet b) Game.eventsOut.add(new EventBulletReboundIndicator(this)); } - public BulletReboundIndicator(double posX, double posY, double posZ, double size, double maxAge, double r1, double g1, double b1, double r2, double g2, double b2) + public BulletReboundIndicator(double posX, double posY, double posZ, double size, double maxAge, Color c1, Color c2) { super(posX, posY); this.posZ = posZ; this.size = size; - this.color.set(r1, g1, b1); - this.color2.set(r2, g2, b2); + this.color = c1; + this.color2 = c2; this.maxAge = maxAge; } diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index f44d62ba2..7d76ff8c2 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -28,14 +28,13 @@ public class ScreenDebug extends Screen Button drawAvoidObjects = createToggle("Draw avoid objects: ", b -> Game.drawAvoidObjects = b, () -> Game.drawAvoidObjects); Button disableFixes = createToggle("Disable fixes: ", b -> Game.disableErrorFixing = b, () -> Game.disableErrorFixing); Button recordMovableData = createToggle("Record movable data: ", b -> Game.recordMovableData = b, () -> Game.recordMovableData); - Button recordEventData = createToggle("Record event data: ", b -> Game.recordEventData = b, () -> Game.recordEventData); Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 5, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, recordEventData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index 1e9aab106..0639c7016 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -157,10 +157,15 @@ public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf if (c == null) throw new Exception("Invalid network event: " + i + " (Previous event: " + NetworkEventMap.get(this.lastID) + ")"); - this.lastID = i; - INetworkEvent e = c.getConstructor().newInstance(); - e.read(m); + try + { + e.read(m); + } + catch (Exception exc) + { + throw new RuntimeException("Failed to read network event " + c + " (previous event: " + NetworkEventMap.get(this.lastID) + "): " + exc.getMessage()); + } if (e instanceof PersonalEvent) { @@ -180,6 +185,8 @@ else if (e instanceof IClientThreadEvent && ch != null) Game.eventsIn.add(e); } } + + this.lastID = i; } public static void updateLastMessageTime() diff --git a/src/main/java/tanks/network/NetworkEventMap.java b/src/main/java/tanks/network/NetworkEventMap.java index e3e3c070f..2397fab09 100644 --- a/src/main/java/tanks/network/NetworkEventMap.java +++ b/src/main/java/tanks/network/NetworkEventMap.java @@ -14,6 +14,13 @@ public class NetworkEventMap public static void register(Class c) { + map1.put(id, c); + map2.put(c, id); + id++; + + if (!Game.debug) + return; + try { c.getConstructor(); @@ -25,7 +32,7 @@ public static void register(Class c) } ByteBuf b = Unpooled.buffer(); - INetworkEvent e = null; + INetworkEvent e; try { e = c.getConstructor().newInstance(); @@ -34,13 +41,9 @@ public static void register(Class c) } catch (Exception exc) { - if (e == NetworkFieldHandle.testObject && exc.getMessage().contains("Failed to find field handle")) // uses custom read/write methods + if (exc.getMessage().contains("Failed to find field handle")) // uses custom read/write methods throw new RuntimeException(exc); } - - map1.put(id, c); - map2.put(c, id); - id++; } public static int get(Class c) @@ -61,8 +64,6 @@ public static Class get(int i) public static void print() { for (int i = 0; i < id; i++) - { - System.out.println(i + " " + NetworkEventMap.get(i)); - } + System.out.println(i + " " + NetworkEventMap.get(i)); } } diff --git a/src/main/java/tanks/network/NetworkFieldHandle.java b/src/main/java/tanks/network/NetworkFieldHandle.java deleted file mode 100644 index 04f817d5a..000000000 --- a/src/main/java/tanks/network/NetworkFieldHandle.java +++ /dev/null @@ -1,143 +0,0 @@ -package tanks.network; - -import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.*; -import tanks.network.event.INetworkEvent; - -import java.lang.invoke.*; -import java.lang.reflect.*; -import java.util.*; - -public class NetworkFieldHandle -{ - protected static final MethodHandles.Lookup lookup = MethodHandles.lookup(); - - // Used for network field validation upon game launch only. Do not use for anything else, will cause race conditions - public static Object testObject = null; - - public static class FieldHandle - { - protected final Class castType; - protected Function read; - protected BiConsumer write; - - protected FieldHandle(Class castType, Function readFunc, BiConsumer writeFunc) - { - this.castType = castType; - this.read = readFunc; - this.write = writeFunc; - } - - public T read(ByteBuf b) - { - return castType.cast(read.apply(b)); - } - - @SuppressWarnings("unchecked") - public void write(ByteBuf b, Object t) - { - write.accept(b, (T) t); - } - - @SuppressWarnings("UnusedReturnValue") - public static FieldHandle register(Class castType, Function read, BiConsumer write) - { - return register(castType, castType, read, write); - } - - public static FieldHandle register(Class originalType, Class castType, Function read, BiConsumer write) - { - FieldHandle f = new FieldHandle<>(castType, read, write); - sigs.put(originalType, f); - return f; - } - } - - static Map, FieldHandle> sigs = new HashMap<>(); - - public static boolean shouldCheckField(Field f) - { - return !Modifier.isStatic(f.getModifiers()) && !f.isAnnotationPresent(INetworkEvent.NetworkIgnored.class); - } - - private static double readDouble(ByteBuf b) - { - return b.readFloat(); - } - - private static void writeDouble(ByteBuf b, double d) - { - b.writeFloat((float) d); - } - - public static void initialize() - { - if (!sigs.isEmpty()) - return; - - FieldHandle.register(int.class, Integer.class, ByteBuf::readInt, ByteBuf::writeInt); - FieldHandle.register(long.class, Long.class, ByteBuf::readLong, ByteBuf::writeLong); - FieldHandle.register(float.class, Float.class, ByteBuf::readFloat, ByteBuf::writeFloat); - FieldHandle.register(double.class, Double.class, NetworkFieldHandle::readDouble, NetworkFieldHandle::writeDouble); // treat doubles as floats - FieldHandle.register(boolean.class, Boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean); - FieldHandle.register(String.class, NetworkUtils::readString, NetworkUtils::writeString); - FieldHandle.register(Color.class, NetworkUtils::readColor, NetworkUtils::writeColor); - FieldHandle.register(UUID.class, NetworkUtils::readUUID, NetworkUtils::writeUUID); - - // bytebuf takes int for these - FieldHandle.register(byte.class, int.class, ByteBuf::readByte, ByteBuf::writeByte); - FieldHandle.register(short.class, int.class, ByteBuf::readShort, ByteBuf::writeShort); - FieldHandle.register(char.class, int.class, ByteBuf::readChar, ByteBuf::writeChar); - } - - public Object currentObject; - - protected final MethodHandle read, write; - protected final FieldHandle fieldHandle; - protected final Field field; - - public NetworkFieldHandle(Field field) - { - try - { - this.read = lookup.unreflectGetter(field); - this.write = lookup.unreflectSetter(field); - this.fieldHandle = Objects.requireNonNull(sigs.get(field.getType()), "Failed to find field handle for '" + field.getName() + "' of type '" + field.getType() + "' from class '" + field.getDeclaringClass() + "'"); - this.field = field; - } - catch (IllegalAccessException e) - { - throw new RuntimeException(this + ": " + e); - } - } - - public void read(ByteBuf b) - { - try - { - this.write.invoke(currentObject, this.fieldHandle.read(b)); - } - catch (Throwable e) - { - throw new RuntimeException(this + ", " + this.fieldHandle.read(b) + ": " + e); - } - } - - public void write(ByteBuf b) - { - try - { - this.fieldHandle.write(b, this.read.invoke(currentObject)); - } - catch (Throwable e) - { - throw new RuntimeException(this + ", " + e); - } - } - - public String toString() - { - return currentObject.getClass().getSimpleName() + ": " + this.field.getName(); - } -} diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index 540c49c0c..c578e2a27 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -52,15 +52,6 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) Game.steamNetworkHandler.send(steamID.getAccountID(), e, flush ? SteamNetworking.P2PSend.Reliable : SteamNetworking.P2PSend.ReliableWithBuffering); - if (Game.recordEventData) - { - if (e instanceof EventStackedGroup) - for (INetworkEvent e2 : ((EventStackedGroup) e).events) - Panel.panel.eventsOutCount.addTo(e2.getClass(), 1); - else - Panel.panel.eventsOutCount.addTo(e.getClass(), 1); - } - ByteBuf b = ctx.channel().alloc().buffer(); int eventID = NetworkEventMap.get(e.getClass()); @@ -105,9 +96,8 @@ public void reply() INetworkEvent prev = null; for (INetworkEvent e : this.events) { - INetworkEvent other = null; if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - other = this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); + this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else { if (prev != null) @@ -115,8 +105,6 @@ public void reply() prev = e; } - if (Game.recordEventData && other == null) - Panel.panel.eventsOutCount.addTo(e.getClass(), 1); } long time = System.currentTimeMillis() * Game.networkRate / 1000; diff --git a/src/main/java/tanks/network/event/EventBulletBounce.java b/src/main/java/tanks/network/event/EventBulletBounce.java index 4805c340e..9bb5930cd 100644 --- a/src/main/java/tanks/network/event/EventBulletBounce.java +++ b/src/main/java/tanks/network/event/EventBulletBounce.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.bullet.Bullet; public class EventBulletBounce extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index 4b8af2d2e..d916b9c16 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.bullet.Bullet; import tanks.bullet.BulletInstant; diff --git a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java index 76d998dc2..2885e2e55 100644 --- a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java +++ b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java @@ -1,13 +1,13 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; +import basewindow.Color; import tanks.Game; import tanks.bullet.BulletReboundIndicator; -import tanks.network.NetworkUtils; public class EventBulletReboundIndicator extends PersonalEvent { - public BulletReboundIndicator indicator; + public double posX, posY, posZ, size, maxAge; + public Color color1, color2; public EventBulletReboundIndicator() { @@ -16,43 +16,19 @@ public EventBulletReboundIndicator() public EventBulletReboundIndicator(BulletReboundIndicator b) { - this.indicator = b; - } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(indicator.posX); - b.writeDouble(indicator.posY); - b.writeDouble(indicator.posZ); - b.writeDouble(indicator.size); - b.writeDouble(indicator.maxAge); - NetworkUtils.writeColor(b, indicator.color); - NetworkUtils.writeColor(b, indicator.color2); - } - - @Override - public void read(ByteBuf b) - { - this.indicator = new BulletReboundIndicator( - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble() - ); + posX = b.posX; + posY = b.posY; + posZ = b.posZ; + size = b.size; + maxAge = b.maxAge; + color1 = b.color; + color2 = b.color2; } @Override public void execute() { if (this.clientID == null) - Game.movables.add(indicator); + Game.movables.add(new BulletReboundIndicator(posX, posY, posZ, size, maxAge, color1, color2)); } } diff --git a/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java b/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java index 982144f20..c31c3dbb8 100644 --- a/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java +++ b/src/main/java/tanks/network/event/EventLoadCrusadeHotbar.java @@ -1,9 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenGame; -import tanks.network.NetworkUtils; import tanks.translation.Translation; public class EventLoadCrusadeHotbar extends PersonalEvent @@ -11,8 +9,8 @@ public class EventLoadCrusadeHotbar extends PersonalEvent public String title; public String subtitle; - int index; - boolean translate; + public int index; + public boolean translate; public EventLoadCrusadeHotbar() { @@ -26,6 +24,7 @@ public EventLoadCrusadeHotbar(String title, String subtitle, int index, boolean this.index = index; this.translate = translate; } + @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleDestroy.java b/src/main/java/tanks/network/event/EventObstacleDestroy.java index 824772bf7..412277106 100644 --- a/src/main/java/tanks/network/event/EventObstacleDestroy.java +++ b/src/main/java/tanks/network/event/EventObstacleDestroy.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; import tanks.obstacle.Obstacle; public class EventObstacleDestroy extends PersonalEvent @@ -10,7 +8,7 @@ public class EventObstacleDestroy extends PersonalEvent public double posX; public double posY; - boolean effect; + public boolean effect; public double effectX; public double effectY; public double radius; @@ -45,17 +43,14 @@ public void execute() if (this.clientID != null) return; - for (int i = 0; i < Game.obstacles.size(); i++) - { - Obstacle o = Game.obstacles.get(i); + Obstacle o = Game.getObstacle(posX, posY); - if (o.posX == this.posX && o.posY == this.posY && o.name.equals(name)) - { - if (effect) - o.playDestroyAnimation(this.effectX, this.effectY, this.radius); + if (o.posX != this.posX || o.posY != this.posY || !o.name.equals(name)) + return; + + if (effect) + o.playDestroyAnimation(this.effectX, this.effectY, this.radius); - Game.removeObstacles.add(o); - } - } + Game.removeObstacles.add(o); } } diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index 2ce3c7388..7274530f7 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.tank.Tank; import tanks.tank.TankPlayerController; diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index efd187ca1..a6e99afbe 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -35,11 +35,11 @@ else if (health > t.health) double before = t.health; t.health = health; - if ((int) (before) != (int) (t.health)) + if ((int) before != (int) t.health && t.health > 0) { Effect e = Effect.createNewEffect(t.posX, t.posY, t.posZ + t.size * 0.75, Effect.EffectType.shield); e.size = t.size; - e.radius = t.health - 1; + e.radius = t.health; Game.effects.add(e); } diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index aa1631936..d14b1d4a8 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -1,53 +1,42 @@ package tanks.network.event; +import basewindow.Color; import io.netty.buffer.ByteBuf; -import tanks.network.NetworkFieldHandle; +import tanks.network.*; +import tanks.tankson.ReflectionHandle; import java.lang.annotation.*; -import java.lang.reflect.*; -import java.util.*; +import java.util.UUID; public interface INetworkEvent extends IEvent { - @Retention(RetentionPolicy.RUNTIME) - @interface NetworkIgnored - { - } + ReflectionHandle handle = new ReflectionHandle() + .setFieldFilter(f -> !f.isAnnotationPresent(NetworkIgnored.class)) + .registerTypeHandle(int.class, Integer.class, ByteBuf::readInt, ByteBuf::writeInt) + .registerTypeHandle(long.class, Long.class, ByteBuf::readLong, ByteBuf::writeLong) + .registerTypeHandle(float.class, Float.class, ByteBuf::readFloat, ByteBuf::writeFloat) + .registerTypeHandle(double.class, Double.class, ByteBuf::readDouble, ByteBuf::writeDouble) + .registerTypeHandle(boolean.class, Boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean) + .registerTypeHandle(String.class, NetworkUtils::readString, NetworkUtils::writeString) + .registerTypeHandle(Color.class, NetworkUtils::readColor, NetworkUtils::writeColor) + .registerTypeHandle(UUID.class, NetworkUtils::readUUID, NetworkUtils::writeUUID); - HashMap, ArrayList> classToFields = new HashMap<>(); default void write(ByteBuf b) { - for (NetworkFieldHandle f : getFieldHandles()) - f.write(b); + handle.writeObject(b, this); } default void read(ByteBuf b) { - for (NetworkFieldHandle f : getFieldHandles()) - f.read(b); + handle.readObject(b, this); } void execute(); - default ArrayList getFieldHandles() + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + @interface NetworkIgnored { - ArrayList fields = classToFields.computeIfAbsent(getClass(), c -> - { - ArrayList handles = new ArrayList<>(); - for (Field f : c.getFields()) - { - if (NetworkFieldHandle.shouldCheckField(f)) - handles.add(new NetworkFieldHandle(f)); - } - return handles; - }); - - for (NetworkFieldHandle f : fields) - f.currentObject = this; - - NetworkFieldHandle.testObject = this; - - return fields; } } diff --git a/src/main/java/tanks/tankson/ReflectionHandle.java b/src/main/java/tanks/tankson/ReflectionHandle.java new file mode 100644 index 000000000..7bcc0b2de --- /dev/null +++ b/src/main/java/tanks/tankson/ReflectionHandle.java @@ -0,0 +1,147 @@ +package tanks.tankson; + +import tanks.*; + +import java.lang.invoke.*; +import java.lang.reflect.*; +import java.util.*; + +/** + * A class which allows users to define custom functions based on field type + * to deserialize and serialize objects along a stream. + * */ +public class ReflectionHandle +{ + protected static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + + public Map, List> fieldsInClass = new HashMap<>(); + public Map, TypeHandle> typeHandles = new HashMap<>(); + + public Function fieldFilter = f -> true; + + public void readObject(S stream, Object object) + { + for (FieldHandle f : getFieldsInClass(object.getClass())) + f.write(object, getTypeHandle(f.field.getType()).read(stream)); + } + + public void writeObject(S stream, Object object) + { + for (FieldHandle f : getFieldsInClass(object.getClass())) + getTypeHandle(f.field.getType()).write(stream, f.read(object)); + } + + @SuppressWarnings("unchecked") + public TypeHandle getTypeHandle(Class type) + { + return (TypeHandle) Objects.requireNonNull(typeHandles.get(type), "Failed to find type handle" + + " for " + type + ". Either register a type handle for it, or modify #shouldCheckField() to skip" + + " registering the field."); + } + + public ReflectionHandle registerTypeHandle(Class castType, Function read, BiConsumer write) + { + return registerTypeHandle(castType, castType, read, write); + } + + public ReflectionHandle registerTypeHandle(Class originalType, Class castType, Function read, BiConsumer write) + { + typeHandles.put(originalType, new TypeHandle<>(castType, read, write)); + return this; + } + + public List getFieldsInClass(Class c) + { + return fieldsInClass.computeIfAbsent(c, k -> + { + List fields = new ArrayList<>(); + for (Field f : c.getFields()) + { + if (shouldCheckField(f)) + fields.add(new FieldHandle(f)); + } + return fields; + }); + } + + public ReflectionHandle setFieldFilter(Function fieldFilter) + { + this.fieldFilter = fieldFilter; + return this; + } + + public boolean shouldCheckField(Field f) + { + return !Modifier.isStatic(f.getModifiers()) && fieldFilter.apply(f); + } + + public static class FieldHandle + { + protected final MethodHandle read, write; + protected final Field field; + + public FieldHandle(Field field) + { + try + { + this.read = lookup.unreflectGetter(field); + this.write = lookup.unreflectSetter(field); + + this.field = field; + } + catch (IllegalAccessException e) + { + throw new RuntimeException(this + ": " + e); + } + } + + public Object read(Object obj) + { + try + { + return this.read.invoke(obj); + } + catch (Throwable e) + { + throw new RuntimeException(e); + } + } + + public void write(Object obj, Object value) + { + try + { + this.write.invoke(obj, value); + } + catch (Throwable e) + { + throw new RuntimeException(e); + } + } + } + + public static class TypeHandle + { + protected final Class castType; + protected Function read; + protected BiConsumer write; + + protected TypeHandle(Class castType, Function readFunc, BiConsumer writeFunc) + { + this.castType = castType; + this.read = readFunc; + this.write = writeFunc; + } + + public T read(I object) + { + return castType.cast(read.apply(object)); + } + + @SuppressWarnings("unchecked") + public void write(I stream, Object object) + { + write.accept(stream, (T) object); + } + } +} From 7057b137894ad4ebf9a129ac9b2c77f30b139f60 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 18:22:25 -0700 Subject: [PATCH 06/35] fix(EventTankUpdateHealth): shield fix Signed-off-by: orangishcat --- src/main/java/tanks/Panel.java | 20 ++++----- src/main/java/tanks/item/Item.java | 2 +- .../java/tanks/network/NetworkHandler.java | 41 +++++++++++-------- .../network/event/EventTankUpdateHealth.java | 2 +- .../java/tanks/tankson/ReflectionHandle.java | 2 +- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index f87e26040..19447f495 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -1,7 +1,7 @@ package tanks; import basewindow.InputCodes; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import tanks.extension.Extension; import tanks.gui.*; import tanks.gui.ScreenElement.*; @@ -15,7 +15,7 @@ import tanks.rendering.*; import tanks.tank.*; -import java.util.*; +import java.util.ArrayList; public class Panel { @@ -90,7 +90,7 @@ public class Panel protected Screen lastDrawnScreen = null; public ArrayList lights = new ArrayList<>(); - HashMap stackedEventsIn = new HashMap<>(); + public Int2ObjectOpenHashMap stackedEventsIn = new Int2ObjectOpenHashMap<>(); public LoadingTerrainContinuation continuation = null; public long continuationStartTime = 0; @@ -101,9 +101,6 @@ public class Panel /** Set to a directory to have the game screenshot the next frame and save it to that directory */ public String saveScreenshotDir = null; - public final Object2IntOpenHashMap> eventsInCount = new Object2IntOpenHashMap<>(); - public final Object2IntOpenHashMap> eventsOutCount = new Object2IntOpenHashMap<>(); - public static void initialize() { if (!initialized) @@ -352,23 +349,20 @@ else if (Game.deterministicMode) if (!(Game.eventsIn.get(i) instanceof IOnlineServerEvent)) { INetworkEvent e = Game.eventsIn.get(i); - INetworkEvent prev = null; if (e instanceof IStackableEvent) - prev = stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); + stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else Game.eventsIn.get(i).execute(); } } + for (INetworkEvent e: stackedEventsIn.values()) + e.execute(); + Game.eventsIn.clear(); } - for (INetworkEvent e: stackedEventsIn.values()) - e.execute(); - - stackedEventsIn.clear(); - if (ScreenPartyHost.isServer) { synchronized (ScreenPartyHost.disconnectedPlayers) diff --git a/src/main/java/tanks/item/Item.java b/src/main/java/tanks/item/Item.java index c28eefd3b..14850ec42 100644 --- a/src/main/java/tanks/item/Item.java +++ b/src/main/java/tanks/item/Item.java @@ -203,7 +203,7 @@ public boolean attemptUse(Tank t) { if (this.usable(t) && !this.destroy) { - use(t); + use(t); return true; } diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index c578e2a27..66107ee3b 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -24,7 +24,7 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public MessageReader reader = new MessageReader(); protected long lastStackedEventSend = 0; - protected HashMap, EventStackedGroup> groupedEvents = new HashMap<>(); + protected LinkedHashMap, EventStackedGroup> groupedEvents = new LinkedHashMap<>(); public synchronized void sendEventAndClose(INetworkEvent e) { @@ -75,17 +75,34 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) ReferenceCountUtil.release(b); } + @SuppressWarnings("unchecked") public synchronized void stackEvent(INetworkEvent e) { - groupedEvents.computeIfAbsent(e.getClass(), - k -> new EventStackedGroup(e.getClass())).events.add(e); + if (!(e instanceof PersonalEvent) || e instanceof IClientThreadEvent || e instanceof IServerThreadEvent) + { + sendEvent(e, false); + return; + } + + groupedEvents.computeIfAbsent(e.getClass(), k -> + new EventStackedGroup((Class) e.getClass())) + .events.add((PersonalEvent) e); } public synchronized void flushEvents() { + if (groupedEvents.isEmpty()) + return; + int i = 0; for (EventStackedGroup e : this.groupedEvents.values()) - sendEvent(e, i++ >= this.groupedEvents.size() - 1); + { + boolean flush = i++ >= this.groupedEvents.size() - 1; + if (e.events.size() == 1) + sendEvent(e.events.get(0), flush); + else + sendEvent(e, flush); + } groupedEvents.clear(); } @@ -93,18 +110,12 @@ public void reply() { synchronized (this.events) { - INetworkEvent prev = null; for (INetworkEvent e : this.events) { if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else - { - if (prev != null) - this.stackEvent(e); - - prev = e; - } + this.stackEvent(e); } long time = System.currentTimeMillis() * Game.networkRate / 1000; @@ -112,20 +123,14 @@ public void reply() { lastStackedEventSend = time; - if (prev != null) - this.stackEvent(prev); - for (IStackableEvent e : this.stackedEvents.values()) this.stackEvent(e); this.stackedEvents.clear(); - flushEvents(); } - else if (prev != null) - this.stackEvent(prev); if (steamID == null) - this.ctx.flush(); + flushEvents(); this.events.clear(); } diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index a6e99afbe..20e435102 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -35,7 +35,7 @@ else if (health > t.health) double before = t.health; t.health = health; - if ((int) before != (int) t.health && t.health > 0) + if ((int) before != (int) t.health && t.health > 1) { Effect e = Effect.createNewEffect(t.posX, t.posY, t.posZ + t.size * 0.75, Effect.EffectType.shield); e.size = t.size; diff --git a/src/main/java/tanks/tankson/ReflectionHandle.java b/src/main/java/tanks/tankson/ReflectionHandle.java index 7bcc0b2de..10d16ee72 100644 --- a/src/main/java/tanks/tankson/ReflectionHandle.java +++ b/src/main/java/tanks/tankson/ReflectionHandle.java @@ -35,7 +35,7 @@ public void writeObject(S stream, Object object) public TypeHandle getTypeHandle(Class type) { return (TypeHandle) Objects.requireNonNull(typeHandles.get(type), "Failed to find type handle" + - " for " + type + ". Either register a type handle for it, or modify #shouldCheckField() to skip" + + " for " + type + ". Either register a type handle for it, or modify the fieldFilter to skip" + " registering the field."); } From 558410225ef1337b1f17d97f4df7f4fd9f35a87a Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 19:34:07 -0700 Subject: [PATCH 07/35] style: minor code style changes Signed-off-by: orangishcat --- .../java/tanks/network/MessageReader.java | 12 +++++------ .../java/tanks/network/NetworkHandler.java | 20 ++++++++++++++----- .../java/tanks/network/ServerHandler.java | 1 - .../tanks/network/event/EventShootBullet.java | 1 - 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index 0639c7016..5dd538c8a 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -9,7 +9,7 @@ import java.util.UUID; -public class MessageReader +public class MessageReader { public static final int max_event_size = 104857600; @@ -76,16 +76,16 @@ else if (ScreenPartyLobby.isClient) return; } } - + reading = true; while (queue.readableBytes() >= endpoint) { this.readMessage(s, c, queue, clientID); queue.discardReadBytes(); - + reading = false; - + if (queue.readableBytes() >= 4) { endpoint = queue.readInt(); @@ -151,7 +151,7 @@ else if (ScreenPartyLobby.isClient) public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf m, UUID clientID) throws Exception { - int i = m.readInt(); + int i = m.readShort(); Class c = NetworkEventMap.get(i); if (c == null) @@ -164,7 +164,7 @@ public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf } catch (Exception exc) { - throw new RuntimeException("Failed to read network event " + c + " (previous event: " + NetworkEventMap.get(this.lastID) + "): " + exc.getMessage()); + throw new RuntimeException("Failed to read network event " + c + " (previous event: " + NetworkEventMap.get(this.lastID) + "):" + exc.getMessage()); } if (e instanceof PersonalEvent) diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index 66107ee3b..ff7e6c086 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -58,7 +58,7 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) if (eventID == -1) throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); - b.writeInt(eventID); + b.writeShort(eventID); e.write(b); ByteBuf b2 = ctx.channel().alloc().buffer(); @@ -84,9 +84,8 @@ public synchronized void stackEvent(INetworkEvent e) return; } - groupedEvents.computeIfAbsent(e.getClass(), k -> - new EventStackedGroup((Class) e.getClass())) - .events.add((PersonalEvent) e); + groupedEvents.computeIfAbsent(e.getClass(), + k -> new EventStackedGroup((Class) e.getClass())).events.add((PersonalEvent) e); } public synchronized void flushEvents() @@ -110,12 +109,18 @@ public void reply() { synchronized (this.events) { + INetworkEvent prev = null; for (INetworkEvent e : this.events) { if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); else - this.stackEvent(e); + { + if (prev != null) + this.stackEvent(prev); + + prev = e; + } } long time = System.currentTimeMillis() * Game.networkRate / 1000; @@ -123,11 +128,16 @@ public void reply() { lastStackedEventSend = time; + if (prev != null) + this.stackEvent(prev); + for (IStackableEvent e : this.stackedEvents.values()) this.stackEvent(e); this.stackedEvents.clear(); } + else if (prev != null) + this.stackEvent(prev); if (steamID == null) flushEvents(); diff --git a/src/main/java/tanks/network/ServerHandler.java b/src/main/java/tanks/network/ServerHandler.java index a663f9718..b21ac013a 100644 --- a/src/main/java/tanks/network/ServerHandler.java +++ b/src/main/java/tanks/network/ServerHandler.java @@ -127,7 +127,6 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) public void reply() { super.reply(); - if (pingReceived && System.currentTimeMillis() - lastPingSent > 1000) { pingReceived = false; diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index 68a9151a8..0abbfe23d 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.*; import tanks.bullet.*; import tanks.item.*; From 817e29f3a643f629685b72d164b01faf6d782ebf Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 19:49:28 -0700 Subject: [PATCH 08/35] fix: shoot bullet event Signed-off-by: orangishcat --- .../tanks/network/event/EventShootBullet.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index 0abbfe23d..c621f9e9b 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -5,7 +5,7 @@ import tanks.item.*; import tanks.tank.*; -public class EventShootBullet extends PersonalEvent implements IStackableEvent +public class EventShootBullet extends PersonalEvent { public int id; public int tank; @@ -18,9 +18,7 @@ public class EventShootBullet extends PersonalEvent implements IStackableEvent public double speed; public int item; - public boolean isStackable; - - public EventShootBullet() + public EventShootBullet() { } @@ -29,7 +27,6 @@ public EventShootBullet(Bullet b) { this.id = b.networkID; this.tank = b.tank.networkID; - this.isStackable = b.affectedByFrameFrequency; this.posX = b.posX; this.posY = b.posY; this.posZ = b.posZ; @@ -40,13 +37,7 @@ public EventShootBullet(Bullet b) this.item = b.item.networkIndex; } - @Override - public boolean isStackable() - { - return isStackable; - } - - @Override + @Override public void execute() { if (this.clientID != null) @@ -115,10 +106,4 @@ else if (t2 instanceof TankPlayer) e.printStackTrace(); } } - - @Override - public int getIdentifier() - { - return tank; - } } From 6c39fa7edf66900bd68d90304d6b8812711fdb81 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 21:18:26 -0700 Subject: [PATCH 09/35] fix: remove stacked group event Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 1 - .../java/tanks/network/NetworkHandler.java | 153 ++++++++---------- .../java/tanks/network/ServerHandler.java | 2 +- .../network/event/EventStackedGroup.java | 54 ------- .../tanks/network/event/INetworkEvent.java | 12 +- 5 files changed, 82 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/tanks/network/event/EventStackedGroup.java diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index a9ee43a11..6fbd99229 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -438,7 +438,6 @@ public static void registerEvents() NetworkEventMap.register(EventArcadeFrenzy.class); NetworkEventMap.register(EventArcadeEnd.class); NetworkEventMap.register(EventArcadeBonuses.class); - NetworkEventMap.register(EventStackedGroup.class); NetworkEventMap.register(EventSendOnlineClientDetails.class); NetworkEventMap.register(EventSilentDisconnect.class); diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index ff7e6c086..60bc262ba 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -24,41 +24,83 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public MessageReader reader = new MessageReader(); protected long lastStackedEventSend = 0; - protected LinkedHashMap, EventStackedGroup> groupedEvents = new LinkedHashMap<>(); - public synchronized void sendEventAndClose(INetworkEvent e) + public void reply() { - this.closed = true; - if (steamID != null) - Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); - else - this.sendEvent(e, true); + synchronized (this.events) + { + INetworkEvent prev = null; + for (int i = 0; i < this.events.size(); i++) + { + INetworkEvent e = this.events.get(i); - if (ctx != null) - ctx.close(); + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) + this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); + else + { + if (prev != null) + this.sendEvent(prev,false); - if (steamID != null) - Game.steamNetworkHandler.queueClose(steamID.getAccountID()); + prev = e; + } + } + + long time = System.currentTimeMillis() * Game.networkRate / 1000; + if (time != lastStackedEventSend) + { + lastStackedEventSend = time; + int size = this.stackedEvents.size(); + + if (prev != null) + this.sendEvent(prev, size == 0); + + for (IStackableEvent e: this.stackedEvents.values()) + { + size--; + this.sendEvent(e, size <= 0); + } + this.stackedEvents.clear(); + } + else if (prev != null) + this.sendEvent(prev, true); + + if (steamID == null) + this.ctx.flush(); + + this.events.clear(); + } } public synchronized void sendEvent(INetworkEvent e) { - sendEvent(e, true); + this.sendEvent(e, true); } + public HashMap eventFrequencies = new HashMap<>(); + public synchronized void sendEvent(INetworkEvent e, boolean flush) { + eventFrequencies.putIfAbsent(e.getClass().getSimpleName(), 0); + eventFrequencies.put(e.getClass().getSimpleName(), eventFrequencies.get(e.getClass().getSimpleName()) + 1); + if (steamID != null) - Game.steamNetworkHandler.send(steamID.getAccountID(), e, flush ? - SteamNetworking.P2PSend.Reliable : SteamNetworking.P2PSend.ReliableWithBuffering); + { + SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; + + if (flush) + sendType = SteamNetworking.P2PSend.Reliable; + + Game.steamNetworkHandler.send(steamID.getAccountID(), e, sendType); + return; + } ByteBuf b = ctx.channel().alloc().buffer(); - int eventID = NetworkEventMap.get(e.getClass()); - if (eventID == -1) + int i = NetworkEventMap.get(e.getClass()); + if (i == -1) throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); - b.writeShort(eventID); + b.writeShort(i); e.write(b); ByteBuf b2 = ctx.channel().alloc().buffer(); @@ -75,81 +117,26 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) ReferenceCountUtil.release(b); } - @SuppressWarnings("unchecked") - public synchronized void stackEvent(INetworkEvent e) - { - if (!(e instanceof PersonalEvent) || e instanceof IClientThreadEvent || e instanceof IServerThreadEvent) - { - sendEvent(e, false); - return; - } - - groupedEvents.computeIfAbsent(e.getClass(), - k -> new EventStackedGroup((Class) e.getClass())).events.add((PersonalEvent) e); - } - - public synchronized void flushEvents() - { - if (groupedEvents.isEmpty()) - return; - - int i = 0; - for (EventStackedGroup e : this.groupedEvents.values()) - { - boolean flush = i++ >= this.groupedEvents.size() - 1; - if (e.events.size() == 1) - sendEvent(e.events.get(0), flush); - else - sendEvent(e, flush); - } - groupedEvents.clear(); - } - - public void reply() + public synchronized void sendEventAndClose(INetworkEvent e) { - synchronized (this.events) - { - INetworkEvent prev = null; - for (INetworkEvent e : this.events) - { - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); - else - { - if (prev != null) - this.stackEvent(prev); - - prev = e; - } - } - - long time = System.currentTimeMillis() * Game.networkRate / 1000; - if (time != lastStackedEventSend) - { - lastStackedEventSend = time; - - if (prev != null) - this.stackEvent(prev); - - for (IStackableEvent e : this.stackedEvents.values()) - this.stackEvent(e); - - this.stackedEvents.clear(); - } - else if (prev != null) - this.stackEvent(prev); + this.closed = true; + if (steamID != null) + Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); + else + this.sendEvent(e); - if (steamID == null) - flushEvents(); + if (ctx != null) + ctx.close(); - this.events.clear(); - } + if (steamID != null) + Game.steamNetworkHandler.queueClose(steamID.getAccountID()); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); + ctx.close(); } } diff --git a/src/main/java/tanks/network/ServerHandler.java b/src/main/java/tanks/network/ServerHandler.java index b21ac013a..453d73156 100644 --- a/src/main/java/tanks/network/ServerHandler.java +++ b/src/main/java/tanks/network/ServerHandler.java @@ -131,7 +131,7 @@ public void reply() { pingReceived = false; lastPingSent = System.currentTimeMillis(); - this.stackEvent(new EventPing(false)); + this.sendEvent(new EventPing(false)); } } } diff --git a/src/main/java/tanks/network/event/EventStackedGroup.java b/src/main/java/tanks/network/event/EventStackedGroup.java deleted file mode 100644 index ffe32cd9a..000000000 --- a/src/main/java/tanks/network/event/EventStackedGroup.java +++ /dev/null @@ -1,54 +0,0 @@ -package tanks.network.event; - -import io.netty.buffer.ByteBuf; -import tanks.network.NetworkEventMap; - -import java.util.ArrayList; - -public class EventStackedGroup extends PersonalEvent -{ - public Class eventCls; - public ArrayList events = new ArrayList<>(); - - public EventStackedGroup() {} - public EventStackedGroup(Class c) - { - this.eventCls = c; - } - - @Override - public void write(ByteBuf b) - { - b.writeInt(NetworkEventMap.get(this.eventCls)); - b.writeInt(this.events.size()); - for (INetworkEvent e : this.events) - e.write(b); - } - - @Override - public void read(ByteBuf b) - { - this.eventCls = NetworkEventMap.get(b.readInt()); - int size = b.readInt(); - for (int i = 0; i < size; i++) - { - try - { - INetworkEvent e = this.eventCls.getConstructor().newInstance(); - e.read(b); - this.events.add(e); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - } - - @Override - public void execute() - { - for (INetworkEvent e : this.events) - e.execute(); - } -} diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index d14b1d4a8..b047e490d 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -15,12 +15,22 @@ public interface INetworkEvent extends IEvent .registerTypeHandle(int.class, Integer.class, ByteBuf::readInt, ByteBuf::writeInt) .registerTypeHandle(long.class, Long.class, ByteBuf::readLong, ByteBuf::writeLong) .registerTypeHandle(float.class, Float.class, ByteBuf::readFloat, ByteBuf::writeFloat) - .registerTypeHandle(double.class, Double.class, ByteBuf::readDouble, ByteBuf::writeDouble) + .registerTypeHandle(double.class, Double.class, INetworkEvent::readDouble, INetworkEvent::writeDouble) .registerTypeHandle(boolean.class, Boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean) .registerTypeHandle(String.class, NetworkUtils::readString, NetworkUtils::writeString) .registerTypeHandle(Color.class, NetworkUtils::readColor, NetworkUtils::writeColor) .registerTypeHandle(UUID.class, NetworkUtils::readUUID, NetworkUtils::writeUUID); + static double readDouble(ByteBuf b) + { + return b.readFloat(); + } + + static void writeDouble(ByteBuf b, double d) + { + b.writeFloat((float) d); + } + default void write(ByteBuf b) { From c60e6048a94ddd053075c610b2fedca99699745a Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 22:43:03 -0700 Subject: [PATCH 10/35] feat: more network validation checks Signed-off-by: orangishcat --- .../java/tanks/network/NetworkEventMap.java | 16 ++++++++-- .../network/event/EventBulletStunEffect.java | 7 ++--- .../tanks/network/event/EventTankUpdate.java | 9 ++---- .../tanks/network/event/INetworkEvent.java | 1 - .../java/tanks/tankson/ReflectionHandle.java | 31 ++++++++++++++++--- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/java/tanks/network/NetworkEventMap.java b/src/main/java/tanks/network/NetworkEventMap.java index 2397fab09..d049d6a59 100644 --- a/src/main/java/tanks/network/NetworkEventMap.java +++ b/src/main/java/tanks/network/NetworkEventMap.java @@ -3,6 +3,7 @@ import io.netty.buffer.*; import tanks.Game; import tanks.network.event.INetworkEvent; +import tanks.tankson.ReflectionHandle; import java.util.HashMap; @@ -38,11 +39,20 @@ public static void register(Class c) e = c.getConstructor().newInstance(); e.write(b); e.read(b); + if (b.readableBytes() > 0) + throw new IndexOutOfBoundsException("Readable bytes > 0 after read"); } - catch (Exception exc) + catch (ReflectionHandle.MissingHandleException exc) { - if (exc.getMessage().contains("Failed to find field handle")) // uses custom read/write methods - throw new RuntimeException(exc); + throw new RuntimeException("Missing handle in " + c.getSimpleName() + ": " + exc.getMessage()); + } + catch (IndexOutOfBoundsException exc) + { + throw new RuntimeException("Read does not match write in " + c.getSimpleName() + ": " + exc.getMessage()); + } + catch (Exception ignored) + { + } } diff --git a/src/main/java/tanks/network/event/EventBulletStunEffect.java b/src/main/java/tanks/network/event/EventBulletStunEffect.java index b556f5d78..0b4f0eb21 100644 --- a/src/main/java/tanks/network/event/EventBulletStunEffect.java +++ b/src/main/java/tanks/network/event/EventBulletStunEffect.java @@ -1,13 +1,11 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.tank.Tank; public class EventBulletStunEffect extends PersonalEvent { - int tank; + public int tank; public double length; public EventBulletStunEffect() @@ -34,7 +32,6 @@ public void execute() { Effect e = Effect.createNewEffect(t.posX, t.posY, Game.tile_size / 4, Effect.EffectType.stun); e.linkedMovable = t; - double var = 50; e.setColor(0, 255, 255); e.setGlowColor(e.color, 127); e.maxAge *= length; diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 2f4641cfe..f3d9570e3 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -5,12 +5,9 @@ public class EventTankUpdate extends PersonalEvent implements IStackableEvent { public int tank; - public double posX; - public double posY; - public double vX; - public double vY; - public double angle; - public double pitch; + public double posX, posY; + public double vX, vY; + public double angle, pitch; public long time = System.currentTimeMillis(); diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index b047e490d..cd3deb095 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -31,7 +31,6 @@ static void writeDouble(ByteBuf b, double d) b.writeFloat((float) d); } - default void write(ByteBuf b) { handle.writeObject(b, this); diff --git a/src/main/java/tanks/tankson/ReflectionHandle.java b/src/main/java/tanks/tankson/ReflectionHandle.java index 10d16ee72..38e7dad34 100644 --- a/src/main/java/tanks/tankson/ReflectionHandle.java +++ b/src/main/java/tanks/tankson/ReflectionHandle.java @@ -19,6 +19,8 @@ public class ReflectionHandle public Function fieldFilter = f -> true; + public boolean superclassFields = false; + public void readObject(S stream, Object object) { for (FieldHandle f : getFieldsInClass(object.getClass())) @@ -34,7 +36,11 @@ public void writeObject(S stream, Object object) @SuppressWarnings("unchecked") public TypeHandle getTypeHandle(Class type) { - return (TypeHandle) Objects.requireNonNull(typeHandles.get(type), "Failed to find type handle" + + TypeHandle h = (TypeHandle) typeHandles.get(type); + if (h != null) + return h; + + throw new MissingHandleException("Failed to find type handle" + " for " + type + ". Either register a type handle for it, or modify the fieldFilter to skip" + " registering the field."); } @@ -55,11 +61,17 @@ public List getFieldsInClass(Class c) return fieldsInClass.computeIfAbsent(c, k -> { List fields = new ArrayList<>(); - for (Field f : c.getFields()) + Class clazz = c; + + do { - if (shouldCheckField(f)) - fields.add(new FieldHandle(f)); - } + for (Field f : clazz.getDeclaredFields()) + { + if (shouldCheckField(f)) + fields.add(new FieldHandle(f)); + } + clazz = clazz.getSuperclass(); + } while (superclassFields && clazz != null && clazz != Object.class); return fields; }); } @@ -84,6 +96,7 @@ public FieldHandle(Field field) { try { + field.setAccessible(true); this.read = lookup.unreflectGetter(field); this.write = lookup.unreflectSetter(field); @@ -144,4 +157,12 @@ public void write(I stream, Object object) write.accept(stream, (T) object); } } + + public static class MissingHandleException extends RuntimeException + { + public MissingHandleException(String message) + { + super(message); + } + } } From ddda007ff67adffc71be6b691c2bf431e74786ab Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 22:55:41 -0700 Subject: [PATCH 11/35] fix: interpolation bug Signed-off-by: orangishcat --- src/main/java/tanks/network/event/EventTankUpdate.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index f3d9570e3..1443d4589 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -8,6 +8,8 @@ public class EventTankUpdate extends PersonalEvent implements IStackableEvent public double posX, posY; public double vX, vY; public double angle, pitch; + + @NetworkIgnored public long time = System.currentTimeMillis(); From 096f35ea09b79206f14cf1dfa2af79d1d84820fc Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 9 Sep 2025 23:09:34 -0700 Subject: [PATCH 12/35] fix: more interpolation bugs Signed-off-by: orangishcat --- src/main/java/tanks/network/event/EventTankUpdate.java | 9 +++++---- src/main/java/tanks/tank/TankRemote.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 1443d4589..b63907dcf 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -39,10 +39,11 @@ public void execute() if (t instanceof TankRemote) { TankRemote r = (TankRemote) t; + boolean firstFrame = r.lastUpdate == -1; double iTime = Math.min(100, (time - r.lastUpdate) / 10.0); - r.prevKnownPosX = r.posX; - r.prevKnownPosY = r.posY; + r.prevKnownPosX = firstFrame ? this.posX : r.posX; + r.prevKnownPosY = firstFrame ? this.posY : r.posY; r.prevKnownVX = r.vX; r.prevKnownVY = r.vY; r.prevKnownVXFinal = r.lastFinalVX; @@ -57,8 +58,8 @@ public void execute() r.interpolationTime = iTime; r.lastUpdate = time; - r.lastAngle = r.angle; - r.lastPitch = r.pitch; + r.lastAngle = firstFrame ? this.angle : r.angle; + r.lastPitch = firstFrame ? this.pitch : r.pitch; r.currentAngle = this.angle; r.currentPitch = this.pitch; } diff --git a/src/main/java/tanks/tank/TankRemote.java b/src/main/java/tanks/tank/TankRemote.java index c926ccf69..2b6e5f0eb 100644 --- a/src/main/java/tanks/tank/TankRemote.java +++ b/src/main/java/tanks/tank/TankRemote.java @@ -41,7 +41,7 @@ public class TankRemote extends Tank public double currentAngle; public double currentPitch; - public double timeSinceRefresh = 0; + public double timeSinceRefresh = 1; public ArrayList parentTransformations = new ArrayList<>(); From c1082d49b341fafdd3ecba18dd0779d2a251e206 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Wed, 10 Sep 2025 17:16:09 -0700 Subject: [PATCH 13/35] fix: explosion bug Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 5 +- .../java/tanks/network/MessageReader.java | 4 +- .../network/event/EventObstacleDestroy.java | 112 +++++++++--------- .../tanks/network/event/EventTankUpdate.java | 2 +- 4 files changed, 61 insertions(+), 62 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 6fbd99229..aa158753e 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -143,7 +143,7 @@ public int hashCode() //Versioning has moved to version.txt public static String version = "Tanks v-1.-1.-1"; - public static final int network_protocol = 59; + public static final int network_protocol = 60; public static boolean debug = false; public static boolean traceAllRays = false; public static boolean showNetworkIDs = false; @@ -234,7 +234,6 @@ public int hashCode() public static boolean fancyTerrain = true; public static boolean effectsEnabled = true; public static boolean bulletTrails = true; - public static boolean fancyBulletTrails = true; public static boolean glowEnabled = true; public static double effectMultiplier = 1; @@ -380,6 +379,7 @@ public static void registerEvents() NetworkEventMap.register(EventUpdateEliminatedPlayers.class); NetworkEventMap.register(EventUpdateRemainingLives.class); NetworkEventMap.register(EventBeginLevelCountdown.class); + NetworkEventMap.register(EventNudge.class); NetworkEventMap.register(EventTankUpdate.class); NetworkEventMap.register(EventTankControllerUpdateS.class); NetworkEventMap.register(EventTankControllerUpdateC.class); @@ -1095,6 +1095,7 @@ public static Obstacle getObstacle(double posX, double posY) { return getObstacle((int) (posX / Game.tile_size), (int) (posY / Game.tile_size)); } + public static void removeObstacle(Obstacle o) { Drawing.drawing.terrainRenderer.remove(o); diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index 5dd538c8a..a57c8e6ab 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -168,9 +168,7 @@ public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf } if (e instanceof PersonalEvent) - { - ((PersonalEvent) e).clientID = clientID; - } + ((PersonalEvent) e).clientID = clientID; if (e instanceof IOnlineServerEvent) s.sendEventAndClose(new EventKick("This is a party, please join parties through the party menu")); diff --git a/src/main/java/tanks/network/event/EventObstacleDestroy.java b/src/main/java/tanks/network/event/EventObstacleDestroy.java index 412277106..f22c9a75b 100644 --- a/src/main/java/tanks/network/event/EventObstacleDestroy.java +++ b/src/main/java/tanks/network/event/EventObstacleDestroy.java @@ -1,56 +1,56 @@ -package tanks.network.event; - -import tanks.Game; -import tanks.obstacle.Obstacle; - -public class EventObstacleDestroy extends PersonalEvent -{ - public double posX; - public double posY; - - public boolean effect; - public double effectX; - public double effectY; - public double radius; - public String name; - - public EventObstacleDestroy() - { - - } - - public EventObstacleDestroy(double x, double y, String name) - { - this.posX = x; - this.posY = y; - this.effect = false; - this.name = name; - } - - public EventObstacleDestroy(double x, double y, String name, double ex, double ey, double rad) - { - this.posX = x; - this.posY = y; - this.effect = true; - this.effectX = ex; - this.effectY = ey; - this.radius = rad; - this.name = name; - } - @Override - public void execute() - { - if (this.clientID != null) - return; - - Obstacle o = Game.getObstacle(posX, posY); - - if (o.posX != this.posX || o.posY != this.posY || !o.name.equals(name)) - return; - - if (effect) - o.playDestroyAnimation(this.effectX, this.effectY, this.radius); - - Game.removeObstacles.add(o); - } -} +package tanks.network.event; + +import tanks.Game; +import tanks.obstacle.Obstacle; + +public class EventObstacleDestroy extends PersonalEvent +{ + public double posX; + public double posY; + + public boolean effect; + public double effectX; + public double effectY; + public double radius; + public String name; + + public EventObstacleDestroy() + { + + } + + public EventObstacleDestroy(double x, double y, String name) + { + this.posX = x; + this.posY = y; + this.effect = false; + this.name = name; + } + + public EventObstacleDestroy(double x, double y, String name, double ex, double ey, double rad) + { + this.posX = x; + this.posY = y; + this.effect = true; + this.effectX = ex; + this.effectY = ey; + this.radius = rad; + this.name = name; + } + @Override + public void execute() + { + if (this.clientID != null) + return; + + Obstacle o = Game.getObstacle(posX, posY); + + if (o == null || !o.name.equals(name)) + return; + + if (effect) + o.playDestroyAnimation(this.effectX, this.effectY, this.radius); + + Game.removeObstacles.add(o); + } +} diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index b63907dcf..6abfb3cd6 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -40,7 +40,7 @@ public void execute() { TankRemote r = (TankRemote) t; boolean firstFrame = r.lastUpdate == -1; - double iTime = Math.min(100, (time - r.lastUpdate) / 10.0); + double iTime = Math.min(100, Math.max(0, time - r.lastUpdate) / 10.0); r.prevKnownPosX = firstFrame ? this.posX : r.posX; r.prevKnownPosY = firstFrame ? this.posY : r.posY; From 8073cbc5bfbb0159caf2383e0174299d2e967194 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Wed, 10 Sep 2025 18:40:44 -0700 Subject: [PATCH 14/35] fix: partial angle interpolation fix Signed-off-by: orangishcat --- src/main/java/tanks/network/event/EventTankUpdate.java | 9 ++++----- src/main/java/tanks/tank/TankPlayerRemote.java | 2 ++ src/main/java/tanks/tank/TankRemote.java | 2 ++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 6abfb3cd6..21fc36b31 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -39,11 +39,10 @@ public void execute() if (t instanceof TankRemote) { TankRemote r = (TankRemote) t; - boolean firstFrame = r.lastUpdate == -1; double iTime = Math.min(100, Math.max(0, time - r.lastUpdate) / 10.0); - r.prevKnownPosX = firstFrame ? this.posX : r.posX; - r.prevKnownPosY = firstFrame ? this.posY : r.posY; + r.prevKnownPosX = r.posX; + r.prevKnownPosY = r.posY; r.prevKnownVX = r.vX; r.prevKnownVY = r.vY; r.prevKnownVXFinal = r.lastFinalVX; @@ -58,8 +57,8 @@ public void execute() r.interpolationTime = iTime; r.lastUpdate = time; - r.lastAngle = firstFrame ? this.angle : r.angle; - r.lastPitch = firstFrame ? this.pitch : r.pitch; + r.lastAngle = r.angle; + r.lastPitch = r.pitch; r.currentAngle = this.angle; r.currentPitch = this.pitch; } diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index 842d94e71..bb237fa36 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -111,6 +111,8 @@ public void updateMovement() this.currentKnownPosY = this.posY; this.prevKnownPosX = this.posX; this.prevKnownPosY = this.posY; + this.lastAngle = this.angle; + this.lastPitch = this.pitch; } this.timeSinceRefresh += Panel.frameFrequency; diff --git a/src/main/java/tanks/tank/TankRemote.java b/src/main/java/tanks/tank/TankRemote.java index 2b6e5f0eb..17c60df92 100644 --- a/src/main/java/tanks/tank/TankRemote.java +++ b/src/main/java/tanks/tank/TankRemote.java @@ -135,6 +135,8 @@ public void update() this.currentKnownPosY = this.posY; this.prevKnownPosX = this.posX; this.prevKnownPosY = this.posY; + this.lastAngle = this.angle; + this.lastPitch = this.pitch; } this.timeSinceRefresh += Panel.frameFrequency; From db1605a5792c59a139b382667adac66d13d11649 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Thu, 11 Sep 2025 20:25:09 -0700 Subject: [PATCH 15/35] fix: duplicate obstacle destroy events from explosion Signed-off-by: orangishcat --- src/main/java/tanks/Chunk.java | 26 ++++--- .../tanks/network/event/EventExplosion.java | 1 - .../network/event/EventObstacleDestroy.java | 3 +- .../event/EventTankControllerUpdateS.java | 73 ++++++++++--------- .../tanks/network/event/PersonalEvent.java | 2 + src/main/java/tanks/obstacle/Obstacle.java | 4 +- .../tanks/obstacle/ObstacleExplosive.java | 11 ++- src/main/java/tanks/tank/Explosion.java | 1 - .../java/tanks/tankson/ReflectionHandle.java | 2 +- 9 files changed, 69 insertions(+), 54 deletions(-) diff --git a/src/main/java/tanks/Chunk.java b/src/main/java/tanks/Chunk.java index 13252cc1a..f25c578ec 100644 --- a/src/main/java/tanks/Chunk.java +++ b/src/main/java/tanks/Chunk.java @@ -320,7 +320,21 @@ public static K getIfPresent(int tileX, int tileY, K fallback, Function getChunksInRadius(double x1, double y1, double radius) { - return getChunksInRadius((int) (x1 / Game.tile_size), (int) (y1 / Game.tile_size), radius / Game.tile_size); + chunkCache.clear(); + for (Chunk chunk : chunkList) + { + double distX = Math.abs(Chunk.chunkToGame(chunk.chunkX) - x1); + double distY = Math.abs(Chunk.chunkToGame(chunk.chunkY) - y1); + double size = Chunk.chunkToGame(Chunk.chunkSize); + + boolean inRange = distX <= size / 2 + radius && distY <= size / 2 + radius; + boolean closeEnough = distX <= size / 2 && distY <= size / 2; + boolean cornerInRange = Math.pow(distX - size, 2) + Math.pow(distY - size, 2) <= Math.pow(radius, 2); + + if (inRange && (closeEnough || cornerInRange)) + chunkCache.add(chunk); + } + return chunkCache; } /** @@ -328,15 +342,7 @@ public static ObjectArrayList getChunksInRadius(double x1, double y1, dou */ public static ObjectArrayList getChunksInRadius(int tx1, int ty1, double radius) { - chunkCache.clear(); - double x1 = (double) tx1 / chunkSize, y1 = (double) ty1 / chunkSize, cRad = Math.ceil(radius / chunkSize) + 1; - for (Chunk chunk : chunkList) - { - if ((chunk.chunkX - x1) * (chunk.chunkX - x1) + - (chunk.chunkY - y1) * (chunk.chunkY - y1) <= cRad * cRad) - chunkCache.add(chunk); - } - return chunkCache; + return getChunksInRadius((tx1 + 0.5) * Game.tile_size, (ty1 + 0.5) * Game.tile_size, radius); } public static Tile setTileColor(Level l, Random r, Tile t) diff --git a/src/main/java/tanks/network/event/EventExplosion.java b/src/main/java/tanks/network/event/EventExplosion.java index a8c5998a3..4209c7e5b 100644 --- a/src/main/java/tanks/network/event/EventExplosion.java +++ b/src/main/java/tanks/network/event/EventExplosion.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.tank.Explosion; import tanks.tank.TankAIControlled; diff --git a/src/main/java/tanks/network/event/EventObstacleDestroy.java b/src/main/java/tanks/network/event/EventObstacleDestroy.java index f22c9a75b..dff319e9c 100644 --- a/src/main/java/tanks/network/event/EventObstacleDestroy.java +++ b/src/main/java/tanks/network/event/EventObstacleDestroy.java @@ -37,6 +37,7 @@ public EventObstacleDestroy(double x, double y, String name, double ex, double e this.radius = rad; this.name = name; } + @Override public void execute() { @@ -51,6 +52,6 @@ public void execute() if (effect) o.playDestroyAnimation(this.effectX, this.effectY, this.radius); - Game.removeObstacles.add(o); + o.onDestroy(null); } } diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index 7274530f7..b972a2554 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -25,49 +25,50 @@ public void execute() { Tank t = Tank.idMap.get(this.tank); - if (this.clientID == null && (t instanceof TankRemote || (t instanceof TankPlayerController && (this.forced || !Game.clientID.equals(((TankPlayerController) t).clientID))))) + if (this.clientID != null || !(t instanceof TankRemote || t instanceof TankPlayerController) + || (!this.forced && Game.clientID.equals(((TankPlayerController) t).clientID))) + return; + + if (t instanceof TankPlayerController && Game.clientID.equals(((TankPlayerController) t).clientID)) { - if (t instanceof TankPlayerController && Game.clientID.equals(((TankPlayerController) t).clientID)) - { - TankPlayerController p = (TankPlayerController) t; - p.interpolatedOffX = this.posX - (t.posX - p.interpolatedOffX * (TankPlayerController.interpolationTime - p.interpolatedProgress) / TankPlayerController.interpolationTime); - p.interpolatedOffY = this.posY - (t.posY - p.interpolatedOffY * (TankPlayerController.interpolationTime - p.interpolatedProgress) / TankPlayerController.interpolationTime); - p.interpolatedProgress = 0; - } + TankPlayerController p = (TankPlayerController) t; + p.interpolatedOffX = this.posX - (t.posX - p.interpolatedOffX * (TankPlayerController.interpolationTime - p.interpolatedProgress) / TankPlayerController.interpolationTime); + p.interpolatedOffY = this.posY - (t.posY - p.interpolatedOffY * (TankPlayerController.interpolationTime - p.interpolatedProgress) / TankPlayerController.interpolationTime); + p.interpolatedProgress = 0; + } - if (t instanceof TankRemote) - { - TankRemote r = (TankRemote) t; - double iTime = Math.min(100, (time - r.lastUpdate) / 10.0); + if (t instanceof TankRemote) + { + TankRemote r = (TankRemote) t; + double iTime = Math.min(100, (time - r.lastUpdate) / 10.0); - r.prevKnownPosX = r.posX; - r.prevKnownPosY = r.posY; - r.prevKnownVX = r.vX; - r.prevKnownVY = r.vY; - r.prevKnownVXFinal = r.lastFinalVX; - r.prevKnownVYFinal = r.lastFinalVY; + r.prevKnownPosX = r.posX; + r.prevKnownPosY = r.posY; + r.prevKnownVX = r.vX; + r.prevKnownVY = r.vY; + r.prevKnownVXFinal = r.lastFinalVX; + r.prevKnownVYFinal = r.lastFinalVY; - r.currentKnownPosX = this.posX; - r.currentKnownPosY = this.posY; - r.currentKnownVX = this.vX; - r.currentKnownVY = this.vY; + r.currentKnownPosX = this.posX; + r.currentKnownPosY = this.posY; + r.currentKnownVX = this.vX; + r.currentKnownVY = this.vY; - r.timeSinceRefresh = 0; - r.interpolationTime = iTime; - r.lastUpdate = time; + r.timeSinceRefresh = 0; + r.interpolationTime = iTime; + r.lastUpdate = time; - r.lastAngle = r.angle; - r.lastPitch = r.pitch; - r.currentAngle = this.angle; - r.currentPitch = this.pitch; - } + r.lastAngle = r.angle; + r.lastPitch = r.pitch; + r.currentAngle = this.angle; + r.currentPitch = this.pitch; + } - t.posX = this.posX; - t.posY = this.posY; - t.vX = this.vX; - t.vY = this.vY; + t.posX = this.posX; + t.posY = this.posY; + t.vX = this.vX; + t.vY = this.vY; - t.angle = this.angle; - } + t.angle = this.angle; } } diff --git a/src/main/java/tanks/network/event/PersonalEvent.java b/src/main/java/tanks/network/event/PersonalEvent.java index 48103611b..e91fbe84d 100644 --- a/src/main/java/tanks/network/event/PersonalEvent.java +++ b/src/main/java/tanks/network/event/PersonalEvent.java @@ -4,5 +4,7 @@ public abstract class PersonalEvent implements INetworkEvent { + /** Is set to null when client receives event from server, and to clientID when server receives event from client */ + @NetworkIgnored public UUID clientID; } diff --git a/src/main/java/tanks/obstacle/Obstacle.java b/src/main/java/tanks/obstacle/Obstacle.java index bb7f09978..30f39a233 100644 --- a/src/main/java/tanks/obstacle/Obstacle.java +++ b/src/main/java/tanks/obstacle/Obstacle.java @@ -3,8 +3,9 @@ import basewindow.*; import it.unimi.dsi.fastutil.objects.*; import tanks.*; +import tanks.network.event.EventObstacleDestroy; import tanks.rendering.ShaderObstacle; -import tanks.tank.IAvoidObject; +import tanks.tank.*; public abstract class Obstacle extends SolidGameObject implements IDrawableForInterface, IDrawableWithGlow, IBatchRenderableObject { @@ -343,6 +344,7 @@ public boolean bulletCollision() public void onDestroy(Movable source) { Game.removeObstacles.add(this); + Game.eventsOut.add(new EventObstacleDestroy(posX, posY, name, this.posX, this.posY, source instanceof Explosion ? ((Explosion) source).radius + Game.tile_size / 2 : 0)); } private static final ObjectArrayList obstaclesCache = new ObjectArrayList<>(); diff --git a/src/main/java/tanks/obstacle/ObstacleExplosive.java b/src/main/java/tanks/obstacle/ObstacleExplosive.java index fdb9c5b90..6dd8f28bc 100644 --- a/src/main/java/tanks/obstacle/ObstacleExplosive.java +++ b/src/main/java/tanks/obstacle/ObstacleExplosive.java @@ -72,11 +72,16 @@ public void onObjectEntry(Movable m) @Override public void onDestroy(Movable m) { + if (ScreenPartyLobby.isClient) + { + Game.removeObstacles.add(this); + return; + } + if (this.trigger != Game.dummyTank) return; - if (!ScreenPartyLobby.isClient) - this.setUpdate(true); + this.setUpdate(true); if (m instanceof Explosion) { @@ -106,8 +111,8 @@ public void explode() e.explode(); - Game.removeObstacles.add(this); Game.eventsOut.add(new EventObstacleDestroy(this.posX, this.posY, this.name)); + Game.removeObstacles.add(this); } @Override diff --git a/src/main/java/tanks/tank/Explosion.java b/src/main/java/tanks/tank/Explosion.java index 1cc351f12..c7cabb9a2 100644 --- a/src/main/java/tanks/tank/Explosion.java +++ b/src/main/java/tanks/tank/Explosion.java @@ -192,7 +192,6 @@ public void explode() if (!o.destructible) continue; o.onDestroy(this); o.playDestroyAnimation(this.posX, this.posY, this.radius); - Game.eventsOut.add(new EventObstacleDestroy(o.posX, o.posY, o.name, this.posX, this.posY, this.radius + Game.tile_size / 2)); } } diff --git a/src/main/java/tanks/tankson/ReflectionHandle.java b/src/main/java/tanks/tankson/ReflectionHandle.java index 38e7dad34..9a9efeda0 100644 --- a/src/main/java/tanks/tankson/ReflectionHandle.java +++ b/src/main/java/tanks/tankson/ReflectionHandle.java @@ -19,7 +19,7 @@ public class ReflectionHandle public Function fieldFilter = f -> true; - public boolean superclassFields = false; + public boolean superclassFields = true; public void readObject(S stream, Object object) { From 60b3738533a5e6b5e8ecfdf1d83ee9e3db0bc13c Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 18:47:14 -0700 Subject: [PATCH 16/35] refactor: extract duplicate code Signed-off-by: orangishcat --- .../event/EventTankControllerUpdateS.java | 30 ++----------------- .../tanks/network/event/EventTankUpdate.java | 27 +---------------- src/main/java/tanks/tank/TankRemote.java | 27 +++++++++++++++++ 3 files changed, 31 insertions(+), 53 deletions(-) diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index b972a2554..592c4fb16 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -25,8 +25,8 @@ public void execute() { Tank t = Tank.idMap.get(this.tank); - if (this.clientID != null || !(t instanceof TankRemote || t instanceof TankPlayerController) - || (!this.forced && Game.clientID.equals(((TankPlayerController) t).clientID))) + if (this.clientID != null || (!(t instanceof TankRemote) && + (!(t instanceof TankPlayerController) || (!this.forced && Game.clientID.equals(((TankPlayerController) t).clientID))))) return; if (t instanceof TankPlayerController && Game.clientID.equals(((TankPlayerController) t).clientID)) @@ -38,31 +38,7 @@ public void execute() } if (t instanceof TankRemote) - { - TankRemote r = (TankRemote) t; - double iTime = Math.min(100, (time - r.lastUpdate) / 10.0); - - r.prevKnownPosX = r.posX; - r.prevKnownPosY = r.posY; - r.prevKnownVX = r.vX; - r.prevKnownVY = r.vY; - r.prevKnownVXFinal = r.lastFinalVX; - r.prevKnownVYFinal = r.lastFinalVY; - - r.currentKnownPosX = this.posX; - r.currentKnownPosY = this.posY; - r.currentKnownVX = this.vX; - r.currentKnownVY = this.vY; - - r.timeSinceRefresh = 0; - r.interpolationTime = iTime; - r.lastUpdate = time; - - r.lastAngle = r.angle; - r.lastPitch = r.pitch; - r.currentAngle = this.angle; - r.currentPitch = this.pitch; - } + ((TankRemote) t).updatePositions(this.posX, this.posY, this.vX, this.vY, this.angle, this.pitch); t.posX = this.posX; t.posY = this.posY; diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 21fc36b31..110150375 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -9,9 +9,6 @@ public class EventTankUpdate extends PersonalEvent implements IStackableEvent public double vX, vY; public double angle, pitch; - @NetworkIgnored - public long time = System.currentTimeMillis(); - public EventTankUpdate() { @@ -38,29 +35,7 @@ public void execute() { if (t instanceof TankRemote) { - TankRemote r = (TankRemote) t; - double iTime = Math.min(100, Math.max(0, time - r.lastUpdate) / 10.0); - - r.prevKnownPosX = r.posX; - r.prevKnownPosY = r.posY; - r.prevKnownVX = r.vX; - r.prevKnownVY = r.vY; - r.prevKnownVXFinal = r.lastFinalVX; - r.prevKnownVYFinal = r.lastFinalVY; - - r.currentKnownPosX = this.posX; - r.currentKnownPosY = this.posY; - r.currentKnownVX = this.vX; - r.currentKnownVY = this.vY; - - r.timeSinceRefresh = 0; - r.interpolationTime = iTime; - r.lastUpdate = time; - - r.lastAngle = r.angle; - r.lastPitch = r.pitch; - r.currentAngle = this.angle; - r.currentPitch = this.pitch; + ((TankRemote) t).updatePositions(this.posX, this.posY, this.vX, this.vY, this.angle, this.pitch); } else { diff --git a/src/main/java/tanks/tank/TankRemote.java b/src/main/java/tanks/tank/TankRemote.java index 17c60df92..aae6d68c6 100644 --- a/src/main/java/tanks/tank/TankRemote.java +++ b/src/main/java/tanks/tank/TankRemote.java @@ -241,6 +241,33 @@ public void draw() Drawing.drawing.drawInterfaceText(Drawing.drawing.toInterfaceCoordsX(prevKnownPosX), Drawing.drawing.toInterfaceCoordsY(prevKnownPosY), String.format("%d, %d, %.2f", (int) posX / 50, (int) posY / 50, timeSinceRefresh));*/ } + public void updatePositions(double x, double y, double vX, double vY, double angle, double pitch) + { + long time = System.currentTimeMillis(); + double iTime = Math.min(100, Math.max(0, time - this.lastUpdate) / 10.0); + + this.prevKnownPosX = this.posX; + this.prevKnownPosY = this.posY; + this.prevKnownVX = this.vX; + this.prevKnownVY = this.vY; + this.prevKnownVXFinal = this.lastFinalVX; + this.prevKnownVYFinal = this.lastFinalVY; + + this.currentKnownPosX = x; + this.currentKnownPosY = y; + this.currentKnownVX = vX; + this.currentKnownVY = vY; + + this.timeSinceRefresh = 0; + this.interpolationTime = iTime; + this.lastUpdate = time; + + this.lastAngle = this.angle; + this.lastPitch = this.pitch; + this.currentAngle = angle; + this.currentPitch = pitch; + } + public static double cubicInterpolationVelocity(double startPos, double startVel, double endPos, double endVel, double curTime, double totalTime) { double targetPos = endPos + endVel * totalTime; From cf18fbb378f24ceeda5990fb9dd8e910c91a99c6 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 19:42:57 -0700 Subject: [PATCH 17/35] fix: preserve order by batching all events Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 3 -- src/main/java/tanks/Level.java | 3 +- src/main/java/tanks/Panel.java | 31 ++++++++----- src/main/java/tanks/bullet/Bullet.java | 20 +++----- src/main/java/tanks/bullet/BulletInstant.java | 1 - .../java/tanks/network/NetworkHandler.java | 46 +++++++------------ .../network/event/EventBulletDestroyed.java | 7 +-- .../tanks/network/event/EventMineRemove.java | 8 +--- .../tanks/network/event/EventShootBullet.java | 10 ++-- .../network/event/EventTankUpdateHealth.java | 10 +++- .../tanks/network/event/IStackableEvent.java | 7 +++ src/main/java/tanks/tank/Mine.java | 23 ++-------- src/main/java/tanks/tank/Tank.java | 17 ++----- .../java/tanks/tank/TankPlayerRemote.java | 38 ++++++++------- 14 files changed, 95 insertions(+), 129 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index aa158753e..f49c74cea 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -1325,15 +1325,12 @@ public static void resetNetworkIDs() { Tank.currentID = 0; Tank.idMap.clear(); - Tank.freeIDs.clear(); Bullet.currentID = 0; Bullet.idMap.clear(); - Bullet.freeIDs.clear(); Mine.currentID = 0; Mine.idMap.clear(); - Mine.freeIDs.clear(); } public static boolean loadLevel(BaseFile f) diff --git a/src/main/java/tanks/Level.java b/src/main/java/tanks/Level.java index 936be224f..812af3d65 100644 --- a/src/main/java/tanks/Level.java +++ b/src/main/java/tanks/Level.java @@ -504,7 +504,6 @@ else if (ScreenPartyLobby.isClient) Game.eventsOut.add(new EventLoadLevel(this)); Tank.currentID = 0; - Tank.freeIDs.clear(); ScreenGame.finishedQuick = false; @@ -760,7 +759,7 @@ else if (m.team == Game.enemyTeam) } s.teams = this.teamsList; - if (s.teams.size() > 0) + if (!s.teams.isEmpty()) { s.currentMetadata.put(SelectorTeam.player_selector_name, s.teams.get(0)); s.currentMetadata.put(SelectorTeam.selector_name, s.teams.get(Math.min(s.teams.size() - 1, 1))); diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 19447f495..a7cf4a61c 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -1,7 +1,7 @@ package tanks; import basewindow.InputCodes; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.*; import tanks.extension.Extension; import tanks.gui.*; import tanks.gui.ScreenElement.*; @@ -90,7 +90,7 @@ public class Panel protected Screen lastDrawnScreen = null; public ArrayList lights = new ArrayList<>(); - public Int2ObjectOpenHashMap stackedEventsIn = new Int2ObjectOpenHashMap<>(); + public Int2IntOpenHashMap stackedEventsIn = new Int2IntOpenHashMap(); public LoadingTerrainContinuation continuation = null; public long continuationStartTime = 0; @@ -344,21 +344,28 @@ else if (Game.deterministicMode) { stackedEventsIn.clear(); + // order of stacked and nonstacked events is preserved for (int i = 0; i < Game.eventsIn.size(); i++) { - if (!(Game.eventsIn.get(i) instanceof IOnlineServerEvent)) - { - INetworkEvent e = Game.eventsIn.get(i); + INetworkEvent e = Game.eventsIn.get(i); + if (e instanceof IOnlineServerEvent) + continue; - if (e instanceof IStackableEvent) - stackedEventsIn.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); - else - Game.eventsIn.get(i).execute(); - } - } + if (e instanceof IStackableEvent) + stackedEventsIn.put(IStackableEvent.key((IStackableEvent) e), i); + } + + for (int i = 0; i < Game.eventsIn.size(); i++) + { + INetworkEvent e = Game.eventsIn.get(i); + if (e instanceof IOnlineServerEvent) + continue; + + if (e instanceof IStackableEvent && stackedEventsIn.get(IStackableEvent.key((IStackableEvent) e)) != i) + continue; - for (INetworkEvent e: stackedEventsIn.values()) e.execute(); + } Game.eventsIn.clear(); } diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index f0b7e4908..8f512a022 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -1,6 +1,7 @@ package tanks.bullet; import basewindow.Color; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import tanks.*; import tanks.attribute.*; import tanks.gui.*; @@ -18,8 +19,7 @@ public class Bullet extends Movable implements ICopyable, ITanksONEditable { public static int currentID = 0; - public static ArrayList freeIDs = new ArrayList<>(); - public static HashMap idMap = new HashMap<>(); + public static Int2ObjectOpenHashMap idMap = new Int2ObjectOpenHashMap<>(); public static String bullet_class_name = "bullet"; @@ -270,14 +270,7 @@ public Bullet(double x, double y, Tank t, boolean affectsMaxLiveBullets, ItemBul if (!this.tank.isRemote) { - if (!freeIDs.isEmpty()) - this.networkID = freeIDs.remove(0); - else - { - this.networkID = currentID; - currentID++; - } - + this.networkID = currentID++; idMap.put(this.networkID, this); } @@ -1279,12 +1272,11 @@ else if (m1 instanceof Mine && this.mineCollision && !Team.isAllied(this, m1)) if (destroy) { - if (this.destroyTimer <= 0 && !freeIDs.contains(this.networkID)) + if (this.destroyTimer <= 0) { if (!this.tank.isRemote) Game.eventsOut.add(new EventBulletDestroyed(this)); - freeIDs.add(this.networkID); idMap.remove(this.networkID); if (this.affectsMaxLiveBullets && this.reboundSuccessor == null) @@ -1431,7 +1423,7 @@ public void stopTrails() { for (ArrayList trail : this.trails) { - if (trail.size() > 0) + if (!trail.isEmpty()) { Trail t = trail.get(0); if (t.spawning) @@ -1448,7 +1440,7 @@ protected void addTrailObj(int group, Trail t, boolean redirect) { Trail old = null; - if (this.trails[group].size() > 0) + if (!this.trails[group].isEmpty()) old = this.trails[group].get(0); this.trails[group].add(0, t); diff --git a/src/main/java/tanks/bullet/BulletInstant.java b/src/main/java/tanks/bullet/BulletInstant.java index d987ed62f..d829a3667 100644 --- a/src/main/java/tanks/bullet/BulletInstant.java +++ b/src/main/java/tanks/bullet/BulletInstant.java @@ -134,7 +134,6 @@ public void shoot() Game.eventsOut.add(new EventBulletDestroyed(this)); } - freeIDs.add(this.networkID); idMap.remove(this.networkID); if (this.affectsMaxLiveBullets && this.reboundSuccessor == null && !this.failedRebound) diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index 60bc262ba..d0b4b8769 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -4,7 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.*; import io.netty.util.ReferenceCountUtil; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.*; import tanks.*; import tanks.network.event.*; @@ -16,7 +16,7 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public SteamID steamID; protected SynchronizedList events = new SynchronizedList<>(); - protected Int2ObjectOpenHashMap stackedEvents = new Int2ObjectOpenHashMap<>(); + protected Int2IntOpenHashMap stackedEvents = new Int2IntOpenHashMap(); public boolean joined = false; public boolean closed = false; @@ -27,42 +27,28 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public void reply() { + long time = System.currentTimeMillis() * Game.networkRate / 1000; + if (time == lastStackedEventSend) + return; + + lastStackedEventSend = time; + synchronized (this.events) { - INetworkEvent prev = null; for (int i = 0; i < this.events.size(); i++) { INetworkEvent e = this.events.get(i); - - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - this.stackedEvents.put(IStackableEvent.f(NetworkEventMap.get(e.getClass()) + IStackableEvent.f(((IStackableEvent) e).getIdentifier())), (IStackableEvent) e); - else - { - if (prev != null) - this.sendEvent(prev,false); - - prev = e; - } + if (e instanceof IStackableEvent) + stackedEvents.put(IStackableEvent.key((IStackableEvent) e), i); } - - long time = System.currentTimeMillis() * Game.networkRate / 1000; - if (time != lastStackedEventSend) + for (int i = 0; i < this.events.size(); i++) { - lastStackedEventSend = time; - int size = this.stackedEvents.size(); - - if (prev != null) - this.sendEvent(prev, size == 0); - - for (IStackableEvent e: this.stackedEvents.values()) - { - size--; - this.sendEvent(e, size <= 0); - } - this.stackedEvents.clear(); + INetworkEvent e = this.events.get(i); + if (e instanceof IStackableEvent && stackedEvents.get(IStackableEvent.key((IStackableEvent) e)) != i) + continue; + + this.sendEvent(e, i == this.events.size() - 1); } - else if (prev != null) - this.sendEvent(prev, true); if (steamID == null) this.ctx.flush(); diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index d916b9c16..149b9ad67 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -41,11 +41,6 @@ public void execute() } b.destroy = true; - - if (!Bullet.freeIDs.contains(b.networkID)) - { - Bullet.freeIDs.add(b.networkID); - Bullet.idMap.remove(b.networkID); - } + Bullet.idMap.remove(b.networkID); } } diff --git a/src/main/java/tanks/network/event/EventMineRemove.java b/src/main/java/tanks/network/event/EventMineRemove.java index 53f3dfb95..3d518f622 100644 --- a/src/main/java/tanks/network/event/EventMineRemove.java +++ b/src/main/java/tanks/network/event/EventMineRemove.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.tank.Mine; @@ -30,11 +29,6 @@ public void execute() return; Game.removeMovables.add(m); - - if (!Mine.freeIDs.contains(m.networkID)) - { - Mine.freeIDs.add(m.networkID); - Mine.idMap.remove(m.networkID); - } + Mine.idMap.remove(m.networkID); } } diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index c621f9e9b..bdfdf11a2 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -5,7 +5,7 @@ import tanks.item.*; import tanks.tank.*; -public class EventShootBullet extends PersonalEvent +public class EventShootBullet extends PersonalEvent implements IStackableEvent { public int id; public int tank; @@ -87,9 +87,7 @@ else if (t2 instanceof TankPlayer) b.vZ = vZ; sb.item.bullet.clonePropertiesTo(b); - b.speed = speed; - b.setColorFromTank(); if (sb.item.cooldownBase <= 0) @@ -106,4 +104,10 @@ else if (t2 instanceof TankPlayer) e.printStackTrace(); } } + + @Override + public int getIdentifier() + { + return tank; + } } diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index 20e435102..6221d00ee 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -3,7 +3,7 @@ import tanks.*; import tanks.tank.Tank; -public class EventTankUpdateHealth extends PersonalEvent +public class EventTankUpdateHealth extends PersonalEvent implements IStackableEvent { public int tank; public double health; @@ -35,7 +35,7 @@ else if (health > t.health) double before = t.health; t.health = health; - if ((int) before != (int) t.health && t.health > 1) + if ((int) before != (int) t.health && t.health >= 1) { Effect e = Effect.createNewEffect(t.posX, t.posY, t.posZ + t.size * 0.75, Effect.EffectType.shield); e.size = t.size; @@ -49,4 +49,10 @@ else if (health > t.health) t.vY = 0; } } + + @Override + public int getIdentifier() + { + return tank; + } } diff --git a/src/main/java/tanks/network/event/IStackableEvent.java b/src/main/java/tanks/network/event/IStackableEvent.java index adb205f3c..65b87e558 100644 --- a/src/main/java/tanks/network/event/IStackableEvent.java +++ b/src/main/java/tanks/network/event/IStackableEvent.java @@ -1,5 +1,7 @@ package tanks.network.event; +import tanks.network.NetworkEventMap; + public interface IStackableEvent extends INetworkEvent { int getIdentifier(); @@ -9,6 +11,11 @@ default boolean isStackable() return true; } + static int key(IStackableEvent e) + { + return f(NetworkEventMap.get(e.getClass()) + f(e.getIdentifier())); + } + static int f(int i) { return 1664525 * i + 1013904223; diff --git a/src/main/java/tanks/tank/Mine.java b/src/main/java/tanks/tank/Mine.java index d9a835c55..d85e9c68a 100644 --- a/src/main/java/tanks/tank/Mine.java +++ b/src/main/java/tanks/tank/Mine.java @@ -1,18 +1,14 @@ package tanks.tank; import basewindow.Color; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import tanks.*; -import tanks.gui.IFixedMenu; -import tanks.gui.Scoreboard; +import tanks.gui.*; import tanks.gui.screen.ScreenPartyLobby; import tanks.item.ItemMine; -import tanks.network.event.EventMineChangeTimer; -import tanks.network.event.EventMineRemove; +import tanks.network.event.*; import tanks.tankson.*; -import java.util.ArrayList; -import java.util.HashMap; - @TanksONable("mine") public class Mine extends Movable implements IAvoidObject, ICopyable, ITanksONEditable { @@ -52,8 +48,7 @@ public class Mine extends Movable implements IAvoidObject, ICopyable, ITan public int networkID = -1; public static int currentID = 0; - public static ArrayList freeIDs = new ArrayList<>(); - public static HashMap idMap = new HashMap<>(); + public static Int2ObjectOpenHashMap idMap = new Int2ObjectOpenHashMap<>(); public double[] lightInfo = new double[]{0, 0, 0, 0, 0, 0, 0}; @@ -92,14 +87,7 @@ public Mine(double x, double y, double timer, Tank t, ItemMine.ItemStackMine ite if (!ScreenPartyLobby.isClient) { - if (freeIDs.size() > 0) - this.networkID = freeIDs.remove(0); - else - { - this.networkID = currentID; - currentID++; - } - + this.networkID = currentID++; idMap.put(this.networkID, this); } @@ -233,7 +221,6 @@ public void explode() if (!ScreenPartyLobby.isClient) { - freeIDs.add(this.networkID); idMap.remove(this.networkID); Explosion e = new Explosion(this); diff --git a/src/main/java/tanks/tank/Tank.java b/src/main/java/tanks/tank/Tank.java index 28d97c98c..26b9c30f5 100644 --- a/src/main/java/tanks/tank/Tank.java +++ b/src/main/java/tanks/tank/Tank.java @@ -1,6 +1,7 @@ package tanks.tank; import basewindow.*; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import tanks.*; import tanks.attribute.*; import tanks.bullet.Bullet; @@ -18,8 +19,7 @@ public abstract class Tank extends Movable implements ISolidObject { public static int currentID = 0; - public static ArrayList freeIDs = new ArrayList<>(); - public static HashMap idMap = new HashMap<>(); + public static Int2ObjectOpenHashMap idMap = new Int2ObjectOpenHashMap<>(); public static Model health_model; @@ -233,22 +233,11 @@ public void unregisterNetworkID() { if (idMap.get(this.networkID) == this) idMap.remove(this.networkID); - - if (!freeIDs.contains(this.networkID)) - { - freeIDs.add(this.networkID); - } } public static int nextFreeNetworkID() { - if (!freeIDs.isEmpty()) - return freeIDs.remove(0); - else - { - currentID++; - return currentID - 1; - } + return currentID++; } public void registerNetworkID() diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index bb237fa36..8a2ce6537 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -34,8 +34,9 @@ public class TankPlayerRemote extends TankPlayable implements IServerPlayerTank public long startUpdateTime = -1; public double ourTimeOffset = 0; - public boolean forceMotion = true; - public boolean recoil = false; + public boolean forceMotion = true, recoil = false; + public boolean action1, action2; + public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; public static boolean checkMotion = false; public static boolean weakTimeCheck = false; @@ -118,6 +119,20 @@ public void updateMovement() this.timeSinceRefresh += Panel.frameFrequency; this.localAge += Panel.frameFrequency; + if (!this.disabled) + { + if (this.action1) + this.action(false); + if (this.action2) + this.action(true); + + for (int i = 0; i < this.abilities.size(); i++) + { + if (quickActions[i]) + this.quickAction(i); + } + } + super.update(); if (this.destroy) @@ -239,7 +254,7 @@ public void refreshAmmo() ItemBar b = this.player.hotbar.itemBar; ItemBullet.ItemStackBullet ib = null; ItemMine.ItemStackMine im = null; - Item.ItemStack i2 = null; + Item.ItemStack i2; if (this.getPrimaryAbility() instanceof ItemBullet.ItemStackBullet) ib = (ItemBullet.ItemStackBullet) this.getPrimaryAbility(); @@ -460,20 +475,9 @@ else if (b instanceof BulletAirStrike) this.timeSinceRefresh = 0; this.lastUpdateTime = t; - if (action1 && !this.disabled) - this.action(false); - - if (action2 && !this.disabled) - this.action(true); - - if (!this.disabled) - { - for (int i = 0; i < this.abilities.size(); i++) - { - if (quickActions[i]) - this.quickAction(i); - } - } + this.action1 = action1; + this.action2 = action2; + this.quickActions = quickActions; this.posX = this.prevKnownPosX; this.posY = this.prevKnownPosY; From 8fc13e4289f4b2effa54b9d27ff578bfa1084c7a Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 22:22:03 -0700 Subject: [PATCH 18/35] fix,style: make more events stackable, optimize imports Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 1 + src/main/java/tanks/Panel.java | 14 +++++- .../java/tanks/gui/screen/ScreenDebug.java | 3 +- .../java/tanks/network/MessageReader.java | 43 +++++++++++-------- .../java/tanks/network/NetworkHandler.java | 12 +++--- .../network/event/EventAddColoredTile.java | 4 +- .../network/event/EventAddObstacleText.java | 2 - .../network/event/EventAddScoreboard.java | 3 +- .../event/EventAnnounceConnection.java | 2 - .../tanks/network/event/EventArcadeEnd.java | 1 - .../network/event/EventBeginCrusade.java | 1 - .../event/EventBeginLevelCountdown.java | 1 - .../network/event/EventBulletDestroyed.java | 17 +++++--- .../event/EventBulletInstantWaypoint.java | 19 +++++--- .../event/EventBulletUpdateTarget.java | 1 - .../event/EventChangeBackgroundColor.java | 6 +-- .../event/EventChangeScoreboardAttribute.java | 5 +-- .../network/event/EventConnectionSuccess.java | 1 - .../tanks/network/event/EventDisplayText.java | 6 +-- .../network/event/EventDisplayTextGroup.java | 3 +- .../tanks/network/event/EventEnterLevel.java | 4 +- .../tanks/network/event/EventExplosion.java | 3 +- .../tanks/network/event/EventLayMine.java | 5 +-- .../tanks/network/event/EventLevelExit.java | 6 +-- .../event/EventLevelFinishedQuick.java | 7 +-- .../network/event/EventLoadItemBarSlot.java | 2 - .../tanks/network/event/EventLoadLevel.java | 14 ++---- .../network/event/EventMineChangeTimer.java | 1 - .../tanks/network/event/EventMutePlayer.java | 4 -- .../java/tanks/network/event/EventNudge.java | 11 ++--- .../event/EventObstacleShrubberyBurn.java | 7 +-- .../network/event/EventPlayerAutoReady.java | 3 +- .../event/EventPlayerAutoReadyConfirm.java | 2 - .../tanks/network/event/EventPlayerChat.java | 2 - .../tanks/network/event/EventPlayerReady.java | 5 +-- .../network/event/EventPlayerRevealBuild.java | 13 +----- .../network/event/EventPlayerSetBuild.java | 13 ++---- .../network/event/EventPurchaseNPCItem.java | 8 +--- .../network/event/EventReturnToCrusade.java | 6 +-- .../network/event/EventReturnToLobby.java | 1 - .../event/EventScoreboardUpdateScore.java | 5 +-- .../tanks/network/event/EventSetItem.java | 10 +---- .../network/event/EventShareCrusade.java | 10 +---- .../tanks/network/event/EventShareLevel.java | 10 +---- .../network/event/EventStatusEffectBegin.java | 2 - .../event/EventStatusEffectDeteriorate.java | 2 - .../event/EventTankAddAttributeModifier.java | 14 ++++-- .../EventTankControllerUpdateAmmunition.java | 2 - .../event/EventTankControllerUpdateS.java | 4 +- .../network/event/EventTankCustomCreate.java | 8 +--- .../event/EventTankMimicTransform.java | 4 +- .../tanks/network/event/EventTankRemove.java | 1 - .../tanks/network/event/EventTankSpawn.java | 9 +--- .../network/event/EventTankTeleport.java | 7 +-- .../event/EventTankTransformPreset.java | 8 +--- .../network/event/EventTankUpdateColor.java | 2 - .../event/EventTankUpdateVisibility.java | 4 +- .../event/EventUpdateRemainingLives.java | 5 +-- .../network/event/EventUpdateTankAbility.java | 5 +-- .../network/event/EventUpdateTankColors.java | 2 - .../tanks/network/event/INetworkEvent.java | 2 +- .../network/event/online/EventAddButton.java | 6 +-- .../event/online/EventAddMenuButton.java | 6 +-- .../network/event/online/EventAddShape.java | 3 +- .../network/event/online/EventAddText.java | 3 +- .../network/event/online/EventAddTextBox.java | 6 +-- .../event/online/EventAddUUIDTextBox.java | 6 +-- .../online/EventSendLevelToDownload.java | 3 +- .../online/EventSendOnlineClientDetails.java | 11 ++--- .../online/EventSetPauseScreenTitle.java | 3 +- .../event/online/EventSilentDisconnect.java | 3 +- .../event/online/EventUploadLevel.java | 7 +-- 72 files changed, 150 insertions(+), 285 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index f49c74cea..604aa504c 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -151,6 +151,7 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; + public static boolean recordEventData = true; //todo change back to false public static final boolean cinematic = false; public static long steamLobbyInvite = -1; diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index a7cf4a61c..46a8701a4 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -15,7 +15,8 @@ import tanks.rendering.*; import tanks.tank.*; -import java.util.ArrayList; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public class Panel { @@ -834,6 +835,17 @@ public void draw() ((TankNPC) m).drawMessage(); } + if (Game.recordEventData) + { + AtomicInteger i = new AtomicInteger(); + Drawing.drawing.setColor(255, 255, 255); + Drawing.drawing.setInterfaceFontSize(16); + double y = Drawing.drawing.getInterfaceEdgeY(true) - 20; + + MessageReader.eventBytesPerSec.int2IntEntrySet().stream().sorted(Comparator.comparingInt(Int2IntMap.Entry::getIntValue)).forEach(entry -> + Drawing.drawing.displayUncenteredInterfaceText(10, y - i.getAndIncrement() * 20, "%s: %.2f KB/s", NetworkEventMap.get(entry.getIntKey()).getSimpleName(), entry.getIntValue() / 1024.)); + } + ScreenOverlayChat.draw(!(Game.screen instanceof IHiddenChatboxScreen)); if (!(Game.screen instanceof ScreenExit || Game.screen instanceof ScreenIntro)) diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index 7d76ff8c2..f44d62ba2 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -28,13 +28,14 @@ public class ScreenDebug extends Screen Button drawAvoidObjects = createToggle("Draw avoid objects: ", b -> Game.drawAvoidObjects = b, () -> Game.drawAvoidObjects); Button disableFixes = createToggle("Disable fixes: ", b -> Game.disableErrorFixing = b, () -> Game.disableErrorFixing); Button recordMovableData = createToggle("Record movable data: ", b -> Game.recordMovableData = b, () -> Game.recordMovableData); + Button recordEventData = createToggle("Record event data: ", b -> Game.recordEventData = b, () -> Game.recordEventData); Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 5, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, recordEventData )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index a57c8e6ab..b6d70d3d4 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -1,9 +1,9 @@ package tanks.network; import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import tanks.Game; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.event.*; import tanks.network.event.online.IOnlineServerEvent; @@ -13,13 +13,11 @@ public class MessageReader { public static final int max_event_size = 104857600; - public static int downstreamBytes; - public static int upstreamBytes; + public static int downstreamBytes, upstreamBytes; + public static int upstreamBytesPerSec, downstreamBytesPerSec; + public static Int2IntOpenHashMap eventBytes = new Int2IntOpenHashMap(), eventBytesPerSec = new Int2IntOpenHashMap(); public static long lastMessageTime; - public static int upstreamBytesPerSec; - public static int downstreamBytesPerSec; - public boolean useQueue = true; public ByteBuf queue; protected boolean reading = false; @@ -81,7 +79,7 @@ else if (ScreenPartyLobby.isClient) while (queue.readableBytes() >= endpoint) { - this.readMessage(s, c, queue, clientID); + int eventID = this.readMessage(s, c, queue, clientID); queue.discardReadBytes(); reading = false; @@ -90,6 +88,8 @@ else if (ScreenPartyLobby.isClient) { endpoint = queue.readInt(); downstreamBytes += endpoint + 4; + if (Game.recordEventData) + eventBytes.addTo(eventID, endpoint + 4); updateLastMessageTime(); if (endpoint > MessageReader.max_event_size) @@ -149,7 +149,7 @@ else if (ScreenPartyLobby.isClient) } } - public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf m, UUID clientID) throws Exception + public synchronized int readMessage(ServerHandler s, ClientHandler ch, ByteBuf m, UUID clientID) throws Exception { int i = m.readShort(); Class c = NetworkEventMap.get(i); @@ -185,19 +185,26 @@ else if (e instanceof IClientThreadEvent && ch != null) } this.lastID = i; + return i; } public static void updateLastMessageTime() { long time = System.currentTimeMillis() / 1000; - if (lastMessageTime < time) - { - lastMessageTime = time; - upstreamBytesPerSec = upstreamBytes; - downstreamBytesPerSec = downstreamBytes; - upstreamBytes = 0; - downstreamBytes = 0; - } - } + if (lastMessageTime >= time) + return; + + lastMessageTime = time; + upstreamBytesPerSec = upstreamBytes; + downstreamBytesPerSec = downstreamBytes; + upstreamBytes = 0; + downstreamBytes = 0; + + if (Game.recordEventData) + { + eventBytesPerSec = eventBytes; + eventBytes = new Int2IntOpenHashMap(); + } + } } diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index d0b4b8769..51f10a5a2 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -62,13 +62,8 @@ public synchronized void sendEvent(INetworkEvent e) this.sendEvent(e, true); } - public HashMap eventFrequencies = new HashMap<>(); - public synchronized void sendEvent(INetworkEvent e, boolean flush) { - eventFrequencies.putIfAbsent(e.getClass().getSimpleName(), 0); - eventFrequencies.put(e.getClass().getSimpleName(), eventFrequencies.get(e.getClass().getSimpleName()) + 1); - if (steamID != null) { SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; @@ -89,9 +84,12 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) b.writeShort(i); e.write(b); + int rb = b.readableBytes(); ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(b.readableBytes()); - MessageReader.upstreamBytes += b.readableBytes() + 4; + b2.writeInt(rb); + MessageReader.upstreamBytes += rb + 4; + if (Game.recordEventData) + MessageReader.eventBytes.addTo(i, rb + 4); MessageReader.updateLastMessageTime(); b2.writeBytes(b); diff --git a/src/main/java/tanks/network/event/EventAddColoredTile.java b/src/main/java/tanks/network/event/EventAddColoredTile.java index dc3cabf6e..589c5a04a 100644 --- a/src/main/java/tanks/network/event/EventAddColoredTile.java +++ b/src/main/java/tanks/network/event/EventAddColoredTile.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.obstacle.ObstacleColorFlashing; public class EventAddColoredTile extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventAddObstacleText.java b/src/main/java/tanks/network/event/EventAddObstacleText.java index 98e2488f2..3bb2249f6 100644 --- a/src/main/java/tanks/network/event/EventAddObstacleText.java +++ b/src/main/java/tanks/network/event/EventAddObstacleText.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; import tanks.obstacle.ObstacleText; public class EventAddObstacleText extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventAddScoreboard.java b/src/main/java/tanks/network/event/EventAddScoreboard.java index a6ee4114c..22d2ea3c7 100644 --- a/src/main/java/tanks/network/event/EventAddScoreboard.java +++ b/src/main/java/tanks/network/event/EventAddScoreboard.java @@ -5,8 +5,7 @@ import tanks.gui.RemoteScoreboard; import tanks.network.NetworkUtils; -import java.util.ArrayList; -import java.util.Collections; +import java.util.*; public class EventAddScoreboard extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventAnnounceConnection.java b/src/main/java/tanks/network/event/EventAnnounceConnection.java index 676cd9343..a7649cab2 100644 --- a/src/main/java/tanks/network/event/EventAnnounceConnection.java +++ b/src/main/java/tanks/network/event/EventAnnounceConnection.java @@ -1,9 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.gui.screen.ScreenPartyLobby; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventArcadeEnd.java b/src/main/java/tanks/network/event/EventArcadeEnd.java index 09bf97616..b8df6055c 100644 --- a/src/main/java/tanks/network/event/EventArcadeEnd.java +++ b/src/main/java/tanks/network/event/EventArcadeEnd.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.minigames.Arcade; diff --git a/src/main/java/tanks/network/event/EventBeginCrusade.java b/src/main/java/tanks/network/event/EventBeginCrusade.java index 7f7562241..d2c804df2 100644 --- a/src/main/java/tanks/network/event/EventBeginCrusade.java +++ b/src/main/java/tanks/network/event/EventBeginCrusade.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.hotbar.ItemBar; diff --git a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java index 7768ab529..4f5739bdb 100644 --- a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java +++ b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenGame; diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index 149b9ad67..115668207 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -1,13 +1,11 @@ package tanks.network.event; -import tanks.bullet.Bullet; -import tanks.bullet.BulletInstant; +import tanks.bullet.*; -public class EventBulletDestroyed extends PersonalEvent +public class EventBulletDestroyed extends PersonalEvent implements IStackableEvent { - public int bullet; - public double posX; - public double posY; + public int tank, bullet; + public double posX, posY; public EventBulletDestroyed() { @@ -16,6 +14,7 @@ public EventBulletDestroyed() public EventBulletDestroyed(Bullet b) { + this.tank = b.tank.networkID; this.bullet = b.networkID; this.posX = b.posX; this.posY = b.posY; @@ -43,4 +42,10 @@ public void execute() b.destroy = true; Bullet.idMap.remove(b.networkID); } + + @Override + public int getIdentifier() + { + return tank; + } } diff --git a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java index cc411c693..633a279c5 100644 --- a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java +++ b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java @@ -1,14 +1,11 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.bullet.Bullet; -import tanks.bullet.BulletInstant; +import tanks.bullet.*; -public class EventBulletInstantWaypoint extends PersonalEvent +public class EventBulletInstantWaypoint extends PersonalEvent implements IStackableEvent { - public int bullet; - public double posX; - public double posY; + public int tank, bullet; + public double posX, posY; public EventBulletInstantWaypoint() @@ -18,10 +15,13 @@ public EventBulletInstantWaypoint() public EventBulletInstantWaypoint(BulletInstant b, double x, double y) { + this.tank = b.tank.networkID; this.bullet = b.networkID; this.posX = x; this.posY = y; } + + @Override public void execute() { @@ -34,4 +34,9 @@ public void execute() } } + @Override + public int getIdentifier() + { + return tank; + } } diff --git a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java index 4e5a21716..d604d3da3 100644 --- a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java +++ b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.bullet.Bullet; import tanks.tank.Tank; diff --git a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java index 01f22a588..aaac53f98 100644 --- a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java +++ b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java @@ -1,9 +1,7 @@ package tanks.network.event; -import tanks.Game; -import tanks.Level; -import tanks.gui.screen.leveleditor.ScreenLevelEditor; -import tanks.gui.screen.leveleditor.ScreenLevelEditorOverlay; +import tanks.*; +import tanks.gui.screen.leveleditor.*; public class EventChangeBackgroundColor extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java b/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java index eff10a27f..ce1adf68f 100644 --- a/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java +++ b/src/main/java/tanks/network/event/EventChangeScoreboardAttribute.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.ModAPI; -import tanks.gui.IFixedMenu; -import tanks.gui.RemoteScoreboard; -import tanks.network.NetworkUtils; +import tanks.gui.*; public class EventChangeScoreboardAttribute extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventConnectionSuccess.java b/src/main/java/tanks/network/event/EventConnectionSuccess.java index bca830932..4741ca81d 100644 --- a/src/main/java/tanks/network/event/EventConnectionSuccess.java +++ b/src/main/java/tanks/network/event/EventConnectionSuccess.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenPartyLobby; diff --git a/src/main/java/tanks/network/event/EventDisplayText.java b/src/main/java/tanks/network/event/EventDisplayText.java index a05296e8c..c4d598fba 100644 --- a/src/main/java/tanks/network/event/EventDisplayText.java +++ b/src/main/java/tanks/network/event/EventDisplayText.java @@ -1,11 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; -import tanks.ModAPI; +import tanks.*; import tanks.gui.FixedText; -import tanks.network.NetworkUtils; public class EventDisplayText extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventDisplayTextGroup.java b/src/main/java/tanks/network/event/EventDisplayTextGroup.java index e7f6cdeb0..1691693a0 100644 --- a/src/main/java/tanks/network/event/EventDisplayTextGroup.java +++ b/src/main/java/tanks/network/event/EventDisplayTextGroup.java @@ -5,8 +5,7 @@ import tanks.gui.FixedTextGroup; import tanks.network.NetworkUtils; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; public class EventDisplayTextGroup extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventEnterLevel.java b/src/main/java/tanks/network/event/EventEnterLevel.java index ed62e1b65..cc1d75f08 100644 --- a/src/main/java/tanks/network/event/EventEnterLevel.java +++ b/src/main/java/tanks/network/event/EventEnterLevel.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; +import tanks.*; import tanks.gui.screen.ScreenGame; public class EventEnterLevel extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventExplosion.java b/src/main/java/tanks/network/event/EventExplosion.java index 4209c7e5b..72cbb2dc2 100644 --- a/src/main/java/tanks/network/event/EventExplosion.java +++ b/src/main/java/tanks/network/event/EventExplosion.java @@ -1,8 +1,7 @@ package tanks.network.event; import tanks.Game; -import tanks.tank.Explosion; -import tanks.tank.TankAIControlled; +import tanks.tank.*; public class EventExplosion extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventLayMine.java b/src/main/java/tanks/network/event/EventLayMine.java index 44406f9e9..33c3129d4 100644 --- a/src/main/java/tanks/network/event/EventLayMine.java +++ b/src/main/java/tanks/network/event/EventLayMine.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.item.Item; -import tanks.item.ItemBullet; -import tanks.item.ItemMine; +import tanks.item.*; import tanks.tank.*; public class EventLayMine extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventLevelExit.java b/src/main/java/tanks/network/event/EventLevelExit.java index 04f7e7afb..3e0459b27 100644 --- a/src/main/java/tanks/network/event/EventLevelExit.java +++ b/src/main/java/tanks/network/event/EventLevelExit.java @@ -1,9 +1,7 @@ package tanks.network.event; -import tanks.Game; -import tanks.Panel; -import tanks.gui.screen.ScreenPartyInterlevel; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.*; +import tanks.gui.screen.*; public class EventLevelExit extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventLevelFinishedQuick.java b/src/main/java/tanks/network/event/EventLevelFinishedQuick.java index 7b1f397be..36d7dc832 100644 --- a/src/main/java/tanks/network/event/EventLevelFinishedQuick.java +++ b/src/main/java/tanks/network/event/EventLevelFinishedQuick.java @@ -1,12 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; -import tanks.Panel; -import tanks.gui.screen.Screen; +import tanks.*; import tanks.gui.screen.ScreenGame; -import tanks.network.NetworkUtils; public class EventLevelFinishedQuick extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventLoadItemBarSlot.java b/src/main/java/tanks/network/event/EventLoadItemBarSlot.java index d6d5ab0ef..eeaf30337 100644 --- a/src/main/java/tanks/network/event/EventLoadItemBarSlot.java +++ b/src/main/java/tanks/network/event/EventLoadItemBarSlot.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventLoadLevel.java b/src/main/java/tanks/network/event/EventLoadLevel.java index 9e6ce938e..aa684ff84 100644 --- a/src/main/java/tanks/network/event/EventLoadLevel.java +++ b/src/main/java/tanks/network/event/EventLoadLevel.java @@ -1,18 +1,10 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; -import tanks.Level; -import tanks.Movable; -import tanks.gui.screen.ScreenFailedToLoadLevel; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.*; +import tanks.gui.screen.*; import tanks.item.Item; import tanks.minigames.Minigame; -import tanks.network.NetworkUtils; -import tanks.tank.TankAIControlled; -import tanks.tank.TankPlayer; -import tanks.tank.TankRemote; +import tanks.tank.*; import java.util.ArrayList; diff --git a/src/main/java/tanks/network/event/EventMineChangeTimer.java b/src/main/java/tanks/network/event/EventMineChangeTimer.java index 7751c9293..2219aac82 100644 --- a/src/main/java/tanks/network/event/EventMineChangeTimer.java +++ b/src/main/java/tanks/network/event/EventMineChangeTimer.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.tank.Mine; public class EventMineChangeTimer extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventMutePlayer.java b/src/main/java/tanks/network/event/EventMutePlayer.java index 61e678da6..a23220d9f 100644 --- a/src/main/java/tanks/network/event/EventMutePlayer.java +++ b/src/main/java/tanks/network/event/EventMutePlayer.java @@ -1,11 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Player; -import tanks.gui.ChatBox; import tanks.gui.ChatMessage; import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; public class EventMutePlayer extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventNudge.java b/src/main/java/tanks/network/event/EventNudge.java index 1bdc15817..54023d7c1 100644 --- a/src/main/java/tanks/network/event/EventNudge.java +++ b/src/main/java/tanks/network/event/EventNudge.java @@ -1,14 +1,9 @@ package tanks.network.event; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; -import tanks.Player; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenOverlayChat; -import tanks.gui.screen.ScreenPartyHost; -import tanks.network.NetworkUtils; -import tanks.network.ServerHandler; +import tanks.*; +import tanks.gui.screen.*; +import tanks.network.*; import tanks.translation.Translation; public class EventNudge extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java index 3a3884f88..9d8756010 100644 --- a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java +++ b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleShrubbery; +import tanks.*; +import tanks.obstacle.*; public class EventObstacleShrubberyBurn extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventPlayerAutoReady.java b/src/main/java/tanks/network/event/EventPlayerAutoReady.java index 3f4fe3d4c..40459c61a 100644 --- a/src/main/java/tanks/network/event/EventPlayerAutoReady.java +++ b/src/main/java/tanks/network/event/EventPlayerAutoReady.java @@ -1,7 +1,6 @@ package tanks.network.event; -import tanks.Crusade; -import tanks.Game; +import tanks.*; public class EventPlayerAutoReady extends EventPlayerReady { diff --git a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java index a00cdc51b..617f41062 100644 --- a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java +++ b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java @@ -1,9 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenGame; -import tanks.network.NetworkUtils; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventPlayerChat.java b/src/main/java/tanks/network/event/EventPlayerChat.java index 2df7b54bb..0320b03eb 100644 --- a/src/main/java/tanks/network/event/EventPlayerChat.java +++ b/src/main/java/tanks/network/event/EventPlayerChat.java @@ -1,10 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Player; import tanks.gui.ChatMessage; import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; public class EventPlayerChat extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventPlayerReady.java b/src/main/java/tanks/network/event/EventPlayerReady.java index 64bdb2bfa..7f04f7c18 100644 --- a/src/main/java/tanks/network/event/EventPlayerReady.java +++ b/src/main/java/tanks/network/event/EventPlayerReady.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.gui.screen.ScreenGame; +import tanks.*; import tanks.gui.screen.ScreenPartyHost; public class EventPlayerReady extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java index 51be49899..652a96012 100644 --- a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java @@ -1,16 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; -import tanks.Player; -import tanks.gui.screen.ScreenGame; -import tanks.tank.Tank; -import tanks.tank.TankPlayable; -import tanks.tank.TankPlayerRemote; -import tanks.tank.TankRemote; - -import java.util.UUID; +import tanks.*; +import tanks.tank.*; public class EventPlayerRevealBuild extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventPlayerSetBuild.java b/src/main/java/tanks/network/event/EventPlayerSetBuild.java index e8f08d0cf..1cce2717e 100644 --- a/src/main/java/tanks/network/event/EventPlayerSetBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerSetBuild.java @@ -1,16 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; -import tanks.Player; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenPartyHost; -import tanks.network.Server; +import tanks.*; +import tanks.gui.screen.*; import tanks.network.ServerHandler; -import tanks.tank.TankPlayer; -import tanks.tank.TankPlayerController; -import tanks.tank.TankPlayerRemote; +import tanks.tank.*; public class EventPlayerSetBuild extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventPurchaseNPCItem.java b/src/main/java/tanks/network/event/EventPurchaseNPCItem.java index 3eb08ed2b..c9c808304 100644 --- a/src/main/java/tanks/network/event/EventPurchaseNPCItem.java +++ b/src/main/java/tanks/network/event/EventPurchaseNPCItem.java @@ -1,12 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Movable; -import tanks.Player; +import tanks.*; import tanks.gui.screen.ScreenGame; -import tanks.tank.TankNPC; -import tanks.tank.TankPlayerRemote; +import tanks.tank.*; public class EventPurchaseNPCItem extends EventPurchaseItem { diff --git a/src/main/java/tanks/network/event/EventReturnToCrusade.java b/src/main/java/tanks/network/event/EventReturnToCrusade.java index 64af49fb8..a1a5d2f6d 100644 --- a/src/main/java/tanks/network/event/EventReturnToCrusade.java +++ b/src/main/java/tanks/network/event/EventReturnToCrusade.java @@ -1,11 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Game; -import tanks.Panel; +import tanks.*; import tanks.gui.screen.ScreenPartyCrusadeInterlevel; -import tanks.network.NetworkUtils; public class EventReturnToCrusade extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventReturnToLobby.java b/src/main/java/tanks/network/event/EventReturnToLobby.java index 29899b0df..68d3480ef 100644 --- a/src/main/java/tanks/network/event/EventReturnToLobby.java +++ b/src/main/java/tanks/network/event/EventReturnToLobby.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.gui.screen.ScreenPartyLobby; diff --git a/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java b/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java index 63e05f650..365f5807c 100644 --- a/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java +++ b/src/main/java/tanks/network/event/EventScoreboardUpdateScore.java @@ -1,10 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.ModAPI; -import tanks.gui.IFixedMenu; -import tanks.gui.RemoteScoreboard; -import tanks.network.NetworkUtils; +import tanks.gui.*; public class EventScoreboardUpdateScore extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventSetItem.java b/src/main/java/tanks/network/event/EventSetItem.java index 5ffbafba9..e2441838b 100644 --- a/src/main/java/tanks/network/event/EventSetItem.java +++ b/src/main/java/tanks/network/event/EventSetItem.java @@ -1,13 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.item.Item; -import tanks.item.ItemBullet; -import tanks.item.ItemEmpty; -import tanks.item.ItemRemote; -import tanks.network.NetworkUtils; +import tanks.*; +import tanks.item.*; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventShareCrusade.java b/src/main/java/tanks/network/event/EventShareCrusade.java index 304ea9582..a52576457 100644 --- a/src/main/java/tanks/network/event/EventShareCrusade.java +++ b/src/main/java/tanks/network/event/EventShareCrusade.java @@ -1,14 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Crusade; -import tanks.Drawing; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.ChatMessage; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; +import tanks.gui.screen.*; import tanks.network.ServerHandler; public class EventShareCrusade extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventShareLevel.java b/src/main/java/tanks/network/event/EventShareLevel.java index 8dab52838..cf059cb64 100644 --- a/src/main/java/tanks/network/event/EventShareLevel.java +++ b/src/main/java/tanks/network/event/EventShareLevel.java @@ -1,14 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; -import tanks.Level; -import tanks.Player; +import tanks.*; import tanks.gui.ChatMessage; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; +import tanks.gui.screen.*; import tanks.network.ServerHandler; public class EventShareLevel extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventStatusEffectBegin.java b/src/main/java/tanks/network/event/EventStatusEffectBegin.java index f407e7515..3c485b90e 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectBegin.java +++ b/src/main/java/tanks/network/event/EventStatusEffectBegin.java @@ -1,10 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Movable; import tanks.attribute.StatusEffect; import tanks.bullet.Bullet; -import tanks.network.NetworkUtils; import tanks.tank.Tank; public class EventStatusEffectBegin extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java b/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java index d0ce2b06a..1bae538a6 100644 --- a/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java +++ b/src/main/java/tanks/network/event/EventStatusEffectDeteriorate.java @@ -1,10 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Movable; import tanks.attribute.StatusEffect; import tanks.bullet.Bullet; -import tanks.network.NetworkUtils; import tanks.tank.Tank; public class EventStatusEffectDeteriorate extends PersonalEvent diff --git a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java index a5c61df41..4769daccf 100644 --- a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java @@ -1,11 +1,9 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.attribute.AttributeModifier; -import tanks.network.NetworkUtils; import tanks.tank.Tank; -public class EventTankAddAttributeModifier extends PersonalEvent +public class EventTankAddAttributeModifier extends PersonalEvent implements IStackableEvent { public int tank; public String name; @@ -69,4 +67,14 @@ public void execute() } } + public boolean isStackable() + { + return unduplicate; + } + + @Override + public int getIdentifier() + { + return name.hashCode() + tank; + } } diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java index e2fb6fffb..74f81841e 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.network.NetworkUtils; import tanks.tank.TankPlayerController; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index 592c4fb16..64a791dd4 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -1,9 +1,7 @@ package tanks.network.event; import tanks.Game; -import tanks.tank.Tank; -import tanks.tank.TankPlayerController; -import tanks.tank.TankRemote; +import tanks.tank.*; public class EventTankControllerUpdateS extends EventTankUpdate { diff --git a/src/main/java/tanks/network/event/EventTankCustomCreate.java b/src/main/java/tanks/network/event/EventTankCustomCreate.java index 6ed92b3c9..92d8bab88 100644 --- a/src/main/java/tanks/network/event/EventTankCustomCreate.java +++ b/src/main/java/tanks/network/event/EventTankCustomCreate.java @@ -1,12 +1,8 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Team; -import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventTankCustomCreate extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventTankMimicTransform.java b/src/main/java/tanks/network/event/EventTankMimicTransform.java index 455c1eab4..930c1ac58 100644 --- a/src/main/java/tanks/network/event/EventTankMimicTransform.java +++ b/src/main/java/tanks/network/event/EventTankMimicTransform.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; +import tanks.*; import tanks.registry.RegistryTank; import tanks.tank.*; diff --git a/src/main/java/tanks/network/event/EventTankRemove.java b/src/main/java/tanks/network/event/EventTankRemove.java index 647bbbe5e..a6771fd08 100644 --- a/src/main/java/tanks/network/event/EventTankRemove.java +++ b/src/main/java/tanks/network/event/EventTankRemove.java @@ -1,6 +1,5 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.tank.Tank; diff --git a/src/main/java/tanks/network/event/EventTankSpawn.java b/src/main/java/tanks/network/event/EventTankSpawn.java index 8c8b7020e..9ac92ae53 100644 --- a/src/main/java/tanks/network/event/EventTankSpawn.java +++ b/src/main/java/tanks/network/event/EventTankSpawn.java @@ -1,12 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Team; -import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankAIControlled; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventTankSpawn extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventTankTeleport.java b/src/main/java/tanks/network/event/EventTankTeleport.java index 4dd53eddf..8c8b317a0 100644 --- a/src/main/java/tanks/network/event/EventTankTeleport.java +++ b/src/main/java/tanks/network/event/EventTankTeleport.java @@ -1,11 +1,8 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleTeleporter; -import tanks.tank.Tank; -import tanks.tank.TeleporterOrb; +import tanks.obstacle.*; +import tanks.tank.*; public class EventTankTeleport extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventTankTransformPreset.java b/src/main/java/tanks/network/event/EventTankTransformPreset.java index dcc77afc2..06dc8aadb 100644 --- a/src/main/java/tanks/network/event/EventTankTransformPreset.java +++ b/src/main/java/tanks/network/event/EventTankTransformPreset.java @@ -1,11 +1,7 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Effect; -import tanks.Game; -import tanks.tank.Tank; -import tanks.tank.TankAIControlled; -import tanks.tank.TankRemote; +import tanks.*; +import tanks.tank.*; public class EventTankTransformPreset extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventTankUpdateColor.java b/src/main/java/tanks/network/event/EventTankUpdateColor.java index cc9de4da8..d9d3a81aa 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateColor.java +++ b/src/main/java/tanks/network/event/EventTankUpdateColor.java @@ -1,8 +1,6 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; -import tanks.network.NetworkUtils; import tanks.tank.Tank; public class EventTankUpdateColor extends PersonalEvent implements IStackableEvent diff --git a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java index 30bc6cc50..d164a7362 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java +++ b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java @@ -1,8 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.tank.Tank; -import tanks.tank.TankRemote; +import tanks.tank.*; public class EventTankUpdateVisibility extends PersonalEvent { diff --git a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java index 2e1a3e7c7..ddf35fb1b 100644 --- a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java +++ b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; +import tanks.*; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventUpdateTankAbility.java b/src/main/java/tanks/network/event/EventUpdateTankAbility.java index 96d316e95..b6b44a992 100644 --- a/src/main/java/tanks/network/event/EventUpdateTankAbility.java +++ b/src/main/java/tanks/network/event/EventUpdateTankAbility.java @@ -1,9 +1,6 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; +import tanks.*; import tanks.tank.TankPlayable; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/EventUpdateTankColors.java b/src/main/java/tanks/network/event/EventUpdateTankColors.java index cc4f706dd..88ea62ee6 100644 --- a/src/main/java/tanks/network/event/EventUpdateTankColors.java +++ b/src/main/java/tanks/network/event/EventUpdateTankColors.java @@ -1,11 +1,9 @@ package tanks.network.event; import basewindow.Color; -import io.netty.buffer.ByteBuf; import tanks.Player; import tanks.gui.screen.ScreenPartyLobby; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index cd3deb095..bf1406621 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -2,7 +2,7 @@ import basewindow.Color; import io.netty.buffer.ByteBuf; -import tanks.network.*; +import tanks.network.NetworkUtils; import tanks.tankson.ReflectionHandle; import java.lang.annotation.*; diff --git a/src/main/java/tanks/network/event/online/EventAddButton.java b/src/main/java/tanks/network/event/online/EventAddButton.java index eda9bf472..506e82d60 100644 --- a/src/main/java/tanks/network/event/online/EventAddButton.java +++ b/src/main/java/tanks/network/event/online/EventAddButton.java @@ -1,11 +1,9 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.gui.Button; -import tanks.gui.screen.ScreenOnline; -import tanks.gui.screen.ScreenOnlineWaiting; +import tanks.gui.screen.*; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventAddMenuButton.java b/src/main/java/tanks/network/event/online/EventAddMenuButton.java index 116a618bb..5b392f601 100644 --- a/src/main/java/tanks/network/event/online/EventAddMenuButton.java +++ b/src/main/java/tanks/network/event/online/EventAddMenuButton.java @@ -1,11 +1,9 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Panel; +import tanks.*; import tanks.gui.Button; -import tanks.gui.screen.ScreenOnlineWaiting; -import tanks.gui.screen.ScreenOverlayOnline; +import tanks.gui.screen.*; public class EventAddMenuButton extends EventAddButton { diff --git a/src/main/java/tanks/network/event/online/EventAddShape.java b/src/main/java/tanks/network/event/online/EventAddShape.java index 177476619..1b676e9bc 100644 --- a/src/main/java/tanks/network/event/online/EventAddShape.java +++ b/src/main/java/tanks/network/event/online/EventAddShape.java @@ -1,8 +1,7 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.gui.screen.ScreenOnline; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventAddText.java b/src/main/java/tanks/network/event/online/EventAddText.java index a3896840f..c6dc07934 100644 --- a/src/main/java/tanks/network/event/online/EventAddText.java +++ b/src/main/java/tanks/network/event/online/EventAddText.java @@ -1,8 +1,7 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.gui.screen.ScreenOnline; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventAddTextBox.java b/src/main/java/tanks/network/event/online/EventAddTextBox.java index c4814f60f..365e7cd45 100644 --- a/src/main/java/tanks/network/event/online/EventAddTextBox.java +++ b/src/main/java/tanks/network/event/online/EventAddTextBox.java @@ -1,11 +1,9 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.gui.TextBox; -import tanks.gui.screen.ScreenOnline; -import tanks.gui.screen.ScreenOnlineWaiting; +import tanks.gui.screen.*; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventAddUUIDTextBox.java b/src/main/java/tanks/network/event/online/EventAddUUIDTextBox.java index fa986be1c..0e6df0bf9 100644 --- a/src/main/java/tanks/network/event/online/EventAddUUIDTextBox.java +++ b/src/main/java/tanks/network/event/online/EventAddUUIDTextBox.java @@ -1,11 +1,9 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.gui.UUIDTextBox; -import tanks.gui.screen.ScreenOnline; -import tanks.gui.screen.ScreenOnlineWaiting; +import tanks.gui.screen.*; import tanks.network.NetworkUtils; public class EventAddUUIDTextBox extends EventAddTextBox diff --git a/src/main/java/tanks/network/event/online/EventSendLevelToDownload.java b/src/main/java/tanks/network/event/online/EventSendLevelToDownload.java index 7395f0f56..0c594f9c4 100644 --- a/src/main/java/tanks/network/event/online/EventSendLevelToDownload.java +++ b/src/main/java/tanks/network/event/online/EventSendLevelToDownload.java @@ -1,8 +1,7 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Level; +import tanks.*; import tanks.gui.screen.ScreenDownloadLevel; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventSendOnlineClientDetails.java b/src/main/java/tanks/network/event/online/EventSendOnlineClientDetails.java index d26186d38..fffa99ae2 100644 --- a/src/main/java/tanks/network/event/online/EventSendOnlineClientDetails.java +++ b/src/main/java/tanks/network/event/online/EventSendOnlineClientDetails.java @@ -3,14 +3,9 @@ import io.netty.buffer.ByteBuf; import tanks.Game; import tanks.network.NetworkUtils; -import tanks.network.event.EventKick; -import tanks.network.event.PersonalEvent; -import tanksonline.AccessCode; -import tanksonline.PlayerMap; -import tanksonline.TanksOnlineServerHandler; -import tanksonline.screen.ScreenAccessCodeExpired; -import tanksonline.screen.ScreenHome; -import tanksonline.screen.ScreenInsertAccessCode; +import tanks.network.event.*; +import tanksonline.*; +import tanksonline.screen.*; import java.util.UUID; diff --git a/src/main/java/tanks/network/event/online/EventSetPauseScreenTitle.java b/src/main/java/tanks/network/event/online/EventSetPauseScreenTitle.java index c895ef83c..0bc7e9bf9 100644 --- a/src/main/java/tanks/network/event/online/EventSetPauseScreenTitle.java +++ b/src/main/java/tanks/network/event/online/EventSetPauseScreenTitle.java @@ -1,8 +1,7 @@ package tanks.network.event.online; import io.netty.buffer.ByteBuf; -import tanks.Game; -import tanks.Panel; +import tanks.*; import tanks.gui.screen.ScreenOnline; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventSilentDisconnect.java b/src/main/java/tanks/network/event/online/EventSilentDisconnect.java index 935fd5484..fe1d6daf7 100644 --- a/src/main/java/tanks/network/event/online/EventSilentDisconnect.java +++ b/src/main/java/tanks/network/event/online/EventSilentDisconnect.java @@ -2,8 +2,7 @@ import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.gui.screen.ScreenPlayMultiplayer; +import tanks.gui.screen.*; import tanks.network.Client; import tanks.network.event.PersonalEvent; diff --git a/src/main/java/tanks/network/event/online/EventUploadLevel.java b/src/main/java/tanks/network/event/online/EventUploadLevel.java index 084029e00..95c2db285 100644 --- a/src/main/java/tanks/network/event/online/EventUploadLevel.java +++ b/src/main/java/tanks/network/event/online/EventUploadLevel.java @@ -3,11 +3,8 @@ import io.netty.buffer.ByteBuf; import tanks.network.NetworkUtils; import tanks.network.event.PersonalEvent; -import tanksonline.PlayerMap; -import tanksonline.TanksOnlineServerHandler; -import tanksonline.UploadedLevel; -import tanksonline.screen.ScreenLayout; -import tanksonline.screen.ScreenUploadFinished; +import tanksonline.*; +import tanksonline.screen.*; public class EventUploadLevel extends PersonalEvent implements IOnlineServerEvent { From f92fab35e84355f55c1d902c8c8458cedc0b434c Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 22:53:05 -0700 Subject: [PATCH 19/35] perf: make instant waypoint events stackable Signed-off-by: orangishcat --- src/main/java/tanks/Panel.java | 12 ++++++----- src/main/java/tanks/bullet/Bullet.java | 20 +++++++++---------- src/main/java/tanks/bullet/BulletInstant.java | 20 +++++++++---------- .../java/tanks/network/NetworkHandler.java | 10 +++++----- .../event/EventBulletInstantWaypoint.java | 8 ++++---- .../event/EventTankAddAttributeModifier.java | 2 +- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 46a8701a4..78468b437 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -91,7 +91,7 @@ public class Panel protected Screen lastDrawnScreen = null; public ArrayList lights = new ArrayList<>(); - public Int2IntOpenHashMap stackedEventsIn = new Int2IntOpenHashMap(); + public Int2IntLinkedOpenHashMap stackedEventsIn = new Int2IntLinkedOpenHashMap(); public LoadingTerrainContinuation continuation = null; public long continuationStartTime = 0; @@ -352,7 +352,7 @@ else if (Game.deterministicMode) if (e instanceof IOnlineServerEvent) continue; - if (e instanceof IStackableEvent) + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) stackedEventsIn.put(IStackableEvent.key((IStackableEvent) e), i); } @@ -362,7 +362,7 @@ else if (Game.deterministicMode) if (e instanceof IOnlineServerEvent) continue; - if (e instanceof IStackableEvent && stackedEventsIn.get(IStackableEvent.key((IStackableEvent) e)) != i) + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable() && stackedEventsIn.get(IStackableEvent.key((IStackableEvent) e)) != i) continue; e.execute(); @@ -842,8 +842,10 @@ public void draw() Drawing.drawing.setInterfaceFontSize(16); double y = Drawing.drawing.getInterfaceEdgeY(true) - 20; - MessageReader.eventBytesPerSec.int2IntEntrySet().stream().sorted(Comparator.comparingInt(Int2IntMap.Entry::getIntValue)).forEach(entry -> - Drawing.drawing.displayUncenteredInterfaceText(10, y - i.getAndIncrement() * 20, "%s: %.2f KB/s", NetworkEventMap.get(entry.getIntKey()).getSimpleName(), entry.getIntValue() / 1024.)); + MessageReader.eventBytesPerSec.int2IntEntrySet().stream() + .sorted(Comparator.comparingInt(Int2IntMap.Entry::getIntValue)) + .forEach(entry -> Drawing.drawing.displayUncenteredInterfaceText(10, y - i.getAndIncrement() * 20, + "%s: %.2f KB/s", NetworkEventMap.get(entry.getIntKey()).getSimpleName(), entry.getIntValue() / 1024.)); } ScreenOverlayChat.draw(!(Game.screen instanceof IHiddenChatboxScreen)); diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index 8f512a022..e7376e744 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -406,13 +406,13 @@ public void collidedWithTank(Tank t) float pitch = (float) ((Math.min(t.health, t.baseHealth + this.maxExtraHealth) / (t.baseHealth + this.maxExtraHealth) / 2) + 1f) / 2; if (this.item.item.cooldownBase > 0) - Drawing.drawing.playGlobalSound("heal_impact_2.ogg", pitch); + Drawing.drawing.playSound("heal_impact_2.ogg", pitch); else { float freq = (float) (this.frameDamageMultipler / 10); if (Game.game.window.touchscreen) freq = 1; - Drawing.drawing.playGlobalSound("heal2.ogg", pitch, freq); + Drawing.drawing.playSound("heal2.ogg", pitch, freq); } t.em().addAttribute(AttributeModifier.newInstance("healray", AttributeModifier.healray, AttributeModifier.Operation.add, 1.0)); @@ -493,7 +493,7 @@ else if (this.tank instanceof TankPlayerRemote) else { if (this.playPopSound && dmg > 0) - Drawing.drawing.playGlobalSound("damage.ogg", (float) (bullet_size / size)); + Drawing.drawing.playSound("damage.ogg", (float) (bullet_size / size)); if (this.boosting) { @@ -526,7 +526,7 @@ else if (this.tank instanceof TankPlayerRemote) } } else if (this.playPopSound && !this.heavy) - Drawing.drawing.playGlobalSound("bullet_explode.ogg", (float) (bullet_size / size)); + Drawing.drawing.playSound("bullet_explode.ogg", (float) (bullet_size / size)); } public void collidedWithObject(Movable o) @@ -571,7 +571,7 @@ public void push(Bullet b) protected void pop() { if (this.playPopSound) - Drawing.drawing.playGlobalSound("bullet_explode.ogg", (float) (bullet_size / size)); + Drawing.drawing.playSound("bullet_explode.ogg", (float) (bullet_size / size)); this.destroy = true; this.vX = 0; @@ -622,8 +622,8 @@ public void collideBounce(Bullet b) if (this.playBounceSound && b.playBounceSound) { - Drawing.drawing.playGlobalSound("bump.ogg", (float) (bullet_size / size), 0.5f); - Drawing.drawing.playGlobalSound("bump.ogg", (float) (bullet_size / b.size), 0.5f); + Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / size), 0.5f); + Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / b.size), 0.5f); } this.addTrail(); @@ -752,7 +752,7 @@ public void checkCollision() { Game.removeObstacles.add(o); o.playDestroyAnimation(this.posX, this.posY, Game.tile_size); - Drawing.drawing.playGlobalSound("break.ogg"); + Drawing.drawing.playSound("break.ogg"); } if (this.heavy) @@ -956,7 +956,7 @@ else if (!down && dy >= 0 && dy < bound && horizontalDist < verticalDist) this.pop(); } else if (this.playBounceSound) - Drawing.drawing.playGlobalSound("bounce.ogg", (float) (bullet_size / size)); + Drawing.drawing.playSound("bounce.ogg", (float) (bullet_size / size)); if (!destroy) { @@ -1652,7 +1652,7 @@ public void onDestroy() if (this.freezing) { Game.movables.add(new AreaEffectFreeze(this.posX, this.posY)); - Drawing.drawing.playGlobalSound("freeze.ogg"); + Drawing.drawing.playSound("freeze.ogg"); } } diff --git a/src/main/java/tanks/bullet/BulletInstant.java b/src/main/java/tanks/bullet/BulletInstant.java index d829a3667..a6b0cc183 100644 --- a/src/main/java/tanks/bullet/BulletInstant.java +++ b/src/main/java/tanks/bullet/BulletInstant.java @@ -1,6 +1,7 @@ package tanks.bullet; import basewindow.Color; +import it.unimi.dsi.fastutil.doubles.DoubleArrayList; import tanks.*; import tanks.gui.screen.ScreenGame; import tanks.item.ItemBullet; @@ -15,8 +16,8 @@ public class BulletInstant extends Bullet { public static String bullet_class_name = "laser"; - public ArrayList xTargets = new ArrayList<>(); - public ArrayList yTargets = new ArrayList<>(); + public DoubleArrayList xTargets = new DoubleArrayList(); + public DoubleArrayList yTargets = new DoubleArrayList(); public ArrayList segments = new ArrayList<>(); @@ -64,8 +65,7 @@ public void addDestroyEffect() for (int i = 0; i < mul * Game.effectMultiplier; i++) { Effect e = Effect.createNewEffect(this.posX, this.posY, this.posZ, Effect.EffectType.piece); - double var = 50; - e.maxAge /= 2; + e.maxAge /= 2; e.setColorsFromBullet(this, this.baseColor); if (Game.enable3d) @@ -127,9 +127,7 @@ public void shoot() this.saveTarget(); for (int i = 0; i < this.xTargets.size(); i++) - { - Game.eventsOut.add(new EventBulletInstantWaypoint(this, this.xTargets.get(i), this.yTargets.get(i))); - } + Game.eventsOut.add(new EventBulletInstantWaypoint(this, this.xTargets.getDouble(i), this.yTargets.getDouble(i), i)); Game.eventsOut.add(new EventBulletDestroyed(this)); } @@ -233,10 +231,10 @@ public void remoteShoot() { for (int i = 0; i < xTargets.size() - 1; i++) { - double iX = xTargets.get(i); - double iY = yTargets.get(i); - double dX = xTargets.get(i + 1) - iX; - double dY = yTargets.get(i + 1) - iY; + double iX = xTargets.getDouble(i); + double iY = yTargets.getDouble(i); + double dX = xTargets.getDouble(i + 1) - iX; + double dY = yTargets.getDouble(i + 1) - iY; this.posX = iX + dX; this.posY = iY + dY; diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index 51f10a5a2..2d8a96503 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -16,10 +16,9 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public SteamID steamID; protected SynchronizedList events = new SynchronizedList<>(); - protected Int2IntOpenHashMap stackedEvents = new Int2IntOpenHashMap(); + protected Int2IntLinkedOpenHashMap stackedEvents = new Int2IntLinkedOpenHashMap(); - public boolean joined = false; - public boolean closed = false; + public boolean joined = false, closed = false; public MessageReader reader = new MessageReader(); @@ -38,13 +37,14 @@ public void reply() for (int i = 0; i < this.events.size(); i++) { INetworkEvent e = this.events.get(i); - if (e instanceof IStackableEvent) + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) stackedEvents.put(IStackableEvent.key((IStackableEvent) e), i); } for (int i = 0; i < this.events.size(); i++) { INetworkEvent e = this.events.get(i); - if (e instanceof IStackableEvent && stackedEvents.get(IStackableEvent.key((IStackableEvent) e)) != i) + if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable() + && stackedEvents.get(IStackableEvent.key((IStackableEvent) e)) != i) continue; this.sendEvent(e, i == this.events.size() - 1); diff --git a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java index 633a279c5..25a9bcc70 100644 --- a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java +++ b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java @@ -4,7 +4,7 @@ public class EventBulletInstantWaypoint extends PersonalEvent implements IStackableEvent { - public int tank, bullet; + public int tank, bullet, targetIndex; public double posX, posY; @@ -13,10 +13,11 @@ public EventBulletInstantWaypoint() } - public EventBulletInstantWaypoint(BulletInstant b, double x, double y) + public EventBulletInstantWaypoint(BulletInstant b, double x, double y, int targetIndex) { this.tank = b.tank.networkID; this.bullet = b.networkID; + this.targetIndex = targetIndex; this.posX = x; this.posY = y; } @@ -34,9 +35,8 @@ public void execute() } } - @Override public int getIdentifier() { - return tank; + return IStackableEvent.f(IStackableEvent.f(tank) + targetIndex); } } diff --git a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java index 4769daccf..f23caa80c 100644 --- a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java @@ -75,6 +75,6 @@ public boolean isStackable() @Override public int getIdentifier() { - return name.hashCode() + tank; + return name.hashCode() + IStackableEvent.f(tank); } } From d4a8853731f74c8b59d440f61befb8a17545bbe1 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 23:40:18 -0700 Subject: [PATCH 20/35] perf: optimize network load of 0 cooldown items Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 1 + .../tanks/attribute/AttributeModifier.java | 11 +++--- src/main/java/tanks/bullet/Bullet.java | 5 ++- src/main/java/tanks/hotbar/ItemBar.java | 30 ++++++++------- .../java/tanks/network/MessageReader.java | 15 ++++---- .../tanks/network/event/EventSetItem.java | 8 +++- .../network/event/EventSetItemCount.java | 37 +++++++++++++++++++ .../tanks/network/event/IStackableEvent.java | 1 + 8 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 src/main/java/tanks/network/event/EventSetItemCount.java diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 604aa504c..7cba70424 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -368,6 +368,7 @@ public static void registerEvents() NetworkEventMap.register(EventPurchaseBuild.class); NetworkEventMap.register(EventSetItem.class); NetworkEventMap.register(EventSetItemBarSlot.class); + NetworkEventMap.register(EventSetItemCount.class); NetworkEventMap.register(EventLoadItemBarSlot.class); NetworkEventMap.register(EventUpdateTankAbility.class); NetworkEventMap.register(EventUpdateCoins.class); diff --git a/src/main/java/tanks/attribute/AttributeModifier.java b/src/main/java/tanks/attribute/AttributeModifier.java index d677620a8..11383b29a 100644 --- a/src/main/java/tanks/attribute/AttributeModifier.java +++ b/src/main/java/tanks/attribute/AttributeModifier.java @@ -9,7 +9,7 @@ public class AttributeModifier { - public enum Operation {add, multiply} + public enum Operation {add, multiply, set} // Object recycling system private static final Queue recycleQueue = new ConcurrentLinkedQueue<>(); @@ -174,10 +174,11 @@ else if (this.age < this.deteriorationAge || this.deteriorationAge <= 0) if (this.effect == Operation.add) return in + val; - else if (this.effect == Operation.multiply) + if (this.effect == Operation.multiply) return in * (val + 1); - else - return in; + if (this.effect == Operation.set) + return val; + return in; } @Override @@ -187,4 +188,4 @@ public boolean equals(Object obj) return this.name.equals(((AttributeModifier) obj).name); return super.equals(obj); } -} \ No newline at end of file +} diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index e7376e744..ef4efa54e 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -415,7 +415,7 @@ public void collidedWithTank(Tank t) Drawing.drawing.playSound("heal2.ogg", pitch, freq); } - t.em().addAttribute(AttributeModifier.newInstance("healray", AttributeModifier.healray, AttributeModifier.Operation.add, 1.0)); + t.em().addUnduplicateAttribute(AttributeModifier.newInstance("healray", AttributeModifier.healray, AttributeModifier.Operation.set, t.baseHealth + this.maxExtraHealth - t.health)); } if (kill) @@ -1223,7 +1223,8 @@ else if (m1 instanceof Mine && this.mineCollision && !Team.isAllied(this, m1)) if (this.freezing || this.boosting) this.playPopSound = false; - if (!this.isRemote && ScreenPartyHost.isServer && (this.vX != this.lastOriginalVX || this.vY != this.lastOriginalVY) && !justBounced) + if (!this.isRemote && !(this instanceof BulletInstant) && ScreenPartyHost.isServer && + (this.vX != this.lastOriginalVX || this.vY != this.lastOriginalVY) && !justBounced) Game.eventsOut.add(new EventBulletUpdate(this)); this.justBounced = false; diff --git a/src/main/java/tanks/hotbar/ItemBar.java b/src/main/java/tanks/hotbar/ItemBar.java index d7e481640..89ba65524 100644 --- a/src/main/java/tanks/hotbar/ItemBar.java +++ b/src/main/java/tanks/hotbar/ItemBar.java @@ -3,17 +3,12 @@ import tanks.*; import tanks.gui.Button; import tanks.gui.input.InputBindingGroup; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.item.Item; -import tanks.item.ItemEmpty; +import tanks.gui.screen.*; +import tanks.item.*; import tanks.minigames.Arcade; import tanks.network.ServerHandler; -import tanks.network.event.EventSetItem; -import tanks.network.event.EventSetItemBarSlot; -import tanks.tank.TankPlayable; -import tanks.tank.TankPlayer; +import tanks.network.event.*; +import tanks.tank.*; public class ItemBar { @@ -174,16 +169,18 @@ public boolean useItem(boolean rightClick) if (selected == -1 || selected >= hotbarSlots) return false; - if (slots[selected].isEmpty) + Item.ItemStack i = slots[selected]; + + if (i.isEmpty) return false; - if (slots[selected].item.rightClick != rightClick) + if (i.item.rightClick != rightClick) return false; - slots[selected].attemptUse(); + i.attemptUse(); boolean destroy = false; - if (slots[selected].destroy) + if (i.destroy) { destroy = true; slots[selected] = new ItemEmpty.ItemStackEmpty(); @@ -192,7 +189,12 @@ public boolean useItem(boolean rightClick) } if (this.player != Game.player) - Game.eventsOut.add(new EventSetItem(this.player, this.selected, this.slots[this.selected])); + { + if (i != slots[selected]) + Game.eventsOut.add(new EventSetItem(this.player, this.selected, this.slots[this.selected])); + else + Game.eventsOut.add(new EventSetItemCount(this.slots[this.selected].stackSize, this.player.clientID, this.selected)); + } if (destroy && Game.currentLevel instanceof Arcade) { diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index b6d70d3d4..301af2110 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -79,8 +79,8 @@ else if (ScreenPartyLobby.isClient) while (queue.readableBytes() >= endpoint) { - int eventID = this.readMessage(s, c, queue, clientID); - queue.discardReadBytes(); + this.readMessage(s, c, queue, clientID); + queue.discardReadBytes(); reading = false; @@ -88,8 +88,6 @@ else if (ScreenPartyLobby.isClient) { endpoint = queue.readInt(); downstreamBytes += endpoint + 4; - if (Game.recordEventData) - eventBytes.addTo(eventID, endpoint + 4); updateLastMessageTime(); if (endpoint > MessageReader.max_event_size) @@ -149,8 +147,9 @@ else if (ScreenPartyLobby.isClient) } } - public synchronized int readMessage(ServerHandler s, ClientHandler ch, ByteBuf m, UUID clientID) throws Exception + public synchronized void readMessage(ServerHandler s, ClientHandler ch, ByteBuf m, UUID clientID) throws Exception { + int rb = m.readerIndex(); int i = m.readShort(); Class c = NetworkEventMap.get(i); @@ -167,6 +166,9 @@ public synchronized int readMessage(ServerHandler s, ClientHandler ch, ByteBuf m throw new RuntimeException("Failed to read network event " + c + " (previous event: " + NetworkEventMap.get(this.lastID) + "):" + exc.getMessage()); } + if (Game.recordEventData) + eventBytes.addTo(i, m.readerIndex() - rb); + if (e instanceof PersonalEvent) ((PersonalEvent) e).clientID = clientID; @@ -185,8 +187,7 @@ else if (e instanceof IClientThreadEvent && ch != null) } this.lastID = i; - return i; - } + } public static void updateLastMessageTime() { diff --git a/src/main/java/tanks/network/event/EventSetItem.java b/src/main/java/tanks/network/event/EventSetItem.java index e2441838b..ee8fc2893 100644 --- a/src/main/java/tanks/network/event/EventSetItem.java +++ b/src/main/java/tanks/network/event/EventSetItem.java @@ -5,7 +5,7 @@ import java.util.UUID; -public class EventSetItem extends PersonalEvent +public class EventSetItem extends PersonalEvent implements IStackableEvent { public String name; public UUID playerID; @@ -39,4 +39,10 @@ public void execute() Game.player.hotbar.itemBar.slots[slot] = s; } } + + @Override + public int getIdentifier() + { + return IStackableEvent.f(playerID.hashCode()) + slot; + } } diff --git a/src/main/java/tanks/network/event/EventSetItemCount.java b/src/main/java/tanks/network/event/EventSetItemCount.java new file mode 100644 index 000000000..91e0db385 --- /dev/null +++ b/src/main/java/tanks/network/event/EventSetItemCount.java @@ -0,0 +1,37 @@ +package tanks.network.event; + +import tanks.Game; + +import java.util.UUID; + +public class EventSetItemCount extends PersonalEvent implements IStackableEvent +{ + public int count; + public UUID playerID; + public int slot; + + public EventSetItemCount() + { + + } + + public EventSetItemCount(int count, UUID playerID, int slot) + { + this.count = count; + this.playerID = playerID; + this.slot = slot; + } + + @Override + public int getIdentifier() + { + return IStackableEvent.f(playerID.hashCode()) + slot; + } + + @Override + public void execute() + { + if (this.clientID == null && this.playerID.equals(Game.clientID)) + Game.player.hotbar.itemBar.slots[slot].stackSize = count; + } +} diff --git a/src/main/java/tanks/network/event/IStackableEvent.java b/src/main/java/tanks/network/event/IStackableEvent.java index 65b87e558..7d192a11c 100644 --- a/src/main/java/tanks/network/event/IStackableEvent.java +++ b/src/main/java/tanks/network/event/IStackableEvent.java @@ -2,6 +2,7 @@ import tanks.network.NetworkEventMap; +/** Given multiple events that implement this, if they have the same identifier, only the latest one is sent */ public interface IStackableEvent extends INetworkEvent { int getIdentifier(); From b8b0483c431a44ee58c8821b0ec24a5f53ad337a Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 13 Sep 2025 23:44:21 -0700 Subject: [PATCH 21/35] fix: change debug option back to false Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 7cba70424..0e8c7bc50 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -151,7 +151,7 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; - public static boolean recordEventData = true; //todo change back to false + public static boolean recordEventData = false; public static final boolean cinematic = false; public static long steamLobbyInvite = -1; From 455f8c5b509cdca8af92b469b696314b2091f910 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sun, 14 Sep 2025 10:55:08 -0700 Subject: [PATCH 22/35] fix: stack bullet events only for zero cooldown shots Signed-off-by: orangishcat --- src/main/java/tanks/Panel.java | 2 +- .../java/tanks/network/NetworkHandler.java | 33 +++++++++---------- .../network/event/EventBulletDestroyed.java | 8 +++++ .../event/EventBulletInstantWaypoint.java | 8 +++++ .../tanks/network/event/EventShootBullet.java | 21 ++++++------ .../EventTankControllerUpdateAmmunition.java | 8 ++++- .../event/EventTankControllerUpdateC.java | 6 ---- 7 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 78468b437..9c46541c5 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -835,7 +835,7 @@ public void draw() ((TankNPC) m).drawMessage(); } - if (Game.recordEventData) + if (Game.recordEventData && (ScreenPartyHost.isServer || ScreenPartyLobby.isClient)) { AtomicInteger i = new AtomicInteger(); Drawing.drawing.setColor(255, 255, 255); diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java index 2d8a96503..498872c4d 100644 --- a/src/main/java/tanks/network/NetworkHandler.java +++ b/src/main/java/tanks/network/NetworkHandler.java @@ -16,7 +16,7 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public SteamID steamID; protected SynchronizedList events = new SynchronizedList<>(); - protected Int2IntLinkedOpenHashMap stackedEvents = new Int2IntLinkedOpenHashMap(); + protected Int2ObjectLinkedOpenHashMap stackedEvents = new Int2ObjectLinkedOpenHashMap<>(); public boolean joined = false, closed = false; @@ -26,28 +26,27 @@ public abstract class NetworkHandler extends ChannelInboundHandlerAdapter public void reply() { - long time = System.currentTimeMillis() * Game.networkRate / 1000; - if (time == lastStackedEventSend) - return; - - lastStackedEventSend = time; - synchronized (this.events) { - for (int i = 0; i < this.events.size(); i++) + long time = System.currentTimeMillis() * Game.networkRate / 1000; + boolean sendStacked = time != lastStackedEventSend; + + int i = 0; + for (INetworkEvent e : this.events) { - INetworkEvent e = this.events.get(i); if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - stackedEvents.put(IStackableEvent.key((IStackableEvent) e), i); + stackedEvents.put(IStackableEvent.key((IStackableEvent) e), (IStackableEvent) e); + else + sendEvent(e, i++ >= this.events.size() - 1 && (!sendStacked || stackedEvents.isEmpty())); } - for (int i = 0; i < this.events.size(); i++) - { - INetworkEvent e = this.events.get(i); - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable() - && stackedEvents.get(IStackableEvent.key((IStackableEvent) e)) != i) - continue; - this.sendEvent(e, i == this.events.size() - 1); + if (sendStacked) + { + lastStackedEventSend = time; + i = 0; + for (IStackableEvent e : stackedEvents.values()) + sendEvent(e, i++ >= stackedEvents.size() - 1); + stackedEvents.clear(); } if (steamID == null) diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index 115668207..7681befae 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -6,6 +6,7 @@ public class EventBulletDestroyed extends PersonalEvent implements IStackableEve { public int tank, bullet; public double posX, posY; + public boolean zeroCooldown; public EventBulletDestroyed() { @@ -16,6 +17,7 @@ public EventBulletDestroyed(Bullet b) { this.tank = b.tank.networkID; this.bullet = b.networkID; + this.zeroCooldown = b.item.item.cooldownBase <= 0; this.posX = b.posX; this.posY = b.posY; } @@ -43,6 +45,12 @@ public void execute() Bullet.idMap.remove(b.networkID); } + @Override + public boolean isStackable() + { + return zeroCooldown; + } + @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java index 25a9bcc70..dfca70690 100644 --- a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java +++ b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java @@ -6,6 +6,7 @@ public class EventBulletInstantWaypoint extends PersonalEvent implements IStacka { public int tank, bullet, targetIndex; public double posX, posY; + public boolean zeroCooldown; public EventBulletInstantWaypoint() @@ -17,6 +18,7 @@ public EventBulletInstantWaypoint(BulletInstant b, double x, double y, int targe { this.tank = b.tank.networkID; this.bullet = b.networkID; + this.zeroCooldown = b.item.item.cooldownBase <= 0; this.targetIndex = targetIndex; this.posX = x; this.posY = y; @@ -35,6 +37,12 @@ public void execute() } } + @Override + public boolean isStackable() + { + return zeroCooldown; + } + public int getIdentifier() { return IStackableEvent.f(IStackableEvent.f(tank) + targetIndex); diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index bdfdf11a2..7664960d9 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -7,16 +7,10 @@ public class EventShootBullet extends PersonalEvent implements IStackableEvent { - public int id; - public int tank; - public double posX; - public double posY; - public double posZ; - public double vX; - public double vY; - public double vZ; - public double speed; - public int item; + public int id, tank, item; + public double posX, posY, posZ; + public double vX, vY, vZ, speed; + public boolean zeroCooldown; public EventShootBullet() { @@ -27,6 +21,7 @@ public EventShootBullet(Bullet b) { this.id = b.networkID; this.tank = b.tank.networkID; + this.zeroCooldown = b.item.item.cooldownBase <= 0; this.posX = b.posX; this.posY = b.posY; this.posZ = b.posZ; @@ -105,6 +100,12 @@ else if (t2 instanceof TankPlayer) } } + @Override + public boolean isStackable() + { + return zeroCooldown; + } + @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java index 74f81841e..8e6deed42 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateAmmunition.java @@ -5,7 +5,7 @@ import java.util.UUID; -public class EventTankControllerUpdateAmmunition extends PersonalEvent +public class EventTankControllerUpdateAmmunition extends PersonalEvent implements IStackableEvent { public UUID clientIdTarget; public int action1Live; @@ -51,4 +51,10 @@ public void execute() c.mineCooldown = cooldown2; } } + + @Override + public int getIdentifier() + { + return clientIdTarget.hashCode(); + } } diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java index 739b439d7..df02f89f7 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java @@ -70,12 +70,6 @@ public void execute() ((TankPlayerRemote) t).controllerUpdate(this.posX, this.posY, this.vX, this.vY, this.angle, this.mX, this.mY, this.action1, this.action2, this.quickActions, this.time, this.sysTime); } - @Override - public boolean isStackable() - { - return !(action1 || action2); - } - @Override public int getIdentifier() { From 0d47c5cc046621ce588a8a9451e85e80119d21e3 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sun, 14 Sep 2025 12:01:52 -0700 Subject: [PATCH 23/35] fix: continuous shooting only for low cooldown bullets, Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 3 +- .../java/tanks/gui/screen/ScreenDebug.java | 4 +- .../java/tanks/gui/screen/ScreenGame.java | 2 +- src/main/java/tanks/network/Client.java | 10 +- src/main/java/tanks/network/Server.java | 11 +- .../java/tanks/network/TCPLatencyHandler.java | 192 ++++++++++++++++++ .../java/tanks/tank/TankPlayerRemote.java | 27 ++- 7 files changed, 232 insertions(+), 17 deletions(-) create mode 100644 src/main/java/tanks/network/TCPLatencyHandler.java diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 0e8c7bc50..0524d1592 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -151,7 +151,8 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; - public static boolean recordEventData = false; + public static boolean recordEventData = true; // todo change back to false + public static boolean enableLatencyTest = false; public static final boolean cinematic = false; public static long steamLobbyInvite = -1; diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index f44d62ba2..3846e98b4 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -29,13 +29,15 @@ public class ScreenDebug extends Screen Button disableFixes = createToggle("Disable fixes: ", b -> Game.disableErrorFixing = b, () -> Game.disableErrorFixing); Button recordMovableData = createToggle("Record movable data: ", b -> Game.recordMovableData = b, () -> Game.recordMovableData); Button recordEventData = createToggle("Record event data: ", b -> Game.recordEventData = b, () -> Game.recordEventData); + Button lagTest = createToggle("Latency test: ", b -> Game.enableLatencyTest = b, () -> Game.enableLatencyTest); Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 5, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, recordEventData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, + recordEventData, lagTest )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/gui/screen/ScreenGame.java b/src/main/java/tanks/gui/screen/ScreenGame.java index a6ebd26c3..e26579dd2 100644 --- a/src/main/java/tanks/gui/screen/ScreenGame.java +++ b/src/main/java/tanks/gui/screen/ScreenGame.java @@ -2757,7 +2757,7 @@ public void draw() } } - if (Crusade.crusadeMode) + if (Crusade.crusadeMode && Crusade.currentCrusade != null /* lag */) { if (Level.isDark()) Drawing.drawing.setColor(255, 255, 255, 127); diff --git a/src/main/java/tanks/network/Client.java b/src/main/java/tanks/network/Client.java index 233263f9f..fc9ba8adf 100644 --- a/src/main/java/tanks/network/Client.java +++ b/src/main/java/tanks/network/Client.java @@ -1,13 +1,11 @@ package tanks.network; import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; +import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; +import tanks.Game; import java.util.UUID; @@ -38,6 +36,8 @@ public static void connect(String host, int port, boolean online, UUID connectio @Override public void initChannel(SocketChannel ch) { + if (Game.enableLatencyTest) + ch.pipeline().addFirst(new TCPLatencyHandler(50, 10)); handler = new ClientHandler(online, connectionID); ch.pipeline().addLast(handler); } @@ -53,4 +53,4 @@ public void initChannel(SocketChannel ch) workerGroup.shutdownGracefully(); } } -} \ No newline at end of file +} diff --git a/src/main/java/tanks/network/Server.java b/src/main/java/tanks/network/Server.java index 597ff4642..149a99b50 100644 --- a/src/main/java/tanks/network/Server.java +++ b/src/main/java/tanks/network/Server.java @@ -42,6 +42,8 @@ public void run() { @Override public void initChannel(SocketChannel ch) { + if (Game.enableLatencyTest) + ch.pipeline().addFirst(new TCPLatencyHandler(25, 10)); ch.pipeline().addLast(new ServerHandler(instance)); } }) @@ -76,11 +78,8 @@ public void close(String reason) { synchronized(this.connections) { - for (int i = 0; i < this.connections.size(); i++) - { - ServerHandler c = this.connections.get(i); - c.sendEventAndClose(new EventKick(reason)); - } + for (ServerHandler c : this.connections) + c.sendEventAndClose(new EventKick(reason)); workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); @@ -90,4 +89,4 @@ public void close(String reason) if (Game.steamNetworkHandler.initialized) Game.steamNetworkHandler.leaveParty(); } -} \ No newline at end of file +} diff --git a/src/main/java/tanks/network/TCPLatencyHandler.java b/src/main/java/tanks/network/TCPLatencyHandler.java new file mode 100644 index 000000000..c647619e0 --- /dev/null +++ b/src/main/java/tanks/network/TCPLatencyHandler.java @@ -0,0 +1,192 @@ +package tanks.network; + +import io.netty.channel.*; +import io.netty.util.ReferenceCountUtil; + +import java.nio.channels.ClosedChannelException; +import java.util.*; +import java.util.concurrent.*; + +/** + * TCP-only, preserves order even with jitter by monotonic due-times. + * Written by AI + */ +public final class TCPLatencyHandler extends ChannelDuplexHandler +{ + private final int oneWayMs; + private final int jitterMs; + + public TCPLatencyHandler(int oneWayMs, int jitterMs) + { + this.oneWayMs = Math.max(0, oneWayMs); + this.jitterMs = Math.max(0, jitterMs); + } + + // -------- Outbound (write/flush) -------- + private static final class OutItem + { + final Object msg; + final ChannelPromise promise; + final boolean isFlush; + final long dueNs; + + OutItem(Object msg, ChannelPromise p, boolean isFlush, long dueNs) + { + this.msg = msg; + this.promise = p; + this.isFlush = isFlush; + this.dueNs = dueNs; + } + } + + private final Deque outQ = new ArrayDeque<>(); + private boolean outScheduled = false; + private long lastOutDue = 0L; + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise p) + { + enqueueOutbound(ctx, new OutItem(msg, p, false, nextOutDue())); + scheduleOutbound(ctx); + } + + @Override + public void flush(ChannelHandlerContext ctx) + { + enqueueOutbound(ctx, new OutItem(null, null, true, nextOutDue())); + scheduleOutbound(ctx); + } + + private long nextOutDue() + { + long now = System.nanoTime(); + long jitter = (jitterMs == 0) ? 0 : ThreadLocalRandom.current().nextInt(-jitterMs, jitterMs + 1); + long due = now + TimeUnit.MILLISECONDS.toNanos(Math.max(0, oneWayMs + jitter)); + if (due < lastOutDue) due = lastOutDue; // enforce monotonicity => preserves order + return lastOutDue = due; + } + + private void enqueueOutbound(ChannelHandlerContext ctx, OutItem it) + { + outQ.addLast(it); + } + + private void scheduleOutbound(ChannelHandlerContext ctx) + { + if (outScheduled) return; + outScheduled = true; + drainOutbound(ctx); + } + + private void drainOutbound(ChannelHandlerContext ctx) + { + Runnable task = new Runnable() + { + @Override + public void run() + { + outScheduled = false; + long now = System.nanoTime(); + // Run all items that are due + while (!outQ.isEmpty() && outQ.peekFirst().dueNs <= now) + { + OutItem it = outQ.pollFirst(); + if (it.isFlush) + { + ctx.flush(); + } + else + { + ctx.write(it.msg, it.promise); + } + } + if (!outQ.isEmpty()) + { + long delayNs = Math.max(0, outQ.peekFirst().dueNs - System.nanoTime()); + outScheduled = true; + ctx.executor().schedule(this, delayNs, TimeUnit.NANOSECONDS); + } + } + }; + long delayNs = outQ.isEmpty() ? 0 : Math.max(0, outQ.peekFirst().dueNs - System.nanoTime()); + ctx.executor().schedule(task, delayNs, TimeUnit.NANOSECONDS); + } + + // -------- Inbound (read) -------- + private static final class InItem + { + final Object msg; + final long dueNs; + + InItem(Object msg, long dueNs) + { + this.msg = msg; + this.dueNs = dueNs; + } + } + + private final Deque inQ = new ArrayDeque<>(); + private boolean inScheduled = false; + private long lastInDue = 0L; + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) + { + long now = System.nanoTime(); + long jitter = (jitterMs == 0) ? 0 : ThreadLocalRandom.current().nextInt(-jitterMs, jitterMs + 1); + long due = now + TimeUnit.MILLISECONDS.toNanos(Math.max(0, oneWayMs + jitter)); + if (due < lastInDue) due = lastInDue; // preserve arrival order + lastInDue = due; + + inQ.addLast(new InItem(msg, due)); + scheduleInbound(ctx); + } + + private void scheduleInbound(ChannelHandlerContext ctx) + { + if (inScheduled) return; + inScheduled = true; + drainInbound(ctx); + } + + private void drainInbound(ChannelHandlerContext ctx) + { + Runnable task = new Runnable() + { + @Override + public void run() + { + inScheduled = false; + long now = System.nanoTime(); + while (!inQ.isEmpty() && inQ.peekFirst().dueNs <= now) + { + InItem it = inQ.pollFirst(); + ctx.fireChannelRead(it.msg); + } + if (!inQ.isEmpty()) + { + long delayNs = Math.max(0, inQ.peekFirst().dueNs - System.nanoTime()); + inScheduled = true; + ctx.executor().schedule(this, delayNs, TimeUnit.NANOSECONDS); + } + } + }; + long delayNs = inQ.isEmpty() ? 0 : Math.max(0, inQ.peekFirst().dueNs - System.nanoTime()); + ctx.executor().schedule(task, delayNs, TimeUnit.NANOSECONDS); + } + + // -------- Cleanup -------- + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception + { + // Release any buffered ByteBufs on close to avoid leaks + while (!inQ.isEmpty()) ReferenceCountUtil.release(inQ.pollFirst().msg); + while (!outQ.isEmpty()) + { + OutItem it = outQ.pollFirst(); + if (it.msg != null) ReferenceCountUtil.release(it.msg); + if (it.promise != null && !it.promise.isDone()) it.promise.setFailure(new ClosedChannelException()); + } + super.channelInactive(ctx); + } +} diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index 8a2ce6537..0b0b9ed14 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -475,9 +475,30 @@ else if (b instanceof BulletAirStrike) this.timeSinceRefresh = 0; this.lastUpdateTime = t; - this.action1 = action1; - this.action2 = action2; - this.quickActions = quickActions; + if (ib != null && ib.item != null && ib.item.cooldownBase < 10) + { + // continuous shoot + this.action1 = action1; + this.action2 = action2; + this.quickActions = quickActions; + } + else + { + if (action1 && !this.disabled) + this.action(false); + + if (action2 && !this.disabled) + this.action(true); + + if (!this.disabled) + { + for (int i = 0; i < this.abilities.size(); i++) + { + if (quickActions[i]) + this.quickAction(i); + } + } + } this.posX = this.prevKnownPosX; this.posY = this.prevKnownPosY; From a8dfed626c4df84429f6ee7659f3460752d7c1b9 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sun, 14 Sep 2025 12:08:29 -0700 Subject: [PATCH 24/35] fix: set event data debug to false Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 0524d1592..0b9cc86db 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -151,7 +151,7 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; - public static boolean recordEventData = true; // todo change back to false + public static boolean recordEventData = false; public static boolean enableLatencyTest = false; public static final boolean cinematic = false; From 3ff944234d4b2d22bc3dc625cb4d668af6371c5d Mon Sep 17 00:00:00 2001 From: orangishcat Date: Mon, 15 Sep 2025 15:32:37 -0700 Subject: [PATCH 25/35] perf: use int for quick actions encoding Signed-off-by: orangishcat --- .../event/EventTankControllerUpdateC.java | 39 +++---------------- .../java/tanks/tank/TankPlayerRemote.java | 8 ++-- 2 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java index df02f89f7..c8ea2c045 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java @@ -1,27 +1,16 @@ package tanks.network.event; -import io.netty.buffer.ByteBuf; import tanks.Panel; import tanks.tank.*; public class EventTankControllerUpdateC extends PersonalEvent implements IStackableEvent { - public int tank; - public double posX; - public double posY; - public double vX; - public double vY; - public double angle; - public double mX; - public double mY; - public boolean action1; - public boolean action2; + public int tank, quickActions; + public double posX, posY, vX, vY, angle, mX, mY; + public boolean action1, action2; public double time; public long sysTime = System.currentTimeMillis(); - @NetworkIgnored - public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; - public EventTankControllerUpdateC() { @@ -39,28 +28,12 @@ public EventTankControllerUpdateC(TankPlayerController t) this.angle = t.angle; this.action1 = t.action1; this.action2 = t.action2; - System.arraycopy(t.quickActions, 0, this.quickActions, 0, this.quickActions.length); this.time = Panel.frameFrequency; - } - @Override - public void write(ByteBuf b) - { - super.write(b); - b.writeShort(quickActions.length); - for (boolean b1: quickActions) - b.writeBoolean(b1); + int i = 0; + for (boolean b: t.quickActions) + this.quickActions |= (b ? 1 : 0) << i++; } - - @Override - public void read(ByteBuf b) - { - super.read(b); - int len = b.readShort(); - for (int i = 0; i < len; i++) - this.quickActions[i] = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index 0b0b9ed14..c6dca7a48 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -36,7 +36,7 @@ public class TankPlayerRemote extends TankPlayable implements IServerPlayerTank public boolean forceMotion = true, recoil = false; public boolean action1, action2; - public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; + public int quickActions; public static boolean checkMotion = false; public static boolean weakTimeCheck = false; @@ -128,7 +128,7 @@ public void updateMovement() for (int i = 0; i < this.abilities.size(); i++) { - if (quickActions[i]) + if ((quickActions >> i) % 2 == 1) this.quickAction(i); } } @@ -296,7 +296,7 @@ else if (b.slots[b.selected] instanceof ItemMine.ItemStackMine) lastMaxLiveMines = mlm; } - public void controllerUpdate(double x, double y, double vX, double vY, double angle, double mX, double mY, boolean action1, boolean action2, boolean[] quickActions, double time, long receiveTime) + public void controllerUpdate(double x, double y, double vX, double vY, double angle, double mX, double mY, boolean action1, boolean action2, int quickActions, double time, long receiveTime) { if (this.destroy) return; @@ -494,7 +494,7 @@ else if (b instanceof BulletAirStrike) { for (int i = 0; i < this.abilities.size(); i++) { - if (quickActions[i]) + if ((quickActions >> i) % 2 == 1) this.quickAction(i); } } From 6db2cf01829eb26ad819efa235e37cc0a22a8201 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 8 Nov 2025 12:51:27 -0800 Subject: [PATCH 26/35] chore: update branch Signed-off-by: orangishcat --- src/main/java/tanks/hotbar/ItemBar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tanks/hotbar/ItemBar.java b/src/main/java/tanks/hotbar/ItemBar.java index 89ba65524..0855f2323 100644 --- a/src/main/java/tanks/hotbar/ItemBar.java +++ b/src/main/java/tanks/hotbar/ItemBar.java @@ -190,7 +190,7 @@ public boolean useItem(boolean rightClick) if (this.player != Game.player) { - if (i != slots[selected]) + if (destroy) Game.eventsOut.add(new EventSetItem(this.player, this.selected, this.slots[this.selected])); else Game.eventsOut.add(new EventSetItemCount(this.slots[this.selected].stackSize, this.player.clientID, this.selected)); From b5f74cf6d64415eab4951fd704b5133bf29724be Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 8 Nov 2025 14:06:59 -0800 Subject: [PATCH 27/35] fix: event lay mine Signed-off-by: orangishcat --- src/main/java/tanks/network/event/EventLayMine.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/tanks/network/event/EventLayMine.java b/src/main/java/tanks/network/event/EventLayMine.java index 33c3129d4..621836041 100644 --- a/src/main/java/tanks/network/event/EventLayMine.java +++ b/src/main/java/tanks/network/event/EventLayMine.java @@ -64,7 +64,11 @@ else if (t instanceof TankRemote || t instanceof TankPlayer) if (t2 instanceof TankAIControlled) sm = ((TankAIControlled) ((TankRemote) t).tank).mineItem; else if (t2 instanceof TankPlayer) - sm = ((ItemMine.ItemStackMine)(((TankPlayer) t2).abilities.get(-this.item - 1))); + { + int id = -item - 1; + if (id >= 0 && id < ((TankPlayer) t2).abilities.size()) + sm = ((ItemMine.ItemStackMine) (((TankPlayer) t2).abilities.get(id))); + } } if (sm == null) From 0b6a164d94b1ab8eda9352aee50efa636842dc91 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Mon, 1 Dec 2025 09:10:39 -0800 Subject: [PATCH 28/35] fix: sounds not playing on client side Signed-off-by: orangishcat --- src/main/java/tanks/AreaEffectFreeze.java | 3 ++ src/main/java/tanks/bullet/Bullet.java | 47 ++++++++++++------- .../network/event/EventBulletBounce.java | 25 +++++----- .../network/event/EventBulletDestroyed.java | 2 + 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/main/java/tanks/AreaEffectFreeze.java b/src/main/java/tanks/AreaEffectFreeze.java index 0ba517c86..b27b62385 100644 --- a/src/main/java/tanks/AreaEffectFreeze.java +++ b/src/main/java/tanks/AreaEffectFreeze.java @@ -80,6 +80,9 @@ public void draw() @Override public void update() { + if (this.age <= 0) + Drawing.drawing.playSound("freeze.ogg"); + if (ScreenGame.finishedQuick && this.age < 400) this.age = 400; diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index f757bf41e..5c919f5de 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -380,8 +380,8 @@ public void collidedWithTank(Tank t) t.tookRecoil = true; } - if (this.damage <= 0 && this.playBounceSound) - Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / size)); + if (this.damage <= 0) + playBumpSound(); if (t instanceof TankPlayerRemote) Game.eventsOut.add(new EventTankControllerAddVelocity(t, vX * mul, vY * mul, t.tookRecoil)); @@ -525,10 +525,33 @@ else if (this.tank instanceof TankPlayerRemote) } } } - else if (this.playPopSound && !this.heavy) - Drawing.drawing.playSound("bullet_explode.ogg", (float) (bullet_size / size)); + else if (!this.heavy) + playPopSound(); } + public void playBounceSound() + { + if (this.playBounceSound) + Drawing.drawing.playSound("bounce.ogg", (float) (bullet_size / size)); + } + + public void playBumpSound() + { + playBumpSound(1f); + } + + public void playBumpSound(float volume) + { + if (this.playBounceSound) + Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / size), volume); + } + + public void playPopSound() + { + if (this.playPopSound) + Drawing.drawing.playSound("bullet_explode.ogg", (float) (bullet_size / size)); + } + public void collidedWithObject(Movable o) { if (o instanceof Mine && this.mineCollision) @@ -620,11 +643,8 @@ public void collideBounce(Bullet b) Game.eventsOut.add(new EventBulletBounce(this)); Game.eventsOut.add(new EventBulletBounce(b)); - if (this.playBounceSound && b.playBounceSound) - { - Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / size), 0.5f); - Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / b.size), 0.5f); - } + playBumpSound(0.5f); + b.playBumpSound(0.5f); this.addTrail(); b.addTrail(); @@ -1289,9 +1309,7 @@ else if (m1 instanceof Mine && this.mineCollision && !Team.isAllied(this, m1)) } if (this.destroyTimer <= 0 && Game.effectsEnabled) - { - this.addDestroyEffect(); - } + this.addDestroyEffect(); this.destroyTimer += frameFrequency; this.vX = 0; @@ -1652,10 +1670,7 @@ public void onDestroy() } if (this.freezing) - { - Game.movables.add(new AreaEffectFreeze(this.posX, this.posY)); - Drawing.drawing.playSound("freeze.ogg"); - } + Game.movables.add(new AreaEffectFreeze(this.posX, this.posY)); } if (this.boosting) diff --git a/src/main/java/tanks/network/event/EventBulletBounce.java b/src/main/java/tanks/network/event/EventBulletBounce.java index 9bb5930cd..e2c05a065 100644 --- a/src/main/java/tanks/network/event/EventBulletBounce.java +++ b/src/main/java/tanks/network/event/EventBulletBounce.java @@ -28,17 +28,18 @@ public EventBulletBounce(Bullet b) public void execute() { Bullet b = Bullet.idMap.get(this.bullet); - - if (b != null && this.clientID == null) - { - b.posX = this.posX; - b.posY = this.posY; - b.vX = this.vX; - b.vY = this.vY; - b.collisionX = this.posX; - b.collisionY = this.posY; - b.addTrail(); - } - } + if (b == null || this.clientID != null) + return; + + b.posX = this.posX; + b.posY = this.posY; + b.vX = this.vX; + b.vY = this.vY; + b.collisionX = this.posX; + b.collisionY = this.posY; + b.addTrail(); + + b.playBumpSound(); + } } diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index 7681befae..3cc85cb82 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -41,6 +41,8 @@ public void execute() b.posY = posY; } + b.playPopSound(); + b.destroy = true; Bullet.idMap.remove(b.networkID); } From d96c4cfab7d384611d1448e2b8d08ccca87a569e Mon Sep 17 00:00:00 2001 From: orangishcat Date: Mon, 1 Dec 2025 22:44:02 -0800 Subject: [PATCH 29/35] fix: add sounds back, fix tank health inconsistency Signed-off-by: orangishcat --- src/main/java/tanks/bullet/Bullet.java | 34 ++++++++++---- .../java/tanks/bullet/BulletAirStrike.java | 4 +- .../network/event/EventBulletBounce.java | 2 +- .../network/event/EventTankUpdateHealth.java | 9 +--- src/main/java/tanks/tank/Tank.java | 45 ++++++++++--------- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/src/main/java/tanks/bullet/Bullet.java b/src/main/java/tanks/bullet/Bullet.java index 5c919f5de..dab95ff16 100644 --- a/src/main/java/tanks/bullet/Bullet.java +++ b/src/main/java/tanks/bullet/Bullet.java @@ -492,10 +492,10 @@ else if (this.tank instanceof TankPlayerRemote) } else { - if (this.playPopSound && dmg > 0) - Drawing.drawing.playSound("damage.ogg", (float) (bullet_size / size)); + if (dmg > 0) + playDamageSound(); - if (this.boosting) + if (this.boosting) { EffectManager tem = t.getEffectManager(); AttributeModifier c = AttributeModifier.newInstance("boost_speed", AttributeModifier.velocity, AttributeModifier.Operation.multiply, 3); @@ -529,10 +529,16 @@ else if (!this.heavy) playPopSound(); } + public void playDamageSound() + { + if (this.playPopSound) + Drawing.drawing.playGlobalSound("damage.ogg", (float) (bullet_size / size)); + } + public void playBounceSound() { if (this.playBounceSound) - Drawing.drawing.playSound("bounce.ogg", (float) (bullet_size / size)); + playPitchedSound("bounce.ogg"); } public void playBumpSound() @@ -543,13 +549,23 @@ public void playBumpSound() public void playBumpSound(float volume) { if (this.playBounceSound) - Drawing.drawing.playSound("bump.ogg", (float) (bullet_size / size), volume); + playPitchedSound("bump.ogg", volume); } public void playPopSound() { if (this.playPopSound) - Drawing.drawing.playSound("bullet_explode.ogg", (float) (bullet_size / size)); + playPitchedSound("bullet_explode.ogg"); + } + + public void playPitchedSound(String sound) + { + playPitchedSound(sound, 1f); + } + + public void playPitchedSound(String sound, float volume) + { + Drawing.drawing.playSound(sound, (float) (bullet_size / size), volume); } public void collidedWithObject(Movable o) @@ -728,7 +744,7 @@ public void checkCollisionLocal() if (o.checkForObjects) o.onObjectEntryLocal(this); } - } + } public void checkCollision() { @@ -976,8 +992,8 @@ else if (!down && dy >= 0 && dy < bound && horizontalDist < verticalDist) this.collidedWithNothing(); this.pop(); } - else if (this.playBounceSound) - Drawing.drawing.playSound("bounce.ogg", (float) (bullet_size / size)); + else + this.playBounceSound(); if (!destroy) { diff --git a/src/main/java/tanks/bullet/BulletAirStrike.java b/src/main/java/tanks/bullet/BulletAirStrike.java index cd4a0ddcf..4ab9581a2 100644 --- a/src/main/java/tanks/bullet/BulletAirStrike.java +++ b/src/main/java/tanks/bullet/BulletAirStrike.java @@ -1,7 +1,5 @@ package tanks.bullet; -import basewindow.transformation.Scale; -import basewindow.transformation.Transformation; import tanks.*; import tanks.item.ItemBullet; import tanks.network.event.EventBulletBounce; @@ -104,7 +102,7 @@ public void update() } this.addTrail(true); - Drawing.drawing.playSound("bounce.ogg", (float) (Bullet.bullet_size / this.size)); + this.playBounceSound(); Game.eventsOut.add(new EventBulletBounce(this)); } } diff --git a/src/main/java/tanks/network/event/EventBulletBounce.java b/src/main/java/tanks/network/event/EventBulletBounce.java index e2c05a065..8fc861a08 100644 --- a/src/main/java/tanks/network/event/EventBulletBounce.java +++ b/src/main/java/tanks/network/event/EventBulletBounce.java @@ -40,6 +40,6 @@ public void execute() b.collisionY = this.posY; b.addTrail(); - b.playBumpSound(); + b.playBounceSound(); } } diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index 6221d00ee..42c2b07fa 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -34,14 +34,7 @@ else if (health > t.health) double before = t.health; t.health = health; - - if ((int) before != (int) t.health && t.health >= 1) - { - Effect e = Effect.createNewEffect(t.posX, t.posY, t.posZ + t.size * 0.75, Effect.EffectType.shield); - e.size = t.size; - e.radius = t.health; - Game.effects.add(e); - } + t.addDamageEffect(before); if (t.health <= 0) { diff --git a/src/main/java/tanks/tank/Tank.java b/src/main/java/tanks/tank/Tank.java index d0df13ed1..224a98e07 100644 --- a/src/main/java/tanks/tank/Tank.java +++ b/src/main/java/tanks/tank/Tank.java @@ -993,29 +993,34 @@ else if (finalAmount < 0) this.checkHit(owner, source); - double hf = this.health % 1.0; - if (hf == 0) - hf = 1; + addDamageEffect(prev); - double hf2 = prev % 1.0; - if (hf2 == 0) - hf2 = 1; - - int h = (int) (this.health - hf); - int h2 = (int) (prev - hf2); - - if (h >= 0 && h2 != h) - { - Effect e = Effect.createNewEffect(this.posX, this.posY, this.posZ + this.size * 0.75, Effect.EffectType.shield); - e.size = this.size; - e.radius = h; - Game.effects.add(e); - } - - return this.health <= 0; + return this.health <= 0; } - public void checkHit(Tank owner, GameObject source) + public void addDamageEffect(double prev) + { + double hf = this.health % 1.0; + if (hf == 0) + hf = 1; + + double hf2 = prev % 1.0; + if (hf2 == 0) + hf2 = 1; + + int h = (int) (this.health - hf); + int h2 = (int) (prev - hf2); + + if (h >= 0 && h2 != h) + { + Effect e = Effect.createNewEffect(this.posX, this.posY, this.posZ + this.size * 0.75, Effect.EffectType.shield); + e.size = this.size; + e.radius = h; + Game.effects.add(e); + } + } + + public void checkHit(Tank owner, GameObject source) { if (Crusade.crusadeMode && Crusade.currentCrusade != null && !ScreenPartyLobby.isClient) { From 058a96221f13590aba390b4fbe6e4b4372c829f6 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Mon, 1 Dec 2025 22:55:42 -0800 Subject: [PATCH 30/35] chore: update branch Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index b553b386b..239738d44 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -11,20 +11,11 @@ import tanks.gui.screen.*; import tanks.gui.screen.leveleditor.*; import tanks.gui.screen.leveleditor.selector.*; -import tanks.hotbar.Hotbar; -import tanks.hotbar.ItemBar; -import tanks.item.Item; -import tanks.item.ItemBullet; -import tanks.item.ItemMine; -import tanks.item.ItemShield; -import tanks.minigames.ArcadeBeatBlocks; -import tanks.minigames.ArcadeClassic; -import tanks.minigames.CastleRampage; -import tanks.minigames.Minigame; -import tanks.network.Client; -import tanks.network.NetworkEventMap; -import tanks.network.SteamNetworkHandler; -import tanks.network.SynchronizedList; +import tanks.gui.screen.leveleditor.selector.SelectorColor; +import tanks.hotbar.*; +import tanks.item.*; +import tanks.minigames.*; +import tanks.network.*; import tanks.network.event.*; import tanks.network.event.online.*; import tanks.obstacle.*; From f7c9d1de8e4863382dbb7278315ffcd0dd8cd518 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Thu, 4 Dec 2025 10:00:43 -0800 Subject: [PATCH 31/35] chore: update branch, fix build errors Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 47 +++++++------------------ src/main/java/tanks/hotbar/ItemBar.java | 2 +- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index d26a0eb5c..37dc633c6 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -1,50 +1,29 @@ package tanks; -import basewindow.BaseFile; -import basewindow.BaseFileManager; -import basewindow.BaseWindow; -import basewindow.ShaderGroup; +import basewindow.*; import com.codedisaster.steamworks.SteamMatchmaking; import it.unimi.dsi.fastutil.objects.ObjectArraySet; import tanks.bullet.*; -import tanks.extension.Extension; -import tanks.extension.ExtensionRegistry; -import tanks.generator.LevelGenerator; -import tanks.generator.LevelGeneratorRandom; -import tanks.gui.Button; -import tanks.gui.ChatFilter; -import tanks.gui.input.InputBindingGroup; -import tanks.gui.input.InputBindings; +import tanks.extension.*; +import tanks.generator.*; +import tanks.gui.*; +import tanks.gui.input.*; import tanks.gui.screen.*; -import tanks.gui.screen.leveleditor.OverlayEditorMenu; -import tanks.gui.screen.leveleditor.ScreenLevelEditor; +import tanks.gui.screen.leveleditor.*; import tanks.gui.screen.leveleditor.selector.*; -import tanks.hotbar.Hotbar; -import tanks.hotbar.ItemBar; -import tanks.item.Item; -import tanks.item.ItemBullet; -import tanks.item.ItemMine; -import tanks.item.ItemShield; -import tanks.minigames.ArcadeBeatBlocks; -import tanks.minigames.ArcadeClassic; -import tanks.minigames.Minigame; -import tanks.network.Client; -import tanks.network.NetworkEventMap; -import tanks.network.SteamNetworkHandler; -import tanks.network.SynchronizedList; +import tanks.gui.screen.leveleditor.selector.SelectorColor; +import tanks.hotbar.*; +import tanks.item.*; +import tanks.minigames.*; +import tanks.network.*; import tanks.network.event.*; import tanks.network.event.online.*; import tanks.obstacle.*; import tanks.registry.*; -import tanks.rendering.ShaderGroundIntro; -import tanks.rendering.ShaderGroundOutOfBounds; -import tanks.rendering.ShaderTracks; +import tanks.rendering.*; import tanks.tank.*; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; +import java.io.*; import java.util.*; public class Game diff --git a/src/main/java/tanks/hotbar/ItemBar.java b/src/main/java/tanks/hotbar/ItemBar.java index bd9d3eecb..a653ffea3 100644 --- a/src/main/java/tanks/hotbar/ItemBar.java +++ b/src/main/java/tanks/hotbar/ItemBar.java @@ -199,7 +199,7 @@ public boolean useItem(boolean rightClick) if (destroy) Game.eventsOut.add(new EventSetItem(this.player, this.selected, this.slots[this.selected])); else - Game.eventsOut.add(new EventSetItemCount(this.player, this.selected, this.slots[this.selected].stackSize)); + Game.eventsOut.add(new EventSetItemCount(this.slots[this.selected].stackSize, this.player.clientID, this.selected)); } if (destroy && Game.currentLevel instanceof Arcade) From 15c9203c8512610b9f23cd93de3f290f478b99e0 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 28 Mar 2026 23:16:57 -0700 Subject: [PATCH 32/35] chore: merge branch Signed-off-by: orangishcat --- src/main/java/tanks/Game.java | 3 +- src/main/java/tanks/Panel.java | 18 ++- .../java/tanks/gui/screen/ScreenDebug.java | 3 +- src/main/java/tanks/hotbar/ItemBar.java | 2 +- .../java/tanks/network/ClientHandler.java | 6 +- .../java/tanks/network/MessageReader.java | 19 ++- .../java/tanks/network/NetworkHandler.java | 125 ------------------ src/main/java/tanks/network/NetworkUtils.java | 4 +- .../java/tanks/network/ServerHandler.java | 14 +- .../tanks/network/event/INetworkEvent.java | 77 ++++++++++- .../tanks/network/event/IStackableEvent.java | 8 ++ src/main/java/tanks/tank/Explosion.java | 1 + 12 files changed, 123 insertions(+), 157 deletions(-) delete mode 100644 src/main/java/tanks/network/NetworkHandler.java diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 1f6924920..e0337a6f4 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -135,6 +135,7 @@ public int hashCode() public static boolean drawFaces = false; public static boolean drawAvoidObjects = false; public static boolean recordMovableData = false; + public static boolean recordEventData = false; public static final boolean cinematic = false; public static long steamLobbyInvite = -1; @@ -159,7 +160,7 @@ public int hashCode() public static boolean vsync = true; public static int maxFPS = 0; - public static int networkRate = 60; + public static int networkRate = 20; public static boolean enable3d = true; public static boolean enable3dBg = true; diff --git a/src/main/java/tanks/Panel.java b/src/main/java/tanks/Panel.java index 52e92f944..ed26713fe 100644 --- a/src/main/java/tanks/Panel.java +++ b/src/main/java/tanks/Panel.java @@ -3,11 +3,9 @@ import basewindow.InputCodes; import tanks.extension.Extension; import tanks.gui.*; -import tanks.gui.ScreenElement.CenterMessage; -import tanks.gui.ScreenElement.Notification; +import tanks.gui.ScreenElement.*; import tanks.gui.screen.*; -import tanks.gui.screen.leveleditor.ScreenLevelEditor; -import tanks.gui.screen.leveleditor.ScreenLevelEditorOverlay; +import tanks.gui.screen.leveleditor.*; import tanks.item.Item; import tanks.network.*; import tanks.network.event.*; @@ -16,8 +14,7 @@ import tanks.rendering.*; import tanks.tank.*; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.*; public class Panel { @@ -911,6 +908,15 @@ public void draw() this.drawBar(); } + if (Game.recordEventData && (ScreenPartyHost.isServer || ScreenPartyLobby.isClient)) + { + Drawing.drawing.setColor(255, 255, 255); + Drawing.drawing.setInterfaceFontSize(16); + double y = Drawing.drawing.getInterfaceEdgeY(true) - 20; + for (String s : MessageReader.eventBytesPerSecText) + Drawing.drawing.drawUncenteredInterfaceText(10, y -= 20, s); + } + if (!notifications.isEmpty()) { double sy = 0; diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index a1df399e6..503642566 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -30,13 +30,14 @@ public class ScreenDebug extends Screen Button drawAvoidObjects = createToggle("Draw avoid objects: ", b -> Game.drawAvoidObjects = b, () -> Game.drawAvoidObjects); Button disableFixes = createToggle("Disable fixes: ", b -> Game.disableErrorFixing = b, () -> Game.disableErrorFixing); Button recordMovableData = createToggle("Record movable data: ", b -> Game.recordMovableData = b, () -> Game.recordMovableData); + Button recordEventData = createToggle("Record event data: ", b -> Game.recordEventData = b, () -> Game.recordEventData); Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 5, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); public ButtonList debugButtons = new ButtonList(new ArrayList<>(Arrays.asList( test, traceAllRays, firstPerson, followingCam, destroyCheat, invulnerable, fancyLighting, tankIDs, showPathfinding, drawFaces, showUpdatingObstacles, - drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData + drawAutoZoom, immutableFaces, drawAvoidObjects, disableFixes, recordMovableData, recordEventData )), 0, 0, -30); public Button createToggle(String text, Consumer setter, Producer getter) diff --git a/src/main/java/tanks/hotbar/ItemBar.java b/src/main/java/tanks/hotbar/ItemBar.java index cc6e8d580..054499f71 100644 --- a/src/main/java/tanks/hotbar/ItemBar.java +++ b/src/main/java/tanks/hotbar/ItemBar.java @@ -195,7 +195,7 @@ public boolean useItem(boolean rightClick) if (destroy) Game.eventsOut.add(new EventSetItem(this.player, this.selected, this.slots[this.selected])); else - Game.eventsOut.add(new EventSetItemCount(this.slots[this.selected].stackSize, this.player.clientID, this.selected)); + Game.eventsOut.add(new EventSetItemCount(this.player, this.selected, this.slots[this.selected].stackSize)); } if (destroy && Game.currentLevel instanceof Arcade) diff --git a/src/main/java/tanks/network/ClientHandler.java b/src/main/java/tanks/network/ClientHandler.java index 87550097b..fe9d4b785 100644 --- a/src/main/java/tanks/network/ClientHandler.java +++ b/src/main/java/tanks/network/ClientHandler.java @@ -117,8 +117,10 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) e.write(b); ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(b.readableBytes()); - MessageReader.upstreamBytes += b.readableBytes() + 4; + int rb = b.readableBytes(); + b2.writeInt(rb); + MessageReader.upstreamBytes += rb + 4; + MessageReader.eventBytes.put(i, MessageReader.eventBytes.getOrDefault(i, 0) + rb + 4); MessageReader.updateLastMessageTime(); b2.writeBytes(b); diff --git a/src/main/java/tanks/network/MessageReader.java b/src/main/java/tanks/network/MessageReader.java index acebde3ad..d2a9de858 100644 --- a/src/main/java/tanks/network/MessageReader.java +++ b/src/main/java/tanks/network/MessageReader.java @@ -1,14 +1,14 @@ package tanks.network; +import io.netty.buffer.ByteBuf; import tanks.Game; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.event.*; import tanks.network.event.online.IOnlineServerEvent; +import tanks.translation.Translation; -import io.netty.buffer.ByteBuf; - -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; public class MessageReader { @@ -18,8 +18,11 @@ public class MessageReader public static int upstreamBytes; public static long lastMessageTime; + public static HashMap eventBytes = new HashMap<>(); + public static int upstreamBytesPerSec; public static int downstreamBytesPerSec; + public static List eventBytesPerSecText = new ArrayList<>(); public boolean useQueue = true; public ByteBuf queue; @@ -33,7 +36,6 @@ public void queueMessage(ClientHandler c, ByteBuf m, UUID clientID) this.queueMessage(null, c, m, clientID); } - public void queueMessage(ServerHandler s, ByteBuf m, UUID clientID) { this.queueMessage(s, null, m, clientID); @@ -215,6 +217,11 @@ public static void updateLastMessageTime() lastMessageTime = time; upstreamBytesPerSec = upstreamBytes; downstreamBytesPerSec = downstreamBytes; + eventBytesPerSecText = eventBytes.entrySet().stream() + .sorted(Comparator.comparingInt(Map.Entry::getValue)) + .map(entry -> Translation.translate("%s: %.2f KB/s", NetworkEventMap.get(entry.getKey()).getSimpleName(), entry.getValue() / 1024.)) + .collect(Collectors.toList()); + eventBytes.clear(); upstreamBytes = 0; downstreamBytes = 0; } diff --git a/src/main/java/tanks/network/NetworkHandler.java b/src/main/java/tanks/network/NetworkHandler.java deleted file mode 100644 index 498872c4d..000000000 --- a/src/main/java/tanks/network/NetworkHandler.java +++ /dev/null @@ -1,125 +0,0 @@ -package tanks.network; - -import com.codedisaster.steamworks.*; -import io.netty.buffer.ByteBuf; -import io.netty.channel.*; -import io.netty.util.ReferenceCountUtil; -import it.unimi.dsi.fastutil.ints.*; -import tanks.*; -import tanks.network.event.*; - -import java.util.*; - -public abstract class NetworkHandler extends ChannelInboundHandlerAdapter -{ - public ChannelHandlerContext ctx; - public SteamID steamID; - - protected SynchronizedList events = new SynchronizedList<>(); - protected Int2ObjectLinkedOpenHashMap stackedEvents = new Int2ObjectLinkedOpenHashMap<>(); - - public boolean joined = false, closed = false; - - public MessageReader reader = new MessageReader(); - - protected long lastStackedEventSend = 0; - - public void reply() - { - synchronized (this.events) - { - long time = System.currentTimeMillis() * Game.networkRate / 1000; - boolean sendStacked = time != lastStackedEventSend; - - int i = 0; - for (INetworkEvent e : this.events) - { - if (e instanceof IStackableEvent && ((IStackableEvent) e).isStackable()) - stackedEvents.put(IStackableEvent.key((IStackableEvent) e), (IStackableEvent) e); - else - sendEvent(e, i++ >= this.events.size() - 1 && (!sendStacked || stackedEvents.isEmpty())); - } - - if (sendStacked) - { - lastStackedEventSend = time; - i = 0; - for (IStackableEvent e : stackedEvents.values()) - sendEvent(e, i++ >= stackedEvents.size() - 1); - stackedEvents.clear(); - } - - if (steamID == null) - this.ctx.flush(); - - this.events.clear(); - } - } - - public synchronized void sendEvent(INetworkEvent e) - { - this.sendEvent(e, true); - } - - public synchronized void sendEvent(INetworkEvent e, boolean flush) - { - if (steamID != null) - { - SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; - - if (flush) - sendType = SteamNetworking.P2PSend.Reliable; - - Game.steamNetworkHandler.send(steamID.getAccountID(), e, sendType); - return; - } - - ByteBuf b = ctx.channel().alloc().buffer(); - - int i = NetworkEventMap.get(e.getClass()); - if (i == -1) - throw new RuntimeException("The network event " + e.getClass() + " has not been registered!"); - - b.writeShort(i); - e.write(b); - - int rb = b.readableBytes(); - ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(rb); - MessageReader.upstreamBytes += rb + 4; - if (Game.recordEventData) - MessageReader.eventBytes.addTo(i, rb + 4); - MessageReader.updateLastMessageTime(); - b2.writeBytes(b); - - if (flush) - ctx.channel().writeAndFlush(b2); - else - ctx.channel().write(b2); - - ReferenceCountUtil.release(b); - } - - public synchronized void sendEventAndClose(INetworkEvent e) - { - this.closed = true; - if (steamID != null) - Game.steamNetworkHandler.send(steamID.getAccountID(), e, SteamNetworking.P2PSend.Reliable); - else - this.sendEvent(e); - - if (ctx != null) - ctx.close(); - - if (steamID != null) - Game.steamNetworkHandler.queueClose(steamID.getAccountID()); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) - { - cause.printStackTrace(); - - ctx.close(); - } -} diff --git a/src/main/java/tanks/network/NetworkUtils.java b/src/main/java/tanks/network/NetworkUtils.java index 5ee834c89..04f428357 100644 --- a/src/main/java/tanks/network/NetworkUtils.java +++ b/src/main/java/tanks/network/NetworkUtils.java @@ -1,11 +1,9 @@ package tanks.network; import basewindow.Color; - import io.netty.buffer.ByteBuf; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; +import java.nio.charset.*; public class NetworkUtils { diff --git a/src/main/java/tanks/network/ServerHandler.java b/src/main/java/tanks/network/ServerHandler.java index 48602dfbd..4b7aad7ae 100644 --- a/src/main/java/tanks/network/ServerHandler.java +++ b/src/main/java/tanks/network/ServerHandler.java @@ -223,16 +223,8 @@ public synchronized void sendEvent(INetworkEvent e) this.sendEvent(e, true); } - public HashMap eventFrequencies = new HashMap<>(); - public synchronized void sendEvent(INetworkEvent e, boolean flush) { - String n = e.getClass().getSimpleName(); - if (!eventFrequencies.containsKey(n)) - eventFrequencies.put(n, 0); - - eventFrequencies.put(n, eventFrequencies.get(n) + 1); - if (steamID != null) { SteamNetworking.P2PSend sendType = SteamNetworking.P2PSend.ReliableWithBuffering; @@ -254,8 +246,10 @@ public synchronized void sendEvent(INetworkEvent e, boolean flush) e.write(b); ByteBuf b2 = ctx.channel().alloc().buffer(); - b2.writeInt(b.readableBytes()); - MessageReader.upstreamBytes += b.readableBytes() + 4; + int rb = b.readableBytes(); + b2.writeInt(rb); + MessageReader.upstreamBytes += rb + 4; + MessageReader.eventBytes.put(i, MessageReader.eventBytes.getOrDefault(i, 0) + rb + 4); MessageReader.updateLastMessageTime(); b2.writeBytes(b); diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index ba4fe8f29..925210aae 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -1,12 +1,85 @@ package tanks.network.event; +import basewindow.Color; import io.netty.buffer.ByteBuf; +import tanks.network.NetworkUtils; +import tanks.tankson.ReflectionHandle; + +import java.lang.annotation.*; +import java.util.UUID; public interface INetworkEvent extends IEvent { - void write(ByteBuf b); + ReflectionHandle handle = new ReflectionHandle() + .setFieldFilter(f -> !f.isAnnotationPresent(NetworkIgnored.class)) + .registerTypeHandle(int.class, Integer.class, ByteBuf::readInt, ByteBuf::writeInt) + .registerTypeHandle(long.class, Long.class, ByteBuf::readLong, ByteBuf::writeLong) + .registerTypeHandle(float.class, Float.class, ByteBuf::readFloat, ByteBuf::writeFloat) + .registerTypeHandle(double.class, Double.class, INetworkEvent::readDouble, INetworkEvent::writeDouble) + .registerTypeHandle(boolean.class, Boolean.class, ByteBuf::readBoolean, ByteBuf::writeBoolean) + .registerTypeHandle(String.class, NetworkUtils::readString, NetworkUtils::writeString) + .registerTypeHandle(Color.class, INetworkEvent::readColor, NetworkUtils::writeColor) + .registerTypeHandle(UUID.class, INetworkEvent::readUUID, INetworkEvent::writeUUID); + + static double readDouble(ByteBuf b) + { + return b.readFloat(); + } + + static void writeDouble(ByteBuf b, double d) + { + b.writeFloat((float) d); + } + + static UUID readUUID(ByteBuf b) + { + String s = NetworkUtils.readString(b); + if (s == null) + return null; + return UUID.fromString(s); + } - void read(ByteBuf b); + static void writeUUID(ByteBuf b, UUID uuid) + { + NetworkUtils.writeString(b, uuid != null ? uuid.toString() : null); + } + + static Color readColor(ByteBuf b) + { + Color c = new Color(); + NetworkUtils.readColor(b, c); + return c; + } + + default void write(ByteBuf b) + { + try + { + handle.writeObject(b, this); + } + catch (Exception e) + { + throw new RuntimeException("Writing event " + this.getClass().getSimpleName() + " failed: " + e, e); + } + } + + default void read(ByteBuf b) + { + try + { + handle.readObject(b, this); + } + catch (Exception e) + { + throw new RuntimeException("Reading event " + this.getClass().getSimpleName() + " failed: " + e, e); + } + } void execute(); + + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + @interface NetworkIgnored + { + } } diff --git a/src/main/java/tanks/network/event/IStackableEvent.java b/src/main/java/tanks/network/event/IStackableEvent.java index 8c5a98034..37de93e1f 100644 --- a/src/main/java/tanks/network/event/IStackableEvent.java +++ b/src/main/java/tanks/network/event/IStackableEvent.java @@ -1,5 +1,8 @@ package tanks.network.event; +import tanks.network.NetworkEventMap; + +/** Given multiple events that implement this, if they have the same identifier, only the latest one is sent */ public interface IStackableEvent extends INetworkEvent { int getIdentifier(); @@ -9,6 +12,11 @@ default boolean isStackable() return true; } + static int key(IStackableEvent e) + { + return f(NetworkEventMap.get(e.getClass()) + f(e.getIdentifier())); + } + static int f(int i) { return 1664525 * i + 1013904223; diff --git a/src/main/java/tanks/tank/Explosion.java b/src/main/java/tanks/tank/Explosion.java index 627dce86d..c8a0e4ff6 100644 --- a/src/main/java/tanks/tank/Explosion.java +++ b/src/main/java/tanks/tank/Explosion.java @@ -217,6 +217,7 @@ public void explode() for (Obstacle o: Obstacle.getObstaclesInRadius(posX, posY, radius + Game.tile_size / 2)) { if (!o.destructible) continue; + Game.eventsOut.add(new EventObstacleDestroy(o.posX, o.posY, o.name, posX, posY, radius)); o.onDestroy(this); o.playDestroyAnimation(this.posX, this.posY, this.radius); } From ef69f2b4018ad756e884d0430f030622043a3f00 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Sat, 28 Mar 2026 23:44:17 -0700 Subject: [PATCH 33/35] chore: delete all the read and write methods Signed-off-by: orangishcat --- .../tanks/bullet/BulletReboundIndicator.java | 6 +- .../java/tanks/network/NetworkEventMap.java | 37 ++++++++- .../network/event/EventAddObstacleBullet.java | 27 +------ .../tanks/network/event/EventAirdropTank.java | 18 ----- .../event/EventAnnounceConnection.java | 22 ----- .../event/EventArcadeClearMovables.java | 18 +---- .../network/event/EventArcadeFrenzy.java | 17 +--- .../event/EventBeginLevelCountdown.java | 12 --- .../network/event/EventBulletBounce.java | 20 ----- .../network/event/EventBulletDestroyed.java | 16 ---- .../event/EventBulletInstantWaypoint.java | 16 ---- .../event/EventBulletReboundIndicator.java | 54 +++++-------- .../network/event/EventBulletStunEffect.java | 14 ---- .../event/EventBulletUpdateTarget.java | 15 ---- .../event/EventChangeBackgroundColor.java | 24 ------ .../java/tanks/network/event/EventChat.java | 12 --- .../tanks/network/event/EventChatClear.java | 12 --- .../tanks/network/event/EventClearShop.java | 12 --- .../network/event/EventConnectionSuccess.java | 12 --- .../event/EventCreateFreezeEffect.java | 20 +---- .../tanks/network/event/EventEnterLevel.java | 12 --- .../tanks/network/event/EventExplosion.java | 26 ------ .../tanks/network/event/EventItemDrop.java | 19 ----- .../tanks/network/event/EventItemPickup.java | 14 ---- .../java/tanks/network/event/EventKick.java | 18 +---- .../tanks/network/event/EventLayMine.java | 25 +----- .../tanks/network/event/EventLevelExit.java | 12 --- .../network/event/EventLevelFinished.java | 8 -- .../tanks/network/event/EventLoadLevel.java | 25 +----- .../tanks/network/event/EventMutePlayer.java | 13 --- .../java/tanks/network/event/EventNudge.java | 13 --- .../event/EventObstacleBoostPanelEffect.java | 18 ----- .../network/event/EventObstacleDestroy.java | 24 ------ .../event/EventObstacleShrubberyBurn.java | 22 +---- .../network/event/EventPendingJoinParty.java | 14 ---- .../java/tanks/network/event/EventPing.java | 17 +--- .../event/EventPlayerAutoReadyConfirm.java | 12 --- .../tanks/network/event/EventPlayerChat.java | 18 ----- .../tanks/network/event/EventPlayerReady.java | 18 +---- .../network/event/EventPlayerRevealBuild.java | 14 ---- .../network/event/EventPlayerSetBuild.java | 12 --- .../network/event/EventPurchaseBuild.java | 12 --- .../network/event/EventReturnToCrusade.java | 18 ----- .../network/event/EventReturnToLobby.java | 12 --- .../network/event/EventSendClientDetails.java | 18 ----- .../network/event/EventSendTankColors.java | 22 +---- .../tanks/network/event/EventSetItem.java | 16 ---- .../network/event/EventSetItemBarSlot.java | 17 +--- .../network/event/EventSetItemCount.java | 22 +---- .../network/event/EventSetSelectedItems.java | 16 ---- .../tanks/network/event/EventSetupHotbar.java | 16 ---- .../network/event/EventShareCrusade.java | 22 +---- .../tanks/network/event/EventShareLevel.java | 16 ---- .../tanks/network/event/EventShootBullet.java | 30 ------- .../network/event/EventShowCrusadeStats.java | 18 ----- .../event/EventTankAddAttributeModifier.java | 35 -------- .../tanks/network/event/EventTankCharge.java | 14 ---- .../event/EventTankControllerUpdateC.java | 47 +---------- .../event/EventTankControllerUpdateS.java | 14 ---- .../tanks/network/event/EventTankCreate.java | 33 +------- .../network/event/EventTankCustomCreate.java | 36 --------- .../network/event/EventTankMimicLaser.java | 16 ---- .../event/EventTankMimicTransform.java | 14 ---- .../network/event/EventTankPlayerCreate.java | 43 +--------- .../tanks/network/event/EventTankSpawn.java | 24 ------ .../network/event/EventTankTeleport.java | 31 ------- .../event/EventTankTransformCustom.java | 81 +------------------ .../event/EventTankTransformPreset.java | 16 ---- .../tanks/network/event/EventTankUpdate.java | 24 ------ .../network/event/EventTankUpdateColor.java | 23 ------ .../network/event/EventTankUpdateHealth.java | 14 ---- .../event/EventTankUpdateVisibility.java | 14 ---- .../tanks/network/event/EventUpdateCoins.java | 14 ---- .../event/EventUpdateEliminatedPlayers.java | 19 +---- .../event/EventUpdateReadyPlayers.java | 16 ---- .../event/EventUpdateRemainingLives.java | 13 --- .../network/event/EventUpdateTankAbility.java | 17 ---- .../tanks/network/event/INetworkEvent.java | 18 +---- .../network/event/online/EventAddShape.java | 34 -------- .../network/event/online/EventRemoveText.java | 12 --- .../event/online/EventSilentDisconnect.java | 14 ---- .../java/tanks/tank/TankPlayerRemote.java | 5 +- 82 files changed, 88 insertions(+), 1546 deletions(-) diff --git a/src/main/java/tanks/bullet/BulletReboundIndicator.java b/src/main/java/tanks/bullet/BulletReboundIndicator.java index 88bc480d3..c1970291d 100644 --- a/src/main/java/tanks/bullet/BulletReboundIndicator.java +++ b/src/main/java/tanks/bullet/BulletReboundIndicator.java @@ -27,13 +27,13 @@ public BulletReboundIndicator(Bullet b) Game.eventsOut.add(new EventBulletReboundIndicator(this)); } - public BulletReboundIndicator(double posX, double posY, double posZ, double size, double maxAge, double r1, double g1, double b1, double r2, double g2, double b2) + public BulletReboundIndicator(double posX, double posY, double posZ, double size, double maxAge, Color color, Color color2) { super(posX, posY); this.posZ = posZ; this.size = size; - this.color.set(r1, g1, b1); - this.color2.set(r2, g2, b2); + this.color = color; + this.color2 = color2; this.maxAge = maxAge; } diff --git a/src/main/java/tanks/network/NetworkEventMap.java b/src/main/java/tanks/network/NetworkEventMap.java index 7d659890d..1e8bc6d19 100644 --- a/src/main/java/tanks/network/NetworkEventMap.java +++ b/src/main/java/tanks/network/NetworkEventMap.java @@ -1,7 +1,9 @@ package tanks.network; +import io.netty.buffer.*; import tanks.Game; import tanks.network.event.INetworkEvent; +import tanks.tankson.ReflectionHandle; import java.util.HashMap; @@ -13,18 +15,45 @@ public class NetworkEventMap public static void register(Class c) { + map1.put(id, c); + map2.put(c, id); + id++; + + if (!Game.debug) + return; + try { c.getConstructor(); } catch (Exception e) { - Game.exitToCrash(new RuntimeException("The network event " + c + " does not have a no-parameter constructor. Please give it one.")); + Game.exitToCrash(new RuntimeException("The network event " + c + " does not have a no-parameter" + + " constructor. Please give it one.")); } - map1.put(id, c); - map2.put(c, id); - id++; + ByteBuf b = Unpooled.buffer(); + INetworkEvent e; + try + { + e = c.getConstructor().newInstance(); + e.write(b); + e.read(b); + if (b.readableBytes() > 0) + throw new IndexOutOfBoundsException("Readable bytes > 0 after read"); + } + catch (ReflectionHandle.MissingHandleException exc) + { + throw new RuntimeException("Missing handle in " + c.getSimpleName() + ": " + exc.getMessage()); + } + catch (IndexOutOfBoundsException exc) + { + throw new RuntimeException("Read does not match write in " + c.getSimpleName() + ": " + exc.getMessage()); + } + catch (Exception ignored) + { + + } } public static int get(Class c) diff --git a/src/main/java/tanks/network/event/EventAddObstacleBullet.java b/src/main/java/tanks/network/event/EventAddObstacleBullet.java index d8235fd7e..84364a4c7 100644 --- a/src/main/java/tanks/network/event/EventAddObstacleBullet.java +++ b/src/main/java/tanks/network/event/EventAddObstacleBullet.java @@ -1,10 +1,7 @@ package tanks.network.event; import tanks.Game; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleStackable; - -import io.netty.buffer.ByteBuf; +import tanks.obstacle.*; public class EventAddObstacleBullet extends PersonalEvent { @@ -30,28 +27,6 @@ public EventAddObstacleBullet(Obstacle o, boolean success) this.success = success; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - b.writeBoolean(this.success); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.colorR = b.readDouble(); - this.colorG = b.readDouble(); - this.colorB = b.readDouble(); - this.success = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventAirdropTank.java b/src/main/java/tanks/network/event/EventAirdropTank.java index 2ed811fdf..c57e0a2a1 100644 --- a/src/main/java/tanks/network/event/EventAirdropTank.java +++ b/src/main/java/tanks/network/event/EventAirdropTank.java @@ -46,22 +46,4 @@ public void execute() Game.movables.add(new Crate(new TankRemote(t), height)); } } - - @Override - public void read(ByteBuf b) - { - super.read(b); - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - this.height = b.readDouble(); - } - - @Override - public void write(ByteBuf b) - { - super.write(b); - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - b.writeDouble(this.height); - } } diff --git a/src/main/java/tanks/network/event/EventAnnounceConnection.java b/src/main/java/tanks/network/event/EventAnnounceConnection.java index bea8266fc..958d499cb 100644 --- a/src/main/java/tanks/network/event/EventAnnounceConnection.java +++ b/src/main/java/tanks/network/event/EventAnnounceConnection.java @@ -2,9 +2,6 @@ import tanks.gui.screen.ScreenPartyLobby; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; import java.util.UUID; @@ -65,23 +62,4 @@ public void execute() } } } - - @Override - public void read(ByteBuf b) - { - this.joined = b.readBoolean(); - this.clientIdTarget = UUID.fromString(NetworkUtils.readString(b)); - this.name = NetworkUtils.readString(b); - this.isBot = b.readBoolean(); - } - - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.joined); - NetworkUtils.writeString(b, this.clientIdTarget.toString()); - NetworkUtils.writeString(b, this.name); - b.writeBoolean(this.isBot); - } - } diff --git a/src/main/java/tanks/network/event/EventArcadeClearMovables.java b/src/main/java/tanks/network/event/EventArcadeClearMovables.java index 3861cfc10..84d05bf92 100644 --- a/src/main/java/tanks/network/event/EventArcadeClearMovables.java +++ b/src/main/java/tanks/network/event/EventArcadeClearMovables.java @@ -1,26 +1,10 @@ package tanks.network.event; -import tanks.Game; -import tanks.Movable; +import tanks.*; import tanks.tank.*; -import io.netty.buffer.ByteBuf; - public class EventArcadeClearMovables extends PersonalEvent { - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventArcadeFrenzy.java b/src/main/java/tanks/network/event/EventArcadeFrenzy.java index ae8d582d2..1cd90c42b 100644 --- a/src/main/java/tanks/network/event/EventArcadeFrenzy.java +++ b/src/main/java/tanks/network/event/EventArcadeFrenzy.java @@ -1,25 +1,10 @@ package tanks.network.event; -import tanks.Drawing; -import tanks.Game; +import tanks.*; import tanks.minigames.Arcade; -import io.netty.buffer.ByteBuf; - public class EventArcadeFrenzy extends PersonalEvent { - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java index afb52faff..7fa414b5d 100644 --- a/src/main/java/tanks/network/event/EventBeginLevelCountdown.java +++ b/src/main/java/tanks/network/event/EventBeginLevelCountdown.java @@ -22,16 +22,4 @@ public void execute() ((ScreenGame) Game.screen).cancelCountdown = false; } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventBulletBounce.java b/src/main/java/tanks/network/event/EventBulletBounce.java index b021566b8..8dfa1013f 100644 --- a/src/main/java/tanks/network/event/EventBulletBounce.java +++ b/src/main/java/tanks/network/event/EventBulletBounce.java @@ -26,26 +26,6 @@ public EventBulletBounce(Bullet b) this.vY = b.vY; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBulletDestroyed.java b/src/main/java/tanks/network/event/EventBulletDestroyed.java index 34198bea9..b714a5f9e 100644 --- a/src/main/java/tanks/network/event/EventBulletDestroyed.java +++ b/src/main/java/tanks/network/event/EventBulletDestroyed.java @@ -50,20 +50,4 @@ public void execute() Bullet.idMap.remove(b.networkID); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java index 3b6be3d9a..6227f33b3 100644 --- a/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java +++ b/src/main/java/tanks/network/event/EventBulletInstantWaypoint.java @@ -24,22 +24,6 @@ public EventBulletInstantWaypoint(BulletInstant b, double x, double y) this.posY = y; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java index 97be2fc17..b1aed27d3 100644 --- a/src/main/java/tanks/network/event/EventBulletReboundIndicator.java +++ b/src/main/java/tanks/network/event/EventBulletReboundIndicator.java @@ -1,14 +1,13 @@ package tanks.network.event; +import basewindow.Color; import tanks.Game; import tanks.bullet.BulletReboundIndicator; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; public class EventBulletReboundIndicator extends PersonalEvent { - public BulletReboundIndicator indicator; + public double posX, posY, posZ, size, maxAge; + public Color color1, color2; public EventBulletReboundIndicator() { @@ -17,42 +16,27 @@ public EventBulletReboundIndicator() public EventBulletReboundIndicator(BulletReboundIndicator b) { - this.indicator = b; - } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(indicator.posX); - b.writeDouble(indicator.posY); - b.writeDouble(indicator.posZ); - b.writeDouble(indicator.size); - b.writeDouble(indicator.maxAge); - NetworkUtils.writeColor(b, indicator.color); - NetworkUtils.writeColor(b, indicator.color2); - } - - @Override - public void read(ByteBuf b) - { - this.indicator = new BulletReboundIndicator( - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble(), - b.readDouble()); + this.posX = b.posX; + this.posY = b.posY; + this.posZ = b.posZ; + this.size = b.size; + this.maxAge = b.maxAge; + this.color1 = b.color; + this.color2 = b.color2; } @Override public void execute() { if (this.clientID == null) - Game.movables.add(indicator); + Game.movables.add(new BulletReboundIndicator( + this.posX, + this.posY, + this.posZ, + this.size, + this.maxAge, + this.color1, + this.color2 + )); } } diff --git a/src/main/java/tanks/network/event/EventBulletStunEffect.java b/src/main/java/tanks/network/event/EventBulletStunEffect.java index 53c03d07c..8049d24df 100644 --- a/src/main/java/tanks/network/event/EventBulletStunEffect.java +++ b/src/main/java/tanks/network/event/EventBulletStunEffect.java @@ -43,18 +43,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.length); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.length = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java index 57827bc11..f6e25913f 100644 --- a/src/main/java/tanks/network/event/EventBulletUpdateTarget.java +++ b/src/main/java/tanks/network/event/EventBulletUpdateTarget.java @@ -24,21 +24,6 @@ public EventBulletUpdateTarget(Bullet b) else this.target = b.homingTarget.networkID; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.bullet); - b.writeInt(this.target); - } - - @Override - public void read(ByteBuf b) - { - this.bullet = b.readInt(); - this.target = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java index 55d70131c..5128a9db5 100644 --- a/src/main/java/tanks/network/event/EventChangeBackgroundColor.java +++ b/src/main/java/tanks/network/event/EventChangeBackgroundColor.java @@ -33,30 +33,6 @@ public EventChangeBackgroundColor(int r, int g, int b, int noiseR, int noiseG, i this.noiseB = noiseB; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.colorR); - b.writeInt(this.colorG); - b.writeInt(this.colorB); - - b.writeInt(this.noiseR); - b.writeInt(this.noiseG); - b.writeInt(this.noiseB); - } - - @Override - public void read(ByteBuf b) - { - this.colorR = b.readInt(); - this.colorG = b.readInt(); - this.colorB = b.readInt(); - - this.noiseR = b.readInt(); - this.noiseG = b.readInt(); - this.noiseB = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventChat.java b/src/main/java/tanks/network/event/EventChat.java index ac1e888c4..4821aaffb 100644 --- a/src/main/java/tanks/network/event/EventChat.java +++ b/src/main/java/tanks/network/event/EventChat.java @@ -53,18 +53,6 @@ else if (ScreenPartyHost.activeScreen.mutedPlayers.contains(this.clientID)) } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.message); - } - - @Override - public void read(ByteBuf b) - { - this.message = NetworkUtils.readString(b); - } - public static boolean isStringValid(String s) { for (int i = 0; i < s.length(); i++) diff --git a/src/main/java/tanks/network/event/EventChatClear.java b/src/main/java/tanks/network/event/EventChatClear.java index 69e93e93b..d664cc5a0 100644 --- a/src/main/java/tanks/network/event/EventChatClear.java +++ b/src/main/java/tanks/network/event/EventChatClear.java @@ -19,16 +19,4 @@ public void execute() ScreenPartyLobby.chat.clear(); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventClearShop.java b/src/main/java/tanks/network/event/EventClearShop.java index d669e58d5..345eccb08 100644 --- a/src/main/java/tanks/network/event/EventClearShop.java +++ b/src/main/java/tanks/network/event/EventClearShop.java @@ -15,18 +15,6 @@ public EventClearShop() } - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventConnectionSuccess.java b/src/main/java/tanks/network/event/EventConnectionSuccess.java index 2cedcf022..9e42cdb32 100644 --- a/src/main/java/tanks/network/event/EventConnectionSuccess.java +++ b/src/main/java/tanks/network/event/EventConnectionSuccess.java @@ -21,16 +21,4 @@ public void execute() Game.eventsOut.add(new EventSendTankColors(Game.player)); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventCreateFreezeEffect.java b/src/main/java/tanks/network/event/EventCreateFreezeEffect.java index 81a44496f..828598365 100644 --- a/src/main/java/tanks/network/event/EventCreateFreezeEffect.java +++ b/src/main/java/tanks/network/event/EventCreateFreezeEffect.java @@ -1,9 +1,6 @@ package tanks.network.event; -import tanks.AreaEffectFreeze; -import tanks.Game; - -import io.netty.buffer.ByteBuf; +import tanks.*; public class EventCreateFreezeEffect extends PersonalEvent { @@ -21,21 +18,6 @@ public EventCreateFreezeEffect(AreaEffectFreeze a) this.posY = a.posY; } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(posX); - b.writeDouble(posY); - } - - @Override - public void read(ByteBuf b) - { - posX = b.readDouble(); - posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventEnterLevel.java b/src/main/java/tanks/network/event/EventEnterLevel.java index 71af07ba4..d31efc311 100644 --- a/src/main/java/tanks/network/event/EventEnterLevel.java +++ b/src/main/java/tanks/network/event/EventEnterLevel.java @@ -30,16 +30,4 @@ public void execute() Crusade.currentCrusade = null; } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventExplosion.java b/src/main/java/tanks/network/event/EventExplosion.java index a9b499be4..e91a578cb 100644 --- a/src/main/java/tanks/network/event/EventExplosion.java +++ b/src/main/java/tanks/network/event/EventExplosion.java @@ -54,30 +54,4 @@ public void execute() e.explode(); } } - - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.radius); - b.writeDouble(this.kbRadius); - b.writeDouble(this.damage); - b.writeBoolean(this.destroysObstacles); - b.writeDouble(this.stunRadius); - b.writeDouble(this.stunTime); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.radius = b.readDouble(); - this.kbRadius = b.readDouble(); - this.damage = b.readDouble(); - this.destroysObstacles = b.readBoolean(); - this.stunRadius = b.readDouble(); - this.stunTime = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventItemDrop.java b/src/main/java/tanks/network/event/EventItemDrop.java index 24871ccf5..798d2c3ed 100644 --- a/src/main/java/tanks/network/event/EventItemDrop.java +++ b/src/main/java/tanks/network/event/EventItemDrop.java @@ -27,25 +27,6 @@ public EventItemDrop(ItemDrop id) this.posY = id.posY; } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - NetworkUtils.writeString(b, item); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.item = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventItemPickup.java b/src/main/java/tanks/network/event/EventItemPickup.java index 28008cfbd..c9d4741c6 100644 --- a/src/main/java/tanks/network/event/EventItemPickup.java +++ b/src/main/java/tanks/network/event/EventItemPickup.java @@ -22,20 +22,6 @@ public EventItemPickup(ItemDrop id, Tank pickup) this.tank = pickup.networkID; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.itemDrop); - b.writeInt(this.tank); - } - - @Override - public void read(ByteBuf b) - { - this.itemDrop = b.readInt(); - this.tank = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventKick.java b/src/main/java/tanks/network/event/EventKick.java index 27c77f01a..3c39493be 100644 --- a/src/main/java/tanks/network/event/EventKick.java +++ b/src/main/java/tanks/network/event/EventKick.java @@ -1,12 +1,8 @@ package tanks.network.event; import tanks.Game; -import tanks.gui.screen.ScreenKicked; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.Client; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; public class EventKick extends PersonalEvent { @@ -36,16 +32,4 @@ public void execute() Game.screen = new ScreenKicked(reason); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.reason); - } - - @Override - public void read(ByteBuf b) - { - this.reason = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventLayMine.java b/src/main/java/tanks/network/event/EventLayMine.java index 540c7f52f..a5d991192 100644 --- a/src/main/java/tanks/network/event/EventLayMine.java +++ b/src/main/java/tanks/network/event/EventLayMine.java @@ -1,12 +1,9 @@ package tanks.network.event; import tanks.Game; -import tanks.item.Item; -import tanks.item.ItemMine; +import tanks.item.*; import tanks.tank.*; -import io.netty.buffer.ByteBuf; - public class EventLayMine extends PersonalEvent { public int id; @@ -81,24 +78,4 @@ else if (t2 instanceof TankPlayer) Mine.idMap.put(id, m); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeInt(this.item); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.item = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventLevelExit.java b/src/main/java/tanks/network/event/EventLevelExit.java index 265360084..365c32f4b 100644 --- a/src/main/java/tanks/network/event/EventLevelExit.java +++ b/src/main/java/tanks/network/event/EventLevelExit.java @@ -47,16 +47,4 @@ public void execute() System.gc(); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.winningTeam); - } - - @Override - public void read(ByteBuf b) - { - this.winningTeam = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventLevelFinished.java b/src/main/java/tanks/network/event/EventLevelFinished.java index 4f5e125ea..3b9602e38 100644 --- a/src/main/java/tanks/network/event/EventLevelFinished.java +++ b/src/main/java/tanks/network/event/EventLevelFinished.java @@ -2,8 +2,6 @@ import tanks.gui.screen.ScreenGame; -import io.netty.buffer.ByteBuf; - public class EventLevelFinished extends PersonalEvent { public EventLevelFinished() @@ -19,10 +17,4 @@ public void execute() ScreenGame.finished = true; } - - @Override - public void write(ByteBuf b) {} - - @Override - public void read(ByteBuf b) {} } diff --git a/src/main/java/tanks/network/event/EventLoadLevel.java b/src/main/java/tanks/network/event/EventLoadLevel.java index 1346a45d8..372a655d5 100644 --- a/src/main/java/tanks/network/event/EventLoadLevel.java +++ b/src/main/java/tanks/network/event/EventLoadLevel.java @@ -1,15 +1,10 @@ package tanks.network.event; import tanks.*; -import tanks.gui.screen.ScreenFailedToLoadLevel; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.item.Item; import tanks.minigames.Minigame; -import tanks.network.NetworkUtils; -import tanks.tank.TankAIControlled; -import tanks.tank.TankPlayer; - -import io.netty.buffer.ByteBuf; +import tanks.tank.*; import java.util.ArrayList; @@ -92,20 +87,4 @@ public void execute() Game.screen = new ScreenFailedToLoadLevel("Level is remote!", level, e, new ScreenPartyLobby()); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.level); - b.writeDouble(this.startTime); - b.writeBoolean(this.disableFriendlyFire); - } - - @Override - public void read(ByteBuf b) - { - this.level = NetworkUtils.readString(b); - this.startTime = b.readDouble(); - this.disableFriendlyFire = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventMutePlayer.java b/src/main/java/tanks/network/event/EventMutePlayer.java index 3458fa622..51d876a5f 100644 --- a/src/main/java/tanks/network/event/EventMutePlayer.java +++ b/src/main/java/tanks/network/event/EventMutePlayer.java @@ -32,17 +32,4 @@ public void execute() ScreenPartyLobby.muted = muted; } } - - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.muted); - } - - @Override - public void read(ByteBuf b) - { - this.muted = b.readBoolean(); - } - } diff --git a/src/main/java/tanks/network/event/EventNudge.java b/src/main/java/tanks/network/event/EventNudge.java index f3fd18c2e..34353b690 100644 --- a/src/main/java/tanks/network/event/EventNudge.java +++ b/src/main/java/tanks/network/event/EventNudge.java @@ -57,17 +57,4 @@ else if (this.clientID != null) } } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.username); - } - - @Override - public void read(ByteBuf b) - { - this.username = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java b/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java index 76b53ae66..a399c0d11 100644 --- a/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java +++ b/src/main/java/tanks/network/event/EventObstacleBoostPanelEffect.java @@ -38,24 +38,6 @@ public EventObstacleBoostPanelEffect() } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(this.isTank); - b.writeInt(this.networkID); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.isTank = b.readBoolean(); - this.networkID = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleDestroy.java b/src/main/java/tanks/network/event/EventObstacleDestroy.java index a020eda2b..028c3b7ad 100644 --- a/src/main/java/tanks/network/event/EventObstacleDestroy.java +++ b/src/main/java/tanks/network/event/EventObstacleDestroy.java @@ -41,30 +41,6 @@ public EventObstacleDestroy(double x, double y, String name, double ex, double e this.name = name; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeBoolean(this.effect); - b.writeDouble(this.effectX); - b.writeDouble(this.effectY); - b.writeDouble(this.radius); - NetworkUtils.writeString(b, this.name); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.effect = b.readBoolean(); - this.effectX = b.readDouble(); - this.effectY = b.readDouble(); - this.radius = b.readDouble(); - this.name = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java index 3392a436a..9b060f4e5 100644 --- a/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java +++ b/src/main/java/tanks/network/event/EventObstacleShrubberyBurn.java @@ -1,11 +1,7 @@ package tanks.network.event; -import tanks.Effect; -import tanks.Game; -import tanks.obstacle.Obstacle; -import tanks.obstacle.ObstacleShrubbery; - -import io.netty.buffer.ByteBuf; +import tanks.*; +import tanks.obstacle.*; public class EventObstacleShrubberyBurn extends PersonalEvent { @@ -23,20 +19,6 @@ public EventObstacleShrubberyBurn(double x, double y) this.posY = y; } - @Override - public void write(ByteBuf b) - { - b.writeDouble(this.posX); - b.writeDouble(this.posY); - } - - @Override - public void read(ByteBuf b) - { - this.posX = b.readDouble(); - this.posY = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPendingJoinParty.java b/src/main/java/tanks/network/event/EventPendingJoinParty.java index 5907b991a..6e9e4bd4c 100644 --- a/src/main/java/tanks/network/event/EventPendingJoinParty.java +++ b/src/main/java/tanks/network/event/EventPendingJoinParty.java @@ -3,22 +3,8 @@ import tanks.Game; import tanks.gui.screen.ScreenPendingJoinParty; -import io.netty.buffer.ByteBuf; - public class EventPendingJoinParty extends PersonalEvent { - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPing.java b/src/main/java/tanks/network/event/EventPing.java index e182403e4..6b5493031 100644 --- a/src/main/java/tanks/network/event/EventPing.java +++ b/src/main/java/tanks/network/event/EventPing.java @@ -1,9 +1,6 @@ package tanks.network.event; -import tanks.network.ClientHandler; -import tanks.network.ServerHandler; - -import io.netty.buffer.ByteBuf; +import tanks.network.*; public class EventPing extends PersonalEvent implements IServerThreadEvent, IClientThreadEvent { @@ -19,18 +16,6 @@ public EventPing(boolean second) this.second = second; } - @Override - public void write(ByteBuf b) - { - b.writeBoolean(second); - } - - @Override - public void read(ByteBuf b) - { - second = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java index 837d3e117..c9d244acd 100644 --- a/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java +++ b/src/main/java/tanks/network/event/EventPlayerAutoReadyConfirm.java @@ -31,16 +31,4 @@ public void execute() ((ScreenGame) Game.screen).ready = true; } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, playerID.toString()); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - } } diff --git a/src/main/java/tanks/network/event/EventPlayerChat.java b/src/main/java/tanks/network/event/EventPlayerChat.java index 6566e5197..a8c6ed604 100644 --- a/src/main/java/tanks/network/event/EventPlayerChat.java +++ b/src/main/java/tanks/network/event/EventPlayerChat.java @@ -3,9 +3,6 @@ import tanks.Player; import tanks.gui.ChatMessage; import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; public class EventPlayerChat extends PersonalEvent implements IChatEvent { @@ -31,19 +28,4 @@ public void execute() if (this.clientID == null) ScreenPartyLobby.chat.add(0, new ChatMessage(this.username, this.message)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.username); - NetworkUtils.writeString(b, this.message); - } - - @Override - public void read(ByteBuf b) - { - this.username = NetworkUtils.readString(b); - this.message = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventPlayerReady.java b/src/main/java/tanks/network/event/EventPlayerReady.java index 407b959e8..69112972f 100644 --- a/src/main/java/tanks/network/event/EventPlayerReady.java +++ b/src/main/java/tanks/network/event/EventPlayerReady.java @@ -1,11 +1,8 @@ package tanks.network.event; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.screen.ScreenPartyHost; -import io.netty.buffer.ByteBuf; - public class EventPlayerReady extends PersonalEvent { public EventPlayerReady() @@ -37,17 +34,4 @@ public void execute() Game.eventsOut.add(new EventUpdateReadyPlayers(ScreenPartyHost.readyPlayers)); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - } diff --git a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java index e3a40721b..7ddde09b7 100644 --- a/src/main/java/tanks/network/event/EventPlayerRevealBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerRevealBuild.java @@ -22,20 +22,6 @@ public EventPlayerRevealBuild(int tank, int build) this.build = build; } - @Override - public void write(ByteBuf b) - { - b.writeInt(tank); - b.writeInt(build); - } - - @Override - public void read(ByteBuf b) - { - tank = b.readInt(); - build = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPlayerSetBuild.java b/src/main/java/tanks/network/event/EventPlayerSetBuild.java index 7c5753eeb..71f0b58e7 100644 --- a/src/main/java/tanks/network/event/EventPlayerSetBuild.java +++ b/src/main/java/tanks/network/event/EventPlayerSetBuild.java @@ -22,18 +22,6 @@ public EventPlayerSetBuild(int build) this.build = build; } - @Override - public void write(ByteBuf b) - { - b.writeInt(build); - } - - @Override - public void read(ByteBuf b) - { - build = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventPurchaseBuild.java b/src/main/java/tanks/network/event/EventPurchaseBuild.java index 40eb9aa6b..8748136d7 100644 --- a/src/main/java/tanks/network/event/EventPurchaseBuild.java +++ b/src/main/java/tanks/network/event/EventPurchaseBuild.java @@ -19,18 +19,6 @@ public EventPurchaseBuild(String name) this.name = name; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventReturnToCrusade.java b/src/main/java/tanks/network/event/EventReturnToCrusade.java index 4159b8c4d..1f8952ba2 100644 --- a/src/main/java/tanks/network/event/EventReturnToCrusade.java +++ b/src/main/java/tanks/network/event/EventReturnToCrusade.java @@ -58,22 +58,4 @@ public void execute() System.gc(); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, msg1); - NetworkUtils.writeString(b, msg2); - b.writeBoolean(win); - b.writeBoolean(lose); - } - - @Override - public void read(ByteBuf b) - { - msg1 = NetworkUtils.readString(b); - msg2 = NetworkUtils.readString(b); - win = b.readBoolean(); - lose = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventReturnToLobby.java b/src/main/java/tanks/network/event/EventReturnToLobby.java index a9e3b89fb..b5906c0a5 100644 --- a/src/main/java/tanks/network/event/EventReturnToLobby.java +++ b/src/main/java/tanks/network/event/EventReturnToLobby.java @@ -25,16 +25,4 @@ public void execute() System.gc(); } } - - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } } diff --git a/src/main/java/tanks/network/event/EventSendClientDetails.java b/src/main/java/tanks/network/event/EventSendClientDetails.java index 151bb3465..1efcee63c 100644 --- a/src/main/java/tanks/network/event/EventSendClientDetails.java +++ b/src/main/java/tanks/network/event/EventSendClientDetails.java @@ -5,8 +5,6 @@ import tanks.gui.screen.*; import tanks.network.*; -import io.netty.buffer.ByteBuf; - import java.util.UUID; public class EventSendClientDetails extends PersonalEvent implements IServerThreadEvent @@ -27,22 +25,6 @@ public EventSendClientDetails(int version, UUID clientID, String username) this.username = username; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.version); - NetworkUtils.writeString(b, clientID.toString()); - NetworkUtils.writeString(b, username); - } - - @Override - public void read(ByteBuf b) - { - this.version = b.readInt(); - this.clientID = UUID.fromString(NetworkUtils.readString(b)); - this.username = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSendTankColors.java b/src/main/java/tanks/network/event/EventSendTankColors.java index 093f3fb0b..a96eba6b7 100644 --- a/src/main/java/tanks/network/event/EventSendTankColors.java +++ b/src/main/java/tanks/network/event/EventSendTankColors.java @@ -1,14 +1,10 @@ package tanks.network.event; import basewindow.Color; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.gui.screen.ScreenPartyHost; -import tanks.network.NetworkUtils; import tanks.network.ServerHandler; -import io.netty.buffer.ByteBuf; - public class EventSendTankColors extends PersonalEvent { public Color color1 = new Color(); @@ -27,22 +23,6 @@ public EventSendTankColors(Player p) this.color3.set(p.color3); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeColor(b, this.color1); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - } - - @Override - public void read(ByteBuf b) - { - NetworkUtils.readColor(b, this.color1); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetItem.java b/src/main/java/tanks/network/event/EventSetItem.java index 3ef967279..d8aeb32e9 100644 --- a/src/main/java/tanks/network/event/EventSetItem.java +++ b/src/main/java/tanks/network/event/EventSetItem.java @@ -31,22 +31,6 @@ public EventSetItem(Player p, int slot, Item.ItemStack item) this.itemStackString = item.toString(); } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.slot); - NetworkUtils.writeString(b, this.itemStackString); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - this.itemStackString = NetworkUtils.readString(b); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetItemBarSlot.java b/src/main/java/tanks/network/event/EventSetItemBarSlot.java index 0e5421a63..8dc128ecb 100644 --- a/src/main/java/tanks/network/event/EventSetItemBarSlot.java +++ b/src/main/java/tanks/network/event/EventSetItemBarSlot.java @@ -1,11 +1,8 @@ package tanks.network.event; -import tanks.Game; -import tanks.Player; +import tanks.*; import tanks.tank.TankPlayerRemote; -import io.netty.buffer.ByteBuf; - public class EventSetItemBarSlot extends PersonalEvent implements IStackableEvent { public int slot; @@ -20,18 +17,6 @@ public EventSetItemBarSlot(int slot) this.slot = slot; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.slot); - } - - @Override - public void read(ByteBuf b) - { - this.slot = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetItemCount.java b/src/main/java/tanks/network/event/EventSetItemCount.java index 7ad81f2b3..f1f41ce13 100644 --- a/src/main/java/tanks/network/event/EventSetItemCount.java +++ b/src/main/java/tanks/network/event/EventSetItemCount.java @@ -1,10 +1,6 @@ package tanks.network.event; -import tanks.Game; -import tanks.Player; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; +import tanks.*; import java.util.UUID; @@ -27,22 +23,6 @@ public EventSetItemCount(Player p, int slot, int count) this.count = count; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.slot); - b.writeInt(this.count); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - this.count = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetSelectedItems.java b/src/main/java/tanks/network/event/EventSetSelectedItems.java index fbc0dae75..4d62ab535 100644 --- a/src/main/java/tanks/network/event/EventSetSelectedItems.java +++ b/src/main/java/tanks/network/event/EventSetSelectedItems.java @@ -28,22 +28,6 @@ public EventSetSelectedItems(int slot, int p, int s) this.secondary = s; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.slot); - b.writeInt(this.primary); - b.writeInt(this.secondary); - } - - @Override - public void read(ByteBuf b) - { - this.slot = b.readInt(); - this.primary = b.readInt(); - this.secondary = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventSetupHotbar.java b/src/main/java/tanks/network/event/EventSetupHotbar.java index 94761dc05..14143fb3d 100644 --- a/src/main/java/tanks/network/event/EventSetupHotbar.java +++ b/src/main/java/tanks/network/event/EventSetupHotbar.java @@ -26,22 +26,6 @@ public EventSetupHotbar(Player p) this.coins = p.hotbar.enabledCoins; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeBoolean(this.items); - b.writeBoolean(this.coins); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.items = b.readBoolean(); - this.coins = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventShareCrusade.java b/src/main/java/tanks/network/event/EventShareCrusade.java index 56a130c4a..bc58cc8cd 100644 --- a/src/main/java/tanks/network/event/EventShareCrusade.java +++ b/src/main/java/tanks/network/event/EventShareCrusade.java @@ -2,13 +2,9 @@ import tanks.*; import tanks.gui.ChatMessage; -import tanks.gui.screen.ScreenPartyHost; -import tanks.gui.screen.ScreenPartyLobby; -import tanks.network.NetworkUtils; +import tanks.gui.screen.*; import tanks.network.ServerHandler; -import io.netty.buffer.ByteBuf; - public class EventShareCrusade extends PersonalEvent { public String crusade; @@ -71,20 +67,4 @@ public void execute() ScreenPartyLobby.sharedCrusades.add(new ScreenPartyHost.SharedCrusade(this.crusade, this.name, this.username)); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.crusade); - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.username); - } - - @Override - public void read(ByteBuf b) - { - this.crusade = NetworkUtils.readString(b); - this.name = NetworkUtils.readString(b); - this.username = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventShareLevel.java b/src/main/java/tanks/network/event/EventShareLevel.java index 06cbefe27..2941fdb4a 100644 --- a/src/main/java/tanks/network/event/EventShareLevel.java +++ b/src/main/java/tanks/network/event/EventShareLevel.java @@ -72,20 +72,4 @@ public void execute() ScreenPartyLobby.sharedLevels.add(new ScreenPartyHost.SharedLevel(this.level, this.name, this.username)); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.level); - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.username); - } - - @Override - public void read(ByteBuf b) - { - this.level = NetworkUtils.readString(b); - this.name = NetworkUtils.readString(b); - this.username = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventShootBullet.java b/src/main/java/tanks/network/event/EventShootBullet.java index a95febf7c..4a0fb1c08 100644 --- a/src/main/java/tanks/network/event/EventShootBullet.java +++ b/src/main/java/tanks/network/event/EventShootBullet.java @@ -112,34 +112,4 @@ else if (t2 instanceof TankPlayer) e.printStackTrace(); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.posZ); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.vZ); - b.writeDouble(this.speed); - b.writeInt(this.item); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.posZ = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.vZ = b.readDouble(); - this.speed = b.readDouble(); - this.item = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventShowCrusadeStats.java b/src/main/java/tanks/network/event/EventShowCrusadeStats.java index b0b3f5eb3..3fe6d410a 100644 --- a/src/main/java/tanks/network/event/EventShowCrusadeStats.java +++ b/src/main/java/tanks/network/event/EventShowCrusadeStats.java @@ -96,22 +96,4 @@ public void execute() Crusade.currentCrusade.crusadePlayers.put(cp.player, cp); } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - NetworkUtils.writeString(b, this.levels); - NetworkUtils.writeString(b, this.stats); - NetworkUtils.writeString(b, this.crusade); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - this.levels = NetworkUtils.readString(b); - this.stats = NetworkUtils.readString(b); - this.crusade = NetworkUtils.readString(b); - } } diff --git a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java index b03211a8d..3bfd446d4 100644 --- a/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java +++ b/src/main/java/tanks/network/event/EventTankAddAttributeModifier.java @@ -1,11 +1,8 @@ package tanks.network.event; import tanks.attribute.AttributeModifier; -import tanks.network.NetworkUtils; import tanks.tank.Tank; -import io.netty.buffer.ByteBuf; - public class EventTankAddAttributeModifier extends PersonalEvent { public int tank; @@ -43,38 +40,6 @@ public EventTankAddAttributeModifier(Tank t, AttributeModifier m, boolean undupl this.unduplicate = unduplicate; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.duration); - b.writeDouble(this.deteriorationAge); - b.writeDouble(this.warmupAge); - b.writeDouble(this.value); - NetworkUtils.writeString(b, this.effect); - b.writeDouble(this.age); - NetworkUtils.writeString(b, this.type); - b.writeBoolean(this.expired); - b.writeBoolean(this.unduplicate); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.name = NetworkUtils.readString(b); - this.duration = b.readDouble(); - this.deteriorationAge = b.readDouble(); - this.warmupAge = b.readDouble(); - this.value = b.readDouble(); - this.effect = NetworkUtils.readString(b); - this.age = b.readDouble(); - this.type = NetworkUtils.readString(b); - this.expired = b.readBoolean(); - this.unduplicate = b.readBoolean(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankCharge.java b/src/main/java/tanks/network/event/EventTankCharge.java index 4b96ba1fe..89e339ba7 100644 --- a/src/main/java/tanks/network/event/EventTankCharge.java +++ b/src/main/java/tanks/network/event/EventTankCharge.java @@ -44,20 +44,6 @@ public void execute() } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.charge); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.charge = b.readDouble(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java index b45117e1a..1c20e989d 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateC.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateC.java @@ -3,8 +3,6 @@ import tanks.Panel; import tanks.tank.*; -import io.netty.buffer.ByteBuf; - public class EventTankControllerUpdateC extends PersonalEvent implements IStackableEvent { public int tank; @@ -17,7 +15,7 @@ public class EventTankControllerUpdateC extends PersonalEvent implements IStacka public double mY; public boolean action1; public boolean action2; - public boolean[] quickActions = new boolean[TankPlayer.max_abilities]; + public int quickActions; public double time; public long sysTime = System.currentTimeMillis(); @@ -38,48 +36,11 @@ public EventTankControllerUpdateC(TankPlayerController t) this.angle = t.angle; this.action1 = t.action1; this.action2 = t.action2; - System.arraycopy(t.quickActions, 0, this.quickActions, 0, this.quickActions.length); this.time = Panel.frameFrequency; - } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.angle); - b.writeDouble(this.mX); - b.writeDouble(this.mY); - b.writeBoolean(this.action1); - b.writeBoolean(this.action2); - for (boolean quickAction: this.quickActions) - { - b.writeBoolean(quickAction); - } - b.writeDouble(this.time); - } - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.angle = b.readDouble(); - this.mX = b.readDouble(); - this.mY = b.readDouble(); - this.action1 = b.readBoolean(); - this.action2 = b.readBoolean(); - for (int i = 0; i < this.quickActions.length; i++) - { - this.quickActions[i] = b.readBoolean(); - } - this.time = b.readDouble(); + int i = 0; + for (boolean b : t.quickActions) + this.quickActions |= (b ? 1 : 0) << i++; } @Override diff --git a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java index 7702176c7..392ae1091 100644 --- a/src/main/java/tanks/network/event/EventTankControllerUpdateS.java +++ b/src/main/java/tanks/network/event/EventTankControllerUpdateS.java @@ -20,20 +20,6 @@ public EventTankControllerUpdateS(Tank t, boolean forced, boolean recoil) this.forced = forced; } - @Override - public void read(ByteBuf b) - { - super.read(b); - this.forced = b.readBoolean(); - } - - @Override - public void write(ByteBuf b) - { - super.write(b); - b.writeBoolean(this.forced); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankCreate.java b/src/main/java/tanks/network/event/EventTankCreate.java index 71ed8b940..1e9616fba 100644 --- a/src/main/java/tanks/network/event/EventTankCreate.java +++ b/src/main/java/tanks/network/event/EventTankCreate.java @@ -1,12 +1,7 @@ package tanks.network.event; -import tanks.Game; -import tanks.Team; -import tanks.network.NetworkUtils; -import tanks.tank.Tank; -import tanks.tank.TankRemote; - -import io.netty.buffer.ByteBuf; +import tanks.*; +import tanks.tank.*; public class EventTankCreate extends PersonalEvent { @@ -59,28 +54,4 @@ public void execute() Game.movables.add(new TankRemote(t)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.type); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.id); - b.writeDouble(this.drawAge); - } - - @Override - public void read(ByteBuf b) - { - this.type = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.id = b.readInt(); - this.drawAge = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankCustomCreate.java b/src/main/java/tanks/network/event/EventTankCustomCreate.java index c19530e1d..fbd1622ec 100644 --- a/src/main/java/tanks/network/event/EventTankCustomCreate.java +++ b/src/main/java/tanks/network/event/EventTankCustomCreate.java @@ -70,40 +70,4 @@ public void execute() Game.movables.add(tank); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.name); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeDouble(this.size); - b.writeDouble(this.turretSize); - b.writeDouble(this.turretLength); - NetworkUtils.writeColor(b, this.color); - b.writeDouble(this.lives); - b.writeDouble(this.baseLives); - - b.writeInt(this.id); - } - - @Override - public void read(ByteBuf b) - { - this.name = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.size = b.readDouble(); - this.turretSize = b.readDouble(); - this.turretLength = b.readDouble(); - NetworkUtils.readColor(b, this.color); - this.lives = b.readDouble(); - this.baseLives = b.readDouble(); - - this.id = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankMimicLaser.java b/src/main/java/tanks/network/event/EventTankMimicLaser.java index 2a65c0846..ba5b4148f 100644 --- a/src/main/java/tanks/network/event/EventTankMimicLaser.java +++ b/src/main/java/tanks/network/event/EventTankMimicLaser.java @@ -52,22 +52,6 @@ public void execute() } } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeInt(this.tank2); - b.writeDouble(this.range); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.tank2 = b.readInt(); - this.range = b.readDouble(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankMimicTransform.java b/src/main/java/tanks/network/event/EventTankMimicTransform.java index 6953082e9..d94e07f5e 100644 --- a/src/main/java/tanks/network/event/EventTankMimicTransform.java +++ b/src/main/java/tanks/network/event/EventTankMimicTransform.java @@ -92,18 +92,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeInt(this.target); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.target = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankPlayerCreate.java b/src/main/java/tanks/network/event/EventTankPlayerCreate.java index ff18b01aa..d8e2bf9e5 100644 --- a/src/main/java/tanks/network/event/EventTankPlayerCreate.java +++ b/src/main/java/tanks/network/event/EventTankPlayerCreate.java @@ -3,18 +3,15 @@ import basewindow.Color; import tanks.*; import tanks.gui.screen.*; -import tanks.minigames.Arcade; -import tanks.minigames.RampageTrial; +import tanks.minigames.*; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; import tanks.tank.*; -import io.netty.buffer.ByteBuf; - import java.util.UUID; public class EventTankPlayerCreate extends PersonalEvent { + @NetworkIgnored public Player player; public UUID clientIdTarget; @@ -176,40 +173,4 @@ public void setColor(Tank t) if (t instanceof TankPlayable) ((TankPlayable) t).saveColors(); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.clientIdTarget.toString()); - NetworkUtils.writeString(b, this.username); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.networkID); - - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - - b.writeDouble(this.drawAge); - } - - @Override - public void read(ByteBuf b) - { - this.clientIdTarget = UUID.fromString(NetworkUtils.readString(b)); - this.username = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.networkID = b.readInt(); - - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - - this.drawAge = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankSpawn.java b/src/main/java/tanks/network/event/EventTankSpawn.java index d95c383bc..97f878c49 100644 --- a/src/main/java/tanks/network/event/EventTankSpawn.java +++ b/src/main/java/tanks/network/event/EventTankSpawn.java @@ -73,28 +73,4 @@ public void execute() Game.movables.add(new TankRemote(t)); } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.type); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.angle); - NetworkUtils.writeString(b, this.team); - b.writeInt(this.id); - b.writeInt(this.parent); - } - - @Override - public void read(ByteBuf b) - { - this.type = NetworkUtils.readString(b); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.angle = b.readDouble(); - this.team = NetworkUtils.readString(b); - this.id = b.readInt(); - this.parent = b.readInt(); - } } diff --git a/src/main/java/tanks/network/event/EventTankTeleport.java b/src/main/java/tanks/network/event/EventTankTeleport.java index 448a7605c..030b4046f 100644 --- a/src/main/java/tanks/network/event/EventTankTeleport.java +++ b/src/main/java/tanks/network/event/EventTankTeleport.java @@ -44,37 +44,6 @@ public EventTankTeleport(TeleporterOrb t) this.endAge = t.endAge; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.fX); - b.writeDouble(this.fY); - b.writeDouble(this.iX); - b.writeDouble(this.iY); - b.writeDouble(this.dX); - b.writeDouble(this.dY); - b.writeDouble(this.age); - b.writeDouble(this.maxAge); - b.writeDouble(this.endAge); - - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.fX = b.readDouble(); - this.fY = b.readDouble(); - this.iX = b.readDouble(); - this.iY = b.readDouble(); - this.dX = b.readDouble(); - this.dY = b.readDouble(); - this.age = b.readDouble(); - this.maxAge = b.readDouble(); - this.endAge = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankTransformCustom.java b/src/main/java/tanks/network/event/EventTankTransformCustom.java index a15fd62ca..567d33baf 100644 --- a/src/main/java/tanks/network/event/EventTankTransformCustom.java +++ b/src/main/java/tanks/network/event/EventTankTransformCustom.java @@ -1,12 +1,11 @@ package tanks.network.event; import basewindow.Color; +import io.netty.buffer.ByteBuf; import tanks.*; import tanks.network.NetworkUtils; import tanks.tank.*; -import io.netty.buffer.ByteBuf; - import java.util.HashSet; public class EventTankTransformCustom extends PersonalEvent @@ -42,6 +41,7 @@ public class EventTankTransformCustom extends PersonalEvent public boolean requiredKill = false; + @NetworkIgnored public HashSet tankMusic; public static final int no_effect = 0; @@ -178,94 +178,21 @@ else if (effect == poof) @Override public void write(ByteBuf b) { - b.writeInt(this.tank); - - NetworkUtils.writeColor(b, this.color); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - - b.writeBoolean(this.enableCol3); - - b.writeDouble(this.glowIntensity); - b.writeDouble(this.glowSize); - b.writeDouble(this.lightIntensity); - b.writeDouble(this.lightSize); - b.writeDouble(this.luminance); - - b.writeDouble(this.size); - b.writeDouble(this.turretSize); - b.writeDouble(this.turretLength); - - NetworkUtils.writeString(b, this.baseModel); - NetworkUtils.writeString(b, this.colorModel); - NetworkUtils.writeString(b, this.turretBaseModel); - NetworkUtils.writeString(b, this.turretModel); - - NetworkUtils.writeString(b, this.emblem); - NetworkUtils.writeColor(b, this.emblemColor); - - b.writeInt(this.bulletCount); - b.writeDouble(this.bulletSpread); - - b.writeBoolean(this.enableTracks); - b.writeDouble(this.trackSpacing); - - b.writeBoolean(this.requiredKill); + super.write(b); b.writeInt(this.tankMusic.size()); - for (String s: this.tankMusic) - { NetworkUtils.writeString(b, s); - } - - b.writeInt(this.effect); } @Override public void read(ByteBuf b) { - this.tank = b.readInt(); - - NetworkUtils.readColor(b, this.color); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - - this.enableCol3 = b.readBoolean(); - - this.glowIntensity = b.readDouble(); - this.glowSize = b.readDouble(); - this.lightIntensity = b.readDouble(); - this.lightSize = b.readDouble(); - this.luminance = b.readDouble(); - - this.size = b.readDouble(); - this.turretSize = b.readDouble(); - this.turretLength = b.readDouble(); - - this.baseModel = NetworkUtils.readString(b); - this.colorModel = NetworkUtils.readString(b); - this.turretBaseModel = NetworkUtils.readString(b); - this.turretModel = NetworkUtils.readString(b); - - this.emblem = NetworkUtils.readString(b); - NetworkUtils.readColor(b, this.emblemColor); - - this.bulletCount = b.readInt(); - this.bulletSpread = b.readDouble(); - - this.enableTracks = b.readBoolean(); - this.trackSpacing = b.readDouble(); - - this.requiredKill = b.readBoolean(); + super.read(b); int size = b.readInt(); this.tankMusic = new HashSet<>(); for (int i = 0; i < size; i++) - { this.tankMusic.add(NetworkUtils.readString(b)); - } - - this.effect = b.readInt(); } } diff --git a/src/main/java/tanks/network/event/EventTankTransformPreset.java b/src/main/java/tanks/network/event/EventTankTransformPreset.java index cefde252b..70bde3a58 100644 --- a/src/main/java/tanks/network/event/EventTankTransformPreset.java +++ b/src/main/java/tanks/network/event/EventTankTransformPreset.java @@ -112,20 +112,4 @@ public void execute() t.tertiaryColor.set(target.tertiaryColor); } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeBoolean(this.sight); - b.writeBoolean(this.revert); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.sight = b.readBoolean(); - this.revert = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventTankUpdate.java b/src/main/java/tanks/network/event/EventTankUpdate.java index 794af38d7..877849b4f 100644 --- a/src/main/java/tanks/network/event/EventTankUpdate.java +++ b/src/main/java/tanks/network/event/EventTankUpdate.java @@ -33,30 +33,6 @@ public EventTankUpdate(Tank t) this.pitch = t.pitch; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.vX); - b.writeDouble(this.vY); - b.writeDouble(this.angle); - b.writeDouble(this.pitch); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.vX = b.readDouble(); - this.vY = b.readDouble(); - this.angle = b.readDouble(); - this.pitch = b.readDouble(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventTankUpdateColor.java b/src/main/java/tanks/network/event/EventTankUpdateColor.java index e39fa0143..d9d3a81aa 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateColor.java +++ b/src/main/java/tanks/network/event/EventTankUpdateColor.java @@ -1,11 +1,8 @@ package tanks.network.event; import basewindow.Color; -import tanks.network.NetworkUtils; import tanks.tank.Tank; -import io.netty.buffer.ByteBuf; - public class EventTankUpdateColor extends PersonalEvent implements IStackableEvent { public int tank; @@ -46,26 +43,6 @@ public void execute() t.enableTertiaryColor = tertiaryColor; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - NetworkUtils.writeColor(b, this.color1); - NetworkUtils.writeColor(b, this.color2); - NetworkUtils.writeColor(b, this.color3); - b.writeBoolean(this.tertiaryColor); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - NetworkUtils.readColor(b, this.color1); - NetworkUtils.readColor(b, this.color2); - NetworkUtils.readColor(b, this.color3); - this.tertiaryColor = b.readBoolean(); - } - @Override public int getIdentifier() { diff --git a/src/main/java/tanks/network/event/EventTankUpdateHealth.java b/src/main/java/tanks/network/event/EventTankUpdateHealth.java index 8604c2daa..9c2c64558 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateHealth.java +++ b/src/main/java/tanks/network/event/EventTankUpdateHealth.java @@ -52,18 +52,4 @@ else if (health > t.health) t.vY = 0; } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeDouble(this.health); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.health = b.readDouble(); - } } diff --git a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java index 532330626..ead055a23 100644 --- a/src/main/java/tanks/network/event/EventTankUpdateVisibility.java +++ b/src/main/java/tanks/network/event/EventTankUpdateVisibility.java @@ -31,18 +31,4 @@ public void execute() ((TankRemote) t).invisible = !visible; } } - - @Override - public void write(ByteBuf b) - { - b.writeInt(this.tank); - b.writeBoolean(this.visible); - } - - @Override - public void read(ByteBuf b) - { - this.tank = b.readInt(); - this.visible = b.readBoolean(); - } } diff --git a/src/main/java/tanks/network/event/EventUpdateCoins.java b/src/main/java/tanks/network/event/EventUpdateCoins.java index 5fd89d0f9..02505b971 100644 --- a/src/main/java/tanks/network/event/EventUpdateCoins.java +++ b/src/main/java/tanks/network/event/EventUpdateCoins.java @@ -24,20 +24,6 @@ public EventUpdateCoins(Player p) this.coins = p.hotbar.coins; } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.coins); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.coins = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java b/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java index 045f3ea43..0caf7a5de 100644 --- a/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java +++ b/src/main/java/tanks/network/event/EventUpdateEliminatedPlayers.java @@ -1,12 +1,8 @@ package tanks.network.event; import tanks.Game; -import tanks.gui.screen.ScreenGame; -import tanks.gui.screen.ScreenPartyLobby; +import tanks.gui.screen.*; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; import java.util.ArrayList; @@ -49,17 +45,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.eliminatedPlayers); - } - - @Override - public void read(ByteBuf b) - { - this.eliminatedPlayers = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java b/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java index e424cc431..8a6606d32 100644 --- a/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java +++ b/src/main/java/tanks/network/event/EventUpdateReadyPlayers.java @@ -3,9 +3,6 @@ import tanks.Player; import tanks.gui.screen.ScreenPartyLobby; import tanks.network.ConnectedPlayer; -import tanks.network.NetworkUtils; - -import io.netty.buffer.ByteBuf; import java.util.ArrayList; @@ -48,17 +45,4 @@ public void execute() } } } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.readyPlayers); - } - - @Override - public void read(ByteBuf b) - { - this.readyPlayers = NetworkUtils.readString(b); - } - } diff --git a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java index dc9c4afa7..5943350d8 100644 --- a/src/main/java/tanks/network/event/EventUpdateRemainingLives.java +++ b/src/main/java/tanks/network/event/EventUpdateRemainingLives.java @@ -24,19 +24,6 @@ public EventUpdateRemainingLives() } - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, playerID.toString()); - b.writeInt(lives); - } - - @Override - public void read(ByteBuf b) - { - playerID = UUID.fromString(NetworkUtils.readString(b)); - lives = b.readInt(); - } @Override public void execute() diff --git a/src/main/java/tanks/network/event/EventUpdateTankAbility.java b/src/main/java/tanks/network/event/EventUpdateTankAbility.java index 69021a6c3..8885af808 100644 --- a/src/main/java/tanks/network/event/EventUpdateTankAbility.java +++ b/src/main/java/tanks/network/event/EventUpdateTankAbility.java @@ -27,23 +27,6 @@ public EventUpdateTankAbility(Player p, int slot) this.count = ((TankPlayable) (p.tank)).abilities.get(slot).stackSize; } - - @Override - public void write(ByteBuf b) - { - NetworkUtils.writeString(b, this.playerID.toString()); - b.writeInt(this.slot); - b.writeInt(this.count); - } - - @Override - public void read(ByteBuf b) - { - this.playerID = UUID.fromString(NetworkUtils.readString(b)); - this.slot = b.readInt(); - this.count = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index 925210aae..c1b71bb62 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -53,26 +53,12 @@ static Color readColor(ByteBuf b) default void write(ByteBuf b) { - try - { - handle.writeObject(b, this); - } - catch (Exception e) - { - throw new RuntimeException("Writing event " + this.getClass().getSimpleName() + " failed: " + e, e); - } + handle.writeObject(b, this); } default void read(ByteBuf b) { - try - { - handle.readObject(b, this); - } - catch (Exception e) - { - throw new RuntimeException("Reading event " + this.getClass().getSimpleName() + " failed: " + e, e); - } + handle.readObject(b, this); } void execute(); diff --git a/src/main/java/tanks/network/event/online/EventAddShape.java b/src/main/java/tanks/network/event/online/EventAddShape.java index 37b4ef2c8..2ee60ee25 100644 --- a/src/main/java/tanks/network/event/online/EventAddShape.java +++ b/src/main/java/tanks/network/event/online/EventAddShape.java @@ -47,40 +47,6 @@ public EventAddShape(int id, ScreenOnline.Shape s) this.yAlignment = s.yAlignment; } - @Override - public void write(ByteBuf b) - { - b.writeInt(this.id); - b.writeDouble(this.posX); - b.writeDouble(this.posY); - b.writeDouble(this.sizeX); - b.writeDouble(this.sizeY); - b.writeInt(this.type); - b.writeDouble(this.colorR); - b.writeDouble(this.colorG); - b.writeDouble(this.colorB); - b.writeDouble(this.colorA); - b.writeInt(this.xAlignment); - b.writeInt(this.yAlignment); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - this.posX = b.readDouble(); - this.posY = b.readDouble(); - this.sizeX = b.readDouble(); - this.sizeY = b.readDouble(); - this.type = b.readInt(); - this.colorR = b.readDouble(); - this.colorG = b.readDouble(); - this.colorB = b.readDouble(); - this.colorA = b.readDouble(); - this.xAlignment = b.readInt(); - this.yAlignment = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/online/EventRemoveText.java b/src/main/java/tanks/network/event/online/EventRemoveText.java index c73555aad..cdf5de0fb 100644 --- a/src/main/java/tanks/network/event/online/EventRemoveText.java +++ b/src/main/java/tanks/network/event/online/EventRemoveText.java @@ -20,18 +20,6 @@ public EventRemoveText() } - @Override - public void write(ByteBuf b) - { - b.writeInt(id); - } - - @Override - public void read(ByteBuf b) - { - this.id = b.readInt(); - } - @Override public void execute() { diff --git a/src/main/java/tanks/network/event/online/EventSilentDisconnect.java b/src/main/java/tanks/network/event/online/EventSilentDisconnect.java index f4b2b8b3b..b80099b41 100644 --- a/src/main/java/tanks/network/event/online/EventSilentDisconnect.java +++ b/src/main/java/tanks/network/event/online/EventSilentDisconnect.java @@ -5,22 +5,8 @@ import tanks.network.Client; import tanks.network.event.PersonalEvent; -import io.netty.buffer.ByteBuf; - public class EventSilentDisconnect extends PersonalEvent { - @Override - public void write(ByteBuf b) - { - - } - - @Override - public void read(ByteBuf b) - { - - } - @Override public void execute() { diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index 2b053a588..9ab6ecbbe 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -272,8 +272,7 @@ else if (b.slots[b.selected] instanceof ItemMine.ItemStackMine) lastMaxLiveMines = mlm; } - public void controllerUpdate(double x, double y, double vX, double vY, double angle, double mX, double mY, boolean action1, boolean action2, boolean[] quickActions, - double time, long receiveTime) + public void controllerUpdate(double x, double y, double vX, double vY, double angle, double mX, double mY, boolean action1, boolean action2, int quickActions, double time, long receiveTime) { if (this.destroy) return; @@ -462,7 +461,7 @@ else if (b instanceof BulletAirStrike) { for (int i = 0; i < this.abilities.size(); i++) { - if (quickActions[i]) + if ((quickActions >> i) % 2 == 1) this.quickAction(i); } } From 207d90e9ba646db17317470c9ff4c77b0aba2364 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Tue, 31 Mar 2026 23:15:28 -0700 Subject: [PATCH 34/35] fix: delete unused methods, add comment Signed-off-by: orangishcat --- .../java/tanks/network/TCPLatencyHandler.java | 192 ------------------ .../tanks/network/event/IStackableEvent.java | 7 - .../java/tanks/tank/TankPlayerRemote.java | 3 +- 3 files changed, 2 insertions(+), 200 deletions(-) delete mode 100644 src/main/java/tanks/network/TCPLatencyHandler.java diff --git a/src/main/java/tanks/network/TCPLatencyHandler.java b/src/main/java/tanks/network/TCPLatencyHandler.java deleted file mode 100644 index c647619e0..000000000 --- a/src/main/java/tanks/network/TCPLatencyHandler.java +++ /dev/null @@ -1,192 +0,0 @@ -package tanks.network; - -import io.netty.channel.*; -import io.netty.util.ReferenceCountUtil; - -import java.nio.channels.ClosedChannelException; -import java.util.*; -import java.util.concurrent.*; - -/** - * TCP-only, preserves order even with jitter by monotonic due-times. - * Written by AI - */ -public final class TCPLatencyHandler extends ChannelDuplexHandler -{ - private final int oneWayMs; - private final int jitterMs; - - public TCPLatencyHandler(int oneWayMs, int jitterMs) - { - this.oneWayMs = Math.max(0, oneWayMs); - this.jitterMs = Math.max(0, jitterMs); - } - - // -------- Outbound (write/flush) -------- - private static final class OutItem - { - final Object msg; - final ChannelPromise promise; - final boolean isFlush; - final long dueNs; - - OutItem(Object msg, ChannelPromise p, boolean isFlush, long dueNs) - { - this.msg = msg; - this.promise = p; - this.isFlush = isFlush; - this.dueNs = dueNs; - } - } - - private final Deque outQ = new ArrayDeque<>(); - private boolean outScheduled = false; - private long lastOutDue = 0L; - - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise p) - { - enqueueOutbound(ctx, new OutItem(msg, p, false, nextOutDue())); - scheduleOutbound(ctx); - } - - @Override - public void flush(ChannelHandlerContext ctx) - { - enqueueOutbound(ctx, new OutItem(null, null, true, nextOutDue())); - scheduleOutbound(ctx); - } - - private long nextOutDue() - { - long now = System.nanoTime(); - long jitter = (jitterMs == 0) ? 0 : ThreadLocalRandom.current().nextInt(-jitterMs, jitterMs + 1); - long due = now + TimeUnit.MILLISECONDS.toNanos(Math.max(0, oneWayMs + jitter)); - if (due < lastOutDue) due = lastOutDue; // enforce monotonicity => preserves order - return lastOutDue = due; - } - - private void enqueueOutbound(ChannelHandlerContext ctx, OutItem it) - { - outQ.addLast(it); - } - - private void scheduleOutbound(ChannelHandlerContext ctx) - { - if (outScheduled) return; - outScheduled = true; - drainOutbound(ctx); - } - - private void drainOutbound(ChannelHandlerContext ctx) - { - Runnable task = new Runnable() - { - @Override - public void run() - { - outScheduled = false; - long now = System.nanoTime(); - // Run all items that are due - while (!outQ.isEmpty() && outQ.peekFirst().dueNs <= now) - { - OutItem it = outQ.pollFirst(); - if (it.isFlush) - { - ctx.flush(); - } - else - { - ctx.write(it.msg, it.promise); - } - } - if (!outQ.isEmpty()) - { - long delayNs = Math.max(0, outQ.peekFirst().dueNs - System.nanoTime()); - outScheduled = true; - ctx.executor().schedule(this, delayNs, TimeUnit.NANOSECONDS); - } - } - }; - long delayNs = outQ.isEmpty() ? 0 : Math.max(0, outQ.peekFirst().dueNs - System.nanoTime()); - ctx.executor().schedule(task, delayNs, TimeUnit.NANOSECONDS); - } - - // -------- Inbound (read) -------- - private static final class InItem - { - final Object msg; - final long dueNs; - - InItem(Object msg, long dueNs) - { - this.msg = msg; - this.dueNs = dueNs; - } - } - - private final Deque inQ = new ArrayDeque<>(); - private boolean inScheduled = false; - private long lastInDue = 0L; - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) - { - long now = System.nanoTime(); - long jitter = (jitterMs == 0) ? 0 : ThreadLocalRandom.current().nextInt(-jitterMs, jitterMs + 1); - long due = now + TimeUnit.MILLISECONDS.toNanos(Math.max(0, oneWayMs + jitter)); - if (due < lastInDue) due = lastInDue; // preserve arrival order - lastInDue = due; - - inQ.addLast(new InItem(msg, due)); - scheduleInbound(ctx); - } - - private void scheduleInbound(ChannelHandlerContext ctx) - { - if (inScheduled) return; - inScheduled = true; - drainInbound(ctx); - } - - private void drainInbound(ChannelHandlerContext ctx) - { - Runnable task = new Runnable() - { - @Override - public void run() - { - inScheduled = false; - long now = System.nanoTime(); - while (!inQ.isEmpty() && inQ.peekFirst().dueNs <= now) - { - InItem it = inQ.pollFirst(); - ctx.fireChannelRead(it.msg); - } - if (!inQ.isEmpty()) - { - long delayNs = Math.max(0, inQ.peekFirst().dueNs - System.nanoTime()); - inScheduled = true; - ctx.executor().schedule(this, delayNs, TimeUnit.NANOSECONDS); - } - } - }; - long delayNs = inQ.isEmpty() ? 0 : Math.max(0, inQ.peekFirst().dueNs - System.nanoTime()); - ctx.executor().schedule(task, delayNs, TimeUnit.NANOSECONDS); - } - - // -------- Cleanup -------- - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception - { - // Release any buffered ByteBufs on close to avoid leaks - while (!inQ.isEmpty()) ReferenceCountUtil.release(inQ.pollFirst().msg); - while (!outQ.isEmpty()) - { - OutItem it = outQ.pollFirst(); - if (it.msg != null) ReferenceCountUtil.release(it.msg); - if (it.promise != null && !it.promise.isDone()) it.promise.setFailure(new ClosedChannelException()); - } - super.channelInactive(ctx); - } -} diff --git a/src/main/java/tanks/network/event/IStackableEvent.java b/src/main/java/tanks/network/event/IStackableEvent.java index 37de93e1f..5ef7709b0 100644 --- a/src/main/java/tanks/network/event/IStackableEvent.java +++ b/src/main/java/tanks/network/event/IStackableEvent.java @@ -1,7 +1,5 @@ package tanks.network.event; -import tanks.network.NetworkEventMap; - /** Given multiple events that implement this, if they have the same identifier, only the latest one is sent */ public interface IStackableEvent extends INetworkEvent { @@ -12,11 +10,6 @@ default boolean isStackable() return true; } - static int key(IStackableEvent e) - { - return f(NetworkEventMap.get(e.getClass()) + f(e.getIdentifier())); - } - static int f(int i) { return 1664525 * i + 1013904223; diff --git a/src/main/java/tanks/tank/TankPlayerRemote.java b/src/main/java/tanks/tank/TankPlayerRemote.java index 9ab6ecbbe..ed1e21e62 100644 --- a/src/main/java/tanks/tank/TankPlayerRemote.java +++ b/src/main/java/tanks/tank/TankPlayerRemote.java @@ -461,7 +461,8 @@ else if (b instanceof BulletAirStrike) { for (int i = 0; i < this.abilities.size(); i++) { - if ((quickActions >> i) % 2 == 1) + // tests whether the `i`th bit in quickActions set to 1 + if ((quickActions & (1 << i)) != 0) this.quickAction(i); } } From bee413b859e0bf65b5b261ab1457d148fda12285 Mon Sep 17 00:00:00 2001 From: orangishcat Date: Wed, 1 Apr 2026 18:57:27 -0700 Subject: [PATCH 35/35] fix: explosion radius, move ReflectionHandle.java Signed-off-by: orangishcat --- src/main/java/tanks/network/NetworkEventMap.java | 1 - src/main/java/tanks/{tankson => network}/ReflectionHandle.java | 2 +- src/main/java/tanks/network/event/INetworkEvent.java | 2 +- src/main/java/tanks/tank/Explosion.java | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) rename src/main/java/tanks/{tankson => network}/ReflectionHandle.java (99%) diff --git a/src/main/java/tanks/network/NetworkEventMap.java b/src/main/java/tanks/network/NetworkEventMap.java index 1e8bc6d19..2896c44d4 100644 --- a/src/main/java/tanks/network/NetworkEventMap.java +++ b/src/main/java/tanks/network/NetworkEventMap.java @@ -3,7 +3,6 @@ import io.netty.buffer.*; import tanks.Game; import tanks.network.event.INetworkEvent; -import tanks.tankson.ReflectionHandle; import java.util.HashMap; diff --git a/src/main/java/tanks/tankson/ReflectionHandle.java b/src/main/java/tanks/network/ReflectionHandle.java similarity index 99% rename from src/main/java/tanks/tankson/ReflectionHandle.java rename to src/main/java/tanks/network/ReflectionHandle.java index 9a9efeda0..7e4b2301c 100644 --- a/src/main/java/tanks/tankson/ReflectionHandle.java +++ b/src/main/java/tanks/network/ReflectionHandle.java @@ -1,4 +1,4 @@ -package tanks.tankson; +package tanks.network; import tanks.*; diff --git a/src/main/java/tanks/network/event/INetworkEvent.java b/src/main/java/tanks/network/event/INetworkEvent.java index c1b71bb62..3bc8571df 100644 --- a/src/main/java/tanks/network/event/INetworkEvent.java +++ b/src/main/java/tanks/network/event/INetworkEvent.java @@ -3,7 +3,7 @@ import basewindow.Color; import io.netty.buffer.ByteBuf; import tanks.network.NetworkUtils; -import tanks.tankson.ReflectionHandle; +import tanks.network.ReflectionHandle; import java.lang.annotation.*; import java.util.UUID; diff --git a/src/main/java/tanks/tank/Explosion.java b/src/main/java/tanks/tank/Explosion.java index c8a0e4ff6..050039c87 100644 --- a/src/main/java/tanks/tank/Explosion.java +++ b/src/main/java/tanks/tank/Explosion.java @@ -217,7 +217,7 @@ public void explode() for (Obstacle o: Obstacle.getObstaclesInRadius(posX, posY, radius + Game.tile_size / 2)) { if (!o.destructible) continue; - Game.eventsOut.add(new EventObstacleDestroy(o.posX, o.posY, o.name, posX, posY, radius)); + Game.eventsOut.add(new EventObstacleDestroy(o.posX, o.posY, o.name, posX, posY, radius + Game.tile_size / 2)); o.onDestroy(this); o.playDestroyAnimation(this.posX, this.posY, this.radius); }