diff options
author | Appability <appable@icloud.com> | 2022-10-18 00:31:32 -0700 |
---|---|---|
committer | Appability <appable@icloud.com> | 2022-10-18 00:31:32 -0700 |
commit | 1b6bd76b7e5c2f462bf55f0753ef459b445dcfb6 (patch) | |
tree | 5e7fe9efc953ccd836e9828fdeb35fc1d90ceb2a /src/main/kotlin/com/ambientaddons/features/misc | |
parent | fcd49c8b59f9c76008b5112a2e296c164b168842 (diff) | |
download | AmbientAddons-1b6bd76b7e5c2f462bf55f0753ef459b445dcfb6.tar.gz AmbientAddons-1b6bd76b7e5c2f462bf55f0753ef459b445dcfb6.tar.bz2 AmbientAddons-1b6bd76b7e5c2f462bf55f0753ef459b445dcfb6.zip |
crimson features!
Diffstat (limited to 'src/main/kotlin/com/ambientaddons/features/misc')
-rw-r--r-- | src/main/kotlin/com/ambientaddons/features/misc/CrimsonFishing.kt | 95 | ||||
-rw-r--r-- | src/main/kotlin/com/ambientaddons/features/misc/Trapper.kt | 71 |
2 files changed, 166 insertions, 0 deletions
diff --git a/src/main/kotlin/com/ambientaddons/features/misc/CrimsonFishing.kt b/src/main/kotlin/com/ambientaddons/features/misc/CrimsonFishing.kt new file mode 100644 index 0000000..6ed1d1b --- /dev/null +++ b/src/main/kotlin/com/ambientaddons/features/misc/CrimsonFishing.kt @@ -0,0 +1,95 @@ +package com.ambientaddons.features.misc + +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 gg.essential.universal.UChat +import net.minecraft.entity.Entity +import net.minecraft.entity.item.EntityArmorStand +import net.minecraft.entity.monster.EntityGuardian +import net.minecraft.entity.monster.EntityIronGolem +import net.minecraft.entity.passive.EntityMooshroom +import net.minecraft.item.ItemSkull +import net.minecraftforge.client.event.RenderWorldLastEvent +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.math.pow +import kotlin.math.roundToInt +import kotlin.math.sqrt + +object CrimsonFishing { + private const val sparkTexture = + "ewogICJ0aW1lc3RhbXAiIDogMTY0MzUwNDM3MjI1NiwKICAicHJvZmlsZUlkIiA6ICI2MzMyMDgwZTY3YTI0Y2MxYjE3ZGJhNzZmM2MwMGYxZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUZWFtSHlkcmEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2IzMzI4ZDNlOWQ3MTA0MjAzMjI1NTViMTcyMzkzMDdmMTIyNzBhZGY4MWJmNjNhZmM1MGZhYTA0YjVjMDZlMSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9" + private val knownEntities = mutableSetOf<Entity>() + + fun isSpark(entity: Entity): Boolean { + return (entity is EntityArmorStand) && run { + entity.heldItem?.let { + if (it.item !is ItemSkull) return false + val nbt = it.tagCompound ?: return false + if (!nbt.hasKey("SkullOwner", 10)) return false + sparkTexture == nbt + .getCompoundTag("SkullOwner") + .getCompoundTag("Properties") + .getTagList("textures", 10) + .getCompoundTagAt(0) + .getString("Value") + } ?: false + } + } + + @SubscribeEvent + fun onWorldUnload(event: WorldEvent.Unload) { + knownEntities.clear() + } + + @SubscribeEvent + fun onRenderWorld(event: RenderWorldLastEvent) { + if (SBLocation.area != Area.CrimsonIsle) return + mc.theWorld.loadedEntityList.forEach { + if (it is EntityIronGolem || it is EntityGuardian) { + if (config.crimsonHighlight != 0) { + EntityUtils.drawEntityBox( + entity = it, + color = config.crimsonColor, + outline = true, + fill = false, + esp = config.crimsonHighlight == 2, + partialTicks = event.partialTicks + ) + } + if (config.crimsonNotify && !knownEntities.contains(it)) { + val distance = sqrt((it.posX - mc.thePlayer.posX).pow(2) + + (it.posY - mc.thePlayer.posY).pow(2) + + (it.posZ - mc.thePlayer.posZ).pow(2) + ) + if (it is EntityIronGolem) { + UChat.chat("\n§c§lA legendary creature has been spotted nearby... Lord Jawbus has arrived.") + mc.thePlayer.playSound("random.orb", 1f, 0.5f) + } else { + UChat.chat("\n§c§lYou hear a massive rumble as a Thunder emerges nearby.") + mc.thePlayer.playSound("random.orb", 1f, 0.5f) + } + UChat.chat("§cSpotted §6§l${distance.roundToInt()} §cblocks away.\n") + + } + knownEntities.add(it) + } else if (isSpark(it) && config.crimsonHighlight != 0) { + EntityUtils.drawEntityBox( + entity = it, + color = config.crimsonColor, + outline = true, + fill = true, + esp = config.crimsonHighlight == 2, + partialTicks = event.partialTicks, + offset = Triple(-0.2F, -0.5F, -0.1F), + expansion = Triple(-0.1, -0.85, -0.1) + ) + } + } + } + + +}
\ No newline at end of file diff --git a/src/main/kotlin/com/ambientaddons/features/misc/Trapper.kt b/src/main/kotlin/com/ambientaddons/features/misc/Trapper.kt new file mode 100644 index 0000000..3d7b585 --- /dev/null +++ b/src/main/kotlin/com/ambientaddons/features/misc/Trapper.kt @@ -0,0 +1,71 @@ +package com.ambientaddons.features.misc + +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 + val y = it.lastTickPosY + (it.posY - it.lastTickPosY) * event.partialTicks - renderManager.viewerPosY + val z = it.lastTickPosZ + (it.posZ - it.lastTickPosZ) * event.partialTicks - renderManager.viewerPosZ + val entityHeight = it.entityBoundingBox.maxY - it.entityBoundingBox.minY + EntityUtils.drawEntityBox( + it, + color!!, + outline = true, + fill = true, + partialTicks = event.partialTicks, + esp = true + ) + EntityUtils.renderBeaconBeam(x - 0.5, y + entityHeight, z - 0.5, color!!, 1F, event.partialTicks, true) + } + } + } +}
\ No newline at end of file |