From c0cd22159f9088af00834856b2329a1a03ffbc70 Mon Sep 17 00:00:00 2001 From: rfresh2 <89827146+rfresh2@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:16:16 -0800 Subject: [PATCH] line draw features --- .../xaeroplus/event/DimensionSwitchEvent.java | 6 - .../GuiXaeroPlusOverlaySettings.java | 31 ++++ .../GuiXaeroPlusWorldMapSettings.java | 8 +- ...re.java => ChunkHighlightDrawFeature.java} | 14 +- .../render/ChunkHighlightSupplier.java | 2 +- ...kgroundDrawHelper.java => DrawHelper.java} | 10 +- .../xaeroplus/feature/render/DrawManager.java | 155 +++++++++++++---- .../java/xaeroplus/feature/render/Line.java | 4 + .../feature/render/LineDrawFeature.java | 57 ++++++ .../feature/render/LineProvider.java | 12 ++ .../feature/render/LineSupplier.java | 11 ++ .../xaeroplus/mixin/client/MixinGuiMap.java | 138 +-------------- .../MixinGuiMinimapOverlaysSettings.java | 35 ---- .../xaeroplus/mixin/client/MixinMapWorld.java | 7 - .../mixin/client/MixinMinimapFBORenderer.java | 158 ++++------------- .../client/MixinSupportXaeroWorldmap.java | 38 +--- .../java/xaeroplus/module/ModuleManager.java | 2 + .../java/xaeroplus/module/impl/Highways.java | 162 ++++++++---------- .../xaeroplus/module/impl/RenderDistance.java | 68 ++++++++ .../xaeroplus/module/impl/WorldBorder.java | 58 +++++++ .../xaeroplus/settings/SettingLocation.java | 2 +- .../java/xaeroplus/settings/Settings.java | 32 ++-- .../java/xaeroplus/util/FloatSupplier.java | 6 + .../assets/xaeroplus/lang/en_us.json | 13 +- .../assets/xaeroplus/lang/es_ar.json | 5 +- .../assets/xaeroplus/lang/fr_ca.json | 1 + .../assets/xaeroplus/lang/fr_fr.json | 1 + .../assets/xaeroplus/lang/ja_jp.json | 1 + .../assets/xaeroplus/lang/pl_pl.json | 1 + .../assets/xaeroplus/lang/pt_pt.json | 1 + .../assets/xaeroplus/lang/ru_ru.json | 1 + .../assets/xaeroplus/lang/vi_vn.json | 1 + .../assets/xaeroplus/lang/zh_cn.json | 1 + .../assets/xaeroplus/lang/zh_tw.json | 1 + .../src/main/resources/xaeroplus.mixins.json | 1 - settings.gradle.kts | 2 +- 36 files changed, 535 insertions(+), 511 deletions(-) delete mode 100644 common/src/main/java/xaeroplus/event/DimensionSwitchEvent.java create mode 100644 common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusOverlaySettings.java rename common/src/main/java/xaeroplus/feature/render/{DrawFeature.java => ChunkHighlightDrawFeature.java} (79%) rename common/src/main/java/xaeroplus/feature/render/{MinimapBackgroundDrawHelper.java => DrawHelper.java} (85%) create mode 100644 common/src/main/java/xaeroplus/feature/render/Line.java create mode 100644 common/src/main/java/xaeroplus/feature/render/LineDrawFeature.java create mode 100644 common/src/main/java/xaeroplus/feature/render/LineProvider.java create mode 100644 common/src/main/java/xaeroplus/feature/render/LineSupplier.java delete mode 100644 common/src/main/java/xaeroplus/mixin/client/MixinGuiMinimapOverlaysSettings.java create mode 100644 common/src/main/java/xaeroplus/module/impl/RenderDistance.java create mode 100644 common/src/main/java/xaeroplus/module/impl/WorldBorder.java create mode 100644 common/src/main/java/xaeroplus/util/FloatSupplier.java diff --git a/common/src/main/java/xaeroplus/event/DimensionSwitchEvent.java b/common/src/main/java/xaeroplus/event/DimensionSwitchEvent.java deleted file mode 100644 index ea9abb1c..00000000 --- a/common/src/main/java/xaeroplus/event/DimensionSwitchEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package xaeroplus.event; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.Level; - -public record DimensionSwitchEvent(ResourceKey dimension) { } diff --git a/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusOverlaySettings.java b/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusOverlaySettings.java new file mode 100644 index 00000000..71f65766 --- /dev/null +++ b/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusOverlaySettings.java @@ -0,0 +1,31 @@ +package xaeroplus.feature.extensions; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import xaero.map.gui.GuiSettings; +import xaero.map.gui.ScreenSwitchSettingEntry; +import xaeroplus.settings.SettingLocation; +import xaeroplus.settings.Settings; + +public class GuiXaeroPlusOverlaySettings extends GuiSettings { + public GuiXaeroPlusOverlaySettings(Screen parent, Screen escapeScreen) { + super(Component.translatable("xaeroplus.gui.overlay_settings"), parent, escapeScreen); + this.entries = Settings.REGISTRY.getWorldmapConfigSettingEntries(SettingLocation.OVERLAYS); + } + + @Override + public void render(GuiGraphics guiGraphics, int par1, int par2, float par3) { + this.renderEscapeScreen(guiGraphics, par1, par2, par3); + super.render(guiGraphics, par1, par2, par3); + } + + public static ScreenSwitchSettingEntry getScreenSwitchSettingEntry(Screen parent) { + return new ScreenSwitchSettingEntry( + "xaeroplus.gui.overlay_settings", + GuiXaeroPlusOverlaySettings::new, + null, + true + ); + } +} diff --git a/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusWorldMapSettings.java b/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusWorldMapSettings.java index 7f07fec0..1c2a0746 100644 --- a/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusWorldMapSettings.java +++ b/common/src/main/java/xaeroplus/feature/extensions/GuiXaeroPlusWorldMapSettings.java @@ -15,11 +15,11 @@ public GuiXaeroPlusWorldMapSettings(Screen parent, Screen escapeScreen) { super(Component.translatable("xaeroplus.gui.world_map_settings"), parent, escapeScreen); var mainSettingsEntries = Settings.REGISTRY.getWorldmapConfigSettingEntries(SettingLocation.WORLD_MAP_MAIN); var chunkHighlightSettingSwitchEntry = GuiXaeroPlusChunkHighlightSettings.getScreenSwitchSettingEntry(parent); - this.entries = new ISettingEntry[mainSettingsEntries.length + 1]; + var overlaySettingSwitchEntry = GuiXaeroPlusOverlaySettings.getScreenSwitchSettingEntry(parent); + this.entries = new ISettingEntry[mainSettingsEntries.length + 2]; this.entries[0] = chunkHighlightSettingSwitchEntry; - for (int i = 0; i < mainSettingsEntries.length; i++) { - this.entries[i + 1] = mainSettingsEntries[i]; - } + this.entries[1] = overlaySettingSwitchEntry; + System.arraycopy(mainSettingsEntries, 0, this.entries, 2, mainSettingsEntries.length); } @Override diff --git a/common/src/main/java/xaeroplus/feature/render/DrawFeature.java b/common/src/main/java/xaeroplus/feature/render/ChunkHighlightDrawFeature.java similarity index 79% rename from common/src/main/java/xaeroplus/feature/render/DrawFeature.java rename to common/src/main/java/xaeroplus/feature/render/ChunkHighlightDrawFeature.java index ab239296..b35424e3 100644 --- a/common/src/main/java/xaeroplus/feature/render/DrawFeature.java +++ b/common/src/main/java/xaeroplus/feature/render/ChunkHighlightDrawFeature.java @@ -10,27 +10,23 @@ import static xaeroplus.util.GuiMapHelper.*; -public class DrawFeature { +public class ChunkHighlightDrawFeature { private final AsyncLoadingCache chunkRenderCache; private final ChunkHighlightProvider chunkHighlightProvider; private final HighlightDrawBuffer drawBuffer = new HighlightDrawBuffer(); - public DrawFeature(ChunkHighlightProvider chunkHighlightProvider) { + public ChunkHighlightDrawFeature(ChunkHighlightProvider chunkHighlightProvider) { this.chunkHighlightProvider = chunkHighlightProvider; - this.chunkRenderCache = createChunkHighlightRenderCache(chunkHighlightProvider); - } - - private AsyncLoadingCache createChunkHighlightRenderCache(final ChunkHighlightProvider chunkHighlightProvider) { - return Caffeine.newBuilder() + this.chunkRenderCache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.SECONDS) .refreshAfterWrite(500, TimeUnit.MILLISECONDS) .executor(Globals.cacheRefreshExecutorService.get()) .removalListener((k, v, cause) -> markDrawBuffersStale()) // only one key - .buildAsync(k -> loadFeatureHighlightsInWindow(chunkHighlightProvider)); + .buildAsync(k -> loadFeatureHighlightsInWindow()); } - private LongList loadFeatureHighlightsInWindow(final ChunkHighlightProvider chunkHighlightProvider) { + private LongList loadFeatureHighlightsInWindow() { final int windowX, windowZ, windowSize; var guiMapOptional = getGuiMap(); if (guiMapOptional.isPresent()) { diff --git a/common/src/main/java/xaeroplus/feature/render/ChunkHighlightSupplier.java b/common/src/main/java/xaeroplus/feature/render/ChunkHighlightSupplier.java index a102062f..c7dda7ec 100644 --- a/common/src/main/java/xaeroplus/feature/render/ChunkHighlightSupplier.java +++ b/common/src/main/java/xaeroplus/feature/render/ChunkHighlightSupplier.java @@ -6,5 +6,5 @@ @FunctionalInterface public interface ChunkHighlightSupplier { - LongList getHighlights(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, ResourceKey dimension); + LongList getHighlights(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, final ResourceKey dimension); } diff --git a/common/src/main/java/xaeroplus/feature/render/MinimapBackgroundDrawHelper.java b/common/src/main/java/xaeroplus/feature/render/DrawHelper.java similarity index 85% rename from common/src/main/java/xaeroplus/feature/render/MinimapBackgroundDrawHelper.java rename to common/src/main/java/xaeroplus/feature/render/DrawHelper.java index a489c863..20edc815 100644 --- a/common/src/main/java/xaeroplus/feature/render/MinimapBackgroundDrawHelper.java +++ b/common/src/main/java/xaeroplus/feature/render/DrawHelper.java @@ -1,12 +1,13 @@ package xaeroplus.feature.render; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import org.joml.Matrix4f; import xaero.map.region.MapTileChunk; import xaeroplus.feature.extensions.SeenChunksTrackingMapTileChunk; import xaeroplus.util.ChunkUtils; -public class MinimapBackgroundDrawHelper { +public class DrawHelper { public static void addMMBackgroundToBuffer(Matrix4f matrix, VertexConsumer bufferBuilder, final int drawX, final int drawY, final MapTileChunk chunk) { // Most of the cpu cost in this method is submitting vertices to the buffer @@ -64,4 +65,11 @@ public static void fillIntoExistingBuffer(Matrix4f matrix, VertexConsumer buffer bufferBuilder.vertex(matrix, x2, y1, 0.0F).color(r, g, b, a).endVertex(); bufferBuilder.vertex(matrix, x1, y1, 0.0F).color(r, g, b, a).endVertex(); } + + public static void addColoredLineToExistingBuffer( + PoseStack.Pose matrices, VertexConsumer vertexBuffer, float x1, float y1, float x2, float y2, float r, float g, float b, float a + ) { + vertexBuffer.vertex(matrices.pose(), x1, y1, 0.0F).color(r, g, b, a).normal(matrices.normal(), x2 - x1, y2 - y1, 0.0F).endVertex(); + vertexBuffer.vertex(matrices.pose(), x2, y2, 0.0F).color(r, g, b, a).normal(matrices.normal(), x2 - x1, y2 - y1, 0.0F).endVertex(); + } } diff --git a/common/src/main/java/xaeroplus/feature/render/DrawManager.java b/common/src/main/java/xaeroplus/feature/render/DrawManager.java index 62e1daf2..66546eba 100644 --- a/common/src/main/java/xaeroplus/feature/render/DrawManager.java +++ b/common/src/main/java/xaeroplus/feature/render/DrawManager.java @@ -7,14 +7,19 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.lenni0451.lambdaevents.EventHandler; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.Mth; import xaero.common.HudMod; +import xaero.common.graphics.CustomRenderTypes; +import xaero.common.graphics.shader.MinimapShaders; import xaero.common.minimap.render.MinimapRendererHelper; +import xaeroplus.Globals; import xaeroplus.XaeroPlus; -import xaeroplus.event.DimensionSwitchEvent; import xaeroplus.event.XaeroWorldChangeEvent; import xaeroplus.settings.Settings; import xaeroplus.util.ChunkUtils; import xaeroplus.util.ColorHelper; +import xaeroplus.util.FloatSupplier; import java.util.ArrayList; import java.util.Comparator; @@ -22,8 +27,10 @@ import java.util.function.IntSupplier; public class DrawManager { - private final Object2ObjectMap chunkHighlightDrawFeatures = new Object2ObjectOpenHashMap<>(); - private final List sortedKeySet = new ArrayList<>(); + private final Object2ObjectMap chunkHighlightDrawFeatures = new Object2ObjectOpenHashMap<>(); + private final Object2ObjectMap lineDrawFeatures = new Object2ObjectOpenHashMap<>(); + private final List sortedChunkHighlightKeySet = new ArrayList<>(); + private final List sortedLineKeySet = new ArrayList<>(); public DrawManager() { XaeroPlus.EVENT_BUS.register(this); @@ -31,15 +38,15 @@ public DrawManager() { public synchronized void registerChunkHighlightProvider(String id, ChunkHighlightSupplier chunkHighlightSupplier, IntSupplier colorSupplier) { unregisterChunkHighlightProvider(id); // just in case - chunkHighlightDrawFeatures.put(id, new DrawFeature(new ChunkHighlightProvider(chunkHighlightSupplier, colorSupplier))); - sortedKeySet.add(id); + chunkHighlightDrawFeatures.put(id, new ChunkHighlightDrawFeature(new ChunkHighlightProvider(chunkHighlightSupplier, colorSupplier))); + sortedChunkHighlightKeySet.add(id); // arbitrary order, just needs to be consistent so colors blend consistently - sortedKeySet.sort(Comparator.naturalOrder()); + sortedChunkHighlightKeySet.sort(Comparator.naturalOrder()); } public synchronized void unregisterChunkHighlightProvider(String id) { - sortedKeySet.remove(id); - DrawFeature feature = chunkHighlightDrawFeatures.remove(id); + sortedChunkHighlightKeySet.remove(id); + ChunkHighlightDrawFeature feature = chunkHighlightDrawFeatures.remove(id); if (feature != null) { Minecraft.getInstance().execute(feature::closeDrawBuffers); } @@ -53,14 +60,22 @@ public synchronized void unregisterChunkHighlightProvider(Class clazz) { unregisterChunkHighlightProvider(clazz.getName()); } - @EventHandler - public void onDimensionChange(DimensionSwitchEvent event) { - chunkHighlightDrawFeatures.values().forEach(DrawFeature::invalidateCache); + public synchronized void registerLineProvider(String id, LineSupplier lineSupplier, IntSupplier colorSupplier, FloatSupplier lineWidthSupplier, int refreshIntervalMs) { + unregisterLineProvider(id); // just in case + lineDrawFeatures.put(id, new LineDrawFeature(new LineProvider(lineSupplier, colorSupplier, lineWidthSupplier), refreshIntervalMs)); + sortedLineKeySet.add(id); + sortedLineKeySet.sort(Comparator.naturalOrder()); + } + + public synchronized void unregisterLineProvider(String id) { + sortedLineKeySet.remove(id); + lineDrawFeatures.remove(id); } @EventHandler public void onXaeroWorldChange(XaeroWorldChangeEvent event) { - chunkHighlightDrawFeatures.values().forEach(DrawFeature::invalidateCache); + chunkHighlightDrawFeatures.values().forEach(ChunkHighlightDrawFeature::invalidateCache); + lineDrawFeatures.values().forEach(LineDrawFeature::invalidateCache); } public synchronized void drawMinimapFeatures( @@ -76,25 +91,61 @@ public synchronized void drawMinimapFeatures( int insideZ, final PoseStack matrixStack, final VertexConsumer overlayBufferBuilder, - MinimapRendererHelper helper - ) { + MinimapRendererHelper helper, + final MultiBufferSource.BufferSource renderTypeBuffers) { if (HudMod.INSTANCE.isFairPlay()) return; matrixStack.pushPose(); matrixStack.translate( -(chunkX * 64) - (tileX * 16) - insideX, -(chunkZ * 64) - (tileZ * 16) - insideZ, 0); + matrixStack.pushPose(); matrixStack.scale(16f, 16f, 1f); if (Settings.REGISTRY.highlightShader.get()) { - drawMinimapFeaturesShader(matrixStack); + drawMinimapHighlightsShader(matrixStack); } else { - drawMinimapFeaturesImmediate(minViewMapTileChunkCoordX, maxViewMapTileChunkCoordX, minViewMapTileChunkCoordZ, maxViewMapTileChunkCoordZ, - matrixStack, overlayBufferBuilder, helper); + drawMinimapHighlightsImmediate(minViewMapTileChunkCoordX, maxViewMapTileChunkCoordX, minViewMapTileChunkCoordZ, maxViewMapTileChunkCoordZ, + matrixStack, overlayBufferBuilder, helper); } matrixStack.popPose(); + drawMinimapLines(matrixStack, Globals.minimapScaleMultiplier, renderTypeBuffers); + matrixStack.popPose(); + } + + public synchronized void drawMinimapLines( + final PoseStack matrixStack, + final int scale, + final MultiBufferSource.BufferSource renderTypeBuffers + ) { + MinimapShaders.FRAMEBUFFER_LINES.setFrameSize(scale * 512, scale * 512); + for (int i = 0; i < sortedLineKeySet.size(); i++) { + var k = sortedLineKeySet.get(i); + if (k == null) continue; + var feature = lineDrawFeatures.get(k); + if (feature == null) continue; + int color = feature.colorInt(); + var a = ColorHelper.getA(color); + if (a == 0.0f) return; + VertexConsumer lineBuffer = renderTypeBuffers.getBuffer(CustomRenderTypes.MAP_LINES); + float lineWidthScale = Mth.clamp(feature.lineWidth() * scale, 0.1f, 1000.0f); + RenderSystem.lineWidth(16 * lineWidthScale); + var r = ColorHelper.getR(color); + var g = ColorHelper.getG(color); + var b = ColorHelper.getB(color); + var lines = feature.getLines(); + for (int j = 0; j < lines.size(); j++) { + var line = lines.get(j); + DrawHelper.addColoredLineToExistingBuffer( + matrixStack.last(), lineBuffer, + line.x1(), line.z1(), + line.x2(), line.z2(), + r, g, b, a); + } + renderTypeBuffers.endBatch(CustomRenderTypes.MAP_LINES); + } } - public synchronized void drawMinimapFeaturesImmediate( + public synchronized void drawMinimapHighlightsImmediate( int minViewMapTileChunkCoordX, int maxViewMapTileChunkCoordX, int minViewMapTileChunkCoordZ, @@ -104,8 +155,8 @@ public synchronized void drawMinimapFeaturesImmediate( MinimapRendererHelper helper ) { var matrix = matrixStack.last().pose(); - for (int i = 0; i < sortedKeySet.size(); i++) { - var k = sortedKeySet.get(i); + for (int i = 0; i < sortedChunkHighlightKeySet.size(); i++) { + var k = sortedChunkHighlightKeySet.get(i); if (k == null) continue; var feature = chunkHighlightDrawFeatures.get(k); if (feature == null) continue; @@ -134,7 +185,7 @@ public synchronized void drawMinimapFeaturesImmediate( } } - public synchronized void drawMinimapFeaturesShader( + public synchronized void drawMinimapHighlightsShader( final PoseStack matrixStack ) { XaeroPlusShaders.ensureShaders(); @@ -142,8 +193,8 @@ public synchronized void drawMinimapFeaturesShader( if (shader == null) return; shader.setMapViewMatrix(matrixStack.last().pose()); RenderSystem.enableBlend(); - for (int i = 0; i < sortedKeySet.size(); i++) { - var k = sortedKeySet.get(i); + for (int i = 0; i < sortedChunkHighlightKeySet.size(); i++) { + var k = sortedChunkHighlightKeySet.get(i); if (k == null) continue; var feature = chunkHighlightDrawFeatures.get(k); if (feature == null) continue; @@ -172,30 +223,64 @@ public synchronized void drawWorldMapFeatures( final int flooredCameraX, final int flooredCameraZ, final PoseStack matrixStack, - final VertexConsumer overlayBuffer + final VertexConsumer overlayBuffer, + final double scale, + final MultiBufferSource.BufferSource renderTypeBuffers ) { if (HudMod.INSTANCE.isFairPlay()) return; matrixStack.pushPose(); matrixStack.translate(-flooredCameraX, -flooredCameraZ, 1.0f); + matrixStack.pushPose(); matrixStack.scale(16f, 16f, 1f); if (Settings.REGISTRY.highlightShader.get()) - drawWorldMapFeaturesShader(matrixStack); + drawWorldMapHighlightsShader(matrixStack); else - drawWorldMapFeaturesImmediate(minBlockX, maxBlockX, minBlockZ, maxBlockZ, - matrixStack, overlayBuffer); + drawWorldMapHighlightsImmediate(minBlockX, maxBlockX, minBlockZ, maxBlockZ, matrixStack, overlayBuffer); + matrixStack.popPose(); + drawWorldMapLines(matrixStack, scale, renderTypeBuffers); matrixStack.popPose(); } - public synchronized void drawWorldMapFeaturesShader( - final PoseStack matrixStack + public synchronized void drawWorldMapLines( + final PoseStack matrixStack, + double scale, + final MultiBufferSource.BufferSource renderTypeBuffers ) { + for (int i = 0; i < sortedLineKeySet.size(); i++) { + var k = sortedLineKeySet.get(i); + if (k == null) continue; + var feature = lineDrawFeatures.get(k); + if (feature == null) continue; + int color = feature.colorInt(); + var a = ColorHelper.getA(color); + if (a == 0.0f) return; + VertexConsumer lineBuffer = renderTypeBuffers.getBuffer(CustomRenderTypes.MAP_LINES); + float lineWidthScale = (float) Mth.clamp(feature.lineWidth() * scale, 0.1f, 1000.0f); + RenderSystem.lineWidth(16 * lineWidthScale); + var r = ColorHelper.getR(color); + var g = ColorHelper.getG(color); + var b = ColorHelper.getB(color); + var lines = feature.getLines(); + for (int j = 0; j < lines.size(); j++) { + var line = lines.get(j); + DrawHelper.addColoredLineToExistingBuffer( + matrixStack.last(), lineBuffer, + line.x2(), line.z2(), + line.x1(), line.z1(), + r, g, b, a); + } + renderTypeBuffers.endBatch(CustomRenderTypes.MAP_LINES); + } + } + + public synchronized void drawWorldMapHighlightsShader(final PoseStack matrixStack) { XaeroPlusShaders.ensureShaders(); var shader = XaeroPlusShaders.HIGHLIGHT_SHADER; if (shader == null) return; shader.setMapViewMatrix(matrixStack.last().pose()); RenderSystem.enableBlend(); - for (int i = 0; i < sortedKeySet.size(); i++) { - var k = sortedKeySet.get(i); + for (int i = 0; i < sortedChunkHighlightKeySet.size(); i++) { + var k = sortedChunkHighlightKeySet.get(i); if (k == null) continue; var feature = chunkHighlightDrawFeatures.get(k); if (feature == null) continue; @@ -216,7 +301,7 @@ public synchronized void drawWorldMapFeaturesShader( RenderSystem.disableBlend(); } - public synchronized void drawWorldMapFeaturesImmediate( + public synchronized void drawWorldMapHighlightsImmediate( final double minBlockX, final double maxBlockX, final double minBlockZ, @@ -225,8 +310,8 @@ public synchronized void drawWorldMapFeaturesImmediate( final VertexConsumer overlayBuffer ) { var matrix = matrixStack.last().pose(); - for (int i = 0; i < sortedKeySet.size(); i++) { - var k = sortedKeySet.get(i); + for (int i = 0; i < sortedChunkHighlightKeySet.size(); i++) { + var k = sortedChunkHighlightKeySet.get(i); if (k == null) continue; var feature = chunkHighlightDrawFeatures.get(k); if (feature == null) continue; @@ -250,7 +335,7 @@ public synchronized void drawWorldMapFeaturesImmediate( final float top = chunkPosZ; final float right = left + 1; final float bottom = top + 1; - MinimapBackgroundDrawHelper.fillIntoExistingBuffer( + DrawHelper.fillIntoExistingBuffer( matrix, overlayBuffer, left, top, right, bottom, r, g, b, a diff --git a/common/src/main/java/xaeroplus/feature/render/Line.java b/common/src/main/java/xaeroplus/feature/render/Line.java new file mode 100644 index 00000000..36683ae5 --- /dev/null +++ b/common/src/main/java/xaeroplus/feature/render/Line.java @@ -0,0 +1,4 @@ +package xaeroplus.feature.render; + +public record Line(int x1, int z1, int x2, int z2) { } + diff --git a/common/src/main/java/xaeroplus/feature/render/LineDrawFeature.java b/common/src/main/java/xaeroplus/feature/render/LineDrawFeature.java new file mode 100644 index 00000000..d5602341 --- /dev/null +++ b/common/src/main/java/xaeroplus/feature/render/LineDrawFeature.java @@ -0,0 +1,57 @@ +package xaeroplus.feature.render; + +import com.github.benmanes.caffeine.cache.AsyncLoadingCache; +import com.github.benmanes.caffeine.cache.Caffeine; +import xaeroplus.Globals; +import xaeroplus.util.ChunkUtils; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static xaeroplus.util.GuiMapHelper.*; + +public class LineDrawFeature { + private final AsyncLoadingCache> lineRenderCache; + private final LineProvider lineProvider; + + public LineDrawFeature(LineProvider lineProvider, int refreshIntervalMs) { + this.lineProvider = lineProvider; + this.lineRenderCache = Caffeine.newBuilder() + .expireAfterWrite(10, TimeUnit.SECONDS) + .refreshAfterWrite(refreshIntervalMs, TimeUnit.MILLISECONDS) + .buildAsync(k -> loadLinesInWindow()); + } + + private List loadLinesInWindow() { + final int windowX, windowZ, windowSize; + var guiMapOptional = getGuiMap(); + if (guiMapOptional.isPresent()) { + var guiMap = guiMapOptional.get(); + windowX = getGuiMapCenterRegionX(guiMap); + windowZ = getGuiMapCenterRegionZ(guiMap); + windowSize = getGuiMapRegionSize(guiMap); + } else { + windowX = ChunkUtils.getPlayerRegionX(); + windowZ = ChunkUtils.getPlayerRegionZ(); + windowSize = Math.max(3, Globals.minimapScaleMultiplier); + } + return lineProvider.lineSupplier().getLines(windowX, windowZ, windowSize, Globals.getCurrentDimensionId()); + } + + public int colorInt() { + return lineProvider.colorSupplier().getAsInt(); + } + + public float lineWidth() { + return lineProvider.lineWidthSupplier().getFloat(); + } + + public void invalidateCache() { + lineRenderCache.synchronous().invalidateAll(); + } + + public List getLines() { + return lineRenderCache.get(0L).getNow(Collections.EMPTY_LIST); + } +} diff --git a/common/src/main/java/xaeroplus/feature/render/LineProvider.java b/common/src/main/java/xaeroplus/feature/render/LineProvider.java new file mode 100644 index 00000000..a0d3cd33 --- /dev/null +++ b/common/src/main/java/xaeroplus/feature/render/LineProvider.java @@ -0,0 +1,12 @@ +package xaeroplus.feature.render; + +import xaeroplus.util.FloatSupplier; + +import java.util.function.IntSupplier; + +public record LineProvider( + LineSupplier lineSupplier, + IntSupplier colorSupplier, + FloatSupplier lineWidthSupplier +) { +} diff --git a/common/src/main/java/xaeroplus/feature/render/LineSupplier.java b/common/src/main/java/xaeroplus/feature/render/LineSupplier.java new file mode 100644 index 00000000..d2feacea --- /dev/null +++ b/common/src/main/java/xaeroplus/feature/render/LineSupplier.java @@ -0,0 +1,11 @@ +package xaeroplus.feature.render; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +import java.util.List; + +@FunctionalInterface +public interface LineSupplier { + List getLines(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, final ResourceKey dimension); +} diff --git a/common/src/main/java/xaeroplus/mixin/client/MixinGuiMap.java b/common/src/main/java/xaeroplus/mixin/client/MixinGuiMap.java index 44878085..d0bf7231 100644 --- a/common/src/main/java/xaeroplus/mixin/client/MixinGuiMap.java +++ b/common/src/main/java/xaeroplus/mixin/client/MixinGuiMap.java @@ -6,7 +6,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.ChatFormatting; @@ -33,7 +32,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import xaero.common.graphics.shader.MinimapShaders; -import xaero.hud.HudSession; import xaero.map.MapProcessor; import xaero.map.WorldMap; import xaero.map.animation.SlowingAnimation; @@ -44,7 +42,6 @@ import xaero.map.gui.*; import xaero.map.gui.dropdown.rightclick.RightClickOption; import xaero.map.misc.Misc; -import xaero.map.misc.OptimizedMath; import xaero.map.mods.SupportMods; import xaero.map.world.MapDimension; import xaeroplus.Globals; @@ -245,8 +242,11 @@ public void drawWorldMapFeatures(final GuiGraphics guiGraphics, final int scaled @Local(name = "flooredCameraX") int flooredCameraX, @Local(name = "flooredCameraZ") int flooredCameraZ, @Local(name = "matrixStack") PoseStack matrixStack, - @Local(name = "overlayBuffer") VertexConsumer overlayBuffer) { + @Local(name = "overlayBuffer") VertexConsumer overlayBuffer, + @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers) { if (Minecraft.getInstance().options.hideGui) return; + var mc = Minecraft.getInstance(); + MinimapShaders.FRAMEBUFFER_LINES.setFrameSize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); Globals.drawManager.drawWorldMapFeatures( leftBorder, rightBorder, @@ -255,7 +255,10 @@ public void drawWorldMapFeatures(final GuiGraphics guiGraphics, final int scaled flooredCameraX, flooredCameraZ, matrixStack, - overlayBuffer); + overlayBuffer, + scale, + renderTypeBuffers + ); } @WrapWithCondition(method = "render", at = @At( @@ -321,123 +324,6 @@ public String renderCrossDimensionCursorCoordinates(final String original) { return original + " [" + x + ", " + z + "]"; } - @Inject(method = "render", at = @At( - value = "FIELD", - target = "Lxaero/map/settings/ModSettings;renderArrow:Z", - opcode = Opcodes.GETFIELD, - ordinal = 0 - ), remap = true) - public void showRenderDistanceWorldMap(final GuiGraphics guiGraphics, final int scaledMouseX, final int scaledMouseY, final float partialTicks, final CallbackInfo ci, - @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers, - @Local(name = "matrixStack") PoseStack matrixStack) { - Minecraft mc = Minecraft.getInstance(); - if (!Settings.REGISTRY.showRenderDistanceWorldMapSetting.get() - || mc.options.hideGui - || mc.level.dimension() != Globals.getCurrentDimensionId()) return; - final int viewDistance = mc.options.serverRenderDistance; - int width = viewDistance * 2 + 1; - double playerX = getPlayerX(); - double playerZ = getPlayerZ(); - int xFloored = OptimizedMath.myFloor(playerX); - int zFloored = OptimizedMath.myFloor(playerZ); - int chunkLeftX = (xFloored >> 4) - (width / 2) << 4; - int chunkRightX = (xFloored >> 4) + 1 + (width / 2) << 4; - int chunkTopZ = (zFloored >> 4) - (width / 2) << 4; - int chunkBottomZ = (zFloored >> 4) + 1 + (width / 2) << 4; - float camX = (float) cameraX; - float camZ = (float) cameraZ; - final float x0 = chunkLeftX - camX; - final float x1 = chunkRightX - camX; - final float z0 = chunkTopZ - camZ; - final float z1 = chunkBottomZ - camZ; - VertexConsumer lineBufferBuilder = renderTypeBuffers.getBuffer(xaero.common.graphics.CustomRenderTypes.MAP_LINES); - PoseStack.Pose matrices = matrixStack.last(); - MinimapShaders.FRAMEBUFFER_LINES.setFrameSize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); - float settingWidth = (float) HudSession.getCurrentSession().getHudMod().getSettings().chunkGridLineWidth; - float lineScale = (float) Math.max(1.0, Math.min(settingWidth * scale, settingWidth)); - RenderSystem.lineWidth(lineScale); - float r = 1.0f; - float g = 1.0f; - float b = 0.0f; - float a = 0.8f; - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x1, z0, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z0, x1, z1, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z1, x0, z1, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x0, z1, - r, g, b, a - ); - } - - @Inject(method = "render", at = @At( - value = "FIELD", - target = "Lxaero/map/settings/ModSettings;renderArrow:Z", - opcode = Opcodes.GETFIELD, - ordinal = 0 - ), remap = true) - public void showWorldBorderWorldMap(final GuiGraphics guiGraphics, final int scaledMouseX, final int scaledMouseY, final float partialTicks, final CallbackInfo ci, - @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers, - @Local(name = "matrixStack") PoseStack matrixStack) { - Minecraft mc = Minecraft.getInstance(); - if (!Settings.REGISTRY.showWorldBorderWorldMapSetting.get() - || mc.options.hideGui - || mc.level.dimension() != Globals.getCurrentDimensionId()) return; - var worldBorder = mc.level.getWorldBorder(); - float wbMinX = (float) worldBorder.getMinX(); - float wbMinZ = (float) worldBorder.getMinZ(); - float wbMaxX = (float) worldBorder.getMaxX(); - float wbMaxZ = (float) worldBorder.getMaxZ(); - float camX = (float) cameraX; - float camZ = (float) cameraZ; - float x0 = wbMinX - camX; - float z0 = wbMinZ - camZ; - float x1 = wbMaxX - camX; - float z1 = wbMaxZ - camZ; - VertexConsumer lineBufferBuilder = renderTypeBuffers.getBuffer(xaero.common.graphics.CustomRenderTypes.MAP_LINES); - PoseStack.Pose matrices = matrixStack.last(); - MinimapShaders.FRAMEBUFFER_LINES.setFrameSize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); - float settingWidth = (float) HudSession.getCurrentSession().getHudMod().getSettings().chunkGridLineWidth; - float lineScale = (float) Math.max(1.0, Math.min(settingWidth * scale, settingWidth)); - RenderSystem.lineWidth(lineScale); - float r = 0.0f; - float g = 1.0f; - float b = 1.0f; - float a = 0.8f; - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x1, z0, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z0, x1, z1, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z1, x0, z1, - r, g, b, a - ); - addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x0, z1, - r, g, b, a - ); - } - @WrapWithCondition(method = "render", at = @At( value = "INVOKE", target = "Lxaero/map/graphics/MapRenderHelper;drawCenteredStringWithBackground(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Font;Ljava/lang/String;IIIFFFFLcom/mojang/blaze3d/vertex/VertexConsumer;)V" @@ -635,14 +521,6 @@ public void onAction(Screen screen) { } } - @Unique - public void addColoredLineToExistingBuffer( - PoseStack.Pose matrices, VertexConsumer vertexBuffer, float x1, float y1, float x2, float y2, float r, float g, float b, float a - ) { - vertexBuffer.vertex(matrices.pose(), x1, y1, 0.0F).color(r, g, b, a).normal(matrices.normal(), x2 - x1, y2 - y1, 0.0F).endVertex(); - vertexBuffer.vertex(matrices.pose(), x2, y2, 0.0F).color(r, g, b, a).normal(matrices.normal(), x2 - x1, y2 - y1, 0.0F).endVertex(); - } - @Unique public void onFollowButton(final Button b) { follow = !follow; diff --git a/common/src/main/java/xaeroplus/mixin/client/MixinGuiMinimapOverlaysSettings.java b/common/src/main/java/xaeroplus/mixin/client/MixinGuiMinimapOverlaysSettings.java deleted file mode 100644 index b161fba9..00000000 --- a/common/src/main/java/xaeroplus/mixin/client/MixinGuiMinimapOverlaysSettings.java +++ /dev/null @@ -1,35 +0,0 @@ -package xaeroplus.mixin.client; - -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import xaero.common.IXaeroMinimap; -import xaero.common.gui.ConfigSettingEntry; -import xaero.common.gui.GuiMinimapOverlaysSettings; -import xaero.common.gui.GuiSettings; -import xaero.common.gui.ISettingEntry; -import xaeroplus.settings.SettingLocation; -import xaeroplus.settings.Settings; - -@Mixin(value = GuiMinimapOverlaysSettings.class, remap = false) -public abstract class MixinGuiMinimapOverlaysSettings extends GuiSettings { - - public MixinGuiMinimapOverlaysSettings(final IXaeroMinimap modMain, final Component title, final Screen backScreen, final Screen escScreen) { - super(modMain, title, backScreen, escScreen); - } - - @Inject(method = "", at = @At("RETURN")) - public void init(final IXaeroMinimap modMain, final Screen backScreen, final Screen escScreen, final CallbackInfo ci) { - final ConfigSettingEntry[] configSettingEntries = Settings.REGISTRY.getMinimapConfigSettingEntries(SettingLocation.MINIMAP_OVERLAYS); - final int oldLen = this.entries.length; - final int newLen = configSettingEntries.length; - final int totalNewLen = oldLen + configSettingEntries.length; - final ISettingEntry[] newEntries = new ISettingEntry[totalNewLen]; - System.arraycopy(this.entries, 0, newEntries, newLen, oldLen); - System.arraycopy(configSettingEntries, 0, newEntries, 0, newLen); - this.entries = newEntries; - } -} diff --git a/common/src/main/java/xaeroplus/mixin/client/MixinMapWorld.java b/common/src/main/java/xaeroplus/mixin/client/MixinMapWorld.java index 5bfce001..8a3169cf 100644 --- a/common/src/main/java/xaeroplus/mixin/client/MixinMapWorld.java +++ b/common/src/main/java/xaeroplus/mixin/client/MixinMapWorld.java @@ -11,8 +11,6 @@ import xaero.map.MapProcessor; import xaero.map.world.MapDimension; import xaero.map.world.MapWorld; -import xaeroplus.XaeroPlus; -import xaeroplus.event.DimensionSwitchEvent; import xaeroplus.util.DelegatingHashTable; import java.util.Hashtable; @@ -43,9 +41,4 @@ public MapDimension getDimension(ResourceKey dimId) { if (dimId == null) return null; else return this.dimensions.get(dimId); } - - @Inject(method = "switchToFutureUnsynced", at = @At("RETURN")) - public void onDimensionSwitch(final CallbackInfo ci) { - XaeroPlus.EVENT_BUS.call(new DimensionSwitchEvent(currentDimensionId)); - } } diff --git a/common/src/main/java/xaeroplus/mixin/client/MixinMinimapFBORenderer.java b/common/src/main/java/xaeroplus/mixin/client/MixinMinimapFBORenderer.java index 1dc12325..f4a746e4 100644 --- a/common/src/main/java/xaeroplus/mixin/client/MixinMinimapFBORenderer.java +++ b/common/src/main/java/xaeroplus/mixin/client/MixinMinimapFBORenderer.java @@ -5,7 +5,6 @@ import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; @@ -19,18 +18,16 @@ import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import xaero.common.IXaeroMinimap; -import xaero.common.graphics.CustomRenderTypes; import xaero.common.graphics.CustomVertexConsumers; import xaero.common.graphics.ImprovedFramebuffer; import xaero.common.graphics.renderer.multitexture.MultiTextureRenderTypeRenderer; import xaero.common.graphics.renderer.multitexture.MultiTextureRenderTypeRendererProvider; -import xaero.common.graphics.shader.MinimapShaders; import xaero.common.minimap.MinimapProcessor; import xaero.common.minimap.render.MinimapFBORenderer; import xaero.common.minimap.render.MinimapRenderer; import xaero.common.minimap.render.MinimapRendererHelper; import xaero.common.minimap.waypoints.render.WaypointsGuiRenderer; -import xaero.common.misc.OptimizedMath; +import xaero.common.mods.SupportXaeroWorldmap; import xaero.hud.minimap.BuiltInHudModules; import xaero.hud.minimap.Minimap; import xaero.hud.minimap.MinimapLogs; @@ -136,121 +133,6 @@ public float modifyChunkGridLineWidth(final float original) { return Math.max(1.0f, original * Globals.minimapScaleMultiplier / (float) Globals.minimapSizeMultiplier); } - @Inject(method = "renderChunksToFBO", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V", - ordinal = 0 - ), remap = true) - public void drawRenderDistanceSquare(final MinimapSession minimapSession, final GuiGraphics guiGraphics, final MinimapProcessor minimap, final Vec3 renderPos, final ResourceKey mapDimension, final double mapDimensionScale, final int viewW, final float partial, final int level, final boolean useWorldMap, final boolean lockedNorth, final int shape, final double ps, final double pc, final boolean cave, final CustomVertexConsumers cvc, final CallbackInfo ci, - @Local(name = "xFloored") int xFloored, - @Local(name = "zFloored") int zFloored, - @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers, - @Local(name = "matrixStack") PoseStack matrixStack - ) { - final boolean isDimensionSwitched = Globals.getCurrentDimensionId() != Minecraft.getInstance().level.dimension(); - if (!Settings.REGISTRY.showRenderDistanceSetting.get() || isDimensionSwitched) return; - double actualPlayerX = minimap.getEntityRadar().getEntityX(mc.player, partial); - double actualPlayerZ = minimap.getEntityRadar().getEntityZ(mc.player, partial); - int actualXFloored = OptimizedMath.myFloor(actualPlayerX); - int actualZFloored = OptimizedMath.myFloor(actualPlayerZ); - final int viewDistance = mc.options.serverRenderDistance; - int width = viewDistance * 2 + 1; - // origin of the chunk we are standing in - final int middleChunkX = -(actualXFloored & 15); - final int middleChunkZ = -(actualZFloored & 15); - int distanceFlooredX = actualXFloored - xFloored; - int distanceFlooredZ = actualZFloored - zFloored; - - final int x0 = distanceFlooredX + middleChunkX - (width / 2) * 16; - final int z0 = distanceFlooredZ + middleChunkZ - (width / 2) * 16; - final int x1 = x0 + width * 16; - final int z1 = z0 + width * 16; - VertexConsumer lineBufferBuilder = renderTypeBuffers.getBuffer(CustomRenderTypes.MAP_LINES); - MinimapShaders.FRAMEBUFFER_LINES.setFrameSize((float) scalingFramebuffer.viewWidth, (float) scalingFramebuffer.viewHeight); - float lineWidth = Math.max(1.0f, modMain.getSettings().chunkGridLineWidth * Globals.minimapScaleMultiplier / (float) Globals.minimapSizeMultiplier); - RenderSystem.lineWidth(lineWidth); - float r = 1.0f; - float g = 1.0f; - float b = 0.0f; - float a = 0.8f; - PoseStack.Pose matrices = matrixStack.last(); - - helper.addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x1, z0, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z0, x1, z1, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x1, z1, x0, z1, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrices, lineBufferBuilder, - x0, z0, x0, z1, - r, g, b, a - ); - } - - @Inject(method = "renderChunksToFBO", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V", - ordinal = 0 - ), remap = true) - public void drawWorldBorderSquare(final MinimapSession minimapSession, final GuiGraphics guiGraphics, final MinimapProcessor minimap, final Vec3 renderPos, final ResourceKey mapDimension, final double mapDimensionScale, final int viewW, final float partial, final int level, final boolean useWorldMap, final boolean lockedNorth, final int shape, final double ps, final double pc, final boolean cave, final CustomVertexConsumers cvc, final CallbackInfo ci, - @Local(name = "xFloored") int xFloored, - @Local(name = "zFloored") int zFloored, - @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers, - @Local(name = "matrixStack") PoseStack matrixStack - ) { - final boolean isDimensionSwitched = Globals.getCurrentDimensionId() != Minecraft.getInstance().level.dimension(); - if (!Settings.REGISTRY.showWorldBorderSetting.get() || isDimensionSwitched) return; - var worldBorder = mc.level.getWorldBorder(); - float wbMinX = (float) worldBorder.getMinX(); - float wbMinZ = (float) worldBorder.getMinZ(); - float wbMaxX = (float) worldBorder.getMaxX(); - float wbMaxZ = (float) worldBorder.getMaxZ(); - float x0 = wbMinX - xFloored; - float z0 = wbMinZ - zFloored; - float x1 = wbMaxX - xFloored; - float z1 = wbMaxZ - zFloored; - - VertexConsumer lineBufferBuilder = renderTypeBuffers.getBuffer(CustomRenderTypes.MAP_LINES); - MinimapShaders.FRAMEBUFFER_LINES.setFrameSize((float) scalingFramebuffer.viewWidth, (float) scalingFramebuffer.viewHeight); - float lineWidth = Math.max(1.0f, modMain.getSettings().chunkGridLineWidth * Globals.minimapScaleMultiplier / (float) Globals.minimapSizeMultiplier); - RenderSystem.lineWidth(lineWidth); - var matrix = matrixStack.last(); - float r = 0.0f; - float g = 1.0f; - float b = 1.0f; - float a = 0.8f; - helper.addColoredLineToExistingBuffer( - matrix, lineBufferBuilder, - x0, z0, x1, z0, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrix, lineBufferBuilder, - x0, z1, x1, z1, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrix, lineBufferBuilder, - x1, z0, x1, z1, - r, g, b, a - ); - helper.addColoredLineToExistingBuffer( - matrix, lineBufferBuilder, - x0, z0, x0, z1, - r, g, b, a - ); - } - @Redirect(method = "renderChunksToFBO", at = @At( value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V", @@ -293,6 +175,38 @@ public void redirectModelViewDraw(final MinimapRendererHelper instance, final Po this.helper.drawMyTexturedModalRect(matrixStack, -scaledSize.get(), -scaledSize.get(), 0, 0, scaledSizeM, scaledSizeM, scaledSizeM, scaledSizeM); } + @WrapOperation(method = "renderChunksToFBO", at= @At( + value = "INVOKE", + target = "Lxaero/common/mods/SupportXaeroWorldmap;drawMinimap(Lxaero/hud/minimap/module/MinimapSession;Lcom/mojang/blaze3d/vertex/PoseStack;Lxaero/common/minimap/render/MinimapRendererHelper;IIIIIIZDDLcom/mojang/blaze3d/vertex/VertexConsumer;Lxaero/common/graphics/renderer/multitexture/MultiTextureRenderTypeRendererProvider;)V"), + remap = true) // $REMAP + public void captureDrawContext(final SupportXaeroWorldmap instance, final MinimapSession minimapSession, final PoseStack matrixStack, final MinimapRendererHelper helper, final int xFloored, final int zFloored, final int minViewX, final int minViewZ, final int maxViewX, final int maxViewZ, final boolean zooming, final double zoom, final double mapDimensionScale, final VertexConsumer overlayBufferBuilder, final MultiTextureRenderTypeRendererProvider multiTextureRenderTypeRenderers, final Operation original, + @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers) { + original.call(instance, minimapSession, matrixStack, helper, xFloored, zFloored, minViewX, minViewZ, maxViewX, maxViewZ, zooming, zoom, mapDimensionScale, overlayBufferBuilder, multiTextureRenderTypeRenderers); + int mapX = xFloored >> 4; + int mapZ = zFloored >> 4; + int chunkX = mapX >> 2; + int chunkZ = mapZ >> 2; + int tileX = mapX & 3; + int tileZ = mapZ & 3; + int insideX = xFloored & 15; + int insideZ = zFloored & 15; + Globals.drawManager.drawMinimapFeatures( + minViewX, + maxViewX, + minViewZ, + maxViewZ, + chunkX, + chunkZ, + tileX, + tileZ, + insideX, + insideZ, + matrixStack, + overlayBufferBuilder, + helper, + renderTypeBuffers); + } + @WrapOperation(method = "renderChunksToFBO", at = @At( value = "INVOKE", target = "Lxaero/common/graphics/renderer/multitexture/MultiTextureRenderTypeRendererProvider;draw(Lxaero/common/graphics/renderer/multitexture/MultiTextureRenderTypeRenderer;)V" @@ -305,7 +219,8 @@ public void drawMinimapFeaturesCaveMode(final MultiTextureRenderTypeRendererProv @Local(name = "minX") int minXRef, @Local(name = "maxX") int maxXRef, @Local(name = "minZ") int minZRef, - @Local(name = "maxZ") int maxZRef + @Local(name = "maxZ") int maxZRef, + @Local(name = "renderTypeBuffers") MultiBufferSource.BufferSource renderTypeBuffers ) { original.call(instance, renderer); int mapX = xFloored >> 4; @@ -321,7 +236,8 @@ public void drawMinimapFeaturesCaveMode(final MultiTextureRenderTypeRendererProv chunkX, chunkZ, tileX, tileZ, insideX, insideZ, - matrixStack, overlayBufferBuilder, helper + matrixStack, overlayBufferBuilder, helper, + renderTypeBuffers ); } } diff --git a/common/src/main/java/xaeroplus/mixin/client/MixinSupportXaeroWorldmap.java b/common/src/main/java/xaeroplus/mixin/client/MixinSupportXaeroWorldmap.java index fc587d6e..f08bf640 100644 --- a/common/src/main/java/xaeroplus/mixin/client/MixinSupportXaeroWorldmap.java +++ b/common/src/main/java/xaeroplus/mixin/client/MixinSupportXaeroWorldmap.java @@ -23,7 +23,7 @@ import xaero.map.WorldMapSession; import xaero.map.region.MapTileChunk; import xaeroplus.Globals; -import xaeroplus.feature.render.MinimapBackgroundDrawHelper; +import xaeroplus.feature.render.DrawHelper; import xaeroplus.settings.Settings; @Mixin(value = SupportXaeroWorldmap.class, remap = false) @@ -72,11 +72,11 @@ public void buildTransparentMMBg(final PoseStack matrixStack, final int minX, fi @Local(name = "chunk") MapTileChunk chunk ) { if (Settings.REGISTRY.transparentMinimapBackground.get()) { - MinimapBackgroundDrawHelper.addMMBackgroundToBuffer(matrixStack.last().pose(), - bgBufferBuilderRef.get(), - drawX, - drawZ, - chunk); + DrawHelper.addMMBackgroundToBuffer(matrixStack.last().pose(), + bgBufferBuilderRef.get(), + drawX, + drawZ, + chunk); } } @@ -94,32 +94,6 @@ public void drawTransparentMMBackground(final PoseStack matrixStack, final int m if (Settings.REGISTRY.transparentMinimapBackground.get()) bgTesselatorRef.get().end(); } - @Inject(method = "drawMinimap", at = @At(value = "RETURN"), remap = false) - public void drawXPShaderFeatures(final MinimapSession minimapSession, final PoseStack matrixStack, final MinimapRendererHelper helper, final int xFloored, final int zFloored, final int minViewX, final int minViewZ, final int maxViewX, final int maxViewZ, final boolean zooming, final double zoom, final double mapDimensionScale, final VertexConsumer overlayBufferBuilder, final MultiTextureRenderTypeRendererProvider multiTextureRenderTypeRenderers, final CallbackInfo ci) { - int mapX = xFloored >> 4; - int mapZ = zFloored >> 4; - int chunkX = mapX >> 2; - int chunkZ = mapZ >> 2; - int tileX = mapX & 3; - int tileZ = mapZ & 3; - int insideX = xFloored & 15; - int insideZ = zFloored & 15; - Globals.drawManager.drawMinimapFeatures( - minViewX, - maxViewX, - minViewZ, - maxViewZ, - chunkX, - chunkZ, - tileX, - tileZ, - insideX, - insideZ, - matrixStack, - overlayBufferBuilder, - helper); - } - @Inject(method = "tryToGetMultiworldId", at = @At( value = "INVOKE", target = "Lxaero/map/WorldMapSession;getMapProcessor()Lxaero/map/MapProcessor;" diff --git a/common/src/main/java/xaeroplus/module/ModuleManager.java b/common/src/main/java/xaeroplus/module/ModuleManager.java index 6eb29e92..1142b805 100644 --- a/common/src/main/java/xaeroplus/module/ModuleManager.java +++ b/common/src/main/java/xaeroplus/module/ModuleManager.java @@ -20,7 +20,9 @@ public class ModuleManager { new PaletteNewChunks(), new Portals(), new PortalSkipDetection(), + new RenderDistance(), new WaystoneSync(), + new WorldBorder(), new WorldTools() ).forEach(ModuleManager::addModule); } diff --git a/common/src/main/java/xaeroplus/module/impl/Highways.java b/common/src/main/java/xaeroplus/module/impl/Highways.java index e2c4efc1..0f41bd99 100644 --- a/common/src/main/java/xaeroplus/module/impl/Highways.java +++ b/common/src/main/java/xaeroplus/module/impl/Highways.java @@ -1,18 +1,18 @@ package xaeroplus.module.impl; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; -import it.unimi.dsi.fastutil.longs.LongArrayList; -import it.unimi.dsi.fastutil.longs.LongList; +import it.unimi.dsi.fastutil.ints.IntList; +import kaptainwutax.mathutils.util.Mth; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import xaeroplus.Globals; -import xaeroplus.XaeroPlus; +import xaeroplus.feature.render.Line; import xaeroplus.module.Module; import xaeroplus.settings.Settings; -import xaeroplus.util.ChunkUtils; import xaeroplus.util.ColorHelper; +import java.util.ArrayList; +import java.util.List; + import static xaeroplus.util.ColorHelper.getColor; public class Highways extends Module { @@ -29,7 +29,10 @@ public class Highways extends Module { * OW/End highways extend past actual road */ - private static final IntSet ringRoads = chunkSetFromPosList( + private final List OVERWORLD_END_LINES = generateHighwayLines(Level.OVERWORLD); + private final List NETHER_LINES = generateHighwayLines(Level.NETHER); + + private static final IntList ringRoads = IntList.of( 200, 500, 1000, @@ -58,7 +61,7 @@ public class Highways extends Module { 3750000 ); - private static final IntSet diamonds = chunkSetFromPosList( + private static final IntList diamonds = IntList.of( 2500, 5000, 25000, @@ -69,107 +72,80 @@ public class Highways extends Module { 3750000 ); - private static final int fiftyK = ChunkUtils.posToChunkPos(50000); - @Override public void onEnable() { - Globals.drawManager.registerChunkHighlightProvider( - this.getClass(), - this::getWindowedHighlightsSnapshot, - this::getHighwayColor); + Globals.drawManager.registerLineProvider( + this.getClass().getName(), + this::getHighwayLines, + this::getHighwayColor, + this::getLineWidth, + 5000 + ); } - @Override - public void onDisable() { - Globals.drawManager.unregisterChunkHighlightProvider(this.getClass()); + private List getHighwayLines(int windowRegionX, int windowRegionZ, int windowSize, ResourceKey dimension) { + if (dimension == Level.OVERWORLD || dimension == Level.END) { + return OVERWORLD_END_LINES; + } else if (dimension == Level.NETHER) { + return NETHER_LINES; + } else { + return new ArrayList<>(); + } } - public boolean isHighwayChunk(int x, int z, ResourceKey dimension) { - if (x == 0 || z == 0) return true; // cardinal directions - int w = width / 2; - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (x + i == 0 || x - i == 0) return true; - if (z + i == 0 || z - i == 0) return true; - } + private List generateHighwayLines(ResourceKey dimension) { + var lines = new ArrayList(500); + // if a line is too long we will start hitting floating point precision errors in opengl + // as the lines are translated to map and screen space + // so we break these up into smaller lines + int stride = 500_000; + + // cardinals + for (int i = -30_000_000; i < 30_000_000; i += stride) { + lines.add(new Line(i, 0, i + stride, 0)); + lines.add(new Line(0, i, 0, i + stride)); } - var xAbs = Math.abs(x); - var zAbs = Math.abs(z); - if (xAbs == zAbs) return true; // diags - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (xAbs - i == zAbs || xAbs + i == zAbs) return true; - } + + // diagonals + for (int i = -30_000_000; i < 30_000_000; i += stride) { + lines.add(new Line(i, i, i + stride, i + stride)); + lines.add(new Line(-i, i, -i - stride, i + stride)); } + if (dimension == Level.NETHER) { // ring roads - if (ringRoads.contains(xAbs)) { - if (z >= -xAbs && z <= xAbs) return true; - } - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (ringRoads.contains(xAbs - i)) { - if (z >= -xAbs + i && z <= xAbs - i) return true; - } - if (ringRoads.contains(xAbs + i)) { - if (z >= -xAbs - i && z <= xAbs + i) return true; - } - } - } - if (ringRoads.contains(zAbs)) { - if (x >= -zAbs && x <= zAbs) return true; - } - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (ringRoads.contains(zAbs - i)) { - if (x >= -zAbs + i && x <= zAbs - i) return true; - } - if (ringRoads.contains(zAbs + i)) { - if (x >= -zAbs - i && x <= zAbs + i) return true; - } + for (int ringRoad : ringRoads) { + int i = -ringRoad; + while (i < ringRoad) { + lines.add(new Line(i, -ringRoad, Mth.min(i + stride, ringRoad), -ringRoad)); + lines.add(new Line(i, ringRoad, Mth.min(i + stride, ringRoad), ringRoad)); + lines.add(new Line(-ringRoad, i, -ringRoad, Mth.min(i + stride, ringRoad))); + lines.add(new Line(ringRoad, i, ringRoad, Mth.min(i + stride, ringRoad))); + i += stride; } } // diamonds - if (diamonds.contains(xAbs + zAbs)) return true; - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (diamonds.contains(xAbs + zAbs - i)) return true; - if (diamonds.contains(xAbs + zAbs + i)) return true; - } + for (int diamond : diamonds) { + lines.add(new Line(diamond, 0, 0, diamond)); + lines.add(new Line(0, -diamond, diamond, 0)); + lines.add(new Line(0, -diamond, -diamond, 0)); + lines.add(new Line(-diamond, 0, 0, diamond)); } - // grid - if (xAbs < fiftyK && zAbs < fiftyK) { - if ((xAbs * 16) % 5000 == 0) return true; - if ((zAbs * 16) % 5000 == 0) return true; - if (w >= 1) { - for (int i = 1; i <= w; i++) { - if (((xAbs - i) * 16) % 5000 == 0) return true; - if (((xAbs + i) * 16) % 5000 == 0) return true; - if (((zAbs - i) * 16) % 5000 == 0) return true; - if (((zAbs + i) * 16) % 5000 == 0) return true; - } - } + // 50k grid - vertical and horizontal line every 5k blocks + for (int i = -50000; i < 50000; i += 5000) { + if (i == 0) continue; + lines.add(new Line(i, -50000, i, 50000)); + lines.add(new Line(-50000, i, 50000, i)); } } - return false; + return lines; } - public LongList getWindowedHighlightsSnapshot(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, final ResourceKey dimension) { - int minChunkX = ChunkUtils.regionCoordToChunkCoord(windowRegionX - windowRegionSize); - int maxChunkX = ChunkUtils.regionCoordToChunkCoord(windowRegionX + windowRegionSize); - int minChunkZ = ChunkUtils.regionCoordToChunkCoord(windowRegionZ - windowRegionSize); - int maxChunkZ = ChunkUtils.regionCoordToChunkCoord(windowRegionZ + windowRegionSize); - LongList chunks = new LongArrayList(8); - for (int x = minChunkX; x <= maxChunkX; x++) { - for (int z = minChunkZ; z <= maxChunkZ; z++) { - if (isHighwayChunk(x, z, dimension)) { - chunks.add(ChunkUtils.chunkPosToLong(x, z)); - } - } - } - return chunks; + @Override + public void onDisable() { + Globals.drawManager.unregisterLineProvider(this.getClass().getName()); } public int getHighwayColor() { @@ -188,11 +164,7 @@ public void setWidth(final Settings.HighwayWidth w) { width = w.getWidth(); } - private static IntOpenHashSet chunkSetFromPosList(int... pos) { - final IntOpenHashSet set = new IntOpenHashSet(pos.length); - for (int i = 0; i < pos.length; i++) { - set.add(ChunkUtils.posToChunkPos(pos[i])); - } - return set; + private float getLineWidth() { + return width; } } diff --git a/common/src/main/java/xaeroplus/module/impl/RenderDistance.java b/common/src/main/java/xaeroplus/module/impl/RenderDistance.java new file mode 100644 index 00000000..ae496d8f --- /dev/null +++ b/common/src/main/java/xaeroplus/module/impl/RenderDistance.java @@ -0,0 +1,68 @@ +package xaeroplus.module.impl; + +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import xaeroplus.Globals; +import xaeroplus.feature.render.Line; +import xaeroplus.module.Module; +import xaeroplus.util.ColorHelper; + +import java.util.Collections; +import java.util.List; + +import static xaeroplus.util.ChunkUtils.chunkCoordToCoord; +import static xaeroplus.util.ChunkUtils.coordToChunkCoord; + +public class RenderDistance extends Module { + private final int color = ColorHelper.getColor(255, 255, 0, 204); + + @Override + public void onEnable() { + Globals.drawManager.registerLineProvider( + this.getClass().getName(), + this::getLines, + this::getColor, + this::getLineWidth, + 50 + ); + } + + @Override + public void onDisable() { + Globals.drawManager.unregisterLineProvider(this.getClass().getName()); + } + + List getLines(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, final ResourceKey dimension) { + Minecraft mc = Minecraft.getInstance(); + var player = mc.player; + if (player == null) return Collections.emptyList(); + final int viewDistance = mc.options.serverRenderDistance; + final int width = viewDistance * 2 + 1; + final int middleChunkX = coordToChunkCoord(Mth.floor(player.getX())); + final int middleChunkZ = coordToChunkCoord(Mth.floor(player.getZ())); + final int chunkLeftX = middleChunkX - (width / 2); + final int chunkTopZ = middleChunkZ - (width / 2); + final int chunkRightX = chunkLeftX + width; + final int chunkBottomZ = chunkTopZ + width; + final int minBlockX = chunkCoordToCoord(chunkLeftX); + final int minBlockZ = chunkCoordToCoord(chunkTopZ); + final int maxBlockX = chunkCoordToCoord(chunkRightX); + final int maxBlockZ = chunkCoordToCoord(chunkBottomZ); + return List.of( + new Line(minBlockX, minBlockZ, maxBlockX, minBlockZ), + new Line(maxBlockX, minBlockZ, maxBlockX, maxBlockZ), + new Line(maxBlockX, maxBlockZ, minBlockX, maxBlockZ), + new Line(minBlockX, minBlockZ, minBlockX, maxBlockZ) + ); + } + + int getColor() { + return color; + } + + float getLineWidth() { + return 0.1f; + } +} diff --git a/common/src/main/java/xaeroplus/module/impl/WorldBorder.java b/common/src/main/java/xaeroplus/module/impl/WorldBorder.java new file mode 100644 index 00000000..5c1be2f5 --- /dev/null +++ b/common/src/main/java/xaeroplus/module/impl/WorldBorder.java @@ -0,0 +1,58 @@ +package xaeroplus.module.impl; + +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import xaeroplus.Globals; +import xaeroplus.feature.render.Line; +import xaeroplus.module.Module; +import xaeroplus.util.ColorHelper; + +import java.util.Collections; +import java.util.List; + +public class WorldBorder extends Module { + private final int color = ColorHelper.getColor(0, 255, 255, 204); + + @Override + public void onEnable() { + Globals.drawManager.registerLineProvider( + this.getClass().getName(), + this::getLines, + this::getColor, + this::getLineWidth, + 1000 + ); + } + + @Override + public void onDisable() { + Globals.drawManager.unregisterLineProvider(this.getClass().getName()); + } + + List getLines(final int windowRegionX, final int windowRegionZ, final int windowRegionSize, final ResourceKey dimension) { + Minecraft mc = Minecraft.getInstance(); + var level = mc.level; + if (level == null) return Collections.emptyList(); + var worldBorder = mc.level.getWorldBorder(); + int minX = Mth.floor(worldBorder.getMinX()); + int minZ = Mth.floor(worldBorder.getMinZ()); + int maxX = Mth.floor(worldBorder.getMaxX()); + int maxZ = Mth.floor(worldBorder.getMaxZ()); + return List.of( + new Line(minX, minZ, maxX, minZ), + new Line(maxX, minZ, maxX, maxZ), + new Line(maxX, maxZ, minX, maxZ), + new Line(minX, minZ, minX, maxZ) + ); + } + + int getColor() { + return color; + } + + float getLineWidth() { + return 0.1f; + } +} diff --git a/common/src/main/java/xaeroplus/settings/SettingLocation.java b/common/src/main/java/xaeroplus/settings/SettingLocation.java index 9ef9720b..f1e5739b 100644 --- a/common/src/main/java/xaeroplus/settings/SettingLocation.java +++ b/common/src/main/java/xaeroplus/settings/SettingLocation.java @@ -3,7 +3,7 @@ public enum SettingLocation { WORLD_MAP_MAIN, CHUNK_HIGHLIGHTS, - MINIMAP_OVERLAYS, + OVERLAYS, MINIMAP_MAIN, MINIMAP_VIEW, KEYBINDS, diff --git a/common/src/main/java/xaeroplus/settings/Settings.java b/common/src/main/java/xaeroplus/settings/Settings.java index 2e3bb956..8e81c7da 100644 --- a/common/src/main/java/xaeroplus/settings/Settings.java +++ b/common/src/main/java/xaeroplus/settings/Settings.java @@ -482,7 +482,7 @@ static void markChunksDirtyInWriteDistance() { "xaeroplus.setting.2b2t_highways_enabled", false, (b) -> ModuleManager.getModule(Highways.class).setEnabled(b)), - SettingLocation.CHUNK_HIGHLIGHTS); + SettingLocation.OVERLAYS); public enum HighwayWidth implements TranslatableSettingEnum { // Must be odd numbers for the center to be aligned correctly ONE(1), THREE(3), FIVE(5); @@ -507,7 +507,7 @@ public int getWidth() { HighwayWidth.values(), HighwayWidth.ONE, (v) -> ModuleManager.getModule(Highways.class).setWidth(v)), - SettingLocation.CHUNK_HIGHLIGHTS); + SettingLocation.OVERLAYS); public final EnumSetting highwaysColorSetting = register( EnumSetting.create( "2b2t Highways Color", @@ -515,7 +515,7 @@ public int getWidth() { ColorHelper.HighlightColor.values(), ColorHelper.HighlightColor.BLUE, (b) -> ModuleManager.getModule(Highways.class).setRgbColor(b.getColor())), - SettingLocation.CHUNK_HIGHLIGHTS); + SettingLocation.OVERLAYS); public final DoubleSetting highwaysColorAlphaSetting = register( DoubleSetting.create( "2b2t Highways Opacity", @@ -523,7 +523,7 @@ public int getWidth() { 0, 255, 10, 100, (b) -> ModuleManager.getModule(Highways.class).setAlpha(b)), - SettingLocation.CHUNK_HIGHLIGHTS); + SettingLocation.OVERLAYS); public final BooleanSetting owAutoWaypointDimension = register( BooleanSetting.create( "Prefer Overworld Waypoints", @@ -540,26 +540,18 @@ public int getWidth() { BooleanSetting.create( "Show Render Distance", "xaeroplus.setting.show_render_distance", - false), - SettingLocation.MINIMAP_OVERLAYS); - public final BooleanSetting showRenderDistanceWorldMapSetting = register( - BooleanSetting.create( - "Show Render Distance WorldMap", - "xaeroplus.setting.show_render_distance_world_map", - false), - SettingLocation.MINIMAP_OVERLAYS); + false, + (b) -> ModuleManager.getModule(RenderDistance.class).setEnabled(b) + ), + SettingLocation.OVERLAYS); public final BooleanSetting showWorldBorderSetting = register( BooleanSetting.create( "Show World Border", "xaeroplus.setting.show_world_border", - false), - SettingLocation.MINIMAP_OVERLAYS); - public final BooleanSetting showWorldBorderWorldMapSetting = register( - BooleanSetting.create( - "Show World Border WorldMap", - "xaeroplus.setting.show_world_border_world_map", - false), - SettingLocation.MINIMAP_OVERLAYS); + false, + (b) -> ModuleManager.getModule(WorldBorder.class).setEnabled(b) + ), + SettingLocation.OVERLAYS); public final BooleanSetting nullOverworldDimensionFolder = register( BooleanSetting.create( "null OW Dim Dir", diff --git a/common/src/main/java/xaeroplus/util/FloatSupplier.java b/common/src/main/java/xaeroplus/util/FloatSupplier.java new file mode 100644 index 00000000..55a02bdf --- /dev/null +++ b/common/src/main/java/xaeroplus/util/FloatSupplier.java @@ -0,0 +1,6 @@ +package xaeroplus.util; + +@FunctionalInterface +public interface FloatSupplier { + float getFloat(); +} diff --git a/common/src/main/resources/assets/xaeroplus/lang/en_us.json b/common/src/main/resources/assets/xaeroplus/lang/en_us.json index 34c2c95d..3a17cdfa 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/en_us.json +++ b/common/src/main/resources/assets/xaeroplus/lang/en_us.json @@ -104,13 +104,13 @@ "xaeroplus.setting.portal_skip_old_chunks_inverse": "PortalSkip OldChunks Inverse", "xaeroplus.setting.portal_skip_old_chunks_inverse.tooltip": "Uses OldChunks Inverse to determine if a chunk was not loaded before. Therefore a portal could not have been created in its radius. \n Requires OldChunks inverse to be enabled.", "xaeroplus.setting.2b2t_highways_enabled": "2b2t Highways", - "xaeroplus.setting.2b2t_highways_enabled.tooltip": "Highlights chunks on 2b2t highways", + "xaeroplus.setting.2b2t_highways_enabled.tooltip": "Renders lines over the positions of highways on 2b2t", "xaeroplus.setting.2b2t_highways_width": "2b2t Highways Width", - "xaeroplus.setting.2b2t_highways_width.tooltip": "Sets the width of the highway highlights", + "xaeroplus.setting.2b2t_highways_width.tooltip": "Sets the width of the highway lines", "xaeroplus.setting.2b2t_highways_color": "2b2t Highways Color", - "xaeroplus.setting.2b2t_highways_color.tooltip": "Sets the color of 2b2t Highways highlights", + "xaeroplus.setting.2b2t_highways_color.tooltip": "Sets the color of highway lines", "xaeroplus.setting.2b2t_highways_opacity": "2b2t Highways Opacity", - "xaeroplus.setting.2b2t_highways_opacity.tooltip": "Sets the color opacity of 2b2t Highways highlights", + "xaeroplus.setting.2b2t_highways_opacity.tooltip": "Sets the color opacity of highway lines", "xaeroplus.setting.old_biomes_enabled": "2b2t OldBiomes", "xaeroplus.setting.old_biomes_enabled.tooltip": "Highlights chunks that match the 2b2t 1.12.2 biomes.\nDue to chunk blending during the 1.12.2 chunk upgrade, OldChunks cannot always detect 1.12.2 chunks.\nThis module is only active in the overworld and will detect many chunks as false positives, although OldBiome chunk trails should be fairly obvious.", "xaeroplus.setting.old_biomes_save_load_to_disk": "Save/Load OldBiomes to Disk", @@ -131,12 +131,8 @@ "xaeroplus.setting.show_waypoint_distances.tooltip": "Display the distance to every waypoint in the full waypoint menu.", "xaeroplus.setting.show_render_distance": "Show Render Distance", "xaeroplus.setting.show_render_distance.tooltip": "Show server side render distance (actually just another setting).", - "xaeroplus.setting.show_render_distance_world_map": "Show Render Distance on WorldMap", - "xaeroplus.setting.show_render_distance_world_map.tooltip": "Show server side render distance on the WorldMap.", "xaeroplus.setting.show_world_border": "Show World Border", "xaeroplus.setting.show_world_border.tooltip": "Renders a rectangle on the current world border", - "xaeroplus.setting.show_world_border_world_map": "Show World Border on WorldMap", - "xaeroplus.setting.show_world_border_world_map.tooltip": "Renders a rectangle on the current world border on the WorldMap", "xaeroplus.setting.assumed_server_render_distance": "Server Render Distance", "xaeroplus.setting.assumed_server_render_distance.tooltip": "View-distance of the server.", "xaeroplus.setting.null_overworld_dimension_folder": "null OW Dim Dir", @@ -195,6 +191,7 @@ "xaeroplus.gui.off": "Off", "xaeroplus.gui.world_map_settings": "XaeroPlus WorldMap Settings", "xaeroplus.gui.chunk_highlight_settings": "Chunk Highlight Settings", + "xaeroplus.gui.overlay_settings": "Overlay Settings", "xaeroplus.gui.random": "Random", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus Requires Xaero's Minimap or BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Currently Installed Version: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/es_ar.json b/common/src/main/resources/assets/xaeroplus/lang/es_ar.json index abd784d5..a5f645da 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/es_ar.json +++ b/common/src/main/resources/assets/xaeroplus/lang/es_ar.json @@ -131,12 +131,8 @@ "xaeroplus.setting.show_waypoint_distances.tooltip": "Muestra la distancia a cada waypoint en el menú de waypoints.", "xaeroplus.setting.show_render_distance": "Mostrar Distancia Renderizado", "xaeroplus.setting.show_render_distance.tooltip": "Muestra la distancia de renderizado del servidor (en realidad, solo otro ajuste).", - "xaeroplus.setting.show_render_distance_world_map": "Mostrar Distancia Renderizado MapaMundi", - "xaeroplus.setting.show_render_distance_world_map.tooltip": "Muestra la distancia de renderizado del servidor en el MapaMundi.", "xaeroplus.setting.show_world_border": "Mostrar Frontera del Mundo", "xaeroplus.setting.show_world_border.tooltip": "Dibuja un rectángulo en la frontera actual del mundo", - "xaeroplus.setting.show_world_border_world_map": "Mostrar Frontera del Mundo en el Mapa del Mundo", - "xaeroplus.setting.show_world_border_world_map.tooltip": "Dibuja un rectángulo en la frontera actual del mundo en el Mapa del Mundo", "xaeroplus.setting.assumed_server_render_distance": "Distancia Renderizado Servidor", "xaeroplus.setting.assumed_server_render_distance.tooltip": "Distancia visual del servidor.", "xaeroplus.setting.null_overworld_dimension_folder": "Carpeta Dimension OW", @@ -195,6 +191,7 @@ "xaeroplus.gui.off": "Apagado", "xaeroplus.gui.world_map_settings": "Configuración del MapaMundi de XaeroPlus", "xaeroplus.gui.chunk_highlight_settings": "Configuración de resaltado de fragmentos", + "xaeroplus.gui.overlay_settings": "Configuración de superposición", "xaeroplus.gui.random": "Aleatorio", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus Requiere Xaero's Minimap o BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Versión Actualmente Instalada: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/fr_ca.json b/common/src/main/resources/assets/xaeroplus/lang/fr_ca.json index 88e04dad..6c3a926e 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/fr_ca.json +++ b/common/src/main/resources/assets/xaeroplus/lang/fr_ca.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Off", "xaeroplus.gui.world_map_settings": "Paramètres de WorldMap XaeroPlus", "xaeroplus.gui.chunk_highlight_settings": "Paramètres de surbrillance des morceaux", + "xaeroplus.gui.overlay_settings": "Paramètres de superposition", "xaeroplus.gui.random": "Aléatoire", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus nécessite la mini-carte de Xaero ou BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Version actuellement installée: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/fr_fr.json b/common/src/main/resources/assets/xaeroplus/lang/fr_fr.json index 88e04dad..6c3a926e 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/fr_fr.json +++ b/common/src/main/resources/assets/xaeroplus/lang/fr_fr.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Off", "xaeroplus.gui.world_map_settings": "Paramètres de WorldMap XaeroPlus", "xaeroplus.gui.chunk_highlight_settings": "Paramètres de surbrillance des morceaux", + "xaeroplus.gui.overlay_settings": "Paramètres de superposition", "xaeroplus.gui.random": "Aléatoire", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus nécessite la mini-carte de Xaero ou BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Version actuellement installée: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/ja_jp.json b/common/src/main/resources/assets/xaeroplus/lang/ja_jp.json index c1b9505f..beb31078 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/ja_jp.json +++ b/common/src/main/resources/assets/xaeroplus/lang/ja_jp.json @@ -193,6 +193,7 @@ "xaeroplus.gui.off": "Off", "xaeroplus.gui.world_map_settings": "XaeroPlus WorldMapの設定", "xaeroplus.gui.chunk_highlight_settings": "チャンクハイライト設定", + "xaeroplus.gui.overlay_settings": "オーバーレイ設定", "xaeroplus.gui.random": "ランダム", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlusにはXaero's MinimapまたはBetterPVPが必要です。", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "現在のバージョン: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/pl_pl.json b/common/src/main/resources/assets/xaeroplus/lang/pl_pl.json index 0484c651..aaebfc54 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/pl_pl.json +++ b/common/src/main/resources/assets/xaeroplus/lang/pl_pl.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Wyłączony", "xaeroplus.gui.world_map_settings": "Ustawienia mapy świata XaeroPlus", "xaeroplus.gui.chunk_highlight_settings": "Ustawienia podświetlania fragmentów", + "xaeroplus.gui.overlay_settings": "Ustawienia nakładki", "xaeroplus.gui.random": "Losowy", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus wymaga minimapy Xaero lub BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Aktualnie zainstalowana wersja: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/pt_pt.json b/common/src/main/resources/assets/xaeroplus/lang/pt_pt.json index 0c66bf8a..7a533fc7 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/pt_pt.json +++ b/common/src/main/resources/assets/xaeroplus/lang/pt_pt.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Deslig.", "xaeroplus.gui.world_map_settings": "Configurações do XaeroPlus Mapa-Mundo", "xaeroplus.gui.chunk_highlight_settings": "Configurações de destaque de pedaços", + "xaeroplus.gui.overlay_settings": "Configurações de sobreposição", "xaeroplus.gui.random": "Aleatório", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus precisa do Xaero's Minimap ou BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Versão instalada: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/ru_ru.json b/common/src/main/resources/assets/xaeroplus/lang/ru_ru.json index 6605f860..f8323e55 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/ru_ru.json +++ b/common/src/main/resources/assets/xaeroplus/lang/ru_ru.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Выкл", "xaeroplus.gui.world_map_settings": "Настройки карты мира XaeroPlus", "xaeroplus.gui.chunk_highlight_settings": "Настройки выделения чанка", + "xaeroplus.gui.overlay_settings": "Настройки наложения", "xaeroplus.gui.random": "Случайный", "xaeroplus.gui.minimap_incompatible.title": "Для XaeroPlus требуется мини-карта Xaero или BetterPVP.", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Текущая установленная версия: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/vi_vn.json b/common/src/main/resources/assets/xaeroplus/lang/vi_vn.json index aa1ff7b4..05290aff 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/vi_vn.json +++ b/common/src/main/resources/assets/xaeroplus/lang/vi_vn.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "Tắt", "xaeroplus.gui.world_map_settings": "Cài Đặt XaeroPlus WorldMap", "xaeroplus.gui.chunk_highlight_settings": "Cài đặt đánh dấu đoạn", + "xaeroplus.gui.overlay_settings": "Cài đặt lớp phủ", "xaeroplus.gui.random": "Ngẫu Nhiên", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus Yêu Cầu Xaero's Minimap hoặc BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "Phiên Bản Đã Cài Đặt: ", diff --git a/common/src/main/resources/assets/xaeroplus/lang/zh_cn.json b/common/src/main/resources/assets/xaeroplus/lang/zh_cn.json index 53635680..2a289c88 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/zh_cn.json +++ b/common/src/main/resources/assets/xaeroplus/lang/zh_cn.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "关闭", "xaeroplus.gui.world_map_settings": "XaeroPlus 世界地图设置", "xaeroplus.gui.chunk_highlight_settings": "块突出显示设置", + "xaeroplus.gui.overlay_settings": "覆盖设置", "xaeroplus.gui.random": "随机的", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus 需要 Xaero 的小地图或 BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "当前安装的版本:", diff --git a/common/src/main/resources/assets/xaeroplus/lang/zh_tw.json b/common/src/main/resources/assets/xaeroplus/lang/zh_tw.json index df2c4265..535ab65b 100644 --- a/common/src/main/resources/assets/xaeroplus/lang/zh_tw.json +++ b/common/src/main/resources/assets/xaeroplus/lang/zh_tw.json @@ -195,6 +195,7 @@ "xaeroplus.gui.off": "關閉", "xaeroplus.gui.world_map_settings": "XaeroPlus 世界地圖設定", "xaeroplus.gui.chunk_highlight_settings": "區塊高亮設定", + "xaeroplus.gui.overlay_settings": "覆蓋設定", "xaeroplus.gui.random": "隨機", "xaeroplus.gui.minimap_incompatible.title": "XaeroPlus 需要 Xaero 的小地圖或 BetterPVP", "xaeroplus.gui.minimap_incompatible.currently_installed_version": "目前安裝的版本:", diff --git a/common/src/main/resources/xaeroplus.mixins.json b/common/src/main/resources/xaeroplus.mixins.json index 4e76ba03..30e8c190 100644 --- a/common/src/main/resources/xaeroplus.mixins.json +++ b/common/src/main/resources/xaeroplus.mixins.json @@ -27,7 +27,6 @@ "MixinGuiEntityRadarSettings", "MixinGuiMap", "MixinGuiMinimapMain", - "MixinGuiMinimapOverlaysSettings", "MixinGuiSettingsWorldMap", "MixinGuiUpdateAll", "MixinGuiWaypoints", diff --git a/settings.gradle.kts b/settings.gradle.kts index 91c079a0..9b63b332 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ pluginManagement { } } gradle.extra.apply { - set("mod_version", "2.25.1") + set("mod_version", "2.25.2") set("minecraft_version", "1.20.1") set("parchment_version", "2023.09.03") set("worldmap_version_fabric", "1.39.2")