From 50e0cac07a6a4f947a6815a955e3b2a39eea87e6 Mon Sep 17 00:00:00 2001 From: SPRAVEDLIVO Date: Sat, 8 May 2021 22:44:47 +0300 Subject: [PATCH] fixes from wdal --- src/main/kotlin/rat/poison/RatPoison.kt | 8 +- src/main/kotlin/rat/poison/game/Entities.kt | 84 +++++++------------ .../kotlin/rat/poison/game/WorldToScreen.kt | 2 +- .../rat/poison/game/entity/EntityType.kt | 4 +- .../rat/poison/game/hooks/EntityIteration.kt | 24 +++--- .../kotlin/rat/poison/scripts/Backtrack.kt | 6 +- .../kotlin/rat/poison/scripts/BlockBot.kt | 4 +- .../kotlin/rat/poison/scripts/HeadWalk.kt | 4 +- src/main/kotlin/rat/poison/scripts/RCS.kt | 2 +- src/main/kotlin/rat/poison/scripts/Ranks.kt | 4 +- src/main/kotlin/rat/poison/scripts/Scanner.kt | 4 +- .../rat/poison/scripts/SpectatorList.kt | 4 +- .../kotlin/rat/poison/scripts/aim/General.kt | 4 +- .../rat/poison/scripts/visuals/BoxESP.kt | 8 +- .../rat/poison/scripts/visuals/ChamsESP.kt | 4 +- .../rat/poison/scripts/visuals/DisableESP.kt | 4 +- .../rat/poison/scripts/visuals/DrawSmokes.kt | 8 +- .../rat/poison/scripts/visuals/FarRadar.kt | 4 +- .../rat/poison/scripts/visuals/FootStepESP.kt | 4 +- .../rat/poison/scripts/visuals/GlowESP.kt | 4 +- .../poison/scripts/visuals/IndicatorESP.kt | 4 +- .../rat/poison/scripts/visuals/NadeTracer.kt | 5 +- .../rat/poison/scripts/visuals/NadesTimer.kt | 4 +- .../rat/poison/scripts/visuals/RadarESP.kt | 6 +- .../rat/poison/scripts/visuals/SharedEsp.kt | 5 +- .../rat/poison/scripts/visuals/SkeletonESP.kt | 9 +- .../rat/poison/scripts/visuals/SnapLines.kt | 4 +- .../ui/uiHelpers/VisColorPickerCustom.kt | 2 +- .../rat/poison/utils/EfficentSettingsType.kt | 6 +- src/main/kotlin/rat/poison/utils/Vector.kt | 8 +- .../poison/utils/generalUtil/GeneralUtil.kt | 54 ++++++------ .../poison/utils/generalUtil/LoadSettings.kt | 1 - .../rat/poison/utils/lists/ForEntitiesList.kt | 48 +++++++++++ .../rat/poison/utils/maps/OneTimeMap.kt | 10 +++ version.txt | 2 +- 35 files changed, 189 insertions(+), 169 deletions(-) create mode 100644 src/main/kotlin/rat/poison/utils/lists/ForEntitiesList.kt create mode 100644 src/main/kotlin/rat/poison/utils/maps/OneTimeMap.kt diff --git a/src/main/kotlin/rat/poison/RatPoison.kt b/src/main/kotlin/rat/poison/RatPoison.kt index 9f5d85e2..34cf4a4d 100644 --- a/src/main/kotlin/rat/poison/RatPoison.kt +++ b/src/main/kotlin/rat/poison/RatPoison.kt @@ -14,14 +14,16 @@ import rat.poison.game.CSGO import rat.poison.game.offsets.EngineOffsets.dwbSendPackets import rat.poison.overlay.App import rat.poison.scripts.* -import rat.poison.scripts.aim.* +import rat.poison.scripts.aim.flatAim +import rat.poison.scripts.aim.handleFireKey +import rat.poison.scripts.aim.pathAim +import rat.poison.scripts.aim.setAim import rat.poison.scripts.visuals.* import rat.poison.utils.Settings import rat.poison.utils.WebSocket import rat.poison.utils.detectLocale import rat.poison.utils.generalUtil.loadSettingsFromFiles import rat.poison.utils.generalUtil.loadSkinSettings -import rat.poison.utils.generalUtil.stringToIntList import rat.poison.utils.loadMigration import java.awt.Robot import java.io.File @@ -46,7 +48,7 @@ data class sWeapon(var tSkinID: Int, var tStatTrak: Int, var tWear: Float, var t const val TITLE = "RatPoison" const val BRANCH = "Beta" const val F_VERSION = "1.8" -const val M_VERSION = "1.8.5.6" +const val M_VERSION = "1.8.5.7" var LOADED_CONFIG = "DEFAULT" var oWeaponSize = oWeapon::class.java.declaredFields.size diff --git a/src/main/kotlin/rat/poison/game/Entities.kt b/src/main/kotlin/rat/poison/game/Entities.kt index da1b520b..efa16257 100644 --- a/src/main/kotlin/rat/poison/game/Entities.kt +++ b/src/main/kotlin/rat/poison/game/Entities.kt @@ -1,9 +1,11 @@ package rat.poison.game -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import rat.poison.game.entity.EntityType import rat.poison.game.entity.Player +import rat.poison.game.hooks.forceResetIteration import rat.poison.settings.MAX_ENTITIES +import rat.poison.utils.lists.ForEntitiesList @Volatile var me: Player = 0 @@ -12,76 +14,46 @@ var clientState: ClientState = 0 @Volatile var meTeam: Long = 0 -typealias EntityList = Object2ObjectArrayMap> +typealias EntityList = Object2ObjectOpenHashMap -var entitiesValues = arrayOfNulls>(MAX_ENTITIES) +var entitiesValues = arrayOfNulls(MAX_ENTITIES) var entitiesValuesCounter = 0 val entities: EntityList = EntityList(EntityType.size).apply { for (type in EntityType.cachedValues) { - val list = mutableListOf() + val list = ForEntitiesList() put(type, list) entitiesValues[entitiesValuesCounter++] = list } } fun entityByType(type: EntityType): EntityContext? = entities[type]?.firstOrNull() -data class EntityCache(var created: Long, var ents: ArrayList, var iterating: Boolean = false) -val entityCache = Object2ObjectArrayMap() -//private const val emptyString = "" -internal inline fun forEntities(vararg types: EntityType, iterateWeapons: Boolean = false, iterateGrenades: Boolean = false, identifier: String = "", crossinline body: (EntityContext) -> Unit) { - var get = entityCache[identifier] - if (get == null || System.currentTimeMillis() - get.created > 2000) { - if (get != null) { - get.ents.clear() - get.created = System.currentTimeMillis() +internal inline fun iterateByTypes(types: Array, crossinline body: (EntityContext) -> Unit) { + for (typeIdx in 0 until types.size) { + if (forceResetIteration) { + break } - else { - val tmpClass = EntityCache(System.currentTimeMillis(), ArrayList()) - get = tmpClass - entityCache[identifier] = tmpClass - } - val col = if (types.isEmpty()) EntityType.cachedValues else types - for (i in 0 until col.size) { - val entType = col[i] - val ents = entities[entType] ?: continue - for (i1 in 0 until ents.size) { - val ent = ents[i1] - get.ents.add(ent) - ent.run(body) - } - } - if (iterateWeapons) { - for (i in 0 until EntityType.weaponsTypes.size) { - val entType = EntityType.weaponsTypes[i] - val ents = entities[entType] ?: continue - for (i1 in 0 until ents.size) { - val ent = ents[i1] - get.ents.add(ent) - ent.run(body) - } - } - } - if (iterateGrenades) { - for (i in 0 until EntityType.grenadeTypes.size) { - val entType = EntityType.grenadeTypes[i] - val ents = entities[entType] ?: continue - for (i1 in 0 until ents.size) { - val ent = ents[i1] - get.ents.add(ent) - ent.run(body) - } + val let = entities[types[typeIdx]] ?: continue + let.completeTasks() + let.iterating = true + for (entIdx in 0 until let.cachedValues.size) { + if (forceResetIteration) { + break } + val ent = let.getOrNull(entIdx) ?: continue + ent.run(body) } + let.iterating = false } - else { - if (!get.iterating) { - get.iterating = true - for (i in 0 until get.ents.size) { - get.ents[i].run(body) - } - get.iterating = false - } +} + +internal inline fun forEntities(types: Array, iterateWeapons: Boolean = false, iterateGrenades: Boolean = false, crossinline body: (EntityContext) -> Unit) { + iterateByTypes(types, body) + if (iterateGrenades) { + iterateByTypes(EntityType.grenadeTypes, body) + } + if (iterateWeapons) { + iterateByTypes(EntityType.weaponsTypes, body) } } \ No newline at end of file diff --git a/src/main/kotlin/rat/poison/game/WorldToScreen.kt b/src/main/kotlin/rat/poison/game/WorldToScreen.kt index 66cbef4a..31bfd66c 100644 --- a/src/main/kotlin/rat/poison/game/WorldToScreen.kt +++ b/src/main/kotlin/rat/poison/game/WorldToScreen.kt @@ -6,8 +6,8 @@ import rat.poison.game.CSGO.gameHeight import rat.poison.game.CSGO.gameWidth import rat.poison.game.offsets.ClientOffsets.dwViewMatrix import rat.poison.utils.Vector -import rat.poison.utils.threadLocalPointer import rat.poison.utils.extensions.getFloatArray +import rat.poison.utils.threadLocalPointer val w2sViewMatrix = Array(4) { DoubleArray(4) } private val DEFAULT_VECTOR = Vector() diff --git a/src/main/kotlin/rat/poison/game/entity/EntityType.kt b/src/main/kotlin/rat/poison/game/entity/EntityType.kt index 3960b116..f8b3f2a0 100644 --- a/src/main/kotlin/rat/poison/game/entity/EntityType.kt +++ b/src/main/kotlin/rat/poison/game/entity/EntityType.kt @@ -294,8 +294,8 @@ enum class EntityType(val weapon: Boolean = false, val grenade: Boolean = false, companion object { val cachedValues = values() - val weaponsTypes = cachedValues.filter { it.weapon } - val grenadeTypes = cachedValues.filter { it.grenade } + val weaponsTypes = cachedValues.filter { it.weapon }.toTypedArray() + val grenadeTypes = cachedValues.filter { it.grenade }.toTypedArray() val size = cachedValues.size private fun byID(id: Long) = cachedValues.firstOrNull { it.id == id } diff --git a/src/main/kotlin/rat/poison/game/hooks/EntityIteration.kt b/src/main/kotlin/rat/poison/game/hooks/EntityIteration.kt index 84c05c39..e8b08967 100644 --- a/src/main/kotlin/rat/poison/game/hooks/EntityIteration.kt +++ b/src/main/kotlin/rat/poison/game/hooks/EntityIteration.kt @@ -1,7 +1,6 @@ package rat.poison.game.hooks import com.sun.jna.platform.win32.WinNT -import io.ktor.util.* import rat.poison.dbg import rat.poison.game.* import rat.poison.game.CSGO.GLOW_OBJECT_SIZE @@ -22,11 +21,11 @@ import rat.poison.game.offsets.EngineOffsets.dwClientState_MapDirectory import rat.poison.game.offsets.EngineOffsets.dwGameDir import rat.poison.game.offsets.EngineOffsets.dwSignOnState import rat.poison.scripts.detectMap -import rat.poison.scripts.nameChange import rat.poison.scripts.sendPacket import rat.poison.settings.* import rat.poison.utils.* import rat.poison.utils.extensions.uint +import java.lang.Float.intBitsToFloat import java.util.concurrent.atomic.AtomicLong import kotlin.properties.Delegates @@ -38,18 +37,24 @@ private fun shouldReset() = System.currentTimeMillis() - lastCleanup.get() >= CL private fun reset() { for (i in entitiesValues) { - i?.removeAll(i) + i?.clear() } lastCleanup.set(System.currentTimeMillis()) } +var forceResetIteration = false + private const val strBufMemorySize = 128 private val strBufMemory = threadLocalPointer(strBufMemorySize) private var signOnState by Delegates.observable(SignOnState.MAIN_MENU) { _, old, new -> if (old != new) { if (new.name == SignOnState.IN_GAME.name) { + forceResetIteration = true + after(1000) { + forceResetIteration = false + } after(10000) { shouldPostProcess = true } @@ -79,7 +84,6 @@ private var signOnState by Delegates.observable(SignOnState.MAIN_MENU) { _, old, // } inGame = true - nameChange = "" if (PROCESS_ACCESS_FLAGS and WinNT.PROCESS_VM_OPERATION > 0) { try { @@ -93,10 +97,6 @@ private var signOnState by Delegates.observable(SignOnState.MAIN_MENU) { _, old, sendPacket(true) } else { - if (new.name == SignOnState.MAIN_MENU.name) { //disconnected - WebSocket.createSendTask("deleteInfo") - } - shouldPostProcess = false inGame = false sendPacket(true) @@ -114,7 +114,6 @@ fun updateCursorEnable() { //Call when needed } var toneMapController = 0L - private val positionVector = Vector() fun constructEntities() = every(500, continuous = true) { updateCursorEnable() @@ -131,7 +130,6 @@ fun constructEntities() = every(500, continuous = true) { if (shouldReset()) reset() var dzMode = false - for (glowIndex in 0..glowObjectCount) { val glowAddress = glowObject + (glowIndex * GLOW_OBJECT_SIZE) val entity = csgoEXE.uint(glowAddress) @@ -140,9 +138,8 @@ fun constructEntities() = every(500, continuous = true) { val type = EntityType.byEntityAddress(entity) if (type != EntityType.NULL) { val tmpPos = entity.absPosition(positionVector) - val check = (tmpPos.x in -2.0F..2.0F && tmpPos.y in -2.0F..2.0F && tmpPos.z in -2.0F..2.0F) - if (!check) { + if (!tmpPos.isZero()) { val context = contexts[glowIndex].set(entity, glowAddress, glowIndex, type) //remove contexts[] with(entities[type]!!) { @@ -182,7 +179,6 @@ fun constructEntities() = every(500, continuous = true) { } } } - DANGER_ZONE = dzMode - GAME_SENSITIVITY = java.lang.Float.intBitsToFloat((clientDLL.uint(dwSensitivity) xor (clientDLL.address + dwSensitivityPtr)).toInt()).toDouble() + GAME_SENSITIVITY = intBitsToFloat((clientDLL.uint(dwSensitivity) xor (clientDLL.address + dwSensitivityPtr)).toInt()).toDouble() } \ No newline at end of file diff --git a/src/main/kotlin/rat/poison/scripts/Backtrack.kt b/src/main/kotlin/rat/poison/scripts/Backtrack.kt index f3d09945..e5b611d4 100644 --- a/src/main/kotlin/rat/poison/scripts/Backtrack.kt +++ b/src/main/kotlin/rat/poison/scripts/Backtrack.kt @@ -113,15 +113,15 @@ private val boneMemory = threadLocalPointer(boneMemorySize) private val meAngVec = Vector() private var bestFov = 5F private val boneVec = Vector() -//private val positionVector = Vector() -private const val id = "backtrack" +private val forEntsList = arrayOf(EntityType.CCSPlayer) + fun constructRecords() { bestFov = 5F val clientAngle = clientState.angle(meAngVec) val boneMemory = boneMemory.get() - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val ent = it.entity if (ent.dead() || ent == me || ent.team() == meTeam) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/BlockBot.kt b/src/main/kotlin/rat/poison/scripts/BlockBot.kt index 73c9ae62..5c5ef033 100644 --- a/src/main/kotlin/rat/poison/scripts/BlockBot.kt +++ b/src/main/kotlin/rat/poison/scripts/BlockBot.kt @@ -41,7 +41,7 @@ fun unPress() { private val mePos = Vector() private val meAng = Vector() private val closestPos = Vector() -private const val forEntsId = "blockbot" +private val forEntsList = arrayOf(EntityType.CCSPlayer) fun blockBot() = every(2, inGameCheck = true) { if (!curSettings.bool["BLOCK_BOT"] || !keyPressed(curSettings.int["BLOCK_BOT_KEY"])) { unPress() @@ -55,7 +55,7 @@ fun blockBot() = every(2, inGameCheck = true) { var closestTarget = -1L val maxDist = curSettings.int["BLOCK_BOT_DISTANCE"] - forEntities(EntityType.CCSPlayer, identifier = forEntsId) { + forEntities(forEntsList) { val entity = it.entity if (entity == me || entity.dead() || entity.dead() || entity <= 0) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/HeadWalk.kt b/src/main/kotlin/rat/poison/scripts/HeadWalk.kt index 42813b3d..10c686bc 100644 --- a/src/main/kotlin/rat/poison/scripts/HeadWalk.kt +++ b/src/main/kotlin/rat/poison/scripts/HeadWalk.kt @@ -91,12 +91,12 @@ internal fun headWalk() = every(2, inGameCheck = true) { } } -private const val id = "headwalk" +private val forEntsList = arrayOf(EntityType.CCSPlayer) internal fun onPlayerHead() : Boolean { var entPos : Angle onEnt = 0L - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity if (entity == me || !entity.onGround()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/RCS.kt b/src/main/kotlin/rat/poison/scripts/RCS.kt index e16055ff..23ee4725 100644 --- a/src/main/kotlin/rat/poison/scripts/RCS.kt +++ b/src/main/kotlin/rat/poison/scripts/RCS.kt @@ -31,7 +31,7 @@ fun rcs() = every(15, inGameCheck = true) { val shotsFired = me.shotsFired() val p = me.punch(punchVec) - val isZero = lastAppliedRCS.invalid() + val isZero = lastAppliedRCS.isZero() val forceSet = (shotsFired == 0 && !isZero || meCurWepEnt.bullets() <= 0) if (forceSet || /*!finishPunch ||*/ shotsFired > 1) { diff --git a/src/main/kotlin/rat/poison/scripts/Ranks.kt b/src/main/kotlin/rat/poison/scripts/Ranks.kt index 24a610a8..8d3196c7 100644 --- a/src/main/kotlin/rat/poison/scripts/Ranks.kt +++ b/src/main/kotlin/rat/poison/scripts/Ranks.kt @@ -19,7 +19,7 @@ import rat.poison.utils.extensions.uint import rat.poison.utils.saving var ranksPlayerList = Array(64) { RanksPlayer() } -private const val id = "ranks" +private val forEntsList = arrayOf(EntityType.CCSPlayer) //works with every down to 30, if you ever crash due to this then dn fun ranks() = every(5000, true, inGameCheck = true) { //Rebuild every second @@ -28,7 +28,7 @@ fun ranks() = every(5000, true, inGameCheck = true) { //Rebuild every second //Bruh -- fix later updatingRanks = true var max = 0 - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity val entID = (CSGO.csgoEXE.uint(entity + ClientOffsets.dwIndex) - 1).toInt() if (entID > 64 || entID < 0) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/Scanner.kt b/src/main/kotlin/rat/poison/scripts/Scanner.kt index 32a2bd32..3f18bc5c 100644 --- a/src/main/kotlin/rat/poison/scripts/Scanner.kt +++ b/src/main/kotlin/rat/poison/scripts/Scanner.kt @@ -19,7 +19,7 @@ import java.nio.file.StandardOpenOption import java.util.* import javax.script.ScriptException import kotlin.system.exitProcess -private const val id = "scanner" +private val forEntsList = arrayOf(EntityType.CCSPlayer) fun scanner() { println("Type help for options\n") @@ -176,7 +176,7 @@ fun scanner() { println("Team Name Rank Kills Deaths K/D Wins Money") println("====== ================================ ===== ===== ====== ==== ===== =====") try { - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity var entTeam = when (entity.team()) { 3L -> "CT" diff --git a/src/main/kotlin/rat/poison/scripts/SpectatorList.kt b/src/main/kotlin/rat/poison/scripts/SpectatorList.kt index 71c09e9a..c6fa5fb3 100644 --- a/src/main/kotlin/rat/poison/scripts/SpectatorList.kt +++ b/src/main/kotlin/rat/poison/scripts/SpectatorList.kt @@ -12,7 +12,7 @@ import rat.poison.overlay.opened import rat.poison.ui.uiPanels.specListText import rat.poison.utils.every import rat.poison.utils.extensions.readIndex -private const val id = "spectatorlist" +private val forEntsList = arrayOf(EntityType.CCSPlayer) internal fun spectatorList() = every(100, inGameCheck = true) { if (!curSettings.bool["SPECTATOR_LIST"] || !curSettings.bool["MENU"]) { return@every @@ -23,7 +23,7 @@ internal fun spectatorList() = every(100, inGameCheck = true) { val playerSpecTarget = csgoEXE.readIndex(me + dwIndex) - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity if (entity.isSpectating() && !entity.hltv() && !entity.dormant()) { diff --git a/src/main/kotlin/rat/poison/scripts/aim/General.kt b/src/main/kotlin/rat/poison/scripts/aim/General.kt index 2065d899..6c3a1de0 100644 --- a/src/main/kotlin/rat/poison/scripts/aim/General.kt +++ b/src/main/kotlin/rat/poison/scripts/aim/General.kt @@ -34,7 +34,7 @@ class FindTargetResult(var player: Player = -1L, var bone: Int = -1) { val findTargetResult = ThreadLocal.withInitial { FindTargetResult() } -private const val id = "findtarget" +private val forEntsList = arrayOf(EntityType.CCSPlayer) fun findTarget(position: Angle, angle: Angle, allowPerfect: Boolean, lockFOV: Float = curSettings.float["AIM_FOV"], BONE: String = curSettings["AIM_BONE"], visCheck: Boolean = true, teamCheck: Boolean = true): FindTargetResult { val result = findTargetResult.get() @@ -49,7 +49,7 @@ fun findTarget(position: Angle, angle: Angle, allowPerfect: Boolean, val findNearest = bones.has { it == NEAREST_BONE } val findRandom = bones.has { 0 > it as Int } - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity if (entity <= 0 || entity == me || !entity.canShoot(visCheck, teamCheck)) { return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/BoxESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/BoxESP.kt index 8b968e7e..539b3cd8 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/BoxESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/BoxESP.kt @@ -25,10 +25,10 @@ import rat.poison.settings.DANGER_ZONE import rat.poison.settings.HEAD_BONE import rat.poison.toLocale import rat.poison.utils.* -import kotlin.math.abs -import kotlin.math.sign import rat.poison.utils.extensions.getFloatArray import rat.poison.utils.extensions.lower +import kotlin.math.abs +import kotlin.math.sign data class BoundingBox(var left: Float = -1F, var right: Float = -1F, var top: Float = -1F, var bottom: Float = -1F) { fun set(left: Float, right: Float, top: Float, bottom: Float): BoundingBox { @@ -84,7 +84,7 @@ private var barWidth = 0F private const val entityMemorySize = 45952 private val entMemory = threadLocalPointer(entityMemorySize) -private const val forEntsId = "boxesp" +private val forEntsList = arrayOf(EntityType.CCSPlayer, EntityType.CEconEntity) //p250 & cz75 share same classid, create enum for WeaponItemIndex using m_iItemDefinitionIndex fun boxEsp() { every(1000, true) { //Update settings @@ -133,7 +133,7 @@ fun boxEsp() { boxDetailsRightText.clear() boxDetailsTopText.clear() boxDetailsBottomText.clear() - forEntities(EntityType.CCSPlayer, EntityType.CEconEntity, iterateWeapons = true, identifier = forEntsId) { //Player & Weapon boxes + forEntities(forEntsList, iterateWeapons = true) { //Player & Weapon boxes val ent = it.entity val isPlayer = it.type == EntityType.CCSPlayer val isWeapon = it.type.weapon diff --git a/src/main/kotlin/rat/poison/scripts/visuals/ChamsESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/ChamsESP.kt index 51402105..6c894a95 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/ChamsESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/ChamsESP.kt @@ -24,7 +24,7 @@ import java.lang.Float.floatToIntBits private val meAng = Vector() private val mePos = Vector() private val cCol = Color() -private const val id = "chams" +private val forEntsList = arrayOf(EntityType.CCSPlayer) fun chamsEsp() = every(100, true, inGameCheck = true) { if (!curSettings.bool["CHAMS_ESP"] || !curSettings.bool["ENABLE_ESP"]) return@every @@ -75,7 +75,7 @@ fun chamsEsp() = every(100, true, inGameCheck = true) { } } - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity if (entity <= 0 || entity == me || entity.dormant() || entity.dead()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/DisableESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/DisableESP.kt index 85c81f6c..c39db0ef 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/DisableESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/DisableESP.kt @@ -13,7 +13,7 @@ import rat.poison.utils.inGame import java.lang.Float.floatToIntBits //Change to construct entities at call to prevent crashing? -private const val id = "disableesp" +private val forEntsList = arrayOf(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4) internal fun disableAllEsp() { if (!inGame) return @@ -25,7 +25,7 @@ internal fun disableAllEsp() { CSGO.csgoEXE[clientVModEnt + 0x72] = 255.toByte() CSGO.engineDLL[EngineOffsets.dwModelAmbientMin] = floatToIntBits(0F) xor (CSGO.engineDLL.address + EngineOffsets.dwModelAmbientMin - 0x2C).toInt() - forEntities(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4, iterateGrenades = true, iterateWeapons = true, identifier = id) { + forEntities(forEntsList, iterateGrenades = true, iterateWeapons = true) { val entity = it.entity val type = it.type val glowAddress = it.glowAddress diff --git a/src/main/kotlin/rat/poison/scripts/visuals/DrawSmokes.kt b/src/main/kotlin/rat/poison/scripts/visuals/DrawSmokes.kt index 550ccb57..18064e07 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/DrawSmokes.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/DrawSmokes.kt @@ -18,7 +18,7 @@ private val w2s1 = Vector() private val w2s2 = Vector() private val smokePos = Vector() private val points = mutableListOf() -private const val id = "drawsmokes" +private val forEntsList = arrayOf(EntityType.CSmokeGrenadeProjectile) fun drawSmokes() = App { if (!inGame || !curSettings.bool["ENABLE_ESP"] || !curSettings.bool["VISUALIZE_SMOKES"] || !inGame) return@App @@ -27,7 +27,7 @@ fun drawSmokes() = App { val smokeWidth = curSettings.int["VISUALIZE_SMOKES_WIDTH"] points.clear() - forEntities(EntityType.CSmokeGrenadeProjectile, identifier = id) { + forEntities(forEntsList) { points.clear() val entity = it.entity if (!entity.didEffect()) return@forEntities @@ -93,7 +93,7 @@ private val entPos2 = Vector() private var pX = -1F private var pY = -1F private var through = false -private const val forEntsId = "linethroughsmoke" +private val forEntsList2 = arrayOf(EntityType.CSmokeGrenadeProjectile) fun lineThroughSmoke(ent: Player): Boolean { through = false @@ -103,7 +103,7 @@ fun lineThroughSmoke(ent: Player): Boolean { pX = -(maxPos.x - mePos.x) pY = (maxPos.y - mePos.y) - forEntities(EntityType.CSmokeGrenadeProjectile, identifier = forEntsId) { + forEntities(forEntsList2) { if (through || !csgoEXE.boolean(it.entity + bDidSmokeEffect)) return@forEntities val pos = it.entity.absPosition(entPos2) diff --git a/src/main/kotlin/rat/poison/scripts/visuals/FarRadar.kt b/src/main/kotlin/rat/poison/scripts/visuals/FarRadar.kt index 23c85855..42373204 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/FarRadar.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/FarRadar.kt @@ -24,14 +24,14 @@ data class FarPlayer(val pos: Vector = Vector(), var alpha: Float = 0F) private var farPlayerRecords = Array(64) { FarPlayer() } private val w2s1 = Vector() private val w2s2 = Vector() -private const val id = "farradar" +private val forEntsList = arrayOf(EntityType.CCSPlayer) fun farRadar() = App { if (!inGame || !curSettings.bool["BOX_FAR_RADAR"] || meDead) return@App var dwRadar = clientDLL.int(dwRadarBase) dwRadar = csgoEXE.int(dwRadar + 0x74) - forEntities(EntityType.CCSPlayer, identifier = id) { //This will probably require more prechecks + forEntities(forEntsList) { //This will probably require more prechecks val ent = it.entity //Prechecks diff --git a/src/main/kotlin/rat/poison/scripts/visuals/FootStepESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/FootStepESP.kt index 19001f4e..6079f485 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/FootStepESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/FootStepESP.kt @@ -89,11 +89,11 @@ fun runFootSteps() = App { } private val entVel = Vector() -private const val id = "constructsteps" +private val forEntsList = arrayOf(EntityType.CCSPlayer) private fun constructSteps() = every(10) { stepTimer+= 1 if (stepTimer >= curSettings.int["FOOTSTEP_UPDATE"]) { - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val ent = it.entity if (ent == me || ent.dead() || ent.dormant()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/GlowESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/GlowESP.kt index 3f17eac1..63aa75ef 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/GlowESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/GlowESP.kt @@ -16,7 +16,7 @@ import kotlin.system.measureNanoTime private val mePosVec = Vector() private val meAng = Vector() private val cCol = Color() -private const val id = "glowesp" +private val forEntsList = arrayOf(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4) internal fun glowEspEvery() = every(100, true, inGameCheck = true) { if (!curSettings.bool["GLOW_ESP"] || !curSettings.bool["ENABLE_ESP"]) return@every @@ -51,7 +51,7 @@ internal fun glowEspEvery() = every(100, true, inGameCheck = true) { val showWeapons = curSettings.bool["GLOW_SHOW_WEAPONS"] val showGrenades = curSettings.bool["GLOW_SHOW_GRENADES"] - forEntities(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4, iterateWeapons = true, iterateGrenades = true, identifier = id) { + forEntities(forEntsList, iterateWeapons = true, iterateGrenades = true) { val entity = it.entity if (entity <= 0 || me == entity || entity.dormant()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/IndicatorESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/IndicatorESP.kt index bbfe52af..02ee0e80 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/IndicatorESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/IndicatorESP.kt @@ -15,14 +15,14 @@ import kotlin.math.atan2 import kotlin.math.cos import kotlin.math.hypot import kotlin.math.sin -private const val id = "indicator" +private val forEntsList = arrayOf(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4) fun indicatorEsp() = App { if (!curSettings.bool["ENABLE_ESP"] || !curSettings.bool["INDICATOR_ESP"] || !inGame) return@App val bomb: Entity = entityByType(EntityType.CC4)?.entity ?: -1L val bEnt = bomb.carrier() - forEntities(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4, iterateWeapons = true, iterateGrenades = true, identifier = id) { + forEntities(forEntsList, iterateWeapons = true, iterateGrenades = true) { val entity = it.entity val onTeam = !DANGER_ZONE && meTeam == entity.team() diff --git a/src/main/kotlin/rat/poison/scripts/visuals/NadeTracer.kt b/src/main/kotlin/rat/poison/scripts/visuals/NadeTracer.kt index 86227164..bd536cc0 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/NadeTracer.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/NadeTracer.kt @@ -2,7 +2,6 @@ package rat.poison.scripts.visuals import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.math.MathUtils.clamp -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import org.lwjgl.opengl.GL11.glDisable import org.lwjgl.opengl.GL11.glEnable import rat.poison.curSettings @@ -25,13 +24,13 @@ var arraySize = 5 private val w2s1 = Vector() private val w2s2 = Vector() private val positionVector2 = Vector() -private const val id = "nadetracer" +private val forEntsList = arrayOf(EntityType.CSmokeGrenadeProjectile, EntityType.CMolotovProjectile, EntityType.CDecoyProjectile, EntityType.CBaseCSGrenadeProjectile) fun nadeTracer() = App { if (!curSettings.bool["NADE_TRACER"] || MENUTOG || !curSettings.bool["ENABLE_ESP"] || !inGame) return@App if (sync >= (curSettings.int["NADE_TRACER_UPDATE_TIME"])) { arraySize = clamp(curSettings.int["NADE_TRACER_TIMEOUT"], 1, 30) - forEntities(EntityType.CSmokeGrenadeProjectile, EntityType.CMolotovProjectile, EntityType.CDecoyProjectile, EntityType.CBaseCSGrenadeProjectile, identifier = id) { + forEntities(forEntsList) { val ent = it.entity val entPos = ent.absPosition() diff --git a/src/main/kotlin/rat/poison/scripts/visuals/NadesTimer.kt b/src/main/kotlin/rat/poison/scripts/visuals/NadesTimer.kt index 391bb277..ba5af65f 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/NadesTimer.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/NadesTimer.kt @@ -16,11 +16,11 @@ import rat.poison.utils.inGame private val vec = Vector() private val positionVector = Vector() private val stringBuilder = StringBuilder() -private const val id = "nadestimer" +private val forEntsList = arrayOf(EntityType.CSmokeGrenadeProjectile) fun nadesTimer() = App { if (!curSettings.bool["SMOKE_WEAR_OFF_TIME"] || !inGame) return@App - forEntities(EntityType.CSmokeGrenadeProjectile, identifier = id) { + forEntities(forEntsList) { val ent = it.entity if (!ent.didEffect()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/RadarESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/RadarESP.kt index eafe32d2..4d9553a9 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/RadarESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/RadarESP.kt @@ -13,7 +13,7 @@ import rat.poison.utils.every private val positionVector = Vector() private val footstepsVec = Vector() private val entsChecked = LongArrayList() -private const val id = "radaresp" +private val forEntsList = arrayOf(EntityType.CCSPlayer) internal fun radarEsp() = every(100, inGameCheck = true) { if (!curSettings.bool["RADAR_ESP"] || DANGER_ZONE) return@every @@ -32,13 +32,13 @@ internal fun radarEsp() = every(100, inGameCheck = true) { } } - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { if (!entsChecked.contains(it.entity)) { it.entity.hideOnRadar() } } } else { - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val entity = it.entity if (entity.dead() || entity == me || entity.dormant()) return@forEntities diff --git a/src/main/kotlin/rat/poison/scripts/visuals/SharedEsp.kt b/src/main/kotlin/rat/poison/scripts/visuals/SharedEsp.kt index ea50b448..18025684 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/SharedEsp.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/SharedEsp.kt @@ -2,7 +2,6 @@ package rat.poison.scripts.visuals import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.GL20 -import com.badlogic.gdx.utils.Align import io.ktor.client.* import io.ktor.client.features.websocket.* import io.ktor.http.* @@ -31,7 +30,7 @@ private var metEntityList = mutableListOf() private val w2s1 = Vector() private val w2s2 = Vector() private val entPosVec = Vector() -private const val id = "sharedesp" +private val forEntsList = arrayOf(EntityType.CCSPlayer) private val bbox = BoundingBox() @KtorExperimentalAPI fun sharedEsp() { @@ -43,7 +42,7 @@ fun sharedEsp() { //send what we have to server var s = "iterateEntities:${mySid}:${meTeam}:" - forEntities(EntityType.CCSPlayer, identifier = id) { + forEntities(forEntsList) { val ent = it.entity if (ent.dormant() || ent.dead() || ent <= 0 || ent == me) return@forEntities //sharedPlayerRecords[allocSharedPlayerRecord(0)].apply { diff --git a/src/main/kotlin/rat/poison/scripts/visuals/SkeletonESP.kt b/src/main/kotlin/rat/poison/scripts/visuals/SkeletonESP.kt index 5c627aef..06e79365 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/SkeletonESP.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/SkeletonESP.kt @@ -19,15 +19,17 @@ private var modelMemory = threadLocalPointer(modelMemorySize) private const val boneMemorySize = 5000 private var boneMemory = threadLocalPointer(boneMemorySize) private var health = -1 -private const val skeletonEspIdentifier = "skeletonesp" +private val forEntsList = arrayOf(EntityType.CCSPlayer) private val w2sRet1 = Vector() private val w2sRet2 = Vector() private val c = Color() fun skeletonEsp() = App { if (!curSettings.bool["SKELETON_ESP"] || !curSettings.bool["ENABLE_ESP"] || !inGame) return@App - shapeRenderer.begin() - forEntities(EntityType.CCSPlayer, identifier = skeletonEspIdentifier) { + if (!shapeRenderer.isDrawing) { + shapeRenderer.begin() + } + forEntities(forEntsList) { val entity = it.entity val entTeam = entity.team() @@ -52,6 +54,7 @@ fun skeletonEsp() = App { csgoEXE.read(boneMatrix, boneMemory) var offset = 0 for (idx in 0 until numBones) { + if (offset+4 > modelMemorySize) return@forEntities val parent = modelMemory.getInt(0x4L + offset) if (parent != -1) { val flags = modelMemory.getInt(0xA0L + offset).unsign() and 0x100 diff --git a/src/main/kotlin/rat/poison/scripts/visuals/SnapLines.kt b/src/main/kotlin/rat/poison/scripts/visuals/SnapLines.kt index 992bd72f..e0220241 100644 --- a/src/main/kotlin/rat/poison/scripts/visuals/SnapLines.kt +++ b/src/main/kotlin/rat/poison/scripts/visuals/SnapLines.kt @@ -11,7 +11,7 @@ import rat.poison.utils.inGame private const val emptyString = "" private val positionVector = Vector() -private const val id = "snaplines" +private val forEntsList = arrayOf(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4, EntityType.CEconEntity) //TODO god fix this eventually g private val w2sRet = Vector() fun snapLines() = App { @@ -20,7 +20,7 @@ fun snapLines() = App { val bomb: Entity = entityByType(EntityType.CC4)?.entity ?: -1L val bEnt = bomb.carrier() - forEntities(EntityType.CCSPlayer, EntityType.CPlantedC4, EntityType.CC4, EntityType.CEconEntity, iterateWeapons = true, identifier = id) { + forEntities(forEntsList, iterateWeapons = true) { val entity = it.entity var colStr = "" diff --git a/src/main/kotlin/rat/poison/ui/uiHelpers/VisColorPickerCustom.kt b/src/main/kotlin/rat/poison/ui/uiHelpers/VisColorPickerCustom.kt index 0267b0cd..e63e4631 100644 --- a/src/main/kotlin/rat/poison/ui/uiHelpers/VisColorPickerCustom.kt +++ b/src/main/kotlin/rat/poison/ui/uiHelpers/VisColorPickerCustom.kt @@ -29,7 +29,7 @@ class VisColorPickerCustom(mainText: String, varName: String) : VisTable() { init { colorPicker = ColorPicker(variableName.toLocale(), object : ColorPickerAdapter() { override fun finished(newCol: Color) { - curSettings[variableName] = rColor((newCol.r*255F).toInt(), (newCol.g*255F).toInt(), (newCol.b*255F).toInt(), newCol.a.toDouble()).toString() + curSettings[variableName] = rColor((newCol.r*255F).toInt(), (newCol.g*255F).toInt(), (newCol.b*255F).toInt(), newCol.a.toDouble()) newCol.a = 1F color = newCol update() diff --git a/src/main/kotlin/rat/poison/utils/EfficentSettingsType.kt b/src/main/kotlin/rat/poison/utils/EfficentSettingsType.kt index be5c9cc8..fc262095 100644 --- a/src/main/kotlin/rat/poison/utils/EfficentSettingsType.kt +++ b/src/main/kotlin/rat/poison/utils/EfficentSettingsType.kt @@ -1,10 +1,6 @@ package rat.poison.utils -import it.unimi.dsi.fastutil.objects.Object2ObjectMap -import it.unimi.dsi.fastutil.objects.Object2IntMap -import it.unimi.dsi.fastutil.objects.Object2ObjectMaps -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap +import it.unimi.dsi.fastutil.objects.* import rat.poison.game.Color import rat.poison.utils.generalUtil.* import kotlin.reflect.KClass diff --git a/src/main/kotlin/rat/poison/utils/Vector.kt b/src/main/kotlin/rat/poison/utils/Vector.kt index 1aa1edf6..1986d39a 100644 --- a/src/main/kotlin/rat/poison/utils/Vector.kt +++ b/src/main/kotlin/rat/poison/utils/Vector.kt @@ -9,10 +9,10 @@ data class Vector(var x: Float = 0.0F, var y: Float = 0.0F, var z: Float = 0.0F) this.y = y this.z = z } - - fun invalid() = x == 0.0F && y == 0.0F && z == 0.0F - - fun valid() = !invalid() + + fun isZero() = (x < 0.01F && x > -0.01F) && (y < 0.01F && y > -0.01F) && (z < 0.01F && z > -0.01F) + + fun valid() = !isZero() fun dst2 (x: Float, y: Float, z: Float): Float { val a = x - this.x; diff --git a/src/main/kotlin/rat/poison/utils/generalUtil/GeneralUtil.kt b/src/main/kotlin/rat/poison/utils/generalUtil/GeneralUtil.kt index 61dd9e08..aa27f9db 100644 --- a/src/main/kotlin/rat/poison/utils/generalUtil/GeneralUtil.kt +++ b/src/main/kotlin/rat/poison/utils/generalUtil/GeneralUtil.kt @@ -2,13 +2,15 @@ package rat.poison.utils.generalUtil import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.math.Matrix4 -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import rat.poison.* import rat.poison.utils.extensions.lower -import java.util.concurrent.ConcurrentLinkedQueue +import rat.poison.utils.maps.OneTimeMap import java.util.regex.Pattern -fun Any.strToBool() = this.toString().lower() == "true" || this == true || this == 1.0 || this == 1 || this == 1F +fun Any.strToBool(): Boolean { + val stringRepr = this.toString().lower() + return stringRepr == "true" || this == true || this == 1.0 || this == 1 || this == 1F || stringRepr == "1" +} fun Any.boolToStr() = this.toString() fun Any.cToInt() = this.toString().toInt() fun Any.cToLong() = this.toString().toLong() @@ -16,6 +18,7 @@ fun Any.strToColor() = convStrToColor(this.toString()) fun Any.strToColorGDX() = convStrToColorGDX(this.toString()) fun Any.cToDouble() = this.toString().toDouble() fun Any.cToFloat() = this.toString().toFloat() + fun Boolean.toFloat() = if (this) 1F else 0F fun Boolean.toDouble() = if (this) 1.0 else 0.0 fun Boolean.toInt() = if (this) 1 else 0 @@ -28,9 +31,9 @@ fun convStrToColor(input: String): rat.poison.game.Color { //Rat poison color val arrayLine = line.trim().split(" ", ignoreCase = true, limit = 4) return rat.poison.game.Color(arrayLine[0].replace("red=", "").toInt(), - arrayLine[1].replace("green=", "").toInt(), - arrayLine[2].replace("blue=", "").toInt(), - arrayLine[3].replace("alpha=", "").toDouble()) + arrayLine[1].replace("green=", "").toInt(), + arrayLine[2].replace("blue=", "").toInt(), + arrayLine[3].replace("alpha=", "").toDouble()) } catch (e: Exception) { if (dbg) { println("[DEBUG] $input Color is invalid, using white") @@ -52,13 +55,13 @@ fun convStrToColorGDX(input: String): Color { } return if (arrayLine.size >= 4) Color(arrayLine[0].toFloat()/255F, - arrayLine[1].toFloat()/255F, - arrayLine[2].toFloat()/255F, - arrayLine[3].toFloat()) else Color(1F, 1F, 1F, 1F) + arrayLine[1].toFloat()/255F, + arrayLine[2].toFloat()/255F, + arrayLine[3].toFloat()) else Color(1F, 1F, 1F, 1F) } -private var stringToWeaponClassCache = Object2ObjectArrayMap() +private var stringToWeaponClassCache = OneTimeMap() fun String.toWeaponClass(): oWeapon { val get = stringToWeaponClassCache[this] return when (get == null) { @@ -78,7 +81,7 @@ fun String.toWeaponClass(): oWeapon { } } -private var stringToSkinWeaponClassCache = Object2ObjectArrayMap() +private var stringToSkinWeaponClassCache = OneTimeMap() fun String.toSkinWeaponClass(): sWeapon { val get = stringToSkinWeaponClassCache[this] return when (get == null) { @@ -104,17 +107,19 @@ fun List.pull(idx: Int): String { fun List.has(predicate: (_: Any) -> Boolean): Boolean { var hasItem = false - this.forEach { + for (i in 0 until this.size) { + val it = this[i] if (predicate(it) || hasItem) { hasItem = true - return@forEach + break } } return hasItem } fun List.containsAny(lst: List): Boolean { - lst.forEach { + for (i in 0 until lst.size) { + val it = lst[i] if (!this.contains(it)) return false } return true @@ -146,21 +151,12 @@ fun String.stringToLocaleList(separator: String = ","): List { } } -fun ConcurrentLinkedQueue.has(predicate: (_: Int) -> Boolean): Boolean { - var hasItem = false - this.forEach { - if (predicate(it)) { - hasItem = true - return@forEach - } - } - return hasItem -} private val intPattern = Pattern.compile("-?\\d+") -private val stringToIntListCache = Object2ObjectArrayMap>() -fun String.stringToIntList(listOut: MutableList = mutableListOf()): MutableList { +private val stringToIntListCache = OneTimeMap>() +fun String.stringToIntList(): List { val get = stringToIntListCache[this] return if (get == null) { + val listOut = mutableListOf() val match = intPattern.matcher(this) while (match.find()) { listOut.add(match.group().toInt()) @@ -174,12 +170,12 @@ fun String.stringToIntList(listOut: MutableList = mutableListOf()): Mutable } private val DEFAULT_INVALID_LIST = listOf("") -private val stringToListCache = Object2ObjectArrayMap>() -fun String.stringToList(separator: String = ",", listOut: MutableList = mutableListOf()): List { +private val stringToListCache = OneTimeMap>() +fun String.stringToList(separator: String = ","): List { val get = stringToListCache[this] return if (get == null) { val strList = this.replace("[", "").replace("]", "").replace(" ", "").split(separator) - + val listOut = mutableListOf() if (strList != DEFAULT_INVALID_LIST) { for (i in strList) { listOut.add(i) diff --git a/src/main/kotlin/rat/poison/utils/generalUtil/LoadSettings.kt b/src/main/kotlin/rat/poison/utils/generalUtil/LoadSettings.kt index 79ea7ab4..d0ef3e2f 100644 --- a/src/main/kotlin/rat/poison/utils/generalUtil/LoadSettings.kt +++ b/src/main/kotlin/rat/poison/utils/generalUtil/LoadSettings.kt @@ -2,7 +2,6 @@ package rat.poison.utils.generalUtil import org.apache.commons.lang3.StringUtils.isNumeric import rat.poison.* -import rat.poison.scripts.aim.numToBone import rat.poison.utils.extensions.upper import rat.poison.utils.saving import java.io.File diff --git a/src/main/kotlin/rat/poison/utils/lists/ForEntitiesList.kt b/src/main/kotlin/rat/poison/utils/lists/ForEntitiesList.kt new file mode 100644 index 00000000..cd4d1a50 --- /dev/null +++ b/src/main/kotlin/rat/poison/utils/lists/ForEntitiesList.kt @@ -0,0 +1,48 @@ +package rat.poison.utils.lists + +import rat.poison.game.EntityContext + +class ForEntitiesList { + val cachedValues = mutableListOf() + private val addTasks = mutableListOf() + var iterating = false + + + fun firstOrNull(): EntityContext? = cachedValues.firstOrNull() + + operator fun get(idx: Int): EntityContext = cachedValues[idx] + + fun getOrNull(idx: Int): EntityContext? { + if (idx < cachedValues.size) { + return this[idx] + } + return null + } + + fun contains(context: EntityContext): Boolean = cachedValues.contains(context) + + fun clear() { + while (iterating) { + Thread.yield() + } + cachedValues.clear() + } + + fun completeTasks() { + for (i in 0 until addTasks.size) { + val context = addTasks[i] + if (!contains(context)) { + cachedValues.add(context) + } + } + } + + fun add(context: EntityContext) { + if (!iterating) { + cachedValues.add(context) + } + else { + addTasks.add(context) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/rat/poison/utils/maps/OneTimeMap.kt b/src/main/kotlin/rat/poison/utils/maps/OneTimeMap.kt new file mode 100644 index 00000000..04f068f6 --- /dev/null +++ b/src/main/kotlin/rat/poison/utils/maps/OneTimeMap.kt @@ -0,0 +1,10 @@ +package rat.poison.utils.maps + +class OneTimeMap { + private val cachedValues = mutableMapOf() + operator fun set(k: K, v: V) { + if (!containsKey(k)) cachedValues[k] = v + } + fun containsKey(k: K): Boolean = cachedValues.containsKey(k) + operator fun get(k: K): V? = cachedValues[k] +} \ No newline at end of file diff --git a/version.txt b/version.txt index 1eb84301..2444baaf 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -1.8.5.6 +1.8.5.7 beta