diff options
Diffstat (limited to 'src/main/kotlin')
18 files changed, 372 insertions, 355 deletions
diff --git a/src/main/kotlin/dulkirmod/DulkirMod.kt b/src/main/kotlin/dulkirmod/DulkirMod.kt index dcf5718..6fd98f4 100644 --- a/src/main/kotlin/dulkirmod/DulkirMod.kt +++ b/src/main/kotlin/dulkirmod/DulkirMod.kt @@ -62,19 +62,20 @@ class DulkirMod { // REGISTER Classes and such HERE val mcBus = MinecraftForge.EVENT_BUS mcBus.register(this) - mcBus.register(ChatEvent()) + mcBus.register(MemoryLeakFix) + mcBus.register(ChatEvent) mcBus.register(NametagCleaner) - mcBus.register(titleUtils) - mcBus.register(ArachneTimer()) - mcBus.register(MatchoAlert()) - mcBus.register(Croesus()) - mcBus.register(ContainerNameUtil()) - mcBus.register(DungeonLeap()) - mcBus.register(AbiphoneDND()) - mcBus.register(KeeperWaypoints()) + mcBus.register(TitleUtils) + mcBus.register(ArachneTimer) + mcBus.register(MatchoAlert) + mcBus.register(Croesus) + mcBus.register(ContainerNameUtil) + mcBus.register(DungeonLeap) + mcBus.register(AbiphoneDND) + mcBus.register(KeeperWaypoints) mcBus.register(ScalableTooltips) - mcBus.register(GardenVisitorAlert()) - mcBus.register(DragonTimer()) + mcBus.register(GardenVisitorAlert) + mcBus.register(DragonTimer) keyBinds.forEach(ClientRegistry::registerKeyBinding) } @@ -98,8 +99,7 @@ class DulkirMod { if (currTime - lastLongUpdate > 1000) { // long update alarmClock() brokenHypeNotif() - matchoAlert.alert() - gardenVisitorAlert.alert() + GardenVisitorAlert.alert() // Now I don't have to fetch the entries for multiple things, this just updates and caches // the data structure on 1s cooldown TabListUtils.parseTabEntries() @@ -130,11 +130,6 @@ class DulkirMod { var config = Config var display: GuiScreen? = null val scope = CoroutineScope(EmptyCoroutineContext) - val titleUtils = TitleUtils() - val matchoAlert = MatchoAlert() - val gardenVisitorAlert = GardenVisitorAlert() - val DragonTimer = DragonTimer() - var tabEntries: List<String?> = emptyList() val keyBinds = arrayOf( KeyBinding("Open Settings", Keyboard.KEY_RSHIFT, "Dulkir Mod"), diff --git a/src/main/kotlin/dulkirmod/config/Config.kt b/src/main/kotlin/dulkirmod/config/Config.kt index 8fe611d..1088ad1 100644 --- a/src/main/kotlin/dulkirmod/config/Config.kt +++ b/src/main/kotlin/dulkirmod/config/Config.kt @@ -13,6 +13,14 @@ object Config : Vigilant(File("./config/dulkirmod/config.toml"), "DulkirMod", so @Property( type = PropertyType.SWITCH, + name = "Patch Crimson Isle memory leak", + description = "This is a temporary fix for the memory leak on crimson isles. It will be removed when Hypixel fixes the issue.", + category = "General" + ) + var crimsonIslesMemoryLeakPatch = true + + @Property( + type = PropertyType.SWITCH, name = "Hide Enchant Rune Particles", description = "ugly go bye-bye", category = "General" diff --git a/src/main/kotlin/dulkirmod/events/ChatEvent.kt b/src/main/kotlin/dulkirmod/events/ChatEvent.kt index 1b0f232..8a4065e 100644 --- a/src/main/kotlin/dulkirmod/events/ChatEvent.kt +++ b/src/main/kotlin/dulkirmod/events/ChatEvent.kt @@ -6,7 +6,7 @@ import net.minecraftforge.client.event.ClientChatReceivedEvent import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -class ChatEvent { +object ChatEvent { /** * This is mostly the way it is to avoid having to run strip color codes a bunch of times diff --git a/src/main/kotlin/dulkirmod/features/AlarmClock.kt b/src/main/kotlin/dulkirmod/features/AlarmClock.kt index 0d3f51c..f4c11d4 100644 --- a/src/main/kotlin/dulkirmod/features/AlarmClock.kt +++ b/src/main/kotlin/dulkirmod/features/AlarmClock.kt @@ -1,9 +1,9 @@ package dulkirmod.features -import dulkirmod.DulkirMod import dulkirmod.DulkirMod.Companion.mc import dulkirmod.config.Config import dulkirmod.utils.ScoreBoardUtils +import dulkirmod.utils.TitleUtils import dulkirmod.utils.Utils var lastUpdate: Long = 0 @@ -19,7 +19,7 @@ fun alarmClock() { if (Config.notifyZombieVillager && l.contains("8:00pm") && (currTime - lastUpdate) > 15000) { lastUpdate = currTime val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Zombie Villager", 5000) + TitleUtils.drawStringForTime("${color}Zombie Villager", 5000) if (Config.bestiaryAlertSounds) mc.thePlayer.playSound("mob.villager.yes", 1f * Config.bestiaryNotifVol, 0f) } @@ -27,7 +27,7 @@ fun alarmClock() { else if (Config.notifyGhast && l.contains("9:00pm") && (currTime - lastUpdate) > 15000) { lastUpdate = currTime val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Ghast", 5000) + TitleUtils.drawStringForTime("${color}Ghast", 5000) if (Config.bestiaryAlertSounds) mc.thePlayer.playSound("mob.ghast.scream", 1f * Config.bestiaryNotifVol, 1f) } diff --git a/src/main/kotlin/dulkirmod/features/ArachneTimer.kt b/src/main/kotlin/dulkirmod/features/ArachneTimer.kt index 5c97c86..4cb63f9 100644 --- a/src/main/kotlin/dulkirmod/features/ArachneTimer.kt +++ b/src/main/kotlin/dulkirmod/features/ArachneTimer.kt @@ -10,7 +10,7 @@ import net.minecraftforge.client.event.RenderWorldLastEvent import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent -class ArachneTimer { +object ArachneTimer { private var startmillis: Long = -1 private var endmillis: Long = -1 private var spawnmillis: Long = -1 diff --git a/src/main/kotlin/dulkirmod/features/BrokenHypeNotif.kt b/src/main/kotlin/dulkirmod/features/BrokenHypeNotif.kt index 27225ff..589c046 100644 --- a/src/main/kotlin/dulkirmod/features/BrokenHypeNotif.kt +++ b/src/main/kotlin/dulkirmod/features/BrokenHypeNotif.kt @@ -1,9 +1,9 @@ package dulkirmod.features -import dulkirmod.DulkirMod import dulkirmod.DulkirMod.Companion.mc import dulkirmod.config.Config import dulkirmod.utils.TabListUtils +import dulkirmod.utils.TitleUtils import dulkirmod.utils.Utils import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -61,7 +61,7 @@ fun brokenHypeNotif() { if (oldKill != kill && oldChampionXp == championXp && TabListUtils.area != "Private Island") { mc.thePlayer.playSound("random.anvil_land", 1f * Config.bestiaryNotifVol, 0f) val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Hype Broken", 5000) + TitleUtils.drawStringForTime("${color}Hype Broken", 5000) } // update item regardless of whether it is bugged or not oldKill = kill diff --git a/src/main/kotlin/dulkirmod/features/Croesus.kt b/src/main/kotlin/dulkirmod/features/Croesus.kt index 36bf3ee..ea8b022 100644 --- a/src/main/kotlin/dulkirmod/features/Croesus.kt +++ b/src/main/kotlin/dulkirmod/features/Croesus.kt @@ -9,75 +9,76 @@ import net.minecraft.nbt.NBTTagList import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent -class Croesus { - - var lastGuiOpenEvent: Long = 0 - var lastPageNumber = 1 - - @SubscribeEvent - fun onTick(event: TickEvent.ClientTickEvent) { - val lastInCroesus = inCroesusBool - var pageNumber = 1 - - if (!Config.hideOpenedChests) return - if (mc.currentScreen == null || !(mc.currentScreen is GuiChest)) { - inCroesusBool = false - return - } - inCroesusBool = (ContainerNameUtil.currentGuiChestName == "Croesus") - - if (inCroesusBool) { - pageNumber = findPageNumber() - } - - // weird way of detecting page turn - if(lastPageNumber != pageNumber) - lastGuiOpenEvent = System.currentTimeMillis() - - if (inCroesusBool && !lastInCroesus) { - lastGuiOpenEvent = System.currentTimeMillis() - } - - if (inCroesusBool && System.currentTimeMillis() - lastGuiOpenEvent < 300) { - for (i in 9..44) { - boolArray[i - 9] = false - val slotIn = mc.thePlayer.openContainer.getSlot(i) - - if (slotIn.stack == null) continue - val stack = slotIn.stack - - val tagList: NBTTagList = stack.getSubCompound("display", false)?.getTagList("Lore", 8) ?: continue - for (j in 0 until tagList.tagCount()) { - if (tagList.getStringTagAt(j) == "§aChests have been opened!") boolArray[i - 9] = true - } - } - } - } - - private fun findPageNumber(): Int { - val stackPrev = mc.thePlayer.openContainer.getSlot(45).stack ?: return lastPageNumber - - val stackPrevLore = stackPrev.getSubCompound("display", false)?.getTagList("Lore", 8) ?: return 1 - - if (stackPrevLore.getStringTagAt(0).contains("1")) return 2 - - return 3 - } - - companion object { - var inCroesusBool: Boolean = false - var boolArray = BooleanArray(36) { false } - - fun inCroesus(): Boolean { - return inCroesusBool - } - - fun isChestOpened(slotIn: Slot): Boolean { - if (!inCroesusBool) return false - if (slotIn.inventory == mc.thePlayer.inventory) return false - val slotindex = slotIn.slotIndex - if (slotindex !in 9..44) return false - return boolArray[slotindex - 9] - } - } +object Croesus { + + var lastGuiOpenEvent: Long = 0 + var lastPageNumber = 1 + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + val lastInCroesus = inCroesusBool + var pageNumber = 1 + + if (!Config.hideOpenedChests) return + if (mc.currentScreen == null || !(mc.currentScreen is GuiChest)) { + inCroesusBool = false + return + } + inCroesusBool = (ContainerNameUtil.currentGuiChestName == "Croesus") + + if (inCroesusBool) { + pageNumber = findPageNumber() + } + + // weird way of detecting page turn + if (lastPageNumber != pageNumber) + lastGuiOpenEvent = System.currentTimeMillis() + + if (inCroesusBool && !lastInCroesus) { + lastGuiOpenEvent = System.currentTimeMillis() + } + + if (inCroesusBool && System.currentTimeMillis() - lastGuiOpenEvent < 300) { + for (i in 9..44) { + boolArray[i - 9] = false + val slotIn = mc.thePlayer.openContainer.getSlot(i) + + if (slotIn.stack == null) continue + val stack = slotIn.stack + + val tagList: NBTTagList = stack.getSubCompound("display", false)?.getTagList("Lore", 8) ?: continue + for (j in 0 until tagList.tagCount()) { + if (tagList.getStringTagAt(j) == "§aChests have been opened!") boolArray[i - 9] = true + } + } + } + } + + private fun findPageNumber(): Int { + val stackPrev = mc.thePlayer.openContainer.getSlot(45).stack ?: return lastPageNumber + + val stackPrevLore = stackPrev.getSubCompound("display", false)?.getTagList("Lore", 8) ?: return 1 + + if (stackPrevLore.getStringTagAt(0).contains("1")) return 2 + + return 3 + } + + var inCroesusBool: Boolean = false + + var boolArray = BooleanArray(36) { false } + + @JvmStatic + fun inCroesus(): Boolean { + return inCroesusBool + } + + @JvmStatic + fun isChestOpened(slotIn: Slot): Boolean { + if (!inCroesusBool) return false + if (slotIn.inventory == mc.thePlayer.inventory) return false + val slotindex = slotIn.slotIndex + if (slotindex !in 9..44) return false + return boolArray[slotindex - 9] + } }
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/features/DragonTimer.kt b/src/main/kotlin/dulkirmod/features/DragonTimer.kt index 0716cef..df1f12f 100644 --- a/src/main/kotlin/dulkirmod/features/DragonTimer.kt +++ b/src/main/kotlin/dulkirmod/features/DragonTimer.kt @@ -12,125 +12,118 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import java.awt.Color import kotlin.math.max -class DragonTimer { - data class Dragon (val color: String, val pos: Vec3, var spawnTime: Long) - - companion object { - var dragons = arrayOf( - Dragon("orange", Vec3(84.0, 18.0, 56.0), 0), - Dragon("red", Vec3(27.0, 18.0, 56.0), 0), - Dragon("green", Vec3(26.0, 18.0, 95.0), 0), - Dragon("purple", Vec3(57.0, 18.0, 125.0), 0), - Dragon("blue", Vec3(84.0, 18.0, 95.0), 0) - ) - } - - /** - * Called from within the MixinWorld Class - */ - fun handleNewParticle(particleID: Int, xCoord: Double, yCoord: Double, zCoord: Double) { - if (particleID != 26) return - if (!ScoreBoardUtils.isInM7) return - if (!Config.dragonTimer) return - //TextUtils.info("§6particle id ${particleID} 175 = $p_175720_2_") - - val particleVec = Vec3(xCoord, yCoord, zCoord) - for (d in dragons) { - if (inRangeOf(d.color, particleVec)) { - if (System.currentTimeMillis() - d.spawnTime > 10000) { - d.spawnTime = System.currentTimeMillis() - } - } - } - } - - @SubscribeEvent - fun onRenderWorld(event: RenderWorldLastEvent) { - val curTime: Long = System.currentTimeMillis() - // for some reason this really doesn't like the syntax for (d in dragons) - for (i in 0..4) { - // d.spawnTime + 5000 is when dragon actually spawn - val d = dragons[i] - if (d.spawnTime + 5000 > curTime) { - if (isDead(d.color)) - return - val timeUntilSpawn: Float = ((d.spawnTime + 5000 - curTime).toFloat() / 1000f) - val color = when { - timeUntilSpawn <= 1 -> "§c" - timeUntilSpawn <= 3 -> "§e" - else -> "§a" - } - val playerVec = mc.thePlayer.positionVector - val scale = max(1f, playerVec.distanceTo(d.pos).toFloat()/5f) - WorldRenderUtils.renderString(d.pos, "${color}${String.format("%.2f", timeUntilSpawn)}", - false, scale, true) - } - } - } - - /** - * true = dead - */ - private fun isDead(color:String): Boolean { - val world: World = mc.theWorld - val pos = when (color) { - "orange" -> BlockPos(90, 21, 56) - "red" -> BlockPos(20,22,59) - "green" -> BlockPos(22,21,94) - "purple" -> BlockPos(56,20,130) - "blue" -> BlockPos(89,21,94) - else -> BlockPos(0,0,0) - } - return world.isAirBlock(pos) - } - private fun inRangeOf(color: String, pos: Vec3): Boolean { - when (color) { - "orange" -> { - return (pos.xCoord.toInt() in 82..88 - && pos.yCoord.toInt() in 15..22 - && pos.zCoord.toInt() in 53..59) - } - "red" -> { - return (pos.xCoord.toInt() in 24..30 - && pos.yCoord.toInt() in 15..22 - && pos.zCoord.toInt() in 56..62) - } - "green" -> { - return (pos.xCoord.toInt() in 23..29 - && pos.yCoord.toInt() in 15..22 - && pos.zCoord.toInt() in 91..97) - } - "purple" -> { - return (pos.xCoord.toInt() in 53..59 - && pos.yCoord.toInt() in 15..22 - && pos.zCoord.toInt() in 122..128) - } - "blue" -> { - return (pos.xCoord.toInt() in 82..88 - && pos.yCoord.toInt() in 15..22 - && pos.zCoord.toInt() in 91..97) - } - else -> { - return false - } - } - } - - @SubscribeEvent - fun dragonBoxes(event: RenderWorldLastEvent) { - if (!Config.dragonKillBox) return - if (!ScoreBoardUtils.isInM7) return - if (mc.thePlayer.positionVector.yCoord > 45) return - // Blue - WorldRenderUtils.drawCustomBox(71.5, 25.0, 16.0, 10.0, 82.5, 25.0, Color(0, 170, 170, 255), 3f, phase = false) - // Purple - WorldRenderUtils.drawCustomBox(45.5, 23.0, 13.0, 10.0, 113.5, 23.0, Color(170, 0, 170, 255), 3f, phase = false) - // Green - WorldRenderUtils.drawCustomBox(7.0, 30.0, 8.0, 20.0, 80.0, 30.0, Color(85, 255, 85, 255), 3f, phase = false) - // Red - WorldRenderUtils.drawCustomBox(14.5, 25.0, 13.0, 15.0, 45.5, 25.0, Color(255, 85, 85, 255), 3f, phase = false) - // Orange - WorldRenderUtils.drawCustomBox(72.0, 30.0, 8.0, 20.0, 47.0, 30.0, Color(255, 170, 0, 255), 3f, phase = false) - } -} +object DragonTimer { + data class Dragon(val color: String, val pos: Vec3, var spawnTime: Long) + private val dragons = arrayOf( + Dragon("orange", Vec3(84.0, 18.0, 56.0), 0), + Dragon("red", Vec3(27.0, 18.0, 56.0), 0), + Dragon("green", Vec3(26.0, 18.0, 95.0), 0), + Dragon("purple", Vec3(57.0, 18.0, 125.0), 0), + Dragon("blue", Vec3(84.0, 18.0, 95.0), 0) + ) + + /** + * Called from within the MixinWorld Class + */ + fun handleNewParticle(pID: Int, x: Double, y: Double, z: Double) { + if (!Config.dragonTimer) return + + if (pID != 26) return + // if (!TabListUtils.isInDungeons) return + //TextUtils.info("§6particle id ${particleID} 175 = $p_175720_2_") + + val particleVec = Vec3(x, y, z) + dragons.forEach { + if (System.currentTimeMillis() - it.spawnTime < 10000 || !inRangeOf(it.color, particleVec)) return@forEach + it.spawnTime = System.currentTimeMillis() + } + } + + @SubscribeEvent + fun onRenderWorld(event: RenderWorldLastEvent) { + renderDragonBoxes() + + if (!Config.dragonTimer) return + val curTime = System.currentTimeMillis() + dragons.forEach { + if (it.spawnTime + 5000 < curTime || isDead(it.color)) return@forEach + val timeUntilSpawn = (it.spawnTime + 5000 - curTime) / 1000f + val color = when { + timeUntilSpawn <= 1 -> "§c" + timeUntilSpawn <= 3 -> "§e" + else -> "§a" + } + + val scale = max(1.0, mc.thePlayer.positionVector.distanceTo(it.pos) / 5.0).toFloat() + + WorldRenderUtils.renderString( + it.pos, "${color}${String.format("%.2f", timeUntilSpawn)}", false, scale, true + ) + } + } + + /** + * true = dead + */ + private fun isDead(color: String): Boolean { + val world: World = mc.theWorld + val pos = when (color) { + "orange" -> BlockPos(90, 21, 56) + "red" -> BlockPos(20, 22, 59) + "green" -> BlockPos(22, 21, 94) + "purple" -> BlockPos(56, 20, 130) + "blue" -> BlockPos(89, 21, 94) + else -> BlockPos(0, 0, 0) + } + return world.isAirBlock(pos) + } + + private fun inRangeOf(color: String, pos: Vec3): Boolean { + val x = pos.xCoord.toInt() + val y = pos.yCoord.toInt() + val z = pos.zCoord.toInt() + + return when (color) { + "orange" -> { + x in 82..88 && y in 15..22 && z in 53..59 + } + + "red" -> { + x in 24..30 && y in 15..22 && z in 56..62 + } + + "green" -> { + x in 23..29 && y in 15..22 && z in 91..97 + } + + "purple" -> { + x in 53..59 && y in 15..22 && z in 122..128 + } + + "blue" -> { + x in 82..88 && y in 15..22 && z in 91..97 + } + + else -> { + false + } + } + } + + private fun renderDragonBoxes() { + if (!Config.dragonKillBox) return + if (!ScoreBoardUtils.isInM7) return + if (mc.thePlayer.positionVector.yCoord > 45) return + // Blue + WorldRenderUtils.drawCustomBox(71.5, 25.0, 16.0, 10.0, 82.5, 25.0, Color(0, 170, 170, 255), 3f, phase = false) + // Purple + WorldRenderUtils.drawCustomBox(45.5, 23.0, 13.0, 10.0, 113.5, 23.0, Color(170, 0, 170, 255), 3f, phase = false) + // Green + WorldRenderUtils.drawCustomBox(7.0, 30.0, 8.0, 20.0, 80.0, 30.0, Color(85, 255, 85, 255), 3f, phase = false) + // Red + WorldRenderUtils.drawCustomBox(14.5, 25.0, 13.0, 15.0, 45.5, 25.0, Color(255, 85, 85, 255), 3f, phase = false) + // Orange + WorldRenderUtils.drawCustomBox(72.0, 30.0, 8.0, 20.0, 47.0, 30.0, Color(255, 170, 0, 255), 3f, phase = false) + } + }
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/features/DungeonLeap.kt b/src/main/kotlin/dulkirmod/features/DungeonLeap.kt index d1be829..bfbfe50 100644 --- a/src/main/kotlin/dulkirmod/features/DungeonLeap.kt +++ b/src/main/kotlin/dulkirmod/features/DungeonLeap.kt @@ -9,52 +9,46 @@ import net.minecraft.inventory.Slot import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent -class DungeonLeap { - - - private var lastGuiOpenEvent: Long = 0 - - @SubscribeEvent - fun onTick(event: TickEvent.ClientTickEvent) { - val lastInLeap = inLeapMenuBool - - if (!Config.highlightLeap) return - if (mc.currentScreen == null || mc.currentScreen !is GuiChest) { - inLeapMenuBool = false - return - } - inLeapMenuBool = (ContainerNameUtil.currentGuiChestName == "Spirit Leap") - - if (inLeapMenuBool && !lastInLeap) { - lastGuiOpenEvent = System.currentTimeMillis() - } - - if (inLeapMenuBool && System.currentTimeMillis() - lastGuiOpenEvent < 300) { - for (i in 11..15) { - boolArray[i - 11] = false - val slotIn = mc.thePlayer.openContainer.getSlot(i) - - if (slotIn.stack == null) continue - val stack = slotIn.stack - if (Utils.stripColorCodes(stack.displayName).lowercase() == Config.highlightLeapName.lowercase()) boolArray[i - 11] = true - } - } - } - - companion object { - var inLeapMenuBool: Boolean = false - var boolArray = BooleanArray(5) { false } - - fun inLeapMenu(): Boolean { - return inLeapMenuBool - } - - fun isHighlightedLeapPlayer(slotIn: Slot): Boolean { - if (!inLeapMenuBool) return false - if (slotIn.inventory == mc.thePlayer.inventory) return false - val slotIndex = slotIn.slotIndex - if (slotIndex !in 11..15) return false - return boolArray[slotIndex - 11] - } - } +object DungeonLeap { + var inLeapMenu = false + var leapPlayers = BooleanArray(5) { false } + + private var lastGuiOpenEvent = 0L + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + val lastInLeap = inLeapMenu + + if (!Config.highlightLeap) return + if (mc.currentScreen == null || mc.currentScreen !is GuiChest) { + inLeapMenu = false + return + } + inLeapMenu = (ContainerNameUtil.currentGuiChestName == "Spirit Leap") + + if (inLeapMenu && !lastInLeap) { + lastGuiOpenEvent = System.currentTimeMillis() + } + + if (inLeapMenu && System.currentTimeMillis() - lastGuiOpenEvent < 300) { + for (i in 11..15) { + leapPlayers[i - 11] = false + val slotIn = mc.thePlayer.openContainer.getSlot(i) + + if (slotIn.stack == null) continue + val stack = slotIn.stack + if (Utils.stripColorCodes(stack.displayName).equals(Config.highlightLeapName, true)) { + leapPlayers[i - 11] = true + } + } + } + } + + fun isHighlightedLeapPlayer(slotIn: Slot): Boolean { + if (!inLeapMenu) return false + if (slotIn.inventory == mc.thePlayer.inventory) return false + val slotIndex = slotIn.slotIndex + if (slotIndex !in 11..15) return false + return leapPlayers[slotIndex - 11] + } }
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/features/GardenVisitorAlert.kt b/src/main/kotlin/dulkirmod/features/GardenVisitorAlert.kt index b3113bd..8bcd145 100644 --- a/src/main/kotlin/dulkirmod/features/GardenVisitorAlert.kt +++ b/src/main/kotlin/dulkirmod/features/GardenVisitorAlert.kt @@ -3,9 +3,10 @@ package dulkirmod.features import dulkirmod.DulkirMod import dulkirmod.config.Config import dulkirmod.utils.TabListUtils +import dulkirmod.utils.TitleUtils import dulkirmod.utils.Utils -class GardenVisitorAlert { +object GardenVisitorAlert { private var hasSentAlert = false private var lastAlert = 0 @@ -19,7 +20,7 @@ class GardenVisitorAlert { if (TabListUtils.maxVisitors && !hasSentAlert) { val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Max Visitors", 5000) + TitleUtils.drawStringForTime("${color}Max Visitors", 5000) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .3f) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .6f) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .9f) @@ -32,7 +33,7 @@ class GardenVisitorAlert { if (TabListUtils.maxVisitors && hasSentAlert && timeSinceLastAlert > 5000 && Config.persistentAlert) { lastAlert = System.currentTimeMillis().toInt() val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Max Visitors", 5000) + TitleUtils.drawStringForTime("${color}Max Visitors", 5000) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .3f) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .6f) DulkirMod.mc.thePlayer.playSound("note.pling", 1f * Config.bestiaryNotifVol, .9f) diff --git a/src/main/kotlin/dulkirmod/features/KeeperWaypoints.kt b/src/main/kotlin/dulkirmod/features/KeeperWaypoints.kt index 6e47a59..c65b3dd 100644 --- a/src/main/kotlin/dulkirmod/features/KeeperWaypoints.kt +++ b/src/main/kotlin/dulkirmod/features/KeeperWaypoints.kt @@ -10,7 +10,7 @@ import net.minecraftforge.client.event.RenderWorldLastEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.math.max -class KeeperWaypoints { +object KeeperWaypoints { @SubscribeEvent fun onWorldRenderLast(event: RenderWorldLastEvent) { if (!Config.keeperWaypoints) return diff --git a/src/main/kotlin/dulkirmod/features/MatchoAlert.kt b/src/main/kotlin/dulkirmod/features/MatchoAlert.kt index db51a48..50f433e 100644 --- a/src/main/kotlin/dulkirmod/features/MatchoAlert.kt +++ b/src/main/kotlin/dulkirmod/features/MatchoAlert.kt @@ -3,9 +3,10 @@ package dulkirmod.features import dulkirmod.DulkirMod import dulkirmod.config.Config import dulkirmod.utils.TabListUtils +import dulkirmod.utils.TitleUtils import dulkirmod.utils.Utils -class MatchoAlert { +object MatchoAlert { var hasSentAlert = false @@ -19,7 +20,7 @@ class MatchoAlert { if (TabListUtils.explosivity && !hasSentAlert) { val color = Utils.getColorString(Config.bestiaryNotifColor) - DulkirMod.titleUtils.drawStringForTime("${color}Matcho", 5000) + TitleUtils.drawStringForTime("${color}Matcho", 5000) if (Config.bestiaryAlertSounds) DulkirMod.mc.thePlayer.playSound("mob.villager.yes", 1f * Config.bestiaryNotifVol, 0f) hasSentAlert = true diff --git a/src/main/kotlin/dulkirmod/features/MemoryLeakFix.kt b/src/main/kotlin/dulkirmod/features/MemoryLeakFix.kt new file mode 100644 index 0000000..a4dfc9b --- /dev/null +++ b/src/main/kotlin/dulkirmod/features/MemoryLeakFix.kt @@ -0,0 +1,34 @@ +package dulkirmod.features + +import dulkirmod.DulkirMod.Companion.mc +import dulkirmod.config.Config +import net.minecraft.entity.Entity +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +object MemoryLeakFix { + var lastClear = System.currentTimeMillis() + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!Config.crimsonIslesMemoryLeakPatch) return + + if (System.currentTimeMillis() - lastClear >= 30000L) { + val world = mc.theWorld ?: return + val currentEnts = world.playerEntities.toMutableList() + currentEnts.forEach { + if (it.isDead) { + world.playerEntities.remove(it) + } + if (isNullVec(it)) { + world.removeEntityFromWorld(it.entityId) + } + } + lastClear = System.currentTimeMillis() + } + } + + private fun isNullVec(entity: Entity): Boolean { + return entity.posX == 0.0 && entity.posY == 0.0 && entity.posZ == 0.0 + } +}
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/features/chat/AbiphoneDND.kt b/src/main/kotlin/dulkirmod/features/chat/AbiphoneDND.kt index a6a0ab6..9b429cb 100644 --- a/src/main/kotlin/dulkirmod/features/chat/AbiphoneDND.kt +++ b/src/main/kotlin/dulkirmod/features/chat/AbiphoneDND.kt @@ -10,7 +10,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent private val abiphoneFormat = "✆ (\\w+) ✆ ".toRegex() private var lastRing: Long = 0 -class AbiphoneDND { +object AbiphoneDND { //BLOCK ABIPHONE SOUNDS @SubscribeEvent(receiveCanceled = false, priority = EventPriority.LOW) fun onSound(event: PlaySoundEvent) { @@ -22,24 +22,22 @@ class AbiphoneDND { } } - companion object { - fun handle(event: ClientChatReceivedEvent, unformatted: String) { - if (!Config.abiDND) return - if (unformatted matches abiphoneFormat) { - val matchResult = abiphoneFormat.find(unformatted) - event.isCanceled = true - lastRing = System.currentTimeMillis() - if (Config.abiCallerID) { - val blocked = if (Math.random() < .001) "Breefing" - else matchResult?.groups?.get(1)?.value - TextUtils.info("§6Call blocked from $blocked!") - } - } - if (unformatted.startsWith("✆ Ring...") && unformatted.endsWith("[PICK UP]") - && System.currentTimeMillis() - lastRing < 5000 - ) { - event.isCanceled = true + fun handle(event: ClientChatReceivedEvent, unformatted: String) { + if (!Config.abiDND) return + if (unformatted matches abiphoneFormat) { + val matchResult = abiphoneFormat.find(unformatted) + event.isCanceled = true + lastRing = System.currentTimeMillis() + if (Config.abiCallerID) { + val blocked = if (Math.random() < .001) "Breefing" + else matchResult?.groups?.get(1)?.value + TextUtils.info("§6Call blocked from $blocked!") } } + if (unformatted.startsWith("✆ Ring...") && unformatted.endsWith("[PICK UP]") + && System.currentTimeMillis() - lastRing < 5000 + ) { + event.isCanceled = true + } } }
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/features/chat/FakeMsg.kt b/src/main/kotlin/dulkirmod/features/chat/FakeMsg.kt index 8e4d2dd..ca78dae 100644 --- a/src/main/kotlin/dulkirmod/features/chat/FakeMsg.kt +++ b/src/main/kotlin/dulkirmod/features/chat/FakeMsg.kt @@ -6,9 +6,9 @@ import net.minecraftforge.client.event.ClientChatReceivedEvent object FakeMsg { private val dulkirRegex = "^From \\[MVP(\\+|\\+\\+)] Dulkir: c:".toRegex() fun handle(event: ClientChatReceivedEvent, unformatted: String) { - if (dulkirRegex.matches(unformatted)) { + if (unformatted.contains(dulkirRegex)) { event.isCanceled = true - val message = unformatted.replace(dulkirRegex, "").replace("&", "§") + val message = unformatted.replace(dulkirRegex, "").replace("&", "§").trim() TextUtils.info(message, false) } } diff --git a/src/main/kotlin/dulkirmod/utils/ContainerNameUtil.kt b/src/main/kotlin/dulkirmod/utils/ContainerNameUtil.kt index 706bcea..d067675 100644 --- a/src/main/kotlin/dulkirmod/utils/ContainerNameUtil.kt +++ b/src/main/kotlin/dulkirmod/utils/ContainerNameUtil.kt @@ -6,16 +6,14 @@ import net.minecraft.inventory.ContainerChest import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent -class ContainerNameUtil { - @SubscribeEvent - fun onTick(event: TickEvent.ClientTickEvent) { - if (mc.currentScreen !is GuiChest) return - val chest = mc.currentScreen as GuiChest - val container = chest.inventorySlots as ContainerChest - currentGuiChestName = container.lowerChestInventory.displayName.unformattedText - } +object ContainerNameUtil { + var currentGuiChestName = "" - companion object { - var currentGuiChestName = "" - } + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + val chest = mc.currentScreen + if (chest !is GuiChest) return + val container = chest.inventorySlots as ContainerChest + currentGuiChestName = container.lowerChestInventory.displayName.unformattedText + } }
\ No newline at end of file diff --git a/src/main/kotlin/dulkirmod/utils/TitleUtils.kt b/src/main/kotlin/dulkirmod/utils/TitleUtils.kt index b7399c3..8932878 100644 --- a/src/main/kotlin/dulkirmod/utils/TitleUtils.kt +++ b/src/main/kotlin/dulkirmod/utils/TitleUtils.kt @@ -8,7 +8,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.math.min -class TitleUtils { +object TitleUtils { var curString = "" var endTime: Long = 0 diff --git a/src/main/kotlin/dulkirmod/utils/Utils.kt b/src/main/kotlin/dulkirmod/utils/Utils.kt index 2ae50cc..ce19b32 100644 --- a/src/main/kotlin/dulkirmod/utils/Utils.kt +++ b/src/main/kotlin/dulkirmod/utils/Utils.kt @@ -11,60 +11,54 @@ import java.awt.datatransfer.StringSelection import java.util.* object Utils { - fun stripColorCodes(string: String): String { - return string.replace("§.".toRegex(), "") - } + fun stripColorCodes(string: String): String { + return string.replace("§.".toRegex(), "") + } - fun animationConfigToString() { - var s = "" - var gson = Gson() - var jsonString = gson.toJson(ConfigData()) - s = Base64.getEncoder().encodeToString(jsonString.toByteArray()) - // set clipboard - val selection = StringSelection(s) - val clipboard: Clipboard = Toolkit.getDefaultToolkit().systemClipboard - clipboard.setContents(selection, selection) - } + fun animationConfigToString() { + var s = "" + var gson = Gson() + var jsonString = gson.toJson(ConfigData()) + s = Base64.getEncoder().encodeToString(jsonString.toByteArray()) + // set clipboard + val selection = StringSelection(s) + val clipboard: Clipboard = Toolkit.getDefaultToolkit().systemClipboard + clipboard.setContents(selection, selection) + } - fun animationStringtoConfig() { - val gson = Gson() - val clipboard: Clipboard = Toolkit.getDefaultToolkit().systemClipboard - val base64 = clipboard.getData(DataFlavor.stringFlavor) as String - try { - val jsonString = String(Base64.getDecoder().decode(base64)) - val import = gson.fromJson(jsonString, ConfigData::class.java) - Config.customSize = import.size - Config.customSpeed = import.speed - Config.doesScaleSwing = import.scaleSwing - Config.customX = import.x - Config.customY = import.y - Config.customZ = import.z - Config.customYaw = import.yaw - Config.customPitch = import.pitch - Config.customRoll = import.roll - Config.drinkingSelector = import.drinkingFix - Config.ignoreHaste = import.ignoreHaste - } catch (e: Exception) { - TextUtils.info("§6§lCurrent clipboard is not a recognizable Custom Animation Preset.") - } - mc.displayGuiScreen(null) - } + fun animationStringtoConfig() { + val gson = Gson() + val clipboard = Toolkit.getDefaultToolkit().systemClipboard + val base64 = clipboard.getData(DataFlavor.stringFlavor) as String + try { + val jsonString = String(Base64.getDecoder().decode(base64)) + val import = gson.fromJson(jsonString, ConfigData::class.java) + Config.customSize = import.size + Config.customSpeed = import.speed + Config.doesScaleSwing = import.scaleSwing + Config.customX = import.x + Config.customY = import.y + Config.customZ = import.z + Config.customYaw = import.yaw + Config.customPitch = import.pitch + Config.customRoll = import.roll + Config.drinkingSelector = import.drinkingFix + Config.ignoreHaste = import.ignoreHaste + } catch (e: Exception) { + TextUtils.info("§6§lCurrent clipboard is not a recognizable Custom Animation Preset.") + } + mc.displayGuiScreen(null) + } - fun isInSkyblock(): Boolean { - if ((mc.theWorld != null) && (mc.thePlayer != null)) { - if (mc.isSingleplayer || mc.thePlayer.clientBrand == null || - !mc.thePlayer.clientBrand.lowercase(Locale.getDefault()).contains("hypixel") - ) { - return false - } - if (mc.thePlayer.worldScoreboard.getObjectiveInDisplaySlot(1) == null) - return false - return stripColorCodes(mc.thePlayer.worldScoreboard.getObjectiveInDisplaySlot(1).displayName).contains("SKYBLOCK") - } - return false - } + fun isInSkyblock(): Boolean { + if (mc.theWorld == null || mc.thePlayer == null) return false + if (mc.isSingleplayer) return false + if (mc.thePlayer.clientBrand?.contains("hypixel", true) == false) return false + val objective = mc.thePlayer.worldScoreboard.getObjectiveInDisplaySlot(1) ?: return false + return stripColorCodes(objective.displayName).contains("skyblock", true) + } - fun getColorString(int: Int): String { - return if (int == 16) "§z" else EnumChatFormatting.values()[int].toString() - } + fun getColorString(int: Int): String { + return if (int == 16) "§z" else EnumChatFormatting.values()[int].toString() + } }
\ No newline at end of file |