From fdb9acb04a2d2528a48d15f130c0c48d447d75a8 Mon Sep 17 00:00:00 2001 From: LB2345 <163643124+LovelyBunny11@users.noreply.github.com> Date: Sun, 25 May 2025 18:47:50 +0300 Subject: [PATCH] Fixed crashing on round. --- .../zombiesutils/ZombiesUtilsClient.java | 2 - .../xyz/stachel/zombiesutils/game/Game.java | 6 +- .../stachel/zombiesutils/game/GameFile.java | 10 ++- .../zombiesutils/game/GameManager.java | 13 +--- .../zombiesutils/game/recorder/Category.java | 9 +-- .../game/recorder/files/CategoryFile.java | 6 +- .../zombiesutils/handlers/Location.java | 4 +- .../mixin/ClientPlayNetworkHandlerMixin.java | 18 +++-- .../zombiesutils/util/LanguageSupport.java | 78 +++++++++++++++++++ .../xyz/stachel/zombiesutils/util/Utils.java | 5 +- 10 files changed, 114 insertions(+), 37 deletions(-) create mode 100644 src/main/java/xyz/stachel/zombiesutils/util/LanguageSupport.java diff --git a/src/main/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java index b44b6de..2f71267 100644 --- a/src/main/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java +++ b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java @@ -8,10 +8,8 @@ import net.minecraft.client.util.InputUtil; import net.minecraft.text.MutableText; import net.minecraft.text.Style; import net.minecraft.text.Text; -import net.minecraft.text.TextColor; import net.minecraft.util.Formatting; import org.lwjgl.glfw.GLFW; -import xyz.stachel.zombiesutils.config.Configs; public class ZombiesUtilsClient implements ClientModInitializer { public static boolean PLAYER_VISIBILITY_SWITCH; diff --git a/src/main/java/xyz/stachel/zombiesutils/game/Game.java b/src/main/java/xyz/stachel/zombiesutils/game/Game.java index 53575b1..1e2cd98 100644 --- a/src/main/java/xyz/stachel/zombiesutils/game/Game.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/Game.java @@ -1,7 +1,9 @@ package xyz.stachel.zombiesutils.game; import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.apache.commons.lang3.exception.ExceptionUtils; import org.jetbrains.annotations.NotNull; import xyz.stachel.zombiesutils.ZombiesUtils; @@ -49,7 +51,7 @@ class Game extends Timer { this.record(); } catch (Exception e) { ZombiesUtils.LOGGER.error(ExceptionUtils.getStackTrace(e)); - MinecraftClient.getInstance().player.sendMessage(Text.of("Error recording splits"), false); + MinecraftClient.getInstance().player.sendMessage(Text.literal("Error recording splits").setStyle(Style.EMPTY.withColor(Formatting.RED)), false); } this.split(); this.round = round + 1; @@ -64,7 +66,7 @@ class Game extends Timer { public void helicopter() { if (!this.mode.isMap(GameMode.Map.PRISON)) { - MinecraftClient.getInstance().player.sendMessage(Text.of("You are not imprisoned. Yet."), false); + MinecraftClient.getInstance().player.sendMessage(Text.literal("You are not imprisoned. Yet.").setStyle(Style.EMPTY.withColor(Formatting.RED)), false); ZombiesUtils.LOGGER.error(Thread.currentThread().getStackTrace().toString()); return; } diff --git a/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java b/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java index d055473..5d398e6 100644 --- a/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java @@ -1,7 +1,9 @@ package xyz.stachel.zombiesutils.game; import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.apache.commons.lang3.exception.ExceptionUtils; import org.jetbrains.annotations.NotNull; import xyz.stachel.zombiesutils.ZombiesUtils; @@ -20,9 +22,9 @@ class GameFile extends File { private FileWriter writer; - GameFile(@NotNull final String serverNumber) { - super(new File("zombies", "runs"), formattedTime() + "_" + serverNumber + ".seg2"); - this.data = new GameData(ZombiesUtils.getGameManager().getGame(serverNumber).mode.getMap()); + GameFile(@NotNull final String serverNumber, @NotNull final GameMode mode) { + super(new File("zombies", "runs"), formattedTime() + "_" + serverNumber + ".seg2"); + this.data = new GameData(mode.getMap()); FileManager.createDataFile(this, this.data); } @@ -57,7 +59,7 @@ class GameFile extends File { FileManager.writeDataToFile(this, this.data); } catch (Exception e) { ZombiesUtils.LOGGER.error(ExceptionUtils.getStackTrace(e)); - MinecraftClient.getInstance().player.sendMessage(Text.of("Error saving segment to run-file. Please Contact Stachelbeere1248."), false); + MinecraftClient.getInstance().player.sendMessage(Text.literal("Error saving segment to run-file. Please Contact Stachelbeere1248.").setStyle(Style.EMPTY.withColor(Formatting.RED)), false); } } } diff --git a/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java b/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java index 1c84e99..6016950 100644 --- a/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java @@ -19,7 +19,7 @@ public class GameManager { this.queuedDifficulty.ifPresent(mode::changeDifficulty); } this.queuedDifficulty = Optional.empty(); - this.games.put(serverNumber, new Game(new GameFile(serverNumber), mode)); + this.games.put(serverNumber, new Game(new GameFile(serverNumber, mode), mode, round)); } public void onRound(final int round) { @@ -27,18 +27,13 @@ public class GameManager { final String mode = Location.getMode(); if (sn == null || mode == null || !Utils.isZombies()) return; - if (!this.games.containsKey(sn)) { - addGame(sn, new GameMode(Map.DEAD_END), round); + if (this.getGame(sn) == null) { + this.addGame(sn, new GameMode(Utils.getMap(mode)), round); } else { - this.games.get(sn).split(round); + this.getGame(sn).split(round); } } - public Optional getGame() { - final String sn = Location.getServerNumber(); - return Optional.of(this.games.get(sn)); - } - public Game getGame(String sn) { return this.games.get(sn); } diff --git a/src/main/java/xyz/stachel/zombiesutils/game/recorder/Category.java b/src/main/java/xyz/stachel/zombiesutils/game/recorder/Category.java index cda11a3..dd58ed1 100644 --- a/src/main/java/xyz/stachel/zombiesutils/game/recorder/Category.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/recorder/Category.java @@ -36,10 +36,10 @@ public class Category { this.name = Category.selectedCategory; } -// public static void setSelectedCategory(String selectedCategory) { -// Category.selectedCategory = selectedCategory; -// ZombiesUtils.getGameManager().getGame().ifPresent(game -> game.setCategory(new Category())); -// } + public static void setSelectedCategory(String selectedCategory) { + Category.selectedCategory = selectedCategory; + // ZombiesUtils.getGameManager().getGame().ifPresent(game -> game.setCategory(new Category())); + } public static String[] getCategories() { File dir; @@ -67,7 +67,6 @@ public class Category { case HARD -> categoryFiles[8]; case RIP -> categoryFiles[9]; }; - default -> throw new IllegalStateException("Unexpected value: " + gameMode); }; } diff --git a/src/main/java/xyz/stachel/zombiesutils/game/recorder/files/CategoryFile.java b/src/main/java/xyz/stachel/zombiesutils/game/recorder/files/CategoryFile.java index a573c6b..6adcbb2 100644 --- a/src/main/java/xyz/stachel/zombiesutils/game/recorder/files/CategoryFile.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/recorder/files/CategoryFile.java @@ -1,7 +1,9 @@ package xyz.stachel.zombiesutils.game.recorder.files; import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.apache.commons.lang3.exception.ExceptionUtils; import org.jetbrains.annotations.NotNull; import xyz.stachel.zombiesutils.ZombiesUtils; @@ -36,7 +38,7 @@ public class CategoryFile extends File { FileManager.writeDataToFile(this, this.data); } catch (Exception e) { ZombiesUtils.LOGGER.error(ExceptionUtils.getStackTrace(e)); - MinecraftClient.getInstance().player.sendMessage(Text.of("Error saving segment to splits-file. Please Contact Stachelbeere1248."), false); + MinecraftClient.getInstance().player.sendMessage(Text.literal("Error saving segment to splits-file. Please Contact Stachelbeere1248.").setStyle(Style.EMPTY.withColor(Formatting.RED)), false); } } @@ -51,7 +53,7 @@ public class CategoryFile extends File { FileManager.writeDataToFile(this, this.data); } catch (Exception e) { ZombiesUtils.LOGGER.error(ExceptionUtils.getStackTrace(e)); - MinecraftClient.getInstance().player.sendMessage(Text.of("Error saving pb to splits-file. Please Contact Stachelbeere1248."), false); + MinecraftClient.getInstance().player.sendMessage(Text.literal("Error saving pb to splits-file. Please Contact Stachelbeere1248.").setStyle(Style.EMPTY.withColor(Formatting.RED)), false); } } diff --git a/src/main/java/xyz/stachel/zombiesutils/handlers/Location.java b/src/main/java/xyz/stachel/zombiesutils/handlers/Location.java index 8685add..b98d7ad 100644 --- a/src/main/java/xyz/stachel/zombiesutils/handlers/Location.java +++ b/src/main/java/xyz/stachel/zombiesutils/handlers/Location.java @@ -10,9 +10,9 @@ public class Location { private static String mode; public static void onLocation(ClientboundLocationPacket p) { - Location.serverNumber = p.getServerName(); + serverNumber = p.getServerName(); Optional m = p.getMode(); - if (m.isPresent()) Location.mode = m.get(); + m.ifPresent(s -> mode = s); } public static String getServerNumber() { diff --git a/src/main/java/xyz/stachel/zombiesutils/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/xyz/stachel/zombiesutils/mixin/ClientPlayNetworkHandlerMixin.java index a60ac8d..d61182f 100644 --- a/src/main/java/xyz/stachel/zombiesutils/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/xyz/stachel/zombiesutils/mixin/ClientPlayNetworkHandlerMixin.java @@ -3,6 +3,7 @@ package xyz.stachel.zombiesutils.mixin; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.packet.s2c.play.TitleS2CPacket; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -14,17 +15,18 @@ import java.util.regex.Pattern; @Mixin(ClientPlayNetworkHandler.class) public abstract class ClientPlayNetworkHandlerMixin { + @Unique private static final Pattern pattern = Pattern.compile("Round (\\d{1,3})"); @Inject(at = @At("HEAD"), method = "onTitle") - private void zombiesUtils_onTitle(TitleS2CPacket p, CallbackInfo info) { - final String msg = p.text().getString(); - final Matcher matcher = pattern.matcher(msg); - if (matcher.find()) { - int number = Integer.parseInt(matcher.group(1)); - if (number >= 1 && number <= 105) { - ZombiesUtils.getGameManager().onRound(number); + private void zombiesUtils_onTitle(TitleS2CPacket p, CallbackInfo info) { + final String msg = p.text().getString(); + final Matcher matcher = pattern.matcher(msg); + if (matcher.find()) { + int number = Integer.parseInt(matcher.group(1)); + if (number >= 1 && number <= 105) { + ZombiesUtils.getGameManager().onRound(number); + } } } - } } diff --git a/src/main/java/xyz/stachel/zombiesutils/util/LanguageSupport.java b/src/main/java/xyz/stachel/zombiesutils/util/LanguageSupport.java new file mode 100644 index 0000000..0506073 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/util/LanguageSupport.java @@ -0,0 +1,78 @@ +package xyz.stachel.zombiesutils.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.regex.Pattern; + +@SuppressWarnings("SpellCheckingInspection") +public class LanguageSupport { + private static final String[] LANGUAGES = { + "EN", + "FR", + "DE" + }; + + public static boolean isLoss(@NotNull String input) { + final String[] words = { + "§cGame Over!", + "§cPartie terminée!", + "§cDas Spiel ist vorbei!" + }; + return Arrays.asList(words).contains(input); + } + + public static boolean isWin(@NotNull String input) { + final String[] words = { + "§aYou Win!", + "§aVous avez gagné!", + "§aDu gewinnst!" + }; + return Arrays.asList(words).contains(input); + } + + public static boolean containsHard(@NotNull String input) { + final String[] words = { + "Hard Difficulty", + "Difficulté Hard", + "Hard Schwierigkeitsgrad", + "困难", + "困難" + }; + return Arrays.stream(words).anyMatch(input::contains); + } + + public static boolean containsRIP(@NotNull String input) { + final String[] words = { + "RIP Difficulty", + "Difficulté RIP", + "RIP Schwierigkeitsgrad", + "安息" + }; + return Arrays.stream(words).anyMatch(input::contains); + } + + public static boolean isHelicopterIncoming(@NotNull String input) { + final String[] words = { + "The Helicopter is on its way! Hold out for 120 more seconds!" + }; + return Arrays.stream(words).anyMatch(input::contains); + } + + public static @NotNull Pattern roundPattern(@NotNull String language) { + switch (language) { + case "EN": + return Pattern.compile("Round ([0-9]{1,3})"); + case "FR": + return Pattern.compile("Manche ([0-9]{1,3})"); + case "DE": + return Pattern.compile("Runde ([0-9]{1,3})"); + default: + throw new IllegalStateException("Unexpected value: " + language); + } + } + + public static String[] getLanguages() { + return LANGUAGES; + } +} \ No newline at end of file diff --git a/src/main/java/xyz/stachel/zombiesutils/util/Utils.java b/src/main/java/xyz/stachel/zombiesutils/util/Utils.java index 1e0df06..649e705 100644 --- a/src/main/java/xyz/stachel/zombiesutils/util/Utils.java +++ b/src/main/java/xyz/stachel/zombiesutils/util/Utils.java @@ -1,6 +1,5 @@ package xyz.stachel.zombiesutils.util; -import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.Nullable; import xyz.stachel.zombiesutils.game.GameMode; import xyz.stachel.zombiesutils.handlers.Location; @@ -10,8 +9,8 @@ import static xyz.stachel.zombiesutils.game.GameMode.Map.*; public class Utils { @Nullable - public static GameMode.Map getMap() { - return switch (Location.getMode()) { + public static GameMode.Map getMap(String mode) { + return switch (mode) { case "ZOMBIES_DEAD_END" -> DEAD_END; case "ZOMBIES_BAD_BLOOD" -> BAD_BLOOD; case "ZOMBIES_ALIEN_ARCADIUM" -> ALIEN_ARCADIUM;