diff options
8 files changed, 111 insertions, 4 deletions
diff --git a/gradle.properties b/gradle.properties index 3fff28a6..c1977f5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ emi_version = 1.0.22+1.20.2 # Minecraft and Related Libraries ## Occlusion Culling (https://github.com/LogisticsCraft/OcclusionCulling) -occlusionculling_version = 0.0.7-SNAPSHOT +occlusionculling_version = 0.0.8-SNAPSHOT ## neu repoparser (https://repo.nea.moe/#/releases/moe/nea/neurepoparser/) repoparser_version = 1.4.0 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 diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 0fb10e10..d1a5966c 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -303,7 +303,9 @@ "text.autoconfig.skyblocker.option.locations.dungeons.playerSecretsTracker": "Player Secrets Tracker", "text.autoconfig.skyblocker.option.locations.dungeons.playerSecretsTracker.@Tooltip": "Tracks the amount of secrets people in your dungeon run are doing.", "text.autoconfig.skyblocker.option.locations.dungeons.starredMobGlow": "Starred Mob Glow", - "text.autoconfig.skyblocker.option.locations.dungeons.starredMobGlow.@Tooltip": "Applies the glowing effect to starred mobs that are visible.", + "text.autoconfig.skyblocker.option.locations.dungeons.starredMobGlow.@Tooltip": "Applies the glowing effect to starred mobs that are visible.\n\nWARNING: This feature is experimental and you may encounter issues with it.", + "text.autoconfig.skyblocker.option.locations.dungeons.starredMobBoundingBoxes": "Starred Mob Bounding Boxes", + "text.autoconfig.skyblocker.option.locations.dungeons.starredMobBoundingBoxes.@Tooltip": "Draws the bounding boxes of starred mobs.", "text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos": "Solve Three Weirdos Puzzle", "text.autoconfig.skyblocker.option.locations.dungeons.blazeSolver": "Solve Blaze Puzzle", "text.autoconfig.skyblocker.option.locations.dungeons.blazeSolver.@Tooltip": "Boxes the correct blaze in green, also draws a line to and boxes the next blaze to kill in white.", |