From b2d3495031da90a8b1313f1aed2e150e1edbf02c Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Tue, 3 Mar 2026 21:27:35 +1000 Subject: [PATCH 1/9] Current Fabric attempt --- .github/workflows/gradle.yml | 2 +- .../kotlin/buildlogic.common-java.gradle.kts | 2 +- gradle/gradle-daemon-jvm.properties | 2 +- gradle/libs.versions.toml | 2 +- settings.gradle.kts | 1 - worldedit-fabric/build.gradle.kts | 29 +++++-------------- worldedit-mod/build.gradle.kts | 8 ++--- 7 files changed, 16 insertions(+), 30 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 6bd9bcf779..33364751f3 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -16,7 +16,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: 21 + java-version: 25 distribution: 'temurin' - name: Setup Gradle diff --git a/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts index 96479e4d49..aff4db0fc2 100644 --- a/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts +++ b/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts @@ -18,7 +18,7 @@ tasks val disabledLint = listOf( "processing", "path", "fallthrough", "serial", "overloads", "this-escape", ) - options.release.set(21) + options.release.set(25) options.compilerArgs.addAll(listOf("-Xlint:all") + disabledLint.map { "-Xlint:-$it" }) options.isDeprecation = true options.encoding = "UTF-8" diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties index 63e5bbdf48..5a334ba9a3 100644 --- a/gradle/gradle-daemon-jvm.properties +++ b/gradle/gradle-daemon-jvm.properties @@ -1,2 +1,2 @@ #This file is generated by updateDaemonJvm -toolchainVersion=21 +toolchainVersion=25 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0bc10f7e2b..0a3e603e1b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -93,7 +93,7 @@ rhino = "org.mozilla:rhino-runtime:1.7.13" jchronic = "com.sk89q:jchronic:0.2.4a" jlibnoise = "com.sk89q.lib:jlibnoise:1.0.0" -fabric-minecraft = "com.mojang:minecraft:1.21.11" +fabric-minecraft = "com.mojang:minecraft:26.1-snapshot-10" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index 7197204671..a3bafb178d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -25,7 +25,6 @@ pluginManagement { } plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" - id("fabric-loom") version "1.15.4" } dependencyResolutionManagement { repositories { diff --git a/worldedit-fabric/build.gradle.kts b/worldedit-fabric/build.gradle.kts index 0985e27d73..8d63ba936b 100644 --- a/worldedit-fabric/build.gradle.kts +++ b/worldedit-fabric/build.gradle.kts @@ -1,10 +1,9 @@ import buildlogic.internalVersion import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import net.fabricmc.loom.task.RemapJarTask import net.fabricmc.loom.task.RunGameTask plugins { - id("fabric-loom") + id("net.fabricmc.fabric-loom") version "1.15.4" `java-library` id("buildlogic.platform") } @@ -28,13 +27,9 @@ dependencies { "api"(project(":worldedit-core")) "minecraft"(libs.fabric.minecraft) - "mappings"(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${libs.versions.parchment.minecraft.get()}:${libs.versions.parchment.mappings.get()}@zip") - }) - "modImplementation"(libs.fabric.loader) - "include"(libs.cuiProtocol.fabric) - "modImplementation"(libs.cuiProtocol.fabric) + "implementation"(libs.fabric.loader) + //"include"(libs.cuiProtocol.fabric) + //"implementation"(libs.cuiProtocol.fabric) // [1] Load the API dependencies from the fabric mod json... @Suppress("UNCHECKED_CAST") @@ -48,11 +43,11 @@ dependencies { for (wantedDependency in wantedDependencies) { val dep = fabricApi.module(wantedDependency, libs.versions.fabric.api.get()) "include"(dep) - "modImplementation"(dep) + "implementation"(dep) } // No need for this at runtime - "modCompileOnly"(libs.fabric.permissions.api) + //"compileOnly"(libs.fabric.permissions.api) // Silence some warnings, since apparently this isn't on the compile classpath like it should be. "compileOnly"(libs.errorprone.annotations) @@ -80,7 +75,7 @@ tasks.named("processResources") { } tasks.named("shadowJar") { - archiveClassifier.set("dist-dev") + archiveClassifier.set("dist") dependencies { relocate("org.antlr.v4", "com.sk89q.worldedit.antlr4") relocate("net.royawesome.jlibnoise", "com.sk89q.worldedit.jlibnoise") @@ -90,14 +85,6 @@ tasks.named("shadowJar") { } } -tasks.register("remapShadowJar") { - val shadowJar = tasks.getByName("shadowJar") - dependsOn(shadowJar) - inputFile.set(shadowJar.archiveFile) - archiveFileName.set(shadowJar.archiveFileName.get().replace(Regex("-dev\\.jar$"), ".jar")) - addNestedDependencies.set(true) -} - tasks.named("assemble").configure { - dependsOn("remapShadowJar") + dependsOn("shadowJar") } diff --git a/worldedit-mod/build.gradle.kts b/worldedit-mod/build.gradle.kts index e9d64c7453..d381755974 100644 --- a/worldedit-mod/build.gradle.kts +++ b/worldedit-mod/build.gradle.kts @@ -1,4 +1,4 @@ -import net.fabricmc.loom.task.RemapJarTask +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import java.util.jar.Attributes import java.util.jar.Manifest @@ -60,7 +60,7 @@ open class MergeManifests : DefaultTask() { } val fabricZipTree = zipTree( - project(":worldedit-fabric").tasks.named("remapShadowJar").flatMap { it.archiveFile } + project(":worldedit-fabric").tasks.named("shadowJar").flatMap { it.archiveFile } ) val mergeManifests = tasks.register("mergeManifests") { @@ -70,7 +70,7 @@ val mergeManifests = tasks.register("mergeManifests") { ) dependsOn( - project(":worldedit-fabric").tasks.named("remapShadowJar"), + project(":worldedit-fabric").tasks.named("shadowJar"), project(":worldedit-neoforge").tasks.named("jarJar") ) inputManifests.from( @@ -86,7 +86,7 @@ tasks.register("jar") { ) dependsOn( - project(":worldedit-fabric").tasks.named("remapShadowJar"), + project(":worldedit-fabric").tasks.named("shadowJar"), project(":worldedit-neoforge").tasks.named("jarJar"), mergeManifests ) From c137d7f647fa70b6f4e37c49f42df0db59165624 Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 8 Mar 2026 17:40:13 -0700 Subject: [PATCH 2/9] Fix issues with getting pre-26.1 code building --- .../main/kotlin/buildlogic.adapter.gradle.kts | 13 ++++++++++ .../main/kotlin/buildlogic.common.gradle.kts | 2 +- gradle/libs.versions.toml | 7 ++--- settings.gradle.kts | 6 +++++ .../bukkit/BukkitBlockCommandSender.java | 5 ++-- .../sk89q/worldedit/bukkit/BukkitEntity.java | 2 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 4 +-- worldedit-core/doctools/build.gradle.kts | 2 +- .../command/util/AsyncCommandBuilder.java | 9 ++++--- .../scripting/RhinoContextFactory.java | 3 +-- .../util/logging/DynamicStreamHandler.java | 6 ++--- .../worldedit/util/logging/LogFormat.java | 2 +- worldedit-fabric/build.gradle.kts | 15 ++++++++++- .../fabric/FabricPermissionsProvider.java | 7 ++--- .../sk89q/worldedit/fabric/FabricWorld.java | 2 +- .../worldedit/fabric/FabricWorldEdit.java | 26 +++++++++---------- .../main/resources/worldedit.accesswidener | 6 ++--- 17 files changed, 76 insertions(+), 41 deletions(-) diff --git a/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts b/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts index e04931c417..17d0028898 100644 --- a/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts +++ b/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts @@ -9,6 +9,19 @@ plugins { id("io.papermc.paperweight.userdev") } +java { + // Required when we de-sync release option and declared Java versions. + disableAutoTargetJvm() +} + +tasks + .withType() + .matching { it.name == "compileJava" || it.name == "compileTestJava" } + .configureEach { + // We use Java 21 for most of the pre-existing adapters. + options.release.set(21) + } + repositories { maven { name = "Minecraft Libraries" diff --git a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts index 4a2b455ea0..1af6cf684f 100644 --- a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts +++ b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts @@ -17,7 +17,7 @@ configurations.all { plugins.withId("java") { the().toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) + languageVersion.set(JavaLanguageVersion.of(25)) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a3e603e1b..df904ec983 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ neogradle-userdev = { id = "net.neoforged.gradle.userdev", version.ref = "neogradle" } sponge-spongegradle = "org.spongepowered.gradle.plugin:2.3.0" sponge-vanillagradle = { id = "org.spongepowered.gradle.vanilla", version.ref = "sponge-vanillagradle" } +fabric-loom = "net.fabricmc.fabric-loom:1.15.4" [versions] kyoriText = "3.0.4" @@ -12,7 +13,7 @@ cuiProtocol = "4.0.2" errorprone = "2.48.0" -fabric-api = "0.141.3+1.21.11" +fabric-api = "0.143.11+26.1" neogradle = "7.1.20" neoforge-minecraft = "1.21.11" @@ -93,7 +94,7 @@ rhino = "org.mozilla:rhino-runtime:1.7.13" jchronic = "com.sk89q:jchronic:0.2.4a" jlibnoise = "com.sk89q.lib:jlibnoise:1.0.0" -fabric-minecraft = "com.mojang:minecraft:26.1-snapshot-10" +fabric-minecraft = "com.mojang:minecraft:26.1-snapshot-11" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1" @@ -101,7 +102,7 @@ neoforge = "net.neoforged:neoforge:21.11.38-beta" # Mojang-provided libraries, CHECK AGAINST MINECRAFT for versions guava = "com.google.guava:guava:33.5.0-jre!!" -log4j-bom = "org.apache.logging.log4j:log4j-bom:2.24.1!!" +log4j-bom = "org.apache.logging.log4j:log4j-bom:2.25.2!!" log4j-api.module = "org.apache.logging.log4j:log4j-api" log4j-core.module = "org.apache.logging.log4j:log4j-core" gson = "com.google.code.gson:gson:2.13.2!!" diff --git a/settings.gradle.kts b/settings.gradle.kts index a3bafb178d..757b972283 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -40,6 +40,7 @@ dependencyResolutionManagement { name = "EngineHub (Non-Mirrored)" url = URI.create("https://repo.enginehub.org/libs-release/") metadataSources { + gradleMetadata() mavenPom() artifact() } @@ -58,6 +59,11 @@ dependencyResolutionManagement { includeModuleByRegex(".*", "worldedit-lang") } } + mavenCentral() + maven { + name = "Minecraft Libraries" + url = uri("https://libraries.minecraft.net/") + } } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java index b11640de54..e383123aee 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java @@ -173,9 +173,8 @@ public boolean isActive() { updateActive(); } else { // we should update it eventually - // Suppress FutureReturnValueIgnored: We handle it in the block. - @SuppressWarnings({"FutureReturnValueIgnored", "unused"}) - var unused = Bukkit.getScheduler().callSyncMethod(plugin, () -> { + // We don't need the future as we handle exceptions in `updateActive` + var _ = Bukkit.getScheduler().callSyncMethod(plugin, () -> { updateActive(); return null; }); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntity.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntity.java index cee6a9029c..a4968810ff 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntity.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntity.java @@ -78,7 +78,7 @@ public boolean setLocation(Location location) { org.bukkit.entity.Entity entity = entityRef.get(); if (entity != null) { if (WorldEditPlugin.getInstance().isFolia()) { - var unused = PaperLib.teleportAsync(entity, BukkitAdapter.adapt(location)); + var _ = PaperLib.teleportAsync(entity, BukkitAdapter.adapt(location)); return true; } else { return entity.teleport(BukkitAdapter.adapt(location)); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 8a003b61e9..bc366ebd4e 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -150,7 +150,7 @@ public boolean trySetPosition(Vector3 pos, float pitch, float yaw) { Location location = new Location(player.getWorld(), pos.x(), pos.y(), pos.z(), yaw, pitch); if (WorldEditPlugin.getInstance().isFolia()) { - var unused = PaperLib.teleportAsync(player, location); + var _ = PaperLib.teleportAsync(player, location); return true; } else { return player.teleport(location); @@ -232,7 +232,7 @@ public com.sk89q.worldedit.util.Location getLocation() { @Override public boolean setLocation(com.sk89q.worldedit.util.Location location) { if (WorldEditPlugin.getInstance().isFolia()) { - var unused = PaperLib.teleportAsync(player, BukkitAdapter.adapt(location)); + var _ = PaperLib.teleportAsync(player, BukkitAdapter.adapt(location)); return true; } else { return player.teleport(BukkitAdapter.adapt(location)); diff --git a/worldedit-core/doctools/build.gradle.kts b/worldedit-core/doctools/build.gradle.kts index 23a43b5c80..0a074c3474 100644 --- a/worldedit-core/doctools/build.gradle.kts +++ b/worldedit-core/doctools/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - kotlin("jvm") version "2.2.21" + kotlin("jvm") version "2.3.10" application id("buildlogic.common") } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java index a757eaa0fd..b916c44d7c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java @@ -158,10 +158,13 @@ public ListenableFuture buildAndExec(ListeningExecutorService executor) { return future; } - // Suppress FutureReturnValueIgnored: We handle the future internally - @SuppressWarnings("FutureReturnValueIgnored") + /** + * Like {@link #buildAndExec(ListeningExecutorService)}, but ignores the return value of the task. + * + * @param executor the executor to run the task on + */ public void buildAndExecNoReturnValue(ListeningExecutorService executor) { - buildAndExec(executor); + var _ = buildAndExec(executor); } @SuppressWarnings("deprecation") diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/RhinoContextFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/RhinoContextFactory.java index 32feb6781b..0b1a7187ae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/RhinoContextFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/RhinoContextFactory.java @@ -37,8 +37,7 @@ protected Context makeContext() { RhinoContext cx = new RhinoContext(this); try { // Try to set ES6 compat flag (since 1.7.7) - @SuppressWarnings("unused") - var unused = Context.class.getDeclaredField("VERSION_ES6"); + var _ = Context.class.getDeclaredField("VERSION_ES6"); cx.setLanguageVersion(RhinoContext.VERSION_ES6); } catch (NoSuchFieldException e) { // best we can do, compatible with 1.7R2 that many people probably use diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/DynamicStreamHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/DynamicStreamHandler.java index c2bc87bdda..22a501ee0f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/DynamicStreamHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/DynamicStreamHandler.java @@ -94,7 +94,7 @@ public synchronized void close() throws SecurityException { } @Override - public void setEncoding(@Nullable String encoding) throws SecurityException, UnsupportedEncodingException { + public synchronized void setEncoding(@Nullable String encoding) throws SecurityException, UnsupportedEncodingException { StreamHandler handler = this.handler; this.encoding = encoding; if (handler != null) { @@ -117,7 +117,7 @@ public synchronized void flush() { } @Override - public void setFormatter(@Nullable Formatter newFormatter) throws SecurityException { + public synchronized void setFormatter(@Nullable Formatter newFormatter) throws SecurityException { StreamHandler handler = this.handler; this.formatter = newFormatter; if (handler != null) { @@ -150,7 +150,7 @@ public String getEncoding() { } @Override - public void setFilter(@Nullable Filter newFilter) throws SecurityException { + public synchronized void setFilter(@Nullable Filter newFilter) throws SecurityException { StreamHandler handler = this.handler; this.filter = newFilter; if (handler != null) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/LogFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/LogFormat.java index f757c05350..53dcee4a87 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/LogFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/logging/LogFormat.java @@ -45,7 +45,7 @@ public LogFormat(String format) { try { // Validate format: @SuppressWarnings("unused") - var unused = String.format(format, currentDateTime, "", "", "", "", ""); + var _ = String.format(format, currentDateTime, "", "", "", "", ""); } catch (IllegalArgumentException var3) { format = DEFAULT_FORMAT; } diff --git a/worldedit-fabric/build.gradle.kts b/worldedit-fabric/build.gradle.kts index 8d63ba936b..93b8d6a8a0 100644 --- a/worldedit-fabric/build.gradle.kts +++ b/worldedit-fabric/build.gradle.kts @@ -1,9 +1,10 @@ import buildlogic.internalVersion import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import net.fabricmc.loom.task.RunGameTask +import java.net.URI plugins { - id("net.fabricmc.fabric-loom") version "1.15.4" + alias(libs.plugins.fabric.loom) `java-library` id("buildlogic.platform") } @@ -23,6 +24,18 @@ tasks.withType().configureEach { javaLauncher.set(javaToolchains.launcherFor(java.toolchain)) } +repositories { + maven { + name = "EngineHub (Non-Mirrored)" + url = URI.create("https://repo.enginehub.org/libs-release/") + metadataSources { + gradleMetadata() + mavenPom() + artifact() + } + } +} + dependencies { "api"(project(":worldedit-core")) diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java index 2e0df21f4f..2e536d3aaf 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.fabric; -import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.GameType; @@ -58,8 +57,10 @@ public LuckoFabricPermissionsProvider(FabricPlatform platform) { @Override public boolean hasPermission(ServerPlayer player, String permission) { - return Permissions.getPermissionValue(player, permission) - .orElseGet(() -> super.hasPermission(player, permission)); + return false; + // TODO Perms API + // return Permissions.getPermissionValue(player, permission) + // .orElseGet(() -> super.hasPermission(player, permission)); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index c4d3c51173..7e2e0e847c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -341,7 +341,7 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("WorldEditTempGen")) { ServerLevel originalWorld = (ServerLevel) getWorld(); PrimaryLevelData levelProperties = getPrimaryLevelData(originalWorld.getLevelData()); - WorldOptions originalOpts = levelProperties.worldGenOptions(); + WorldOptions originalOpts = levelProperties.worldGenSettingsLifecycle(); long seed = options.getSeed().orElse(originalWorld.getSeed()); levelProperties.worldOptions = options.getSeed().isPresent() diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java index ab19e315de..c2d0841892 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java @@ -89,8 +89,6 @@ import net.minecraft.world.phys.BlockHitResult; import org.apache.logging.log4j.Logger; import org.enginehub.piston.Command; -import org.enginehub.worldeditcui.protocol.CUIPacket; -import org.enginehub.worldeditcui.protocol.CUIPacketHandler; import java.io.IOException; import java.io.UncheckedIOException; @@ -177,7 +175,8 @@ public void onInitialize() { config = new FabricConfiguration(this); this.provider = getInitialPermissionsProvider(); - CUIPacketHandler.instance().registerServerboundHandler(this::onCuiPacket); + // TODO CUI + // CUIPacketHandler.instance().registerServerboundHandler(this::onCuiPacket); ServerTickEvents.END_SERVER_TICK.register(ThreadSafeCache.getInstance()); CommandRegistrationCallback.EVENT.register(this::registerCommands); @@ -440,16 +439,17 @@ private void onPlayerDisconnect(ServerGamePacketListenerImpl handler, MinecraftS .post(new SessionIdleEvent(new FabricPlayer.SessionKeyImpl(handler.player))); } - private void onCuiPacket(CUIPacket payload, CUIPacketHandler.PacketContext context) { - if (!(context.player() instanceof ServerPlayer player)) { - // Ignore - this is not a server-bound packet - return; - } - - FabricPlayer actor = FabricAdapter.adaptPlayer(player); - LocalSession session = WorldEdit.getInstance().getSessionManager().get(actor); - session.handleCUIInitializationMessage(payload.eventType(), payload.args(), actor); - } + // TODO CUI + // private void onCuiPacket(CUIPacket payload, CUIPacketHandler.PacketContext context) { + // if (!(context.player() instanceof ServerPlayer player)) { + // // Ignore - this is not a server-bound packet + // return; + // } + // + // FabricPlayer actor = FabricAdapter.adaptPlayer(player); + // LocalSession session = WorldEdit.getInstance().getSessionManager().get(actor); + // session.handleCUIInitializationMessage(payload.eventType(), payload.args(), actor); + // } /** * Get the configuration. diff --git a/worldedit-fabric/src/main/resources/worldedit.accesswidener b/worldedit-fabric/src/main/resources/worldedit.accesswidener index 88f77ce207..603abe5d1b 100644 --- a/worldedit-fabric/src/main/resources/worldedit.accesswidener +++ b/worldedit-fabric/src/main/resources/worldedit.accesswidener @@ -1,4 +1,4 @@ -accessWidener v2 named +accessWidener v2 official accessible class net/minecraft/server/level/ServerChunkCache$MainThreadExecutor accessible field net/minecraft/server/level/ServerChunkCache mainThreadProcessor Lnet/minecraft/server/level/ServerChunkCache$MainThreadExecutor; @@ -9,7 +9,7 @@ accessible field net/minecraft/server/level/ServerPlayerGameMode isDestroyingBlo accessible field net/minecraft/world/level/storage/DerivedLevelData wrapped Lnet/minecraft/world/level/storage/ServerLevelData; -accessible field net/minecraft/world/level/storage/PrimaryLevelData worldOptions Lnet/minecraft/world/level/levelgen/WorldOptions; -mutable field net/minecraft/world/level/storage/PrimaryLevelData worldOptions Lnet/minecraft/world/level/levelgen/WorldOptions; +#accessible field net/minecraft/world/level/storage/PrimaryLevelData worldOptions Lnet/minecraft/world/level/levelgen/WorldOptions; +#mutable field net/minecraft/world/level/storage/PrimaryLevelData worldOptions Lnet/minecraft/world/level/levelgen/WorldOptions; accessible method net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket (Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/nbt/CompoundTag;)V From 38365235819021ab25ce32673ad24c338402959d Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 8 Mar 2026 18:32:36 -0700 Subject: [PATCH 3/9] [Fabric] Initial update to 26.1 --- gradle/libs.versions.toml | 2 +- .../worldedit/fabric/FabricFakePlayer.java | 6 -- .../sk89q/worldedit/fabric/FabricPlayer.java | 11 ++- .../sk89q/worldedit/fabric/FabricWorld.java | 75 +++++++------------ .../fabric/internal/ExtendedServerLevel.java | 26 +++++++ .../fabric/mixin/MixinServerLevel.java | 68 +++++++++++++++++ .../resources/worldedit-fabric.mixins.json | 3 +- worldedit-sponge/build.gradle.kts | 5 ++ 8 files changed, 135 insertions(+), 61 deletions(-) create mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java create mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index df904ec983..9606aa60aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,7 +75,7 @@ junit-platform-launcher.module = "org.junit.platform:junit-platform-launcher" jqwik = "net.jqwik:jqwik:1.9.0" -mockito-bom = "org.mockito:mockito-bom:5.11.0" +mockito-bom = "org.mockito:mockito-bom:5.22.0" mockito-core.module = "org.mockito:mockito-core" mockito-junit-jupiter.module = "org.mockito:mockito-junit-jupiter" diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricFakePlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricFakePlayer.java index 2369acb549..4b2daa1e76 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricFakePlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricFakePlayer.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.fabric; import com.mojang.authlib.GameProfile; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerLevel; @@ -56,9 +55,4 @@ public void awardStat(Stat stat, int incrementer) { @Override public void awardStat(Stat stat) { } - - @Override - public void displayClientMessage(Component message, boolean actionBar) { - super.displayClientMessage(message, actionBar); - } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java index 5e0a9de72e..5e7a587b51 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java @@ -39,7 +39,6 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; @@ -51,7 +50,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import org.enginehub.linbus.tree.LinCompoundTag; -import org.enginehub.worldeditcui.protocol.CUIPacket; import java.util.Locale; import java.util.Set; @@ -126,10 +124,11 @@ public void giveItem(BaseItemStack itemStack) { @Override public void dispatchCUIEvent(CUIEvent event) { - ServerPlayNetworking.send( - this.player, - new CUIPacket(event.getTypeId(), event.getParameters()) - ); + // TODO CUI + // ServerPlayNetworking.send( + // this.player, + // new CUIPacket(event.getTypeId(), event.getParameters()) + // ); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index 7e2e0e847c..202d4eee0a 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -102,16 +102,14 @@ import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.WorldOptions; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.storage.DerivedLevelData; +import net.minecraft.world.level.saveddata.WeatherData; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.world.phys.AABB; @@ -129,7 +127,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.OptionalLong; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -326,6 +323,10 @@ public boolean regenerate(Region region, Extent extent, RegenOptions options) { return false; } + if (options.getSeed().isPresent()) { + throw new UnsupportedOperationException("26.1+ worldgen does not support overriding the seed for regen"); + } + try { doRegen(region, extent, options); } catch (Exception e) { @@ -340,13 +341,6 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws LevelStorageSource levelStorage = LevelStorageSource.createDefault(tempDir); try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("WorldEditTempGen")) { ServerLevel originalWorld = (ServerLevel) getWorld(); - PrimaryLevelData levelProperties = getPrimaryLevelData(originalWorld.getLevelData()); - WorldOptions originalOpts = levelProperties.worldGenSettingsLifecycle(); - - long seed = options.getSeed().orElse(originalWorld.getSeed()); - levelProperties.worldOptions = options.getSeed().isPresent() - ? originalOpts.withSeed(OptionalLong.of(seed)) - : originalOpts; ResourceKey worldRegKey = originalWorld.dimension(); try (ServerLevel serverWorld = new ServerLevel( @@ -358,35 +352,22 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws originalWorld.getChunkSource().getGenerator() ), originalWorld.isDebug(), - seed, + originalWorld.getSeed(), // No spawners are needed for this world. ImmutableList.of(), // This controls ticking, we don't need it so set it to false. - false, - originalWorld.getRandomSequences() + false )) { regenForWorld(region, extent, serverWorld, options); // drive the server executor until all tasks are popped off originalWorld.getServer().managedBlock(() -> originalWorld.getServer().getPendingTasksCount() == 0); - } finally { - levelProperties.worldOptions = originalOpts; } } finally { SafeFiles.tryHardToDeleteDir(tempDir); } } - private static PrimaryLevelData getPrimaryLevelData(LevelData levelData) { - if (levelData instanceof DerivedLevelData derivedLevelData) { - return getPrimaryLevelData(derivedLevelData.wrapped); - } else if (levelData instanceof PrimaryLevelData primaryLevelData) { - return primaryLevelData; - } else { - throw new IllegalStateException("Unknown level data type: " + levelData.getClass()); - } - } - private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws WorldEditException { List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); @@ -413,7 +394,7 @@ private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld for (BlockVector3 vec : region) { BlockPos pos = FabricAdapter.toBlockPos(vec); - ChunkAccess chunk = chunks.get(new ChunkPos(pos)); + ChunkAccess chunk = chunks.get(ChunkPos.containing(pos)); BlockStateHolder state = FabricAdapter.adapt(chunk.getBlockState(pos)); BlockEntity blockEntity = chunk.getBlockEntity(pos); if (blockEntity != null) { @@ -538,7 +519,7 @@ public boolean generateStructure(StructureType type, EditSession editSession, Bl ServerChunkCache chunkManager = world.getChunkSource(); try (FabricServerLevelDelegateProxy.LevelAndProxy proxyLevel = FabricServerLevelDelegateProxy.newInstance(editSession, world)) { - ChunkPos chunkPos = new ChunkPos(new BlockPos(position.x(), position.y(), position.z())); + ChunkPos chunkPos = ChunkPos.containing(new BlockPos(position.x(), position.y(), position.z())); StructureStart structureStart = structure.generate( structureRegistry.wrapAsHolder(structure), world.dimension(), world.registryAccess(), chunkManager.getGenerator(), chunkManager.getGenerator().getBiomeSource(), chunkManager.randomState(), @@ -603,11 +584,11 @@ public void fixLighting(Iterable chunks) { @Override public WeatherType getWeather() { - LevelData info = getWorld().getLevelData(); - if (info.isThundering()) { + WeatherData weatherData = getWorld().getServer().getWeatherData(); + if (weatherData.isThundering()) { return WeatherTypes.THUNDER_STORM; } - if (info.isRaining()) { + if (weatherData.isRaining()) { return WeatherTypes.RAIN; } return WeatherTypes.CLEAR; @@ -615,14 +596,14 @@ public WeatherType getWeather() { @Override public long getRemainingWeatherDuration() { - ServerLevelData info = (ServerLevelData) getWorld().getLevelData(); - if (info.isThundering()) { - return info.getThunderTime(); + WeatherData weatherData = getWorld().getServer().getWeatherData(); + if (weatherData.isThundering()) { + return weatherData.getThunderTime(); } - if (info.isRaining()) { - return info.getRainTime(); + if (weatherData.isRaining()) { + return weatherData.getRainTime(); } - return info.getClearWeatherTime(); + return weatherData.getClearWeatherTime(); } @Override @@ -632,19 +613,19 @@ public void setWeather(WeatherType weatherType) { @Override public void setWeather(WeatherType weatherType, long duration) { - ServerLevelData info = (ServerLevelData) getWorld().getLevelData(); + WeatherData weatherData = getWorld().getServer().getWeatherData(); if (weatherType == WeatherTypes.THUNDER_STORM) { - info.setClearWeatherTime(0); - info.setThundering(true); - info.setThunderTime((int) duration); + weatherData.setClearWeatherTime(0); + weatherData.setThundering(true); + weatherData.setThunderTime((int) duration); } else if (weatherType == WeatherTypes.RAIN) { - info.setClearWeatherTime(0); - info.setRaining(true); - info.setRainTime((int) duration); + weatherData.setClearWeatherTime(0); + weatherData.setRaining(true); + weatherData.setRainTime((int) duration); } else if (weatherType == WeatherTypes.CLEAR) { - info.setRaining(false); - info.setThundering(false); - info.setClearWeatherTime((int) duration); + weatherData.setRaining(false); + weatherData.setThundering(false); + weatherData.setClearWeatherTime((int) duration); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java new file mode 100644 index 0000000000..c7f4b8e858 --- /dev/null +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java @@ -0,0 +1,26 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.fabric.internal; + +public interface ExtendedServerLevel { + void setSeedOverride(long seed); + + void clearSeedOverride(); +} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java new file mode 100644 index 0000000000..749a0e1cc7 --- /dev/null +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java @@ -0,0 +1,68 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.fabric.mixin; + +import com.google.errorprone.annotations.Keep; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.sk89q.worldedit.fabric.internal.ExtendedServerLevel; +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerEntityGetter; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.WritableLevelData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import javax.annotation.Nullable; + +@Mixin(ServerLevel.class) +public abstract class MixinServerLevel extends Level implements WorldGenLevel, ServerEntityGetter, ExtendedServerLevel { + @Unique + @Nullable + private Long seedOverride; + + @Keep + protected MixinServerLevel(WritableLevelData levelData, ResourceKey dimension, RegistryAccess registryAccess, Holder dimensionTypeRegistration, boolean isClientSide, boolean isDebug, long biomeZoomSeed, int maxChainedNeighborUpdates) { + super(levelData, dimension, registryAccess, dimensionTypeRegistration, isClientSide, isDebug, biomeZoomSeed, maxChainedNeighborUpdates); + } + + @Override + public void setSeedOverride(long seed) { + seedOverride = seed; + } + + @Override + public void clearSeedOverride() { + seedOverride = null; + } + + @WrapMethod(method = "getSeed") + public long getSeed(Operation original) { + if (seedOverride != null) { + return seedOverride; + } + return original.call(); + } +} diff --git a/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json index 232b19e65f..389d80e0ed 100644 --- a/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json +++ b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json @@ -5,7 +5,8 @@ "mixins": [ "MixinLevelChunkSetBlockHook", "MixinMinecraftServer", - "MixinServerGamePacketListenerImpl" + "MixinServerGamePacketListenerImpl", + "MixinServerLevel" ], "plugin": "com.sk89q.worldedit.fabric.internal.MixinConfigPlugin", "server": [ diff --git a/worldedit-sponge/build.gradle.kts b/worldedit-sponge/build.gradle.kts index 870c5c35e9..77184c34c3 100644 --- a/worldedit-sponge/build.gradle.kts +++ b/worldedit-sponge/build.gradle.kts @@ -82,6 +82,11 @@ dependencies { "compileOnly"(libs.errorprone.annotations) } +tasks.compileJava { + // Currently need to allow warning about supported source versions for annotation processors. + options.compilerArgs.remove("-Werror") +} + configure { archivesName.set("${project.name}-api${libs.versions.sponge.api.major.get()}") } From 397fc948d5f1198825d98cc9eb3a8a740616f0ae Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 8 Mar 2026 19:26:05 -0700 Subject: [PATCH 4/9] [Fabric] Clean up mixins Most can be AW or just use existing API now --- .../worldedit/fabric/FabricPlatform.java | 20 ++--- .../sk89q/worldedit/fabric/FabricWorld.java | 5 +- .../fabric/internal/ExtendedChunk.java | 43 --------- .../fabric/internal/ExtendedServerLevel.java | 26 ------ ...aftServer.java => FabricWatchdogImpl.java} | 17 ++-- .../internal/FabricWorldNativeAccess.java | 25 +++--- .../mixin/MixinLevelChunkSetBlockHook.java | 87 ------------------- .../fabric/mixin/MixinMinecraftServer.java | 58 ------------- .../fabric/mixin/MixinServerLevel.java | 68 --------------- .../src/main/resources/fabric.mod.json | 2 +- .../resources/worldedit-fabric.mixins.json | 5 +- .../main/resources/worldedit.accesswidener | 3 + 12 files changed, 38 insertions(+), 321 deletions(-) delete mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedChunk.java delete mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java rename worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/{ExtendedMinecraftServer.java => FabricWatchdogImpl.java} (66%) delete mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinLevelChunkSetBlockHook.java delete mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java delete mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java index 6ad55a0dfc..7f2c4dd3fa 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.fabric; -import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.AbstractPlatform; @@ -28,7 +27,7 @@ import com.sk89q.worldedit.extension.platform.MultiUserPlatform; import com.sk89q.worldedit.extension.platform.Preference; import com.sk89q.worldedit.extension.platform.Watchdog; -import com.sk89q.worldedit.fabric.internal.ExtendedChunk; +import com.sk89q.worldedit.fabric.internal.FabricWatchdogImpl; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.lifecycle.Lifecycled; import com.sk89q.worldedit.world.DataFixer; @@ -40,13 +39,11 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; -import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.storage.ServerLevelData; import org.enginehub.piston.CommandManager; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.EnumMap; import java.util.List; import java.util.Map; @@ -68,7 +65,7 @@ class FabricPlatform extends AbstractPlatform implements MultiUserPlatform { this.watchdog = FabricWorldEdit.LIFECYCLED_SERVER.map( server -> server instanceof DedicatedServer - ? Optional.of((Watchdog) server) + ? Optional.of(new FabricWatchdogImpl(server)) : Optional.empty() ); } @@ -200,22 +197,17 @@ public Map getCapabilities() { return capabilities; } - private static final Set SUPPORTED_SIDE_EFFECTS_NO_MIXIN = Sets.immutableEnumSet( + private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( SideEffect.VALIDATION, SideEffect.ENTITY_AI, SideEffect.LIGHTING, - SideEffect.NEIGHBORS - ); - - private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( - Iterables.concat(SUPPORTED_SIDE_EFFECTS_NO_MIXIN, Collections.singleton(SideEffect.UPDATE)) + SideEffect.NEIGHBORS, + SideEffect.UPDATE ); @Override public Set getSupportedSideEffects() { - return ExtendedChunk.class.isAssignableFrom(LevelChunk.class) - ? SUPPORTED_SIDE_EFFECTS - : SUPPORTED_SIDE_EFFECTS_NO_MIXIN; + return SUPPORTED_SIDE_EFFECTS; } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index 202d4eee0a..9e83ab0503 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -36,7 +36,6 @@ import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; import com.sk89q.worldedit.fabric.internal.FabricEntity; import com.sk89q.worldedit.fabric.internal.FabricServerLevelDelegateProxy; import com.sk89q.worldedit.fabric.internal.FabricWorldNativeAccess; @@ -194,8 +193,8 @@ public String id() { public Path getStoragePath() { final Level world = getWorld(); MinecraftServer server = world.getServer(); - checkState(server instanceof ExtendedMinecraftServer, "Need a server world"); - return ((ExtendedMinecraftServer) server).getStoragePath(world); + checkState(server != null, "Need a server world"); + return server.storageSource.getDimensionPath(world.dimension()); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedChunk.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedChunk.java deleted file mode 100644 index e973cc4583..0000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedChunk.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.internal; - -import com.sk89q.worldedit.util.SideEffect; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; - -import javax.annotation.Nullable; - -public interface ExtendedChunk { - /** - * {@link ChunkAccess#setBlockState(BlockPos, BlockState, int)} with the extra - * {@link SideEffect#UPDATE} flag. - * - * @param pos the position to set - * @param state the state to set - * @param flag I honestly have no idea and can't be bothered to investigate, we pass {@code - * 0} - * @param update the update flag, see side-effect for details - * @return the old block state, or {@code null} if unchanged - */ - @Nullable - BlockState setBlockState(BlockPos pos, BlockState state, int flag, boolean update); -} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java deleted file mode 100644 index c7f4b8e858..0000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedServerLevel.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.internal; - -public interface ExtendedServerLevel { - void setSeedOverride(long seed); - - void clearSeedOverride(); -} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWatchdogImpl.java similarity index 66% rename from worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java rename to worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWatchdogImpl.java index 22376275a2..cf4107b4ac 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWatchdogImpl.java @@ -19,12 +19,19 @@ package com.sk89q.worldedit.fabric.internal; -import net.minecraft.world.level.Level; +import com.sk89q.worldedit.extension.platform.Watchdog; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Util; -import java.nio.file.Path; +public final class FabricWatchdogImpl implements Watchdog { + private final MinecraftServer server; -public interface ExtendedMinecraftServer { - - Path getStoragePath(Level world); + public FabricWatchdogImpl(MinecraftServer server) { + this.server = server; + } + @Override + public void tick() { + server.nextTickTimeNanos = Util.getNanos(); + } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java index 847930a8d8..54faced10e 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java @@ -28,6 +28,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.FullChunkStatus; import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.ProblemReporter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -42,9 +43,6 @@ import javax.annotation.Nullable; public class FabricWorldNativeAccess implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - private final WeakReference world; private SideEffectSet sideEffectSet; @@ -82,12 +80,14 @@ public BlockState getBlockState(LevelChunk chunk, BlockPos position) { @Nullable @Override public BlockState setBlockState(LevelChunk chunk, BlockPos position, BlockState state) { - if (chunk instanceof ExtendedChunk extendedChunk) { - return extendedChunk.setBlockState( - position, state, 0, sideEffectSet.shouldApply(SideEffect.UPDATE) - ); + int flags = 0; + if (sideEffectSet != null) { + if (!sideEffectSet.shouldApply(SideEffect.UPDATE)) { + // We don't skip block entity side-effects as that's likely to cause problems. + flags |= Block.UPDATE_SKIP_ON_PLACE | Block.UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE; + } } - return chunk.setBlockState(position, state, 0); + return chunk.setBlockState(position, state, flags); } @Override @@ -122,7 +122,7 @@ public boolean updateTileEntity(BlockPos position, LinCompoundTag tag) { @Override public void notifyBlockUpdate(LevelChunk chunk, BlockPos position, BlockState oldState, BlockState newState) { if (chunk.getSections()[getWorld().getSectionIndex(position.getY())] != null) { - getWorld().sendBlockUpdated(position, oldState, newState, UPDATE | NOTIFY); + getWorld().sendBlockUpdated(position, oldState, newState, Block.UPDATE_NEIGHBORS | Block.UPDATE_CLIENTS); } } @@ -155,9 +155,10 @@ public void updateBlock(BlockPos pos, BlockState oldState, BlockState newState) @Override public void updateNeighbors(BlockPos pos, BlockState oldState, BlockState newState, int recursionLimit) { Level world = getWorld(); - oldState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); - newState.updateNeighbourShapes(world, pos, NOTIFY, recursionLimit); - newState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); + oldState.affectNeighborsAfterRemoval((ServerLevel) world, pos, false); + oldState.updateIndirectNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); + newState.updateNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); + newState.updateIndirectNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinLevelChunkSetBlockHook.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinLevelChunkSetBlockHook.java deleted file mode 100644 index 464b807529..0000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinLevelChunkSetBlockHook.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.mixin; - -import com.sk89q.worldedit.fabric.internal.ExtendedChunk; -import net.minecraft.core.BlockPos; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; -import net.minecraft.world.level.chunk.PalettedContainerFactory; -import net.minecraft.world.level.chunk.UpgradeData; -import net.minecraft.world.level.levelgen.blending.BlendingData; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.Slice; - -import javax.annotation.Nullable; - -@Mixin(LevelChunk.class) -public abstract class MixinLevelChunkSetBlockHook extends ChunkAccess implements ExtendedChunk { - @Unique - private boolean shouldUpdate = true; - - public MixinLevelChunkSetBlockHook(ChunkPos chunkPos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor, PalettedContainerFactory palettedContainerFactory, long l, @org.jetbrains.annotations.Nullable LevelChunkSection[] levelChunkSections, @org.jetbrains.annotations.Nullable BlendingData blendingData) { - super(chunkPos, upgradeData, levelHeightAccessor, palettedContainerFactory, l, levelChunkSections, blendingData); - } - - @Unique - @Nullable - @Override - public BlockState setBlockState(BlockPos pos, BlockState state, int flag, boolean update) { - // save the state for the hook - shouldUpdate = update; - try { - return setBlockState(pos, state, flag); - } finally { - // restore natural mode - shouldUpdate = true; - } - } - - @Redirect( - method = "setBlockState", - slice = @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/world/level/block/Block;)Z") - ), - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;onPlace(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V") - ) - public void setBlockStateHook(BlockState target, Level world, BlockPos pos, BlockState old, boolean move) { - boolean localShouldUpdate; - MinecraftServer server = world.getServer(); - if (server == null || Thread.currentThread() != server.getRunningThread()) { - // We're not on the server thread for some reason, WorldEdit will never be here - // so we'll just ignore our flag - localShouldUpdate = true; - } else { - localShouldUpdate = shouldUpdate; - } - if (localShouldUpdate) { - target.onPlace(world, pos, old, move); - } - } -} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java deleted file mode 100644 index 0936e571a7..0000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.mixin; - -import com.google.errorprone.annotations.Keep; -import com.sk89q.worldedit.extension.platform.Watchdog; -import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Util; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.LevelStorageSource; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; - -import java.nio.file.Path; - -@Mixin(MinecraftServer.class) -public abstract class MixinMinecraftServer implements Watchdog, ExtendedMinecraftServer { - - @Keep - @Shadow - private long nextTickTimeNanos; - @Final - @Shadow - protected LevelStorageSource.LevelStorageAccess storageSource; - - @Unique - @Override - public void tick() { - nextTickTimeNanos = Util.getNanos(); - } - - @Unique - @Override - public Path getStoragePath(Level world) { - return storageSource.getDimensionPath(world.dimension()); - } - -} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java deleted file mode 100644 index 749a0e1cc7..0000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinServerLevel.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.mixin; - -import com.google.errorprone.annotations.Keep; -import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.sk89q.worldedit.fabric.internal.ExtendedServerLevel; -import net.minecraft.core.Holder; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.level.ServerEntityGetter; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.storage.WritableLevelData; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -import javax.annotation.Nullable; - -@Mixin(ServerLevel.class) -public abstract class MixinServerLevel extends Level implements WorldGenLevel, ServerEntityGetter, ExtendedServerLevel { - @Unique - @Nullable - private Long seedOverride; - - @Keep - protected MixinServerLevel(WritableLevelData levelData, ResourceKey dimension, RegistryAccess registryAccess, Holder dimensionTypeRegistration, boolean isClientSide, boolean isDebug, long biomeZoomSeed, int maxChainedNeighborUpdates) { - super(levelData, dimension, registryAccess, dimensionTypeRegistration, isClientSide, isDebug, biomeZoomSeed, maxChainedNeighborUpdates); - } - - @Override - public void setSeedOverride(long seed) { - seedOverride = seed; - } - - @Override - public void clearSeedOverride() { - seedOverride = null; - } - - @WrapMethod(method = "getSeed") - public long getSeed(Operation original) { - if (seedOverride != null) { - return seedOverride; - } - return original.call(); - } -} diff --git a/worldedit-fabric/src/main/resources/fabric.mod.json b/worldedit-fabric/src/main/resources/fabric.mod.json index ae1fe696ce..d208508ffb 100644 --- a/worldedit-fabric/src/main/resources/fabric.mod.json +++ b/worldedit-fabric/src/main/resources/fabric.mod.json @@ -31,7 +31,6 @@ }, "depends": { - "worldeditcui_protocol": "*", "fabricloader": ">=0.4.0", "fabric-api-base": "*", "fabric-command-api-v2": "*", @@ -40,6 +39,7 @@ "fabric-networking-api-v1": "*" }, "suggests": { + "worldeditcui_protocol": "*", "fabric-permissions-api-v0": "*" }, "mixins": [ diff --git a/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json index 389d80e0ed..1097e53aa4 100644 --- a/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json +++ b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json @@ -3,10 +3,7 @@ "package": "com.sk89q.worldedit.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinLevelChunkSetBlockHook", - "MixinMinecraftServer", - "MixinServerGamePacketListenerImpl", - "MixinServerLevel" + "MixinServerGamePacketListenerImpl" ], "plugin": "com.sk89q.worldedit.fabric.internal.MixinConfigPlugin", "server": [ diff --git a/worldedit-fabric/src/main/resources/worldedit.accesswidener b/worldedit-fabric/src/main/resources/worldedit.accesswidener index 603abe5d1b..96d7240b28 100644 --- a/worldedit-fabric/src/main/resources/worldedit.accesswidener +++ b/worldedit-fabric/src/main/resources/worldedit.accesswidener @@ -13,3 +13,6 @@ accessible field net/minecraft/world/level/storage/DerivedLevelData wrapped Lnet #mutable field net/minecraft/world/level/storage/PrimaryLevelData worldOptions Lnet/minecraft/world/level/levelgen/WorldOptions; accessible method net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket (Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/nbt/CompoundTag;)V + +accessible field net/minecraft/server/MinecraftServer nextTickTimeNanos J +accessible field net/minecraft/server/MinecraftServer storageSource Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess; From d5e65c4459ddfa0fafd2a16c376b6d6b1532a20c Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Wed, 18 Mar 2026 19:21:04 +1000 Subject: [PATCH 5/9] [Fabric] pre3 --- gradle/libs.versions.toml | 4 ++-- .../fabric/internal/FabricTransmogrifier.java | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9606aa60aa..0cb8428e54 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ cuiProtocol = "4.0.2" errorprone = "2.48.0" -fabric-api = "0.143.11+26.1" +fabric-api = "0.143.14+26.1" neogradle = "7.1.20" neoforge-minecraft = "1.21.11" @@ -94,7 +94,7 @@ rhino = "org.mozilla:rhino-runtime:1.7.13" jchronic = "com.sk89q:jchronic:0.2.4a" jlibnoise = "com.sk89q.lib:jlibnoise:1.0.0" -fabric-minecraft = "com.mojang:minecraft:26.1-snapshot-11" +fabric-minecraft = "com.mojang:minecraft:26.1-pre-3" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1" diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java index 50c3c4d6c5..4b26f77ab9 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java @@ -75,18 +75,18 @@ public static Property transmogToWorldEditProperty(net.minecraft.world.level. return PROPERTY_CACHE.getUnchecked(property); } - private static Map, Object> transmogToWorldEditProperties(BlockType block, Map, Comparable> mcProps) { + private static Map, Object> transmogToWorldEditProperties(BlockType block, net.minecraft.world.level.block.state.BlockState blockState) { Map, Object> props = new TreeMap<>(Comparator.comparing(Property::name)); - for (Map.Entry, Comparable> prop : mcProps.entrySet()) { - Object value = prop.getValue(); - if (prop.getKey() instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - if (prop.getKey().getValueClass() == net.minecraft.core.Direction.class) { + for (net.minecraft.world.level.block.state.properties.Property property : blockState.getProperties()) { + Object value = blockState.getValue(property); + if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + if (property.getValueClass() == net.minecraft.core.Direction.class) { value = FabricAdapter.adaptEnumFacing((net.minecraft.core.Direction) value); } else { value = ((StringRepresentable) value).getSerializedName(); } } - props.put(block.getProperty(prop.getKey().getName()), value); + props.put(block.getProperty(property.getName()), value); } return props; } @@ -127,7 +127,7 @@ public static net.minecraft.world.level.block.state.BlockState transmogToMinecra public static com.sk89q.worldedit.world.block.BlockState transmogToWorldEdit(net.minecraft.world.level.block.state.BlockState blockState) { BlockType blockType = FabricAdapter.adapt(blockState.getBlock()); - return blockType.getState(transmogToWorldEditProperties(blockType, blockState.getValues())); + return blockType.getState(transmogToWorldEditProperties(blockType, blockState)); } private FabricTransmogrifier() { From 4cb05bb8a7ff6beacab06702f9529b9db9692086 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Wed, 18 Mar 2026 19:40:47 +1000 Subject: [PATCH 6/9] [NeoForge] Pre 3 --- gradle/libs.versions.toml | 6 +- .../neoforge/NeoForgeFakePlayer.java | 6 -- .../worldedit/neoforge/NeoForgePlatform.java | 15 +--- .../worldedit/neoforge/NeoForgeWorld.java | 67 +++++++-------- .../neoforge/internal/ExtendedChunk.java | 43 ---------- .../internal/NeoForgeTransmogrifier.java | 14 ++-- .../internal/NeoForgeWorldNativeAccess.java | 24 +++--- .../mixin/MixinLevelChunkSetBlockHook.java | 84 ------------------- .../resources/worldedit-neoforge.mixins.json | 1 - 9 files changed, 53 insertions(+), 207 deletions(-) delete mode 100644 worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/ExtendedChunk.java delete mode 100644 worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/mixin/MixinLevelChunkSetBlockHook.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0cb8428e54..cb68e9ead4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,8 +15,8 @@ errorprone = "2.48.0" fabric-api = "0.143.14+26.1" -neogradle = "7.1.20" -neoforge-minecraft = "1.21.11" +neogradle = "7.1.21" +neoforge-minecraft = "26.1" sponge-minecraft = "1.21.11" # https://repo.spongepowered.org/service/rest/repository/browse/maven-public/org/spongepowered/spongeapi/ @@ -98,7 +98,7 @@ fabric-minecraft = "com.mojang:minecraft:26.1-pre-3" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1" -neoforge = "net.neoforged:neoforge:21.11.38-beta" +neoforge = "net.neoforged:neoforge:26.1.0.0-alpha.15+pre-3" # Mojang-provided libraries, CHECK AGAINST MINECRAFT for versions guava = "com.google.guava:guava:33.5.0-jre!!" diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeFakePlayer.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeFakePlayer.java index e8a9050880..07447e3164 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeFakePlayer.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeFakePlayer.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.neoforge; import com.mojang.authlib.GameProfile; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerLevel; @@ -56,9 +55,4 @@ public void awardStat(Stat stat, int incrementer) { @Override public void awardStat(Stat stat) { } - - @Override - public void displayClientMessage(Component message, boolean actionBar) { - super.displayClientMessage(message, actionBar); - } } diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgePlatform.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgePlatform.java index 429b721e81..aceeecc01a 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgePlatform.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgePlatform.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.neoforge; -import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.PermissionCondition; @@ -29,7 +28,6 @@ import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.MultiUserPlatform; import com.sk89q.worldedit.extension.platform.Preference; -import com.sk89q.worldedit.neoforge.internal.ExtendedChunk; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.io.ResourceLoader; import com.sk89q.worldedit.world.DataFixer; @@ -44,7 +42,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; -import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.storage.ServerLevelData; import net.neoforged.neoforge.server.ServerLifecycleHooks; import org.enginehub.piston.Command; @@ -222,23 +219,17 @@ public Map getCapabilities() { return capabilities; } - private static final Set SUPPORTED_SIDE_EFFECTS_NO_MIXIN = Sets.immutableEnumSet( + private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( SideEffect.VALIDATION, SideEffect.ENTITY_AI, SideEffect.LIGHTING, SideEffect.NEIGHBORS, - SideEffect.EVENTS - ); - - private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( - Iterables.concat(SUPPORTED_SIDE_EFFECTS_NO_MIXIN, Collections.singleton(SideEffect.UPDATE)) + SideEffect.UPDATE ); @Override public Set getSupportedSideEffects() { - return ExtendedChunk.class.isAssignableFrom(LevelChunk.class) - ? SUPPORTED_SIDE_EFFECTS - : SUPPORTED_SIDE_EFFECTS_NO_MIXIN; + return SUPPORTED_SIDE_EFFECTS; } @Override diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java index c527e84cad..e70d6a50fe 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java @@ -97,15 +97,13 @@ import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.WorldOptions; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.level.saveddata.WeatherData; import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.world.phys.AABB; @@ -122,7 +120,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.OptionalLong; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -313,6 +310,10 @@ public boolean canPlaceAt(BlockVector3 position, BlockState blockState) { @Override public boolean regenerate(Region region, Extent extent, RegenOptions options) { + if (options.getSeed().isPresent()) { + throw new UnsupportedOperationException("26.1+ worldgen does not support overriding the seed for regen"); + } + try { doRegen(region, extent, options); } catch (Exception e) { @@ -327,15 +328,6 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws LevelStorageSource levelStorage = LevelStorageSource.createDefault(tempDir); try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("WorldEditTempGen")) { ServerLevel originalWorld = getWorld(); - PrimaryLevelData levelProperties = (PrimaryLevelData) originalWorld.getServer() - .getWorldData().overworldData(); - WorldOptions originalOpts = levelProperties.worldGenOptions(); - - long seed = options.getSeed().orElse(originalWorld.getSeed()); - - levelProperties.worldOptions = options.getSeed().isPresent() - ? originalOpts.withSeed(OptionalLong.of(seed)) - : originalOpts; ResourceKey worldRegKey = originalWorld.dimension(); try (ServerLevel serverWorld = new ServerLevel( @@ -347,19 +339,16 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws originalWorld.getChunkSource().getGenerator() ), originalWorld.isDebug(), - seed, + originalWorld.getSeed(), // No spawners are needed for this world. ImmutableList.of(), // This controls ticking, we don't need it so set it to false. - false, - originalWorld.getRandomSequences() + false )) { regenForWorld(region, extent, serverWorld, options); // drive the server executor until all tasks are popped off originalWorld.getServer().managedBlock(() -> originalWorld.getServer().getPendingTasksCount() == 0); - } finally { - levelProperties.worldOptions = originalOpts; } } finally { SafeFiles.tryHardToDeleteDir(tempDir); @@ -392,7 +381,7 @@ private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld for (BlockVector3 vec : region) { BlockPos pos = NeoForgeAdapter.toBlockPos(vec); - ChunkAccess chunk = chunks.get(new ChunkPos(pos)); + ChunkAccess chunk = chunks.get(ChunkPos.containing(pos)); BlockStateHolder state = NeoForgeAdapter.adapt(chunk.getBlockState(pos)); BlockEntity blockEntity = chunk.getBlockEntity(pos); if (blockEntity != null) { @@ -516,7 +505,7 @@ public boolean generateStructure(StructureType type, EditSession editSession, Bl ServerChunkCache chunkManager = world.getChunkSource(); try (NeoForgeServerLevelDelegateProxy.LevelAndProxy levelProxy = NeoForgeServerLevelDelegateProxy.newInstance(editSession, world)) { - ChunkPos chunkPos = new ChunkPos(new BlockPos(position.x(), position.y(), position.z())); + ChunkPos chunkPos = ChunkPos.containing(new BlockPos(position.x(), position.y(), position.z())); StructureStart structureStart = structure.generate( structureRegistry.wrapAsHolder(structure), world.dimension(), world.registryAccess(), chunkManager.getGenerator(), chunkManager.getGenerator().getBiomeSource(), chunkManager.randomState(), @@ -583,11 +572,11 @@ public void fixLighting(Iterable chunks) { @Override public WeatherType getWeather() { - LevelData info = getWorld().getLevelData(); - if (info.isThundering()) { + WeatherData weatherData = getWorld().getServer().getWeatherData(); + if (weatherData.isThundering()) { return WeatherTypes.THUNDER_STORM; } - if (info.isRaining()) { + if (weatherData.isRaining()) { return WeatherTypes.RAIN; } return WeatherTypes.CLEAR; @@ -595,14 +584,14 @@ public WeatherType getWeather() { @Override public long getRemainingWeatherDuration() { - ServerLevelData info = (ServerLevelData) getWorld().getLevelData(); - if (info.isThundering()) { - return info.getThunderTime(); + WeatherData weatherData = getWorld().getServer().getWeatherData(); + if (weatherData.isThundering()) { + return weatherData.getThunderTime(); } - if (info.isRaining()) { - return info.getRainTime(); + if (weatherData.isRaining()) { + return weatherData.getRainTime(); } - return info.getClearWeatherTime(); + return weatherData.getClearWeatherTime(); } @Override @@ -612,19 +601,19 @@ public void setWeather(WeatherType weatherType) { @Override public void setWeather(WeatherType weatherType, long duration) { - ServerLevelData info = (ServerLevelData) getWorld().getLevelData(); + WeatherData weatherData = getWorld().getServer().getWeatherData(); if (weatherType == WeatherTypes.THUNDER_STORM) { - info.setClearWeatherTime(0); - info.setThundering(true); - info.setThunderTime((int) duration); + weatherData.setClearWeatherTime(0); + weatherData.setThundering(true); + weatherData.setThunderTime((int) duration); } else if (weatherType == WeatherTypes.RAIN) { - info.setClearWeatherTime(0); - info.setRaining(true); - info.setRainTime((int) duration); + weatherData.setClearWeatherTime(0); + weatherData.setRaining(true); + weatherData.setRainTime((int) duration); } else if (weatherType == WeatherTypes.CLEAR) { - info.setRaining(false); - info.setThundering(false); - info.setClearWeatherTime((int) duration); + weatherData.setRaining(false); + weatherData.setThundering(false); + weatherData.setClearWeatherTime((int) duration); } } diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/ExtendedChunk.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/ExtendedChunk.java deleted file mode 100644 index 95b4087b14..0000000000 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/ExtendedChunk.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.neoforge.internal; - -import com.sk89q.worldedit.util.SideEffect; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; - -import javax.annotation.Nullable; - -public interface ExtendedChunk { - /** - * {@link ChunkAccess#setBlockState(BlockPos, BlockState, int)} with the extra - * {@link SideEffect#UPDATE} flag. - * - * @param pos the position to set - * @param state the state to set - * @param flag I honestly have no idea and can't be bothered to investigate, we pass {@code - * 0} - * @param update the update flag, see side-effect for details - * @return the old block state, or {@code null} if unchanged - */ - @Nullable - BlockState setBlockState(BlockPos pos, BlockState state, int flag, boolean update); -} diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeTransmogrifier.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeTransmogrifier.java index c284d2f0e9..0f95732868 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeTransmogrifier.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeTransmogrifier.java @@ -75,18 +75,18 @@ public static Property transmogToWorldEditProperty(net.minecraft.world.level. return PROPERTY_CACHE.getUnchecked(property); } - public static Map, Object> transmogToWorldEditProperties(BlockType block, Map, Comparable> mcProps) { + public static Map, Object> transmogToWorldEditProperties(BlockType block, net.minecraft.world.level.block.state.BlockState blockState) { Map, Object> props = new TreeMap<>(Comparator.comparing(Property::name)); - for (Map.Entry, Comparable> prop : mcProps.entrySet()) { - Object value = prop.getValue(); - if (prop.getKey() instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - if (prop.getKey().getValueClass() == net.minecraft.core.Direction.class) { + for (net.minecraft.world.level.block.state.properties.Property property : blockState.getProperties()) { + Object value = blockState.getValue(property); + if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + if (property.getValueClass() == net.minecraft.core.Direction.class) { value = NeoForgeAdapter.adaptEnumFacing((net.minecraft.core.Direction) value); } else { value = ((StringRepresentable) value).getSerializedName(); } } - props.put(block.getProperty(prop.getKey().getName()), value); + props.put(block.getProperty(property.getName()), value); } return props; } @@ -127,7 +127,7 @@ public static net.minecraft.world.level.block.state.BlockState transmogToMinecra public static BlockState transmogToWorldEdit(net.minecraft.world.level.block.state.BlockState blockState) { BlockType blockType = NeoForgeAdapter.adapt(blockState.getBlock()); - return blockType.getState(transmogToWorldEditProperties(blockType, blockState.getValues())); + return blockType.getState(transmogToWorldEditProperties(blockType, blockState)); } private NeoForgeTransmogrifier() { diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeWorldNativeAccess.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeWorldNativeAccess.java index 596b4413dc..4ceb309d8d 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeWorldNativeAccess.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/internal/NeoForgeWorldNativeAccess.java @@ -42,9 +42,6 @@ import javax.annotation.Nullable; public class NeoForgeWorldNativeAccess implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - private final WeakReference world; private SideEffectSet sideEffectSet; @@ -82,12 +79,14 @@ public BlockState getBlockState(LevelChunk chunk, BlockPos position) { @Nullable @Override public BlockState setBlockState(LevelChunk chunk, BlockPos position, BlockState state) { - if (chunk instanceof ExtendedChunk extendedChunk) { - return extendedChunk.setBlockState( - position, state, 0, sideEffectSet.shouldApply(SideEffect.UPDATE) - ); + int flags = 0; + if (sideEffectSet != null) { + if (!sideEffectSet.shouldApply(SideEffect.UPDATE)) { + // We don't skip block entity side-effects as that's likely to cause problems. + flags |= Block.UPDATE_SKIP_ON_PLACE | Block.UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE; + } } - return chunk.setBlockState(position, state, 0); + return chunk.setBlockState(position, state, flags); } @Override @@ -122,7 +121,7 @@ public boolean updateTileEntity(BlockPos position, LinCompoundTag tag) { @Override public void notifyBlockUpdate(LevelChunk chunk, BlockPos position, BlockState oldState, BlockState newState) { if (chunk.getSections()[getWorld().getSectionIndex(position.getY())] != null) { - getWorld().sendBlockUpdated(position, oldState, newState, UPDATE | NOTIFY); + getWorld().sendBlockUpdated(position, oldState, newState, Block.UPDATE_NEIGHBORS | Block.UPDATE_CLIENTS); } } @@ -163,9 +162,10 @@ public void updateBlock(BlockPos pos, BlockState oldState, BlockState newState) @Override public void updateNeighbors(BlockPos pos, BlockState oldState, BlockState newState, int recursionLimit) { ServerLevel world = getWorld(); - oldState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); - newState.updateNeighbourShapes(world, pos, NOTIFY, recursionLimit); - newState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); + oldState.affectNeighborsAfterRemoval(world, pos, false); + oldState.updateIndirectNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); + newState.updateNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); + newState.updateIndirectNeighbourShapes(world, pos, Block.UPDATE_CLIENTS, recursionLimit); } @Override diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/mixin/MixinLevelChunkSetBlockHook.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/mixin/MixinLevelChunkSetBlockHook.java deleted file mode 100644 index aa59375084..0000000000 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/mixin/MixinLevelChunkSetBlockHook.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.neoforge.mixin; - -import com.sk89q.worldedit.neoforge.internal.ExtendedChunk; -import net.minecraft.core.BlockPos; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; -import net.minecraft.world.level.chunk.PalettedContainerFactory; -import net.minecraft.world.level.chunk.UpgradeData; -import net.minecraft.world.level.levelgen.blending.BlendingData; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.Slice; - -import javax.annotation.Nullable; - -@Mixin(LevelChunk.class) -public abstract class MixinLevelChunkSetBlockHook extends ChunkAccess implements ExtendedChunk { - private boolean shouldUpdate = true; - - public MixinLevelChunkSetBlockHook(ChunkPos chunkPos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor, PalettedContainerFactory palettedContainerFactory, long l, @org.jetbrains.annotations.Nullable LevelChunkSection[] levelChunkSections, @org.jetbrains.annotations.Nullable BlendingData blendingData) { - super(chunkPos, upgradeData, levelHeightAccessor, palettedContainerFactory, l, levelChunkSections, blendingData); - } - - @Nullable - @Override - public BlockState setBlockState(BlockPos pos, BlockState state, int flag, boolean update) { - // save the state for the hook - shouldUpdate = update; - try { - return setBlockState(pos, state, flag); - } finally { - // restore natural mode - shouldUpdate = true; - } - } - - @Redirect( - method = "setBlockState", - slice = @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/world/level/block/Block;)Z") - ), - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;onPlace(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V") - ) - public void setBlockStateHook(BlockState target, Level world, BlockPos pos, BlockState old, boolean move) { - boolean localShouldUpdate; - MinecraftServer server = world.getServer(); - if (server == null || Thread.currentThread() != server.getRunningThread()) { - // We're not on the server thread for some reason, WorldEdit will never be here - // so we'll just ignore our flag - localShouldUpdate = true; - } else { - localShouldUpdate = shouldUpdate; - } - if (localShouldUpdate) { - target.onPlace(world, pos, old, move); - } - } -} diff --git a/worldedit-neoforge/src/main/resources/worldedit-neoforge.mixins.json b/worldedit-neoforge/src/main/resources/worldedit-neoforge.mixins.json index b807508229..667781684f 100644 --- a/worldedit-neoforge/src/main/resources/worldedit-neoforge.mixins.json +++ b/worldedit-neoforge/src/main/resources/worldedit-neoforge.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "AccessorServerPlayerGameMode", - "MixinLevelChunkSetBlockHook", "MixinServerGamePacketListenerImpl" ], "server": [ From 7ad8f0034689455a964cfe1e5fea0d1d21e19281 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Fri, 20 Mar 2026 19:16:59 +1000 Subject: [PATCH 7/9] [Fabric] RC1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cb68e9ead4..0bb799a309 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -94,7 +94,7 @@ rhino = "org.mozilla:rhino-runtime:1.7.13" jchronic = "com.sk89q:jchronic:0.2.4a" jlibnoise = "com.sk89q.lib:jlibnoise:1.0.0" -fabric-minecraft = "com.mojang:minecraft:26.1-pre-3" +fabric-minecraft = "com.mojang:minecraft:26.1-rc-1" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1" From d7eb761007095aae07ee4945a250a2aa186ef7f3 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Fri, 20 Mar 2026 20:11:35 +1000 Subject: [PATCH 8/9] Update MC Utils data --- .../world/block/BlockCategories.java | 65 +++++++++++++++++-- .../worldedit/world/block/BlockTypes.java | 2 + .../worldedit/world/item/ItemCategories.java | 12 +++- .../sk89q/worldedit/world/item/ItemTypes.java | 1 + 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java index 502c1ff392..5201bc75a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java @@ -39,7 +39,7 @@ public final class BlockCategories { public static final BlockCategory AZALEA_ROOT_REPLACEABLE = get("minecraft:azalea_root_replaceable"); public static final BlockCategory BADLANDS_TERRACOTTA = get("minecraft:badlands_terracotta"); public static final BlockCategory BAMBOO_BLOCKS = get("minecraft:bamboo_blocks"); - public static final BlockCategory BAMBOO_PLANTABLE_ON = get("minecraft:bamboo_plantable_on"); + @Deprecated public static final BlockCategory BAMBOO_PLANTABLE_ON = get("minecraft:bamboo_plantable_on"); public static final BlockCategory BANNERS = get("minecraft:banners"); public static final BlockCategory BARS = get("minecraft:bars"); public static final BlockCategory BASE_STONE_NETHER = get("minecraft:base_stone_nether"); @@ -50,7 +50,9 @@ public final class BlockCategories { public static final BlockCategory BEE_ATTRACTIVE = get("minecraft:bee_attractive"); public static final BlockCategory BEE_GROWABLES = get("minecraft:bee_growables"); public static final BlockCategory BEEHIVES = get("minecraft:beehives"); - public static final BlockCategory BIG_DRIPLEAF_PLACEABLE = get("minecraft:big_dripleaf_placeable"); + public static final BlockCategory BENEATH_BAMBOO_PODZOL_REPLACEABLE = get("minecraft:beneath_bamboo_podzol_replaceable"); + public static final BlockCategory BENEATH_TREE_PODZOL_REPLACEABLE = get("minecraft:beneath_tree_podzol_replaceable"); + @Deprecated public static final BlockCategory BIG_DRIPLEAF_PLACEABLE = get("minecraft:big_dripleaf_placeable"); public static final BlockCategory BIRCH_LOGS = get("minecraft:birch_logs"); public static final BlockCategory BLOCKS_WIND_CHARGE_EXPLOSIONS = get("minecraft:blocks_wind_charge_explosions"); public static final BlockCategory BUTTONS = get("minecraft:buttons"); @@ -60,6 +62,10 @@ public final class BlockCategories { public static final BlockCategory CAN_GLIDE_THROUGH = get("minecraft:can_glide_through"); public static final BlockCategory CANDLE_CAKES = get("minecraft:candle_cakes"); public static final BlockCategory CANDLES = get("minecraft:candles"); + public static final BlockCategory CANNOT_REPLACE_BELOW_TREE_TRUNK = get("minecraft:cannot_replace_below_tree_trunk"); + public static final BlockCategory CANNOT_SUPPORT_KELP = get("minecraft:cannot_support_kelp"); + public static final BlockCategory CANNOT_SUPPORT_SEAGRASS = get("minecraft:cannot_support_seagrass"); + public static final BlockCategory CANNOT_SUPPORT_SNOW_LAYER = get("minecraft:cannot_support_snow_layer"); @Deprecated public static final BlockCategory CARPETS = get("minecraft:carpets"); public static final BlockCategory CAULDRONS = get("minecraft:cauldrons"); public static final BlockCategory CAVE_VINES = get("minecraft:cave_vines"); @@ -94,9 +100,11 @@ public final class BlockCategories { public static final BlockCategory DRAGON_IMMUNE = get("minecraft:dragon_immune"); public static final BlockCategory DRAGON_TRANSPARENT = get("minecraft:dragon_transparent"); public static final BlockCategory DRIPSTONE_REPLACEABLE_BLOCKS = get("minecraft:dripstone_replaceable_blocks"); - public static final BlockCategory DRY_VEGETATION_MAY_PLACE_ON = get("minecraft:dry_vegetation_may_place_on"); + @Deprecated public static final BlockCategory DRY_VEGETATION_MAY_PLACE_ON = get("minecraft:dry_vegetation_may_place_on"); public static final BlockCategory EDIBLE_FOR_SHEEP = get("minecraft:edible_for_sheep"); public static final BlockCategory EMERALD_ORES = get("minecraft:emerald_ores"); + public static final BlockCategory ENABLES_BUBBLE_COLUMN_DRAG_DOWN = get("minecraft:enables_bubble_column_drag_down"); + public static final BlockCategory ENABLES_BUBBLE_COLUMN_PUSH_UP = get("minecraft:enables_bubble_column_push_up"); public static final BlockCategory ENCHANTMENT_POWER_PROVIDER = get("minecraft:enchantment_power_provider"); public static final BlockCategory ENCHANTMENT_POWER_TRANSMITTER = get("minecraft:enchantment_power_transmitter"); public static final BlockCategory ENDERMAN_HOLDABLE = get("minecraft:enderman_holdable"); @@ -107,16 +115,22 @@ public final class BlockCategories { public static final BlockCategory FIRE = get("minecraft:fire"); public static final BlockCategory FLOWER_POTS = get("minecraft:flower_pots"); public static final BlockCategory FLOWERS = get("minecraft:flowers"); + public static final BlockCategory FOREST_ROCK_CAN_PLACE_ON = get("minecraft:forest_rock_can_place_on"); public static final BlockCategory FOXES_SPAWNABLE_ON = get("minecraft:foxes_spawnable_on"); public static final BlockCategory FROG_PREFER_JUMP_TO = get("minecraft:frog_prefer_jump_to"); public static final BlockCategory FROGS_SPAWNABLE_ON = get("minecraft:frogs_spawnable_on"); public static final BlockCategory GEODE_INVALID_BLOCKS = get("minecraft:geode_invalid_blocks"); public static final BlockCategory GOATS_SPAWNABLE_ON = get("minecraft:goats_spawnable_on"); public static final BlockCategory GOLD_ORES = get("minecraft:gold_ores"); + public static final BlockCategory GRASS_BLOCKS = get("minecraft:grass_blocks"); + public static final BlockCategory GROWS_CROPS = get("minecraft:grows_crops"); public static final BlockCategory GUARDED_BY_PIGLINS = get("minecraft:guarded_by_piglins"); public static final BlockCategory HAPPY_GHAST_AVOIDS = get("minecraft:happy_ghast_avoids"); public static final BlockCategory HOGLIN_REPELLENTS = get("minecraft:hoglin_repellents"); + public static final BlockCategory HUGE_BROWN_MUSHROOM_CAN_PLACE_ON = get("minecraft:huge_brown_mushroom_can_place_on"); + public static final BlockCategory HUGE_RED_MUSHROOM_CAN_PLACE_ON = get("minecraft:huge_red_mushroom_can_place_on"); public static final BlockCategory ICE = get("minecraft:ice"); + public static final BlockCategory ICE_SPIKE_REPLACEABLE = get("minecraft:ice_spike_replaceable"); public static final BlockCategory IMPERMEABLE = get("minecraft:impermeable"); public static final BlockCategory INCORRECT_FOR_COPPER_TOOL = get("minecraft:incorrect_for_copper_tool"); public static final BlockCategory INCORRECT_FOR_DIAMOND_TOOL = get("minecraft:incorrect_for_diamond_tool"); @@ -151,8 +165,10 @@ public final class BlockCategories { public static final BlockCategory MINEABLE_SHOVEL = get("minecraft:mineable/shovel"); public static final BlockCategory MOB_INTERACTABLE_DOORS = get("minecraft:mob_interactable_doors"); public static final BlockCategory MOOSHROOMS_SPAWNABLE_ON = get("minecraft:mooshrooms_spawnable_on"); + public static final BlockCategory MOSS_BLOCKS = get("minecraft:moss_blocks"); public static final BlockCategory MOSS_REPLACEABLE = get("minecraft:moss_replaceable"); - public static final BlockCategory MUSHROOM_GROW_BLOCK = get("minecraft:mushroom_grow_block"); + public static final BlockCategory MUD = get("minecraft:mud"); + @Deprecated public static final BlockCategory MUSHROOM_GROW_BLOCK = get("minecraft:mushroom_grow_block"); public static final BlockCategory NEEDS_DIAMOND_TOOL = get("minecraft:needs_diamond_tool"); public static final BlockCategory NEEDS_IRON_TOOL = get("minecraft:needs_iron_tool"); public static final BlockCategory NEEDS_STONE_TOOL = get("minecraft:needs_stone_tool"); @@ -161,6 +177,7 @@ public final class BlockCategories { public static final BlockCategory NYLIUM = get("minecraft:nylium"); public static final BlockCategory OAK_LOGS = get("minecraft:oak_logs"); public static final BlockCategory OCCLUDES_VIBRATION_SIGNALS = get("minecraft:occludes_vibration_signals"); + public static final BlockCategory OVERRIDES_MUSHROOM_LIGHT_REQUIREMENT = get("minecraft:overrides_mushroom_light_requirement"); public static final BlockCategory OVERWORLD_CARVER_REPLACEABLES = get("minecraft:overworld_carver_replaceables"); public static final BlockCategory OVERWORLD_NATURAL_LOGS = get("minecraft:overworld_natural_logs"); public static final BlockCategory PALE_OAK_LOGS = get("minecraft:pale_oak_logs"); @@ -172,6 +189,7 @@ public final class BlockCategories { public static final BlockCategory PORTALS = get("minecraft:portals"); public static final BlockCategory PRESSURE_PLATES = get("minecraft:pressure_plates"); public static final BlockCategory PREVENT_MOB_SPAWNING_INSIDE = get("minecraft:prevent_mob_spawning_inside"); + public static final BlockCategory PREVENTS_NEARBY_LEAF_DECAY = get("minecraft:prevents_nearby_leaf_decay"); public static final BlockCategory RABBITS_SPAWNABLE_ON = get("minecraft:rabbits_spawnable_on"); public static final BlockCategory RAILS = get("minecraft:rails"); public static final BlockCategory REDSTONE_ORES = get("minecraft:redstone_ores"); @@ -186,15 +204,15 @@ public final class BlockCategories { public static final BlockCategory SHULKER_BOXES = get("minecraft:shulker_boxes"); public static final BlockCategory SIGNS = get("minecraft:signs"); public static final BlockCategory SLABS = get("minecraft:slabs"); - public static final BlockCategory SMALL_DRIPLEAF_PLACEABLE = get("minecraft:small_dripleaf_placeable"); + @Deprecated public static final BlockCategory SMALL_DRIPLEAF_PLACEABLE = get("minecraft:small_dripleaf_placeable"); public static final BlockCategory SMALL_FLOWERS = get("minecraft:small_flowers"); public static final BlockCategory SMELTS_TO_GLASS = get("minecraft:smelts_to_glass"); public static final BlockCategory SNAPS_GOAT_HORN = get("minecraft:snaps_goat_horn"); public static final BlockCategory SNIFFER_DIGGABLE_BLOCK = get("minecraft:sniffer_diggable_block"); public static final BlockCategory SNIFFER_EGG_HATCH_BOOST = get("minecraft:sniffer_egg_hatch_boost"); public static final BlockCategory SNOW = get("minecraft:snow"); - public static final BlockCategory SNOW_LAYER_CAN_SURVIVE_ON = get("minecraft:snow_layer_can_survive_on"); - public static final BlockCategory SNOW_LAYER_CANNOT_SURVIVE_ON = get("minecraft:snow_layer_cannot_survive_on"); + @Deprecated public static final BlockCategory SNOW_LAYER_CAN_SURVIVE_ON = get("minecraft:snow_layer_can_survive_on"); + @Deprecated public static final BlockCategory SNOW_LAYER_CANNOT_SURVIVE_ON = get("minecraft:snow_layer_cannot_survive_on"); public static final BlockCategory SOUL_FIRE_BASE_BLOCKS = get("minecraft:soul_fire_base_blocks"); public static final BlockCategory SOUL_SPEED_BLOCKS = get("minecraft:soul_speed_blocks"); public static final BlockCategory SPRUCE_LOGS = get("minecraft:spruce_logs"); @@ -205,6 +223,39 @@ public final class BlockCategories { public static final BlockCategory STONE_ORE_REPLACEABLES = get("minecraft:stone_ore_replaceables"); public static final BlockCategory STONE_PRESSURE_PLATES = get("minecraft:stone_pressure_plates"); public static final BlockCategory STRIDER_WARM_BLOCKS = get("minecraft:strider_warm_blocks"); + public static final BlockCategory SUBSTRATE_OVERWORLD = get("minecraft:substrate_overworld"); + public static final BlockCategory SUPPORT_OVERRIDE_CACTUS_FLOWER = get("minecraft:support_override_cactus_flower"); + public static final BlockCategory SUPPORT_OVERRIDE_SNOW_LAYER = get("minecraft:support_override_snow_layer"); + public static final BlockCategory SUPPORTS_AZALEA = get("minecraft:supports_azalea"); + public static final BlockCategory SUPPORTS_BAMBOO = get("minecraft:supports_bamboo"); + public static final BlockCategory SUPPORTS_BIG_DRIPLEAF = get("minecraft:supports_big_dripleaf"); + public static final BlockCategory SUPPORTS_CACTUS = get("minecraft:supports_cactus"); + public static final BlockCategory SUPPORTS_CHORUS_FLOWER = get("minecraft:supports_chorus_flower"); + public static final BlockCategory SUPPORTS_CHORUS_PLANT = get("minecraft:supports_chorus_plant"); + public static final BlockCategory SUPPORTS_COCOA = get("minecraft:supports_cocoa"); + public static final BlockCategory SUPPORTS_CRIMSON_FUNGUS = get("minecraft:supports_crimson_fungus"); + public static final BlockCategory SUPPORTS_CRIMSON_ROOTS = get("minecraft:supports_crimson_roots"); + public static final BlockCategory SUPPORTS_CROPS = get("minecraft:supports_crops"); + public static final BlockCategory SUPPORTS_DRY_VEGETATION = get("minecraft:supports_dry_vegetation"); + public static final BlockCategory SUPPORTS_FROGSPAWN = get("minecraft:supports_frogspawn"); + public static final BlockCategory SUPPORTS_HANGING_MANGROVE_PROPAGULE = get("minecraft:supports_hanging_mangrove_propagule"); + public static final BlockCategory SUPPORTS_LILY_PAD = get("minecraft:supports_lily_pad"); + public static final BlockCategory SUPPORTS_MANGROVE_PROPAGULE = get("minecraft:supports_mangrove_propagule"); + public static final BlockCategory SUPPORTS_MELON_STEM = get("minecraft:supports_melon_stem"); + public static final BlockCategory SUPPORTS_MELON_STEM_FRUIT = get("minecraft:supports_melon_stem_fruit"); + public static final BlockCategory SUPPORTS_NETHER_SPROUTS = get("minecraft:supports_nether_sprouts"); + public static final BlockCategory SUPPORTS_NETHER_WART = get("minecraft:supports_nether_wart"); + public static final BlockCategory SUPPORTS_PUMPKIN_STEM = get("minecraft:supports_pumpkin_stem"); + public static final BlockCategory SUPPORTS_PUMPKIN_STEM_FRUIT = get("minecraft:supports_pumpkin_stem_fruit"); + public static final BlockCategory SUPPORTS_SMALL_DRIPLEAF = get("minecraft:supports_small_dripleaf"); + public static final BlockCategory SUPPORTS_STEM_CROPS = get("minecraft:supports_stem_crops"); + public static final BlockCategory SUPPORTS_STEM_FRUIT = get("minecraft:supports_stem_fruit"); + public static final BlockCategory SUPPORTS_SUGAR_CANE = get("minecraft:supports_sugar_cane"); + public static final BlockCategory SUPPORTS_SUGAR_CANE_ADJACENTLY = get("minecraft:supports_sugar_cane_adjacently"); + public static final BlockCategory SUPPORTS_VEGETATION = get("minecraft:supports_vegetation"); + public static final BlockCategory SUPPORTS_WARPED_FUNGUS = get("minecraft:supports_warped_fungus"); + public static final BlockCategory SUPPORTS_WARPED_ROOTS = get("minecraft:supports_warped_roots"); + public static final BlockCategory SUPPORTS_WITHER_ROSE = get("minecraft:supports_wither_rose"); public static final BlockCategory SWORD_EFFICIENT = get("minecraft:sword_efficient"); public static final BlockCategory SWORD_INSTANTLY_MINES = get("minecraft:sword_instantly_mines"); @Deprecated public static final BlockCategory TALL_FLOWERS = get("minecraft:tall_flowers"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java index 914c539a7c..d44d1c259b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java @@ -445,6 +445,7 @@ public final class BlockTypes { @Nullable public static final BlockType GLOWSTONE = get("minecraft:glowstone"); @Nullable public static final BlockType GOLD_BLOCK = get("minecraft:gold_block"); @Nullable public static final BlockType GOLD_ORE = get("minecraft:gold_ore"); + @Nullable public static final BlockType GOLDEN_DANDELION = get("minecraft:golden_dandelion"); @Nullable public static final BlockType GRANITE = get("minecraft:granite"); @Nullable public static final BlockType GRANITE_SLAB = get("minecraft:granite_slab"); @Nullable public static final BlockType GRANITE_STAIRS = get("minecraft:granite_stairs"); @@ -815,6 +816,7 @@ public final class BlockTypes { @Nullable public static final BlockType POTTED_DEAD_BUSH = get("minecraft:potted_dead_bush"); @Nullable public static final BlockType POTTED_FERN = get("minecraft:potted_fern"); @Nullable public static final BlockType POTTED_FLOWERING_AZALEA_BUSH = get("minecraft:potted_flowering_azalea_bush"); + @Nullable public static final BlockType POTTED_GOLDEN_DANDELION = get("minecraft:potted_golden_dandelion"); @Nullable public static final BlockType POTTED_JUNGLE_SAPLING = get("minecraft:potted_jungle_sapling"); @Nullable public static final BlockType POTTED_LILY_OF_THE_VALLEY = get("minecraft:potted_lily_of_the_valley"); @Nullable public static final BlockType POTTED_MANGROVE_PROPAGULE = get("minecraft:potted_mangrove_propagule"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java index 57077f84d7..da6e45a775 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java @@ -51,7 +51,9 @@ public final class ItemCategories { public static final ItemCategory CAMEL_HUSK_FOOD = get("minecraft:camel_husk_food"); public static final ItemCategory CANDLES = get("minecraft:candles"); @Deprecated public static final ItemCategory CARPETS = get("minecraft:carpets"); + public static final ItemCategory CAT_COLLAR_DYES = get("minecraft:cat_collar_dyes"); public static final ItemCategory CAT_FOOD = get("minecraft:cat_food"); + public static final ItemCategory CAULDRON_CAN_REMOVE_DYE = get("minecraft:cauldron_can_remove_dye"); public static final ItemCategory CHAINS = get("minecraft:chains"); public static final ItemCategory CHERRY_LOGS = get("minecraft:cherry_logs"); public static final ItemCategory CHEST_ARMOR = get("minecraft:chest_armor"); @@ -81,7 +83,8 @@ public final class ItemCategories { public static final ItemCategory DOORS = get("minecraft:doors"); public static final ItemCategory DROWNED_PREFERRED_WEAPONS = get("minecraft:drowned_preferred_weapons"); public static final ItemCategory DUPLICATES_ALLAYS = get("minecraft:duplicates_allays"); - public static final ItemCategory DYEABLE = get("minecraft:dyeable"); + @Deprecated public static final ItemCategory DYEABLE = get("minecraft:dyeable"); + public static final ItemCategory DYES = get("minecraft:dyes"); public static final ItemCategory EGGS = get("minecraft:eggs"); public static final ItemCategory EMERALD_ORES = get("minecraft:emerald_ores"); public static final ItemCategory ENCHANTABLE_ARMOR = get("minecraft:enchantable/armor"); @@ -120,6 +123,7 @@ public final class ItemCategories { public static final ItemCategory GOAT_FOOD = get("minecraft:goat_food"); public static final ItemCategory GOLD_ORES = get("minecraft:gold_ores"); public static final ItemCategory GOLD_TOOL_MATERIALS = get("minecraft:gold_tool_materials"); + public static final ItemCategory GRASS_BLOCKS = get("minecraft:grass_blocks"); public static final ItemCategory HANGING_SIGNS = get("minecraft:hanging_signs"); public static final ItemCategory HAPPY_GHAST_FOOD = get("minecraft:happy_ghast_food"); public static final ItemCategory HAPPY_GHAST_TEMPT_ITEMS = get("minecraft:happy_ghast_tempt_items"); @@ -143,9 +147,14 @@ public final class ItemCategories { public static final ItemCategory LLAMA_TEMPT_ITEMS = get("minecraft:llama_tempt_items"); public static final ItemCategory LOGS = get("minecraft:logs"); public static final ItemCategory LOGS_THAT_BURN = get("minecraft:logs_that_burn"); + public static final ItemCategory LOOM_DYES = get("minecraft:loom_dyes"); + public static final ItemCategory LOOM_PATTERNS = get("minecraft:loom_patterns"); public static final ItemCategory MANGROVE_LOGS = get("minecraft:mangrove_logs"); public static final ItemCategory MAP_INVISIBILITY_EQUIPMENT = get("minecraft:map_invisibility_equipment"); public static final ItemCategory MEAT = get("minecraft:meat"); + public static final ItemCategory METAL_NUGGETS = get("minecraft:metal_nuggets"); + public static final ItemCategory MOSS_BLOCKS = get("minecraft:moss_blocks"); + public static final ItemCategory MUD = get("minecraft:mud"); @Deprecated public static final ItemCategory MUSIC_DISCS = get("minecraft:music_discs"); public static final ItemCategory NAUTILUS_BUCKET_FOOD = get("minecraft:nautilus_bucket_food"); public static final ItemCategory NAUTILUS_FOOD = get("minecraft:nautilus_food"); @@ -221,6 +230,7 @@ public final class ItemCategories { public static final ItemCategory WARPED_STEMS = get("minecraft:warped_stems"); public static final ItemCategory WART_BLOCKS = get("minecraft:wart_blocks"); public static final ItemCategory WITHER_SKELETON_DISLIKED_WEAPONS = get("minecraft:wither_skeleton_disliked_weapons"); + public static final ItemCategory WOLF_COLLAR_DYES = get("minecraft:wolf_collar_dyes"); public static final ItemCategory WOLF_FOOD = get("minecraft:wolf_food"); public static final ItemCategory WOODEN_BUTTONS = get("minecraft:wooden_buttons"); public static final ItemCategory WOODEN_DOORS = get("minecraft:wooden_doors"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java index 8338e10ff1..b862370329 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java @@ -593,6 +593,7 @@ public final class ItemTypes { @Nullable public static final ItemType GOLDEN_BOOTS = get("minecraft:golden_boots"); @Nullable public static final ItemType GOLDEN_CARROT = get("minecraft:golden_carrot"); @Nullable public static final ItemType GOLDEN_CHESTPLATE = get("minecraft:golden_chestplate"); + @Nullable public static final ItemType GOLDEN_DANDELION = get("minecraft:golden_dandelion"); @Nullable public static final ItemType GOLDEN_HELMET = get("minecraft:golden_helmet"); @Nullable public static final ItemType GOLDEN_HOE = get("minecraft:golden_hoe"); @Nullable public static final ItemType GOLDEN_HORSE_ARMOR = get("minecraft:golden_horse_armor"); From 9fc5d68bb76cb2bce21027f719ef03b2220eb529 Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Sat, 21 Mar 2026 15:26:23 +1000 Subject: [PATCH 9/9] [Fabric] RC2 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0bb799a309..e1e30934a7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ cuiProtocol = "4.0.2" errorprone = "2.48.0" -fabric-api = "0.143.14+26.1" +fabric-api = "0.143.15+26.1" neogradle = "7.1.21" neoforge-minecraft = "26.1" @@ -94,7 +94,7 @@ rhino = "org.mozilla:rhino-runtime:1.7.13" jchronic = "com.sk89q:jchronic:0.2.4a" jlibnoise = "com.sk89q.lib:jlibnoise:1.0.0" -fabric-minecraft = "com.mojang:minecraft:26.1-rc-1" +fabric-minecraft = "com.mojang:minecraft:26.1-rc-2" fabric-loader = "net.fabricmc:fabric-loader:0.18.4" fabric-permissions-api = "me.lucko:fabric-permissions-api:0.6.1"