[feature] Censor option for BossStack (#1643)

Co-authored-by: Dominika <sokolov.dominika@gmail.com>
This commit is contained in:
FriedrichM 2020-11-29 17:15:37 +01:00 committed by GitHub
parent 54d26f6f7b
commit 2b9fac0441
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 8 deletions

View File

@ -25,7 +25,9 @@ import kotlin.math.roundToInt
object BossStack : Module() {
private val mode = register(Settings.e<BossStackMode>("Mode", BossStackMode.STACK))
private val scale = register(Settings.floatBuilder("Scale").withValue(1.0f).withRange(0.1f, 5.0f))
private val censor = register(Settings.b("Censor", false))
@Suppress("unused")
private enum class BossStackMode {
REMOVE, MINIMIZE, STACK
}
@ -38,6 +40,7 @@ object BossStack : Module() {
listener<RenderGameOverlayEvent.Pre> {
if (it.type != RenderGameOverlayEvent.ElementType.BOSSHEALTH) return@listener
if (timer.tick(73L)) updateBossInfoMap()
it.isCanceled = true
drawHealthBar()
}
@ -47,30 +50,35 @@ object BossStack : Module() {
bossInfoMap.clear()
val bossInfoList = mc.ingameGUI.bossOverlay.mapBossInfos?.values ?: return
when (mode.value!!) {
BossStackMode.REMOVE -> {
}
when (mode.value) {
BossStackMode.MINIMIZE -> {
val closest = getMatchBoss(bossInfoList)?: return
val closest = getMatchBoss(bossInfoList) ?: return
bossInfoMap[closest] = -1
}
BossStackMode.STACK -> {
val cacheMap = HashMap<String, ArrayList<BossInfoClient>>()
for (bossInfo in bossInfoList) {
val list = cacheMap.getOrPut(bossInfo.name.formattedText) { ArrayList() }
val list = cacheMap.getOrPut(if (censor.value) "Boss" else bossInfo.name.formattedText) { ArrayList() }
list.add(bossInfo)
}
for ((name, list) in cacheMap) {
val closest = getMatchBoss(list, name)?: continue
val closest = getMatchBoss(list, if (censor.value) null else name) ?: continue
bossInfoMap[closest] = list.size
}
}
else -> {
// Do nothing
}
}
}
private fun getMatchBoss(list: Collection<BossInfoClient>, name: String? = null): BossInfoClient? {
val closestBossHealth = getClosestBoss(name)?.let {
it.health / it.maxHealth * 100.0f
it.health / it.maxHealth
} ?: return null
return list.minBy {
@ -82,12 +90,15 @@ object BossStack : Module() {
mc.world?.loadedEntityList?.let {
var closest = Float.MAX_VALUE
var closestBoss: EntityLivingBase? = null
for (entity in it) {
if (entity !is EntityLivingBase) continue
if (entity.isNonBoss) continue
if (name != null && entity.displayName.formattedText != name) continue
val dist = entity.getDistance(mc.player)
if (dist >= closest) continue
closest = dist
closestBoss = entity
}
@ -96,14 +107,17 @@ object BossStack : Module() {
private fun drawHealthBar() {
mc.profiler.startSection("bossHealth")
val width = ScaledResolution(mc).scaledWidth
var posY = 12
GlStateUtils.blend(true)
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO)
glColor4f(1.0f, 1.0f, 1.0f, 1.0f)
if (bossInfoMap.isNotEmpty()) for ((bossInfo, count) in bossInfoMap) {
val posX = (width / scale.value / 2.0f - 91.0f).roundToInt()
val text = bossInfo.name.formattedText + if (count != -1) " x$count" else ""
val text = (if (censor.value) "Boss" else bossInfo.name.formattedText) + if (count != -1) " x$count" else ""
val textPosX = width / scale.value / 2.0f - mc.fontRenderer.getStringWidth(text) / 2.0f
val textPosY = posY - 9.0f
@ -115,6 +129,7 @@ object BossStack : Module() {
posY += 10 + mc.fontRenderer.FONT_HEIGHT
}
glColor4f(1.0f, 1.0f, 1.0f, 1.0f)
mc.profiler.endSection()
}