From a198b14fc7ad36677bd422f590e32dcf70481885 Mon Sep 17 00:00:00 2001 From: MakerTechno <102357646+makertechno@users.noreply.github.com> Date: Sat, 10 Jan 2026 17:36:06 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=A8=E8=BF=BD?= =?UTF-8?q?=E8=B8=AA=E5=AE=9E=E7=8E=B0=E7=9F=BF=E6=8E=A2=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/component/ComponentBuilder.java | 4 ++-- .../BlinkIconComponent.java | 2 +- .../client/gui/{icons => components}/Icon.java | 2 +- .../gui/{icons => components}/IconComponent.java | 2 +- .../IconComponentFactory.java | 2 +- .../RainbowIconComponent.java | 2 +- .../client/gui/components/package-info.java | 2 +- .../{components => cursors}/TAbstractCursor.java | 2 +- .../{components => cursors}/TDir3BodyCursor.java | 12 ++++++------ .../TDirectProjCursor.java | 4 ++-- .../{components => cursors}/TRelativeCursor.java | 12 ++++++------ .../TRenderComponent.java | 2 +- .../client/gui/cursors/package-info.java | 7 +++++++ .../client/gui/icons/package-info.java | 7 ------- .../gui/provider/BuilderResultComposer.java | 8 ++++---- .../client/gui/provider/TextureCache.java | 2 +- .../core/config/ConfigProcessor.java | 16 ++++++++-------- .../the_trackers/core/config/TConfig.java | 4 ++-- .../the_trackers/core/tool/TextureBuildTool.java | 2 +- .../the_trackers/core/track/EntityTracker.java | 4 ++-- .../core/track/WorldSingletonTracker.java | 2 +- .../track/states/ControllableTrackerState.java | 2 +- .../track/states/ControllableTrackerStateEx.java | 2 +- .../track/states/TickLimitedTrackerState.java | 2 +- .../core/track/states/TrackerStepState.java | 2 +- 25 files changed, 54 insertions(+), 54 deletions(-) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{icons => components}/BlinkIconComponent.java (94%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{icons => components}/Icon.java (79%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{icons => components}/IconComponent.java (92%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{icons => components}/IconComponentFactory.java (96%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{icons => components}/RainbowIconComponent.java (94%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{components => cursors}/TAbstractCursor.java (97%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{components => cursors}/TDir3BodyCursor.java (93%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{components => cursors}/TDirectProjCursor.java (96%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{components => cursors}/TRelativeCursor.java (95%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/{components => cursors}/TRenderComponent.java (90%) create mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/package-info.java delete mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/package-info.java diff --git a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java index 400def7..0f2c176 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java @@ -3,8 +3,8 @@ import net.minecraft.data.models.model.TextureMapping; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponentFactory; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.tool.TextureBuildTool; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/BlinkIconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java similarity index 94% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/BlinkIconComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java index c7dc8d3..17a4ffd 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/BlinkIconComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.icons; +package nowebsite.makertechno.the_trackers.client.gui.components; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/Icon.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java similarity index 79% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/Icon.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java index e467f22..8d1b1ed 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/Icon.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.icons; +package nowebsite.makertechno.the_trackers.client.gui.components; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java similarity index 92% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java index 0ea41e0..09ffdd4 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.icons; +package nowebsite.makertechno.the_trackers.client.gui.components; import net.minecraft.client.gui.GuiGraphics; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponentFactory.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java similarity index 96% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponentFactory.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java index 39be83f..d88c173 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/IconComponentFactory.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.icons; +package nowebsite.makertechno.the_trackers.client.gui.components; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/RainbowIconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java similarity index 94% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/RainbowIconComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java index 1a6a302..6dfad73 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/RainbowIconComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.icons; +package nowebsite.makertechno.the_trackers.client.gui.components; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/package-info.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/package-info.java index 84a2d63..73014fe 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/package-info.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/package-info.java @@ -4,4 +4,4 @@ import net.minecraft.MethodsReturnNonnullByDefault; -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TAbstractCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java similarity index 97% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TAbstractCursor.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java index f533dfd..eb36aff 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TAbstractCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; +package nowebsite.makertechno.the_trackers.client.gui.cursors; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDir3BodyCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java similarity index 93% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDir3BodyCursor.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java index 201374a..0487a00 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDir3BodyCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java @@ -1,9 +1,9 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; +package nowebsite.makertechno.the_trackers.client.gui.cursors; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.util.Mth; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; import org.joml.Matrix4fStack; /** @@ -69,10 +69,10 @@ protected void updateTransformer(float[] projScrPoint, float partialTick, float @Override protected void translateAndRenderComponents( - GuiGraphics graphics, - IconComponent component, - Matrix4fStack stack, - float partialTick, + GuiGraphics graphics, + IconComponent component, + Matrix4fStack stack, + float partialTick, float scale ) { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDirectProjCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java similarity index 96% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDirectProjCursor.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java index 97ea543..8f0e782 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TDirectProjCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; +package nowebsite.makertechno.the_trackers.client.gui.cursors; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; @@ -7,7 +7,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; import nowebsite.makertechno.the_trackers.core.track.algorithm.CameraProjector; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4fStack; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRelativeCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java similarity index 95% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRelativeCursor.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java index e52e5ad..13e8e83 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRelativeCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java @@ -1,12 +1,12 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; +package nowebsite.makertechno.the_trackers.client.gui.cursors; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponent; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.core.config.TConfig; import nowebsite.makertechno.the_trackers.core.track.algorithm.RelativeProjector; import org.joml.Matrix4fStack; @@ -91,12 +91,12 @@ protected void renderInsights(GuiGraphics graphics, float[] projScrPoint, float stack.popMatrix(); RenderSystem.applyModelViewMatrix(); } - + protected void translateAndRenderComponents( GuiGraphics graphics, float[] projScrPoint, IconComponent pointerComponent, - IconComponent entityComponent, + IconComponent entityComponent, Matrix4fStack stack, float partialTick, float scale @@ -147,4 +147,4 @@ protected void translateAndRenderComponents( stack.popMatrix(); // 1 } -} \ No newline at end of file +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRenderComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java similarity index 90% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRenderComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java index bf50b2d..0fa782f 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/TRenderComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java @@ -1,4 +1,4 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; +package nowebsite.makertechno.the_trackers.client.gui.cursors; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/package-info.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/package-info.java new file mode 100644 index 0000000..388efc5 --- /dev/null +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package nowebsite.makertechno.the_trackers.client.gui.cursors; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/package-info.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/package-info.java deleted file mode 100644 index c68f731..0000000 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/icons/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package nowebsite.makertechno.the_trackers.client.gui.icons; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java index 17488f4..68ec43f 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java @@ -1,10 +1,10 @@ package nowebsite.makertechno.the_trackers.client.gui.provider; import nowebsite.makertechno.the_trackers.api.component.ComponentBuilder; -import nowebsite.makertechno.the_trackers.client.gui.components.*; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponent; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponentFactory; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; +import nowebsite.makertechno.the_trackers.client.gui.cursors.*; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import org.jetbrains.annotations.Nullable; public final class BuilderResultComposer { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/TextureCache.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/TextureCache.java index 1fec934..1e0062d 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/TextureCache.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/TextureCache.java @@ -4,7 +4,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import nowebsite.makertechno.the_trackers.TheTrackers; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.core.tool.TextureBuildTool; import org.jetbrains.annotations.Contract; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java index 9b780f0..24222f3 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java @@ -2,13 +2,13 @@ import com.mojang.datafixers.util.Pair; import net.minecraft.world.entity.EntityType; -import nowebsite.makertechno.the_trackers.client.gui.components.TDir3BodyCursor; -import nowebsite.makertechno.the_trackers.client.gui.components.TDirectProjCursor; -import nowebsite.makertechno.the_trackers.client.gui.components.TRelativeCursor; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponentFactory; -import nowebsite.makertechno.the_trackers.client.gui.icons.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TDir3BodyCursor; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TDirectProjCursor; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRelativeCursor; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.event.TModClient; import org.jetbrains.annotations.NotNull; @@ -20,7 +20,7 @@ import java.util.stream.Collectors; public final class ConfigProcessor { - + private static final Pair, Supplier> OF_EMPTY =new Pair<>(null, TRenderComponent::ofNull); public static boolean isValidEntityBindCRCursor(Object o) { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java index 9443929..12140f0 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java @@ -7,7 +7,7 @@ import net.neoforged.fml.event.config.ModConfigEvent; import net.neoforged.neoforge.common.ModConfigSpec; import nowebsite.makertechno.the_trackers.TheTrackers; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import nowebsite.makertechno.the_trackers.core.event.TModClient; import nowebsite.makertechno.the_trackers.core.track.EntityTracker; import nowebsite.makertechno.the_trackers.core.track.algorithm.ProjectAlgorithmLib; @@ -157,4 +157,4 @@ static void onLoad(final ModConfigEvent event) { static void onFileChanged(final ModConfigEvent.Reloading event) { onLoad(event); } -} \ No newline at end of file +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/tool/TextureBuildTool.java b/src/main/java/nowebsite/makertechno/the_trackers/core/tool/TextureBuildTool.java index 8a71882..9b502c1 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/tool/TextureBuildTool.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/tool/TextureBuildTool.java @@ -10,7 +10,7 @@ import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import nowebsite.makertechno.the_trackers.TheTrackers; -import nowebsite.makertechno.the_trackers.client.gui.icons.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java index 99254b3..3cea36b 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java @@ -8,7 +8,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.entity.PartEntity; import nowebsite.makertechno.the_trackers.client.gui.TGui; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import nowebsite.makertechno.the_trackers.core.config.TConfig; import nowebsite.makertechno.the_trackers.core.track.states.TrackerStepState; import org.jetbrains.annotations.NotNull; @@ -120,4 +120,4 @@ private static boolean isTargetEntity(Entity entity) { private static boolean isTargetType(@NotNull EntityType entityType, @NotNull Entity entity) { return entityType == entity.getType(); } -} \ No newline at end of file +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java index b865f26..4f175da 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java @@ -8,7 +8,7 @@ import nowebsite.makertechno.the_trackers.api.component.SimpleComponent; import nowebsite.makertechno.the_trackers.api.component.StaticComponent; import nowebsite.makertechno.the_trackers.client.gui.TGui; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import nowebsite.makertechno.the_trackers.client.gui.provider.BuilderResultComposer; import nowebsite.makertechno.the_trackers.core.track.states.ControllableTrackerState; import nowebsite.makertechno.the_trackers.core.track.states.ControllableTrackerStateEx; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java index 0867590..1487f8c 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java @@ -5,7 +5,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import nowebsite.makertechno.the_trackers.api.component.StaticComponent; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import java.util.function.Function; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java index cb75d96..2214cb8 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java @@ -4,7 +4,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import java.util.Arrays; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java index 4ff535a..48797af 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java @@ -1,7 +1,7 @@ package nowebsite.makertechno.the_trackers.core.track.states; import net.minecraft.world.entity.Entity; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; public class TickLimitedTrackerState extends ControllableTrackerState{ private final int maxTicked; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java index 9cc7046..ee9113d 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java @@ -3,7 +3,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.components.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; public class TrackerStepState { private Vec3 currentPos; From ec00e0ebd67cacfe0f02ff5dd6da11d75f36014d Mon Sep 17 00:00:00 2001 From: MakerTechno <102357646+makertechno@users.noreply.github.com> Date: Sat, 10 Jan 2026 21:48:22 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E7=9F=BF=E6=8E=A2=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/component/ComponentBuilder.java | 36 +++++++++++++------ .../the_trackers/api/examples/TestAdd1.java | 2 +- ...actory.java => BasicComponentFactory.java} | 2 +- .../client/gui/components/ItemComponent.java | 5 +++ .../client/gui/cursors/TAbstractCursor.java | 17 ++++++--- .../client/gui/cursors/TDirectProjCursor.java | 5 +++ .../client/gui/cursors/TRelativeCursor.java | 5 +++ .../client/gui/cursors/TRenderComponent.java | 4 ++- .../gui/provider/BuilderResultComposer.java | 9 ++--- .../core/config/ConfigProcessor.java | 22 ++++++------ 10 files changed, 73 insertions(+), 34 deletions(-) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/{IconComponentFactory.java => BasicComponentFactory.java} (98%) create mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java diff --git a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java index 0f2c176..eafa04e 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java @@ -3,12 +3,13 @@ import net.minecraft.data.models.model.TextureMapping; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.tool.TextureBuildTool; import javax.annotation.Nullable; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -28,7 +29,8 @@ public class ComponentBuilder { private boolean isSmoothMove = false; private boolean affectedByPlayerSettingsScale = false; private boolean autoLifecycle = false; - private Function definedScaleMultiple = scale -> scale; + private Function rescaleFunc = scale -> scale; + private BiFunction alphaTransformer = (distance, alpha) -> alpha; public ComponentBuilder() {} @@ -77,7 +79,7 @@ public ComponentBuilder setIcon1(String key) { } /** - * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link IconComponentFactory} + * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link BasicComponentFactory} */ public ComponentBuilder setIcon1Pattern(String pattern) { this.component1Pattern = pattern; @@ -104,7 +106,7 @@ public ComponentBuilder setIcon2(String key) { } /** - * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link IconComponentFactory} + * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link BasicComponentFactory} */ public ComponentBuilder setIcon2Pattern(String pattern) { this.component2Pattern = pattern; @@ -131,7 +133,7 @@ public ComponentBuilder setIcon3(String key) { } /** - * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link IconComponentFactory} + * 设置图标1的容器。默认为null(获取时使用default),设置请参见{@link BasicComponentFactory} */ public ComponentBuilder setIcon3Pattern(String pattern) { this.component3Pattern = pattern; @@ -165,8 +167,16 @@ public ComponentBuilder setAutoLifecycle(boolean autoLifecycle) { /** * 设置乘数再运算器,一般建议在这里对最终大小进行区间移动和缩放。 * */ - public ComponentBuilder defineScaleMultiple(Function definedScaleMultipleApplier) { - this.definedScaleMultiple = definedScaleMultipleApplier; + public ComponentBuilder defineRescale(Function rescale) { + this.rescaleFunc = rescale; + return this; + } + + /** + * 设置透明度再运算器。 + * */ + public ComponentBuilder defineAlphaTransformer(BiFunction alphaTransformer) { + this.alphaTransformer = alphaTransformer; return this; } @@ -183,7 +193,8 @@ public BuilderResult build() { isSmoothMove, autoLifecycle, affectedByPlayerSettingsScale, - definedScaleMultiple + rescaleFunc, + alphaTransformer ); } @@ -196,7 +207,8 @@ public static final class BuilderResult { public final ComponentType type; public final Supplier icon1, icon2, icon3; public final boolean isSmoothMove, autoLifecycle, affectedBySettings; - public final Function multiple; + public final Function rescale; + public final BiFunction transformAlpha; private BuilderResult( ComponentType type, Supplier icon1, @@ -209,7 +221,8 @@ private BuilderResult( boolean isSmoothMove, boolean autoLifecycle, boolean affectedBySettings, - Function multiple + Function rescale, + BiFunction transformAlpha ) { this.type = type; this.icon1 = icon1; @@ -222,7 +235,8 @@ private BuilderResult( this.isSmoothMove = isSmoothMove; this.autoLifecycle = autoLifecycle; this.affectedBySettings = affectedBySettings; - this.multiple = multiple; + this.rescale = rescale; + this.transformAlpha = transformAlpha; } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java b/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java index b30b9b1..6c0e276 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java @@ -21,7 +21,7 @@ public class TestAdd1 { .setComponentType(ComponentBuilder.ComponentType.DIRECT) .setIcon1(Items.DIAMOND) .setIcon1Pattern("rainbow:2") - .defineScaleMultiple(scale -> (float) (1F + Math.min(scale / 2.2, 1f) * Math.min(scale / 2.2, 1f))) + .defineRescale(scale -> (float) (1F + Math.min(scale / 2.2, 1f) * Math.min(scale / 2.2, 1f))) .setSmoothMove(true) .build(); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java similarity index 98% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java index d88c173..f9396c7 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponentFactory.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java @@ -5,7 +5,7 @@ import java.util.function.Supplier; -public class IconComponentFactory { +public class BasicComponentFactory { @Contract(value = "_ -> new", pure = true) public static @NotNull Supplier getDefault(Icon icon) { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java new file mode 100644 index 0000000..8a75a29 --- /dev/null +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java @@ -0,0 +1,5 @@ +package nowebsite.makertechno.the_trackers.client.gui.components; + +public class ItemComponent { + // 2026/1/10-20:54 TODO: Interface, Render, and others. +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java index eb36aff..b822f6a 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java @@ -7,6 +7,7 @@ import net.minecraft.world.phys.Vec3; import nowebsite.makertechno.the_trackers.core.config.TConfig; +import java.util.function.BiFunction; import java.util.function.Function; public abstract class TAbstractCursor implements TRenderComponent{ @@ -14,7 +15,8 @@ public abstract class TAbstractCursor implements TRenderComponent{ protected float scaleCached; protected boolean smoothMove = true; protected boolean affectedByPlayerScale = true; - protected Function multiple = scale -> scale ; + protected Function rescale = scale -> scale; + protected BiFunction transformAlpha = (distance, alpha) -> alpha; protected TAbstractCursor() { this.scaleCached = (float) TConfig.scale; @@ -28,8 +30,12 @@ public void setAffectedByPlayerScale(boolean affectedByPlayerScale) { this.affectedByPlayerScale = affectedByPlayerScale; } - public void setMultiple(Function multiple) { - this.multiple = multiple; + public void setRescale(Function rescale) { + this.rescale = rescale; + } + + public void setTransformAlpha(BiFunction transformAlpha) { + this.transformAlpha = transformAlpha; } @Override @@ -42,14 +48,15 @@ public void render(GuiGraphics graphics, Player player, Vec3 target, float parti float[] projScrPoint = getProjectScr(graphics, player, target); - float scale = multiple.apply(calculateScale(projScrPoint)); + float scale = rescale.apply(calculateScale(projScrPoint)); updateTransformer(projScrPoint, partialTick, scale); - RenderSystemInit(getAlpha(projScrPoint)); + RenderSystemInit(transformAlpha.apply(getScrDistance(projScrPoint), getAlpha(projScrPoint))); renderInsights(graphics, projScrPoint, partialTick, scale); RenderSystemRestore(); } protected abstract float[] getProjectScr(GuiGraphics graphics, Player player, Vec3 target); + protected abstract float getScrDistance(float[] projectScrPoint); protected float calculateScale(float[] projScrPoint) { return affectedByPlayerScale ? scaleCached : 1; } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java index 8f0e782..1f9af06 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java @@ -68,6 +68,11 @@ public void flush() { ); } + @Override + protected float getScrDistance(float[] projectScrPoint) { + return projectScrPoint[3]; + } + @Override protected float calculateScale(float[] projScrPoint) { return super.calculateScale(projScrPoint) / projScrPoint[3] * 15; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java index 13e8e83..f7b1f22 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java @@ -62,6 +62,11 @@ protected float[] getProjectScr(GuiGraphics graphics, Player player, Vec3 target ); } + @Override + protected float getScrDistance(float[] projectScrPoint) { + return projectScrPoint[1]; + } + @Override protected void updateTransformer(float[] projScrPoint, float partialTick, float scale) { float radius = (float) (-projScrPoint[0] - Math.PI/2); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java index 0fa782f..17db6ab 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java @@ -6,12 +6,14 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; +import java.util.function.BiFunction; import java.util.function.Function; public interface TRenderComponent { void setSmoothMove(boolean smoothMove); void setAffectedByPlayerScale(boolean affectedByPlayerScale); - void setMultiple(Function multiple); + void setRescale(Function rescale); + void setTransformAlpha(BiFunction transformAlpha); void flush(); void render(GuiGraphics graphics, Player player, Vec3 target, float partialTick); @Contract(pure = true) diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java index 68ec43f..d1fe6e2 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java @@ -3,7 +3,7 @@ import nowebsite.makertechno.the_trackers.api.component.ComponentBuilder; import nowebsite.makertechno.the_trackers.client.gui.cursors.*; import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import org.jetbrains.annotations.Nullable; @@ -18,7 +18,8 @@ public static TRenderComponent compose(ComponentBuilder.BuilderResult result) { }; component.setSmoothMove(result.isSmoothMove); component.setAffectedByPlayerScale(result.affectedBySettings); - component.setMultiple(result.multiple); + component.setRescale(result.rescale); + component.setTransformAlpha(result.transformAlpha); return component; } @@ -61,7 +62,7 @@ public static TRenderComponent composeDirectComponent(ComponentBuilder.BuilderRe private static IconComponent getIconComponent(@Nullable String pattern, Icon icon) { return pattern == null - ? IconComponentFactory.getDefault(icon).get() - : IconComponentFactory.getIconComponent(icon, pattern).get(); + ? BasicComponentFactory.getDefault(icon).get() + : BasicComponentFactory.getIconComponent(icon, pattern).get(); } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java index 24222f3..759ab6c 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java @@ -7,7 +7,7 @@ import nowebsite.makertechno.the_trackers.client.gui.cursors.TRelativeCursor; import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.event.TModClient; @@ -39,7 +39,7 @@ public static boolean isValidEntityBindCRCursor(Object o) { if (split.length == 4) { String[] patterns = split[3].split("&"); if (patterns.length != 2) return false; - return IconComponentFactory.hasElementPattern(patterns[0]) && IconComponentFactory.hasElementPattern(patterns[1]); + return BasicComponentFactory.hasElementPattern(patterns[0]) && BasicComponentFactory.hasElementPattern(patterns[1]); } return true; @@ -67,19 +67,19 @@ public static Set, Supplier>> col if (split.length == 4) { String[] patterns = split[3].split("&"); if (patterns.length == 2 && - IconComponentFactory.hasElementPattern(patterns[0]) && - IconComponentFactory.hasElementPattern(patterns[1])) { + BasicComponentFactory.hasElementPattern(patterns[0]) && + BasicComponentFactory.hasElementPattern(patterns[1])) { supplier = () -> new TRelativeCursor( - IconComponentFactory.getIconComponent(pointerIcon, patterns[0]).get(), - IconComponentFactory.getIconComponent(icon, patterns[1]).get() + BasicComponentFactory.getIconComponent(pointerIcon, patterns[0]).get(), + BasicComponentFactory.getIconComponent(icon, patterns[1]).get() ); return new Pair, Supplier>(entityType, supplier); } } supplier = () -> new TRelativeCursor( - IconComponentFactory.getDefault(pointerIcon).get(), - IconComponentFactory.getDefault(icon).get() + BasicComponentFactory.getDefault(pointerIcon).get(), + BasicComponentFactory.getDefault(icon).get() ); return new Pair, Supplier>(entityType, supplier); }) @@ -108,7 +108,7 @@ public static boolean isValidCREntityBindDTCursor(Object o) { if (!(style[0].equals("normal") || style[0].equals("3body"))) return false; - if (split.length == 3) return IconComponentFactory.hasElementPattern(split[2]); + if (split.length == 3) return BasicComponentFactory.hasElementPattern(split[2]); return true; } @@ -132,8 +132,8 @@ public static Set, Supplier>> col if (icon.equals(Icon.NONE)) return OF_EMPTY; } Supplier cps; - if (split.length == 3) cps = IconComponentFactory.getIconComponent(icon, split[2]); - else cps = IconComponentFactory.getDefault(icon); + if (split.length == 3) cps = BasicComponentFactory.getIconComponent(icon, split[2]); + else cps = BasicComponentFactory.getDefault(icon); Supplier supplier; if (style[0].equals("3body")){ From 1d62aaa671ca33753e96756b0c3e2a525943cc42 Mon Sep 17 00:00:00 2001 From: MagicHarp <161911368+MagicHarp@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:18:27 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B4=B4=E5=9B=BEx4?= =?UTF-8?q?=EF=BC=8C=E9=AD=94=E6=B3=95=E9=A3=9E=E5=88=80=E8=B0=83=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../the_trackers/core/config/TConfig.java | 1 + .../the_trackers/textures/icons/deerclops.png | Bin 0 -> 1228 bytes 2 files changed, 1 insertion(+) create mode 100644 src/main/resources/assets/the_trackers/textures/icons/deerclops.png diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java index 12140f0..48b5957 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java @@ -72,6 +72,7 @@ public class TConfig { "terra_entity:brain_of_cthulhu|normal|brain_of_cthulhu", "terra_entity:eater_of_worlds|normal|eater_of_worlds", "terra_entity:queen_bee|normal|queen_bee", + "terra_entity:deerclops|normal|deerclops", "terra_entity:skeletron|normal|skeletron", "terra_entity:hill_of_flesh|normal|wall_of_flesh", "terra_entity:wall_of_flesh|normal|wall_of_flesh", diff --git a/src/main/resources/assets/the_trackers/textures/icons/deerclops.png b/src/main/resources/assets/the_trackers/textures/icons/deerclops.png new file mode 100644 index 0000000000000000000000000000000000000000..af74df31ea8558f68cc34768ae2f026c2b7c364e GIT binary patch literal 1228 zcmV;-1T*`IP)|y7{~9~kf0)5lS;(-CC$wbiv>1iKG6yal2L>+!X&B>F*BnV3Mo-AsR-<45ky3d zh#-u}4?!)OGndpr$QI24CnbqGu$M0qoX+ps^S`~Gvvc-5(|b%f=v!uCmm7ZGVj=LCkzFL?v*X}6c}N?@xFU4 zNQ9o~+Y#hHJ$12$7-A8yAObcy$c2vF<@vH4_Gv)**tV^atx_n^pP2!YEM2@PwzRi* zbNt+#KK(}+9Q-(bh9LDy|8^S}RRg>%wsf!V+7kwkOf*Dd7$7IXAuA-H`~syN&28&K z=h{`~I+>C}zS(~$gp=P{#pT<+dReTRIhAjDIU_MSQaSB0YOfVLEkH>4{rJCA`{rwG z6)`)cw;Pu=#xC#>MVRvU_G!uGRJ4lRz?Z*-HEE@q94Ypm+|OeZ;g0sp?IrR_i?F@E zCSu*)_ax0_B7mrc0)&(&3NeYFJ?UmzbBRG9FUXT3kt#Nl&J<_Ky1RR93(+h&`S?{Y zi`Ur))+@9psRu>BytTy!8{6_QwZFc!B7FfCgyyh7p&?v*Nf`O)p!pL64r>@Y@1h5@ z7v;P;<7R%cv?lCc+ZI|s8MgD$BR_@fR;~z>Kl~oUA&|vG zmsc%<3W*6(ZKaLOlppRh4S$*&B;Mclp6&17wMn5B#CVX;_I?^|MTF!K|Mp0cT>u%s=Wl~hR9b5)b=xh-tE!7eGV;e!xE zEadzPB;UNXDlvX;XrTx#yy7w&WX{jLxzET!O2U5Zt}e6T!_X6hKn^Vb6Q;QAT9p{U zo)iGL-FZtmJai~*e)<6;@YV}AN8FYJec|ke7entO>&*vWMC3#^1{7=xKNorar~dlK z)FdI{7yG_40uSwcErd&_B7VK~@zD3&mI_je%fl?vRedW7e16Bv3G>3!9{+K|W`%Rd zO|6F8)zMLbKRh~W=h1J+qOXtLx&5iCd8<13j1c6kw~|&$L{6m8zwy$$X10%Oy8Azb zEFitrL`*@fkYt!OJKn~g_A!UGkntE*hu=HN~rFNsf{FDeePV?lCE6r zCEiE6IbZkm55%ga$r8?7?765``CJ#5y5CB&kyyV9+3ZwnYv0DY@#_v05miM5)xOz~ q0(;iP0Lcz`z27ddF3JU0f&T#N9!kbt@U%Jr0000 Date: Tue, 13 Jan 2026 22:24:33 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=8D=87=E7=BA=A7neoforge=E5=88=B021.1.215?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0d4c046..a0b45f9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ parchment_mappings_version=2024.11.13 minecraft_version=1.21.1 minecraft_version_range=[1.21.1, 1.22) -neo_version=21.1.209 +neo_version=21.1.215 neo_version_range=[21.1.0,) loader_version_range=[4,) From e20c6808dc665e1d35ae6a31c77df29ca6e51401 Mon Sep 17 00:00:00 2001 From: MakerTechno <102357646+makertechno@users.noreply.github.com> Date: Wed, 21 Jan 2026 22:04:52 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=85=A8=E8=BF=BD=E8=B8=AA=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=9B=B4=E6=8E=A5=E6=B8=B2=E6=9F=93=E7=89=A9=E5=93=81?= =?UTF-8?q?(=E4=BB=A3=E7=A0=81=E4=BA=A4=E4=BA=92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/component/ComponentBuilder.java | 42 +++-- .../the_trackers/api/examples/TestAdd1.java | 2 +- .../client/gui/RendererToScreen.java | 167 ------------------ .../client/gui/components/BaseComponent.java | 36 ++++ .../gui/components/BasicComponentFactory.java | 16 +- ...IconComponent.java => BlinkComponent.java} | 6 +- .../client/gui/components/IRenderElement.java | 15 ++ .../client/gui/components/Icon.java | 23 ++- .../client/gui/components/IconComponent.java | 28 --- .../client/gui/components/ItemComponent.java | 35 +++- ...onComponent.java => RainbowComponent.java} | 6 +- .../client/gui/cursors/TAbstractCursor.java | 2 +- .../client/gui/cursors/TDir3BodyCursor.java | 31 ++-- .../client/gui/cursors/TDirectProjCursor.java | 13 +- .../client/gui/cursors/TRelativeCursor.java | 36 ++-- ...enderComponent.java => TRenderCursor.java} | 4 +- .../gui/provider/BuilderResultComposer.java | 40 ++--- .../core/config/ConfigProcessor.java | 28 +-- .../the_trackers/core/config/TConfig.java | 6 +- .../core/track/EntityTracker.java | 6 +- .../core/track/StableTracker.java | 44 ----- .../core/track/TrackersMonitor.java | 2 +- .../core/track/WorldSingletonTracker.java | 18 +- .../states/ControllableTrackerState.java | 4 +- .../states/ControllableTrackerStateEx.java | 4 +- .../track/states/TickLimitedTrackerState.java | 4 +- .../core/track/states/TrackerStepState.java | 8 +- 27 files changed, 258 insertions(+), 368 deletions(-) delete mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/RendererToScreen.java create mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BaseComponent.java rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/{BlinkIconComponent.java => BlinkComponent.java} (88%) create mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IRenderElement.java delete mode 100644 src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/{RainbowIconComponent.java => RainbowComponent.java} (87%) rename src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/{TRenderComponent.java => TRenderCursor.java} (89%) delete mode 100644 src/main/java/nowebsite/makertechno/the_trackers/core/track/StableTracker.java diff --git a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java index eafa04e..f131258 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/api/component/ComponentBuilder.java @@ -1,10 +1,11 @@ package nowebsite.makertechno.the_trackers.api.component; -import net.minecraft.data.models.model.TextureMapping; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; +import nowebsite.makertechno.the_trackers.client.gui.components.IRenderElement; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; +import nowebsite.makertechno.the_trackers.client.gui.components.ItemComponent; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.tool.TextureBuildTool; @@ -20,11 +21,11 @@ public class ComponentBuilder { private ComponentType type = ComponentType.DIRECT; private String cursorPattern = null; - private Supplier icon1 = () -> Icon.NONE; + private Supplier icon1 = () -> Icon.NONE; private String component1Pattern = null; - private Supplier icon2 = () -> Icon.NONE; + private Supplier icon2 = () -> Icon.NONE; private String component2Pattern = null; - private Supplier icon3 = () -> Icon.NONE; + private Supplier icon3 = () -> Icon.NONE; private String component3Pattern = null; private boolean isSmoothMove = false; private boolean affectedByPlayerSettingsScale = false; @@ -62,10 +63,9 @@ public ComponentBuilder setIcon1(ResourceLocation location) { /** *

对于一般情况,该方法设置其中心图标。具有多个图标位的指针需要填充其它icon。

- *

将传入的物品的贴图作为图标。图标默认为空。

*/ - public ComponentBuilder setIcon1(Item item) { - icon1 = () -> getIcon(TextureMapping.getItemTexture(item).withPrefix("textures/")); + public ComponentBuilder setIcon1(ItemStack itemStack) { + icon1 = () -> getItemComponent(itemStack); return this; } @@ -91,8 +91,8 @@ public ComponentBuilder setIcon1Pattern(String pattern) { *

对于一般情况,该方法设置其中心图标。具有多个图标位的指针需要填充其它icon。

*

将传入的物品的贴图作为图标。图标默认为空。

*/ - public ComponentBuilder setIcon2(Item item) { - icon2 = () -> getIcon(TextureMapping.getItemTexture(item).withPrefix("textures/")); + public ComponentBuilder setIcon2(ItemStack itemStack) { + icon2 = () -> getItemComponent(itemStack); return this; } @@ -118,8 +118,8 @@ public ComponentBuilder setIcon2Pattern(String pattern) { *

对于一般情况,该方法设置其中心图标。具有多个图标位的指针需要填充其它icon。

*

将传入的物品的贴图作为图标。图标默认为空。

*/ - public ComponentBuilder setIcon3(Item item) { - icon3 = () -> getIcon(TextureMapping.getItemTexture(item).withPrefix("textures/")); + public ComponentBuilder setIcon3(ItemStack itemStack) { + icon3 = () -> getItemComponent(itemStack); return this; } @@ -202,20 +202,24 @@ private static Icon getIcon(ResourceLocation location) { return TextureBuildTool.initIcon("dynamic", location.withSuffix(".png"), Icon::new).orElse(Icon.NONE); } + private static ItemComponent getItemComponent(ItemStack stack) { + return new ItemComponent(stack); + } + public static final class BuilderResult { public final @Nullable String component1Pattern, component2Pattern, component3Pattern, cursorPattern; public final ComponentType type; - public final Supplier icon1, icon2, icon3; + public final Supplier element1, element2, element3; public final boolean isSmoothMove, autoLifecycle, affectedBySettings; public final Function rescale; public final BiFunction transformAlpha; private BuilderResult( ComponentType type, - Supplier icon1, + Supplier element1, @Nullable String component1Pattern, - Supplier icon2, + Supplier element2, @Nullable String component2Pattern, - Supplier icon3, + Supplier element3, @Nullable String component3Pattern, @Nullable String cursorPattern, boolean isSmoothMove, @@ -225,11 +229,11 @@ private BuilderResult( BiFunction transformAlpha ) { this.type = type; - this.icon1 = icon1; + this.element1 = element1; this.component1Pattern = component1Pattern; - this.icon2 = icon2; + this.element2 = element2; this.component2Pattern = component2Pattern; - this.icon3 = icon3; + this.element3 = element3; this.component3Pattern = component3Pattern; this.cursorPattern = cursorPattern; this.isSmoothMove = isSmoothMove; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java b/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java index 6c0e276..f764438 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/api/examples/TestAdd1.java @@ -19,7 +19,7 @@ public class TestAdd1 { private static final ComponentBuilder.BuilderResult posTo0 = new ComponentBuilder() .setComponentType(ComponentBuilder.ComponentType.DIRECT) - .setIcon1(Items.DIAMOND) + .setIcon1(Items.DIAMOND.getDefaultInstance()) .setIcon1Pattern("rainbow:2") .defineRescale(scale -> (float) (1F + Math.min(scale / 2.2, 1f) * Math.min(scale / 2.2, 1f))) .setSmoothMove(true) diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/RendererToScreen.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/RendererToScreen.java deleted file mode 100644 index 5d53755..0000000 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/RendererToScreen.java +++ /dev/null @@ -1,167 +0,0 @@ -/* -package nowebsite.makertechno.entity_tracker.client.gui; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.datafixers.util.Pair; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.entity_tracker.client.gui.components.TRenderComponent; -import nowebsite.makertechno.entity_tracker.core.track.algorithm.CameraProjector; -import nowebsite.makertechno.entity_tracker.core.track.algorithm.RelativeProjector; -import nowebsite.makertechno.entity_tracker.core.config.TConfig; -import nowebsite.makertechno.entity_tracker.client.gui.components.TRelativeCursor; -import nowebsite.makertechno.entity_tracker.client.gui.components.TEntityIcon; -import nowebsite.makertechno.entity_tracker.client.gui.components.TPointer; -import org.jetbrains.annotations.NotNull; -import org.joml.Matrix4fStack; - -public class RendererToScreen { - public static void centerRelativePointer(@NotNull GuiGraphics guiGraphics, @NotNull Player player, @NotNull Pair vec3CursorsPair) { - double[] arcAndDist = RelativeProjector.calculateAngle( - player.getEyePosition(), - player.getViewVector(1f), - vec3CursorsPair.getFirst(), - TConfig.projectAlgorithm::project - ); - TPointer pointer = vec3CursorsPair.getSecond().pointer(); - TEntityIcon icon = vec3CursorsPair.getSecond().icon(); - float angleRadians = (float) arcAndDist[0]; - double direct = arcAndDist[1]; - - // pickDirect is ease-in-out from 15 to 2(pointer.getHeight() + icon.getHeight()) when direct is in [0, 0.8), and infinity closes to 2(pointer.getHeight() + icon.getHeight()) when direct bigger than 1 - float pickDirect = 15 + (float) (Math.atan(direct / 0.8) * 140 / Math.PI); - //alpha close to 0 when pickDirect close to 15, close to 1 when pickDirect close to x, equal to 1 when pickDirect greater than x - float alpha = Math.min(1, Math.max(0, (pickDirect - 25) / (pointer.getHeight() + icon.getHeight()))); - - // init - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate( - GlStateManager.SourceFactor.SRC_ALPHA, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, - GlStateManager.SourceFactor.ONE, - GlStateManager.DestFactor.ZERO - ); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, alpha); - // matrix - Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); - matrix4fStack.pushMatrix(); // 1 - matrix4fStack.translate((float) guiGraphics.guiWidth() / 2, (float) guiGraphics.guiHeight() / 2, 0); - matrix4fStack.rotateZ((float) (-angleRadians - Math.PI/2)); - matrix4fStack.pushMatrix(); // 2 - matrix4fStack.translate(-(float) pointer.getWidth() / 2, -(float) pointer.getHeight() / 2, 0); - matrix4fStack.translate(0, -pickDirect, 0); - RenderSystem.applyModelViewMatrix(); - - */ -/* go on *//* - - guiGraphics.blit( - pointer.getLocation(), - 0, 0, - 0, 0, - pointer.getWidth(), pointer.getHeight(), - pointer.getWidth(), pointer.getHeight() - ); - */ -/* end of pointer rend *//* - - - if (icon != TEntityIcon.NONE) { - // roll back - matrix4fStack.popMatrix(); // 1 - matrix4fStack.pushMatrix(); // 2 - matrix4fStack.translate(-(float) icon.getWidth() / 2, -(float) icon.getHeight() / 2, 0); - matrix4fStack.translate(0, -(pickDirect - pointer.getHeight() - (int) Math.ceil(Math.sqrt(2 * icon.getHeight()) + 2)), 0); - - matrix4fStack.translate((float) icon.getWidth() / 2, (float) icon.getHeight() / 2, 0); - matrix4fStack.rotateZ((float) (angleRadians + Math.PI / 2)); - matrix4fStack.translate(-(float) icon.getWidth() / 2, -(float) icon.getHeight() / 2, 0); - - RenderSystem.applyModelViewMatrix(); - - */ -/* go on *//* - - guiGraphics.blit( - icon.getLocation(), - 0, 0, - 0, 0, - icon.getWidth(), icon.getHeight(), - icon.getWidth(), icon.getHeight() - ); - */ -/* end of icon rend *//* - - RenderSystem.resetTextureMatrix(); - } - - matrix4fStack.popMatrix(); // 1 - matrix4fStack.popMatrix(); // 0 - RenderSystem.applyModelViewMatrix(); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.defaultBlendFunc(); - RenderSystem.disableBlend(); - } - - public static void fullScreenPointer(@NotNull GuiGraphics guiGraphics, @NotNull Player player, @NotNull Pair vec3CursorsPair, GameRenderer renderer) { - float[] projScrPoint = CameraProjector.projectToScreen( - renderer, - vec3CursorsPair.getFirst(), - player.getEyePosition(), - Minecraft.getInstance().gameRenderer.getMainCamera(), - guiGraphics.guiWidth(), - guiGraphics.guiHeight() - ); - TRelativeCursor cursor = vec3CursorsPair.getSecond(); - TEntityIcon icon = cursor.icon(); - - float alpha = 1; - if (projScrPoint[2] < 0.2*guiGraphics.guiWidth()) alpha = (float) (projScrPoint[2]*0.6/(0.2*guiGraphics.guiWidth()) + 0.4); - - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, alpha); - - // init - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate( - GlStateManager.SourceFactor.SRC_ALPHA, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, - GlStateManager.SourceFactor.ONE, - GlStateManager.DestFactor.ZERO - ); - - Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); - matrix4fStack.pushMatrix(); // 1 - matrix4fStack.translate(-(float) icon.getWidth() / 2, -(float) icon.getHeight() / 2, 0); - matrix4fStack.translate(projScrPoint[0], projScrPoint[1], 0); - RenderSystem.applyModelViewMatrix(); - - if (icon != TEntityIcon.NONE) { - - */ -/* go on *//* - - guiGraphics.blit( - icon.getLocation(), - 0, 0, - 0, 0, - icon.getWidth(), icon.getHeight(), - icon.getWidth(), icon.getHeight() - ); - */ -/* end of icon rend *//* - - RenderSystem.resetTextureMatrix(); - } - - matrix4fStack.popMatrix(); // 0 - RenderSystem.applyModelViewMatrix(); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - RenderSystem.defaultBlendFunc(); - RenderSystem.disableBlend(); - } -} -*/ diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BaseComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BaseComponent.java new file mode 100644 index 0000000..ca29be8 --- /dev/null +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BaseComponent.java @@ -0,0 +1,36 @@ +package nowebsite.makertechno.the_trackers.client.gui.components; + +import net.minecraft.client.gui.GuiGraphics; +import org.jetbrains.annotations.NotNull; + +public class BaseComponent implements IRenderElement{ + private IRenderElement element; + public BaseComponent(IRenderElement element) { + this.element = element; + } + public void render(@NotNull GuiGraphics graphics, float partialTick) { + element.render(graphics, partialTick); + } + public IRenderElement getElement() { + return element; + } + public IRenderElement flush() { + element = element.flush(); + return element; + } + + @Override + public int width() { + return element.width(); + } + + @Override + public int height() { + return element.height(); + } + + @Override + public float rescale() { + return element.rescale(); + } +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java index f9396c7..a48ff6c 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BasicComponentFactory.java @@ -8,28 +8,28 @@ public class BasicComponentFactory { @Contract(value = "_ -> new", pure = true) - public static @NotNull Supplier getDefault(Icon icon) { - return () -> new IconComponent(icon); + public static @NotNull Supplier getDefault(IRenderElement element) { + return () -> new BaseComponent(element); } /** * 传入语句: "(blink/rainbow):(specific pattern)" */ @Contract(value = "_, _ -> new", pure = true) - public static @NotNull Supplier getIconComponent(Icon icon, @NotNull String pattern) { + public static @NotNull Supplier getElementComponent(IRenderElement element, @NotNull String pattern) { String [] patterns = pattern.split(":"); try { int countNum; if (patterns[0].equals("blink")) { countNum = Integer.parseInt(patterns[1]); - if (BlinkIconComponent.isValidPatterns(countNum)) return () -> new BlinkIconComponent(icon, countNum); + if (BlinkComponent.isValidPatterns(countNum)) return () -> new BlinkComponent(element, countNum); } else if (patterns[0].equals("rainbow")) { countNum = Integer.parseInt(patterns[1]); - if (RainbowIconComponent.isValidPatterns(countNum)) return () -> new RainbowIconComponent(icon, countNum); + if (RainbowComponent.isValidPatterns(countNum)) return () -> new RainbowComponent(element, countNum); } } catch (NumberFormatException ignored) {} - return getDefault(icon); + return getDefault(element); } /** @@ -40,9 +40,9 @@ public static boolean hasElementPattern(@NotNull String pattern) { if (patterns.length != 2) return false; try { if (patterns[0].equals("blink")) { - if (BlinkIconComponent.isValidPatterns(Integer.parseInt(patterns[1]))) return true; + if (BlinkComponent.isValidPatterns(Integer.parseInt(patterns[1]))) return true; } else if (patterns[0].equals("rainbow")) { - if (RainbowIconComponent.isValidPatterns(Integer.parseInt(patterns[1]))) return true; + if (RainbowComponent.isValidPatterns(Integer.parseInt(patterns[1]))) return true; } } catch (NumberFormatException e) { return false; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkComponent.java similarity index 88% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkComponent.java index 17a4ffd..8a4b423 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkIconComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/BlinkComponent.java @@ -4,13 +4,13 @@ import net.minecraft.client.gui.GuiGraphics; import org.jetbrains.annotations.NotNull; -public class BlinkIconComponent extends IconComponent { +public class BlinkComponent extends BaseComponent { private final int intervalBlink; private int intervalCount; private float alpha; private boolean reverse; - public BlinkIconComponent(Icon icon, int intervalBlink) { - super(icon); + public BlinkComponent(IRenderElement element, int intervalBlink) { + super(element); this.intervalBlink = intervalBlink; this.intervalCount = 0; } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IRenderElement.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IRenderElement.java new file mode 100644 index 0000000..cf4b2e8 --- /dev/null +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IRenderElement.java @@ -0,0 +1,15 @@ +package nowebsite.makertechno.the_trackers.client.gui.components; + +import net.minecraft.client.gui.GuiGraphics; +import org.jetbrains.annotations.NotNull; + +public interface IRenderElement { + void render(@NotNull GuiGraphics graphics, float partialTick); + IRenderElement flush(); + int width(); + int height(); + + default float rescale() { + return 1F; + } +} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java index 8d1b1ed..1ff8701 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/Icon.java @@ -1,9 +1,30 @@ package nowebsite.makertechno.the_trackers.client.gui.components; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; +import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -public record Icon(String regName, @Nullable ResourceLocation location, int width, int height) { +public record Icon(String regName, @Nullable ResourceLocation location, int width, int height) implements IRenderElement { public static final Icon NONE = new Icon("none", null, 16, 16); + public static final String DYNAMIC = "dynamic"; + + @SuppressWarnings("all") + @Override + public void render(@NotNull GuiGraphics graphics, float partialTick) { + if (this.equals(Icon.NONE)) return; + graphics.blit(location(), + 0,0, + 0,0, + width(), height(), + width(), height() + ); + } + + @Override + public IRenderElement flush() { + return regName.equals(DYNAMIC) ? this : TextureCache.getIcon(regName()); + } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java deleted file mode 100644 index 09ffdd4..0000000 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/IconComponent.java +++ /dev/null @@ -1,28 +0,0 @@ -package nowebsite.makertechno.the_trackers.client.gui.components; - -import net.minecraft.client.gui.GuiGraphics; -import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; -import org.jetbrains.annotations.NotNull; - -public class IconComponent { - private Icon icon; - public IconComponent(Icon icon) { - this.icon = icon; - } - @SuppressWarnings("all") - public void render(@NotNull GuiGraphics graphics, float partialTick) { - if (icon.equals(Icon.NONE)) return; - graphics.blit(icon.location(), - 0,0, - 0,0, - icon.width(), icon.height(), - icon.width(), icon.height() - ); - } - public Icon getIcon() { - return icon; - } - public void flush() { - icon = TextureCache.getIcon(icon.regName()); - } -} diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java index 8a75a29..cc38959 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/ItemComponent.java @@ -1,5 +1,38 @@ package nowebsite.makertechno.the_trackers.client.gui.components; -public class ItemComponent { +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class ItemComponent implements IRenderElement{ + private final ItemStack itemStack; + public ItemComponent(ItemStack itemStack) { + this.itemStack = itemStack.copy(); + } + @Override + public void render(@NotNull GuiGraphics graphics, float partialTick) { + graphics.renderItem(itemStack, 0, 0); + } + + @Override + public IRenderElement flush() { + return this; + } + + @Override + public int width() { + return 16; + } + + @Override + public int height() { + return 16; + } + + @Override + public float rescale() { + return 0.8f; + } + // 2026/1/10-20:54 TODO: Interface, Render, and others. } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java similarity index 87% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java index 6dfad73..ddd9555 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowIconComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java @@ -6,13 +6,13 @@ import java.awt.*; -public class RainbowIconComponent extends IconComponent { +public class RainbowComponent extends BaseComponent { private final int intervalColor; private int intervalCount; private float hue; private float r = 1.0F, g = 1.0F, b = 1.0F; - public RainbowIconComponent(Icon icon, int intervalColor) { - super(icon); + public RainbowComponent(IRenderElement element, int intervalColor) { + super(element); this.intervalColor = intervalColor; } public static boolean isValidPatterns(int intervalColor) { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java index b822f6a..5334b5c 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TAbstractCursor.java @@ -10,7 +10,7 @@ import java.util.function.BiFunction; import java.util.function.Function; -public abstract class TAbstractCursor implements TRenderComponent{ +public abstract class TAbstractCursor implements TRenderCursor { protected float scaleCached; protected boolean smoothMove = true; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java index 0487a00..a412c40 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDir3BodyCursor.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.util.Mth; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.BaseComponent; import org.joml.Matrix4fStack; /** @@ -29,14 +29,14 @@ protected void makeSmooth(float x, float y, float rot, float partialTick) { } } - protected final IconComponent component2, component3; + protected final BaseComponent component2, component3; protected boolean shouldFaceCenter = false; private final B3Transformer b3Transformer = new B3Transformer(0,0,0); - public TDir3BodyCursor(IconComponent component1, IconComponent component2, IconComponent component3) { + public TDir3BodyCursor(BaseComponent component1, BaseComponent component2, BaseComponent component3) { super(component1); this.component2 = component2; this.component3 = component3; @@ -70,12 +70,11 @@ protected void updateTransformer(float[] projScrPoint, float partialTick, float @Override protected void translateAndRenderComponents( GuiGraphics graphics, - IconComponent component, + BaseComponent component, Matrix4fStack stack, float partialTick, float scale ) { - for (int i = 0; i < 3; i++) { stack.pushMatrix(); @@ -88,8 +87,14 @@ protected void translateAndRenderComponents( } - private void renderComponent(GuiGraphics graphics, IconComponent component, Matrix4fStack stack, float partialTick, float scale, int index) { - float radius = (float) component.getIcon().height() * 1.6F * scale; + private void renderComponent(GuiGraphics graphics, BaseComponent component, Matrix4fStack stack, float partialTick, float scale, int index) { + scale = switch (index) { + case 0 -> scale * component.rescale(); + case 1 -> scale * component2.rescale(); + case 2 -> scale * component3.rescale(); + default -> 0; + }; + float radius = (float) component.getElement().height() * 1.6F * scale; float angle = b3Transformer.rot + index * Mth.TWO_PI / 3f; float px = b3Transformer.x + (float) Math.cos(angle) * radius; float py = b3Transformer.y + (float) Math.sin(angle) * radius; @@ -98,14 +103,14 @@ private void renderComponent(GuiGraphics graphics, IconComponent component, Matr stack.translate(px, py, 0f); stack.rotateZ(theta); stack.translate(-(float) switch (index) { - case 0 -> component.getIcon().width(); - case 1 -> component2.getIcon().width(); - case 2 -> component3.getIcon().width(); + case 0 -> component.getElement().width(); + case 1 -> component2.getElement().width(); + case 2 -> component3.getElement().width(); default -> 0; } / 2f * scale, -(float) switch (index) { - case 0 -> component.getIcon().height(); - case 1 -> component2.getIcon().height(); - case 2 -> component3.getIcon().height(); + case 0 -> component.getElement().height(); + case 1 -> component2.getElement().height(); + case 2 -> component3.getElement().height(); default -> 0; } / 2f * scale, 0f); stack.scale(scale); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java index 1f9af06..1e6ab64 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TDirectProjCursor.java @@ -7,7 +7,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.BaseComponent; import nowebsite.makertechno.the_trackers.core.track.algorithm.CameraProjector; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4fStack; @@ -42,11 +42,11 @@ protected void makeSmooth(float x, float y, float partialTick) { protected static final GameRenderer RENDERER = Minecraft.getInstance().gameRenderer; - protected final IconComponent component; + protected final BaseComponent component; private final Transformer transformer = new Transformer(0, 0); - public TDirectProjCursor(IconComponent component) { + public TDirectProjCursor(BaseComponent component) { super(); this.component = component; } @@ -98,14 +98,15 @@ protected void renderInsights(GuiGraphics graphics, float[] projScrPoint, float protected void translateAndRenderComponents( GuiGraphics graphics, - IconComponent component, + BaseComponent component, Matrix4fStack stack, float partialTick, float scale ) { + scale = scale * component.rescale(); stack.translate( - -(float) component.getIcon().width() * scale / 2, - -(float) component.getIcon().height() * scale / 2, + -(float) component.getElement().width() * scale / 2, + -(float) component.getElement().height() * scale / 2, 0 ); stack.translate(transformer.x , transformer.y, 0); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java index f7b1f22..291bc7f 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRelativeCursor.java @@ -5,7 +5,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.BaseComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.IRenderElement; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.core.config.TConfig; import nowebsite.makertechno.the_trackers.core.track.algorithm.RelativeProjector; @@ -35,11 +36,11 @@ public void makeSmooth(float radius, float dist, float partialTick) { } - private final IconComponent pointerIconComponent, entityIconComponent; + private final BaseComponent pointerIconComponent, entityIconComponent; private final Transformer transformer = new Transformer(0, 0); private float pickDirect = 0; - public TRelativeCursor(IconComponent pointerIconComponent, IconComponent entityIconComponent) { + public TRelativeCursor(BaseComponent pointerIconComponent, BaseComponent entityIconComponent) { super(); this.pointerIconComponent = pointerIconComponent; this.entityIconComponent = entityIconComponent; @@ -70,8 +71,8 @@ protected float getScrDistance(float[] projectScrPoint) { @Override protected void updateTransformer(float[] projScrPoint, float partialTick, float scale) { float radius = (float) (-projScrPoint[0] - Math.PI/2); - Icon pointer = pointerIconComponent.getIcon(); - Icon icon = entityIconComponent.getIcon(); + IRenderElement pointer = pointerIconComponent.getElement(); + IRenderElement icon = entityIconComponent.getElement(); // pickDirect is ease-in-out from 15 to 2(pointer.getHeight() + icon.getHeight()) when direct is in [0, 0.8), // and infinity closes to 2(pointer.getHeight() + icon.getHeight()) when direct bigger than 1 this.pickDirect = 20 + (float) (Math.atan(projScrPoint[1] / 0.8) * 240 / Math.PI); @@ -83,8 +84,8 @@ protected void updateTransformer(float[] projScrPoint, float partialTick, float @Override protected float getAlpha(float[] projScrPoint) { - Icon pointer = pointerIconComponent.getIcon(); - Icon icon = entityIconComponent.getIcon(); + IRenderElement pointer = pointerIconComponent.getElement(); + IRenderElement icon = entityIconComponent.getElement(); return Math.min(1, Math.max(0, (pickDirect - 25) / (pointer.height() + icon.height()))); } @@ -100,18 +101,21 @@ protected void renderInsights(GuiGraphics graphics, float[] projScrPoint, float protected void translateAndRenderComponents( GuiGraphics graphics, float[] projScrPoint, - IconComponent pointerComponent, - IconComponent entityComponent, + BaseComponent pointerComponent, + BaseComponent entityComponent, Matrix4fStack stack, float partialTick, float scale ) { + float pointerScale = scale * pointerComponent.rescale(); + float entityScale = scale * entityComponent.rescale(); + float radius = (float) (-projScrPoint[0] - Math.PI/2); - Icon pointer = pointerComponent.getIcon(); - Icon icon = entityComponent.getIcon(); + IRenderElement pointer = pointerComponent.getElement(); + IRenderElement icon = entityComponent.getElement(); - float pw = -(float) pointer.width() / 2 * scale, ph = -(float) pointer.height() / 2 * scale; - float ew = (float) icon.width() / 2 * scale, eh = (float) icon.height() / 2 * scale; + float pw = -(float) pointer.width() / 2 * pointerScale, ph = -(float) pointer.height() / 2 * pointerScale; + float ew = (float) icon.width() / 2 * entityScale, eh = (float) icon.height() / 2 * entityScale; stack.translate((float) graphics.guiWidth() / 2, (float) graphics.guiHeight() / 2, 0); @@ -119,8 +123,8 @@ protected void translateAndRenderComponents( stack.pushMatrix(); // 2 { stack.translate(pw, ph, 0); - stack.translate(0, -this.pickDirect* scale, 0); - stack.scale(scale, scale, 1); + stack.translate(0, -this.pickDirect* pointerScale, 0); + stack.scale(pointerScale, pointerScale, 1); RenderSystem.applyModelViewMatrix(); /* go on */ @@ -140,7 +144,7 @@ protected void translateAndRenderComponents( stack.rotateZ(-radius); // A funny delayed rot for icon stack.translate(-ew, -eh, 0); - stack.scale(scale, scale, 1); + stack.scale(entityScale, entityScale, 1); RenderSystem.applyModelViewMatrix(); /* go on */ diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderCursor.java similarity index 89% rename from src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java rename to src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderCursor.java index 17db6ab..ddb0893 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/cursors/TRenderCursor.java @@ -9,7 +9,7 @@ import java.util.function.BiFunction; import java.util.function.Function; -public interface TRenderComponent { +public interface TRenderCursor { void setSmoothMove(boolean smoothMove); void setAffectedByPlayerScale(boolean affectedByPlayerScale); void setRescale(Function rescale); @@ -17,7 +17,7 @@ public interface TRenderComponent { void flush(); void render(GuiGraphics graphics, Player player, Vec3 target, float partialTick); @Contract(pure = true) - static @Nullable TRenderComponent ofNull() { + static @Nullable TRenderCursor ofNull() { return null; } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java index d1fe6e2..f2e0e12 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/provider/BuilderResultComposer.java @@ -1,17 +1,17 @@ package nowebsite.makertechno.the_trackers.client.gui.provider; import nowebsite.makertechno.the_trackers.api.component.ComponentBuilder; +import nowebsite.makertechno.the_trackers.client.gui.components.IRenderElement; import nowebsite.makertechno.the_trackers.client.gui.cursors.*; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.BaseComponent; import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; -import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import org.jetbrains.annotations.Nullable; public final class BuilderResultComposer { private BuilderResultComposer() {} - public static TRenderComponent compose(ComponentBuilder.BuilderResult result) { - TRenderComponent component = switch (result.type) { + public static TRenderCursor compose(ComponentBuilder.BuilderResult result) { + TRenderCursor component = switch (result.type) { case RELATIVE -> composeRelativeComponent(result); case DIRECT -> composeDirectComponent(result); case HEAD_TAG -> composeRelativeComponent(result); // TODO @@ -23,46 +23,46 @@ public static TRenderComponent compose(ComponentBuilder.BuilderResult result) { return component; } - public static TRenderComponent composeRelativeComponent(ComponentBuilder.BuilderResult result) { + public static TRenderCursor composeRelativeComponent(ComponentBuilder.BuilderResult result) { return new TRelativeCursor( - getIconComponent(result.component1Pattern, result.icon1.get()), - getIconComponent(result.component2Pattern, result.icon2.get()) + getIconComponent(result.component1Pattern, result.element1.get()), + getIconComponent(result.component2Pattern, result.element2.get()) ); } - public static TRenderComponent composeDirectComponent(ComponentBuilder.BuilderResult result) { + public static TRenderCursor composeDirectComponent(ComponentBuilder.BuilderResult result) { TAbstractCursor cursor; if (result.cursorPattern != null) { String[] patterns = result.cursorPattern.split(","); if (patterns[0].equals("3body")) { if (result.component2Pattern == null){ cursor = new TDir3BodyCursor( - getIconComponent(result.component1Pattern, result.icon1.get()), - getIconComponent(result.component1Pattern, result.icon1.get()), - getIconComponent(result.component1Pattern, result.icon1.get()) + getIconComponent(result.component1Pattern, result.element1.get()), + getIconComponent(result.component1Pattern, result.element1.get()), + getIconComponent(result.component1Pattern, result.element1.get()) ); } else { cursor = new TDir3BodyCursor( - getIconComponent(result.component1Pattern, result.icon1.get()), - getIconComponent(result.component2Pattern, result.icon2.get()), - getIconComponent(result.component3Pattern, result.icon3.get()) + getIconComponent(result.component1Pattern, result.element1.get()), + getIconComponent(result.component2Pattern, result.element2.get()), + getIconComponent(result.component3Pattern, result.element3.get()) ); } if (patterns.length > 1 && patterns[1].equals("faceCenter")) ((TDir3BodyCursor)cursor).setFaceCenter(true); } - else cursor = new TDirectProjCursor(getIconComponent(result.component1Pattern, result.icon1.get())); + else cursor = new TDirectProjCursor(getIconComponent(result.component1Pattern, result.element1.get())); } - else cursor = new TDirectProjCursor(getIconComponent(result.component1Pattern, result.icon1.get())); + else cursor = new TDirectProjCursor(getIconComponent(result.component1Pattern, result.element1.get())); return cursor; } - /*public static TRenderComponent composeHeadTagComponent(ComponentBuilder.BuilderResult result) { + /* TODO:public static TRenderCursor composeHeadTagComponent(ComponentBuilder.BuilderResult result) { return null; }*/ - private static IconComponent getIconComponent(@Nullable String pattern, Icon icon) { + private static BaseComponent getIconComponent(@Nullable String pattern, IRenderElement element) { return pattern == null - ? BasicComponentFactory.getDefault(icon).get() - : BasicComponentFactory.getIconComponent(icon, pattern).get(); + ? BasicComponentFactory.getDefault(element).get() + : BasicComponentFactory.getElementComponent(element, pattern).get(); } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java index 759ab6c..a05f176 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/ConfigProcessor.java @@ -5,10 +5,10 @@ import nowebsite.makertechno.the_trackers.client.gui.cursors.TDir3BodyCursor; import nowebsite.makertechno.the_trackers.client.gui.cursors.TDirectProjCursor; import nowebsite.makertechno.the_trackers.client.gui.cursors.TRelativeCursor; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import nowebsite.makertechno.the_trackers.client.gui.components.Icon; import nowebsite.makertechno.the_trackers.client.gui.components.BasicComponentFactory; -import nowebsite.makertechno.the_trackers.client.gui.components.IconComponent; +import nowebsite.makertechno.the_trackers.client.gui.components.BaseComponent; import nowebsite.makertechno.the_trackers.client.gui.provider.TextureCache; import nowebsite.makertechno.the_trackers.core.event.TModClient; import org.jetbrains.annotations.NotNull; @@ -21,7 +21,7 @@ public final class ConfigProcessor { - private static final Pair, Supplier> OF_EMPTY =new Pair<>(null, TRenderComponent::ofNull); + private static final Pair, Supplier> OF_EMPTY =new Pair<>(null, TRenderCursor::ofNull); public static boolean isValidEntityBindCRCursor(Object o) { /* entityType|pointer|entityIcon(|optionalPatterns) */ @@ -46,7 +46,7 @@ public static boolean isValidEntityBindCRCursor(Object o) { } @NotNull - public static Set, Supplier>> collectCREntityBindCursor(@NotNull List list) { + public static Set, Supplier>> collectCREntityBindCursor(@NotNull List list) { return list.stream() .map(s -> { String[] split = s.split("\\|"); @@ -62,7 +62,7 @@ public static Set, Supplier>> col Icon icon = TextureCache.getIcon(split[2]); if (!split[2].equals("none") && icon.equals(Icon.NONE)) return OF_EMPTY; - Supplier supplier; + Supplier supplier; if (split.length == 4) { String[] patterns = split[3].split("&"); @@ -70,10 +70,10 @@ public static Set, Supplier>> col BasicComponentFactory.hasElementPattern(patterns[0]) && BasicComponentFactory.hasElementPattern(patterns[1])) { supplier = () -> new TRelativeCursor( - BasicComponentFactory.getIconComponent(pointerIcon, patterns[0]).get(), - BasicComponentFactory.getIconComponent(icon, patterns[1]).get() + BasicComponentFactory.getElementComponent(pointerIcon, patterns[0]).get(), + BasicComponentFactory.getElementComponent(icon, patterns[1]).get() ); - return new Pair, Supplier>(entityType, supplier); + return new Pair, Supplier>(entityType, supplier); } } @@ -81,7 +81,7 @@ public static Set, Supplier>> col BasicComponentFactory.getDefault(pointerIcon).get(), BasicComponentFactory.getDefault(icon).get() ); - return new Pair, Supplier>(entityType, supplier); + return new Pair, Supplier>(entityType, supplier); }) .filter(p -> p != OF_EMPTY) .collect(Collectors.toSet()); @@ -113,7 +113,7 @@ public static boolean isValidCREntityBindDTCursor(Object o) { return true; } @NotNull - public static Set, Supplier>> collectDTEntityBindCursor(@NotNull List list) { + public static Set, Supplier>> collectDTEntityBindCursor(@NotNull List list) { return list.stream() .map(s -> { String[] split = s.split("\\|"); @@ -131,18 +131,18 @@ public static Set, Supplier>> col icon = TextureCache.getIcon(style[1]); if (icon.equals(Icon.NONE)) return OF_EMPTY; } - Supplier cps; - if (split.length == 3) cps = BasicComponentFactory.getIconComponent(icon, split[2]); + Supplier cps; + if (split.length == 3) cps = BasicComponentFactory.getElementComponent(icon, split[2]); else cps = BasicComponentFactory.getDefault(icon); - Supplier supplier; + Supplier supplier; if (style[0].equals("3body")){ supplier = () -> new TDir3BodyCursor(cps.get(), cps.get(), cps.get()); } else if (style[0].equals("normal")){ supplier = () -> new TDirectProjCursor(cps.get()); } else return OF_EMPTY; - return new Pair, Supplier>(entityType, supplier); + return new Pair, Supplier>(entityType, supplier); }) .filter(p -> p != OF_EMPTY) .collect(Collectors.toSet()); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java index 48b5957..6e784a2 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/config/TConfig.java @@ -7,7 +7,7 @@ import net.neoforged.fml.event.config.ModConfigEvent; import net.neoforged.neoforge.common.ModConfigSpec; import nowebsite.makertechno.the_trackers.TheTrackers; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import nowebsite.makertechno.the_trackers.core.event.TModClient; import nowebsite.makertechno.the_trackers.core.track.EntityTracker; import nowebsite.makertechno.the_trackers.core.track.algorithm.ProjectAlgorithmLib; @@ -133,8 +133,8 @@ public class TConfig { public static boolean trackFullAvailable; public static boolean headFlatAvailable; public static ProjectAlgorithmLib.Type projectAlgorithm; - public static Set, Supplier>> CRCursorWithEntities; - public static Set, Supplier>> DTCursorWithEntities; + public static Set, Supplier>> CRCursorWithEntities; + public static Set, Supplier>> DTCursorWithEntities; @SubscribeEvent static void onLoad(final ModConfigEvent event) { diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java index 3cea36b..509e0d5 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/EntityTracker.java @@ -8,7 +8,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.entity.PartEntity; import nowebsite.makertechno.the_trackers.client.gui.TGui; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import nowebsite.makertechno.the_trackers.core.config.TConfig; import nowebsite.makertechno.the_trackers.core.track.states.TrackerStepState; import org.jetbrains.annotations.NotNull; @@ -25,7 +25,7 @@ public class EntityTracker { /** 缓存的渲染队列 */ private static final Map RENDERING = new HashMap<>(); /** 规则组 */ - private static final List, Supplier>> ALL_GROUPS = new ArrayList<>(); + private static final List, Supplier>> ALL_GROUPS = new ArrayList<>(); /** 框选距离 */ public static final AABB PICK_RANGE = new AABB( - 64.0D, @@ -88,7 +88,7 @@ private static boolean processExisting(@NotNull Entity entity) { * 判断实体种类并尝试为其创建对应种类的指针对。 */ private static void tryCreateNew(Entity entity) { - for (Pair, Supplier> pair : ALL_GROUPS) { + for (Pair, Supplier> pair : ALL_GROUPS) { if (isTargetType(pair.getFirst(), entity)) { TrackerStepState state = new TrackerStepState(pair.getSecond().get()); state.updatePos(entity.getRopeHoldPosition(0)); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/StableTracker.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/StableTracker.java deleted file mode 100644 index 27d4975..0000000 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/StableTracker.java +++ /dev/null @@ -1,44 +0,0 @@ -/* -package nowebsite.makertechno.entity_tracker.core.track; - -import com.mojang.datafixers.util.Pair; -import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.entity_tracker.client.gui.components.TRelativeCursor; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -public class StableTracker { - private static final Set> UUID_BOUND = new HashSet<>(); - private static final Set> POSITIONS = new HashSet<>(); - private final Map - - public void updateEntities(Set> currentEntities, long tick) { - Set seenThisTick = new HashSet<>(); - - for (Pair pair : currentEntities) { - Entity entity = pair.getFirst(); - UUID id = entity.getUUID(); - seenThisTick.add(id); - - trackedEntities.compute(id, (uuid, state) -> { - if (state == null) { - return new TrackedEntityState(id, entity.position(), pair.getSecond(), tick); - } else { - state.update(entity.position(), tick); - return state; - } - }); - } - - // 清理离开的实体(可选) - trackedEntities.entrySet().removeIf(entry -> tick - entry.getValue().lastSeenTick > 20); - } - - public Collection getTrackedStates() { - return trackedEntities.values(); - } -} -*/ diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java index 671bf10..85834ae 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java @@ -28,7 +28,7 @@ public static void trigger() { } public static void quit() { TGui.setExtendTracker(null); - if (tracker != null) tracker.clean(); + if (tracker != null) tracker.close(); tracker = null; } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java index 4f175da..aae202f 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/WorldSingletonTracker.java @@ -8,7 +8,7 @@ import nowebsite.makertechno.the_trackers.api.component.SimpleComponent; import nowebsite.makertechno.the_trackers.api.component.StaticComponent; import nowebsite.makertechno.the_trackers.client.gui.TGui; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import nowebsite.makertechno.the_trackers.client.gui.provider.BuilderResultComposer; import nowebsite.makertechno.the_trackers.core.track.states.ControllableTrackerState; import nowebsite.makertechno.the_trackers.core.track.states.ControllableTrackerStateEx; @@ -32,6 +32,16 @@ public static synchronized WorldSingletonTracker getInstance() { public final Map> staticPointers = new HashMap<>(); public final Map questSortedEntityPointers = new HashMap<>(); + private boolean isClosed; + + public void close() { + this.clean(); + this.isClosed = true; + } + + public boolean isClosed() { + return this.isClosed; + } /** * 通过预构内容添加一个UUID指针,指向世界中的实体。 @@ -73,7 +83,7 @@ public SimpleComponent addDynamicTickLimitedComponent(String modID, String ident public SimpleComponent addDynamicMultiComponent(String modID, String identifyName, ComponentBuilder.BuilderResult[] results, UUID target, boolean isVisible) throws IllegalArgumentException { synchronized (questSortedEntityPointers) { if (questSortedEntityPointers.containsKey(target)) throw new IllegalArgumentException("UUID named " + target + " still on tracking!"); - TRenderComponent[] components = new TRenderComponent[results.length]; + TRenderCursor[] components = new TRenderCursor[results.length]; for (int i = 0; i < results.length; i++) { components[i] = BuilderResultComposer.compose(results[i]); } @@ -95,7 +105,7 @@ public SimpleComponent attendMultiComponent(String modID, String identifyName, C case null -> throw new IllegalArgumentException("UUID named " + target + " not found on tracking list!"); case TickLimitedTrackerState ignored -> throw new UnsupportedOperationException("Tick limited component couldn't be replaced"); case ControllableTrackerStateEx ex -> { - TRenderComponent[] components = new TRenderComponent[results.length]; + TRenderCursor[] components = new TRenderCursor[results.length]; for (int i = 0; i < results.length; i++) { components[i] = BuilderResultComposer.compose(results[i]); } @@ -109,7 +119,7 @@ public SimpleComponent attendMultiComponent(String modID, String identifyName, C default -> {} } synchronized (questSortedEntityPointers) { - TRenderComponent[] components = new TRenderComponent[results.length + 1]; + TRenderCursor[] components = new TRenderCursor[results.length + 1]; for (int i = 0; i < results.length; i++) { components[i] = BuilderResultComposer.compose(results[i]); } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java index 1487f8c..6857304 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerState.java @@ -5,7 +5,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import nowebsite.makertechno.the_trackers.api.component.StaticComponent; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import java.util.function.Function; @@ -20,7 +20,7 @@ public class ControllableTrackerState implements StaticComponent { protected boolean isAlive = true; protected Function applier = vec3 -> vec3; - public ControllableTrackerState(String identifyName, TRenderComponent component, boolean isVisible, boolean isAutoDelete) { + public ControllableTrackerState(String identifyName, TRenderCursor component, boolean isVisible, boolean isAutoDelete) { this.identifyName = identifyName; this.state = new TrackerStepState(component); this.isVisible = isVisible; diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java index 2214cb8..c06b4f3 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/ControllableTrackerStateEx.java @@ -4,7 +4,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; import java.util.Arrays; @@ -12,7 +12,7 @@ public class ControllableTrackerStateEx extends ControllableTrackerState { private TrackerStepState[] states; @SuppressWarnings("all") - public ControllableTrackerStateEx(String identifyName, TRenderComponent[] components, boolean isVisible, boolean isAutoDelete) { + public ControllableTrackerStateEx(String identifyName, TRenderCursor[] components, boolean isVisible, boolean isAutoDelete) { super(identifyName, null, isVisible, isAutoDelete); this.states = new TrackerStepState[components.length]; Arrays.setAll(this.states, i -> new TrackerStepState(components[i])); diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java index 48797af..c7de75c 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TickLimitedTrackerState.java @@ -1,13 +1,13 @@ package nowebsite.makertechno.the_trackers.core.track.states; import net.minecraft.world.entity.Entity; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; public class TickLimitedTrackerState extends ControllableTrackerState{ private final int maxTicked; private int ticking = 0; - public TickLimitedTrackerState(String identifyName, TRenderComponent component, int maxTicked, boolean isVisible) { + public TickLimitedTrackerState(String identifyName, TRenderCursor component, int maxTicked, boolean isVisible) { super(identifyName, component, isVisible, false); this.maxTicked = maxTicked; } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java index ee9113d..7cf6591 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/states/TrackerStepState.java @@ -3,12 +3,12 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderComponent; +import nowebsite.makertechno.the_trackers.client.gui.cursors.TRenderCursor; public class TrackerStepState { private Vec3 currentPos; - private final TRenderComponent component; - public TrackerStepState(TRenderComponent component) { + private final TRenderCursor component; + public TrackerStepState(TRenderCursor component) { this.component = component; } public void updatePos(Vec3 pos) { @@ -20,7 +20,7 @@ public Vec3 getPos() { public void renderComponent(GuiGraphics guiGraphics, float partialTick, Player player) { if (currentPos != null) component.render(guiGraphics, player, currentPos, partialTick); } - public TRenderComponent getComponent() { + public TRenderCursor getComponent() { return component; } } From 318aebbe9c1e5373375b2c260edc618ea471f3b0 Mon Sep 17 00:00:00 2001 From: MakerTechno <102357646+makertechno@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:11:23 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=85=A8=E8=BF=BD=E8=B8=AA=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ALGORITHM.MD | 10 ++++++---- README.MD | 29 ++++++++++++++++++++++------- README_EN.MD | 28 +++++++++++++++++++++------- gradle.properties | 2 +- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/ALGORITHM.MD b/ALGORITHM.MD index acb17c9..fa31680 100644 --- a/ALGORITHM.MD +++ b/ALGORITHM.MD @@ -8,7 +8,7 @@ - 渲染:按运算结果渲染 ## 算法概述 -### 中心环绕型 +### 中心环绕型 #### 固有转换:经度锁定 - 计算玩家视坐标到目标坐标的位向量(概念上是三维射线的意思) - 三维变换归一化获得在“单位球壳”上的坐标点 @@ -17,7 +17,7 @@ - 对球壳上两点(玩家视觉点与目标位置点)进行选择的投影,获得平面点 - 求得视坐标投影点->位坐标投影点的弧度、距离 -投影类型 +投影类型 : 墨卡托投影 : 艾托夫投影 : 温克尔三重投影(线性混合) @@ -40,7 +40,7 @@ 该投影逻辑为 : 获取游戏的V(经过视坐标转换)、P矩阵,合为一个转换矩阵 -: 将目标坐标包装成带有距离缩放信息的向量(即四维向量,w基础值为1.0f) +: 将目标坐标包装成带有距离缩放信息的向量(即三维上使用的齐次坐标,w基础值为1.0f) : 使目标四维向量与转换矩阵相乘,得到实际V模式对应信息 : 计算并转换成屏幕坐标(包括边界框限制性取值) @@ -48,8 +48,10 @@ 将会在第三种投影完成后对第一种投影进行完全重构 +> 26.01.26注: 或许我可以先留着中心的投影, 它可能更加符合人的转动倾向 + > 一路走来,了解的知识越多,对未知的恐惧就越大——知识是无穷无尽的 -> +> > 我们站在诸位巨人的肩膀上,并渴望着成为巨人 ### 经度轴提示型 diff --git a/README.MD b/README.MD index 5fd0319..a140396 100644 --- a/README.MD +++ b/README.MD @@ -1,19 +1,34 @@ -# Entity Tracker (简体中文|[English](README_EN.MD)) -这是一个用于在MC中跟踪实体的HUD模组。 +# The Trackers (简体中文|[English](README_EN.MD)) +这是一个用于在MC中跟踪实体的纯客户端HUD工具模组。 + +同时也是一个使用HUD icon标记三维坐标的实用功能库。 + +作为玩家使用本模组,可以通过模组配置设置需要追踪的实体。 + +作为开发者使用本模组,可以便捷地声明指针模板,并快速使用模板注册指针并应用。 + ### 工作原理 使用投影计算在2D屏幕上显示标志以表示实体位置。 -详见[算法](ALGORITHM.MD) +在代码层面,额外支持渲染物品。 + +投影内容详见详见[算法-中文](ALGORITHM.MD) + ### 特性 -- 直接通过指示显示实体的位置 -- 可自定义某实体类型的实体定位 -- 可自定义HUD指针 +- 直接通过指示图标表示世界上的位置 +- 自动扫描附近的实体 +- 可自定义指示某种实体 +- 可自定义HUD指针样式 +- 在代码层面简化屏上HUD图标的创建 +- 自动的、可控的指针回收机制 ### 作者 [@MakerTechno](https://github.com/MakerTechno) + ### 协议 [LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.html) + ### 依赖 无 + ### 联动 [汇流来世 Confluence Of The Afterlife](https://github.com/MagicHarp/confluence) - diff --git a/README_EN.MD b/README_EN.MD index 87f80df..108b0be 100644 --- a/README_EN.MD +++ b/README_EN.MD @@ -1,13 +1,27 @@ -# Entity Tracker (English|[简体中文](README.MD)) -This is a simple HUD for tracking entities in Minecraft. +# The Trackers (English|[简体中文](README.MD)) +This is a client-side HUD mod for tracking entities in Minecraft. + +It also serves as a utility library for marking 3D coordinates with HUD icons. + +As a player, you can configure the mod to track specific entities. + +As a developer, you can conveniently define pointer templates and quickly register and apply them. + ### How it works -Using a set of projection, it displays entities' positions in 2D with customized icon. +It uses projection calculations to display icons on the 2D screen representing entity positions. + +At the code level, it additionally supports rendering items. + +For details on the projection algorithm, see [ALGORITHM (Chinese only)](ALGORITHM.MD) for details. -See [ALGORITHM (Chinese only)](ALGORITHM.MD) for details. ### Features -- Display entities' positions in 2D -- Specific entities tracking -- Customizable HUD pointers +- Display world positions directly with HUD icons +- Automatically scan for nearby entities +- Customizable tracking targets for specific entities +- Customizable HUD pointer styles +- Simplified creation of HUD icons at the code level +- Automatic and controllable pointer recycling mechanism + ### Author [@MakerTechno](https://github.com/MakerTechno) ### License diff --git a/gradle.properties b/gradle.properties index a0b45f9..73c83b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ loader_version_range=[4,) mod_id=the_trackers mod_name=The Trackers mod_license=LGPLv3 -mod_version=1.21.1-0.2.3 +mod_version=1.21.1-0.2.5 mod_group_id=nowebsite.makertechno.the_trackers mod_authors=MakerTechno mod_description=To follow the light to where all shadows begin. From 84914adf4f9aeb7b53003b53d8023c4faadc1097 Mon Sep 17 00:00:00 2001 From: westernat Date: Sat, 31 Jan 2026 18:49:10 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BF=AE=E9=AB=98=E7=BA=A7=E6=88=98?= =?UTF-8?q?=E5=88=A9=E5=93=81=E4=BF=A1=E6=81=AF=E6=98=BE=E7=A4=BA=E5=85=BC?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 73c83b3..25f76cc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ parchment_mappings_version=2024.11.13 minecraft_version=1.21.1 minecraft_version_range=[1.21.1, 1.22) -neo_version=21.1.215 +neo_version=21.1.218 neo_version_range=[21.1.0,) loader_version_range=[4,) From af0306740a1c71a8805b0a13a2364b8caa60edee Mon Sep 17 00:00:00 2001 From: westernat Date: Sun, 1 Feb 2026 00:36:21 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E4=B8=80=E4=BA=9B=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/components/RainbowComponent.java | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java index ddd9555..329d0a4 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/client/gui/components/RainbowComponent.java @@ -2,9 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; public class RainbowComponent extends BaseComponent { private final int intervalColor; @@ -19,7 +16,7 @@ public static boolean isValidPatterns(int intervalColor) { return intervalColor > 1; } @Override - public void render(@NotNull GuiGraphics graphics, float partialTick) { + public void render(GuiGraphics graphics, float partialTick) { if (++intervalCount >= intervalColor) { osc(); intervalCount = 0; @@ -31,10 +28,59 @@ public void render(@NotNull GuiGraphics graphics, float partialTick) { private void osc() { hue += 0.01F; if (hue > 1f) hue -= 1f; - int rgb = Color.HSBtoRGB(hue, 1f, 1f); + int rgb = HSBtoRGB(hue, 1f, 1f); r = ((rgb >> 16) & 0xFF) / 255f; g = ((rgb >> 8) & 0xFF) / 255f; b = (rgb & 0xFF) / 255f; } + + /// 有些Java构建版本没有awt + private static int HSBtoRGB(float hue, float saturation, float brightness) { + int r = 0; + int g = 0; + int b = 0; + if (saturation == 0.0F) { + r = g = b = (int)(brightness * 255.0F + 0.5F); + } else { + float h = (hue - (float)Math.floor(hue)) * 6.0F; + float f = h - (float)Math.floor(h); + float p = brightness * (1.0F - saturation); + float q = brightness * (1.0F - saturation * f); + float t = brightness * (1.0F - saturation * (1.0F - f)); + switch ((int)h) { + case 0: + r = (int)(brightness * 255.0F + 0.5F); + g = (int)(t * 255.0F + 0.5F); + b = (int)(p * 255.0F + 0.5F); + break; + case 1: + r = (int)(q * 255.0F + 0.5F); + g = (int)(brightness * 255.0F + 0.5F); + b = (int)(p * 255.0F + 0.5F); + break; + case 2: + r = (int)(p * 255.0F + 0.5F); + g = (int)(brightness * 255.0F + 0.5F); + b = (int)(t * 255.0F + 0.5F); + break; + case 3: + r = (int)(p * 255.0F + 0.5F); + g = (int)(q * 255.0F + 0.5F); + b = (int)(brightness * 255.0F + 0.5F); + break; + case 4: + r = (int)(t * 255.0F + 0.5F); + g = (int)(p * 255.0F + 0.5F); + b = (int)(brightness * 255.0F + 0.5F); + break; + case 5: + r = (int)(brightness * 255.0F + 0.5F); + g = (int)(p * 255.0F + 0.5F); + b = (int)(q * 255.0F + 0.5F); + } + } + + return -16777216 | r << 16 | g << 8 | b; + } } From e70c8e0c8b24593edf485a0b826b7771fded1bce Mon Sep 17 00:00:00 2001 From: MakerTechno <102357646+makertechno@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:44:20 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BD=9C=E5=9C=A8?= =?UTF-8?q?=E7=9A=84=E5=85=A8=E8=BF=BD=E8=B8=AA=E7=A9=BA=E6=8C=87=E9=92=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../makertechno/the_trackers/core/event/TModClientGame.java | 4 ++-- .../makertechno/the_trackers/core/track/TrackersMonitor.java | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/event/TModClientGame.java b/src/main/java/nowebsite/makertechno/the_trackers/core/event/TModClientGame.java index b50a019..a1cc4b8 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/event/TModClientGame.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/event/TModClientGame.java @@ -3,8 +3,8 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; import net.neoforged.neoforge.client.event.ClientTickEvent; -import net.neoforged.neoforge.event.entity.player.PlayerEvent; import nowebsite.makertechno.the_trackers.TheTrackers; import nowebsite.makertechno.the_trackers.core.config.TConfig; import nowebsite.makertechno.the_trackers.core.track.TrackersMonitor; @@ -17,7 +17,7 @@ public static void onClientTick(ClientTickEvent.Pre event) { } @SubscribeEvent - public static void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) { + public static void clientPlayerNetwork$LoggingOut(ClientPlayerNetworkEvent.LoggingOut event) { TrackersMonitor.quit(); } } diff --git a/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java b/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java index 85834ae..3a753ea 100644 --- a/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java +++ b/src/main/java/nowebsite/makertechno/the_trackers/core/track/TrackersMonitor.java @@ -1,6 +1,7 @@ package nowebsite.makertechno.the_trackers.core.track; import net.minecraft.world.entity.Entity; +import nowebsite.makertechno.the_trackers.TheTrackers; import nowebsite.makertechno.the_trackers.client.gui.TGui; import nowebsite.makertechno.the_trackers.core.config.TConfig; import org.jetbrains.annotations.Nullable; @@ -23,10 +24,12 @@ public static void trigger() { count = 0; Map cached = EntityTracker.process(); - if (cached != null) tracker.trigger(cached); + if (cached != null && tracker != null) tracker.trigger(cached); + if (tracker == null) TheTrackers.LOGGER.error("WorldSingletonTracker is null, this is an unexpected state. If you see this, please report it to developers."); } } public static void quit() { + TheTrackers.LOGGER.debug("TrackerMonitor quit."); TGui.setExtendTracker(null); if (tracker != null) tracker.close(); tracker = null;