]> git.seodisparate.com - TurnBasedMinecraftMod/commitdiff
Allow leaving battle gui temporarily, refactorings
authorStephen Seo <seo.disparate@gmail.com>
Tue, 22 Oct 2024 07:54:52 +0000 (16:54 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 23 Oct 2024 07:23:10 +0000 (16:23 +0900)
src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java
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/PacketBattleInfo.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java

index 9a8c44115e5e2009ea18fdda1fe2c7226a4d9987..de97abf347464a0aeee2f36ba805343400faf1c5 100644 (file)
@@ -28,6 +28,7 @@ public class BattleGui extends Screen {
        private MenuState state;
        private boolean stateChanged;
        private String info;
+       private Long waitMissingBattleTicks;
 
        private enum MenuState {
                MAIN_MENU(0), ATTACK_TARGET(1), ITEM_ACTION(2), WAITING(3), SWITCH_ITEM(4), USE_ITEM(5);
@@ -91,6 +92,7 @@ public class BattleGui extends Screen {
                elapsedTime = 0;
                state = MenuState.MAIN_MENU;
                stateChanged = true;
+               waitMissingBattleTicks = null;
        }
 
        private void setState(MenuState state) {
@@ -224,14 +226,31 @@ public class BattleGui extends Screen {
                }
        }
 
+       private int colorFromTicks(final Long ticks) {
+               if (ticks < 20 * 10) {
+                       double value = (20 * 10 - ticks.intValue()) / (20.0 * 10.0);
+                       return 0xFF0000FF | (((int)(value * 255.0)) << 8) |  (((int)(value * 255.0)) << 16);
+               } else {
+                       return 0xFF0000FF;
+               }
+       }
+
        @Override
        public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
                if (TurnBasedMinecraftMod.proxy.getLocalBattle() == null) {
+                       if (waitMissingBattleTicks == null) {
+                               waitMissingBattleTicks = 0L;
+                       } else {
+                               waitMissingBattleTicks += 1L;
+                       }
                        // drawHoveringText("Waiting...", width / 2 - 50, height / 2);
-                       drawString(guiGraphics, "Waiting...", width / 2 - 50, height / 2, 0xFFFFFFFF);
+                       drawString(guiGraphics, "Waiting...", width / 2 - 50, height / 2, colorFromTicks(waitMissingBattleTicks));
                        super.render(guiGraphics, mouseX, mouseY, partialTicks);
                        return;
+               } else {
+                       waitMissingBattleTicks = null;
                }
+
                if (TurnBasedMinecraftMod.proxy.getLocalBattle().getState() == Battle.State.DECISION
                                && timeRemaining.get() > 0) {
                        long nextInstant = System.nanoTime();
@@ -352,9 +371,13 @@ public class BattleGui extends Screen {
        }
 
        @Override
-       public boolean keyPressed(int a, int b, int c) {
+       public boolean keyPressed(int keyCode, int b, int c) {
                if (getMinecraft().player.isCreative()) {
-                       return super.keyPressed(a, b, c);
+                       return super.keyPressed(keyCode, b, c);
+               } else if (keyCode == 256) {
+                       getMinecraft().setScreen(null);
+                       TurnBasedMinecraftMod.proxy.displayString("Leaving GUI, but the battle continues!");
+                       return true;
                }
                return false; // TODO verify return value
        }
index 04d2cb090784313e6e26a8aa09829f77e2b339ec..bfe48468f98585c6b95091ab1f0aa29ea2e5c549 100644 (file)
@@ -370,6 +370,10 @@ public class ClientProxy extends CommonProxy {
                     break;
                 case TURN_BEGIN:
                     TurnBasedMinecraftMod.proxy.displayString("The turn begins!");
+                    if (TurnBasedMinecraftMod.proxy.getLocalBattle() == null || TurnBasedMinecraftMod.proxy.getLocalBattle().getId() != pkt.getAmount()) {
+                        TurnBasedMinecraftMod.proxy.createLocalBattle(pkt.getAmount());
+                    }
+                    TurnBasedMinecraftMod.proxy.battleStarted();
                     TurnBasedMinecraftMod.proxy.battleGuiTurnBegin();
                     break;
                 case TURN_END:
index c6a060c44e08a719799a683539236e3959efbe74..bc46e109c5f976d1ea5eea5b8eb6728089622dd7 100644 (file)
@@ -49,6 +49,8 @@ public class Battle {
 
     private ResourceKey<Level> dimension;
 
+    private long infoNanos;
+
     public enum State {
         DECISION(0),
         ACTION(1),
@@ -122,6 +124,7 @@ public class Battle {
         undecidedCount = new AtomicInteger(0);
         random = new Random();
         this.dimension = dimension;
+        infoNanos = 0;
         if (sideA != null) {
             for (Entity e : sideA) {
                 EntityInfo entityInfo;
@@ -447,7 +450,7 @@ public class Battle {
         if (!isServer) {
             return;
         }
-        PacketBattleInfo infoPacket = new PacketBattleInfo(getSideAIDs(), getSideBIDs(), timer, TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever());
+        PacketBattleInfo infoPacket = new PacketBattleInfo(getId(), getSideAIDs(), getSideBIDs(), timer, TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever());
         for (Combatant p : players.values()) {
             PacketDistributor.sendToPlayer((ServerPlayer)p.entity, infoPacket);
         }
@@ -651,6 +654,11 @@ public class Battle {
     }
 
     private boolean update(final long dt) {
+        infoNanos += dt;
+        if (infoNanos >= 4000000000L) {
+            infoNanos = 0;
+            notifyPlayersBattleInfo();
+        }
         if (battleEnded) {
             Collection<Combatant> combatants = new ArrayList<Combatant>();
             combatants.addAll(sideA.values());
index 3856b227654a65e13e118b8a96a43be81f3d37e9..9b8a142c73dc5573159576747095a1532311bf02 100644 (file)
@@ -27,7 +27,6 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
 import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
 import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
 import net.neoforged.fml.loading.FMLEnvironment;
-import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
 import net.neoforged.neoforge.common.NeoForge;
 import net.neoforged.neoforge.event.RegisterCommandsEvent;
 import net.neoforged.neoforge.event.server.ServerStartingEvent;
@@ -53,7 +52,7 @@ public class TurnBasedMinecraftMod {
     public static final String MUSIC_SILLY = MUSIC_ROOT + "silly/";
     public static final String MUSIC_BATTLE = MUSIC_ROOT + "battle/";
 
-    private static final String PROTOCOL_VERSION = Integer.toString(3);
+    private static final String PROTOCOL_VERSION = Integer.toString(4);
     private static final ResourceLocation HANDLER_ID = ResourceLocation.fromNamespaceAndPath(MODID, "main_channel");
     protected static Logger logger = LogManager.getLogger();
 
index adb65d7c8e41dd0ac9011d59480260f4a5f7da7d..44e619e58cf70c9e65aa6aa4bea10d3631baeb10 100644 (file)
@@ -16,11 +16,13 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
 
-public record PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) implements CustomPacketPayload
+public record PacketBattleInfo(int battleID, Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) implements CustomPacketPayload
 {
     public static final CustomPacketPayload.Type<PacketBattleInfo> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattleinfo"));
 
     public static final StreamCodec<ByteBuf, PacketBattleInfo> STREAM_CODEC = StreamCodec.composite(
+        ByteBufCodecs.INT,
+        PacketBattleInfo::battleID,
         CommonProxy.COLLECTION_INT_CODEC,
         PacketBattleInfo::sideA,
         CommonProxy.COLLECTION_INT_CODEC,
@@ -45,7 +47,7 @@ public record PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> si
             ctx.enqueueWork(() -> {
                 if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null)
                 {
-                    return;
+                    TurnBasedMinecraftMod.proxy.createLocalBattle(pkt.battleID);
                 }
                 TurnBasedMinecraftMod.proxy.getLocalBattle().clearCombatants();
                 for(Integer id : pkt.sideA)
@@ -64,6 +66,7 @@ public record PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> si
                         TurnBasedMinecraftMod.proxy.getLocalBattle().addCombatantToSideB(e);
                     }
                 }
+                TurnBasedMinecraftMod.proxy.setBattleGuiAsGui();
                 TurnBasedMinecraftMod.proxy.setBattleGuiTime((int)(pkt.decisionNanos / 1000000000L));
                 TurnBasedMinecraftMod.proxy.setBattleGuiBattleChanged();
                 TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled);
index cb59b561b415be4b93e31a10e6ddc02d8fe3b21d..13a1ee14657da91714715d9f5c5d35a05e928ebd 100644 (file)
@@ -41,6 +41,7 @@ public record PacketBattleRequestInfo(int battleID) implements CustomPacketPaylo
                     return;
                 }
                 ctx.reply(new PacketBattleInfo(
+                        b.getId(),
                         b.getSideAIDs(),
                         b.getSideBIDs(),
                         b.getTimerNanos(),