diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 74d4d4953..58ac62cbf 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -61,7 +61,7 @@ body: id: loaderversion attributes: label: Platform / Loader Version - description: Exact server or loader build (see console). For example "Paper 26.3-133", "Fabric Loader 0.19.5", "NeoForge 26.3.0.33-beta". + description: Exact server or loader build (see console). For example "Paper 26.3-133", "Fabric Loader 0.19.5", "NeoForge 26.3.0.83". placeholder: DO NOT SAY "LATEST" validations: required: true diff --git a/README.md b/README.md index d0f4e8ab7..a40d182df 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Canonical English is defined in the typed Java catalogs under `core/src/main/jav | Spigot / CraftBukkit | plugin jar | 26.1.2 - 26.3 | Managed `iris:*` creation and generation; exact vanilla-slot `/iris replace` is unavailable | | Fabric | mod jar | 26.3 | Server worldgen + client HUD; requires Fabric Loader 0.19.5+ | | Forge | mod jar | 26.3 | Server worldgen + client HUD; current target is Forge 26.3-66.0.8 | -| NeoForge | mod jar | 26.3 | Server worldgen + client HUD; current target is NeoForge 26.3.0.33-beta | +| NeoForge | mod jar | 26.3 | Server worldgen + client HUD; requires NeoForge 26.3.0.65-beta+; current target is NeoForge 26.3.0.83 | Java 25 is required on every platform. diff --git a/adapters/neoforge/build.gradle b/adapters/neoforge/build.gradle index 670b54d5d..9cae8f598 100644 --- a/adapters/neoforge/build.gradle +++ b/adapters/neoforge/build.gradle @@ -58,7 +58,7 @@ Properties rootProperties = new Properties() file('../../gradle.properties').withInputStream { InputStream stream -> rootProperties.load(stream) } String irisVersion = providers.gradleProperty('irisVersion').getOrElse(rootProperties.getProperty('irisVersion', '4.3.3')) String minecraftVersion = providers.gradleProperty('minecraftVersion').getOrElse(rootProperties.getProperty('minecraftVersion', '26.3')) -String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse(rootProperties.getProperty('neoForgeVersion', '26.3.0.33-beta')) +String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse(rootProperties.getProperty('neoForgeVersion', '26.3.0.83')) Closure irisArtifactName = { String platform, String targetVersion -> return "Iris v${project.version} [${platform}] ${targetVersion}.jar" } diff --git a/adapters/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/adapters/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 3d7ea0fb6..a65393071 100644 --- a/adapters/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/adapters/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -25,7 +25,7 @@ logoFile = "assets/irisworldgen/icon.png" [[dependencies.irisworldgen]] modId = "neoforge" type = "required" -versionRange = "[26.3,26.4)" +versionRange = "[26.3.0.65-beta,26.4)" ordering = "NONE" side = "BOTH" diff --git a/adapters/neoforge/src/test/java/art/arcane/volmlib/nativelib/minecraft26_2/neoforge/NativeNeoForgeServerAccessTest.java b/adapters/neoforge/src/test/java/art/arcane/volmlib/nativelib/minecraft26_2/neoforge/NativeNeoForgeServerAccessTest.java new file mode 100644 index 000000000..3d5ff0adf --- /dev/null +++ b/adapters/neoforge/src/test/java/art/arcane/volmlib/nativelib/minecraft26_2/neoforge/NativeNeoForgeServerAccessTest.java @@ -0,0 +1,85 @@ +package art.arcane.volmlib.nativelib.minecraft26_2.neoforge; + +import art.arcane.volmlib.nativelib.minecraft26_2.modded.ModdedServerAccess; +import art.arcane.volmlib.nativelib.minecraft26_2.modded.ModdedServerLevels; +import art.arcane.volmlib.nativelib.modded.NativeLoaderOptions; +import net.minecraft.SharedConstants; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.Bootstrap; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.lang.reflect.Field; +import java.util.LinkedHashMap; +import java.util.function.BooleanSupplier; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doCallRealMethod; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class NativeNeoForgeServerAccessTest { + private static final ResourceKey RUNTIME_DIMENSION = + ResourceKey.create(Registries.DIMENSION, Identifier.fromNamespaceAndPath("irisworldgen", "runtime")); + + @BeforeClass + public static void bootstrap() { + SharedConstants.tryDetectVersion(); + Bootstrap.bootStrap(); + } + + @After + public void forgetLevelSnapshot() { + ModdedServerLevels.forget(); + } + + @Test + public void runtimeLevelsJoinAndLeaveTheServerTickView() throws ReflectiveOperationException { + ModdedServerAccess access = new NativeNeoForgeLoader( + new NativeLoaderOptions("irisworldgen", "treefeller", BooleanSupplier::getAsBoolean)).serverAccess(); + MinecraftServer server = serverWithLiveLevelMap(); + ServerLevel level = mock(ServerLevel.class); + when(level.dimension()).thenReturn(RUNTIME_DIMENSION); + + assertNull(access.putLevelIfAbsent(server, RUNTIME_DIMENSION, level)); + assertTrue(access.hasLevel(server, RUNTIME_DIMENSION)); + assertTrue(ticks(server, level)); + assertSame(level, ModdedServerLevels.level(server, RUNTIME_DIMENSION)); + + assertSame(level, access.removeLevel(server, RUNTIME_DIMENSION)); + assertFalse(access.hasLevel(server, RUNTIME_DIMENSION)); + assertFalse(ticks(server, level)); + assertNull(ModdedServerLevels.level(server, RUNTIME_DIMENSION)); + + assertNull(access.putLevel(server, RUNTIME_DIMENSION, level)); + assertTrue(ticks(server, level)); + assertSame(level, ModdedServerLevels.level(server, RUNTIME_DIMENSION)); + } + + private static MinecraftServer serverWithLiveLevelMap() throws ReflectiveOperationException { + MinecraftServer server = mock(MinecraftServer.class); + Field levels = MinecraftServer.class.getDeclaredField("levels"); + levels.setAccessible(true); + levels.set(server, new LinkedHashMap, ServerLevel>()); + doCallRealMethod().when(server).getAllLevels(); + return server; + } + + private static boolean ticks(MinecraftServer server, ServerLevel expected) { + for (ServerLevel level : server.getAllLevels()) { + if (level == expected) { + return true; + } + } + return false; + } +} diff --git a/build.gradle b/build.gradle index 955735cff..8745302c7 100644 --- a/build.gradle +++ b/build.gradle @@ -76,7 +76,7 @@ String minecraftVersion = providers.gradleProperty('minecraftVersion').getOrElse String bukkitMinecraftRange = providers.gradleProperty('bukkitMinecraftRange').getOrElse('26.1.2-26.3') String fabricLoaderVersion = providers.gradleProperty('fabricLoaderVersion').getOrElse('0.19.5') String forgeVersion = providers.gradleProperty('forgeVersion').getOrElse('26.3-66.0.8') -String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse('26.3.0.33-beta') +String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse('26.3.0.83') String volmLibShared = 'com.github.VolmitSoftware.VolmLib:volmlib-shared:master-SNAPSHOT' File localVolmLibCheckout = (File) gradle.extensions.extraProperties.get('volmLibDirectory') IncludedBuild localVolmLibBuild = localVolmLibCheckout == null ? null : gradle.includedBuilds.find { IncludedBuild includedBuild -> diff --git a/gradle.properties b/gradle.properties index 410ef6606..27614eb2e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,4 +27,4 @@ minecraftVersion=26.3 apiVersion=26.1 fabricLoaderVersion=0.19.5 forgeVersion=26.3-66.0.8 -neoForgeVersion=26.3.0.33-beta +neoForgeVersion=26.3.0.83