Compare commits

..

2 commits

Author SHA1 Message Date
c38f19840a Update Changelog.md 2024-10-22 17:09:45 +09:00
b71e6b49b9 Allow leaving battle gui temporarily, refactorings 2024-10-22 17:06:02 +09:00
7 changed files with 52 additions and 9 deletions

View file

@ -4,6 +4,9 @@ Minor fixes/refactorings that should make the mod more robust.
Port to Forge 52.0.22 (Minecraft 1.21.1). Port to Forge 52.0.22 (Minecraft 1.21.1).
Allow leaving battle GUI with Escape key (temporarily), and some refactorings
to fix that pesky transient client-freeze-bug.
# Version Forge-1.26.0 # Version Forge-1.26.0
Port to Forge 52.0.21 (Minecraft 1.21.1). Port to Forge 52.0.21 (Minecraft 1.21.1).

View file

@ -28,6 +28,7 @@ public class BattleGui extends Screen {
private MenuState state; private MenuState state;
private boolean stateChanged; private boolean stateChanged;
private String info; private String info;
private Long waitMissingBattleTicks;
private enum MenuState { private enum MenuState {
MAIN_MENU(0), ATTACK_TARGET(1), ITEM_ACTION(2), WAITING(3), SWITCH_ITEM(4), USE_ITEM(5); 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; elapsedTime = 0;
state = MenuState.MAIN_MENU; state = MenuState.MAIN_MENU;
stateChanged = true; stateChanged = true;
waitMissingBattleTicks = null;
} }
private void setState(MenuState state) { 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 @Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
if (TurnBasedMinecraftMod.proxy.getLocalBattle() == null) { if (TurnBasedMinecraftMod.proxy.getLocalBattle() == null) {
if (waitMissingBattleTicks == null) {
waitMissingBattleTicks = 0L;
} else {
waitMissingBattleTicks += 1L;
}
// drawHoveringText("Waiting...", width / 2 - 50, height / 2); // 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); super.render(guiGraphics, mouseX, mouseY, partialTicks);
return; return;
} else {
waitMissingBattleTicks = null;
} }
if (TurnBasedMinecraftMod.proxy.getLocalBattle().getState() == Battle.State.DECISION if (TurnBasedMinecraftMod.proxy.getLocalBattle().getState() == Battle.State.DECISION
&& timeRemaining.get() > 0) { && timeRemaining.get() > 0) {
@ -354,9 +372,13 @@ public class BattleGui extends Screen {
} }
@Override @Override
public boolean keyPressed(int a, int b, int c) { public boolean keyPressed(int keyCode, int b, int c) {
if (getMinecraft().player.isCreative()) { 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 return false; // TODO verify return value
} }

View file

@ -370,6 +370,10 @@ public class ClientProxy extends CommonProxy {
break; break;
case TURN_BEGIN: case TURN_BEGIN:
TurnBasedMinecraftMod.proxy.displayString("The turn begins!"); 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(); TurnBasedMinecraftMod.proxy.battleGuiTurnBegin();
break; break;
case TURN_END: case TURN_END:

View file

@ -49,6 +49,8 @@ public class Battle {
private ResourceKey<Level> dimension; private ResourceKey<Level> dimension;
private long infoNanos;
public enum State { public enum State {
DECISION(0), DECISION(0),
ACTION(1), ACTION(1),
@ -122,6 +124,7 @@ public class Battle {
undecidedCount = new AtomicInteger(0); undecidedCount = new AtomicInteger(0);
random = new Random(); random = new Random();
this.dimension = dimension; this.dimension = dimension;
infoNanos = 0;
if (sideA != null) { if (sideA != null) {
for (Entity e : sideA) { for (Entity e : sideA) {
EntityInfo entityInfo; EntityInfo entityInfo;
@ -447,7 +450,7 @@ public class Battle {
if (!isServer) { if (!isServer) {
return; 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()) { for (Combatant p : players.values()) {
TurnBasedMinecraftMod.getHandler().send(infoPacket, PacketDistributor.PLAYER.with((ServerPlayer)p.entity)); TurnBasedMinecraftMod.getHandler().send(infoPacket, PacketDistributor.PLAYER.with((ServerPlayer)p.entity));
} }
@ -651,6 +654,11 @@ public class Battle {
} }
private boolean update(final long dt) { private boolean update(final long dt) {
infoNanos += dt;
if (infoNanos >= 4000000000L) {
infoNanos = 0;
notifyPlayersBattleInfo();
}
if (battleEnded) { if (battleEnded) {
Collection<Combatant> combatants = new ArrayList<Combatant>(); Collection<Combatant> combatants = new ArrayList<Combatant>();
combatants.addAll(sideA.values()); combatants.addAll(sideA.values());

View file

@ -50,7 +50,7 @@ public class TurnBasedMinecraftMod {
public static final String MUSIC_SILLY = MUSIC_ROOT + "silly/"; public static final String MUSIC_SILLY = MUSIC_ROOT + "silly/";
public static final String MUSIC_BATTLE = MUSIC_ROOT + "battle/"; 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 ResourceLocation HANDLER_ID = ResourceLocation.fromNamespaceAndPath(MODID, "main_channel");
private static final SimpleChannel HANDLER = ChannelBuilder private static final SimpleChannel HANDLER = ChannelBuilder

View file

@ -13,6 +13,7 @@ import java.util.function.Function;
public class PacketBattleInfo public class PacketBattleInfo
{ {
private int battleID;
private Collection<Integer> sideA; private Collection<Integer> sideA;
private Collection<Integer> sideB; private Collection<Integer> sideB;
private long decisionNanos; private long decisionNanos;
@ -22,6 +23,7 @@ public class PacketBattleInfo
public PacketBattleInfo() public PacketBattleInfo()
{ {
battleID = 0;
sideA = new ArrayList<Integer>(); sideA = new ArrayList<Integer>();
sideB = new ArrayList<Integer>(); sideB = new ArrayList<Integer>();
decisionNanos = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(); decisionNanos = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos();
@ -29,8 +31,9 @@ public class PacketBattleInfo
turnTimerEnabled = false; turnTimerEnabled = false;
} }
public PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) public PacketBattleInfo(int battleID, Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled)
{ {
this.battleID = battleID;
this.sideA = sideA; this.sideA = sideA;
this.sideB = sideB; this.sideB = sideB;
this.decisionNanos = decisionNanos; this.decisionNanos = decisionNanos;
@ -43,6 +46,7 @@ public class PacketBattleInfo
@Override @Override
public void accept(PacketBattleInfo msg, RegistryFriendlyByteBuf buf) { public void accept(PacketBattleInfo msg, RegistryFriendlyByteBuf buf) {
buf.writeInt(msg.battleID);
buf.writeInt(msg.sideA.size()); buf.writeInt(msg.sideA.size());
buf.writeInt(msg.sideB.size()); buf.writeInt(msg.sideB.size());
for(Integer id : msg.sideA) { for(Integer id : msg.sideA) {
@ -62,6 +66,7 @@ public class PacketBattleInfo
@Override @Override
public PacketBattleInfo apply(RegistryFriendlyByteBuf buf) { public PacketBattleInfo apply(RegistryFriendlyByteBuf buf) {
int battleID = buf.readInt();
int sideACount = buf.readInt(); int sideACount = buf.readInt();
int sideBCount = buf.readInt(); int sideBCount = buf.readInt();
Collection<Integer> sideA = new ArrayList<Integer>(sideACount); Collection<Integer> sideA = new ArrayList<Integer>(sideACount);
@ -75,7 +80,7 @@ public class PacketBattleInfo
long decisionNanos = buf.readLong(); long decisionNanos = buf.readLong();
long maxDecisionNanos = buf.readLong(); long maxDecisionNanos = buf.readLong();
boolean turnTimerEnabled = buf.readBoolean(); 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(() -> { ctx.enqueueWork(() -> {
if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null) if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null)
{ {
return; TurnBasedMinecraftMod.proxy.createLocalBattle(pkt.battleID);
} }
TurnBasedMinecraftMod.proxy.getLocalBattle().clearCombatants(); TurnBasedMinecraftMod.proxy.getLocalBattle().clearCombatants();
for(Integer id : pkt.sideA) for(Integer id : pkt.sideA)
@ -106,6 +111,7 @@ public class PacketBattleInfo
TurnBasedMinecraftMod.proxy.getLocalBattle().addCombatantToSideB(e); TurnBasedMinecraftMod.proxy.getLocalBattle().addCombatantToSideB(e);
} }
} }
TurnBasedMinecraftMod.proxy.setBattleGuiAsGui();
TurnBasedMinecraftMod.proxy.setBattleGuiTime((int)(pkt.decisionNanos / 1000000000L)); TurnBasedMinecraftMod.proxy.setBattleGuiTime((int)(pkt.decisionNanos / 1000000000L));
TurnBasedMinecraftMod.proxy.setBattleGuiBattleChanged(); TurnBasedMinecraftMod.proxy.setBattleGuiBattleChanged();
TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled); TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled);

View file

@ -47,7 +47,7 @@ public class PacketBattleRequestInfo
if(b == null) { if(b == null) {
return; 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); ctx.setPacketHandled(true);
} }