]> git.seodisparate.com - TurnBasedMinecraftMod/commitdiff
Use "PacketBattlePing" for "pings"
authorStephen Seo <seo.disparate@gmail.com>
Tue, 22 Oct 2024 11:10:50 +0000 (20:10 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 23 Oct 2024 07:23:10 +0000 (16:23 +0900)
More efficient than using "PacketBattleInfo" every 4 seconds which is
heftier than a single battleID.

Currently "PacketBattlePing" is used to cause the client to show the
BattleGUI if it is not open.

src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Battle.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattlePing.java [new file with mode: 0644]

index bc46e109c5f976d1ea5eea5b8eb6728089622dd7..67104bb33eac0637f9160dede1bfdd8c0ac03124 100644 (file)
@@ -2,6 +2,7 @@ package com.burnedkirby.TurnBasedMinecraft.common;
 
 import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattleInfo;
 import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattleMessage;
+import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattlePing;
 import net.minecraft.resources.ResourceKey;
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.InteractionHand;
@@ -49,7 +50,7 @@ public class Battle {
 
     private ResourceKey<Level> dimension;
 
-    private long infoNanos;
+    private long pingTimerNanos;
 
     public enum State {
         DECISION(0),
@@ -124,7 +125,7 @@ public class Battle {
         undecidedCount = new AtomicInteger(0);
         random = new Random();
         this.dimension = dimension;
-        infoNanos = 0;
+        pingTimerNanos = 0;
         if (sideA != null) {
             for (Entity e : sideA) {
                 EntityInfo entityInfo;
@@ -456,6 +457,16 @@ public class Battle {
         }
     }
 
+    protected void notifyPlayersBattlePing() {
+        if (!isServer) {
+            return;
+        }
+        PacketBattlePing pingPacket = new PacketBattlePing(getId());
+        for (Combatant p : players.values()) {
+            PacketDistributor.sendToPlayer((ServerPlayer)p.entity, pingPacket);
+        }
+    }
+
     protected void sendMessageToAllPlayers(PacketBattleMessage.MessageType type, int from, int to, int amount) {
         sendMessageToAllPlayers(type, from, to, amount, new String());
     }
@@ -654,10 +665,10 @@ public class Battle {
     }
 
     private boolean update(final long dt) {
-        infoNanos += dt;
-        if (infoNanos >= 4000000000L) {
-            infoNanos = 0;
-            notifyPlayersBattleInfo();
+        pingTimerNanos += dt;
+        if (pingTimerNanos >= 4000000000L) {
+            pingTimerNanos = 0;
+            notifyPlayersBattlePing();
         }
         if (battleEnded) {
             Collection<Combatant> combatants = new ArrayList<Combatant>();
index 9b8a142c73dc5573159576747095a1532311bf02..3528addd90d7ab6220ab67a275e8db6d61d0f2a9 100644 (file)
@@ -88,6 +88,8 @@ public class TurnBasedMinecraftMod {
 
         registrar.playToClient(PacketClientGUI.TYPE, PacketClientGUI.STREAM_CODEC, new PacketClientGUI.PayloadHandler());
 
+        registrar.playToClient(PacketBattlePing.TYPE, PacketBattlePing.STREAM_CODEC, new PacketBattlePing.PayloadHandler());
+
         logger.debug("Register packets com_burnedkirby_turnbasedminecraft");
     }
 
diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattlePing.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattlePing.java
new file mode 100644 (file)
index 0000000..08ed1ff
--- /dev/null
@@ -0,0 +1,43 @@
+package com.burnedkirby.TurnBasedMinecraft.common.networking;
+
+import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.codec.ByteBufCodecs;
+import net.minecraft.network.codec.StreamCodec;
+import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
+import net.minecraft.resources.ResourceLocation;
+import net.neoforged.neoforge.network.handling.IPayloadContext;
+import net.neoforged.neoforge.network.handling.IPayloadHandler;
+import org.jetbrains.annotations.NotNull;
+
+public record PacketBattlePing(int battleID) implements CustomPacketPayload {
+    public static final CustomPacketPayload.Type<PacketBattlePing> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattleping"));
+
+    public static final StreamCodec<ByteBuf, PacketBattlePing> STREAM_CODEC = StreamCodec.composite(
+        ByteBufCodecs.VAR_INT,
+        PacketBattlePing::battleID,
+        PacketBattlePing::new
+    );
+
+    @Override
+    public Type<? extends CustomPacketPayload> type() {
+        return TYPE;
+    }
+
+    public static class PayloadHandler implements IPayloadHandler<PacketBattlePing> {
+        @Override
+        public void handle(final @NotNull PacketBattlePing pkt, IPayloadContext ctx) {
+            ctx.enqueueWork(() -> {
+                if (TurnBasedMinecraftMod.proxy.getLocalBattle() == null) {
+                    TurnBasedMinecraftMod.proxy.createLocalBattle(pkt.battleID);
+                }
+                TurnBasedMinecraftMod.proxy.setBattleGuiAsGui();
+                TurnBasedMinecraftMod.proxy.setBattleGuiBattleChanged();
+            }).exceptionally(e -> {
+                ctx.disconnect(Component.literal("Exception handling PacketBattlePing! " + e.getMessage()));
+                return null;
+            });
+        }
+    }
+}