aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java
new file mode 100644
index 00000000..1815179f
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java
@@ -0,0 +1,68 @@
+package de.hysky.skyblocker.skyblock.end;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.util.math.BlockPos;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BeaconHighlighter {
+ static List<BlockPos> pos = new ArrayList<>();
+
+ /**
+ * Initializes the beacon highlighting system.
+ * `BeaconHighlighter::render` is called after translucent rendering.
+ * `BeaconHighlighter::update` should be called every 5 ticks.
+ */
+ public static void init() {
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(BeaconHighlighter::render);
+ Scheduler.INSTANCE.scheduleCyclic(BeaconHighlighter::update, 5);
+ }
+
+ /**
+ * Updates the position of the beacon.
+ * It checks in a 15 block radius on the X/Z axis, and a ~5 block radius on the Y axis.
+ * If a beacon is found, `pos` is updated to the beacon's position.
+ */
+
+ public static void update() {
+ var player = MinecraftClient.getInstance().player;
+ var world = MinecraftClient.getInstance().world;
+ pos.clear();
+ if(player != null && world != null &&
+ SkyblockerConfigManager.get().slayer.endermanSlayer.highlightBeacons) {
+ for(int x = (player.getBlockPos().getX()-15); x<player.getBlockPos().getX()+15; x++) {
+ for(int z = (player.getBlockPos().getZ()-15); z<player.getBlockPos().getZ()+15; z++) {
+ for(int y = (player.getBlockPos().getY()-3); y<player.getBlockPos().getY()+7; y++) {
+ var state = world.getBlockState(new BlockPos(x, y, z));
+ if(state.toString().contains("minecraft:beacon")) {
+ pos.add(new BlockPos(x, y, z));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Renders the beacon glow around it. It is rendered in a red color with 50% opacity, and
+ * is visible through walls.
+ * @param context An instance of WorldRenderContext for the RenderHelper to use
+ */
+ public static void render(WorldRenderContext context) {
+ pos.forEach((it) -> {
+ RenderHelper.renderFilled(
+ context,
+ it,
+ new float[]{1.0f, 0.0f, 0.0f},
+ 0.5f,
+ true
+ );
+ });
+ }
+}