From df28fc40ec48a7d9779d1a48932f47fff2d7b8d5 Mon Sep 17 00:00:00 2001 From: Thunderblade73 <85900443+Thunderblade73@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:38:27 +0200 Subject: [PATCH] Fix: Fel Highlight in Edge Case (#2746) Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- src/main/java/at/hannibal2/skyhanni/data/mob/Mob.kt | 7 ++++--- .../skyhanni/features/dungeon/DungeonMobManager.kt | 2 +- .../skyhanni/test/command/CopyNearbyEntitiesCommand.kt | 4 ++++ src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt | 2 +- src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/data/mob/Mob.kt b/src/main/java/at/hannibal2/skyhanni/data/mob/Mob.kt index 765ad8a162d4..a486f97991d8 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/mob/Mob.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/mob/Mob.kt @@ -110,7 +110,7 @@ class Mob( fun isInRender() = baseEntity.distanceToPlayer() < MobData.ENTITY_RENDER_RANGE_IN_BLOCKS - fun canBeSeen() = baseEntity.canBeSeen() + fun canBeSeen(viewDistance: Number = 150) = baseEntity.canBeSeen(viewDistance) fun isInvisible() = baseEntity !is EntityZombie && baseEntity.isInvisible && baseEntity.inventory.isNullOrEmpty() @@ -131,9 +131,9 @@ class Mob( private fun internalHighlight() { highlightColor?.let { color -> - RenderLivingEntityHelper.setEntityColorWithNoHurtTime(baseEntity, color.rgb) { true } + RenderLivingEntityHelper.setEntityColorWithNoHurtTime(baseEntity, color.rgb) { !this.isInvisible() } extraEntities.forEach { - RenderLivingEntityHelper.setEntityColorWithNoHurtTime(it, color.rgb) { true } + RenderLivingEntityHelper.setEntityColorWithNoHurtTime(it, color.rgb) { !this.isInvisible() } } } } @@ -242,4 +242,5 @@ class Mob( // TODO add max distance fun lineToPlayer(color: Color, lineWidth: Int = 2, depth: Boolean = true) = LineToMobHandler.register(this, color, lineWidth, depth) + fun distanceToPlayer(): Double = baseEntity.distanceToPlayer() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMobManager.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMobManager.kt index 46450a5645d5..d3f85c1661d6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMobManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonMobManager.kt @@ -83,7 +83,7 @@ object DungeonMobManager { fun onRenderWorld(event: LorenzRenderWorldEvent) { if (!fel.highlight.get()) return if (fel.line) { - felOnTheGround.filter { it.canBeSeen() }.forEach { + felOnTheGround.filter { it.canBeSeen(30) }.forEach { event.draw3DLine( it.baseEntity.getLorenzVec().add(y = 0.15), event.exactPlayerEyeLocation(), diff --git a/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyEntitiesCommand.kt b/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyEntitiesCommand.kt index f50d4cb45506..443c4ff97861 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyEntitiesCommand.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/command/CopyNearbyEntitiesCommand.kt @@ -74,6 +74,10 @@ object CopyNearbyEntitiesCommand { val ridingEntity = entity.ridingEntity resultList.add("ridingEntity: $ridingEntity") + if(entity.isInvisible) { + resultList.add("Invisible: true") + } + if (entity is EntityLivingBase) { resultList.add("EntityLivingBase:") val baseMaxHealth = entity.baseMaxHealth diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt index c5eb95fc892a..d9153f565fbe 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt @@ -191,7 +191,7 @@ object EntityUtils { if (Minecraft.getMinecraft().isCallingFromMinecraftThread) it else it.toMutableList() }?.asSequence()?.filterNotNull() ?: emptySequence() - fun Entity.canBeSeen(radius: Double = 150.0) = getLorenzVec().up(0.5).canBeSeen(radius) + fun Entity.canBeSeen(viewDistance: Number = 150.0) = getLorenzVec().up(0.5).canBeSeen(viewDistance) fun getEntityByID(entityId: Int) = Minecraft.getMinecraft()?.thePlayer?.entityWorld?.getEntityByID(entityId) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt index d2394624c8a5..9937708aadc4 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt @@ -42,11 +42,11 @@ object LocationUtils { fun AxisAlignedBB.isPlayerInside() = isInside(playerLocation()) - fun LorenzVec.canBeSeen(radius: Double = 150.0, offset: Double? = null): Boolean { + fun LorenzVec.canBeSeen(viewDistance: Number = 150.0, offset: Double? = null): Boolean { val a = playerEyeLocation() val b = this val noBlocks = canSee(a, b, offset) - val notTooFar = a.distance(b) < radius + val notTooFar = a.distance(b) < viewDistance.toDouble() val inFov = true // TODO add Frustum "Frustum().isBoundingBoxInFrustum(entity.entityBoundingBox)" return noBlocks && notTooFar && inFov }