aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java35
-rw-r--r--src/main/java/at/hannibal2/skyhanni/events/ServerBlockChangeEvent.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenceBlocks.kt155
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt32
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt13
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt2
7 files changed, 184 insertions, 59 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
index 6e98bc8e1..6c536e28c 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
@@ -68,6 +68,7 @@ import at.hannibal2.skyhanni.features.rift.area.colosseum.BlobbercystsHighlight
import at.hannibal2.skyhanni.features.rift.area.dreadfarm.RiftAgaricusCap
import at.hannibal2.skyhanni.features.rift.area.dreadfarm.VoltHighlighter
import at.hannibal2.skyhanni.features.rift.area.livingcave.LivingCaveDefenceBlocks
+import at.hannibal2.skyhanni.features.rift.area.livingcave.LivingCaveLivingMetalHelper
import at.hannibal2.skyhanni.features.rift.area.livingcave.LivingMetalSuitProgress
import at.hannibal2.skyhanni.features.rift.area.mirrorverse.DanceRoomHelper
import at.hannibal2.skyhanni.features.rift.area.mirrorverse.RiftLavaMazeParkour
@@ -345,6 +346,7 @@ class SkyHanniMod {
loadModule(VampireSlayerFeatures())
loadModule(BlobbercystsHighlight())
loadModule(LivingCaveDefenceBlocks())
+ loadModule(LivingCaveLivingMetalHelper())
init()
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java
index ff1679b0d..393fb28dd 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/RiftConfig.java
@@ -447,7 +447,6 @@ public class RiftConfig {
public static class LivingCaveConfig {
-
@Expose
@ConfigOption(name = "Living Metal Suit Progress", desc = "")
@Accordion
@@ -470,9 +469,37 @@ public class RiftConfig {
}
@Expose
- @ConfigOption(name = "Defence Blocks", desc = "Show the defence blocks.")
- @ConfigEditorBoolean
- public boolean defenceBlocks = true;
+ @ConfigOption(name = "Living Metal Helper", desc = "")
+ @Accordion
+ public DefenceBlockConfig defenceBlockConfig = new DefenceBlockConfig();
+
+ public static class DefenceBlockConfig {
+
+ @Expose
+ @ConfigOption(name = "Defence Blocks", desc = "Show a line between the defence blocks and the mob and highlight the blocks.")
+ @ConfigEditorBoolean
+ public boolean enabled = false;
+
+ @Expose
+ @ConfigOption(name = "Color", desc = "Set the color of the lines, blocks and the entity.")
+ @ConfigEditorColour
+ public Property<String> color = Property.of("0:255:77:104:255");
+
+ }
+
+ @Expose
+ @ConfigOption(name = "Living Metal Helper", desc = "")
+ @Accordion
+ public LivingCaveLivingMetalConfig livingCaveLivingMetalConfig = new LivingCaveLivingMetalConfig();
+
+ public static class LivingCaveLivingMetalConfig {
+
+ @Expose
+ @ConfigOption(name = "Living Metal", desc = "Show the Living Metal.")
+ @ConfigEditorBoolean
+ public boolean enabled = true;
+
+ }
}
@Expose
diff --git a/src/main/java/at/hannibal2/skyhanni/events/ServerBlockChangeEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/ServerBlockChangeEvent.kt
index 41d8ea946..b8ac2eb28 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/ServerBlockChangeEvent.kt
+++ b/src/main/java/at/hannibal2/skyhanni/events/ServerBlockChangeEvent.kt
@@ -6,8 +6,8 @@ import at.hannibal2.skyhanni.utils.toLorenzVec
import net.minecraft.block.state.IBlockState
import net.minecraft.util.BlockPos
-class ServerBlockChangeEvent(val pos: BlockPos, val blockState: IBlockState) : LorenzEvent() {
- val location by lazy { pos.toLorenzVec() }
+class ServerBlockChangeEvent(private val blockPos: BlockPos, private val blockState: IBlockState) : LorenzEvent() {
+ val location by lazy { blockPos.toLorenzVec() }
val old by lazy { location.getBlockAt().toString().getName() }
val new by lazy { blockState.block.toString().getName() }
diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenceBlocks.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenceBlocks.kt
index 30475b712..745246bef 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenceBlocks.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveDefenceBlocks.kt
@@ -3,16 +3,21 @@ package at.hannibal2.skyhanni.features.rift.area.livingcave
import at.hannibal2.skyhanni.events.PacketEvent
import at.hannibal2.skyhanni.events.ReceiveParticleEvent
import at.hannibal2.skyhanni.events.ServerBlockChangeEvent
+import at.hannibal2.skyhanni.events.withAlpha
import at.hannibal2.skyhanni.features.rift.everywhere.RiftAPI
+import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper
import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled
-import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer
-import at.hannibal2.skyhanni.utils.LorenzColor
+import at.hannibal2.skyhanni.utils.EntityUtils.getEntitiesNearby
+import at.hannibal2.skyhanni.utils.EntityUtils.isAtFullHealth
+import at.hannibal2.skyhanni.utils.LocationUtils.distanceTo
import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy
-import at.hannibal2.skyhanni.utils.LorenzUtils.round
+import at.hannibal2.skyhanni.utils.LorenzUtils.toChromaColor
import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.RenderUtils.draw3DLine
import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
+import at.hannibal2.skyhanni.utils.getLorenzVec
import net.minecraft.client.Minecraft
-import net.minecraft.entity.EntityLiving
+import net.minecraft.client.entity.EntityOtherPlayerMP
import net.minecraft.network.play.server.S22PacketMultiBlockChange
import net.minecraft.network.play.server.S23PacketBlockChange
import net.minecraft.util.EnumParticleTypes
@@ -21,46 +26,72 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class LivingCaveDefenceBlocks {
- val config get() = RiftAPI.config.area.livingCaveConfig
- private var movingBlocks = mapOf<LorenzVec, Long>()
- private var staticBlocks = emptyList<LorenzVec>()
+ private val config get() = RiftAPI.config.area.livingCaveConfig.defenceBlockConfig
+ private var movingBlocks = mapOf<DefenceBlock, Long>()
+ private var staticBlocks = emptyList<DefenceBlock>()
+// private var helpLocation = emptyList<LorenzVec>()
- class DefenceBlock(val entity: EntityLiving, val location: LorenzVec)
+ class DefenceBlock(val entity: EntityOtherPlayerMP, val location: LorenzVec, var hidden: Boolean = false)
@SubscribeEvent
fun onReceiveParticle(event: ReceiveParticleEvent) {
- if (!isEnabled()) return
+ val location = event.location.add(-0.5, 0.0, -0.5)
+// if (event.type == EnumParticleTypes.CRIT_MAGIC) {
+// helpLocation = helpLocation.editCopy { add(location) }
+// }
+
+ // TODO remove
Minecraft.getMinecraft().thePlayer?.let {
if (it.isSneaking) {
staticBlocks = emptyList()
+// helpLocation = emptyList()
}
}
+ if (!isEnabled()) return
movingBlocks = movingBlocks.editCopy {
- values.removeIf { System.currentTimeMillis() > it }
- keys.removeIf { staticBlocks.any { others -> others.distance(it) < 1.5 } }
+ values.removeIf { System.currentTimeMillis() > it + 2000 }
+ keys.removeIf { staticBlocks.any { others -> others.location.distance(it.location) < 1.5 } }
}
- val location = event.location.add(-0.5, 0.0, -0.5)
-// if (staticBlocks.any { it.distance(location) < 2.5 }) {
- if (staticBlocks.any { it.distance(location) < 3 }) {
+
+ // Ignore particles around blocks
+ if (staticBlocks.any { it.location.distance(location) < 3 }) {
event.isCanceled = true
return
}
if (event.type == EnumParticleTypes.CRIT_MAGIC) {
-// movingBlocks.keys.find { it.distance(location) < 0.3 }?.let {
- movingBlocks.keys.find { it.distance(location) < 0.5 }?.let {
- movingBlocks = movingBlocks.editCopy { remove(it) }
+ var entity: EntityOtherPlayerMP? = null
+
+ // read old entity data
+ getNearestMovingDefenceBlock(location)?.let {
+ if (it.location.distance(location) < 0.5) {
+ movingBlocks = movingBlocks.editCopy {
+ it.hidden = true
+ }
+ entity = it.entity
+ }
+ }
+
+ if (entity == null) {
+ // read new entity data
+ val compareLocation = event.location.add(-0.5, -1.5, -0.5)
+ entity = Minecraft.getMinecraft().theWorld.getEntitiesNearby<EntityOtherPlayerMP>(compareLocation, 2.0)
+ .filter { it.name == "Autonull " || it.name == "Autoboots " }
+ .filter { !it.isAtFullHealth() }
+ .minByOrNull { it.distanceTo(compareLocation) }
}
- movingBlocks = movingBlocks.editCopy { this[location] = System.currentTimeMillis() + 500 }
+ val defenceBlock = entity?.let { DefenceBlock(it, location) } ?: return
+
+ movingBlocks = movingBlocks.editCopy { this[defenceBlock] = System.currentTimeMillis() + 250 }
event.isCanceled = true
}
}
- // TODO move somewhere else
+ // TODO move to somewhere else
@SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true)
fun onChatPacket(event: PacketEvent.ReceiveEvent) {
val packet = event.packet
@@ -80,52 +111,72 @@ class LivingCaveDefenceBlocks {
val location = event.location
val old = event.old
val new = event.new
- val distanceToPlayer = location.distanceToPlayer()
+ // spawn block
if (old == "air" && (new == "stained_glass" || new == "diamond_block")) {
- println("detect spawn: ${distanceToPlayer.round(1)}")
- staticBlocks = staticBlocks.editCopy { add(location) }
- } else if (new == "air" && location in staticBlocks) {
- println("detect despawn: ${distanceToPlayer.round(1)}")
- staticBlocks = staticBlocks.editCopy { remove(location) }
- } else {
-// if (distanceToPlayer < 3) {
- if (distanceToPlayer < 10) {
-// if (old == "lapis_ore" || new == "lapis_ore") {
-// println("block change: $old -> $new")
-// }
- if (old == "wool") return
- if (new == "wool") return
- if (old == "lapis_block") return
- if (new == "lapis_block") return
- if (old == "stained_glass" && new == "stone") return
- if (old == "stone" && new == "stained_glass") return
- if (old == "stained_glass" && new == "stained_hardened_clay") return
-// println("block change: $old -> $new")
+ val entity = getNearestMovingDefenceBlock(location)?.entity ?: return
+ staticBlocks = staticBlocks.editCopy {
+ add(DefenceBlock(entity, location))
+ RenderLivingEntityHelper.setEntityColor(
+ entity,
+ color.withAlpha(50)
+ ) { isEnabled() && staticBlocks.any { it.entity == entity } }
}
}
-// if (old.contains("air") && new.contains("diamond_block")) {
-// println("detect big spawn: ${distanceToPlayer.round(1)}")
-// }
-// if (old.contains("diamond_block") && new.contains("air")) {
-// println("detect big despawn: ${distanceToPlayer.round(1)}")
-// }
+
+ // despawn block
+ val nearestBlock = getNearestStaticDefenceBlock(location)
+ if (new == "air" && location == nearestBlock?.location) {
+ staticBlocks = staticBlocks.editCopy { remove(nearestBlock) }
+ }
}
+ private fun getNearestMovingDefenceBlock(location: LorenzVec) =
+ movingBlocks.keys.filter { it.location.distance(location) < 15 }.minByOrNull { it.location.distance(location) }
+
+ private fun getNearestStaticDefenceBlock(location: LorenzVec) =
+ staticBlocks.filter { it.location.distance(location) < 15 }.minByOrNull { it.location.distance(location) }
+
@SubscribeEvent
fun onRenderWorld(event: RenderWorldLastEvent) {
+// for (location in helpLocation) {
+// event.drawWaypointFilled(location, LorenzColor.GREEN.toColor())
+// event.drawDynamicText(location, "§aTest", 1.5)
+//
+// }
if (!isEnabled()) return
- for (location in movingBlocks.keys) {
- event.drawWaypointFilled(location, LorenzColor.WHITE.toColor())
- event.drawDynamicText(location, "Defense Block", 1.5)
+ for ((block, time) in movingBlocks) {
+ if (block.hidden) continue
+ if (time > System.currentTimeMillis()) {
+ val location = block.location
+ event.drawWaypointFilled(location, color)
+ event.draw3DLine(
+ block.entity.getLorenzVec().add(0.0, 0.5, 0.0),
+ location.add(0.5, 0.5, 0.5),
+ color,
+ 1,
+ false
+ )
+ }
}
- for (location in staticBlocks) {
- event.drawWaypointFilled(location, LorenzColor.WHITE.toColor())
- event.drawDynamicText(location, "Defense Block", 1.5)
+ for (block in staticBlocks) {
+ val location = block.location
+ event.drawWaypointFilled(location, color)
+ event.drawDynamicText(location, "§bBreak!", 1.5)
+
+ event.draw3DLine(
+ block.entity.getLorenzVec().add(0.0, 0.5, 0.0),
+ location.add(0.5, 0.5, 0.5),
+ color,
+ 3,
+ false
+ )
}
}
- fun isEnabled() = RiftAPI.inRift() && config.defenceBlocks && RiftAPI.inLivingCave()
+ val color get() = config.color.get().toChromaColor()
+
+ fun isEnabled() = RiftAPI.inRift() && config.enabled && RiftAPI.inLivingCave()
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt
new file mode 100644
index 000000000..696479a37
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt
@@ -0,0 +1,32 @@
+package at.hannibal2.skyhanni.features.rift.area.livingcave
+
+import at.hannibal2.skyhanni.events.ServerBlockChangeEvent
+import at.hannibal2.skyhanni.features.rift.everywhere.RiftAPI
+import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+
+class LivingCaveLivingMetalHelper {
+ private val config get() = RiftAPI.config.area.livingCaveConfig.livingCaveLivingMetalConfig
+
+ @SubscribeEvent
+ fun onBlockChange(event: ServerBlockChangeEvent) {
+ val location = event.location
+ val old = event.old
+ val new = event.new
+ val distanceToPlayer = location.distanceToPlayer()
+
+ if (distanceToPlayer < 10) {
+ if (old == "lapis_ore" || new == "lapis_ore") {
+ println("block change: $old -> $new")
+ }
+// if (old == "wool") return
+// if (new == "wool") return
+// if (old == "lapis_block") return
+// if (new == "lapis_block") return
+// if (old == "stained_glass" && new == "stone") return
+// if (old == "stone" && new == "stained_glass") return
+// if (old == "stained_glass" && new == "stained_hardened_clay") return
+// println("block change: $old -> $new")
+ }
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
index 6af83a805..b9a4c4bcb 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
@@ -1,8 +1,10 @@
package at.hannibal2.skyhanni.utils
import at.hannibal2.skyhanni.utils.ItemUtils.getSkullTexture
+import at.hannibal2.skyhanni.utils.LocationUtils.distanceTo
import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth
import net.minecraft.client.multiplayer.WorldClient
+import net.minecraft.entity.Entity
import net.minecraft.entity.EntityLivingBase
import net.minecraft.entity.item.EntityArmorStand
import net.minecraft.entity.monster.EntityBlaze
@@ -123,6 +125,14 @@ object EntityUtils {
?.value
}
+ inline fun <reified T : Entity> WorldClient.getEntitiesNextToPlayer(radius: Double): List<T> =
+ getEntitiesNearby(LocationUtils.playerLocation(), radius)
+
+ inline fun <reified T : Entity> WorldClient.getEntitiesNearby(location: LorenzVec, radius: Double): List<T> =
+ getLoadedEntityList().filterIsInstance<T>().filter { it.distanceTo(location) < radius }
+
+ fun EntityLivingBase.isAtFullHealth() = baseMaxHealth == health.toInt()
+
fun WorldClient.getEntitiesNearby(
clazz: Class<EntityBlaze>,
location: LorenzVec,
@@ -140,5 +150,6 @@ object EntityUtils {
fun EntityLivingBase.hasPotionEffect(potion: Potion) = getActivePotionEffect(potion) != null
- fun EntityLivingBase.getArmorInventory(): Array<ItemStack?>? = if (this is EntityPlayer) inventory.armorInventory else null
+ fun EntityLivingBase.getArmorInventory(): Array<ItemStack?>? =
+ if (this is EntityPlayer) inventory.armorInventory else null
} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt
index bf7a0f1ee..1c1bd5b1b 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/LocationUtils.kt
@@ -16,6 +16,8 @@ object LocationUtils {
fun Entity.distanceToPlayer() = getLorenzVec().distance(playerLocation())
+ fun Entity.distanceTo(location: LorenzVec) = getLorenzVec().distance(location)
+
fun playerEyeLocation(): LorenzVec {
val player = Minecraft.getMinecraft().thePlayer
val vec = player.getLorenzVec()