diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d816408..3789492 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: - name: setup jdk uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '25' distribution: 'microsoft' - name: make gradle wrapper executable run: chmod +x ./gradlew @@ -27,4 +27,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: Artifacts - path: build/libs/ \ No newline at end of file + path: build/libs/ diff --git a/build.gradle b/build.gradle index 99dbbc0..73934b5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" + id 'net.fabricmc.fabric-loom' version "${loom_version}" id 'maven-publish' } @@ -26,12 +26,11 @@ loom { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings loom.officialMojangMappings() - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + implementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" + implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + implementation "maven.modrinth:midnightlib:${project.midnightlib_version}" include "maven.modrinth:midnightlib:${project.midnightlib_version}" } @@ -46,7 +45,7 @@ processResources { tasks.withType(JavaCompile).configureEach { // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. // The new Minecraft 1.20.5 upwards uses Java 21 - it.options.release = 21 + it.options.release = 25 } java { @@ -55,8 +54,8 @@ java { // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 } jar { @@ -83,4 +82,4 @@ publishing { // The repositories here will be used for publishing your artifact, not for // retrieving dependencies. } -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index f58f9d9..0d05d98 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,15 +6,15 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21.11 - loader_version=0.18.2 - loom_version=1.14-SNAPSHOT + minecraft_version=26.1 + loader_version=0.18.6 + loom_version=1.15-SNAPSHOT # Mod Properties - mod_version = 1.8.2-1.21.11 + mod_version = 1.8.3-26.1 maven_group = one.pouekdev archives_base_name = coordinatelist # Dependencies - fabric_version=0.139.4+1.21.11 - midnightlib_version=1.9.2+1.21.11-fabric + fabric_version=0.144.4+26.1 + midnightlib_version=1.9.2+26.1-fabric diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d205b54..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/src/main/java/one/pouekdev/coordinatelist/CListClient.java b/src/main/java/one/pouekdev/coordinatelist/CListClient.java index db917aa..e653f05 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListClient.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListClient.java @@ -2,7 +2,7 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; import net.minecraft.client.KeyMapping; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.multiplayer.ClientLevel; @@ -27,19 +27,19 @@ public class CListClient implements ClientModInitializer{ @Override public void onInitializeClient(){ - openWaypointsKeybind = KeyBindingHelper.registerKeyBinding(new KeyMapping( + openWaypointsKeybind = KeyMappingHelper.registerKeyMapping(new KeyMapping( "keybinds.waypoints.menu", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_M, MOD_CATEGORY )); - addAWaypoint = KeyBindingHelper.registerKeyBinding(new KeyMapping( + addAWaypoint = KeyMappingHelper.registerKeyMapping(new KeyMapping( "keybinds.waypoint.add", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_B, MOD_CATEGORY )); - toggleVisibility = KeyBindingHelper.registerKeyBinding(new KeyMapping( + toggleVisibility = KeyMappingHelper.registerKeyMapping(new KeyMapping( "keybinds.waypoints.toggle", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_J, @@ -119,6 +119,21 @@ public static void addNewWaypoint(int x, int y, int z, boolean death, boolean vi String waypointName; if(death){ waypointName = Component.translatable("waypoint.last.death").getString(); + if(CListConfig.maxDeathWaypoints >= 1){ + List deathIndices = new java.util.ArrayList<>(); + for(int i = 0; i < variables.waypoints.size(); i++){ + if(variables.waypoints.get(i).deathpoint && !variables.waypoints.get(i).permanent){ + deathIndices.add(i); + } + } + while(deathIndices.size() >= CListConfig.maxDeathWaypoints){ + deleteWaypoint(deathIndices.get(0)); + deathIndices.remove(0); + for(int i = 0; i < deathIndices.size(); i++){ + deathIndices.set(i, deathIndices.get(i) - 1); + } + } + } } else{ waypointName = Component.translatable("waypoint.new.waypoint").getString(); @@ -208,4 +223,4 @@ public static void checkIfSaveIsNeeded(boolean force){ variables.savedSinceLastUpdate = true; } } -} \ No newline at end of file +} diff --git a/src/main/java/one/pouekdev/coordinatelist/CListCommand.java b/src/main/java/one/pouekdev/coordinatelist/CListCommand.java index 4e6ed74..cf69e62 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListCommand.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommands; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.commands.CommandBuildContext; @@ -11,10 +11,10 @@ public class CListCommand implements ClientCommandRegistrationCallback{ @Override public void register(CommandDispatcher dispatcher, @NonNull CommandBuildContext buildContext){ - dispatcher.register(ClientCommandManager.literal("clist") - .then(ClientCommandManager.argument("x", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) - .then(ClientCommandManager.argument("y", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) - .then(ClientCommandManager.argument("z", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) + dispatcher.register(ClientCommands.literal("clist") + .then(ClientCommands.argument("x", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) + .then(ClientCommands.argument("y", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) + .then(ClientCommands.argument("z", IntegerArgumentType.integer(Integer.MIN_VALUE, Integer.MAX_VALUE)) .executes(ctx -> { int x = IntegerArgumentType.getInteger(ctx, "x"); int y = IntegerArgumentType.getInteger(ctx, "y"); @@ -27,4 +27,4 @@ public void register(CommandDispatcher dispatcher, @N ) ); } -} \ No newline at end of file +} diff --git a/src/main/java/one/pouekdev/coordinatelist/CListConfig.java b/src/main/java/one/pouekdev/coordinatelist/CListConfig.java index fb2c25e..950ec79 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListConfig.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListConfig.java @@ -9,4 +9,5 @@ public class CListConfig extends MidnightConfig { @Entry public static boolean canPlaceDeathpoints = true; @Entry public static boolean waypointTextBackground = true; @Entry public static boolean squareWaypoints = false; + @Entry(min=0) public static int maxDeathWaypoints = 1; } diff --git a/src/main/java/one/pouekdev/coordinatelist/CListData.java b/src/main/java/one/pouekdev/coordinatelist/CListData.java index 9eee1b5..ab82eeb 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListData.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListData.java @@ -20,7 +20,7 @@ public static void saveListToFile(String fileName, List waypointL File file = new File(dataDir, fileName); try(PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)))){ for(int i = 0; i < waypointList.size(); i++){ - writer.println(CListClient.variables.waypoints.get(i).getCoordinates() + "~" + CListClient.variables.waypoints.get(i).name.replaceAll("~", "") + "~" + CListClient.variables.waypoints.get(i).dimension + "~" + CListClient.variables.colors.get(i).getHexNoAlpha() + "~" + CListClient.variables.waypoints.get(i).render + "~" + CListClient.variables.waypoints.get(i).deathpoint); + writer.println(CListClient.variables.waypoints.get(i).getCoordinates() + "~" + CListClient.variables.waypoints.get(i).name.replaceAll("~", "") + "~" + CListClient.variables.waypoints.get(i).dimension + "~" + CListClient.variables.colors.get(i).getHexNoAlpha() + "~" + CListClient.variables.waypoints.get(i).render + "~" + CListClient.variables.waypoints.get(i).deathpoint + "~" + CListClient.variables.waypoints.get(i).permanent+ "~" + CListClient.variables.waypoints.get(i).originalX + "~" + CListClient.variables.waypoints.get(i).originalZ + "~" + CListClient.variables.waypoints.get(i).hasOriginalCoords); } } catch(IOException ignored){} @@ -41,14 +41,22 @@ public static List loadListFromFile(String fileName){ String coords = segments[0]; String name = segments[1]; String dimension = segments[2]; - String color = null, bool = null, deathpoint = null; + String color = null, bool = null, deathpoint = null, permanent = null, originalX = null, originalZ = null, hasOriginals = null; try{ color = segments[3]; bool = segments[4]; deathpoint = segments[5]; + permanent = segments[6]; + originalX = segments[7]; + originalZ = segments[8]; + hasOriginals = segments[9]; } catch(IndexOutOfBoundsException ignored){} CListWaypoint waypoint = new CListWaypoint(coords, name, dimension, Boolean.parseBoolean(bool), Boolean.parseBoolean(deathpoint)); + waypoint.permanent = Boolean.parseBoolean(permanent); + if(originalX != null) waypoint.originalX = Integer.parseInt(originalX); + if(originalZ != null) waypoint.originalZ = Integer.parseInt(originalZ); + waypoint.hasOriginalCoords = Boolean.parseBoolean(hasOriginals); if(color == null){ CListClient.addRandomWaypointColor(); } diff --git a/src/main/java/one/pouekdev/coordinatelist/CListRenderLayers.java b/src/main/java/one/pouekdev/coordinatelist/CListRenderLayers.java index d642748..2ea9d6c 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListRenderLayers.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListRenderLayers.java @@ -1,7 +1,9 @@ package one.pouekdev.coordinatelist; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; +import com.mojang.blaze3d.pipeline.ColorTargetState; +import com.mojang.blaze3d.pipeline.DepthStencilState; +import com.mojang.blaze3d.platform.CompareOp; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.rendertype.LayeringTransform; import net.minecraft.client.renderer.rendertype.RenderSetup; @@ -9,6 +11,7 @@ import net.minecraft.util.Util; import net.minecraft.resources.Identifier; +import java.util.Optional; import java.util.function.Function; public class CListRenderLayers{ @@ -16,9 +19,8 @@ public class CListRenderLayers{ RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET) .withLocation("pipeline/position_tex_color") .withCull(false) - .withoutBlend() - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(true) + .withColorTargetState(new ColorTargetState(Optional.empty(), ColorTargetState.WRITE_ALL)) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, true)) .build() ); public static final Function POSITION_TEX_COLOR = Util.memoize( diff --git a/src/main/java/one/pouekdev/coordinatelist/CListReverseColoredQuadGuiElementRenderState.java b/src/main/java/one/pouekdev/coordinatelist/CListReverseColoredQuadGuiElementRenderState.java index 0c5f552..cd900b6 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListReverseColoredQuadGuiElementRenderState.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListReverseColoredQuadGuiElementRenderState.java @@ -4,7 +4,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.navigation.ScreenRectangle; -import net.minecraft.client.gui.render.state.GuiElementRenderState; +import net.minecraft.client.renderer.state.gui.GuiElementRenderState; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.gui.render.TextureSetup; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/one/pouekdev/coordinatelist/CListWaypoint.java b/src/main/java/one/pouekdev/coordinatelist/CListWaypoint.java index 8f081c2..272dcbd 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListWaypoint.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListWaypoint.java @@ -10,6 +10,10 @@ public class CListWaypoint{ private int bugFix; public boolean render; public boolean deathpoint; + public boolean permanent; + public int originalX; + public int originalZ; + public boolean hasOriginalCoords; CListWaypoint(String coords, String waypointName, String waypointDimension, boolean isRendered, boolean isDeathpoint){ String s = coords; @@ -25,6 +29,7 @@ public class CListWaypoint{ this.dimension = waypointDimension; this.render = isRendered; this.deathpoint = isDeathpoint; + this.permanent = false; this.bugFix = 0; } @@ -36,6 +41,7 @@ public class CListWaypoint{ this.dimension = waypointDimension; this.render = isRendered; this.deathpoint = isDeathpoint; + this.permanent = false; this.bugFix = 0; } diff --git a/src/main/java/one/pouekdev/coordinatelist/CListWaypointConfig.java b/src/main/java/one/pouekdev/coordinatelist/CListWaypointConfig.java index 22a3520..c501618 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListWaypointConfig.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListWaypointConfig.java @@ -10,7 +10,7 @@ import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.client.renderer.RenderPipelines; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.input.CharacterEvent; import net.minecraft.client.input.KeyEvent; @@ -36,6 +36,7 @@ public class CListWaypointConfig extends Screen{ private SpriteButton changeColor; private HSVSlider h, s, v; private static float[] hsv; + private Button permanentButton; public CListWaypointConfig(Component title, int waypointId, boolean viaKeybind){ super(title); @@ -93,6 +94,17 @@ protected void init(){ addRenderableWidget(this.x); addRenderableWidget(this.y); addRenderableWidget(this.z); + + if(waypoint.deathpoint){ + permanentButton = Button.builder(getPermanentText(), button -> { + waypoint.permanent = !waypoint.permanent; + permanentButton.setMessage(getPermanentText()); + CListClient.variables.savedSinceLastUpdate = false; + }).width(150).build(); + permanentButton.setX((this.width - 150) / 2); + permanentButton.setY((this.height - 20) / 2 + 80); + addRenderableWidget(permanentButton); + } changeColor = new SpriteButton((this.width - 50) / 2 + 38, (this.height - 20) / 2 - 15, 12, 12, button -> renderColorPicker = !renderColorPicker); this.h = new HSVSlider((this.width - 50) / 2, (this.height - 20) / 2 - 15, 110, 15, Component.literal("H: " + hsv[0]), hsv[0] / 360, 0); this.s = new HSVSlider((this.width - 50) / 2, (this.height - 20) / 2 + 3, 110, 15, Component.literal("S: " + hsv[1]), hsv[1] / 100, 1); @@ -158,7 +170,7 @@ private Identifier getHandleSprite() { } @Override - public void renderWidget(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){ + public void extractWidgetRenderState(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){ GlStateManager._enableBlend(); GlStateManager._enableDepthTest(); // consider the following https://github.com/0x3C50/Renderer @@ -168,7 +180,7 @@ public void renderWidget(@NonNull GuiGraphics guiGraphics, int mouseX, int mouse for(int i = 0; i < this.width; i++){ float hue = i / (float) this.width; int colorH = Color.HSBtoRGB(hue, colorFloat[1], colorFloat[2]); - guiGraphics.vLine(this.getX() + i, this.getY() - 1, this.getY() + this.height, colorH); + guiGraphics.verticalLine(this.getX() + i, this.getY() - 1, this.getY() + this.height, colorH); } } else{ @@ -181,10 +193,10 @@ public void renderWidget(@NonNull GuiGraphics guiGraphics, int mouseX, int mouse colorStart = 0xFF000000; colorEnd = Color.HSBtoRGB(colorFloat[0], colorFloat[1], 1.0f); } - guiGraphics.guiRenderState.submitGuiElement(new CListReverseColoredQuadGuiElementRenderState(RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(guiGraphics.pose()), this.getX(), this.getY(), this.getX() + this.width, this.getY() + this.height, colorStart, colorEnd, guiGraphics.scissorStack.peek())); + guiGraphics.guiRenderState.addGuiElement(new CListReverseColoredQuadGuiElementRenderState(RenderPipelines.GUI, TextureSetup.noTexture(), new Matrix3x2f(guiGraphics.pose()), this.getX(), this.getY(), this.getX() + this.width, this.getY() + this.height, colorStart, colorEnd, guiGraphics.scissorStack.peek())); } guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, this.getHandleSprite(), this.getX() + (int)(this.value * (double)(this.width - 8)), this.getY(), 8, this.getHeight(), ARGB.white(this.alpha)); - this.renderScrollingStringOverContents(guiGraphics.textRendererForWidget(this, GuiGraphics.HoveredTextEffects.NONE), this.getMessage(), 2); + this.extractScrollingStringOverContents(guiGraphics.textRendererForWidget(this, GuiGraphicsExtractor.HoveredTextEffects.NONE), this.getMessage(), 2); if(this.isHovered()){ guiGraphics.requestCursor(this.dragging ? CursorTypes.RESIZE_EW : CursorTypes.POINTING_HAND); } @@ -211,7 +223,7 @@ public SpriteButton(int x, int y, int width, int height, OnPress onPress){ } @Override - public void renderContents(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){ + public void extractContents(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){ Identifier icon = Identifier.fromNamespaceAndPath("coordinatelist", "icon/change"); GlStateManager._enableBlend(); guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, icon, getX(), getY(), width, height); @@ -220,7 +232,7 @@ public void renderContents(GuiGraphics guiGraphics, int mouseX, int mouseY, floa } @Override - public void render(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){ + public void extractRenderState(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){ int SQUARE_SIZE = 50; int centerX = this.width / 2; int centerY = this.height / 2; @@ -235,9 +247,9 @@ public void render(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, flo int top = centerY - SQUARE_SIZE / 2; int right = centerX + SQUARE_SIZE / 2; int bottom = centerY + SQUARE_SIZE / 2; - super.render(guiGraphics, mouseX, mouseY, delta); + super.extractRenderState(guiGraphics, mouseX, mouseY, delta); guiGraphics.fill(left, top, right, bottom, CListClient.variables.colors.get(id).getHex()); - changeColor.render(guiGraphics, mouseX, mouseY, delta); + changeColor.extractRenderState(guiGraphics, mouseX, mouseY, delta); if(renderColorPicker){ this.h.visible = true; this.s.visible = true; @@ -273,12 +285,16 @@ private void setValues(){ } if(this.x.isFocused() && isParsableToInt(x.getValue())){ waypoint.x = Integer.parseInt(x.getValue()); + waypoint.originalX = 0; + waypoint.hasOriginalCoords = false; } if(this.y.isFocused() && isParsableToInt(y.getValue())){ waypoint.y = Integer.parseInt(y.getValue()); } if(this.z.isFocused() && isParsableToInt(z.getValue())){ waypoint.z = Integer.parseInt(z.getValue()); + waypoint.originalZ = 0; + waypoint.hasOriginalCoords = false; } CListClient.variables.savedSinceLastUpdate = false; } @@ -301,4 +317,10 @@ public boolean keyPressed(@NonNull KeyEvent event){ } return true; } + + private Component getPermanentText(){ + return waypoint.permanent + ? Component.translatable("waypoint.permanent.on") + : Component.translatable("waypoint.permanent.off"); + } } diff --git a/src/main/java/one/pouekdev/coordinatelist/CListWaypointScreen.java b/src/main/java/one/pouekdev/coordinatelist/CListWaypointScreen.java index 70513aa..b58f02d 100644 --- a/src/main/java/one/pouekdev/coordinatelist/CListWaypointScreen.java +++ b/src/main/java/one/pouekdev/coordinatelist/CListWaypointScreen.java @@ -8,7 +8,7 @@ import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.input.MouseButtonEvent; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -86,8 +86,8 @@ protected void init(){ } @Override - public void render(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){ - super.render(guiGraphics, mouseX, mouseY, delta); + public void extractRenderState(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){ + super.extractRenderState(guiGraphics, mouseX, mouseY, delta); if(selectedWaypointId >= 0){ copyCoordinatesButton.active = true; editWaypointButton.active = true; @@ -102,6 +102,52 @@ public void render(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, flo @Override public boolean mouseClicked(@NonNull MouseButtonEvent mouseButtonEvent, boolean doubled){ + if(mouseButtonEvent.button() == 1 && selectedWaypointId >= 0){ + if(mouseButtonEvent.x() >= copyCoordinatesButton.getX() && + mouseButtonEvent.x() <= copyCoordinatesButton.getX() + copyCoordinatesButton.getWidth() && + mouseButtonEvent.y() >= copyCoordinatesButton.getY() && + mouseButtonEvent.y() <= copyCoordinatesButton.getY() + copyCoordinatesButton.getHeight()){ + CListWaypoint waypoint = CListClient.variables.waypoints.get(selectedWaypointId); + if(waypoint.dimension.equals("minecraft:the_nether")){ + if(waypoint.hasOriginalCoords){ + waypoint.x = waypoint.originalX; + waypoint.z = waypoint.originalZ; + waypoint.hasOriginalCoords = false; + } + else{ + waypoint.originalX = waypoint.x; + waypoint.originalZ = waypoint.z; + waypoint.hasOriginalCoords = true; + waypoint.x = waypoint.x * 8; + waypoint.z = waypoint.z * 8; + } + waypoint.dimension = "minecraft:overworld"; + } + else if(waypoint.dimension.equals("minecraft:overworld")){ + if(waypoint.hasOriginalCoords){ + waypoint.x = waypoint.originalX; + waypoint.z = waypoint.originalZ; + waypoint.hasOriginalCoords = false; + } + else{ + waypoint.originalX = waypoint.x; + waypoint.originalZ = waypoint.z; + waypoint.hasOriginalCoords = true; + waypoint.x = (int) Math.round(waypoint.x / 8.0); + waypoint.z = (int) Math.round(waypoint.z / 8.0); + } + waypoint.dimension = "minecraft:the_nether"; + } + else{ + return super.mouseClicked(mouseButtonEvent, doubled); + } + copyCoordinatesButton.setMessage(Component.literal(waypoint.x + " " + waypoint.y + " " + waypoint.z)); + list.refreshElements(); + list.setFocused(list.children().get(selectedWaypointId)); + CListClient.variables.savedSinceLastUpdate = false; + return true; + } + } return super.mouseClicked(mouseButtonEvent, doubled); } @@ -145,7 +191,7 @@ public InvisibleButton(int x, int y, int width, int height, OnPress onPress){ } @Override - public void renderContents(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){} + public void extractContents(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){} } private static class SpriteButton extends Button{ @@ -157,7 +203,7 @@ public SpriteButton(int x, int y, int width, int height, OnPress onPress, int co } @Override - public void renderContents(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, float delta){ + public void extractContents(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float delta){ Identifier eyeIcon; if(CListClient.variables.waypoints.get(id).render){ eyeIcon = Identifier.fromNamespaceAndPath("coordinatelist", "icon/visible"); @@ -200,19 +246,19 @@ public ScrollListEntry(int id){ } @Override - public void renderContent(@NonNull GuiGraphics guiGraphics, int mouseX, int mouseY, boolean hovered, float deltaTicks){ + public void extractContent(@NonNull GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, boolean hovered, float deltaTicks){ int x = this.getX(); int y = this.getY(); visibility.setX(x + 5); visibility.setY(y + 6); select.setX(x); select.setY(y); - visibility.render(guiGraphics, mouseX, mouseY, deltaTicks); - select.render(guiGraphics, mouseX, mouseY, deltaTicks); + visibility.extractRenderState(guiGraphics, mouseX, mouseY, deltaTicks); + select.extractRenderState(guiGraphics, mouseX, mouseY, deltaTicks); int fontWidth = font.width("The nether"); - ActiveTextCollector collector = guiGraphics.textRenderer(GuiGraphics.HoveredTextEffects.TOOLTIP_AND_CURSOR); + ActiveTextCollector collector = guiGraphics.textRenderer(GuiGraphicsExtractor.HoveredTextEffects.TOOLTIP_AND_CURSOR); collector.acceptScrolling(dimension, x + 183 + fontWidth / 2, x + 183, x + 183 + fontWidth, y + 2, y + font.lineHeight + 12); - guiGraphics.drawString(CListVariables.minecraftClient.font, waypointName.getString(), x + 25, y + 8, CListClient.variables.colors.get(id).getHex()); + guiGraphics.text(CListVariables.minecraftClient.font, waypointName.getString(), x + 25, y + 8, CListClient.variables.colors.get(id).getHex()); } @Override @@ -241,4 +287,4 @@ public boolean mouseReleased(@NonNull MouseButtonEvent mouseButtonEvent){ } } } -} \ No newline at end of file +} diff --git a/src/main/java/one/pouekdev/coordinatelist/mixin/CListChatGrabber.java b/src/main/java/one/pouekdev/coordinatelist/mixin/CListChatGrabber.java index 6f6524a..29414a3 100644 --- a/src/main/java/one/pouekdev/coordinatelist/mixin/CListChatGrabber.java +++ b/src/main/java/one/pouekdev/coordinatelist/mixin/CListChatGrabber.java @@ -1,7 +1,7 @@ package one.pouekdev.coordinatelist.mixin; import net.minecraft.client.gui.components.ChatComponent; -import net.minecraft.client.GuiMessage; +import net.minecraft.client.multiplayer.chat.GuiMessage; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.ChatFormatting; @@ -36,7 +36,7 @@ private void getCoordsFromChat(GuiMessage message, CallbackInfo ci){ int y = Math.round(Float.parseFloat(numbersList.get(1))); int z = Math.round(Float.parseFloat(numbersList.get(2))); Component clickableMessage = Component.translatable("chat.create.waypoint.message").withStyle(ChatFormatting.GREEN).withStyle(style -> style.withClickEvent(new ClickEvent.RunCommand("/clist " + x + " " + y + " " + z))); - CListVariables.delayedEvents.add(new CListDelayedEvent(0.1f, () -> CListVariables.minecraftClient.gui.getChat().addMessage(clickableMessage))); + CListVariables.delayedEvents.add(new CListDelayedEvent(0.1f, () -> CListVariables.minecraftClient.gui.getChat().addClientSystemMessage(clickableMessage))); } } } diff --git a/src/main/java/one/pouekdev/coordinatelist/mixin/CListWaypointRenderer.java b/src/main/java/one/pouekdev/coordinatelist/mixin/CListWaypointRenderer.java index 65aa8ac..12ef326 100644 --- a/src/main/java/one/pouekdev/coordinatelist/mixin/CListWaypointRenderer.java +++ b/src/main/java/one/pouekdev/coordinatelist/mixin/CListWaypointRenderer.java @@ -8,7 +8,6 @@ import net.minecraft.client.gui.Font; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; @@ -140,10 +139,10 @@ private void afterRender(CallbackInfo ci) { float h = (float) (-textWidth / 2); MultiBufferSource.BufferSource b = CListVariables.minecraftClient.renderBuffers().bufferSource(); if(CListConfig.waypointTextBackground){ - font.drawInBatch(labelText, h, 0, 0xFFFFFFFF, false, positionMatrix, b, Font.DisplayMode.SEE_THROUGH, 0x90000000, LightTexture.FULL_BRIGHT); + font.drawInBatch(labelText, h, 0, 0xFFFFFFFF, false, positionMatrix, b, Font.DisplayMode.SEE_THROUGH, 0x90000000, 0xF000F0); } else{ - font.drawInBatch(labelText, h, 0, 0xFFFFFFFF, false, positionMatrix, b, Font.DisplayMode.SEE_THROUGH, 0x00000000, LightTexture.FULL_BRIGHT); + font.drawInBatch(labelText, h, 0, 0xFFFFFFFF, false, positionMatrix, b, Font.DisplayMode.SEE_THROUGH, 0x00000000, 0xF000F0); } b.endBatch(); } diff --git a/src/main/resources/assets/coordinatelist/lang/en_us.json b/src/main/resources/assets/coordinatelist/lang/en_us.json index 90d2f1c..41c374e 100644 --- a/src/main/resources/assets/coordinatelist/lang/en_us.json +++ b/src/main/resources/assets/coordinatelist/lang/en_us.json @@ -10,11 +10,14 @@ "coordinatelist.midnightconfig.canPlaceDeathpoints": "Create waypoints on death", "coordinatelist.midnightconfig.waypointTextBackground": "Show background behind the waypoint name", "coordinatelist.midnightconfig.squareWaypoints": "Use a square waypoint icon instead of a circle", + "coordinatelist.midnightconfig.maxDeathWaypoints": "Max Death Waypoints (0 - no limit)", "modmenu.summaryTranslation.coordinatelist": "A simple minimalistic Fabric mod for saving your coordinates.", "modmenu.descriptionTranslation.coordinatelist": "Coordinate List (CList for short) is a simple minimalistic Fabric mod for saving your coordinates. No minimaps. Just a list with in-game waypoints.", "waypoint.last.death": "Last death", "waypoint.new.waypoint": "New Waypoint", + "waypoint.permanent.on": "Permanent: ON", + "waypoint.permanent.off": "Permanent: OFF", "buttons.add.new.waypoint": "Add a new waypoint in current position", - "tooltip.copy.waypoint.coordinates": "Click to copy selected waypoints coordinates.\n\nUse with CTRL to copy as a teleport command.", + "tooltip.copy.waypoint.coordinates": "Click to copy selected waypoints coordinates.\n\nUse with CTRL to copy as a teleport command.\n\nRight Click to convert selected coordinates between Overworld and Nether coordinates.", "chat.create.waypoint.message": "[Create a waypoint]" -} \ No newline at end of file +} diff --git a/src/main/resources/assets/coordinatelist/lang/es_ar.json b/src/main/resources/assets/coordinatelist/lang/es_ar.json index 7b89bc1..6e10914 100644 --- a/src/main/resources/assets/coordinatelist/lang/es_ar.json +++ b/src/main/resources/assets/coordinatelist/lang/es_ar.json @@ -10,11 +10,14 @@ "coordinatelist.midnightconfig.canPlaceDeathpoints": "Crear un punto de referencia al morir", "coordinatelist.midnightconfig.waypointTextBackground": "Mostrar un fondo detrás del nombre del punto de referencia", "coordinatelist.midnightconfig.squareWaypoints": "Usar un icono cuadrado en lugar de circular para los puntos de referencia", + "coordinatelist.midnightconfig.maxDeathWaypoints": "“Máximo puntos de referencia de muerte (0 = sin límite)”", "modmenu.summaryTranslation.coordinatelist": "Un mod simple y minimalista de Fabric para guardar tus coordenadas.", "modmenu.descriptionTranslation.coordinatelist": "Coordinate List (CList) es un mod simple y minimalista de Fabric para guardar tus coordenadas. Nada de minimapas. Solo una lista de puntos de referencia dentro del juego.", "waypoint.last.death": "Tu última muerte", "waypoint.new.waypoint": "Nuevo punto de referencia", + "waypoint.permanent.on": "Permanente: ON", + "waypoint.permanent.off": "Permanente: OFF", "buttons.add.new.waypoint": "Agregá un nuevo punto de referencia en la posición actual", - "tooltip.copy.waypoint.coordinates": "Hacé clic para copiar las coordenadas del punto de referencia seleccionado.\n\nUsá CTRL para copiarlo como comando de teletransporte.", + "tooltip.copy.waypoint.coordinates": "Hacé clic para copiar las coordenadas del punto de referencia seleccionado.\n\nUsá CTRL para copiarlo como comando de teletransporte.\n\nHacé click derecho para convertir las coordenadas seleccionadas entre Overworld y Nether.", "chat.create.waypoint.message": "[Crear un punto de referencia]" } diff --git a/src/main/resources/coordinatelist.accesswidener b/src/main/resources/coordinatelist.accesswidener index 4417238..fca2b9f 100644 --- a/src/main/resources/coordinatelist.accesswidener +++ b/src/main/resources/coordinatelist.accesswidener @@ -1,2 +1,3 @@ -accessWidener v2 named -accessible method net/minecraft/client/renderer/rendertype/RenderType create (Ljava/lang/String;Lnet/minecraft/client/renderer/rendertype/RenderSetup;)Lnet/minecraft/client/renderer/rendertype/RenderType; \ No newline at end of file +accessWidener v2 official +accessible method net/minecraft/client/renderer/rendertype/RenderType create (Ljava/lang/String;Lnet/minecraft/client/renderer/rendertype/RenderSetup;)Lnet/minecraft/client/renderer/rendertype/RenderType; +accessible class net/minecraft/client/gui/components/AbstractSelectionList$Entry diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 05ee2c6..60e4d2e 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,10 +28,10 @@ ], "accessWidener": "coordinatelist.accesswidener", "depends": { - "fabricloader": ">=0.18.2", + "fabricloader": ">=0.18.6", "fabric-api": "*", - "minecraft": "~1.21.11", - "java": ">=21", + "minecraft": "~26.1", + "java": ">=25", "midnightlib": ">=1.9.2" }, "suggests": {