From b2b85426046de021b1555cc16030cb635b72bce9 Mon Sep 17 00:00:00 2001 From: Stachelbeere1248 Date: Mon, 19 May 2025 08:53:34 +0200 Subject: [PATCH] mod skeleton 2 --- .gitignore | 3 ++ .../zombiesutils/ZombiesUtilsClient.java | 10 ++--- .../zombiesutils/handlers/Location.java | 25 +++++++++++ .../client/ClientPlayNetworkHandlerMixin.java | 30 +++++++++++++ .../mixin/client/ExampleClientMixin.java | 15 ------- .../zombies-utils.client.mixins.json | 4 +- .../stachel/zombiesutils/ZombiesUtils.java | 17 ++++++++ .../xyz/stachel/zombiesutils/game/Game.java | 34 +++++++++++++++ .../stachel/zombiesutils/game/GameFile.java | 42 +++++++++++++++++++ .../zombiesutils/game/GameManager.java | 27 ++++++++++++ .../stachel/zombiesutils/game/GameMode.java | 34 +++++++++++++++ .../xyz/stachel/zombiesutils/game/Timer.java | 4 +- src/main/resources/fabric.mod.json | 3 ++ 13 files changed, 222 insertions(+), 26 deletions(-) create mode 100644 src/client/java/xyz/stachel/zombiesutils/handlers/Location.java create mode 100644 src/client/java/xyz/stachel/zombiesutils/mixin/client/ClientPlayNetworkHandlerMixin.java delete mode 100644 src/client/java/xyz/stachel/zombiesutils/mixin/client/ExampleClientMixin.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/game/Game.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/game/GameFile.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/game/GameManager.java create mode 100644 src/main/java/xyz/stachel/zombiesutils/game/GameMode.java rename src/{client => main}/java/xyz/stachel/zombiesutils/game/Timer.java (84%) diff --git a/.gitignore b/.gitignore index bfc888e..589f82c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ hs_err_*.log replay_*.log *.hprof *.jfr + +# personal setup +.mcsources.jar diff --git a/src/client/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java b/src/client/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java index c17f259..8e87530 100644 --- a/src/client/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java +++ b/src/client/java/xyz/stachel/zombiesutils/ZombiesUtilsClient.java @@ -1,23 +1,19 @@ package xyz.stachel.zombiesutils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.rendering.v1.HudLayerRegistrationCallback; import net.hypixel.modapi.HypixelModAPI; import net.hypixel.modapi.packet.impl.clientbound.event.ClientboundLocationPacket; +import xyz.stachel.zombiesutils.handlers.Location; import xyz.stachel.zombiesutils.handlers.Renderer; public class ZombiesUtilsClient implements ClientModInitializer { - public static final String MOD_ID = "zombies-utils"; - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); @Override public void onInitializeClient() { HypixelModAPI.getInstance().subscribeToEventPacket(ClientboundLocationPacket.class); - //TODO: HypixelModAPI.getInstance().createHandler(ClientboundLocationPacket.class, todo); - LOGGER.info("initializing..."); + HypixelModAPI.getInstance().createHandler(ClientboundLocationPacket.class, Location::onLocation); + ZombiesUtils.LOGGER.info("initializing..."); HudLayerRegistrationCallback.EVENT.register(new Renderer()); } diff --git a/src/client/java/xyz/stachel/zombiesutils/handlers/Location.java b/src/client/java/xyz/stachel/zombiesutils/handlers/Location.java new file mode 100644 index 0000000..791f8bd --- /dev/null +++ b/src/client/java/xyz/stachel/zombiesutils/handlers/Location.java @@ -0,0 +1,25 @@ +package xyz.stachel.zombiesutils.handlers; + +import java.util.Optional; + +import net.hypixel.modapi.packet.impl.clientbound.event.ClientboundLocationPacket; + +public class Location { + + private static String serverNumber; + private static String mode; + + public static void onLocation(ClientboundLocationPacket p) { + Location.serverNumber = p.getServerName(); + Optional m = p.getMode(); + if (m.isPresent()) Location.mode = m.get(); + } + + public static String getServerNumber() { + return serverNumber; + } + + public static String getMode() { + return mode; + } +} diff --git a/src/client/java/xyz/stachel/zombiesutils/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/client/java/xyz/stachel/zombiesutils/mixin/client/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 0000000..9fa8faf --- /dev/null +++ b/src/client/java/xyz/stachel/zombiesutils/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,30 @@ +package xyz.stachel.zombiesutils.mixin.client; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.packet.s2c.play.TitleS2CPacket; +import xyz.stachel.zombiesutils.game.GameManager; + +@Mixin(ClientPlayNetworkHandler.class) +public class ClientPlayNetworkHandlerMixin { + 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) { + GameManager.onRound(number); + } + } + } +} diff --git a/src/client/java/xyz/stachel/zombiesutils/mixin/client/ExampleClientMixin.java b/src/client/java/xyz/stachel/zombiesutils/mixin/client/ExampleClientMixin.java deleted file mode 100644 index 752dfb1..0000000 --- a/src/client/java/xyz/stachel/zombiesutils/mixin/client/ExampleClientMixin.java +++ /dev/null @@ -1,15 +0,0 @@ -package xyz.stachel.zombiesutils.mixin.client; - -import net.minecraft.client.MinecraftClient; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public class ExampleClientMixin { - @Inject(at = @At("HEAD"), method = "run") - private void init(CallbackInfo info) { - // This code is injected into the start of MinecraftClient.run()V - } -} \ No newline at end of file diff --git a/src/client/resources/zombies-utils.client.mixins.json b/src/client/resources/zombies-utils.client.mixins.json index 68fcc7c..72e38c2 100644 --- a/src/client/resources/zombies-utils.client.mixins.json +++ b/src/client/resources/zombies-utils.client.mixins.json @@ -3,9 +3,9 @@ "package": "xyz.stachel.zombiesutils.mixin.client", "compatibilityLevel": "JAVA_21", "client": [ - "ExampleClientMixin" + "ClientPlayNetworkHandlerMixin" ], "injectors": { "defaultRequire": 1 } -} \ No newline at end of file +} diff --git a/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java new file mode 100644 index 0000000..d049a78 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/ZombiesUtils.java @@ -0,0 +1,17 @@ +package xyz.stachel.zombiesutils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.fabricmc.api.ModInitializer; + +public class ZombiesUtils implements ModInitializer { + + public static final String MOD_ID = "zombies-utils"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + + @Override + public void onInitialize() { + } + +} diff --git a/src/main/java/xyz/stachel/zombiesutils/game/Game.java b/src/main/java/xyz/stachel/zombiesutils/game/Game.java new file mode 100644 index 0000000..1b27c72 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/game/Game.java @@ -0,0 +1,34 @@ +package xyz.stachel.zombiesutils.game; + +import java.io.File; + +import org.jetbrains.annotations.NotNull; + +class Game extends Timer { + private final boolean joinedRoundOne; + private int round; + private final File gameFile; + private String category; + public final GameMode mode; + + public Game(@NotNull final GameFile gameFile, @NotNull final GameMode mode) { + super(); + this.gameFile = gameFile; + this.round = 1; + this.joinedRoundOne = true; + this.mode = mode; + } + + public Game(@NotNull final GameFile gameFile, @NotNull final GameMode mode, final int round) { + super(); + this.gameFile = gameFile; + this.round = round; + this.joinedRoundOne = round == 1; + this.mode = mode; + } + + public long split(final int round) { + if (round ) + return super.split(); + } +} diff --git a/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java b/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java new file mode 100644 index 0000000..fc01920 --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/game/GameFile.java @@ -0,0 +1,42 @@ +package xyz.stachel.zombiesutils.game; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +import org.jetbrains.annotations.NotNull; + +class GameFile extends File { + private FileWriter writer; + + GameFile(@NotNull final String serverNumber) { + super(new File("zombies", "runs"), formattedTime() + "_" + serverNumber + ".seg2"); + } + + private static String formattedTime() { + final LocalDateTime dateTime = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES); + return dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace(':', '-').replaceFirst("T", "_"); + } + + void init() throws IOException { + if (!this.exists()) { + this.getParentFile().mkdirs(); + this.createNewFile(); + } + if (this.isFile()) { + this.setWritable(true); + } + this.writer = new FileWriter(this); + } + + void addSplit(final long ticks) throws IOException { + this.writer.append(String.format("%d", ticks)); + } + + void clean() throws IOException { + this.writer.close(); + } +} diff --git a/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java b/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java new file mode 100644 index 0000000..2e7c52a --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/game/GameManager.java @@ -0,0 +1,27 @@ +package xyz.stachel.zombiesutils.game; + +import java.util.HashMap; + +import xyz.stachel.zombiesutils.game.GameMode.Map; +import xyz.stachel.zombiesutils.handlers.Location; + +public class GameManager { + private final HashMap games = new HashMap<>(); + + private void addGame(final String serverNumber, final GameMode mode, final int round) { + this.games.put(serverNumber, new Game(new GameFile(serverNumber), mode)); + } + + public void onRound(final int round) { + final String sn = Location.getServerNumber(); + final String mode = Location.getMode(); + if (sn == null || mode == null || !mode.startsWith("ZOMBIES")) return; + + if (!games.containsKey(sn)) addGame(sn, new GameMode(Map.DEAD_END), round); + else games.get(sn).split(round); + } + + public Game getGame() { + + } +} diff --git a/src/main/java/xyz/stachel/zombiesutils/game/GameMode.java b/src/main/java/xyz/stachel/zombiesutils/game/GameMode.java new file mode 100644 index 0000000..ac8525a --- /dev/null +++ b/src/main/java/xyz/stachel/zombiesutils/game/GameMode.java @@ -0,0 +1,34 @@ +package xyz.stachel.zombiesutils.game; + +import org.jetbrains.annotations.NotNull; + +class GameMode { + private final Map map; + private Difficulty difficulty; + + GameMode(final Map map) { + this.map = map; + this.difficulty = Difficulty.NORMAL; + } + + GameMode(@NotNull final Map map, @NotNull final Difficulty difficulty) { + this.map = map; + } + + void changeDifficulty(@NotNull final Difficulty difficulty) { + this.difficulty = map != Map.ALIEN_ARCADIUM ? difficulty : Difficulty.NORMAL; + } + + enum Map { + DEAD_END, BAD_BLOOD, PRISON, ALIEN_ARCADIUM; + } + + enum Difficulty { + NORMAL, HARD, RIP; + } + + @Override + public String toString() { + return map.toString() + "_" + difficulty.toString(); + } +} diff --git a/src/client/java/xyz/stachel/zombiesutils/game/Timer.java b/src/main/java/xyz/stachel/zombiesutils/game/Timer.java similarity index 84% rename from src/client/java/xyz/stachel/zombiesutils/game/Timer.java rename to src/main/java/xyz/stachel/zombiesutils/game/Timer.java index 9f0da8e..f2d6041 100644 --- a/src/client/java/xyz/stachel/zombiesutils/game/Timer.java +++ b/src/main/java/xyz/stachel/zombiesutils/game/Timer.java @@ -1,7 +1,7 @@ package xyz.stachel.zombiesutils.game; import net.minecraft.client.MinecraftClient; -import xyz.stachel.zombiesutils.ZombiesUtilsClient; +import xyz.stachel.zombiesutils.ZombiesUtils; class Timer { // world-absolute tick the game started on @@ -30,7 +30,7 @@ class Timer { private long worldTick() { MinecraftClient mc = MinecraftClient.getInstance(); if (mc == null || mc.world == null) { - ZombiesUtilsClient.LOGGER.warn("Timer is running, but the player is not in game."); + ZombiesUtils.LOGGER.warn("Timer is running, but the player is not in game."); return 0; } return mc.world.getTime(); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 88e23be..480c9c6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -15,6 +15,9 @@ "icon": "assets/zombies-utils/icon.png", "environment": "client", "entrypoints": { + "main": [ + "xyz.stachel.zombiesutils.ZombiesUtils" + ], "client": [ "xyz.stachel.zombiesutils.ZombiesUtilsClient" ]