diff options
Diffstat (limited to 'src/main/kotlin/com/ambientaddons')
19 files changed, 231 insertions, 56 deletions
diff --git a/src/main/kotlin/com/ambientaddons/AmbientAddons.kt b/src/main/kotlin/com/ambientaddons/AmbientAddons.kt index a7c6458..f0ecfcf 100644 --- a/src/main/kotlin/com/ambientaddons/AmbientAddons.kt +++ b/src/main/kotlin/com/ambientaddons/AmbientAddons.kt @@ -1,6 +1,7 @@ import com.ambientaddons.commands.AmbientCommand import com.ambientaddons.config.Config import com.ambientaddons.config.PersistentData +import com.ambientaddons.features.Trapper import com.ambientaddons.features.display.WitherShieldOverlay import com.ambientaddons.features.dungeon.* import com.ambientaddons.features.dungeon.terminals.MelodyHelper @@ -9,7 +10,7 @@ import com.ambientaddons.features.keybinds.PerspectiveKeybind import com.ambientaddons.features.keybinds.SendLastMessageKeybind import com.ambientaddons.features.misc.CancelInteractions import com.ambientaddons.features.misc.KuudraReady -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.dungeon.DungeonPlayers import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiScreen @@ -50,7 +51,7 @@ class AmbientAddons { ClientCommandHandler.instance.registerCommand(AmbientCommand()) listOf( this, - SkyBlock, + SBLocation, AutoBuyChest, CloseChest, CancelInteractions, @@ -63,7 +64,8 @@ class AmbientAddons { MelodyHelper, WitherShieldOverlay, KuudraReady, - DungeonHighlights + DungeonHighlights, + Trapper ).forEach(MinecraftForge.EVENT_BUS::register) keyBinds.values.forEach(ClientRegistry::registerKeyBinding) } diff --git a/src/main/kotlin/com/ambientaddons/commands/AmbientCommand.kt b/src/main/kotlin/com/ambientaddons/commands/AmbientCommand.kt index c09998e..e86f137 100644 --- a/src/main/kotlin/com/ambientaddons/commands/AmbientCommand.kt +++ b/src/main/kotlin/com/ambientaddons/commands/AmbientCommand.kt @@ -3,7 +3,7 @@ package com.ambientaddons.commands import AmbientAddons import com.ambientaddons.config.Config import com.ambientaddons.utils.Extensions.withModPrefix -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import gg.essential.universal.UChat import net.minecraft.command.CommandBase import net.minecraft.command.ICommandSender @@ -20,7 +20,7 @@ class AmbientCommand : CommandBase() { override fun processCommand(sender: ICommandSender?, args: Array<String>) { when (args.getOrNull(0)) { null -> AmbientAddons.currentGui = Config.gui() - "location" -> UChat.chat(SkyBlock.toString().withModPrefix()) + "location" -> UChat.chat(SBLocation.toString().withModPrefix()) "buy" -> AutoBuyCommand.processCommand(args.drop(1)) else -> UChat.chat("§cUnknown argument!") } diff --git a/src/main/kotlin/com/ambientaddons/config/Config.kt b/src/main/kotlin/com/ambientaddons/config/Config.kt index 00017c3..9035f6e 100644 --- a/src/main/kotlin/com/ambientaddons/config/Config.kt +++ b/src/main/kotlin/com/ambientaddons/config/Config.kt @@ -10,6 +10,8 @@ object Config : Vigilant( ) { var kuudraReady = false + var autoTrapper = false + var trapperEsp = false var batHighlight = 0 var batColor = Color.CYAN @@ -20,8 +22,6 @@ object Config : Vigilant( var bestiaryHighlight = 0 var bestiaryColor = Color.MAGENTA - - var blockLowReroll = false var autoBuyChest = 0 var autoReady = 0 @@ -41,11 +41,25 @@ object Config : Vigilant( init { category("Misc") { - switch( - ::kuudraReady, - name = "Automatically ready in Kuudra", - description = "Automatically clicks the ready pane when the ready GUI is opened." - ) + subcategory("Kuudra") { + switch( + ::kuudraReady, + name = "Automatically ready in Kuudra", + description = "Automatically clicks the ready pane when the ready GUI is opened." + ) + } + subcategory("Trevor the Trapper") { + switch( + ::autoTrapper, + name = "Automatically start trapper quests", + description = "Automatically performs the useless chat message click. This is analogous to SBE's crystal hollows renew feature." + ) + switch( + ::trapperEsp, + name = "Highlight trapper animals", + description = "Highlights trapper quests with a beacon beam and box. Legal, as Hypixel uses the glowing status effect for clients that support it." + ) + } } category("Highlights") { diff --git a/src/main/kotlin/com/ambientaddons/features/Trapper.kt b/src/main/kotlin/com/ambientaddons/features/Trapper.kt new file mode 100644 index 0000000..184358a --- /dev/null +++ b/src/main/kotlin/com/ambientaddons/features/Trapper.kt @@ -0,0 +1,71 @@ +package com.ambientaddons.features + +import AmbientAddons.Companion.config +import AmbientAddons.Companion.mc +import com.ambientaddons.utils.Area +import com.ambientaddons.utils.SBLocation +import com.ambientaddons.utils.render.EntityUtils +import net.minecraft.entity.Entity +import net.minecraft.entity.EntityLiving +import net.minecraft.entity.passive.* +import net.minecraftforge.client.event.ClientChatReceivedEvent +import net.minecraftforge.client.event.RenderWorldLastEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.awt.Color + +object Trapper { + private var color: Color? = null + private val trapperRegex = + Regex("^§e\\[NPC\\] Trevor The Trapper§f: §rYou can find your §(?<color>[0-9a-f])\\w+ §fanimal near the §(?<locationColor>[0-9a-f])(?<location>[\\w ]+)§f.§r$") + private val animals = + listOf(EntityCow::class, EntityPig::class, EntitySheep::class, EntityCow::class, EntityChicken::class, EntityRabbit::class) + private val animalHp: List<Float?> = listOf(100F, 200F, 500F, 1000F, 1024F, 2048F) + + fun isTrapperAnimal(entity: Entity): Boolean = + entity.ticksExisted >= 10 && (entity::class in animals) && animalHp.contains((entity as? EntityLiving)?.maxHealth) + + @SubscribeEvent + fun onChat(event: ClientChatReceivedEvent) { + if (SBLocation.area != Area.FarmingIslands || event.message == null || event.type == 2.toByte()) return + if (config.autoTrapper) { + val siblings = event.message.siblings ?: return + if (siblings.getOrNull(0)?.unformattedText == "Accept the trapper's task to hunt the animal?") { + val command = siblings.getOrNull(3)?.chatStyle?.chatClickEvent?.value ?: return + mc.thePlayer.sendChatMessage(command) + } + } + val matchResult = event.message.formattedText.let { trapperRegex.find(it) } + if (matchResult != null) { + val colorCode = (matchResult.groups as? MatchNamedGroupCollection)?.get("color")?.value ?: return + color = Color(mc.fontRendererObj.getColorCode(colorCode.single())) + } else if ( + event.message.formattedText.startsWith("§r§aKilling the animal rewarded you ") || + event.message.formattedText.startsWith("§r§aYour mob died randomly, you are rewarded ") + ) { + color = null + } + } + + @SubscribeEvent + fun onRenderWorld(event: RenderWorldLastEvent) { + if (SBLocation.area != Area.FarmingIslands || !config.trapperEsp) return + mc.theWorld.loadedEntityList.forEach { + if (color != null && isTrapperAnimal(it)) { + val renderManager = mc.renderManager + val x = it.lastTickPosX + (it.posX - it.lastTickPosX) * event.partialTicks - renderManager.viewerPosX - 0.5 + val y = it.lastTickPosY + (it.posY - it.lastTickPosY) * event.partialTicks - renderManager.viewerPosY + val z = it.lastTickPosZ + (it.posZ - it.lastTickPosZ) * event.partialTicks - renderManager.viewerPosZ - 0.5 + val entityHeight = it.entityBoundingBox.maxY - it.entityBoundingBox.minY + EntityUtils.drawEntityBox( + it, + color!!, + outline = true, + fill = true, + partialTicks = event.partialTicks, + esp = true + ) + EntityUtils.renderBeaconBeam(x, y + entityHeight, z, color!!, 1F, event.partialTicks, true) + } + } + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/ambientaddons/features/display/WitherShieldOverlay.kt b/src/main/kotlin/com/ambientaddons/features/display/WitherShieldOverlay.kt index fa210aa..85801aa 100644 --- a/src/main/kotlin/com/ambientaddons/features/display/WitherShieldOverlay.kt +++ b/src/main/kotlin/com/ambientaddons/features/display/WitherShieldOverlay.kt @@ -4,7 +4,7 @@ import AmbientAddons.Companion.config import AmbientAddons.Companion.mc import com.ambientaddons.utils.Alignment import com.ambientaddons.utils.render.OverlayUtils -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.dungeon.TextStyle import net.minecraft.client.gui.ScaledResolution import net.minecraftforge.client.event.ClientChatReceivedEvent @@ -19,7 +19,7 @@ object WitherShieldOverlay { @SubscribeEvent fun onRenderOverlay(event: RenderGameOverlayEvent) { if (event.type != RenderGameOverlayEvent.ElementType.TEXT) return - if (!SkyBlock.inSkyblock || config.witherShieldDisplay == 0) return + if (!SBLocation.inSkyblock || config.witherShieldDisplay == 0) return val diff = ((witherImpactEndTime - System.currentTimeMillis()) / 1000.0).takeIf { it >= 0 } ?: return val display = ceil(diff).roundToInt().toString() val resolution = ScaledResolution(mc) @@ -31,7 +31,7 @@ object WitherShieldOverlay { @SubscribeEvent fun onChat(event: ClientChatReceivedEvent) { - if (!SkyBlock.inSkyblock || config.witherShieldDisplay == 0) return + if (!SBLocation.inSkyblock || config.witherShieldDisplay == 0) return if (event.type == 2.toByte() && event.message.unformattedText.contains("Wither Impact")) { if (((witherImpactEndTime - System.currentTimeMillis()) / 1000.0) < 0) { witherImpactEndTime = System.currentTimeMillis() + 5000 diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/AutoBuyChest.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/AutoBuyChest.kt index 279402d..f1cd74f 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/AutoBuyChest.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/AutoBuyChest.kt @@ -12,7 +12,7 @@ import com.ambientaddons.utils.Extensions.skyblockID import com.ambientaddons.utils.Extensions.stripControlCodes import com.ambientaddons.utils.Extensions.withModPrefix import com.ambientaddons.utils.Area -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import gg.essential.universal.UChat import net.minecraft.inventory.ContainerChest import net.minecraft.item.ItemStack @@ -35,7 +35,7 @@ object AutoBuyChest { @SubscribeEvent fun onSlotClick(event: GuiContainerEvent.SlotClickEvent) { - if (SkyBlock.area != Area.Dungeon || rewardChest == null) return + if (SBLocation.area != Area.Dungeon || rewardChest == null) return if (event.slotId == BUY_SLOT_INDEX) { hasOpenedChest = true if (rewardChest == RewardChest.Wood) { @@ -43,7 +43,7 @@ object AutoBuyChest { event.isCanceled = true } } else if (event.slotId == KISMET_SLOT_INDEX) { - if (config.blockLowReroll && rewardChest != RewardChest.Bedrock && (rewardChest != RewardChest.Obsidian || SkyBlock.dungeonFloor.toString() != "M4")) { + if (config.blockLowReroll && rewardChest != RewardChest.Bedrock && (rewardChest != RewardChest.Obsidian || SBLocation.dungeonFloor.toString() != "M4")) { UChat.chat("§cBlocked reroll! This low-tier chest should not be rerolled.".withModPrefix()) event.isCanceled = true return @@ -58,11 +58,9 @@ object AutoBuyChest { } } - - @SubscribeEvent fun onGuiOpen(event: GuiOpenEvent) { - if (SkyBlock.area != Area.Dungeon) return + if (SBLocation.area != Area.Dungeon) return if (event.gui == null) return val chest = event.gui.chest val chestName = chest?.lowerChestInventory?.name @@ -82,7 +80,7 @@ object AutoBuyChest { @SubscribeEvent fun onGuiDraw(event: GuiScreenEvent.DrawScreenEvent) { - if (SkyBlock.area != Area.Dungeon || config.autoBuyChest != 2 || rewardChest == null || hasLookedAtChest) return + if (SBLocation.area != Area.Dungeon || config.autoBuyChest != 2 || rewardChest == null || hasLookedAtChest) return val chest = event.gui?.chest ?: return if (rewardChest == RewardChest.Wood) { if (!hasOpenedChest) openChest(chest) diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/CloseChest.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/CloseChest.kt index 571cd7f..0e996e1 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/CloseChest.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/CloseChest.kt @@ -4,7 +4,7 @@ import AmbientAddons.Companion.config import AmbientAddons.Companion.mc import com.ambientaddons.events.ReceivePacketEvent import com.ambientaddons.utils.Area -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import net.minecraft.network.play.client.C0DPacketCloseWindow import net.minecraft.network.play.server.S2DPacketOpenWindow import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -12,7 +12,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent object CloseChest { @SubscribeEvent fun onOpenWindow(event: ReceivePacketEvent) { - if (!config.closeSecretChests || SkyBlock.area != Area.Dungeon) return + if (!config.closeSecretChests || SBLocation.area != Area.Dungeon) return if (event.packet !is S2DPacketOpenWindow) return if (event.packet.windowTitle.unformattedText == "Chest") { mc.netHandler.networkManager.sendPacket(C0DPacketCloseWindow(event.packet.windowId)) diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonHighlights.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonHighlights.kt index 258d799..5019151 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonHighlights.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonHighlights.kt @@ -4,9 +4,8 @@ import AmbientAddons.Companion.config import AmbientAddons.Companion.mc import com.ambientaddons.utils.Area import com.ambientaddons.utils.Extensions.skyblockID -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.render.EntityUtils -import gg.essential.universal.UChat import net.minecraft.entity.Entity import net.minecraft.entity.boss.EntityWither import net.minecraft.entity.item.EntityArmorStand @@ -25,20 +24,20 @@ import java.util.* object DungeonHighlights { private val markedArmorStands = mutableSetOf<EntityArmorStand>() private val starredMobs = mutableSetOf<Entity>() - private var nearIdkmansry = false + private var nearIdkmansry = false private val idkmansry = UUID.fromString("93ce1cad-833f-46ff-a124-b66d2b99c4fd") @SubscribeEvent fun onWorldUnload(event: WorldEvent.Unload) { markedArmorStands.clear() starredMobs.clear() + nearIdkmansry = false } @SubscribeEvent fun onRenderWorld(event: RenderWorldLastEvent) { - if (SkyBlock.area != Area.Dungeon) return - nearIdkmansry = false + if (SBLocation.area != Area.Dungeon) return mc.theWorld.loadedEntityList.forEach { entity -> if (entity is EntityArmorStand && entity.customNameTag.contains("✯") && !markedArmorStands.contains(entity)) { if (config.starredHighlight == 0) return@forEach diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonReady.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonReady.kt index 3defe7c..76488b1 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonReady.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/DungeonReady.kt @@ -6,9 +6,8 @@ import com.ambientaddons.utils.Extensions.chest import com.ambientaddons.utils.Extensions.items import com.ambientaddons.utils.Extensions.stripControlCodes import com.ambientaddons.utils.Area -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.dungeon.DungeonPlayers -import gg.essential.universal.UChat import net.minecraftforge.client.event.GuiScreenEvent import net.minecraftforge.event.world.WorldEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -28,7 +27,7 @@ object DungeonReady { @SubscribeEvent fun onGuiDraw(event: GuiScreenEvent.DrawScreenEvent) { - if (config.autoReady == 0 || SkyBlock.area != Area.Dungeon) return + if (config.autoReady == 0 || SBLocation.area != Area.Dungeon) return val chest = event.gui?.chest ?: return val chestName = chest.lowerChestInventory.name if (chestName == "Start Dungeon?" && !hasClickedStart) { diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/IgnoreCarpet.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/IgnoreCarpet.kt index 6f2281e..438ad67 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/IgnoreCarpet.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/IgnoreCarpet.kt @@ -1,11 +1,11 @@ package com.ambientaddons.features.dungeon import AmbientAddons.Companion.config -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation object IgnoreCarpet { fun shouldIgnoreCarpet(): Boolean { - if (!SkyBlock.inSkyblock) return false + if (!SBLocation.inSkyblock) return false return if (AmbientAddons.isInitialized()) config.ignoreCarpet else false } }
\ No newline at end of file diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/ShortbowClicker.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/ShortbowClicker.kt index 9ff5d48..7cce15d 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/ShortbowClicker.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/ShortbowClicker.kt @@ -3,7 +3,7 @@ package com.ambientaddons.features.dungeon import AmbientAddons.Companion.config import AmbientAddons.Companion.mc import com.ambientaddons.utils.Extensions.skyblockID -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import net.minecraftforge.client.event.RenderWorldLastEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.math.roundToLong @@ -15,7 +15,7 @@ object ShortbowClicker { @SubscribeEvent fun onRender(event: RenderWorldLastEvent) { - if (!SkyBlock.inSkyblock) return + if (!SBLocation.inSkyblock) return if (config.terminatorCps == 0) return if (!mc.gameSettings.keyBindUseItem.isKeyDown) return val itemStack = mc.thePlayer?.inventory?.getCurrentItem() diff --git a/src/main/kotlin/com/ambientaddons/features/dungeon/terminals/MelodyHelper.kt b/src/main/kotlin/com/ambientaddons/features/dungeon/terminals/MelodyHelper.kt index 74b23e7..f867b3f 100644 --- a/src/main/kotlin/com/ambientaddons/features/dungeon/terminals/MelodyHelper.kt +++ b/src/main/kotlin/com/ambientaddons/features/dungeon/terminals/MelodyHelper.kt @@ -6,7 +6,7 @@ import com.ambientaddons.events.GuiContainerEvent import com.ambientaddons.utils.Extensions.chest import com.ambientaddons.utils.Extensions.items import com.ambientaddons.utils.Extensions.stripControlCodes -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import net.minecraftforge.client.event.ClientChatReceivedEvent import net.minecraftforge.client.event.GuiOpenEvent import net.minecraftforge.event.world.WorldEvent @@ -27,7 +27,7 @@ object MelodyHelper { @SubscribeEvent fun onChat(event: ClientChatReceivedEvent) { - if (SkyBlock.dungeonFloor?.floor != 7) return + if (SBLocation.dungeonFloor?.floor != 7) return val unformatted = event.message.unformattedText.stripControlCodes() if (completedStageRegex.matches(unformatted)) { hasSaidMeowlody = false @@ -44,7 +44,7 @@ object MelodyHelper { @SubscribeEvent fun onGuiOpen(event: GuiOpenEvent) { - if (SkyBlock.dungeonFloor?.floor != 7) return + if (SBLocation.dungeonFloor?.floor != 7) return if (event.gui == null) return if (event.gui.chest?.lowerChestInventory?.name == "Click the button on time!") { if (!hasSaidMeowlody && config.melodyAnnouncement.isNotBlank()) { @@ -56,7 +56,7 @@ object MelodyHelper { @SubscribeEvent fun onSlotClick(event: GuiContainerEvent.SlotClickEvent) { - if (SkyBlock.dungeonFloor?.floor != 7) return + if (SBLocation.dungeonFloor?.floor != 7) return val chest = event.gui.chest?.lowerChestInventory if (chest?.name != "Click the button on time!" || isThrottled) return val colors = chest.items.map { it?.itemDamage } diff --git a/src/main/kotlin/com/ambientaddons/features/keybinds/SendLastMessageKeybind.kt b/src/main/kotlin/com/ambientaddons/features/keybinds/SendLastMessageKeybind.kt index b7e5fad..9a0a4f9 100644 --- a/src/main/kotlin/com/ambientaddons/features/keybinds/SendLastMessageKeybind.kt +++ b/src/main/kotlin/com/ambientaddons/features/keybinds/SendLastMessageKeybind.kt @@ -3,7 +3,7 @@ package com.ambientaddons.features.keybinds import AmbientAddons.Companion.keyBinds import AmbientAddons.Companion.mc import com.ambientaddons.events.MessageSentEvent -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.InputEvent @@ -12,7 +12,7 @@ object SendLastMessageKeybind { @SubscribeEvent fun onSendChat(event: MessageSentEvent) { - if (!SkyBlock.onHypixel) return + if (!SBLocation.onHypixel) return if (event.message.startsWith("/pc", ignoreCase = true)) { lastMessage = event.message.runCatching { substring(4 until event.message.length) @@ -24,7 +24,7 @@ object SendLastMessageKeybind { @SubscribeEvent fun onKey(event: InputEvent.KeyInputEvent) { - if (!SkyBlock.onHypixel) return + if (!SBLocation.onHypixel) return if (keyBinds["spamKey"]!!.isPressed && lastMessage != null) { mc.thePlayer.sendChatMessage("/pc $lastMessage") } diff --git a/src/main/kotlin/com/ambientaddons/features/misc/BonzoMask.kt b/src/main/kotlin/com/ambientaddons/features/misc/BonzoMask.kt index b0689c4..2e8be9e 100644 --- a/src/main/kotlin/com/ambientaddons/features/misc/BonzoMask.kt +++ b/src/main/kotlin/com/ambientaddons/features/misc/BonzoMask.kt @@ -5,7 +5,7 @@ import AmbientAddons.Companion.mc import com.ambientaddons.events.ItemOverlayEvent import com.ambientaddons.utils.Extensions.skyblockID import com.ambientaddons.utils.Extensions.stripControlCodes -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.render.OverlayUtils import net.minecraftforge.client.event.ClientChatReceivedEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -21,7 +21,7 @@ object BonzoMask { @SubscribeEvent fun onChat(event: ClientChatReceivedEvent) { - if (!SkyBlock.inSkyblock) return + if (!SBLocation.inSkyblock) return val didMaskProc = when (event.message.unformattedText.stripControlCodes()) { secondWindString -> { spiritMaskProc = System.currentTimeMillis() @@ -44,7 +44,7 @@ object BonzoMask { @SubscribeEvent fun onRenderItemOverlay(event: ItemOverlayEvent) { - if (!SkyBlock.inSkyblock) return + if (!SBLocation.inSkyblock) return val durability = when (event.item?.skyblockID) { "BONZO_MASK" -> (System.currentTimeMillis() - bonzoMaskProc) / 180000.0 "STARRED_BONZO_MASK" -> (System.currentTimeMillis() - fraggedBonzoMaskProc) / 180000.0 diff --git a/src/main/kotlin/com/ambientaddons/features/misc/CancelInteractions.kt b/src/main/kotlin/com/ambientaddons/features/misc/CancelInteractions.kt index 60f0f8f..3deff17 100644 --- a/src/main/kotlin/com/ambientaddons/features/misc/CancelInteractions.kt +++ b/src/main/kotlin/com/ambientaddons/features/misc/CancelInteractions.kt @@ -3,7 +3,7 @@ package com.ambientaddons.features.misc import AmbientAddons.Companion.config import AmbientAddons.Companion.mc import com.ambientaddons.utils.Area -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import net.minecraft.init.Blocks import net.minecraftforge.event.entity.player.PlayerInteractEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -11,8 +11,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent object CancelInteractions { @SubscribeEvent fun onPlayerInteract(event: PlayerInteractEvent) { - if (!SkyBlock.inSkyblock) return - if (!config.cancelInteractions || SkyBlock.area == Area.PrivateIsland) return + if (!SBLocation.inSkyblock) return + if (!config.cancelInteractions || SBLocation.area == Area.PrivateIsland) return if (event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) { if (mc.theWorld?.getBlockState(event.pos)?.block == Blocks.hopper) { event.isCanceled = true diff --git a/src/main/kotlin/com/ambientaddons/features/misc/KuudraReady.kt b/src/main/kotlin/com/ambientaddons/features/misc/KuudraReady.kt index 469d6fe..d9be1dd 100644 --- a/src/main/kotlin/com/ambientaddons/features/misc/KuudraReady.kt +++ b/src/main/kotlin/com/ambientaddons/features/misc/KuudraReady.kt @@ -7,8 +7,7 @@ import com.ambientaddons.utils.Extensions.chest import com.ambientaddons.utils.Extensions.items import com.ambientaddons.utils.Extensions.lore import com.ambientaddons.utils.Extensions.stripControlCodes -import com.ambientaddons.utils.SkyBlock -import com.ambientaddons.utils.dungeon.DungeonPlayers +import com.ambientaddons.utils.SBLocation import net.minecraftforge.client.event.GuiScreenEvent import net.minecraftforge.event.world.WorldEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -23,7 +22,7 @@ object KuudraReady { @SubscribeEvent fun onGuiDraw(event: GuiScreenEvent.DrawScreenEvent) { - if (!config.kuudraReady || SkyBlock.area != Area.Kuudra) return + if (!config.kuudraReady || SBLocation.area != Area.Kuudra) return val chest = event.gui?.chest ?: return val chestName = chest.lowerChestInventory.name if (chestName == "Ready Up" && !hasClickedReady) { diff --git a/src/main/kotlin/com/ambientaddons/utils/SkyBlock.kt b/src/main/kotlin/com/ambientaddons/utils/SBLocation.kt index a6bbd57..bfd35eb 100644 --- a/src/main/kotlin/com/ambientaddons/utils/SkyBlock.kt +++ b/src/main/kotlin/com/ambientaddons/utils/SBLocation.kt @@ -6,7 +6,6 @@ import com.ambientaddons.utils.Extensions.cleanSB import com.ambientaddons.utils.Extensions.stripControlCodes import com.ambientaddons.utils.Extensions.substringBetween import com.ambientaddons.utils.TabListUtils.fetchTabEntries -import gg.essential.universal.UChat import net.minecraft.scoreboard.Score import net.minecraft.scoreboard.ScorePlayerTeam import net.minecraftforge.event.world.WorldEvent @@ -14,7 +13,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import net.minecraftforge.fml.common.network.FMLNetworkEvent -object SkyBlock { +object SBLocation { private var areaRegex = Regex("^(?:Area|Dungeon): ([\\w ].+)\$") var onHypixel = false var inSkyblock = false diff --git a/src/main/kotlin/com/ambientaddons/utils/dungeon/DungeonPlayers.kt b/src/main/kotlin/com/ambientaddons/utils/dungeon/DungeonPlayers.kt index e57443d..b10c58a 100644 --- a/src/main/kotlin/com/ambientaddons/utils/dungeon/DungeonPlayers.kt +++ b/src/main/kotlin/com/ambientaddons/utils/dungeon/DungeonPlayers.kt @@ -2,7 +2,7 @@ package com.ambientaddons.utils.dungeon import com.ambientaddons.utils.Extensions.stripControlCodes import com.ambientaddons.utils.Area -import com.ambientaddons.utils.SkyBlock +import com.ambientaddons.utils.SBLocation import com.ambientaddons.utils.TabListUtils import com.ambientaddons.utils.text import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -16,7 +16,7 @@ object DungeonPlayers { @SubscribeEvent fun onTick(event: ClientTickEvent) { - if (SkyBlock.area != Area.Dungeon) return + if (SBLocation.area != Area.Dungeon) return if (ticks % 10 == 0) { val rawPlayers = TabListUtils.fetchTabEntries().let { tabEntries -> playerSlots.map { tabEntries[it].text.stripControlCodes() } diff --git a/src/main/kotlin/com/ambientaddons/utils/render/EntityUtils.kt b/src/main/kotlin/com/ambientaddons/utils/render/EntityUtils.kt index b3abbcf..c5bc2e9 100644 --- a/src/main/kotlin/com/ambientaddons/utils/render/EntityUtils.kt +++ b/src/main/kotlin/com/ambientaddons/utils/render/EntityUtils.kt @@ -1,14 +1,21 @@ package com.ambientaddons.utils.render import AmbientAddons.Companion.mc +import net.minecraft.client.Minecraft +import net.minecraft.client.renderer.GlStateManager import net.minecraft.client.renderer.Tessellator import net.minecraft.client.renderer.vertex.DefaultVertexFormats import net.minecraft.entity.Entity import net.minecraft.entity.player.EntityPlayer import net.minecraft.util.AxisAlignedBB import net.minecraft.util.BlockPos +import net.minecraft.util.MathHelper +import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11.* import java.awt.Color +import kotlin.math.cos +import kotlin.math.sin + // diretly stolen from Harry282/Skyblock-Client object EntityUtils { @@ -145,6 +152,93 @@ object EntityUtils { glPopMatrix() } + private val beaconBeam = ResourceLocation("textures/entity/beacon_beam.png") + + // from Moulberry/NotEnoughUpdates under LGPL 3.0, presumably from Mojang + fun renderBeaconBeam( + x: Double, y: Double, z: Double, color: Color, alpha: Float, + partialTicks: Float, esp: Boolean + ) { + val rgb = color.rgb + val height = 300 + val bottomOffset = 0 + val topOffset = bottomOffset + height + val tessellator = Tessellator.getInstance() + val worldrenderer = tessellator.worldRenderer + if (esp) { + GlStateManager.disableDepth() + } + Minecraft.getMinecraft().textureManager.bindTexture(beaconBeam) + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT.toFloat()) + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT.toFloat()) + GlStateManager.disableLighting() + GlStateManager.enableCull() + GlStateManager.enableTexture2D() + GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ZERO) + GlStateManager.enableBlend() + GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO) + val time = Minecraft.getMinecraft().theWorld.totalWorldTime + partialTicks.toDouble() + val d1 = MathHelper.func_181162_h(-time * 0.2 - MathHelper.floor_double(-time * 0.1).toDouble()) + val r = (rgb shr 16 and 0xFF) / 255f + val g = (rgb shr 8 and 0xFF) / 255f + val b = (rgb and 0xFF) / 255f + val d2 = time * 0.025 * -1.5 + val d4 = 0.5 + cos(d2 + 2.356194490192345) * 0.2 + val d5 = 0.5 + sin(d2 + 2.356194490192345) * 0.2 + val d6 = 0.5 + cos(d2 + Math.PI / 4.0) * 0.2 + val d7 = 0.5 + sin(d2 + Math.PI / 4.0) * 0.2 + val d8 = 0.5 + cos(d2 + 3.9269908169872414) * 0.2 + val d9 = 0.5 + sin(d2 + 3.9269908169872414) * 0.2 + val d10 = 0.5 + cos(d2 + 5.497787143782138) * 0.2 + val d11 = 0.5 + sin(d2 + 5.497787143782138) * 0.2 + val d14 = -1.0 + d1 + val d15 = height.toDouble() * 2.5 + d14 + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR) + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(1.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(1.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(0.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(0.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(1.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(1.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(0.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(0.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(1.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(1.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(0.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(0.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(1.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(1.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(0.0, d14).color(r, g, b, 1.0f).endVertex() + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(0.0, d15).color(r, g, b, 1.0f * alpha).endVertex() + tessellator.draw() + GlStateManager.disableCull() + val d12 = -1.0 + d1 + val d13 = height + d12 + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR) + worldrenderer.pos(x + 0.2, y + topOffset, z + 0.2).tex(1.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.2, y + bottomOffset, z + 0.2).tex(1.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.8, y + bottomOffset, z + 0.2).tex(0.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.8, y + topOffset, z + 0.2).tex(0.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.8, y + topOffset, z + 0.8).tex(1.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.8, y + bottomOffset, z + 0.8).tex(1.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.2, y + bottomOffset, z + 0.8).tex(0.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.2, y + topOffset, z + 0.8).tex(0.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.8, y + topOffset, z + 0.2).tex(1.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.8, y + bottomOffset, z + 0.2).tex(1.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.8, y + bottomOffset, z + 0.8).tex(0.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.8, y + topOffset, z + 0.8).tex(0.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.2, y + topOffset, z + 0.8).tex(1.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + worldrenderer.pos(x + 0.2, y + bottomOffset, z + 0.8).tex(1.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.2, y + bottomOffset, z + 0.2).tex(0.0, d12).color(r, g, b, 0.25f).endVertex() + worldrenderer.pos(x + 0.2, y + topOffset, z + 0.2).tex(0.0, d13).color(r, g, b, 0.25f * alpha).endVertex() + tessellator.draw() + GlStateManager.disableLighting() + GlStateManager.enableTexture2D() + if (esp) { + GlStateManager.enableDepth() + } + } + fun drawEntityBox(entity: Entity, color: Color, outline: Boolean, fill: Boolean, esp: Boolean, partialTicks: Float) { if (!outline && !fill) return val renderManager = mc.renderManager |