diff --git a/gradle.properties b/gradle.properties index f9f4c8a..f3aedc9 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.4-PREVIEW_6 \ No newline at end of file +version = 1.2.5 \ 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 bfe1803..18a76ab 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/ZombiesUtils.java @@ -3,9 +3,8 @@ package com.github.stachelbeere1248.zombiesutils; import com.github.stachelbeere1248.zombiesutils.commands.CommandRegistry; import com.github.stachelbeere1248.zombiesutils.config.Hotkeys; import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig; -import com.github.stachelbeere1248.zombiesutils.handlers.HandlerRegistry; +import com.github.stachelbeere1248.zombiesutils.handlers.Handlers; import net.minecraft.client.Minecraft; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @@ -17,10 +16,12 @@ import org.jetbrains.annotations.NotNull; public class ZombiesUtils { private static ZombiesUtils instance; private final Hotkeys hotkeys; + private final Handlers handlers; private Logger logger; public ZombiesUtils() { hotkeys = new Hotkeys(); + handlers = new Handlers(); instance = this; } @@ -40,7 +41,7 @@ public class ZombiesUtils { @Mod.EventHandler public void init(FMLInitializationEvent event) { - HandlerRegistry.registerAll(); + handlers.registerAll(); CommandRegistry.registerAll(); hotkeys.registerAll(); } @@ -52,6 +53,11 @@ public class ZombiesUtils { public Hotkeys getHotkeys() { return hotkeys; } + + public Handlers getHandlers() { + return handlers; + } + public static boolean isHypixel() { return Minecraft.getMinecraft().getCurrentServerData().serverIP.matches("(.+\\.)?(hypixel\\.net)(:25565)?"); } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/config/ZombiesUtilsConfig.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/config/ZombiesUtilsConfig.java index 5d8a354..698c04c 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/config/ZombiesUtilsConfig.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/config/ZombiesUtilsConfig.java @@ -19,6 +19,8 @@ public class ZombiesUtilsConfig { private static Property waveOffset; private static Property language; private static Property auditory; + private static Property copyDelta; + private static Property cpsCounter; public static void load() { ZombiesUtils.getInstance().getLogger().debug("Loading config..."); @@ -86,6 +88,18 @@ public class ZombiesUtilsConfig { "Enable if not using SST by Sosean" ); + copyDelta = config.get( + Configuration.CATEGORY_GENERAL, + "copy delta", + false, + "Also copy the delta-time when clicking the round-end message?" + ); + cpsCounter = config.get( + Configuration.CATEGORY_GENERAL, + "cps", + false, + "whether to show cps" + ); } public static short getWaveOffset() { @@ -122,6 +136,12 @@ public class ZombiesUtilsConfig { public static boolean getSST() { return sst.getBoolean(); } + public static boolean getCopyDelta() { + return copyDelta.getBoolean(); + } + public static boolean getCpsToggle() { + return cpsCounter.getBoolean(); + } @SubscribeEvent public void onConfigChange(ConfigChangedEvent.@NotNull OnConfigChangedEvent event) { diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/game/enums/Map.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/game/enums/Map.java index 5a88482..9320ec5 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/game/enums/Map.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/game/enums/Map.java @@ -1,5 +1,18 @@ package com.github.stachelbeere1248.zombiesutils.game.enums; +import org.jetbrains.annotations.NotNull; + public enum Map { - DEAD_END, BAD_BLOOD, ALIEN_ARCADIUM, PRISON + DEAD_END, BAD_BLOOD, ALIEN_ARCADIUM, PRISON; + + @Override + public @NotNull String toString() { + switch (this) { + case DEAD_END: return "Dead End"; + case BAD_BLOOD: return "Bad Blood"; + case ALIEN_ARCADIUM: return "Alien Arcadium"; + case PRISON: return "Prison"; + default: throw new IllegalStateException("Unexpected Map value:" + this); + } + } } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/game/waves/Waves.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/game/waves/Waves.java index 70a9040..88d196d 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/game/waves/Waves.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/game/waves/Waves.java @@ -1,6 +1,8 @@ package com.github.stachelbeere1248.zombiesutils.game.waves; import com.github.stachelbeere1248.zombiesutils.game.enums.Map; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ChatComponentText; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -16,16 +18,24 @@ public class Waves { @Contract(pure = true) public static byte[] get(@NotNull Map map, byte round) { - switch (map) { - case DEAD_END: - return deadEndWaveTimes[round - 1]; - case BAD_BLOOD: - return badBloodWaveTimes[round - 1]; - case ALIEN_ARCADIUM: - return alienArcadiumWaveTimes[round - 1]; - default: - throw new IllegalStateException("Unexpected value: " + map); + byte[] ret = new byte[0]; + try { + switch (map) { + case DEAD_END: + ret = deadEndWaveTimes[round - 1]; + case BAD_BLOOD: + ret = badBloodWaveTimes[round - 1]; + case ALIEN_ARCADIUM: + ret = alienArcadiumWaveTimes[round - 1]; + default: + throw new IllegalStateException("Unexpected value: " + map); + } + } catch (ArrayIndexOutOfBoundsException e) { + Minecraft.getMinecraft().thePlayer.addChatMessage( + new ChatComponentText("Achievement get: Round " + round + map) + ); } + return ret; } public static short getSum(@NotNull Map map, byte round) { diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/HandlerRegistry.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/Handlers.java similarity index 57% rename from src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/HandlerRegistry.java rename to src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/Handlers.java index 8187795..d6c029d 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/HandlerRegistry.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/Handlers.java @@ -3,12 +3,22 @@ package com.github.stachelbeere1248.zombiesutils.handlers; import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig; import net.minecraftforge.common.MinecraftForge; -public class HandlerRegistry { - public static void registerAll() { +public class Handlers { + private final RenderGameOverlayHandler renderer; + + public Handlers() { + renderer = new RenderGameOverlayHandler(); + } + + public void registerAll() { MinecraftForge.EVENT_BUS.register(new ZombiesUtilsConfig()); - MinecraftForge.EVENT_BUS.register(new RenderGameOverlayHandler()); + MinecraftForge.EVENT_BUS.register(renderer); MinecraftForge.EVENT_BUS.register(new TickHandler()); MinecraftForge.EVENT_BUS.register(new ChatHandler()); MinecraftForge.EVENT_BUS.register(new KeyInputHandler()); } + + public RenderGameOverlayHandler getRenderer() { + return renderer; + } } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/KeyInputHandler.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/KeyInputHandler.java index d3717a3..a61c513 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/KeyInputHandler.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/KeyInputHandler.java @@ -5,25 +5,33 @@ import com.github.stachelbeere1248.zombiesutils.config.Hotkeys; import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig; import com.github.stachelbeere1248.zombiesutils.game.waves.WaveTiming; import net.minecraft.client.Minecraft; -import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; public class KeyInputHandler { @SubscribeEvent - public void onKeyInput(InputEvent.KeyInputEvent event) { - if (Keyboard.getEventKeyState() && Minecraft.getMinecraft().currentScreen == null) { - Hotkeys hotkeys = ZombiesUtils.getInstance().getHotkeys(); - if (Keyboard.getEventKey() == hotkeys.getChatMacro().getKeyCode()) { - Minecraft.getMinecraft().thePlayer.sendChatMessage( - ZombiesUtilsConfig.getChatMacro() - ); - } else if (Keyboard.getEventKey() == hotkeys.getRlSpawn().getKeyCode()) { - RenderGameOverlayHandler.toggleRL(); - WaveTiming.toggleRL(); + public void onKeyInput(InputEvent event) { + if (Minecraft.getMinecraft().currentScreen != null) return; + if (event instanceof InputEvent.KeyInputEvent) { + if (Keyboard.getEventKeyState()) { + Hotkeys hotkeys = ZombiesUtils.getInstance().getHotkeys(); + if (Keyboard.getEventKey() == hotkeys.getChatMacro().getKeyCode()) { + Minecraft.getMinecraft().thePlayer.sendChatMessage( + ZombiesUtilsConfig.getChatMacro() + ); + } else if (Keyboard.getEventKey() == hotkeys.getRlSpawn().getKeyCode()) { + ZombiesUtils.getInstance().getHandlers().getRenderer().toggleRL(); + WaveTiming.toggleRL(); + } + } + } else if (event instanceof InputEvent.MouseInputEvent) { + if (Mouse.getEventButtonState()) { + if (Mouse.getEventButton() == 1) ZombiesUtils.getInstance().getHandlers().getRenderer().addClick(); } } } + } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/RenderGameOverlayHandler.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/RenderGameOverlayHandler.java index 3922b9e..1c46f88 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/RenderGameOverlayHandler.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/RenderGameOverlayHandler.java @@ -16,7 +16,9 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; public class RenderGameOverlayHandler { - private static int rl = 0; + private int rl = 0; + private final boolean[] clicks = new boolean[20]; + private int clickPointer = 0; private final FontRenderer fontRenderer; public RenderGameOverlayHandler() { @@ -37,7 +39,7 @@ public class RenderGameOverlayHandler { return String.format("W%d %d:%02d.%d", wave, minutesPart, secondsPart, tenthSecondsPart); } - static void toggleRL() { + void toggleRL() { if (rl == 0) rl = ZombiesUtilsConfig.getWaveOffset(); else rl = 0; } @@ -45,6 +47,7 @@ public class RenderGameOverlayHandler { @SubscribeEvent public void onRenderGameOverlay(RenderGameOverlayEvent.@NotNull Post event) { if (event.type != RenderGameOverlayEvent.ElementType.TEXT) return; + Timer.getInstance().ifPresent(timer -> { renderTime(timer.roundTime()); renderSpawnTime( @@ -55,10 +58,13 @@ public class RenderGameOverlayHandler { timer.roundTime() ); }); + SLA.getInstance().ifPresent(sla -> { sla.refreshActives(); renderSla(sla.getRooms()); }); + + if (ZombiesUtilsConfig.getCpsToggle()) renderCPS(); } private void renderTime(long timerTicks) { @@ -128,4 +134,34 @@ public class RenderGameOverlayHandler { heightIndex++; } } + public void renderCPS() { + final String cps = String.format("%2.1f", getClicks()); + final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + final int screenWidth = scaledResolution.getScaledWidth(); + final int width = fontRenderer.getStringWidth(cps); + + fontRenderer.drawStringWithShadow( + cps, + screenWidth - width, + 0, + 0xAAAAAA + ); + } + + public double getClicks() { + int i = 0; + for (boolean tick : clicks) { + if (tick) i++; + } + return i; + } + + public void addClick() { + clicks[clickPointer] = true; + } + + public void tick() { + clickPointer = (clickPointer + 1) % 20; + clicks[clickPointer] = false; + } } diff --git a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/TickHandler.java b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/TickHandler.java index c6b6921..6c9cde0 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/TickHandler.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/handlers/TickHandler.java @@ -1,5 +1,6 @@ package com.github.stachelbeere1248.zombiesutils.handlers; +import com.github.stachelbeere1248.zombiesutils.ZombiesUtils; import com.github.stachelbeere1248.zombiesutils.game.waves.WaveTiming; import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -12,5 +13,6 @@ public class TickHandler { if (event.phase == TickEvent.Phase.START) return; Scoreboard.refresh(); WaveTiming.onTick(); + ZombiesUtils.getInstance().getHandlers().getRenderer().tick(); } } 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 3e3eff5..e4cf817 100644 --- a/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java +++ b/src/main/java/com/github/stachelbeere1248/zombiesutils/timer/RecordManager.java @@ -1,9 +1,12 @@ package com.github.stachelbeere1248.zombiesutils.timer; +import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig; import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category; import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile; import net.minecraft.client.Minecraft; +import net.minecraft.event.ClickEvent; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -11,55 +14,73 @@ public class RecordManager { private static final String bar = "§l§a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"; public static void compareSegment(byte round, short roundTime, @NotNull Category category) throws IndexOutOfBoundsException { - String segmentMessage = bar + - "\n§e Category: §d" + category.getName(); + @SuppressWarnings("OptionalGetWithoutIsPresent") + final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); + final short bestSegment = categoryFile.getBestSegment(round); + + final String timeString = formattedTime(roundTime); + String segmentMessage = bar + "\n§e Category: §d" + category.getName(); + String deltaString = ""; - @SuppressWarnings("OptionalGetWithoutIsPresent") final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); - short bestSegment = categoryFile.getBestSegment(round); if (bestSegment == (short) 0) { categoryFile.setBestSegment(round, roundTime); segmentMessage += "\n§e§l***§6§l NEW BEST SEGMENT! §e§l***"; - final String timeString = formattedTime(roundTime); segmentMessage += "\n§cRound " + round + "§e took §a" + timeString + "§e!"; } else { if (roundTime < bestSegment) { segmentMessage += "\n§e§l***§6§l NEW BEST SEGMENT! §e§l***"; categoryFile.setBestSegment(round, roundTime); } - final String timeString = formattedTime(roundTime); - segmentMessage += "\n§cRound " + round + "§e took §a" + timeString + " §9" + formattedDelta(roundTime, bestSegment); + deltaString = formattedDelta(roundTime, bestSegment); + segmentMessage += "\n§cRound " + round + "§e took §a" + timeString + " §9" + deltaString; + if (ZombiesUtilsConfig.getCopyDelta()) deltaString = " (" + deltaString + ")"; } + + segmentMessage += "\n" + bar; - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(segmentMessage)); + final ChatComponentText message = new ChatComponentText(segmentMessage); + + String copyString = String.format("Round %s took %s%s!", round, timeString, deltaString); + message.setChatStyle(new ChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, copyString))); + + Minecraft.getMinecraft().thePlayer.addChatMessage(message); } public static void compareBest(byte round, int gameTime, @NotNull Category category) throws IndexOutOfBoundsException { - String bestMessage = bar + - "\n§e Category: §d" + category.getName(); + @SuppressWarnings("OptionalGetWithoutIsPresent") + final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); + final int personalBest = categoryFile.getPersonalBest(round); + String deltaString = ""; + + String bestMessage = bar + "\n§e Category: §d" + category.getName(); + final String timeString = formattedTime(gameTime); - @SuppressWarnings("OptionalGetWithoutIsPresent") final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode()); - int personalBest = categoryFile.getPersonalBest(round); if (personalBest == 0) { categoryFile.setPersonalBest(round, gameTime); bestMessage += "\n§e§l***§6§l NEW PERSONAL BEST! §e§l***"; - final String timeString = formattedTime(gameTime); bestMessage += "\n§cRound " + round + "§e finished at §a" + timeString + "§e!"; } else { if (gameTime < personalBest) { bestMessage += "\n§e§l***§6§l NEW PERSONAL BEST! §e§l***"; categoryFile.setPersonalBest(round, gameTime); } - - final String timeString = formattedTime(gameTime); - bestMessage += "\n§cRound " + round + "§e finished at §a" + timeString + " §9" + formattedDelta(gameTime, personalBest); + deltaString = formattedDelta(gameTime, personalBest); + bestMessage += "\n§cRound " + round + "§e finished at §a" + timeString + " §9" + deltaString; + if (ZombiesUtilsConfig.getCopyDelta()) deltaString = " (" + deltaString + ")"; } bestMessage += "\n" + bar; - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(bestMessage)); + final ChatComponentText message = new ChatComponentText(bestMessage); + + String copyString = String.format("Round %s finished at %s%s!", round, timeString, deltaString); + message.setChatStyle(new ChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, copyString))); + + Minecraft.getMinecraft().thePlayer.addChatMessage(message); } + @Contract(pure = true) private static String formattedTime(int gameTime) { gameTime *= 50; return String.format("%d:%02d.%d%d", @@ -72,9 +93,7 @@ public class RecordManager { @Contract(pure = true) private static @NotNull String formattedDelta(int newTime, int prevTime) { - double delta = (double) (newTime - prevTime) / 20; - if (delta < 0) { - return String.valueOf(delta); - } else return ("+" + delta); + final double delta = (double) (newTime - prevTime) / 20; + return String.format("%+.2f", delta); } }