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).
Allow leaving battle GUI with Escape key (temporarily), and some refactorings
to fix that pesky transient client-freeze-bug.
# Version Forge-1.26.0
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 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
}

View 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:

View 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()) {
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<Combatant> combatants = new ArrayList<Combatant>();
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_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

View file

@ -13,6 +13,7 @@ import java.util.function.Function;
public class PacketBattleInfo
{
private int battleID;
private Collection<Integer> sideA;
private Collection<Integer> sideB;
private long decisionNanos;
@ -22,6 +23,7 @@ public class PacketBattleInfo
public PacketBattleInfo()
{
battleID = 0;
sideA = new ArrayList<Integer>();
sideB = new ArrayList<Integer>();
decisionNanos = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos();
@ -29,8 +31,9 @@ public class PacketBattleInfo
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.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<Integer> sideA = new ArrayList<Integer>(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);

View file

@ -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);
}