aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java78
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java3
6 files changed, 107 insertions, 2 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 947c3fd3..091e8548 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -24,6 +24,7 @@ import de.hysky.skyblocker.skyblock.dwarven.MetalDetector;
import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
import de.hysky.skyblocker.skyblock.end.EnderNodes;
import de.hysky.skyblocker.skyblock.end.TheEnd;
+import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
import de.hysky.skyblocker.skyblock.garden.FarmingHud;
import de.hysky.skyblocker.skyblock.garden.LowerSensitivity;
import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
@@ -175,6 +176,7 @@ public class SkyblockerMod implements ClientModInitializer {
statusBarTracker.init();
BeaconHighlighter.init();
WarpAutocomplete.init();
+ MobBoundingBoxes.init();
Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20);
Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200);
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 2513fb82..86405f58 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -721,7 +721,10 @@ public class SkyblockerConfig {
public boolean playerSecretsTracker = false;
@SerialEntry
- public boolean starredMobGlow = true;
+ public boolean starredMobGlow = false;
+
+ @SerialEntry
+ public boolean starredMobBoundingBoxes = true;
@SerialEntry
public boolean solveThreeWeirdos = true;
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
index 06a904ba..77d2da6d 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -395,6 +395,14 @@ public class DungeonsCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.starredMobBoundingBoxes"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.starredMobBoundingBoxes.@Tooltip")))
+ .binding(defaults.locations.dungeons.starredMobBoundingBoxes,
+ () -> config.locations.dungeons.starredMobBoundingBoxes,
+ newValue -> config.locations.dungeons.starredMobBoundingBoxes = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos"))
.binding(defaults.locations.dungeons.solveThreeWeirdos,
() -> config.locations.dungeons.solveThreeWeirdos,
diff --git a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
index b0829942..a24daa80 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
@@ -3,13 +3,16 @@ package de.hysky.skyblocker.mixin;
import de.hysky.skyblocker.skyblock.dungeon.LividColor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
+import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
import de.hysky.skyblocker.skyblock.entity.MobGlow;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.entity.Entity;
@@ -17,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.Slice;
@Mixin(WorldRenderer.class)
public class WorldRendererMixin {
+
@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"))
private boolean skyblocker$shouldMobGlow(boolean original, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
boolean allowGlow = LividColor.allowGlow();
@@ -32,4 +36,13 @@ public class WorldRendererMixin {
private int skyblocker$modifyGlowColor(int color, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
return hasCustomGlow.get() ? MobGlow.getGlowColor(entity) : color;
}
+
+ @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderEntity(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V"))
+ private void skyblocker$beforeEntityIsRendered(CallbackInfo ci, @Local Entity entity) {
+ boolean shouldShowBoundingBox = MobBoundingBoxes.shouldDrawMobBoundingBox(entity);
+
+ if (shouldShowBoundingBox) {
+ MobBoundingBoxes.submitBox2BeRendered(entity.getBoundingBox(), MobBoundingBoxes.getBoxColor(entity));
+ }
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
new file mode 100644
index 00000000..b969ba0b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
@@ -0,0 +1,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);
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index 85b41bd2..12ae468f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -22,6 +22,7 @@ import net.minecraft.world.World;
import java.util.List;
public class MobGlow {
+
public static boolean shouldMobGlow(Entity entity) {
Box box = entity.getBoundingBox();
@@ -51,7 +52,7 @@ public class MobGlow {
}
// Bats
- return SkyblockerConfigManager.get().locations.dungeons.starredMobGlow && entity instanceof BatEntity;
+ return (SkyblockerConfigManager.get().locations.dungeons.starredMobGlow || SkyblockerConfigManager.get().locations.dungeons.starredMobBoundingBoxes) && entity instanceof BatEntity;
}
// Rift