diff options
Diffstat (limited to 'src/main/java')
3 files changed, 59 insertions, 216 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java index 6dd895023..9db9ea8de 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java @@ -36,28 +36,26 @@ public class Misc { @Expose public Position realTimePos = new Position(10, 10, false, true); - @Expose @ConfigOption(name = "Hide Armor", desc = "") - @ConfigEditorAccordion(id = 3) - public boolean hideArmor = false; - + @Accordion @Expose - @ConfigOption(name = "Hide Armor", desc = "Hide other players' armor.") - @ConfigEditorBoolean() - @ConfigAccordionId(id = 3) - public Property<Boolean> hideArmorEnabled = Property.of(false); + public HideArmor hideArmor2 = new HideArmor(); - @Expose - @ConfigOption(name = "Own Armor", desc = "Hide your own armor.") - @ConfigEditorBoolean() - @ConfigAccordionId(id = 3) - public Property<Boolean> hideArmorOwn = Property.of(true); + public static class HideArmor { - @Expose - @ConfigOption(name = "Only Helmet", desc = "Only hide the helmet.") - @ConfigEditorBoolean() - @ConfigAccordionId(id = 3) - public Property<Boolean> hideArmorOnlyHelmet = Property.of(false); + @Expose + @ConfigOption(name = "Mode", desc = "Hide the armor of players.") + @ConfigEditorDropdown(values = {"All", "Own Armor", "Other's Armor", "Off"}) + @ConfigAccordionId(id = 1) + public int mode = 3; + + @Expose + @ConfigOption(name = "Only Helmet", desc = "Only hide the helmet.") + @ConfigEditorBoolean() + @ConfigAccordionId(id = 3) + public Boolean onlyHelmet = false; + + } @Expose @ConfigOption(name = "Damage Splash", desc = "") diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/HideArmor.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/HideArmor.kt index 6c081f243..96301ee7c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/HideArmor.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/HideArmor.kt @@ -1,73 +1,50 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.events.ConfigLoadEvent -import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.utils.EntityUtils.getArmorInventory +import at.hannibal2.skyhanni.utils.EntityUtils.hasPotionEffect +import at.hannibal2.skyhanni.utils.EntityUtils.isNPC import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.LorenzUtils.onToggle -import net.minecraft.client.Minecraft -import net.minecraft.client.entity.EntityOtherPlayerMP import net.minecraft.client.entity.EntityPlayerSP -import net.minecraft.client.gui.inventory.GuiInventory +import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack -import net.minecraft.network.play.server.S04PacketEntityEquipment -import net.minecraft.network.play.server.S2FPacketSetSlot -import net.minecraft.network.play.server.S30PacketWindowItems -import net.minecraftforge.event.world.WorldEvent +import net.minecraft.potion.Potion +import net.minecraftforge.client.event.RenderLivingEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -import net.minecraftforge.fml.common.gameevent.TickEvent class HideArmor { + private val config get() = SkyHanniMod.feature.misc.hideArmor2 + private var armor = mapOf<Int, ItemStack>() - private var invOpen = false - private val laterCheck = mutableListOf<Int>() + private fun shouldHideArmor(entity: EntityLivingBase): Boolean { + if (!LorenzUtils.inSkyBlock) return false + if (entity !is EntityPlayer) return false + if (entity.hasPotionEffect(Potion.invisibility)) return false + if (entity.isNPC()) return false - @SubscribeEvent - fun onGuiInventoryToggle(event: TickEvent.ClientTickEvent) { - if (!LorenzUtils.inSkyBlock) return // TODO test this - - fixOtherArmor() + return when (config.mode) { + 0 -> true - if (!SkyHanniMod.feature.misc.hideArmorEnabled.get()) return + 1 -> entity is EntityPlayerSP + 2 -> entity !is EntityPlayerSP - val currentScreen = Minecraft.getMinecraft().currentScreen - if (currentScreen == null || currentScreen !is GuiInventory) { - if (invOpen) { - invOpen = false - changeArmor(Minecraft.getMinecraft().thePlayer, null) - } - } else { - if (!invOpen) { - invOpen = true - val thePlayer = Minecraft.getMinecraft().thePlayer - val entityId = thePlayer.entityId - changeArmor(thePlayer, getCachedArmor(entityId)) - } + else -> false } } @SubscribeEvent - fun onConfigLoaded(event: ConfigLoadEvent) { - val misc = SkyHanniMod.feature.misc - onToggle(misc.hideArmorEnabled, misc.hideArmorOwn, misc.hideArmorOnlyHelmet) { updateArmor() } - } - - - // Since S04PacketEntityEquipment gets sent before the entity is fully loaded, I need to remove the armor later - private fun fixOtherArmor() { - for (entity in Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (entity !is EntityOtherPlayerMP) continue - - val entityId = entity.entityId - if (entityId !in laterCheck) continue - - laterCheck.remove(entityId) - if (SkyHanniMod.feature.misc.hideArmorEnabled.get()) { - val armorInventory = entity.inventory.armorInventory - for ((equipmentSlot, _) in armorInventory.withIndex()) { - if (!SkyHanniMod.feature.misc.hideArmorOnlyHelmet.get() || equipmentSlot == 3) { - armorInventory[equipmentSlot] = null + fun onRenderLivingPre(event: RenderLivingEvent.Pre<EntityLivingBase>) { + val entity = event.entity + if (!shouldHideArmor(entity)) return + val armorInventory = entity.getArmorInventory() ?: return + + armor = buildMap { + for ((i, stack) in armorInventory.withIndex()) { + stack?.let { + if (!config.onlyHelmet || i == 3) { + this[i] = it.copy() + armorInventory[i] = null } } } @@ -75,153 +52,13 @@ class HideArmor { } @SubscribeEvent - fun onPacketReceive(event: PacketEvent.ReceiveEvent) { - val packet = event.packet - - //own player world switch - if (packet is S30PacketWindowItems) { - - // check window id - if (packet.func_148911_c() != 0) return - - for ((slot, itemStack) in packet.itemStacks.withIndex()) { + fun onRenderLivingPost(event: RenderLivingEvent.Post<EntityLivingBase>) { + val entity = event.entity + if (!shouldHideArmor(entity)) return + val armorInventory = entity.getArmorInventory() ?: return - if (slot !in 5..8) continue - - val armorSlot = (slot - 5) * -1 + 3 - val entityId = Minecraft.getMinecraft()?.thePlayer?.entityId ?: return - val armor = getCachedArmor(entityId) - armor[armorSlot] = itemStack - - val currentScreen = Minecraft.getMinecraft().currentScreen - if (currentScreen == null || currentScreen !is GuiInventory) { - if (SkyHanniMod.feature.misc.hideArmorEnabled.get()) { - if (SkyHanniMod.feature.misc.hideArmorOwn.get()) { - if (!SkyHanniMod.feature.misc.hideArmorOnlyHelmet.get() || armorSlot == 3) { - packet.itemStacks[slot] = null - } - } - } - } - } - return + for ((index, stack) in armor) { + armorInventory[index] = stack } - - - //own player armor change - if (packet is S2FPacketSetSlot) { - val slot = packet.func_149173_d() - - // check window id - if (packet.func_149175_c() != 0) return - if (slot !in 5..8) return - - val armorSlot = (slot - 5) * -1 + 3 - val ownEntityId = Minecraft.getMinecraft()?.thePlayer?.entityId ?: return - val armor = getCachedArmor(ownEntityId) - // set item in cache - armor[armorSlot] = packet.func_149174_e() - - val currentScreen = Minecraft.getMinecraft().currentScreen - if (currentScreen == null || currentScreen !is GuiInventory) { - if (SkyHanniMod.feature.misc.hideArmorEnabled.get()) { - if (SkyHanniMod.feature.misc.hideArmorOwn.get()) { - if (!SkyHanniMod.feature.misc.hideArmorOnlyHelmet.get() || armorSlot == 3) { - event.isCanceled = true - } - } - } - } - return - } - - - //other player armor switch - if (packet is S04PacketEntityEquipment) { - val entityID = packet.entityID - val equipmentSlot = packet.equipmentSlot - 1 - if (equipmentSlot == -1) return - - val entity = Minecraft.getMinecraft().theWorld?.getEntityByID(entityID) - if (entity == null) { - laterCheck.add(entityID) - return - } - - if (entity !is EntityOtherPlayerMP) return - - val armor = getCachedArmor(entityID) - - // set item in cache - armor[equipmentSlot] = packet.itemStack - - if (SkyHanniMod.feature.misc.hideArmorEnabled.get()) { - if (!SkyHanniMod.feature.misc.hideArmorOnlyHelmet.get() || equipmentSlot == 3) { - event.isCanceled = true - } - } - } - } - - private fun getCachedArmor(entityID: Int): Array<ItemStack?> { - val armor: Array<ItemStack?> = if (armorCache.containsKey(entityID)) { - armorCache[entityID]!! - } else { - val new = arrayOf<ItemStack?>(null, null, null, null) - armorCache[entityID] = new - new - } - return armor - } - - companion object { - var armorCache: MutableMap<Int, Array<ItemStack?>> = mutableMapOf() - - fun updateArmor() { - for (entity in Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (entity !is EntityPlayer) continue - - val entityId = entity.entityId - armorCache[entityId]?.let { - changeArmor(entity, it) - } - - if (SkyHanniMod.feature.misc.hideArmorEnabled.get()) { - changeArmor(entity, null) - } - } - } - - private fun changeArmor(entity: EntityPlayer, new: Array<ItemStack?>?) { - if (!LorenzUtils.inSkyBlock) return - - val current = entity.inventory.armorInventory - if (new != null) { - current[0] = new[0] - current[1] = new[1] - current[2] = new[2] - current[3] = new[3] - return - } - - if (!SkyHanniMod.feature.misc.hideArmorOwn.get()) { - if (entity is EntityPlayerSP) { - return - } - } - - if (!SkyHanniMod.feature.misc.hideArmorOnlyHelmet.get()) { - current[0] = null - current[1] = null - current[2] = null - } - current[3] = null - } - } - - @SubscribeEvent - fun onWorldChange(event: WorldEvent.Load) { - armorCache.clear() - laterCheck.clear() } }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt index c27d464d7..9e095ec1e 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt @@ -8,6 +8,8 @@ import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.item.EntityArmorStand import net.minecraft.entity.monster.EntityBlaze import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.potion.Potion import net.minecraft.util.AxisAlignedBB object EntityUtils { @@ -118,4 +120,10 @@ object EntityUtils { if (inventory == null) return false return inventory.any { it != null && it.getSkullTexture() == skin } } + + fun EntityPlayer.isNPC() = uniqueID == null || uniqueID.version() != 4 + + fun EntityLivingBase.hasPotionEffect(potion: Potion) = getActivePotionEffect(potion) != null + + fun EntityLivingBase.getArmorInventory(): Array<ItemStack?>? = if (this is EntityPlayer) inventory.armorInventory else null }
\ No newline at end of file |