aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
blob: b969ba0b33c1d8ee3928a960a5a42d2d238114e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package de.hysky.skyblocker.skyblock.entity;

import java.util.List;

import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.FrustumUtils;
import de.hysky.skyblocker.utils.render.RenderHelper;
import de.hysky.skyblocker.utils.render.Renderable;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.minecraft.entity.Entity;
import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.Box;

public class MobBoundingBoxes {
	/**
	 * These boxes will be rendered before the debug render phase which happens after entities are rendered;
	 */
	private static final ObjectOpenHashSet<RenderableBox> BOXES_2_RENDER = new ObjectOpenHashSet<>();

	public static void init() {
		WorldRenderEvents.BEFORE_DEBUG_RENDER.register(MobBoundingBoxes::render);
	}

	public static boolean shouldDrawMobBoundingBox(Entity entity) {
		Box box = entity.getBoundingBox();

		if (Utils.isInDungeons() && FrustumUtils.isVisible(box) && !entity.isInvisible()) {
			String name = entity.getName().getString();

			// Minibosses
			if (entity instanceof PlayerEntity) {
				switch (name) {
					case "Lost Adventurer", "Shadow Assassin", "Diamond Guy": return SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
				}
			}

			// Regular Mobs
			if (!(entity instanceof ArmorStandEntity)) {
				List<ArmorStandEntity> armorStands = MobGlow.getArmorStands(entity);

				if (!armorStands.isEmpty() && armorStands.get(0).getName().getString().contains("✯"))
					return SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes;
			}
		}

		return false;
	}
	
	public static float[] getBoxColor(Entity entity) {
		int color = MobGlow.getGlowColor(entity);

		return new float[] { ((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f };
	}

	public static void submitBox2BeRendered(Box box, float[] colorComponents) {
		BOXES_2_RENDER.add(new RenderableBox(box, colorComponents));
	}

	private static void render(WorldRenderContext context) {
		for (RenderableBox box : BOXES_2_RENDER) {
			box.render(context);
		}

		BOXES_2_RENDER.clear();
	}

	private record RenderableBox(Box box, float[] colorComponents) implements Renderable {

		@Override
		public void render(WorldRenderContext context) {
			RenderHelper.renderOutline(context, box, colorComponents, 6, false);
		}
	}
}