diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dc38193..02f775b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,12 +6,12 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 21 - uses: actions/setup-java@v2 + - uses: actions/checkout@v4 + - name: Set up JDK 25 + uses: actions/setup-java@v4 with: - java-version: "21" - distribution: "adopt" + java-version: "25" + distribution: "corretto" - run: ./gradlew build - name: Upload Forge Build diff --git a/build.gradle b/build.gradle index c9c2fbb..0b40230 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false + id "architectury-plugin" version "3.5-SNAPSHOT" + id "dev.architectury.loom-no-remap" version "1.14-SNAPSHOT" apply false } architectury { minecraft = rootProject.minecraft_version } subprojects { - apply plugin: "dev.architectury.loom" + apply plugin: "dev.architectury.loom-no-remap" loom { silentMojangMappingsLicense() @@ -19,7 +19,7 @@ allprojects { apply plugin: "architectury-plugin" apply plugin: "maven-publish" - archivesBaseName = rootProject.archives_base_name + base.archivesName = rootProject.archives_base_name version = rootProject.mod_version group = rootProject.maven_group @@ -44,7 +44,7 @@ allprojects { tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" - options.release = 21 + options.release = 25 } java { diff --git a/common/build.gradle b/common/build.gradle index 42bc599..8f6ceeb 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,10 +1,9 @@ dependencies { // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies // Do NOT use other classes from fabric loader - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + implementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() implementation "org.xerial:sqlite-jdbc:3.47.0.0" // modCompileOnly "maven.modrinth:voxelmap-updated:1.20.4-1.12.17" diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/JalistAutoPaginator.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/JalistAutoPaginator.java index 1b1e175..9b453ed 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/JalistAutoPaginator.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/JalistAutoPaginator.java @@ -3,7 +3,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -159,11 +159,11 @@ private void clickNextPage(List stacks) { // Simulate a left click on the slot if (mc.gameMode != null) { - mc.gameMode.handleInventoryMouseClick( + mc.gameMode.handleContainerInput( container.containerId, NEXT_PAGE_SLOT, 0, - ClickType.PICKUP, + ContainerInput.PICKUP, mc.player ); } @@ -211,6 +211,6 @@ public static int getCurrentPage() { } private void logToChat(String message) { - mc.gui.getChat().addMessage(Component.literal("[JAList Auto] " + message)); + mc.gui.getChat().addClientSystemMessage(Component.literal("[JAList Auto] " + message)); } } \ No newline at end of file diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java index 24e1dc1..e598dee 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/Renderer.java @@ -7,21 +7,17 @@ import gjum.minecraft.civ.snitchmod.common.model.SnitchFieldPreview; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -//import net.minecraft.client.renderer.CoreShaders; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Lightmap; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; -import net.minecraft.client.renderer.ShapeRenderer; import net.minecraft.network.chat.Component; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.Shapes; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; import org.joml.Matrix4fStack; -import org.joml.Vector3f; import org.lwjgl.opengl.GL11; import java.util.ArrayList; @@ -661,30 +657,8 @@ private static void renderTextFacingCamera(Component text, Vec3 pos, float offse // Use immediate mode rendering with proper depth handling try (RenderBufferGuard guard = RenderBufferGuard.open(false, true, false)) { - mc.font.drawInBatch(text, x, y, colorAlphaHex, shadow, matrix, guard.bufferSource, Font.DisplayMode.SEE_THROUGH, bgColor, LightTexture.FULL_BRIGHT); + mc.font.drawInBatch(text, x, y, colorAlphaHex, shadow, matrix, guard.bufferSource, Font.DisplayMode.SEE_THROUGH, bgColor, LightCoordsUtil.FULL_BRIGHT); } - - /*var poseStack = new PoseStack(); - poseStack.translate(pos.x, pos.y, pos.z); - poseStack.mulPose(mc.gameRenderer.getMainCamera().rotation()); - scale *= 0.005f * (mc.player.position().distanceTo(pos) / 2.4); - scale = Math.clamp(scale, 0.015f, 0.15f); - poseStack.scale(scale, -scale, 1); // third component determines background distance - - float w = mc.font.width(text); - float x = -w / 2f; - float y = -(.5f - offset) * (mc.font.lineHeight + 2); // +2 for background padding, -1 for default line spacing - boolean shadow = false; - var matrix = poseStack.last().pose(); - var buffer = mc.renderBuffers().bufferSource(); - float bgOpacity = Minecraft.getInstance().options.getBackgroundOpacity(0.25f); - int bgColor = (int) (bgOpacity * 255.0f) << 24; - int flags = 0; - // XXX somehow, the letters farthest from the crosshair render behind the background - mc.font.drawInBatch(text, x, y, colorAlphaHex, shadow, matrix, buffer, Font.DisplayMode.SEE_THROUGH, bgColor, flags); - - poseStack.popPose(); - buffer.endBatch();*/ } private static @NotNull String timestampRelativeText(long ts) { diff --git a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java index a3366aa..9d19455 100644 --- a/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java +++ b/common/src/main/java/gjum/minecraft/civ/snitchmod/common/SnitchMod.java @@ -11,13 +11,13 @@ import gjum.minecraft.civ.snitchmod.common.model.SnitchRename; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -28,7 +28,7 @@ import java.util.stream.Stream; public abstract class SnitchMod { - private final static Minecraft mc = Minecraft.getInstance(); + protected static Minecraft mc = Minecraft.getInstance(); public static final KeyMapping.Category SNITCHMOD_CATEGORY = KeyMapping.Category.register(Identifier.fromNamespaceAndPath("snitchmod", "category")); @@ -243,6 +243,20 @@ public void handleTick() { logToChat(Component.literal("Showing a snitch field preview in the direction you're looking")); } // TODO if block pos changed -> if pos inside snitch range not in before -> send jainfo -> mark refreshed + // Check for J key press while in JAList GUI + var mc = Minecraft.getInstance(); + if (mc.screen instanceof AbstractContainerScreen containerScreen) { + String title = containerScreen.getTitle().getString(); + if ((title.toLowerCase().contains("snitches") || title.contains("JukeAlert")) + && GLFW.glfwGetKey(mc.getWindow().handle(), GLFW.GLFW_KEY_J) == GLFW.GLFW_PRESS) { + + // Prevent spam clicking by checking if auto-paginator is not already active + if (!JalistAutoPaginator.getInstance().isActive()) { + System.out.println("[SnitchMod] J key detected in JAList!"); + JalistAutoPaginator.getInstance().startAutoPagination(); + } + } + } } /** @@ -354,6 +368,6 @@ public Stream streamNearbySnitches(Vec3 playerPos, int distance) { } private void logToChat(Component msg) { - mc.gui.getChat().addMessage(Component.literal("[SnitchMod] ").append(msg)); + mc.gui.getChat().addClientSystemMessage(Component.literal("[SnitchMod] ").append(msg)); } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 8452462..1b412f6 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.0.0" + id "com.gradleup.shadow" version "9.3.0" } architectury { @@ -16,14 +16,13 @@ configurations { } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + implementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + api "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - common(project(path: ":common", configuration: "namedElements")) { transitive false } + common(project(path: ":common")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() implementation "org.xerial:sqlite-jdbc:3.47.0.0" shadowCommon "org.xerial:sqlite-jdbc:3.47.0.0" @@ -47,14 +46,15 @@ processResources { } shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} + exclude "architectury.common.json" -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar + dependsOn(jar) + mainSpec.sourcePaths.clear() // Remove default source set inclusion + from(zipTree(jar.archiveFile)) // Unpack jar output (preserves Loom modifications) + + configurations = [project.configurations.shadowCommon] archiveClassifier = "fabric" + from rootProject.file("LICENSE.txt") } jar { @@ -94,7 +94,7 @@ tasks.register('cleanJar', Delete) { } tasks.register('copyJar', Copy) { - from remapJar + from shadowJar into '../dist' } diff --git a/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java b/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java index 383d2da..5920d21 100644 --- a/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java +++ b/fabric/src/main/java/gjum/minecraft/civ/snitchmod/fabric/FabricSnitchMod.java @@ -1,54 +1,30 @@ package gjum.minecraft.civ.snitchmod.fabric; -import gjum.minecraft.civ.snitchmod.common.JalistAutoPaginator; import gjum.minecraft.civ.snitchmod.common.SnitchMod; import net.fabricmc.api.ClientModInitializer; 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.rendering.v1.world.WorldRenderEvents; -import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderContext; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import org.lwjgl.glfw.GLFW; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; public class FabricSnitchMod extends SnitchMod implements ClientModInitializer { @Override public void onInitializeClient() { - KeyBindingHelper.registerKeyBinding(openGuiKey); - KeyBindingHelper.registerKeyBinding(toggleOverlayKey); - KeyBindingHelper.registerKeyBinding(togglePlacementKey); - KeyBindingHelper.registerKeyBinding(previewSnitchFieldKey); - KeyBindingHelper.registerKeyBinding(toggleSnitchGoneStatusKey); - KeyBindingHelper.registerKeyBinding(jalistAutoKey); + KeyMappingHelper.registerKeyMapping(openGuiKey); + KeyMappingHelper.registerKeyMapping(toggleOverlayKey); + KeyMappingHelper.registerKeyMapping(togglePlacementKey); + KeyMappingHelper.registerKeyMapping(previewSnitchFieldKey); + KeyMappingHelper.registerKeyMapping(toggleSnitchGoneStatusKey); + KeyMappingHelper.registerKeyMapping(jalistAutoKey); - ClientTickEvents.START_CLIENT_TICK.register(client -> { - try { - handleTick(); - - // Check for J key press while in JAList GUI - var mc = Minecraft.getInstance(); - if (mc.screen instanceof AbstractContainerScreen containerScreen) { - String title = containerScreen.getTitle().getString(); - if ((title.toLowerCase().contains("snitches") || title.contains("JukeAlert")) - && GLFW.glfwGetKey(mc.getWindow().handle(), GLFW.GLFW_KEY_J) == GLFW.GLFW_PRESS) { - - // Prevent spam clicking by checking if auto-paginator is not already active - if (!JalistAutoPaginator.getInstance().isActive()) { - System.out.println("[FabricSnitchMod] J key detected in JAList!"); - JalistAutoPaginator.getInstance().startAutoPagination(); - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - }); - WorldRenderEvents.END_MAIN.register(((context) -> { - try { - handleRenderBlockOverlay(context.matrices()); - } catch (Exception e) { - e.printStackTrace(); - } - })); - } + ClientTickEvents.START_CLIENT_TICK.register(client -> { + handleTick(); + }); + LevelRenderEvents.END_MAIN.register(((context) -> { + try { + handleRenderBlockOverlay(context.poseStack()); + } catch (Exception e) { + e.printStackTrace(); + } + })); + } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 8b1eace..29365de 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -21,7 +21,7 @@ }, "depends": { "fabricloader": ">=${fabric_loader_version}", - "fabric": "*", + "fabric-api": "*", "minecraft": "${minecraft_version}" }, "mixins": [ diff --git a/forge/build.gradle b/forge/build.gradle index 0f90cbd..d5c194c 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.0.0" + id "com.gradleup.shadow" version "9.3.0" } architectury { diff --git a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java index 950d929..53b7f45 100644 --- a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java +++ b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/ForgeSnitchMod.java @@ -1,11 +1,13 @@ package gjum.minecraft.civ.snitchmod.forge; import gjum.minecraft.civ.snitchmod.common.SnitchMod; +import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod("snitchmod") @@ -21,10 +23,16 @@ public static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) { event.register(togglePlacementKey); event.register(previewSnitchFieldKey); event.register(toggleSnitchGoneStatusKey); + event.register(jalistAutoKey); } @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent.Pre event) { handleTick(); } + + @SubscribeEvent + public void onClientLoaded(FMLClientSetupEvent event) { + mc = Minecraft.getInstance(); + } } diff --git a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java index 3d5e59f..f00d65e 100644 --- a/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java +++ b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java @@ -1,9 +1,15 @@ package gjum.minecraft.civ.snitchmod.forge.mixins; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.vertex.PoseStack; import gjum.minecraft.civ.snitchmod.forge.ForgeSnitchMod; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.rendertype.RenderType; import org.joml.Matrix4f; +import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,10 +17,9 @@ @Mixin(LevelRenderer.class) public abstract class LevelRenderMixin { // REMINDER: Forge sucks - /*@Inject(method = "renderSectionLayer", at = @At("RETURN")) - private void onRenderLevelLast(RenderType arg, double d, double e, double f, Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) { - if (arg == RenderType.translucent()) { - ForgeSnitchMod.getMod().handleRenderBlockOverlay(new PoseStack().last().pose()); - } - }*/ + + @Inject(method = "method_62214", at = @At(value = "INVOKE:LAST", target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V")) + private void onRenderLevelLast(CallbackInfo ci) { + ForgeSnitchMod.getMod().handleRenderBlockOverlay(new PoseStack()); + } } diff --git a/gradle.properties b/gradle.properties index 0a5e86b..607bf9f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,15 @@ org.gradle.jvmargs=-Xmx2048M maven_group=gjum.minecraft.snitchmod archives_base_name=snitchmod -mod_version=1.5.0-mc1.21.11 +mod_version=1.5.0-mc26.1.2 -minecraft_version=1.21.11 -enabled_platforms=fabric,forge,neoforge +minecraft_version=26.1.2 +enabled_platforms=fabric,neoforge # https://fabricmc.net/versions.html -fabric_loader_version=0.18.4 -fabric_api_version=0.141.3+1.21.11 +fabric_loader_version=0.19.3 +fabric_api_version=0.153.0+26.1.2 -forge_version=61.1.4 +forge_version=64.0.10 -neoforge_version=21.11.38-beta +neoforge_version=26.1.2.76 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d6e308a..4457edd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sun Jun 28 14:47:31 EDT 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 1262e59..92f5c8d 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.0.0" + id "com.gradleup.shadow" version "9.3.0" } architectury { @@ -18,11 +18,10 @@ configurations { dependencies { neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" - common(project(path: ":common", configuration: "namedElements")) { transitive false } + common(project(path: ":common")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() implementation "org.xerial:sqlite-jdbc:3.47.0.0" shadowCommon "org.xerial:sqlite-jdbc:3.47.0.0" @@ -44,15 +43,15 @@ processResources { shadowJar { exclude "fabric.mod.json" + exclude "architectury.common.json" - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} + dependsOn(jar) + mainSpec.sourcePaths.clear() // Remove default source set inclusion + from(zipTree(jar.archiveFile)) // Unpack jar output (preserves Loom modifications) -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar + configurations = [project.configurations.shadowCommon] archiveClassifier = "neoforge" + from rootProject.file("LICENSE.txt") } jar { @@ -92,7 +91,7 @@ tasks.register('cleanJar', Delete) { } tasks.register('copyJar', Copy) { - from remapJar + from shadowJar into '../dist' } diff --git a/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java b/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java index 0be57fc..f629ca8 100644 --- a/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java +++ b/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java @@ -1,13 +1,18 @@ package gjum.minecraft.civ.snitchmod.neoforge; +import gjum.minecraft.civ.snitchmod.common.JalistAutoPaginator; import gjum.minecraft.civ.snitchmod.common.SnitchMod; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.event.lifecycle.ClientStartedEvent; import net.neoforged.neoforge.common.NeoForge; +import org.lwjgl.glfw.GLFW; @Mod("snitchmod") public class NeoForgeSnitchMod extends SnitchMod { @@ -22,15 +27,35 @@ public void registerKeyMappings(RegisterKeyMappingsEvent event) { event.register(togglePlacementKey); event.register(previewSnitchFieldKey); event.register(toggleSnitchGoneStatusKey); + event.register(jalistAutoKey); } @SubscribeEvent - public void onAfterTripwire(RenderLevelStageEvent.AfterTripwireBlocks event) { + public void onAfterTripwire(RenderLevelStageEvent.AfterTranslucentParticles event) { handleRenderBlockOverlay(event.getPoseStack()); } @SubscribeEvent public void onClientTick(ClientTickEvent.Pre event) { handleTick(); + + var mc = Minecraft.getInstance(); + if (mc.screen instanceof AbstractContainerScreen containerScreen) { + String title = containerScreen.getTitle().getString(); + if ((title.toLowerCase().contains("snitches") || title.contains("JukeAlert")) + && GLFW.glfwGetKey(mc.getWindow().handle(), GLFW.GLFW_KEY_J) == GLFW.GLFW_PRESS) { + + // Prevent spam clicking by checking if auto-paginator is not already active + if (!JalistAutoPaginator.getInstance().isActive()) { + System.out.println("[FabricSnitchMod] J key detected in JAList!"); + JalistAutoPaginator.getInstance().startAutoPagination(); + } + } + } + } + + @SubscribeEvent + public void onClientLoaded(ClientStartedEvent event) { + mc = Minecraft.getInstance(); } } diff --git a/settings.gradle b/settings.gradle index 8436d99..67eb405 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,7 +10,7 @@ pluginManagement { include("common") include("fabric") -include("forge") +//include("forge") include("neoforge") rootProject.name = "snitchmod"