diff --git a/build.gradle b/build.gradle index 80c3f8e..d075832 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false } architectury { minecraft = rootProject.minecraft_version @@ -39,6 +39,7 @@ allprojects { name "Modrinth" url "https://api.modrinth.com/maven" } + maven { url "https://maven.neoforged.net/releases/" } } tasks.withType(JavaCompile).configureEach { diff --git a/common/build.gradle b/common/build.gradle index 98afa75..42bc599 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -7,12 +7,12 @@ dependencies { mappings loom.officialMojangMappings() implementation "org.xerial:sqlite-jdbc:3.47.0.0" - modCompileOnly "maven.modrinth:voxelmap-updated:1.20.4-1.12.17" + // modCompileOnly "maven.modrinth:voxelmap-updated:1.20.4-1.12.17" } architectury { injectInjectables = false - common() + common(rootProject.enabled_platforms.split(",")) } processResources { 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 f12b332..fdb5c67 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 @@ -13,7 +13,7 @@ import gjum.minecraft.civ.snitchmod.common.model.SnitchFieldPreview; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.CoreShaders; import net.minecraft.network.chat.Component; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -52,7 +52,6 @@ public static void renderOverlays(Matrix4f matrixArg) { modelViewStack.pushMatrix(); modelViewStack.mul(matrixArg); modelViewStack.translate((float) -camPos.x, (float) -camPos.y, (float) -camPos.z); - RenderSystem.applyModelViewMatrix(); if (getMod().rangeOverlayVisible) { int fieldDist = 260; @@ -82,7 +81,6 @@ public static void renderOverlays(Matrix4f matrixArg) { RenderSystem.clearColor(1, 1, 1, 1); modelViewStack.popMatrix(); - RenderSystem.applyModelViewMatrix(); } private static void renderSnitchFieldPreview(SnitchFieldPreview preview) { @@ -119,7 +117,7 @@ private static void renderSnitch(Snitch snitch) { // inflate/deflate so the box face isn't obscured by adjacent blocks final boolean playerInRange = range.contains(mc.player.position()); AABB rangeBox = playerInRange ? range.inflate(-.01) : range.inflate(.01); - AABB outlineBox = playerInRange ? range.inflate(-.05) : range.inflate(.05); + AABB outlineBox = playerInRange ? range.inflate(-.01) : range.inflate(.01); if (playerInRange) { snitch.maybeRefreshed = true; } @@ -419,7 +417,7 @@ private static void renderBoxOutline(AABB box, Color color, float a, float lineW private static void renderFilledBox(AABB box, Color color, float a) { Tesselator tesselator = Tesselator.getInstance(); BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION_COLOR); - RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.setShader(CoreShaders.POSITION_COLOR); float r = color.r; float g = color.g; @@ -470,7 +468,7 @@ private static void renderBoxGuides(AABB box, Color color, float a, float lineWi Tesselator tesselator = Tesselator.getInstance(); BufferBuilder bufferBuilder = tesselator.begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION_COLOR); - RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.setShader(CoreShaders.POSITION_COLOR); GL11.glEnable(GL11.GL_LINE_SMOOTH); 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 65e904f..ede9c5b 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 @@ -1,8 +1,13 @@ package gjum.minecraft.civ.snitchmod.common; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.vertex.PoseStack; -import gjum.minecraft.civ.snitchmod.common.model.*; +import gjum.minecraft.civ.snitchmod.common.model.Direction; +import gjum.minecraft.civ.snitchmod.common.model.JalistEntry; +import gjum.minecraft.civ.snitchmod.common.model.Snitch; +import gjum.minecraft.civ.snitchmod.common.model.SnitchAlert; +import gjum.minecraft.civ.snitchmod.common.model.SnitchCreatedChatParser; +import gjum.minecraft.civ.snitchmod.common.model.SnitchFieldPreview; +import gjum.minecraft.civ.snitchmod.common.model.SnitchRename; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; @@ -13,7 +18,11 @@ import org.joml.Matrix4f; import org.lwjgl.glfw.GLFW; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; public abstract class SnitchMod { diff --git a/common/src/main/resources/mixin.snitchmod.json b/common/src/main/resources/mixin.snitchmod.json index 06fce3e..8d373ad 100644 --- a/common/src/main/resources/mixin.snitchmod.json +++ b/common/src/main/resources/mixin.snitchmod.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "gjum.minecraft.civ.snitchmod.common.mixins", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_21", "mixins": [], "client": [ "MixinClientPacketListener", diff --git a/fabric/build.gradle b/fabric/build.gradle index db5e401..8452462 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -28,15 +28,21 @@ dependencies { implementation "org.xerial:sqlite-jdbc:3.47.0.0" shadowCommon "org.xerial:sqlite-jdbc:3.47.0.0" - modCompileOnly "curse.maven:journeymap-32274:5457846" // version 1.18.2-5.8.4-fabric - modCompileOnly "maven.modrinth:voxelmap-updated:1.20.4-1.12.17" + // modCompileOnly "curse.maven:journeymap-32274:5457846" // version 1.18.2-5.8.4-fabric + // modCompileOnly "maven.modrinth:voxelmap-updated:1.20.4-1.12.17" } processResources { inputs.property "version", project.version filesMatching("fabric.mod.json") { - expand "version": project.version + expand ( + [ + "version": project.version, + "minecraft_version": project.minecraft_version, + "fabric_loader_version": project.fabric_loader_version + ] + ) } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f7b41e3..8b1eace 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,9 +20,9 @@ ] }, "depends": { - "fabricloader": ">=0.7.4", + "fabricloader": ">=${fabric_loader_version}", "fabric": "*", - "minecraft": "1.21.x" + "minecraft": "${minecraft_version}" }, "mixins": [ "mixin.snitchmod.json" diff --git a/forge/build.gradle b/forge/build.gradle index c0dffe9..0f90cbd 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -9,7 +9,7 @@ architectury { loom { forge { - mixinConfig "mixin.snitchmod.json" + mixinConfig "mixin.snitchmod.json", "mixin.snitchmod.forge.json" } } @@ -33,14 +33,20 @@ dependencies { implementation "org.xerial:sqlite-jdbc:3.47.0.0" shadowCommon "org.xerial:sqlite-jdbc:3.47.0.0" - modCompileOnly "curse.maven:journeymap-32274:5457832" // version 1.20.4-5.10.0-forge + //modCompileOnly "curse.maven:journeymap-32274:5457832" // version 1.20.4-5.10.0-forge } processResources { inputs.property "version", project.version filesMatching("META-INF/mods.toml") { - expand "version": project.version + expand ( + [ + "version": project.version, + "minecraft_version": project.minecraft_version, + "forge_version": project.forge_version + ] + ) } } 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 38d4e1b..fce8f73 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 @@ -2,7 +2,6 @@ import gjum.minecraft.civ.snitchmod.common.SnitchMod; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -11,8 +10,8 @@ @Mod("snitchmod") public class ForgeSnitchMod extends SnitchMod { - public ForgeSnitchMod() { - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerKeyMappings); + public ForgeSnitchMod(FMLJavaModLoadingContext fmlJavaModLoadingContext) { + fmlJavaModLoadingContext.getModEventBus().addListener(this::registerKeyMappings); MinecraftForge.EVENT_BUS.register(this); } @@ -24,17 +23,6 @@ public void registerKeyMappings(RegisterKeyMappingsEvent event) { event.register(toggleSnitchGoneStatusKey); } - @SubscribeEvent - public void onRenderLevelLast(RenderLevelStageEvent event) { - if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_PARTICLES) { // Forge broke the PoseStack in AFTER_TRANSLUCENT_BLOCKS (???) - try { - handleRenderBlockOverlay(event.getPoseStack()); // Ignore, if Forge removes this it can be replaced with a mixin probably - } catch (Exception e) { - e.printStackTrace(); - } - } - } - @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { if (event.phase == TickEvent.Phase.START) { 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 new file mode 100644 index 0000000..c22e53c --- /dev/null +++ b/forge/src/main/java/gjum/minecraft/civ/snitchmod/forge/mixins/LevelRenderMixin.java @@ -0,0 +1,21 @@ +package gjum.minecraft.civ.snitchmod.forge.mixins; + +import com.mojang.blaze3d.vertex.PoseStack; +import gjum.minecraft.civ.snitchmod.forge.ForgeSnitchMod; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderType; +import org.joml.Matrix4f; +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(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()); + } + } +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 7bb45e1..e8fc547 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[52,)" +loaderVersion = "[${forge_version},)" issueTrackerURL = "https://github.com/Gjum/snitchmod/issues" license = "GPL-3.0-only" @@ -11,18 +11,18 @@ authors = "Gjum" description = ''' Snitch Mod ''' -#logoFile = "" +logoFile = "assets/snitchmod/icon.png" [[dependencies.snitchmod]] modId = "forge" mandatory = true -versionRange = "[52,)" +versionRange = "[${forge_version},)" ordering = "NONE" side = "CLIENT" [[dependencies.snitchmod]] modId = "minecraft" mandatory = true -versionRange = "[1.21.1,)" +versionRange = "[${minecraft_version}]" ordering = "NONE" side = "CLIENT" diff --git a/forge/src/main/resources/mixin.snitchmod.forge.json b/forge/src/main/resources/mixin.snitchmod.forge.json new file mode 100644 index 0000000..0042c05 --- /dev/null +++ b/forge/src/main/resources/mixin.snitchmod.forge.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "gjum.minecraft.civ.snitchmod.forge.mixins", + "compatibilityLevel": "JAVA_21", + "mixins": [], + "client": [ + "LevelRenderMixin" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta index ca3e8ad..1b80856 100644 --- a/forge/src/main/resources/pack.mcmeta +++ b/forge/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Snitch Mod", - "pack_format": 34 + "pack_format": 42 } } diff --git a/gradle.properties b/gradle.properties index dec83b7..4a4091a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,10 +5,13 @@ archives_base_name=snitchmod mod_version=1.4.5-mc1.21.1 -minecraft_version=1.21.1 +minecraft_version=1.21.3 +enabled_platforms=fabric,forge,neoforge # https://fabricmc.net/versions.html -fabric_loader_version=0.16.2 -fabric_api_version=0.102.1+1.21.1 +fabric_loader_version=0.16.9 +fabric_api_version=0.112.1+1.21.3 -forge_version=52.0.4 +forge_version=53.0.25 + +neoforge_version=21.3.58 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 17655d0..0d18421 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle new file mode 100644 index 0000000..1262e59 --- /dev/null +++ b/neoforge/build.gradle @@ -0,0 +1,100 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.0.0" +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common +} + +dependencies { + neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + + common(project(path: ":common", configuration: "namedElements")) { 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" +} + +processResources { + inputs.property "version", project.version + + filesMatching("META-INF/neoforge.mods.toml") { + expand ( + [ + "version": project.version, + "minecraft_version": project.minecraft_version, + "neoforge_version": project.neoforge_version + ] + ) + } +} + +shadowJar { + exclude "fabric.mod.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + archiveClassifier = "neoforge" +} + +jar { + archiveClassifier = "dev" +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenForge(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} + +tasks.register('cleanJar', Delete) { + delete fileTree('../dist') { + include "*-neoforge.jar" + } +} + +tasks.register('copyJar', Copy) { + from remapJar + into '../dist' +} + +build.dependsOn copyJar +copyJar.dependsOn cleanJar diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..7da18ea --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge 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 new file mode 100644 index 0000000..459bf89 --- /dev/null +++ b/neoforge/src/main/java/gjum/minecraft/civ/snitchmod/neoforge/NeoForgeSnitchMod.java @@ -0,0 +1,38 @@ +package gjum.minecraft.civ.snitchmod.neoforge; + +import gjum.minecraft.civ.snitchmod.common.SnitchMod; +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.common.NeoForge; + +@Mod("snitchmod") +public class NeoForgeSnitchMod extends SnitchMod { + public NeoForgeSnitchMod(IEventBus bus) { + NeoForge.EVENT_BUS.register(this); + bus.addListener(this::registerKeyMappings); + } + + public void registerKeyMappings(RegisterKeyMappingsEvent event) { + event.register(openGuiKey); + event.register(toggleOverlayKey); + event.register(togglePlacementKey); + event.register(previewSnitchFieldKey); + event.register(toggleSnitchGoneStatusKey); + } + + @SubscribeEvent + public void onRenderLevelLast(RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { + handleRenderBlockOverlay(event.getPoseStack().last().pose()); + } + } + + @SubscribeEvent + public void onClientTick(ClientTickEvent.Pre event) { + handleTick(); + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..5dbdd05 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,31 @@ +modLoader = "javafml" +loaderVersion = "[1,)" +issueTrackerURL = "https://github.com/Gjum/snitchmod/issues" +license = "GPL-3.0-only" + +[[mixins]] +config="mixin.snitchmod.json" + +[[mods]] +modId = "snitchmod" +version = "${version}" +displayName = "Snitch Mod" +authors = "Gjum" +description = ''' +Snitch Mod +''' +logoFile = "assets/snitchmod/icon.png" + +[[dependencies.snitchmod]] +modId = "neoforge" +mandatory = true +versionRange = "[${neoforge_version},)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.snitchmod]] +modId = "minecraft" +mandatory = true +versionRange = "[${minecraft_version}]" +ordering = "NONE" +side = "CLIENT" diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..1b80856 --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Snitch Mod", + "pack_format": 42 + } +} diff --git a/settings.gradle b/settings.gradle index 2300da8..8436d99 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.architectury.dev/" } maven { url "https://maven.minecraftforge.net/" } + maven { url "https://maven.neoforged.net/releases/" } gradlePluginPortal() } } @@ -10,5 +11,6 @@ pluginManagement { include("common") include("fabric") include("forge") +include("neoforge") rootProject.name = "snitchmod"