diff options
| author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2025-06-22 22:24:41 -0400 |
|---|---|---|
| committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2025-06-22 22:24:41 -0400 |
| commit | c6f4a8e7d361e4d4e336de483696d9823a67d1c5 (patch) | |
| tree | 5d0af8a8f5adcfaed6cc263357592f6379df69dc /src/main/java | |
| parent | 78d56c8b1e97eda7d04be83d9a11879be414f81e (diff) | |
| download | Skyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.tar.gz Skyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.tar.bz2 Skyblocker-c6f4a8e7d361e4d4e336de483696d9823a67d1c5.zip | |
Add Lushlilac and Sea Lumies Highlighters
Diffstat (limited to 'src/main/java')
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; + } +} |
