aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2025-06-22 22:24:41 -0400
committerAaron <51387595+AzureAaron@users.noreply.github.com>2025-06-22 22:24:41 -0400
commitc6f4a8e7d361e4d4e336de483696d9823a67d1c5 (patch)
tree5d0af8a8f5adcfaed6cc263357592f6379df69dc /src/main/java
parent78d56c8b1e97eda7d04be83d9a11879be414f81e (diff)
downloadSkyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.tar.gz
Skyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.tar.bz2
Skyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.zip
Add Lushlilac and Sea Lumies Highlighters
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java16
-rw-r--r--src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/galatea/AbstractBlockHighlighter.java94
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/galatea/ForestNodes.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/galatea/LushlilacHighlighter.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/galatea/SeaLumiesHighlighter.java26
7 files changed, 173 insertions, 3 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java
index bd7b03f5..f17ab278 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java
@@ -33,6 +33,22 @@ public class ForagingCategory {
newValue -> config.foraging.galatea.solveForestTemplePuzzle = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("skyblocker.config.foraging.galatea.enableLushlilacHighlighter"))
+ .description(OptionDescription.of(Text.translatable("skyblocker.config.foraging.galatea.enableLushlilacHighlighter.@Tooltip")))
+ .binding(defaults.foraging.galatea.enableLushlilacHighlighter,
+ () -> config.foraging.galatea.enableLushlilacHighlighter,
+ newValue -> config.foraging.galatea.enableLushlilacHighlighter = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("skyblocker.config.foraging.galatea.enableSeaLumiesHighlighter"))
+ .description(OptionDescription.of(Text.translatable("skyblocker.config.foraging.galatea.enableSeaLumiesHighlighter.@Tooltip")))
+ .binding(defaults.foraging.galatea.enableSeaLumiesHighlighter,
+ () -> config.foraging.galatea.enableSeaLumiesHighlighter,
+ newValue -> config.foraging.galatea.enableSeaLumiesHighlighter = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
.build())
.build();
}
diff --git a/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java
index 64cb62c8..b63cf4d1 100644
--- a/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java
@@ -13,5 +13,11 @@ public class ForagingConfig {
@SerialEntry
public boolean solveForestTemplePuzzle = true;
+
+ @SerialEntry
+ public boolean enableLushlilacHighlighter = true;
+
+ @SerialEntry
+ public boolean enableSeaLumiesHighlighter = true;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java
index d9d90cd8..f3987bc1 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java
@@ -3,6 +3,8 @@ package de.hysky.skyblocker.mixins;
import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager;
import de.hysky.skyblocker.skyblock.dungeon.device.SimonSays;
import de.hysky.skyblocker.skyblock.dwarven.CrystalsChestHighlighter;
+import de.hysky.skyblocker.skyblock.galatea.LushlilacHighlighter;
+import de.hysky.skyblocker.skyblock.galatea.SeaLumiesHighlighter;
import de.hysky.skyblocker.skyblock.slayers.SlayerManager;
import de.hysky.skyblocker.skyblock.slayers.boss.voidgloom.BeaconHighlighter;
import de.hysky.skyblocker.utils.Utils;
@@ -45,6 +47,9 @@ public abstract class ClientWorldMixin implements BlockView {
BeaconHighlighter.beaconPositions.remove(pos);
if (state.isOf(Blocks.BEACON)) BeaconHighlighter.beaconPositions.add(pos.toImmutable());
+ } else if (Utils.isInGalatea()) {
+ LushlilacHighlighter.INSTANCE.onBlockUpdate(pos, state);
+ SeaLumiesHighlighter.INSTANCE.onBlockUpdate(pos, state);
}
SimonSays.onBlockUpdate(pos, state, oldState.get());
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/galatea/AbstractBlockHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/galatea/AbstractBlockHighlighter.java
new file mode 100644
index 00000000..8b03d1e6
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/galatea/AbstractBlockHighlighter.java
@@ -0,0 +1,94 @@
+package de.hysky.skyblocker.skyblock.galatea;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import de.hysky.skyblocker.utils.ColorUtils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
+import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.WorldChunk;
+
+/**
+ * Abstract class for a simple feature that highlights a certain type of block.
+ */
+//TODO Move this to a more generic package since this is not Galatea specific (maybe make a world rendering utility package?)
+public abstract class AbstractBlockHighlighter {
+ private final List<BlockPos> highlightedBlocks = new ArrayList<>();
+ private final Block target;
+ private final float[] colour;
+
+ protected AbstractBlockHighlighter(Block target, DyeColor colour) {
+ this.target = target;
+ this.colour = ColorUtils.getFloatComponents(colour);
+ }
+
+ protected void init() {
+ ClientChunkEvents.CHUNK_LOAD.register(this::onChunkLoad);
+ ClientChunkEvents.CHUNK_UNLOAD.register(this::onChunkUnload);
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(this::render);
+ ClientPlayConnectionEvents.JOIN.register((_handler, _sender, _client) -> this.reset());
+ }
+
+ public void onBlockUpdate(BlockPos pos, BlockState state) {
+ if (!shouldProcess()) return;
+
+ if (state.getBlock().equals(this.target)) {
+ this.highlightedBlocks.add(pos.toImmutable());
+ } else {
+ this.highlightedBlocks.remove(pos);
+ }
+ }
+
+ /**
+ * Add initial highlights since {@link #onBlockUpdate(BlockPos, BlockState)} doesn't fire when the
+ * server sends chunk data via the {@code ChunkDataS2CPacket}.
+ */
+ private void onChunkLoad(ClientWorld world, WorldChunk chunk) {
+ if (!shouldProcess()) return;
+
+ chunk.forEachBlockMatchingPredicate(state -> state.getBlock().equals(this.target), (pos, state) -> {
+ this.highlightedBlocks.add(pos.toImmutable());
+ });
+ }
+
+ /**
+ * Remove highlights in unloaded chunks.
+ */
+ private void onChunkUnload(ClientWorld world, WorldChunk chunk) {
+ if (!shouldProcess()) return;
+ Iterator<BlockPos> iterator = this.highlightedBlocks.iterator();
+
+ while (iterator.hasNext()) {
+ BlockPos pos = iterator.next();
+ Chunk holder = world.getChunk(pos);
+
+ if (holder.equals(chunk)) {
+ iterator.remove();
+ }
+ }
+ }
+
+ private void render(WorldRenderContext context) {
+ if (!shouldProcess()) return;
+
+ for (BlockPos highlight : this.highlightedBlocks) {
+ RenderHelper.renderFilled(context, highlight, this.colour, 0.5f, false);
+ }
+ }
+
+ private void reset() {
+ this.highlightedBlocks.clear();
+ }
+
+ protected abstract boolean shouldProcess();
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/galatea/ForestNodes.java b/src/main/java/de/hysky/skyblocker/skyblock/galatea/ForestNodes.java
index 01819f47..859cbeb5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/galatea/ForestNodes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/galatea/ForestNodes.java
@@ -23,13 +23,10 @@ import net.minecraft.util.ActionResult;
import net.minecraft.util.DyeColor;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.util.*;
public class ForestNodes {
- private static final Logger LOGGER = LoggerFactory.getLogger(ForestNodes.class);
private static final MinecraftClient client = MinecraftClient.getInstance();
private static final Map<BlockPos, ForestNode> forestNodes = new HashMap<>();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/galatea/LushlilacHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/galatea/LushlilacHighlighter.java
new file mode 100644
index 00000000..b668bdef
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/galatea/LushlilacHighlighter.java
@@ -0,0 +1,26 @@
+package de.hysky.skyblocker.skyblock.galatea;
+
+import de.hysky.skyblocker.annotations.Init;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.Block;
+import net.minecraft.block.Blocks;
+import net.minecraft.util.DyeColor;
+
+public class LushlilacHighlighter extends AbstractBlockHighlighter {
+ public static final LushlilacHighlighter INSTANCE = new LushlilacHighlighter(Blocks.FLOWERING_AZALEA, DyeColor.MAGENTA);
+
+ private LushlilacHighlighter(Block target, DyeColor colour) {
+ super(target, colour);
+ }
+
+ @Init
+ public static void initClass() {
+ INSTANCE.init();
+ }
+
+ @Override
+ protected boolean shouldProcess() {
+ return Utils.isInGalatea() && SkyblockerConfigManager.get().foraging.galatea.enableLushlilacHighlighter;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/galatea/SeaLumiesHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/galatea/SeaLumiesHighlighter.java
new file mode 100644
index 00000000..c71ef87f
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/galatea/SeaLumiesHighlighter.java
@@ -0,0 +1,26 @@
+package de.hysky.skyblocker.skyblock.galatea;
+
+import de.hysky.skyblocker.annotations.Init;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.Block;
+import net.minecraft.block.Blocks;
+import net.minecraft.util.DyeColor;
+
+public class SeaLumiesHighlighter extends AbstractBlockHighlighter {
+ public static final SeaLumiesHighlighter INSTANCE = new SeaLumiesHighlighter(Blocks.SEA_PICKLE, DyeColor.CYAN);
+
+ private SeaLumiesHighlighter(Block target, DyeColor colour) {
+ super(target, colour);
+ }
+
+ @Init
+ public static void initClass() {
+ INSTANCE.init();
+ }
+
+ @Override
+ protected boolean shouldProcess() {
+ return Utils.isInGalatea() && SkyblockerConfigManager.get().foraging.galatea.enableSeaLumiesHighlighter;
+ }
+}