From 19049ebd7e21c5311b7605f8dd9f075c5099af60 Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Sun, 4 May 2025 15:52:28 -0500 Subject: [PATCH 1/6] Memoize the debug shape on the client --- .../veinminer/client/render/WireframeShapeRenderer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/WireframeShapeRenderer.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/WireframeShapeRenderer.java index 270375d..a0f1508 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/WireframeShapeRenderer.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/WireframeShapeRenderer.java @@ -1,5 +1,6 @@ package wtf.choco.veinminer.client.render; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -33,7 +34,7 @@ public final class WireframeShapeRenderer { private static final int WIREFRAME_COLOR_SOLID = ARGB.color(255, WIREFRAME_COLOR); private static final int WIREFRAME_COLOR_TRANSLUCENT = ARGB.color(20, WIREFRAME_COLOR); - private static final Supplier DEBUG_SHAPE = () -> Shapes.or( + private static final Supplier DEBUG_SHAPE = Suppliers.memoize(() -> Shapes.or( Shapes.block(), Shapes.block().move(0, 1, 0), Shapes.block().move(0, -1, 0), @@ -41,7 +42,7 @@ public final class WireframeShapeRenderer { Shapes.block().move(-1, 0, 0), Shapes.block().move(0, 0, 1), Shapes.block().move(0, 0, -1) - ); + )); private final VeinMinerClient client; From 3d206ed76454e59632cce4e355be6da80117495b Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Fri, 16 May 2025 10:21:27 -0500 Subject: [PATCH 2/6] Listen for BlockBreakEvent on MONITOR priority --- .../java/wtf/choco/veinminer/listener/BreakBlockListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/listener/BreakBlockListener.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/listener/BreakBlockListener.java index 31db7ae..8f8a883 100644 --- a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/listener/BreakBlockListener.java +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/listener/BreakBlockListener.java @@ -12,6 +12,7 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; @@ -52,7 +53,8 @@ public BreakBlockListener(@NotNull VeinMinerPlugin plugin) { this.plugin = plugin; } - @EventHandler(ignoreCancelled = true) + // Monitor priority is safe, VeinMiner does not mutate the event state + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) private void onBlockBreak(BlockBreakEvent event) { if (event.getClass() != BlockBreakEvent.class) { // For plugins such as McMMO, who fire custom events return; From 3f51c1eebaef9e56eb7771e07731d08685ce8329 Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Sun, 18 May 2025 11:09:23 -0500 Subject: [PATCH 3/6] Add support for Polar AntiCheat --- gradle/libs.versions.toml | 2 + veinminer-bukkit/build.gradle.kts | 2 + .../wtf/choco/veinminer/VeinMinerPlugin.java | 28 ++++++-- .../anticheat/AntiCheatHookPolar.java | 71 +++++++++++++++++++ .../src/main/resources/plugin.yml | 1 + 5 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookPolar.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c3541c5..d5c69f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,7 @@ anticheat-aac = "0.0.1-SNAPSHOT" anticheat-grim = "d99dcba158" # The last API version before their "platform independence" update, which changes the package of their FlagEvent! anticheat-matrix = "317d4635fd" # This repository is dead now, but we're going to keep using it because it exists on JitPack :) anticheat-nocheatplus = "3.16.1-SNAPSHOT" +anticheat-polar = "2.0.0" anticheat-spartan = "1.0" anticheat-light = "99d1930f2a" # https://github.com/tiredvekster/LightAntiCheat/commit/99d1930f2afa0e5dd23a5e212aadf49499e3fd83 anticheat-negativity = "2.7.1" @@ -45,6 +46,7 @@ anticheat-aac = { module = "me.konsolas:AACAPIDummy", version.ref = "anticheat-a anticheat-grim = { module = "ac.grim.grimac:GrimAPI", version.ref = "anticheat-grim" } anticheat-matrix = { module = "com.github.jiangdashao:matrix-api-repo", version.ref = "anticheat-matrix" } anticheat-nocheatplus = { module = "fr.neatmonster:nocheatplus", version.ref = "anticheat-nocheatplus" } +anticheat-polar = { module = "top.polar:api", version.ref = "anticheat-polar" } anticheat-spartan = { module = "me.vagdedes:SpartanAPI", version.ref = "anticheat-spartan" } anticheat-light = { module = "com.github.tiredvekster:LightAntiCheat", version.ref = "anticheat-light" } anticheat-negativity = { module = "com.github.Elikill58:Negativity", version.ref = "anticheat-negativity" } diff --git a/veinminer-bukkit/build.gradle.kts b/veinminer-bukkit/build.gradle.kts index 512e62b..45e601c 100644 --- a/veinminer-bukkit/build.gradle.kts +++ b/veinminer-bukkit/build.gradle.kts @@ -13,6 +13,7 @@ repositories { maven("https://repo.md-5.net/content/repositories/snapshots/") // NoCheatPlus maven("https://repo.grim.ac/snapshots/") // Grim Anticheat maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // PlaceholderAPI + maven("https://repo.polar.top/repository/polar/") // Polar AntiCheat } dependencies { @@ -35,6 +36,7 @@ dependencies { compileOnly(libs.anticheat.grim) compileOnly(libs.anticheat.matrix) compileOnly(libs.anticheat.nocheatplus) + compileOnly(libs.anticheat.polar) compileOnly(libs.anticheat.spartan) compileOnly(libs.anticheat.light) compileOnly(libs.anticheat.negativity) diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java index 6c8d15c..2f3174f 100644 --- a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java @@ -31,6 +31,7 @@ import wtf.choco.veinminer.anticheat.AntiCheatHookMatrix; import wtf.choco.veinminer.anticheat.AntiCheatHookNCP; import wtf.choco.veinminer.anticheat.AntiCheatHookNegativity; +import wtf.choco.veinminer.anticheat.AntiCheatHookPolar; import wtf.choco.veinminer.anticheat.AntiCheatHookSpartan; import wtf.choco.veinminer.anticheat.AntiCheatHookThemis; import wtf.choco.veinminer.anticheat.AntiCheatHookVulcan; @@ -172,6 +173,7 @@ public void onEnable() { this.registerAntiCheatHookIfEnabled(manager, "Matrix", AntiCheatHookMatrix::new); this.registerAntiCheatHookIfEnabled(manager, "Negativity", AntiCheatHookNegativity::new); this.registerAntiCheatHookIfEnabled(manager, "NoCheatPlus", () -> new AntiCheatHookNCP(this)); + this.registerAntiCheatHookIfEnabled(manager, "PolarLoader", "Polar", () -> new AntiCheatHookPolar(this)); this.registerAntiCheatHookIfEnabled(manager, "Spartan", () -> new AntiCheatHookSpartan(this)); this.registerAntiCheatHookIfEnabled(manager, "Themis", AntiCheatHookThemis::new); this.registerAntiCheatHookIfEnabled(manager, "Vulcan", AntiCheatHookVulcan::new); @@ -414,16 +416,16 @@ private void registerCommand(@NotNull String commandName, @NotNull CommandExecut command.setExecutor(executor); } - private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @NotNull String pluginName, @NotNull Supplier<@NotNull ? extends AntiCheatHook> hookSupplier) { - if (!manager.isPluginEnabled(pluginName)) { + private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @NotNull String pluginId, @NotNull String pluginDisplayName, @NotNull Supplier<@NotNull ? extends AntiCheatHook> hookSupplier) { + if (!manager.isPluginEnabled(pluginId)) { return; } - this.getLogger().info("Anti cheat detected. Enabling anti cheat support for \"" + pluginName + "\""); + this.getLogger().info("Anti cheat detected. Enabling anti cheat support for \"" + pluginDisplayName + "\""); AntiCheatHook hook = hookSupplier.get(); if (!registerAntiCheatHook(hook)) { - this.getLogger().warning("The installed version of \"%s\" is incompatible with VeinMiner. Please contact the author of VeinMiner.".formatted(pluginName)); + this.getLogger().warning("The installed version of \"%s\" is incompatible with VeinMiner. Please contact the author of VeinMiner.".formatted(pluginDisplayName)); return; } @@ -431,10 +433,22 @@ private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @Not manager.registerEvents(hookListener, this); } - Plugin antiCheatPlugin = Bukkit.getPluginManager().getPlugin(pluginName); - if (antiCheatPlugin != null) { - StatTracker.addInstalledAntiCheat(new AntiCheat(antiCheatPlugin.getName(), antiCheatPlugin.getDescription().getVersion())); + // Some plugins like Polar AntiCheat are loaded by "PolarLoader" (a provided id), but the plugin name might actually be "Polar". We'll try both + this.tryToRegisterAntiCheatToMetrics(pluginId); + this.tryToRegisterAntiCheatToMetrics(pluginDisplayName); + } + + private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @NotNull String pluginName, @NotNull Supplier<@NotNull ? extends AntiCheatHook> hookSupplier) { + this.registerAntiCheatHookIfEnabled(manager, pluginName, pluginName, hookSupplier); + } + + private void tryToRegisterAntiCheatToMetrics(String pluginId) { + Plugin antiCheatPlugin = Bukkit.getPluginManager().getPlugin(pluginId); + if (antiCheatPlugin == null) { + return; } + + StatTracker.addInstalledAntiCheat(new AntiCheat(antiCheatPlugin.getName(), antiCheatPlugin.getDescription().getVersion())); } private void setupPersistentStorage() { diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookPolar.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookPolar.java new file mode 100644 index 0000000..784a52a --- /dev/null +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookPolar.java @@ -0,0 +1,71 @@ +package wtf.choco.veinminer.anticheat; + +import com.google.common.collect.Sets; + +import java.util.Set; +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import wtf.choco.veinminer.VeinMinerPlugin; + +import top.polar.api.PolarApi; +import top.polar.api.PolarApiAccessor; +import top.polar.api.exception.PolarNotLoadedException; +import top.polar.api.loader.LoaderApi; +import top.polar.api.user.event.DetectionAlertEvent; +import top.polar.api.user.event.type.CheckType; + +/** + * The default Polar AntiCheat hook implementation. + */ +public final class AntiCheatHookPolar implements AntiCheatHook { + + private final VeinMinerPlugin plugin; + private final Set exempt = Sets.newConcurrentHashSet(); // Polar does some really strange classloading. I can't reasonably guarantee its events are on the main thread + + public AntiCheatHookPolar(VeinMinerPlugin plugin) { + this.plugin = plugin; + LoaderApi.registerEnableCallback(this::initialize); + } + + private void initialize() { + PolarApi api; + try { + api = PolarApiAccessor.access().get(); + } catch (PolarNotLoadedException e) { + this.plugin.getLogger().warning("Failed to initialize support for Polar AntiCheat. This is a bug. Please report this exception to VeinMiner!"); + e.printStackTrace(); + return; + } + + api.events().repository().registerListener(DetectionAlertEvent.class, this::onDetectionAlert); + } + + @Override + public void exempt(@NotNull Player player) { + this.exempt.add(player.getUniqueId()); + } + + @Override + public void unexempt(@NotNull Player player) { + this.exempt.remove(player.getUniqueId()); + } + + @Override + public boolean shouldUnexempt(@NotNull Player player) { + return exempt.contains(player.getUniqueId()); + } + + private void onDetectionAlert(DetectionAlertEvent event) { + if (!exempt.contains(event.user().uuid())) { + return; + } + + if (event.check().type() == CheckType.BLOCK_INTERACT) { + event.cancelled(true); + } + } + +} diff --git a/veinminer-bukkit/src/main/resources/plugin.yml b/veinminer-bukkit/src/main/resources/plugin.yml index 359fc01..24efe0e 100644 --- a/veinminer-bukkit/src/main/resources/plugin.yml +++ b/veinminer-bukkit/src/main/resources/plugin.yml @@ -14,6 +14,7 @@ softdepend: - Matrix - Negativity - NoCheatPlus +- PolarLoader - Spartan - Themis - Vulcan From 2f28d87966166ce22eb426abfb6af478bf02f2a6 Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Sun, 18 May 2025 11:21:00 -0500 Subject: [PATCH 4/6] Add support for Intave AntiCheat --- gradle/libs.versions.toml | 2 + veinminer-bukkit/build.gradle.kts | 2 + .../wtf/choco/veinminer/VeinMinerPlugin.java | 2 + .../anticheat/AntiCheatHookIntave.java | 50 +++++++++++++++++++ .../src/main/resources/plugin.yml | 1 + 5 files changed, 57 insertions(+) create mode 100644 veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookIntave.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d5c69f3..74ad0fb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ junit = "5.10.2" # (bukkit) anticheat-aac = "0.0.1-SNAPSHOT" anticheat-grim = "d99dcba158" # The last API version before their "platform independence" update, which changes the package of their FlagEvent! +anticheat-intave = "14.4.2" anticheat-matrix = "317d4635fd" # This repository is dead now, but we're going to keep using it because it exists on JitPack :) anticheat-nocheatplus = "3.16.1-SNAPSHOT" anticheat-polar = "2.0.0" @@ -44,6 +45,7 @@ junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", vers # (bukkit) anticheat-aac = { module = "me.konsolas:AACAPIDummy", version.ref = "anticheat-aac" } # Dummy API artifact, contains only add/removeExemption() and AACExemption classes useful to VeinMiner! anticheat-grim = { module = "ac.grim.grimac:GrimAPI", version.ref = "anticheat-grim" } +anticheat-intave = { module = "de.jpx3.intave.access:intave-access", version.ref = "anticheat-intave" } anticheat-matrix = { module = "com.github.jiangdashao:matrix-api-repo", version.ref = "anticheat-matrix" } anticheat-nocheatplus = { module = "fr.neatmonster:nocheatplus", version.ref = "anticheat-nocheatplus" } anticheat-polar = { module = "top.polar:api", version.ref = "anticheat-polar" } diff --git a/veinminer-bukkit/build.gradle.kts b/veinminer-bukkit/build.gradle.kts index 45e601c..c534590 100644 --- a/veinminer-bukkit/build.gradle.kts +++ b/veinminer-bukkit/build.gradle.kts @@ -14,6 +14,7 @@ repositories { maven("https://repo.grim.ac/snapshots/") // Grim Anticheat maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // PlaceholderAPI maven("https://repo.polar.top/repository/polar/") // Polar AntiCheat + maven("https://repo.janmm14.de/repository/intave/") // Intave AntiCheat } dependencies { @@ -34,6 +35,7 @@ dependencies { // Anti-cheats compileOnly(libs.anticheat.aac) compileOnly(libs.anticheat.grim) + compileOnly(libs.anticheat.intave) compileOnly(libs.anticheat.matrix) compileOnly(libs.anticheat.nocheatplus) compileOnly(libs.anticheat.polar) diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java index 2f3174f..2a1e3c1 100644 --- a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java @@ -27,6 +27,7 @@ import wtf.choco.veinminer.anticheat.AntiCheatHookAAC; import wtf.choco.veinminer.anticheat.AntiCheatHookAntiAura; import wtf.choco.veinminer.anticheat.AntiCheatHookGrim; +import wtf.choco.veinminer.anticheat.AntiCheatHookIntave; import wtf.choco.veinminer.anticheat.AntiCheatHookLightAntiCheat; import wtf.choco.veinminer.anticheat.AntiCheatHookMatrix; import wtf.choco.veinminer.anticheat.AntiCheatHookNCP; @@ -169,6 +170,7 @@ public void onEnable() { this.registerAntiCheatHookIfEnabled(manager, "AAC5", AntiCheatHookAAC::new); this.registerAntiCheatHookIfEnabled(manager, "AntiAura", () -> new AntiCheatHookAntiAura(this)); this.registerAntiCheatHookIfEnabled(manager, "GrimAC", () -> new AntiCheatHookGrim(this)); + this.registerAntiCheatHookIfEnabled(manager, "Intave", AntiCheatHookIntave::new); this.registerAntiCheatHookIfEnabled(manager, "LightAntiCheat", AntiCheatHookLightAntiCheat::new); this.registerAntiCheatHookIfEnabled(manager, "Matrix", AntiCheatHookMatrix::new); this.registerAntiCheatHookIfEnabled(manager, "Negativity", AntiCheatHookNegativity::new); diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookIntave.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookIntave.java new file mode 100644 index 0000000..211843e --- /dev/null +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/anticheat/AntiCheatHookIntave.java @@ -0,0 +1,50 @@ +package wtf.choco.veinminer.anticheat; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import de.jpx3.intave.access.check.Check; +import de.jpx3.intave.access.check.event.IntaveViolationEvent; +import de.jpx3.intave.access.check.event.IntaveViolationEvent.Reaction; + +/** + * The default Intave AntiCheat hook implementation. + */ +public final class AntiCheatHookIntave implements AntiCheatHook, Listener { + + private final Set exempt = new HashSet<>(); + + @Override + public void exempt(@NotNull Player player) { + this.exempt.add(player.getUniqueId()); + } + + @Override + public void unexempt(@NotNull Player player) { + this.exempt.remove(player.getUniqueId()); + } + + @Override + public boolean shouldUnexempt(@NotNull Player player) { + return exempt.contains(player.getUniqueId()); + } + + @EventHandler + private void onIntaveViolation(IntaveViolationEvent event) { + if (!exempt.contains(event.player().getUniqueId())) { + return; + } + + Check check = event.checkEnum(); + if (check == Check.BREAK_SPEED_LIMITER || check == Check.INTERACTION_RAYTRACE) { + event.suggestReaction(Reaction.IGNORE); + } + } + +} diff --git a/veinminer-bukkit/src/main/resources/plugin.yml b/veinminer-bukkit/src/main/resources/plugin.yml index 24efe0e..7414580 100644 --- a/veinminer-bukkit/src/main/resources/plugin.yml +++ b/veinminer-bukkit/src/main/resources/plugin.yml @@ -10,6 +10,7 @@ softdepend: - AAC5 - AntiAura - GrimAC +- Intave - LightAntiCheat - Matrix - Negativity From 78e83a2fbfa662d0dabc29c713d8090089a16b52 Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Sun, 18 May 2025 11:24:33 -0500 Subject: [PATCH 5/6] Try to find the display plugin id first, then register original if it differs --- .../main/java/wtf/choco/veinminer/VeinMinerPlugin.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java index 2a1e3c1..83bb845 100644 --- a/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java +++ b/veinminer-bukkit/src/main/java/wtf/choco/veinminer/VeinMinerPlugin.java @@ -436,21 +436,23 @@ private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @Not } // Some plugins like Polar AntiCheat are loaded by "PolarLoader" (a provided id), but the plugin name might actually be "Polar". We'll try both - this.tryToRegisterAntiCheatToMetrics(pluginId); - this.tryToRegisterAntiCheatToMetrics(pluginDisplayName); + if (!tryToRegisterAntiCheatToMetrics(pluginDisplayName) && !pluginDisplayName.equals(pluginId)) { + this.tryToRegisterAntiCheatToMetrics(pluginId); + } } private void registerAntiCheatHookIfEnabled(@NotNull PluginManager manager, @NotNull String pluginName, @NotNull Supplier<@NotNull ? extends AntiCheatHook> hookSupplier) { this.registerAntiCheatHookIfEnabled(manager, pluginName, pluginName, hookSupplier); } - private void tryToRegisterAntiCheatToMetrics(String pluginId) { + private boolean tryToRegisterAntiCheatToMetrics(String pluginId) { Plugin antiCheatPlugin = Bukkit.getPluginManager().getPlugin(pluginId); if (antiCheatPlugin == null) { - return; + return false; } StatTracker.addInstalledAntiCheat(new AntiCheat(antiCheatPlugin.getName(), antiCheatPlugin.getDescription().getVersion())); + return true; } private void setupPersistentStorage() { From 00bb1cf5f36f31ae85663a4715fde4cda221d30b Mon Sep 17 00:00:00 2001 From: 2008Choco Date: Tue, 17 Jun 2025 19:33:59 -0500 Subject: [PATCH 6/6] Update companion mod to Fabric 1.21.6, drop support for 1.21.5 --- gradle/libs.versions.toml | 4 +-- veinminer-fabric/build.gradle.kts | 2 ++ .../choco/veinminer/client/KeyHandler.java | 4 +-- .../veinminer/client/VeinMinerClient.java | 18 ++++++------- ...Layer.java => PatternWheelHudElement.java} | 26 +++++++------------ ...iedLayer.java => VeinMinerHudElement.java} | 6 ++--- ...yer.java => VeinMiningIconHudElement.java} | 18 +++++-------- .../src/main/resources/fabric.mod.json | 4 +-- 8 files changed, 36 insertions(+), 46 deletions(-) rename veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/{PatternWheelLayer.java => PatternWheelHudElement.java} (84%) rename veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/{VeinMinerIdentifiedLayer.java => VeinMinerHudElement.java} (83%) rename veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/{VeinMiningIconLayer.java => VeinMiningIconHudElement.java} (67%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 74ad0fb..f4dcd64 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,9 +25,9 @@ vault-api = "1.7" worldguard = "7.0.9" # (fabric) -fabric-api = "0.121.0+1.21.5" +fabric-api = "0.127.0+1.21.6" fabric-loader = "0.16.14" -minecraft = "1.21.5" +minecraft = "1.21.6" # plugins aggregate-javadoc = "8.4" diff --git a/veinminer-fabric/build.gradle.kts b/veinminer-fabric/build.gradle.kts index 018a4af..87acc9c 100644 --- a/veinminer-fabric/build.gradle.kts +++ b/veinminer-fabric/build.gradle.kts @@ -3,6 +3,8 @@ plugins { alias(libs.plugins.shadow) } +version = "2.3.1" + dependencies { api(project(":veinminer-common")) shadow(project(":veinminer-common")) diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/KeyHandler.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/KeyHandler.java index f8de9a2..fa576d6 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/KeyHandler.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/KeyHandler.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull; import wtf.choco.veinminer.client.network.FabricServerState; -import wtf.choco.veinminer.client.render.layer.PatternWheelLayer; +import wtf.choco.veinminer.client.render.layer.PatternWheelHudElement; import wtf.choco.veinminer.config.ClientConfig; import wtf.choco.veinminer.network.protocol.serverbound.ServerboundRequestVeinMine; import wtf.choco.veinminer.network.protocol.serverbound.ServerboundToggleVeinMiner; @@ -91,7 +91,7 @@ private void handlePatternSwitchKeybinds(@NotNull FabricServerState serverState, return; } - PatternWheelLayer patternWheel = client.getPatternWheelLayer(); + PatternWheelHudElement patternWheel = client.getPatternWheelLayer(); // If the HUD wheel isn't rendered yet, push a render call but don't change the pattern if (patternWheel.shouldRender(serverState)) { diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/VeinMinerClient.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/VeinMinerClient.java index a0ae034..f285fc9 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/VeinMinerClient.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/VeinMinerClient.java @@ -6,9 +6,9 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.fabricmc.fabric.api.client.rendering.v1.HudLayerRegistrationCallback; -import net.fabricmc.fabric.api.client.rendering.v1.IdentifiedLayer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.hud.VanillaHudElements; import net.minecraft.client.KeyMapping; import org.jetbrains.annotations.NotNull; @@ -20,8 +20,8 @@ import wtf.choco.veinminer.client.network.FabricServerState; import wtf.choco.veinminer.client.network.VeinMinerFabricChannelRegistrar; import wtf.choco.veinminer.client.render.WireframeShapeRenderer; -import wtf.choco.veinminer.client.render.layer.PatternWheelLayer; -import wtf.choco.veinminer.client.render.layer.VeinMiningIconLayer; +import wtf.choco.veinminer.client.render.layer.PatternWheelHudElement; +import wtf.choco.veinminer.client.render.layer.VeinMiningIconHudElement; import wtf.choco.veinminer.network.protocol.serverbound.ServerboundHandshake; /** @@ -49,7 +49,7 @@ public final class VeinMinerClient implements ClientModInitializer { private final KeyHandler keyHandler = new KeyHandler(this); private final BlockLookUpdateHandler blockLookUpdateHandler = new BlockLookUpdateHandler(this); - private final PatternWheelLayer patternWheelRenderComponent = new PatternWheelLayer(this); + private final PatternWheelHudElement patternWheelRenderComponent = new PatternWheelHudElement(this); private final WireframeShapeRenderer wireframeShapeRenderer = new WireframeShapeRenderer(this); @@ -73,10 +73,8 @@ public void onInitializeClient() { // Once joined, we're going to send a handshake packet to let the server know we have the client mod installed ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> serverState.sendMessage(new ServerboundHandshake(VeinMiner.PROTOCOL.getVersion()))); - HudLayerRegistrationCallback.EVENT.register(drawer -> { - drawer.attachLayerBefore(IdentifiedLayer.DEBUG, patternWheelRenderComponent); - drawer.attachLayerAfter(IdentifiedLayer.CROSSHAIR, new VeinMiningIconLayer(this)); - }); + HudElementRegistry.attachElementBefore(VanillaHudElements.DEBUG, PatternWheelHudElement.ID, patternWheelRenderComponent); + HudElementRegistry.attachElementAfter(VanillaHudElements.CROSSHAIR, VeinMiningIconHudElement.ID, new VeinMiningIconHudElement(this)); WorldRenderEvents.AFTER_TRANSLUCENT.register(wireframeShapeRenderer::render); } @@ -124,7 +122,7 @@ public BlockLookUpdateHandler getBlockLookUpdateHandler() { * @return the pattern wheel layer */ @NotNull - public PatternWheelLayer getPatternWheelLayer() { + public PatternWheelHudElement getPatternWheelLayer() { return patternWheelRenderComponent; } diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelLayer.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelHudElement.java similarity index 84% rename from veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelLayer.java rename to veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelHudElement.java index 73ba858..ce922e1 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelLayer.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/PatternWheelHudElement.java @@ -1,7 +1,5 @@ package wtf.choco.veinminer.client.render.layer; -import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -11,16 +9,17 @@ import net.minecraft.util.profiling.Profiler; import org.jetbrains.annotations.NotNull; +import org.joml.Matrix3x2fStack; import wtf.choco.veinminer.client.VeinMinerClient; import wtf.choco.veinminer.client.network.FabricServerState; /** - * A {@link VeinMinerIdentifiedLayer} for the pattern selection wheel in the top left. + * A {@link VeinMinerHudElement} for the pattern selection wheel in the top left. */ -public final class PatternWheelLayer extends VeinMinerIdentifiedLayer { +public final class PatternWheelHudElement extends VeinMinerHudElement { - private static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("veinminer_companion", "pattern_wheel"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("veinminer_companion", "pattern_wheel"); private static final int STAY_TICKS = 60; // 3 seconds private static final int FADE_TICKS = 4; // 0.2 seconds @@ -28,15 +27,10 @@ public final class PatternWheelLayer extends VeinMinerIdentifiedLayer { private int remainingTicks = 0; - public PatternWheelLayer(VeinMinerClient client) { + public PatternWheelHudElement(VeinMinerClient client) { super(client); } - @Override - public ResourceLocation id() { - return ID; - } - @Override public void render(@NotNull FabricServerState serverState, @NotNull GuiGraphics graphics, @NotNull DeltaTracker delta) { Profiler.get().push("veinminerPatternWheel"); @@ -62,15 +56,15 @@ else if (remainingTicks < FADE_TICKS) { // Fade out String after = serverState.getNextPattern().toString(); Minecraft minecraft = Minecraft.getInstance(); - PoseStack stack = graphics.pose(); - stack.pushPose(); - stack.scale(1.1F, 1.1F, 1.1F); + Matrix3x2fStack stack = graphics.pose(); + stack.pushMatrix(); + stack.scale(1.1F); graphics.drawString(minecraft.font, Component.literal(selected), 4, minecraft.font.lineHeight, colour); - stack.scale(0.6F, 0.6F, 0.6F); + stack.scale(0.6F); graphics.drawString(minecraft.font, Component.literal(before), 7, 4, colour); graphics.drawString(minecraft.font, Component.literal(after), 7, 5 + (minecraft.font.lineHeight * 3), colour); - stack.popPose(); + stack.popMatrix(); Profiler.get().pop(); } diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerIdentifiedLayer.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerHudElement.java similarity index 83% rename from veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerIdentifiedLayer.java rename to veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerHudElement.java index 5367837..1cb1fb0 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerIdentifiedLayer.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMinerHudElement.java @@ -1,6 +1,6 @@ package wtf.choco.veinminer.client.render.layer; -import net.fabricmc.fabric.api.client.rendering.v1.IdentifiedLayer; +import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElement; import net.minecraft.client.DeltaTracker; import net.minecraft.client.gui.GuiGraphics; @@ -9,11 +9,11 @@ import wtf.choco.veinminer.client.VeinMinerClient; import wtf.choco.veinminer.client.network.FabricServerState; -public abstract class VeinMinerIdentifiedLayer implements IdentifiedLayer { +public abstract class VeinMinerHudElement implements HudElement { private final VeinMinerClient client; - public VeinMinerIdentifiedLayer(VeinMinerClient client) { + public VeinMinerHudElement(VeinMinerClient client) { this.client = client; } diff --git a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconLayer.java b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconHudElement.java similarity index 67% rename from veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconLayer.java rename to veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconHudElement.java index 092a2b1..cf76f10 100644 --- a/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconLayer.java +++ b/veinminer-fabric/src/main/java/wtf/choco/veinminer/client/render/layer/VeinMiningIconHudElement.java @@ -5,7 +5,7 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.profiling.Profiler; @@ -15,22 +15,18 @@ import wtf.choco.veinminer.client.network.FabricServerState; /** - * A {@link VeinMinerIdentifiedLayer} for the vein mining icon at the user's crosshair. + * A {@link VeinMinerHudElement} for the vein mining icon at the user's crosshair. */ -public final class VeinMiningIconLayer extends VeinMinerIdentifiedLayer { +public final class VeinMiningIconHudElement extends VeinMinerHudElement { + + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("veinminer_companion", "vein_mining_icon"); - private static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("veinminer_companion", "vein_mining_icon"); private static final ResourceLocation VEINMINER_ICON_LOCATION = ResourceLocation.fromNamespaceAndPath("veinminer_companion", "textures/gui/veinminer_icon.png"); - public VeinMiningIconLayer(VeinMinerClient client) { + public VeinMiningIconHudElement(VeinMinerClient client) { super(client); } - @Override - public ResourceLocation id() { - return ID; - } - @Override public void render(@NotNull FabricServerState serverState, @NotNull GuiGraphics graphics, @NotNull DeltaTracker delta) { Profiler.get().push("veinMiningIcon"); @@ -38,7 +34,7 @@ public void render(@NotNull FabricServerState serverState, @NotNull GuiGraphics Window window = Minecraft.getInstance().getWindow(); int width = window.getGuiScaledWidth(), height = window.getGuiScaledHeight(); - graphics.blit(RenderType::guiTextured, VEINMINER_ICON_LOCATION, (width / 2) + 8, (height / 2) - 4, 0, 0, 8, 8, 8, 8); + graphics.blit(RenderPipelines.GUI_TEXTURED, VEINMINER_ICON_LOCATION, (width / 2) + 8, (height / 2) - 4, 0, 0, 8, 8, 8, 8); Profiler.get().pop(); } diff --git a/veinminer-fabric/src/main/resources/fabric.mod.json b/veinminer-fabric/src/main/resources/fabric.mod.json index 19a953d..0d49b49 100644 --- a/veinminer-fabric/src/main/resources/fabric.mod.json +++ b/veinminer-fabric/src/main/resources/fabric.mod.json @@ -27,8 +27,8 @@ }, "depends": { "fabricloader": ">=0.16.7", - "fabric": ">=0.121", - "minecraft": ">=1.21.5", + "fabric": ">=0.127", + "minecraft": ">=1.21.6", "java": ">=21" } }