aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/ambientaddons/features/misc
diff options
context:
space:
mode:
authorAppability <appable@icloud.com>2022-10-18 00:31:32 -0700
committerAppability <appable@icloud.com>2022-10-18 00:31:32 -0700
commit1b6bd76b7e5c2f462bf55f0753ef459b445dcfb6 (patch)
tree5e7fe9efc953ccd836e9828fdeb35fc1d90ceb2a /src/main/kotlin/com/ambientaddons/features/misc
parentfcd49c8b59f9c76008b5112a2e296c164b168842 (diff)
downloadAmbientAddons-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.kt95
-rw-r--r--src/main/kotlin/com/ambientaddons/features/misc/Trapper.kt71
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