From 13eef44cac59e98c99f7976df678d49707d6c488 Mon Sep 17 00:00:00 2001 From: FriedrichM <37214532+FriedrichM@users.noreply.github.com> Date: Sat, 16 Jan 2021 22:04:34 +0200 Subject: [PATCH] [feature] Nearby player check for AutoMend (#1856) Co-authored-by: Dominika --- .../kami/module/modules/combat/AutoMend.kt | 59 ++++++++++++++++--- .../kami/module/modules/combat/VisualRange.kt | 4 +- .../me/zeroeightsix/kami/util/EntityUtils.kt | 2 + 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/zeroeightsix/kami/module/modules/combat/AutoMend.kt b/src/main/java/me/zeroeightsix/kami/module/modules/combat/AutoMend.kt index 687a881b6..515258978 100644 --- a/src/main/java/me/zeroeightsix/kami/module/modules/combat/AutoMend.kt +++ b/src/main/java/me/zeroeightsix/kami/module/modules/combat/AutoMend.kt @@ -2,11 +2,15 @@ package me.zeroeightsix.kami.module.modules.combat import me.zeroeightsix.kami.event.SafeClientEvent import me.zeroeightsix.kami.event.events.GuiEvent +import me.zeroeightsix.kami.manager.managers.FriendManager import me.zeroeightsix.kami.module.Category import me.zeroeightsix.kami.module.Module +import me.zeroeightsix.kami.util.EntityUtils.isFakeOrSelf +import me.zeroeightsix.kami.util.items.swapToSlot import me.zeroeightsix.kami.util.text.MessageSendHelper import me.zeroeightsix.kami.util.threads.runSafe import me.zeroeightsix.kami.util.threads.safeListener +import net.minecraft.entity.player.EntityPlayer import net.minecraft.init.Items import net.minecraft.util.EnumHand import net.minecraftforge.fml.common.gameevent.TickEvent @@ -21,14 +25,23 @@ internal object AutoMend : Module( private val autoThrow by setting("AutoThrow", true) private val autoSwitch by setting("AutoSwitch", true) private val autoDisable by setting("AutoDisable", false, { autoSwitch }) - private val threshold by setting("Repair%", 75, 1..100, 1) - private val gui by setting("RunInGUIs", false) + private val cancelNearby by setting("CancelNearby", NearbyMode.OFF, description = "Don't mend when an enemy is nearby") + private val pauseNearbyRadius by setting("NearbyRadius", 10, 1..8, 1, { cancelNearby != NearbyMode.OFF }) + private val threshold by setting("RepairAt", 75, 1..100, 1, description = "Percentage to start repairing any armor piece") + private val gui by setting("AllowGUI", false, description = "Allow mending when inside a GUI") private var initHotbarSlot = -1 private var isGuiOpened = false + private var paused = false + + @Suppress("unused") + private enum class NearbyMode { + OFF, PAUSE, DISABLE + } init { onEnable { + paused = false if (autoSwitch) { runSafe { initHotbarSlot = player.inventory.currentItem @@ -37,13 +50,7 @@ internal object AutoMend : Module( } onDisable { - if (autoSwitch) { - runSafe { - if (initHotbarSlot != -1 && initHotbarSlot != player.inventory.currentItem) { - player.inventory.currentItem = initHotbarSlot - } - } - } + switchback() } listener { @@ -57,6 +64,18 @@ internal object AutoMend : Module( safeListener { if (isGuiOpened && !gui) return@safeListener + if (cancelNearby != NearbyMode.OFF && isNearbyPlayer()) { + if (cancelNearby == NearbyMode.DISABLE) { + disable() + } else { + if (!paused) + switchback() + paused = true + } + return@safeListener + } + paused = false + if (shouldMend(0) || shouldMend(1) || shouldMend(2) || shouldMend(3)) { if (autoSwitch && player.heldItemMainhand.item !== Items.EXPERIENCE_BOTTLE) { val xpSlot = findXpPots() @@ -92,4 +111,26 @@ internal object AutoMend : Module( val stack = player.inventory.armorInventory[i] return stack.isItemDamaged && 100 * stack.itemDamage / stack.maxDamage > reverseNumber(threshold, 1, 100) } + + private fun switchback() { + if (autoSwitch) { + runSafe { + if (initHotbarSlot != -1 && initHotbarSlot != player.inventory.currentItem) { + swapToSlot(initHotbarSlot) + } + } + } + } + + private fun isNearbyPlayer(): Boolean { + for (entity in mc.world.loadedEntityList) { + if (entity !is EntityPlayer) continue + if (entity.isFakeOrSelf) continue + if (AntiBot.isBot(entity)) continue + if (mc.player.getDistance(entity) > pauseNearbyRadius) continue + if (FriendManager.isFriend(entity.name)) continue + return true + } + return false + } } \ No newline at end of file diff --git a/src/main/java/me/zeroeightsix/kami/module/modules/combat/VisualRange.kt b/src/main/java/me/zeroeightsix/kami/module/modules/combat/VisualRange.kt index d44ea8454..be425dbb1 100644 --- a/src/main/java/me/zeroeightsix/kami/module/modules/combat/VisualRange.kt +++ b/src/main/java/me/zeroeightsix/kami/module/modules/combat/VisualRange.kt @@ -5,6 +5,7 @@ import me.zeroeightsix.kami.manager.managers.WaypointManager import me.zeroeightsix.kami.module.Category import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.util.EntityUtils.flooredPosition +import me.zeroeightsix.kami.util.EntityUtils.isFakeOrSelf import me.zeroeightsix.kami.util.TickTimer import me.zeroeightsix.kami.util.TimeUnit import me.zeroeightsix.kami.util.text.MessageSendHelper @@ -43,8 +44,7 @@ internal object VisualRange : Module( val loadedPlayerSet = LinkedHashSet(world.playerEntities) for (entityPlayer in loadedPlayerSet) { - if (entityPlayer == mc.renderViewEntity || entityPlayer == player) continue // Self/Freecam check - if (entityPlayer.entityId < 0) continue // Fake entity check + if (entityPlayer.isFakeOrSelf) continue // Self / Freecam / FakePlayer check if (!friends && FriendManager.isFriend(entityPlayer.name)) continue // Friend check if (playerSet.add(entityPlayer) && isEnabled) { diff --git a/src/main/java/me/zeroeightsix/kami/util/EntityUtils.kt b/src/main/java/me/zeroeightsix/kami/util/EntityUtils.kt index 9e62ab918..24745e1a4 100644 --- a/src/main/java/me/zeroeightsix/kami/util/EntityUtils.kt +++ b/src/main/java/me/zeroeightsix/kami/util/EntityUtils.kt @@ -37,6 +37,8 @@ object EntityUtils { val Entity.isHostile get() = isMobAggressive(this) + val EntityPlayer.isFakeOrSelf get() = this == mc.player || this == mc.renderViewEntity || this.entityId < 0 + private fun isNeutralMob(entity: Entity) = entity is EntityPigZombie || entity is EntityWolf || entity is EntityEnderman