diff --git a/build.gradle.kts b/build.gradle.kts index a52dad60..0e454b76 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { allprojects { group = "org.enginehub.worldeditcui" - version = "${rootProject.libs.versions.minecraft.get()}+02-SNAPSHOT" + version = "${rootProject.libs.versions.minecraft.get()}+01-SNAPSHOT" repositories { // mirrors: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e6dec6c3..1685665d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,23 +3,23 @@ format = { version = "1.1" } [versions] indra = "3.1.3" -minecraft = "1.21.7" -fabricLoader = "0.16.14" -fabricApi = "0.128.1+1.21.7" -modmenu = "15.0.0-beta.3" +minecraft = "1.21.10" +fabricLoader = "0.17.3" +fabricApi = "0.138.0+1.21.10" +modmenu = "16.0.0-rc.1" viafabricplus = "3.3.0" vineflower = "1.10.1" -cuiProtocol = "4.0.1" +cuiProtocol = "4.0.2" [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } -parchment = { module = "org.parchmentmc.data:parchment-1.21.5", version = "2025.06.15" } +parchment = { module = "org.parchmentmc.data:parchment-1.21.9", version = "2025.10.05" } fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabricLoader" } fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabricApi" } fabric-api-bom = { module = "net.fabricmc.fabric-api:fabric-api-bom", version.ref = "fabricApi" } fabric-api-networking = { module = "net.fabricmc.fabric-api:fabric-networking-api-v1" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } -neoforge = { module = "net.neoforged:neoforge", version = "21.7.1-beta"} +neoforge = { module = "net.neoforged:neoforge", version = "21.10.9-beta"} viafabricplus-api = { module = "de.florianmichael:ViaFabricPlus", version.ref = "viafabricplus" } viaversion = { module = "com.viaversion:viaversion-common", version = "5.0.5" } vineflower = { module = "org.vineflower:vineflower", version.ref = "vineflower" } @@ -31,7 +31,7 @@ curseForgeGradle = { id = "net.darkhax.curseforgegradle", version = "1.1.26" } indra-git = { id = "net.kyori.indra.git", version.ref = "indra" } indra-spotlessLicenser = { id = "net.kyori.indra.licenser.spotless", version.ref = "indra" } jvmConflictResolution = { id = "org.gradlex.jvm-dependency-conflict-resolution", version = "2.1.2" } -loom = { id = "dev.architectury.loom", version = "1.10.430" } +loom = { id = "dev.architectury.loom", version = "1.11.454" } minotaur = { id = "com.modrinth.minotaur", version = "2.8.7" } publishGithubRelease = { id = "ca.stellardrift.publish-github-release", version = "0.1.0" } shadow = { id = "com.gradleup.shadow", version = "8.3.5" } @@ -39,9 +39,9 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } versions = { id = "com.github.ben-manes.versions", version = "0.51.0" } [libraries.cuiProtocol-fabric] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.7" +module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-fabric-mc1.21.9" version.ref = "cuiProtocol" [libraries.cuiProtocol-neoforge] -module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.7" +module = "org.enginehub.worldeditcui-protocol:worldeditcui-protocol-neoforge-mc1.21.9" version.ref = "cuiProtocol" diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java index 1d80e5d8..4aa1a01c 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/fabric/FabricModWorldEditCUI.java @@ -9,20 +9,20 @@ */ package org.enginehub.worldeditcui.fabric; -import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import org.enginehub.worldeditcui.WorldEditCUI; import org.enginehub.worldeditcui.config.CUIConfiguration; @@ -49,10 +49,12 @@ public final class FabricModWorldEditCUI implements ModInitializer { public static final String MOD_ID = "worldeditcui"; private static FabricModWorldEditCUI instance; - private static final String KEYBIND_CATEGORY_WECUI = "key.categories.worldeditcui"; - private final KeyMapping keyBindToggleUI = key("toggle", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); - private final KeyMapping keyBindClearSel = key("clear", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); - private final KeyMapping keyBindChunkBorder = key("chunk", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN); + private static final KeyMapping.Category KEYBIND_CATEGORY_WECUI + = new KeyMapping.Category(ResourceLocation.fromNamespaceAndPath(MOD_ID, "general")); + + private final KeyMapping keyBindToggleUI = key("toggle", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindClearSel = key("clear", GLFW.GLFW_KEY_UNKNOWN); + private final KeyMapping keyBindChunkBorder = key("chunk", GLFW.GLFW_KEY_UNKNOWN); private static final List RENDER_PIPELINES = List.of( new OptifinePipelineProvider(), @@ -69,16 +71,18 @@ public final class FabricModWorldEditCUI implements ModInitializer { private boolean visible = true; private int delayedHelo = 0; + private float lastPartialTicks = 0.0f; + /** * Register a key binding * * @param name id, will be used as a localization key under {@code key.worldeditcui.} - * @param type type * @param code default value * @return new, registered keybinding in the mod category */ - private static KeyMapping key(final String name, final InputConstants.Type type, final int code) { - return KeyBindingHelper.registerKeyBinding(new KeyMapping("key." + MOD_ID + '.' + name, type, code, KEYBIND_CATEGORY_WECUI)); + private static KeyMapping key(final String name, final int code) { + return KeyBindingHelper.registerKeyBinding( + new KeyMapping("key." + MOD_ID + '.' + name, code, KEYBIND_CATEGORY_WECUI)); } @Override @@ -94,31 +98,20 @@ public void onInitialize() { ClientLifecycleEvents.CLIENT_STARTED.register(this::onGameInitDone); CUINetworking.subscribeToCuiPacket(this::onPluginMessage); ClientPlayConnectionEvents.JOIN.register(this::onJoinGame); - WorldRenderEvents.AFTER_TRANSLUCENT.register(ctx -> { - if (ctx.advancedTranslucency()) { - try { - RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.matrixStack().last().pose()); - // RenderSystem.applyModelViewMatrix(); - //ctx.worldRenderer().getTranslucentTarget().bindWrite(false); - this.onPostRenderEntities(ctx); - } finally { - //Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - RenderSystem.getModelViewStack().popMatrix(); - } - } + WorldRenderEvents.END_EXTRACTION.register(ctx -> { + // MC now handles this separately to the actual render, due to it occurring across threads. + // We need to store this for later use during actual render. + lastPartialTicks = ctx.tickCounter().getRealtimeDeltaTicks(); }); - WorldRenderEvents.LAST.register(ctx -> { - if (!ctx.advancedTranslucency()) { - try { - RenderSystem.getModelViewStack().pushMatrix(); - RenderSystem.getModelViewStack().mul(ctx.matrixStack().last().pose()); - // RenderSystem.applyModelViewMatrix(); - this.onPostRenderEntities(ctx); - } finally { - RenderSystem.getModelViewStack().popMatrix(); - // RenderSystem.applyModelViewMatrix(); - } + WorldRenderEvents.END_MAIN.register(ctx -> { + try { + RenderSystem.getModelViewStack().pushMatrix(); + RenderSystem.getModelViewStack().mul(ctx.matrices().last().pose()); + // RenderSystem.applyModelViewMatrix(); + this.onPostRenderEntities(ctx); + } finally { + RenderSystem.getModelViewStack().popMatrix(); + // RenderSystem.applyModelViewMatrix(); } }); } @@ -194,7 +187,7 @@ public void onJoinGame(final ClientPacketListener handler, final PacketSender se public void onPostRenderEntities(final WorldRenderContext ctx) { if (this.visible) { - this.worldRenderListener.onRender(ctx.tickCounter().getRealtimeDeltaTicks()); + this.worldRenderListener.onRender(lastPartialTicks); } } diff --git a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java index cda0bae1..d611e003 100644 --- a/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java +++ b/worldeditcui-fabric/src/main/java/org/enginehub/worldeditcui/gui/CUIConfigList.java @@ -28,9 +28,11 @@ import net.minecraft.util.FormattedCharSequence; import org.enginehub.worldeditcui.config.CUIConfiguration; import org.enginehub.worldeditcui.config.Colour; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import java.util.List; +import java.util.Objects; public class CUIConfigList extends ContainerObjectSelectionList { private static final Logger LOGGER = LogUtils.getLogger(); @@ -87,21 +89,12 @@ public OnOffEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { - super.render(gfx, index, top, left, width, height, mouseX, mouseY, isMouseOver, partialTick); - - this.toggleBotton.setX(left + 105); - this.toggleBotton.setY(top); - this.toggleBotton.render(gfx, mouseX, mouseY, partialTick); - } - - @Override - public List children() { + public @NotNull List children() { return ImmutableList.of(this.resetButton, this.toggleBotton); } @Override - public List narratables() { + public @NotNull List narratables() { return ImmutableList.of(this.resetButton, this.toggleBotton); } @@ -109,6 +102,15 @@ public List narratables() { protected void updateFromConfig() { this.toggleBotton.setValue((Boolean)configuration.getConfigArray().get(tag)); } + + @Override + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + super.renderContent(gfx, mouseX, mouseY, isMouseOver, partialTick); + + this.toggleBotton.setX(getRowLeft() + 105); + this.toggleBotton.setY(getY()); + this.toggleBotton.render(gfx, mouseX, mouseY, partialTick); + } } public class ColorConfigEntry extends ConfigEntry { @@ -127,7 +129,7 @@ public ColorConfigEntry(String tag) { configuration.changeValue(tag, tested); } }); - textField.setFormatter((string, integer) -> { + textField.addFormatter((string, integer) -> { final String colorSource = textField.getValue(); if (colorSource.length() != 9) { return FormattedCharSequence.forward(string, invalidFormat); @@ -155,20 +157,12 @@ public ColorConfigEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { - super.render(gfx, index, top, left, width, height, mouseX, mouseY, isMouseOver, partialTick); - this.textField.setX(left + 105); - this.textField.setY(top); - this.textField.render(gfx, mouseX, mouseY, partialTick); - } - - @Override - public List children() { + public @NotNull List children() { return ImmutableList.of(this.resetButton, this.textField); } @Override - public List narratables() { + public @NotNull List narratables() { return ImmutableList.of(this.resetButton, this.textField); } @@ -176,6 +170,14 @@ public List narratables() { protected void updateFromConfig() { this.textField.setValue(((Colour)configuration.getConfigArray().get(tag)).hexString()); } + + @Override + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + super.renderContent(gfx, mouseX, mouseY, isMouseOver, partialTick); + this.textField.setX(getRowLeft() + 105); + this.textField.setY(getY()); + this.textField.render(gfx, mouseX, mouseY, partialTick); + } } public abstract class ConfigEntry extends ContainerObjectSelectionList.Entry { @@ -186,13 +188,14 @@ public abstract class ConfigEntry extends ContainerObjectSelectionList.Entry { + this.resetButton = Button.builder(Component.translatable("controls.reset"), button -> { configuration.changeValue(tag, configuration.getDefaultValue(tag)); updateFromConfig(); }).bounds(0, 0, 50, BUTTON_HEIGHT).build(); - textField = new StringWidget(configuration.getDescription(tag), minecraft.font); - textField.alignLeft(); + + textField = new StringWidget(Objects.requireNonNull(configuration.getDescription(tag)), minecraft.font); + //textField.alignLeft(); Component tooltip = configuration.getTooltip(tag); if (tooltip != null) { textField.setTooltip(Tooltip.create(tooltip)); @@ -200,7 +203,11 @@ public ConfigEntry(String tag) { } @Override - public void render(GuiGraphics gfx, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTick) { + public void renderContent(GuiGraphics gfx, int mouseX, int mouseY, boolean hovered, float partialTick) { + // new API handles entry position internally + int left = this.getX(); + int top = this.getY(); // or getRowTop() + int textLeft = left + 90 - maxNameWidth; this.textField.setX(textLeft); diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json index 0483f9f7..f4504c79 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/de_de.json @@ -3,7 +3,7 @@ "key.worldeditcui.toggle": "CUI Sichtbarkeit An/Aus", "key.worldeditcui.clear": "WorldEdit Auswahl aufheben", "key.worldeditcui.chunk": "Chunkgrenzen An/Aus", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Quader Randfarbe", "worldeditcui.color.cuboidedge.tooltip": "Wähle die Farbe für den Rand einer Quader-Region aus", "worldeditcui.color.cuboidgrid": "Quader Rasterfarbe", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json index d2766435..8cb54396 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/en_us.json @@ -3,7 +3,7 @@ "key.worldeditcui.toggle": "Toggle CUI visibility", "key.worldeditcui.clear": "Clear WorldEdit selection", "key.worldeditcui.chunk": "Toggle Chunk Border", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Cuboid Edge Color", "worldeditcui.color.cuboidedge.tooltip": "Select the color for the edge of a cuboid region", "worldeditcui.color.cuboidgrid": "Cuboid Grid Color", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json index 085eb37d..f1beee7e 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/fr_fr.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Options WorldEditCUI", "key.worldeditcui.toggle": "Bascule Visibilité du CUI", "key.worldeditcui.clear": "Effacer la sélection WorldEdit", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Couleur des bordures du Cuboïde", "worldeditcui.color.cuboidgrid": "Couleur de la grille du Cuboïde", "worldeditcui.color.cuboidpoint1": "Couleur du premier point du Cuboïde", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json index a22f4f1c..c4cf90fa 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/nl_nl.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "WorldEditCUI Opties", "key.worldeditcui.toggle": "CUI zichtbaarheid omschakelen", "key.worldeditcui.clear": "WorldEdit selectie verwijderen", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Randkleur Balk", "worldeditcui.color.cuboidgrid": "Roosterkleur Balk", "worldeditcui.color.cuboidpoint1": "Eerste punt kleur Balk", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json index d614399f..f100b894 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/ru_ru.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Настройки WorldEditCUI", "key.worldeditcui.toggle": "Переключить видимость CUI", "key.worldeditcui.clear": "Очистить выделение WorldEdit", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Цвет границ кубоида", "worldeditcui.color.cuboidgrid": "Цвет сетки кубоида", "worldeditcui.color.cuboidpoint1": "Цвет первой точки кубоида", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json index ec6ec3e7..85f27714 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/uk_ua.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "Налаштування WorldEditCUI", "key.worldeditcui.toggle": "Перемкнути видимість CUI", "key.worldeditcui.clear": "Очистити виділення", - "key.categories.worldeditcui": "WorldEditCUI", + "key.category.worldeditcui.general": "WorldEditCUI", "worldeditcui.color.cuboidedge": "Колір границі кубоїда", "worldeditcui.color.cuboidgrid": "Колір сітки кубоїда", "worldeditcui.color.cuboidpoint1": "Колір першої точки кубоїда", diff --git a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json index 5548d40b..b73f0a55 100644 --- a/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json +++ b/worldeditcui-fabric/src/main/resources/assets/worldeditcui/lang/zh_cn.json @@ -2,7 +2,7 @@ "worldeditcui.options.title": "WorldEditCUI选项", "key.worldeditcui.toggle": "显示/隐藏 WECUI", "key.worldeditcui.clear": "取消WorldEdit选择区域", - "key.categories.worldeditcui": "WorldEditCUI按键设置", + "key.category.worldeditcui.general": "WorldEditCUI按键设置", "worldeditcui.color.cuboidedge": "长方体边缘颜色", "worldeditcui.color.cuboidgrid": "长方体网格颜色", "worldeditcui.color.cuboidpoint1": "长方体第一点颜色", diff --git a/worldeditcui-fabric/src/main/resources/fabric.mod.json b/worldeditcui-fabric/src/main/resources/fabric.mod.json index 8573bacf..579d7190 100644 --- a/worldeditcui-fabric/src/main/resources/fabric.mod.json +++ b/worldeditcui-fabric/src/main/resources/fabric.mod.json @@ -43,10 +43,10 @@ "fabric-screen-api-v1": ">=1.0.9", "fabric-resource-loader-v0": ">=0.4.17", "fabric-transitive-access-wideners-v1": "*", - "minecraft": ">=1.21.5" + "minecraft": ">=1.21.9" }, "suggests": { - "worldedit": ">=7.3.12" + "worldedit": ">=7.3.17" }, "breaks": { "worldedit": ["7.3.1", "7.3.2", "7.3.3", "7.3.4-beta-01", "7.3.4", "7.3.5", "7.3.6", "7.3.7", "7.3.8", "7.3.9-beta-01", "7.3.9", "7.3.10-beta-01", "7.3.10", "7.3.11", "7.3.12-beta-01", "7.3.12-beta-02"]