From 0e23d2da9cd240f86bb544f45b9346130afc2986 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sat, 7 Jan 2023 01:43:20 +0100 Subject: [PATCH 1/2] Nametags: Add TOTEM_POP_COUNT ContentType This patch allows for the popped totems to be able to be shown in the nametags. The totem pop counting functionality is embedded in the TotemPopCounter module, hence, it needs to be active in order for this to work. As to ensure this is the case, this patch adds some logic preventing this feature to be enabled when the TotemPopCounter module is inactive, and also re-enables the TotemPopCounter module if this feature is enabled and the user tries to disable the TotemPopCounter module. --- .../module/modules/combat/TotemPopCounter.kt | 2 +- .../client/module/modules/render/Nametags.kt | 35 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt b/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt index 94a761232..dd737b951 100644 --- a/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt +++ b/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt @@ -35,7 +35,7 @@ object TotemPopCounter : Module( CLIENT, EVERYONE } - private val popCountMap = WeakHashMap().synchronized() + public val popCountMap = WeakHashMap().synchronized() private var wasSent = false init { diff --git a/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt b/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt index 7ae701a7f..391b46639 100644 --- a/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt +++ b/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt @@ -11,6 +11,7 @@ import com.lambda.client.module.modules.client.ClickGUI import com.lambda.client.module.modules.client.CustomFont import com.lambda.client.module.modules.client.GuiColors import com.lambda.client.module.modules.client.Hud +import com.lambda.client.module.modules.combat.TotemPopCounter import com.lambda.client.module.modules.misc.LogoutLogger import com.lambda.client.util.EnchantmentUtils import com.lambda.client.util.EntityUtils @@ -20,6 +21,7 @@ import com.lambda.client.util.graphics.* import com.lambda.client.util.graphics.font.* import com.lambda.client.util.items.originalName import com.lambda.client.util.math.Vec2d +import com.lambda.client.util.text.MessageSendHelper import com.lambda.client.util.threads.safeListener import net.minecraft.client.entity.EntityOtherPlayerMP import net.minecraft.client.renderer.RenderHelper @@ -61,12 +63,19 @@ object Nametags : Module( private val range by setting("Range", 64, 0..256, 4, { page == Page.ENTITY_TYPE }) /* Content */ - private val line1left = setting("Line 1 Left", ContentType.NONE, { page == Page.CONTENT }) - private val line1center = setting("Line 1 Center", ContentType.NONE, { page == Page.CONTENT }) - private val line1right = setting("Line 1 Right", ContentType.NONE, { page == Page.CONTENT }) - private val line2left = setting("Line 2 Left", ContentType.NAME, { page == Page.CONTENT }) - private val line2center = setting("Line 2 Center", ContentType.PING, { page == Page.CONTENT }) - private val line2right = setting("Line 2 Right", ContentType.TOTAL_HP, { page == Page.CONTENT }) + private val consumer = { _ : ContentType, next : ContentType -> + if (next == ContentType.TOTEM_POP_COUNT && TotemPopCounter.isDisabled) { + MessageSendHelper.sendChatMessage("$chatName Skipping \"Totem Pop Count\" as the TotemPopCounter module is not activated.") + ContentType.NONE + } else next + } + + private val line1left = setting("Line 1 Left", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) + private val line1center = setting("Line 1 Center", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) + private val line1right = setting("Line 1 Right", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) + private val line2left = setting("Line 2 Left", ContentType.NAME, { page == Page.CONTENT }, consumer = consumer) + private val line2center = setting("Line 2 Center", ContentType.PING, { page == Page.CONTENT }, consumer = consumer) + private val line2right = setting("Line 2 Right", ContentType.TOTAL_HP, { page == Page.CONTENT }, consumer = consumer) private val dropItemCount by setting("Drop Item Count", true, { page == Page.CONTENT && items }) private val maxDropItems by setting("Max Drop Items", 5, 2..16, 1, { page == Page.CONTENT && items }) @@ -95,7 +104,7 @@ object Nametags : Module( } private enum class ContentType { - NONE, NAME, TYPE, TOTAL_HP, HP, ABSORPTION, PING, DISTANCE, ENTITY_ID + NONE, NAME, TYPE, TOTAL_HP, HP, ABSORPTION, PING, DISTANCE, ENTITY_ID, TOTEM_POP_COUNT } private val pingColorGradient = ColorGradient( @@ -453,6 +462,18 @@ object Nametags : Module( ContentType.ENTITY_ID -> { TextComponent.TextElement("ID: ${entity.entityId}", GuiColors.text) } + ContentType.TOTEM_POP_COUNT -> { + // Note: The totem pop counting functionality is embedded in the TotemPopCounter module, + // hence, it needs to be active in order for this to work. + if (TotemPopCounter.isDisabled) + TotemPopCounter.enable() + if (entity !is EntityPlayer) { + null + } else { + val count = TotemPopCounter.popCountMap.getOrDefault(entity, 0) + TextComponent.TextElement("PT: $count", GuiColors.text) + } + } } private fun getEntityType(entity: Entity) = entity.javaClass.simpleName.replace("Entity", "") From 0d4b159d1302bb2c0930cfee1d8bd124b3952263 Mon Sep 17 00:00:00 2001 From: Constructor Date: Sun, 8 Jan 2023 19:50:47 +0100 Subject: [PATCH 2/2] Cleanup --- .../module/modules/combat/TotemPopCounter.kt | 2 +- .../client/module/modules/render/Nametags.kt | 64 ++++++++----------- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt b/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt index dd737b951..71ca05d76 100644 --- a/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt +++ b/src/main/kotlin/com/lambda/client/module/modules/combat/TotemPopCounter.kt @@ -35,7 +35,7 @@ object TotemPopCounter : Module( CLIENT, EVERYONE } - public val popCountMap = WeakHashMap().synchronized() + val popCountMap = WeakHashMap().synchronized() private var wasSent = false init { diff --git a/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt b/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt index 391b46639..da3fe6386 100644 --- a/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt +++ b/src/main/kotlin/com/lambda/client/module/modules/render/Nametags.kt @@ -3,6 +3,7 @@ package com.lambda.client.module.modules.render import com.lambda.client.commons.extension.ceilToInt import com.lambda.client.commons.extension.floorToInt import com.lambda.client.commons.utils.MathUtils +import com.lambda.client.event.SafeClientEvent import com.lambda.client.event.events.RenderOverlayEvent import com.lambda.client.event.listener.listener import com.lambda.client.module.Category @@ -21,7 +22,6 @@ import com.lambda.client.util.graphics.* import com.lambda.client.util.graphics.font.* import com.lambda.client.util.items.originalName import com.lambda.client.util.math.Vec2d -import com.lambda.client.util.text.MessageSendHelper import com.lambda.client.util.threads.safeListener import net.minecraft.client.entity.EntityOtherPlayerMP import net.minecraft.client.renderer.RenderHelper @@ -62,20 +62,12 @@ object Nametags : Module( private val invisible by setting("Invisible", true, { page == Page.ENTITY_TYPE }) private val range by setting("Range", 64, 0..256, 4, { page == Page.ENTITY_TYPE }) - /* Content */ - private val consumer = { _ : ContentType, next : ContentType -> - if (next == ContentType.TOTEM_POP_COUNT && TotemPopCounter.isDisabled) { - MessageSendHelper.sendChatMessage("$chatName Skipping \"Totem Pop Count\" as the TotemPopCounter module is not activated.") - ContentType.NONE - } else next - } - - private val line1left = setting("Line 1 Left", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) - private val line1center = setting("Line 1 Center", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) - private val line1right = setting("Line 1 Right", ContentType.NONE, { page == Page.CONTENT }, consumer = consumer) - private val line2left = setting("Line 2 Left", ContentType.NAME, { page == Page.CONTENT }, consumer = consumer) - private val line2center = setting("Line 2 Center", ContentType.PING, { page == Page.CONTENT }, consumer = consumer) - private val line2right = setting("Line 2 Right", ContentType.TOTAL_HP, { page == Page.CONTENT }, consumer = consumer) + private val line1left = setting("Line 1 Left", ContentType.NONE, { page == Page.CONTENT }) + private val line1center = setting("Line 1 Center", ContentType.NONE, { page == Page.CONTENT }) + private val line1right = setting("Line 1 Right", ContentType.NONE, { page == Page.CONTENT }) + private val line2left = setting("Line 2 Left", ContentType.NAME, { page == Page.CONTENT }) + private val line2center = setting("Line 2 Center", ContentType.PING, { page == Page.CONTENT }) + private val line2right = setting("Line 2 Right", ContentType.TOTAL_HP, { page == Page.CONTENT }) private val dropItemCount by setting("Drop Item Count", true, { page == Page.CONTENT && items }) private val maxDropItems by setting("Max Drop Items", 5, 2..16, 1, { page == Page.CONTENT && items }) @@ -123,7 +115,7 @@ object Nametags : Module( private val line1Settings = arrayOf(line1left, line1center, line1right) private val line2Settings = arrayOf(line2left, line2center, line2right) - val entityMap = TreeMap(compareByDescending { mc.player.getPositionEyes(1f).distanceTo(it.getPositionEyes(1f)) }) + private val entityMap = TreeMap(compareByDescending { mc.player.getPositionEyes(1f).distanceTo(it.getPositionEyes(1f)) }) private val itemMap = TreeSet(compareByDescending { mc.player.getPositionEyes(1f).distanceTo(it.getCenter(1f)) }) private var updateTick = 0 @@ -412,7 +404,7 @@ object Nametags : Module( } } - private fun getContent(contentType: ContentType, entity: Entity) = when (contentType) { + private fun SafeClientEvent.getContent(contentType: ContentType, entity: Entity) = when (contentType) { ContentType.NONE -> { null } @@ -424,39 +416,40 @@ object Nametags : Module( TextComponent.TextElement(getEntityType(entity), GuiColors.text) } ContentType.TOTAL_HP -> { - if (entity !is EntityLivingBase) { - null - } else { + if (entity is EntityLivingBase) { val totalHp = MathUtils.round(entity.health + entity.absorptionAmount, 1).toString() TextComponent.TextElement(totalHp, getHpColor(entity)) + } else { + null } } ContentType.HP -> { - if (entity !is EntityLivingBase) { - null - } else { + if (entity is EntityLivingBase) { val hp = MathUtils.round(entity.health, 1).toString() TextComponent.TextElement(hp, getHpColor(entity)) + } else { + null } } ContentType.ABSORPTION -> { - if (entity !is EntityLivingBase || entity.absorptionAmount == 0f) { - null - } else { + if (entity is EntityLivingBase && entity.absorptionAmount != 0f) { val absorption = MathUtils.round(entity.absorptionAmount, 1).toString() TextComponent.TextElement(absorption, ColorHolder(234, 204, 32, GuiColors.text.a)) + } else { + null } } ContentType.PING -> { - if (entity !is EntityOtherPlayerMP) { - null + if (entity is EntityOtherPlayerMP) { + connection.getPlayerInfo(entity.uniqueID)?.responseTime?.let { + TextComponent.TextElement("${it}ms", pingColorGradient.get(it.toFloat()).apply { a = GuiColors.text.a }) + } } else { - val ping = mc.connection?.getPlayerInfo(entity.uniqueID)?.responseTime ?: 0 - TextComponent.TextElement("${ping}ms", pingColorGradient.get(ping.toFloat()).apply { a = GuiColors.text.a }) + null } } ContentType.DISTANCE -> { - val dist = MathUtils.round(mc.player.getDistance(entity), 1).toString() + val dist = MathUtils.round(player.getDistance(entity), 1).toString() TextComponent.TextElement("${dist}m", GuiColors.text) } ContentType.ENTITY_ID -> { @@ -465,13 +458,12 @@ object Nametags : Module( ContentType.TOTEM_POP_COUNT -> { // Note: The totem pop counting functionality is embedded in the TotemPopCounter module, // hence, it needs to be active in order for this to work. - if (TotemPopCounter.isDisabled) - TotemPopCounter.enable() - if (entity !is EntityPlayer) { - null - } else { + if (entity is EntityOtherPlayerMP) { + if (TotemPopCounter.isDisabled) TotemPopCounter.enable() val count = TotemPopCounter.popCountMap.getOrDefault(entity, 0) TextComponent.TextElement("PT: $count", GuiColors.text) + } else { + null } } }