Added NewChunks to the Radar and improved unloading of NewChunks (#1656)

Co-authored-by: Dominika <sokolov.dominika@gmail.com>
This commit is contained in:
zuim 2020-12-04 00:59:40 +01:00 committed by GitHub
parent 0866cf514a
commit d74e65afb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 112 additions and 26 deletions

View File

@ -3,6 +3,7 @@ package me.zeroeightsix.kami.gui.kami.theme.staticui
import me.zeroeightsix.kami.gui.kami.component.Radar
import me.zeroeightsix.kami.gui.rgui.render.AbstractComponentUI
import me.zeroeightsix.kami.manager.managers.FriendManager
import me.zeroeightsix.kami.module.modules.render.NewChunks
import me.zeroeightsix.kami.util.EntityUtils.isCurrentlyNeutral
import me.zeroeightsix.kami.util.EntityUtils.isPassiveMob
import me.zeroeightsix.kami.util.Wrapper
@ -10,6 +11,8 @@ import me.zeroeightsix.kami.util.color.ColorHolder
import me.zeroeightsix.kami.util.graphics.GlStateUtils
import me.zeroeightsix.kami.util.graphics.RenderUtils2D.drawCircleFilled
import me.zeroeightsix.kami.util.graphics.RenderUtils2D.drawCircleOutline
import me.zeroeightsix.kami.util.graphics.RenderUtils2D.drawRectFilled
import me.zeroeightsix.kami.util.graphics.RenderUtils2D.drawRectOutline
import me.zeroeightsix.kami.util.graphics.VertexHelper
import me.zeroeightsix.kami.util.graphics.font.FontRenderAdapter
import me.zeroeightsix.kami.util.math.Vec2d
@ -24,6 +27,13 @@ import kotlin.math.sqrt
* Created by 086 on 11/08/2017.
*/
class RadarUI : AbstractComponentUI<Radar?>() {
private val filledCircleColor = ColorHolder(28, 28, 28, 200)
private val outlineCircleColor = ColorHolder(155, 144, 255, 255)
private val filledCircleColorDarker = ColorHolder(255, 255, 255, 224)
private val rectFilledColor = ColorHolder(100, 100, 100, 100)
private val rectOutlineColor = ColorHolder(255, 0, 0, 100)
private val rectFilledColorOther = ColorHolder(255, 0, 0, 100)
private val radius = 45.0f
override fun handleSizeComponent(component: Radar?) {
component!!
@ -41,33 +51,64 @@ class RadarUI : AbstractComponentUI<Radar?>() {
glTranslated(component.width / 2.0, component.height / 2.0, 0.0)
val vertexHelper = VertexHelper(GlStateUtils.useVbo())
drawCircleFilled(vertexHelper, radius = radius.toDouble(), color = ColorHolder(28, 28, 28, 200))
drawCircleOutline(vertexHelper, radius = radius.toDouble(), lineWidth = 1.8f, color = ColorHolder(155, 144, 255, 255))
drawCircleFilled(vertexHelper, radius = 2.0 / scale, color = ColorHolder(255, 255, 255, 224))
drawCircleFilled(vertexHelper, radius = radius.toDouble(), color = filledCircleColor)
drawCircleOutline(vertexHelper, radius = radius.toDouble(), lineWidth = 1.8f, color = outlineCircleColor)
glRotatef(Wrapper.player!!.rotationYaw + 180, 0f, 0f, -1f)
if (NewChunks.isEnabled && NewChunks.isRadarMode) renderNewChunks(vertexHelper)
for (entity in Wrapper.world!!.loadedEntityList) {
if (entity == null || entity.isDead || entity == Wrapper.player) continue
val dX = entity.posX - Wrapper.player!!.posX
val dZ = entity.posZ - Wrapper.player!!.posZ
val distance = sqrt(dX.pow(2) + dZ.pow(2))
if (distance > radius * scale || abs(Wrapper.player!!.posY - entity.posY) > 30) continue
if (distance > radius * NewChunks.radarScale.value || abs(Wrapper.player!!.posY - entity.posY) > 30) continue
val color = getColor(entity)
drawCircleFilled(vertexHelper, Vec2d(dX / scale, dZ / scale), 2.5 / scale, color = color)
drawCircleFilled(vertexHelper, Vec2d(dX / NewChunks.radarScale.value, dZ / NewChunks.radarScale.value), 2.5 / NewChunks.radarScale.value, color = color)
}
FontRenderAdapter.drawString("\u00A77z+", -FontRenderAdapter.getStringWidth("+z") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = false)
drawCircleFilled(vertexHelper, radius = 1.0, color = filledCircleColorDarker)
FontRenderAdapter.drawString("\u00A77z+", -FontRenderAdapter.getStringWidth("+z") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = true)
glRotatef(90f, 0f, 0f, 1f)
FontRenderAdapter.drawString("\u00A77x-", -FontRenderAdapter.getStringWidth("+x") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = false)
FontRenderAdapter.drawString("\u00A77x-", -FontRenderAdapter.getStringWidth("+x") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = true)
glRotatef(90f, 0f, 0f, 1f)
FontRenderAdapter.drawString("\u00A77z-", -FontRenderAdapter.getStringWidth("-z") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = false)
FontRenderAdapter.drawString("\u00A77z-", -FontRenderAdapter.getStringWidth("-z") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = true)
glRotatef(90f, 0f, 0f, 1f)
FontRenderAdapter.drawString("\u00A77x+", -FontRenderAdapter.getStringWidth("+x") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = false)
FontRenderAdapter.drawString("\u00A77x+", -FontRenderAdapter.getStringWidth("+x") / 2f, radius - FontRenderAdapter.getFontHeight(), drawShadow = true)
glPopMatrix()
}
private fun renderNewChunks(vertexHelper: VertexHelper) {
val playerOffset = Vec2d((Wrapper.player!!.posX - (Wrapper.player!!.chunkCoordX shl 4)), (Wrapper.player!!.posZ - (Wrapper.player!!.chunkCoordZ shl 4)))
val chunkDist = (radius * NewChunks.radarScale.value).toInt() shr 4
for (chunkX in -chunkDist..chunkDist) {
for (chunkZ in -chunkDist..chunkDist) {
val pos0 = getChunkPos(chunkX, chunkZ, playerOffset)
val pos1 = getChunkPos(chunkX + 1, chunkZ + 1, playerOffset)
if (squareInRadius(pos0, pos1)) {
val chunk = Wrapper.world!!.getChunk(Wrapper.player!!.chunkCoordX + chunkX, Wrapper.player!!.chunkCoordZ + chunkZ)
if (!chunk.isLoaded)
drawRectFilled(vertexHelper, pos0, pos1, rectFilledColor)
drawRectOutline(vertexHelper, pos0, pos1, 0.3f, rectOutlineColor)
}
}
}
for (chunk in NewChunks.chunks) {
val pos0 = getChunkPos(chunk.x - Wrapper.player!!.chunkCoordX, chunk.z - Wrapper.player!!.chunkCoordZ, playerOffset)
val pos1 = getChunkPos(chunk.x - Wrapper.player!!.chunkCoordX + 1, chunk.z - Wrapper.player!!.chunkCoordZ + 1, playerOffset)
if (squareInRadius(pos0, pos1)) {
drawRectFilled(vertexHelper, pos0, pos1, rectFilledColorOther)
}
}
}
private fun getColor(entity: Entity): ColorHolder {
return if (isPassiveMob(entity) || FriendManager.isFriend(entity.name)) { // green
ColorHolder(32, 224, 32, 224)
@ -78,8 +119,24 @@ class RadarUI : AbstractComponentUI<Radar?>() {
}
}
companion object {
const val scale = 2.0
const val radius = 45.0f
// p2.x > p1.x and p2.y > p1.y is assumed
private fun squareInRadius(p1: Vec2d, p2: Vec2d): Boolean {
return if ((p1.x + p2.x) / 2 > 0) {
if ((p1.y + p2.y) / 2 > 0) {
p2.length()
} else {
Vec2d(p2.x, p1.y).length()
}
} else {
if ((p1.y + p2.y) / 2 > 0) {
Vec2d(p1.x, p2.y).length()
} else {
p1.length()
}
} < radius
}
private fun getChunkPos(x: Int, z: Int, playerOffset: Vec2d): Vec2d {
return Vec2d((x shl 4).toDouble(), (z shl 4).toDouble()).subtract(playerOffset).divide(NewChunks.radarScale.value)
}
}

View File

@ -40,17 +40,21 @@ object NewChunks : Module() {
private val saveInRegionFolder = register(Settings.booleanBuilder("InRegion").withValue(false).withVisibility { saveNewChunks.value })
private val alsoSaveNormalCoords = register(Settings.booleanBuilder("SaveNormalCoords").withValue(false).withVisibility { saveNewChunks.value })
private val closeFile = register(Settings.booleanBuilder("CloseFile").withValue(false).withVisibility { saveNewChunks.value })
private val yOffset = register(Settings.integerBuilder("YOffset").withValue(0).withRange(-256, 256).withStep(4))
private val customColor = register(Settings.b("CustomColor", false))
private val red = register(Settings.integerBuilder("Red").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value })
private val green = register(Settings.integerBuilder("Green").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value })
private val blue = register(Settings.integerBuilder("Blue").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value })
private val renderMode = register(Settings.e<RenderMode>("RenderMode", RenderMode.BOTH))
private val yOffset = register(Settings.integerBuilder("YOffset").withValue(0).withRange(-256, 256).withStep(4).withVisibility { isWorldMode })
private val customColor = register(Settings.booleanBuilder("CustomColor").withValue(false).withVisibility { isWorldMode })
private val red = register(Settings.integerBuilder("Red").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value && isWorldMode })
private val green = register(Settings.integerBuilder("Green").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value && isWorldMode })
private val blue = register(Settings.integerBuilder("Blue").withRange(0, 255).withValue(255).withStep(1).withVisibility { customColor.value && isWorldMode })
private val range = register(Settings.integerBuilder("RenderRange").withValue(256).withRange(64, 1024).withStep(64))
val radarScale = register(Settings.doubleBuilder("RadarScale").withRange(1.0, 10.0).withValue(2.0).withStep(0.1).withVisibility { isRadarMode })
private val removeMode = register(Settings.e<RemoveMode>("RemoveMode", RemoveMode.MAX_NUM))
private val maxNum = register(Settings.integerBuilder("MaxNum").withRange(1000, 100_000).withValue(10_000).withStep(1000).withVisibility { removeMode.value == RemoveMode.MAX_NUM })
private var lastSetting = LastSetting()
private var logWriter: PrintWriter? = null
private val timer = TimerUtils.TickTimer(TimerUtils.TimeUnit.MINUTES)
private val chunks = ArrayList<Chunk>()
val chunks = HashSet<Chunk>()
override fun onDisable() {
logWriterClose()
@ -71,6 +75,7 @@ object NewChunks : Module() {
}
listener<RenderWorldEvent> {
if (renderMode.value == RenderMode.RADAR) return@listener
val y = yOffset.value.toDouble() + if (relative.value) getInterpolatedPos(mc.player, KamiTessellator.pTicks()).y else 0.0
glLineWidth(2.0f)
GlStateUtils.depth(false)
@ -92,10 +97,22 @@ object NewChunks : Module() {
if (it.packet.isFullChunk) return@listener
chunks.add(it.chunk)
if (saveNewChunks.value) saveNewChunk(it.chunk)
if (removeMode.value == RemoveMode.MAX_NUM && chunks.size > maxNum.value) {
var removeChunk = chunks.first()
var maxDist = Double.MIN_VALUE
chunks.forEach { c ->
if (c.pos.getDistanceSq(mc.player) > maxDist) {
maxDist = c.pos.getDistanceSq(mc.player)
removeChunk = c
}
}
chunks.remove(removeChunk)
}
}
listener<net.minecraftforge.event.world.ChunkEvent.Unload> {
chunks.remove(it.chunk)
if (removeMode.value == RemoveMode.UNLOAD)
chunks.remove(it.chunk)
}
}
@ -154,7 +171,7 @@ object NewChunks : Module() {
// If there is an integrated server running (Aka Singleplayer) then do magic to find the world save file
if (mc.isSingleplayer) {
try {
file = Objects.requireNonNull(mc.getIntegratedServer())!!.getWorld(dimension).chunkSaveLocation
file = mc.integratedServer?.getWorld(dimension)?.chunkSaveLocation
} catch (e: Exception) {
e.printStackTrace()
KamiMod.LOG.error("some exception happened when getting canonicalFile -> " + e.message)
@ -201,7 +218,7 @@ object NewChunks : Module() {
var folderName: String
when (saveOption.value) {
SaveOption.LITE_LOADER_WDL -> {
folderName = Objects.requireNonNull(mc.getCurrentServerData())!!.serverName
folderName = mc.currentServerData?.serverName ?: "Offline"
rV = File(rV, "saves")
rV = File(rV, folderName)
}
@ -218,7 +235,7 @@ object NewChunks : Module() {
}
}
else -> {
folderName = Objects.requireNonNull(mc.getCurrentServerData())!!.serverName + "-" + mc.getCurrentServerData()!!.serverIP
folderName = mc.currentServerData?.serverName + "-" + mc.currentServerData?.serverIP
if (SystemUtils.IS_OS_WINDOWS) {
folderName = folderName.replace(":", "_")
}
@ -232,7 +249,7 @@ object NewChunks : Module() {
// if there is no port then we have to manually include the standard port..
private val nHackInetName: String
get() {
var folderName = Objects.requireNonNull(mc.getCurrentServerData())!!.serverIP
var folderName = mc.currentServerData?.serverIP ?: "Offline"
if (SystemUtils.IS_OS_WINDOWS) {
folderName = folderName.replace(":", "_")
}
@ -260,6 +277,18 @@ object NewChunks : Module() {
EXTRA_FOLDER, LITE_LOADER_WDL, NHACK_WDL
}
@Suppress("unused")
private enum class RemoveMode {
UNLOAD, MAX_NUM, NEVER
}
enum class RenderMode {
WORLD, RADAR, BOTH
}
val isRadarMode get() = renderMode.value == RenderMode.BOTH || renderMode.value == RenderMode.RADAR
private val isWorldMode get() = renderMode.value == RenderMode.BOTH || renderMode.value == RenderMode.WORLD
private class LastSetting {
var lastSaveOption: SaveOption? = null
var lastInRegion = false
@ -281,7 +310,7 @@ object NewChunks : Module() {
|| saveInRegionFolder.value != lastInRegion
|| alsoSaveNormalCoords.value != lastSaveNormal
|| dimension != mc.player.dimension
|| mc.getCurrentServerData()?.serverIP != ip
|| mc.currentServerData?.serverIP != ip
}
private fun update() {
@ -289,7 +318,7 @@ object NewChunks : Module() {
lastInRegion = saveInRegionFolder.value
lastSaveNormal = alsoSaveNormalCoords.value
dimension = mc.player.dimension
ip = Objects.requireNonNull(mc.getCurrentServerData())!!.serverIP
ip = mc.currentServerData?.serverIP
}
}