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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
package de.hysky.skyblocker.skyblock.entity;
import java.util.List;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.LividColor;
import de.hysky.skyblocker.skyblock.itemlist.SkyblockCraftingRecipe;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.culling.OcclusionCulling;
import net.minecraft.entity.Entity;
import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.entity.passive.BatEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtElement;
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.Box;
import net.minecraft.world.World;
import org.apache.logging.log4j.LogManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MobGlow {
public static boolean shouldMobGlow(Entity entity) {
Box box = entity.getBoundingBox();
if (!entity.isInvisible() && OcclusionCulling.getReducedCuller().isVisible(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ)) {
String name = entity.getName().getString();
// Dungeons
if (Utils.isInDungeons()) {
// Minibosses
if (entity instanceof PlayerEntity) {
switch (name) {
case "Lost Adventurer", "Shadow Assassin", "Diamond Guy": return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow;
case "Arcade Livid", "Crossed Livid", "Doctor Livid", "Frog Livid", "Hockey Livid",
"Purple Livid", "Scream Livid", "Smile Livid", "Vendetta Livid": return LividColor.shouldGlow(name);
}
}
// Regular Mobs
if (!(entity instanceof ArmorStandEntity)) {
List<ArmorStandEntity> armorStands = getArmorStands(entity.getWorld(), box);
if (!armorStands.isEmpty() && armorStands.get(0).getName().getString().contains("✯")) return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow;
}
// Bats
return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow && entity instanceof BatEntity;
}
// Rift
if (Utils.isInTheRift()) {
if (entity instanceof PlayerEntity) {
switch (name) {
// They have a space in their name for some reason...
case "Blobbercyst ": return SkyblockerConfigManager.get().locations.rift.blobbercystGlow;
}
}
}
}
// Enderman Slayer
// Highlights Nukekubi Heads
if(SkyblockerConfigManager.get().slayer.endermanSlayer.highlightNukekubiHeads
&& entity instanceof ArmorStandEntity) {
// check for items in the armor sets
for (net.minecraft.item.ItemStack it : entity.getArmorItems()) {
// hacky way to check if an item is a player head w/o
// some shenanigans
if(!it.toString().startsWith("1 player_head"))
continue;
if (it.hasNbt()) {
assert it.getNbt() != null;
// eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id
// for the nukekubi head, compare against it to exclusively find
// armorstands that are nukekubi heads
if (it.getNbt().contains("SkullOwner")) {
// get the texture of the nukekubi head item itself and
// compare it
var texture = it
.getNbt()
.getCompound("SkullOwner")
.getCompound("Properties")
.getList("textures", NbtElement.COMPOUND_TYPE)
.getCompound(0)
.getString("Value");
return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
}
}
}
}
return false;
}
private static List<ArmorStandEntity> getArmorStands(World world, Box box) {
return world.getEntitiesByClass(ArmorStandEntity.class, box.expand(0, 2, 0), EntityPredicates.NOT_MOUNTED);
}
public static int getGlowColor(Entity entity) {
String name = entity.getName().getString();
if (entity instanceof PlayerEntity) {
return switch (name) {
case "Lost Adventurer" -> 0xfee15c;
case "Shadow Assassin" -> 0x5b2cb2;
case "Diamond Guy" -> 0x57c2f7;
case "Arcade Livid", "Crossed Livid", "Doctor Livid", "Frog Livid", "Hockey Livid",
"Purple Livid", "Scream Livid", "Smile Livid", "Vendetta Livid" -> LividColor.getGlowColor(name);
case "Blobbercyst " -> Formatting.GREEN.getColorValue();
default -> 0xf57738;
};
}
// copypaste nukekebi head logic
if(entity instanceof ArmorStandEntity) {
for (net.minecraft.item.ItemStack it : entity.getArmorItems()) {
// hacky way to check if an item is a player head w/o
// some shenanigans
if(!it.toString().startsWith("1 player_head"))
continue;
if (it.hasNbt()) {
assert it.getNbt() != null;
// eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id
// for the nukekubi head, compare against it to exclusively find
// armorstands that are nukekubi heads
if (it.getNbt().contains("SkullOwner")) {
// get the texture of the nukekebi head item itself and
// compare it
var texture = it
.getNbt()
.getCompound("SkullOwner")
.getCompound("Properties")
.getList("textures", NbtElement.COMPOUND_TYPE)
.getCompound(0)
.getString("Value");
if(texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=")) {
return 0x990099;
}
}
}
}
}
return 0xf57738;
}
}
|