From c30f4c37312612d9d290103f9195a00397b67474 Mon Sep 17 00:00:00 2001 From: Stachelbeere1248 Date: Wed, 29 Nov 2023 22:46:41 +0100 Subject: [PATCH] adding game tracking --- gradle.properties | 2 +- .../zombiesutils/ZombiesUtils.java | 2 + .../zombiesutils/handlers/ChatHandler.java | 1 - .../mixin/MixinNetHandlerPlayClient.java | 4 +- .../render/RenderGameOverlayHandler.java | 4 +- .../zombiesutils/timer/RecordManager.java | 18 +++--- .../zombiesutils/timer/Timer.java | 6 ++ .../zombiesutils/timer/recorder/Category.java | 36 ++++++------ .../zombiesutils/timer/recorder/FileData.java | 39 ------------- .../timer/recorder/FileManager.java | 53 +++++++++++++++++ .../timer/recorder/ISplitsData.java | 5 ++ .../timer/recorder/SplitsFile.java | 15 +++++ .../timer/recorder/TimesFile.java | 38 ------------- .../timer/recorder/data/CategoryData.java | 47 +++++++++++++++ .../timer/recorder/data/GameData.java | 38 +++++++++++++ .../timer/recorder/files/CategoryFile.java | 51 +++++++++++++++++ .../timer/recorder/files/GameFile.java | 41 +++++++++++++ .../zombiesutils/utils/FileManager.java | 57 ------------------- .../zombiesutils/utils/Scoreboard.java | 2 +- src/main/resources/mcmod.info | 2 +- 20 files changed, 294 insertions(+), 167 deletions(-) delete mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/FileData.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/FileManager.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/ISplitsData.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/SplitsFile.java delete mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/TimesFile.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/CategoryData.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/GameData.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/CategoryFile.java create mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/GameFile.java delete mode 100644 src/main/java/com/github/stachelbeere1248/zombiesutils/utils/FileManager.java diff --git a/gradle.properties b/gradle.properties index 2e3e602..cad2b2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs=-Xmx2g baseGroup = com.github.stachelbeere1248.zombiesutils mcVersion = 1.8.9 modid = zombiesutils -version = 1.2.0 \ No newline at end of file +version = 1.2.1 \ No newline at end of file diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java index 2987db7..7c00347 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java @@ -2,6 +2,7 @@ package com.github.stachelbeere1248.zombiesutils; import com.github.stachelbeere1248.zombiesutils.commands.CategoryCommand; import com.github.stachelbeere1248.zombiesutils.commands.SlaCommand; +import com.github.stachelbeere1248.zombiesutils.commands.ZombiesUtilsCommand; import com.github.stachelbeere1248.zombiesutils.config.Hotkeys; import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig; import com.github.stachelbeere1248.zombiesutils.handlers.ChatHandler; @@ -49,6 +50,7 @@ public class ZombiesUtils { ClientCommandHandler.instance.registerCommand(new CategoryCommand()); ClientCommandHandler.instance.registerCommand(new SlaCommand()); + ClientCommandHandler.instance.registerCommand(new ZombiesUtilsCommand()); hotkeys.registerAll(); } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/ChatHandler.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/ChatHandler.java index f2e443b..5ad4262 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/ChatHandler.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/ChatHandler.java @@ -1,6 +1,5 @@ package com.github.stachelbeere1248.zombiesutils.handlers; -import com.github.stachelbeere1248.zombiesutils.ZombiesUtils; import com.github.stachelbeere1248.zombiesutils.game.Difficulty; import com.github.stachelbeere1248.zombiesutils.game.GameMode; import com.github.stachelbeere1248.zombiesutils.timer.Timer; diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/mixin/MixinNetHandlerPlayClient.java index d1af101..3c7df58 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/mixin/MixinNetHandlerPlayClient.java @@ -29,7 +29,7 @@ public class MixinNetHandlerPlayClient { } @Unique private void zombies_utils$handleSound(@NotNull S29PacketSoundEffect packet) { - if (Scoreboard.isZombies()) return; + if (Scoreboard.isNotZombies()) return; final String soundEffect = packet.getSoundName(); if (!( soundEffect.equals("mob.wither.spawn") @@ -74,7 +74,7 @@ public class MixinNetHandlerPlayClient { final String message = packet.getMessage().getUnformattedText().trim(); Timer.getInstance().ifPresent(timer -> { - if (Scoreboard.isZombies()) return; + if (Scoreboard.isNotZombies()) return; if (message.equals("§aYou Win!")) { switch (timer.getGameMode().getMap()) { diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/render/RenderGameOverlayHandler.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/render/RenderGameOverlayHandler.java index e869a71..f84a0c3 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/render/RenderGameOverlayHandler.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/render/RenderGameOverlayHandler.java @@ -43,7 +43,7 @@ public class RenderGameOverlayHandler { } private void renderTime(long timerTicks) { - if (Scoreboard.isZombies()) return; + if (Scoreboard.isNotZombies()) return; final String time = getTimeString(timerTicks); final int width = fontRenderer.getStringWidth(time); @@ -75,6 +75,8 @@ public class RenderGameOverlayHandler { } } private void renderSpawnTime(byte @NotNull [] waveTimes, short roundTicks) { + if (Scoreboard.isNotZombies()) return; + final int length = waveTimes.length + 1; int heightIndex = 0; int color = 0xFFFF55; diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java index 4c2f29d..df36c67 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java @@ -1,7 +1,7 @@ package com.github.stachelbeere1248.zombiesutils.timer; import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category; -import com.github.stachelbeere1248.zombiesutils.timer.recorder.TimesFile; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile; import net.minecraft.client.Minecraft; import net.minecraft.util.ChatComponentText; import org.jetbrains.annotations.Contract; @@ -16,10 +16,10 @@ public class RecordManager { @SuppressWarnings("OptionalGetWithoutIsPresent") - final TimesFile timesFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); - short bestSegment = timesFile.getBestSegment(round); + final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); + short bestSegment = categoryFile.getBestSegment(round); if (bestSegment == (short) 0) { - timesFile.setBestSegment(round, roundTime); + categoryFile.setBestSegment(round, roundTime); segmentMessage += "\n§e§l***§6§l NEW BEST SEGMENT! §e§l***"; final String timeString = formattedTime(roundTime); @@ -27,7 +27,7 @@ public class RecordManager { } else { if (roundTime custom category -> file named "MAP_DIFFICULTY.times" - // Content encoded in StandardCharsets.UTF_16 - super("zombies" + File.separator + "splits" + File.separator + category,gameMode.getMap() + "_" + gameMode.getDifficulty() + ".times"); - this.gameMode = gameMode; - fileData = FileManager.readOrCreate(this); - } - - public short getBestSegment(int round) { - return fileData.getBestSegment(round-1); - } - public void setBestSegment(int round, short ticks) { - fileData.setBestSegment(round-1, ticks); - FileManager.writeDataToFile(fileData,this); - } - public int getPersonalBest(int round) { - return fileData.getPersonalBest(round-1); - } - public void setPersonalBest(int round, int ticks) { - fileData.setPersonalBest(round-1, ticks); - FileManager.writeDataToFile(fileData,this); - } - - public GameMode getGameMode() { - return gameMode; - } -} diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/CategoryData.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/CategoryData.java new file mode 100644 index 0000000..25be216 --- /dev/null +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/CategoryData.java @@ -0,0 +1,47 @@ +package com.github.stachelbeere1248.zombiesutils.timer.recorder.data; + +import com.github.stachelbeere1248.zombiesutils.game.Map; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.ISplitsData; +import com.google.gson.Gson; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public class CategoryData implements ISplitsData { + private final short[] bestSegments; //in ticks, max ~27 min + private final int[] personalBests; //in ticks, + public CategoryData(@NotNull Map map) { + switch (map) { + case ALIEN_ARCADIUM: + bestSegments = new short[105]; + personalBests = new int[105]; + break; + case DEAD_END: case BAD_BLOOD: + bestSegments = new short[30]; + personalBests = new int[30]; + break; + default: + throw new IllegalStateException("Not a map: " + map); + } + Arrays.fill(bestSegments, (short) 0); + Arrays.fill(personalBests, 0); + } + @Override + public String toJSON() { + Gson gson = new Gson(); + return gson.toJson(this, CategoryData.class); + } + + public short getBestSegment(int index) { + return bestSegments[index]; + } + public int getPersonalBest(int index) { + return personalBests[index]; + } + public void setBestSegment(int index, short ticks) { + bestSegments[index] = ticks; + } + public void setPersonalBest(int index, int ticks) { + personalBests[index] = ticks; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/GameData.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/GameData.java new file mode 100644 index 0000000..ad4c49c --- /dev/null +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/data/GameData.java @@ -0,0 +1,38 @@ +package com.github.stachelbeere1248.zombiesutils.timer.recorder.data; + +import com.github.stachelbeere1248.zombiesutils.game.Map; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.ISplitsData; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public class GameData implements ISplitsData { + private final short[] segments; + + public GameData(@NotNull Map map) { + switch (map) { + case ALIEN_ARCADIUM: + segments = new short[105]; + break; + case DEAD_END: case BAD_BLOOD: + segments = new short[30]; + break; + default: + throw new IllegalStateException("Not a map: " + map); + } + Arrays.fill(segments, (short) 0); + } + + @Override + public String toJSON() { + StringBuilder JSON = new StringBuilder("["); + for (short segment: segments) { + JSON.append(segment + ','); + } + JSON.setCharAt(JSON.length()-1,']'); + return JSON.toString(); + } + public void setSegment(int index, short ticks) { + segments[index] = ticks; + } +} diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/CategoryFile.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/CategoryFile.java new file mode 100644 index 0000000..c1ce527 --- /dev/null +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/CategoryFile.java @@ -0,0 +1,51 @@ +package com.github.stachelbeere1248.zombiesutils.timer.recorder.files; + +import com.github.stachelbeere1248.zombiesutils.game.GameMode; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.FileManager; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.ISplitsData; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.SplitsFile; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.data.CategoryData; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; + +public class CategoryFile extends SplitsFile { + private final CategoryData data; + private final GameMode gameMode; + public CategoryFile(File category, @NotNull GameMode gameMode) { + // Game-directory -> custom category -> file named "MAP_DIFFICULTY.times" + // Content encoded in StandardCharsets.UTF_16 + super(category,gameMode.getMap() + "_" + gameMode.getDifficulty() + ".times"); + this.gameMode = gameMode; + data = FileManager.categoryReadOrCreate(this); + } + + public short getBestSegment(int round) { + return data.getBestSegment(round-1); + } + public void setBestSegment(int round, short ticks) { + data.setBestSegment(round-1, ticks); + + try { FileManager.writeDataToFile(data,this); } + catch (IOException e) { throw new RuntimeException(e); } + } + public int getPersonalBest(int round) { + return data.getPersonalBest(round-1); + } + public void setPersonalBest(int round, int ticks) { + data.setPersonalBest(round-1, ticks); + + try { FileManager.writeDataToFile(data,this); } + catch (IOException e) { throw new RuntimeException(e); } + } + + public GameMode getGameMode() { + return gameMode; + } + + @Override + public ISplitsData getData() { + return data; + } +} diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/GameFile.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/GameFile.java new file mode 100644 index 0000000..fd77d0d --- /dev/null +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/recorder/files/GameFile.java @@ -0,0 +1,41 @@ +package com.github.stachelbeere1248.zombiesutils.timer.recorder.files; + + +import com.github.stachelbeere1248.zombiesutils.game.Map; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.FileManager; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.ISplitsData; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.SplitsFile; +import com.github.stachelbeere1248.zombiesutils.timer.recorder.data.GameData; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +public class GameFile extends SplitsFile { + private final GameData data; + + public GameFile(String serverNumber, Map map) { + super("zombies" + File.separator + "runs", formattedTime() + "_" + serverNumber + ".times"); + data = new GameData(map); + } + + private static @NotNull String formattedTime() { + final LocalDateTime dateTime = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES); + return dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } + + public void setSegment(int round, short ticks) { + data.setSegment(round-1, ticks); + + try { FileManager.writeDataToFile(data,this); } + catch (IOException e) { throw new RuntimeException(e); } + } + + @Override + public ISplitsData getData() { + return data; + } +} diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/FileManager.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/FileManager.java deleted file mode 100644 index 866c56b..0000000 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/FileManager.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.stachelbeere1248.zombiesutils.utils; - -import com.github.stachelbeere1248.zombiesutils.timer.recorder.FileData; -import com.github.stachelbeere1248.zombiesutils.timer.recorder.TimesFile; -import com.google.gson.Gson; -import org.apache.commons.io.FileUtils; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class FileManager { - private static FileData readDataFromFile(@NotNull File file) throws FileNotFoundException { - if (!file.exists()) throw new FileNotFoundException(); - - String dataJson; - Gson gson = new Gson(); - - try { - dataJson = FileUtils.readFileToString(file, StandardCharsets.UTF_16); - } catch (IOException e) { - throw new RuntimeException(e); - } - - return gson.fromJson(dataJson, FileData.class); - } - private static void createDataFile(FileData fileData, @NotNull File file) { - try { - //noinspection ResultOfMethodCallIgnored - file.getParentFile().mkdirs(); - //noinspection ResultOfMethodCallIgnored - file.createNewFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } - writeDataToFile(fileData, file); - } - public static void writeDataToFile(@NotNull FileData fileData, File file) { - try { - FileUtils.writeStringToFile(file, fileData.getAsJsonString(), StandardCharsets.UTF_16); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public static FileData readOrCreate(TimesFile file) { - FileData data; - try { - data = FileManager.readDataFromFile(file); - } catch (FileNotFoundException ignored) { - data = new FileData(file.getGameMode().getMap()); - FileManager.createDataFile(data, file); - } - return data; - } -} diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/Scoreboard.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/Scoreboard.java index 54f142a..5ae6c93 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/Scoreboard.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/utils/Scoreboard.java @@ -114,7 +114,7 @@ public class Scoreboard { public static int getLineCount() { return lines.size(); } - public static boolean isZombies() { + public static boolean isNotZombies() { return (!"ZOMBIES".equals(title)); } } \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index b28db18..37ac66f 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -6,7 +6,7 @@ "version": "${version}", "mcversion": "${mcversion}", "url": "https://github.com/Stachelbeere1248/zombies-utils", - "updateUrl": "", + "updateUrl": "https://github.com/Stachelbeere1248/zombies-utils/releases", "authorList": [ "Stachelbeere1248" ],