diff --git a/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java b/src/main/java/com/burnedkirby/TurnBasedMinecraft/client/BattleGui.java index 4e0a1a3..25365f2 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,13 +226,29 @@ 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) { @@ -354,9 +372,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) { + TurnBasedMinecraftMod.proxy.displayString("Leaving GUI, but the battle continues!"); + getMinecraft().setScreen(null); + 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 65aa3a8..baaa74f 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 7fc5ae1..607436e 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()) { TurnBasedMinecraftMod.getHandler().send(infoPacket, PacketDistributor.PLAYER.with((ServerPlayer)p.entity)); } @@ -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 badd885..6310282 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java @@ -50,7 +50,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 Integer PROTOCOL_VERSION = 4; + private static final Integer PROTOCOL_VERSION = 5; private static final ResourceLocation HANDLER_ID = ResourceLocation.fromNamespaceAndPath(MODID, "main_channel"); private static final SimpleChannel HANDLER = ChannelBuilder 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 c97c799..d7a6843 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleInfo.java @@ -13,6 +13,7 @@ import java.util.function.Function; public class PacketBattleInfo { + private int battleID; private Collection sideA; private Collection sideB; private long decisionNanos; @@ -22,6 +23,7 @@ public class PacketBattleInfo public PacketBattleInfo() { + battleID = 0; sideA = new ArrayList(); sideB = new ArrayList(); decisionNanos = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(); @@ -29,8 +31,9 @@ public class PacketBattleInfo turnTimerEnabled = false; } - public PacketBattleInfo(Collection sideA, Collection sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) + public PacketBattleInfo(int battleID, Collection sideA, Collection sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) { + this.battleID = battleID; this.sideA = sideA; this.sideB = sideB; this.decisionNanos = decisionNanos; @@ -43,6 +46,7 @@ public class PacketBattleInfo @Override public void accept(PacketBattleInfo msg, RegistryFriendlyByteBuf buf) { + buf.writeInt(msg.battleID); buf.writeInt(msg.sideA.size()); buf.writeInt(msg.sideB.size()); for(Integer id : msg.sideA) { @@ -62,6 +66,7 @@ public class PacketBattleInfo @Override public PacketBattleInfo apply(RegistryFriendlyByteBuf buf) { + int battleID = buf.readInt(); int sideACount = buf.readInt(); int sideBCount = buf.readInt(); Collection sideA = new ArrayList(sideACount); @@ -75,7 +80,7 @@ public class PacketBattleInfo long decisionNanos = buf.readLong(); long maxDecisionNanos = buf.readLong(); boolean turnTimerEnabled = buf.readBoolean(); - return new PacketBattleInfo(sideA, sideB, decisionNanos, maxDecisionNanos, turnTimerEnabled); + return new PacketBattleInfo(battleID, sideA, sideB, decisionNanos, maxDecisionNanos, turnTimerEnabled); } } @@ -87,7 +92,7 @@ public class PacketBattleInfo ctx.enqueueWork(() -> { if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null) { - return; + TurnBasedMinecraftMod.proxy.createLocalBattle(pkt.battleID); } TurnBasedMinecraftMod.proxy.getLocalBattle().clearCombatants(); for(Integer id : pkt.sideA) @@ -106,6 +111,7 @@ public class PacketBattleInfo 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 b21175d..6d1b395 100644 --- a/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java +++ b/src/main/java/com/burnedkirby/TurnBasedMinecraft/common/networking/PacketBattleRequestInfo.java @@ -47,7 +47,7 @@ public class PacketBattleRequestInfo if(b == null) { return; } - TurnBasedMinecraftMod.getHandler().reply(new PacketBattleInfo(b.getSideAIDs(), b.getSideBIDs(), b.getTimerNanos(), TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever()), ctx); + TurnBasedMinecraftMod.getHandler().reply(new PacketBattleInfo(b.getId(), b.getSideAIDs(), b.getSideBIDs(), b.getTimerNanos(), TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever()), ctx); }); ctx.setPacketHandled(true); }