From c5006f4c3868fca65d474c90ab0539f144a8c208 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 22 Oct 2024 16:54:52 +0900 Subject: [PATCH] Allow leaving battle gui temporarily, refactorings --- .../TurnBasedMinecraft/client/BattleGui.java | 29 +++++++++++++++++-- .../client/ClientProxy.java | 4 +++ .../TurnBasedMinecraft/common/Battle.java | 10 ++++++- .../common/TurnBasedMinecraftMod.java | 3 +- .../common/networking/PacketBattleInfo.java | 7 +++-- .../networking/PacketBattleRequestInfo.java | 1 + 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java index 9a8c441..de97abf 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java @@ -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 } diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java index 04d2cb0..bfe4846 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java @@ -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: diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Battle.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Battle.java index c6a060c..bc46e10 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Battle.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Battle.java @@ -49,6 +49,8 @@ public class Battle { private ResourceKey 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 combatants = new ArrayList(); combatants.addAll(sideA.values()); diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java index 3856b22..9b8a142 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java @@ -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(); diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java index adb65d7..44e619e 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java @@ -16,11 +16,13 @@ import org.jetbrains.annotations.NotNull; import java.util.Collection; -public record PacketBattleInfo(Collection sideA, Collection sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) implements CustomPacketPayload +public record PacketBattleInfo(int battleID, Collection sideA, Collection sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) implements CustomPacketPayload { public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattleinfo")); public static final StreamCodec 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 sideA, Collection 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 sideA, Collection si TurnBasedMinecraftMod.proxy.getLocalBattle().addCombatantToSideB(e); } } + TurnBasedMinecraftMod.proxy.setBattleGuiAsGui(); TurnBasedMinecraftMod.proxy.setBattleGuiTime((int)(pkt.decisionNanos / 1000000000L)); TurnBasedMinecraftMod.proxy.setBattleGuiBattleChanged(); TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled); diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java index cb59b56..13a1ee1 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java @@ -41,6 +41,7 @@ public record PacketBattleRequestInfo(int battleID) implements CustomPacketPaylo return; } ctx.reply(new PacketBattleInfo( + b.getId(), b.getSideAIDs(), b.getSideBIDs(), b.getTimerNanos(),