diff options
Diffstat (limited to 'src/main')
4 files changed, 170 insertions, 20 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/config/Features.java b/src/main/java/at/hannibal2/skyhanni/config/Features.java index 85c01417f..adf1262d3 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/Features.java +++ b/src/main/java/at/hannibal2/skyhanni/config/Features.java @@ -63,8 +63,8 @@ public class Features extends Config { return; } - if (runnableId.equals("firePillars")) { - editOverlay(activeConfigCategory, 200, 16, slayer.firePillarsPos); + if (runnableId.equals("firePillar")) { + editOverlay(activeConfigCategory, 200, 16, slayer.firePillarPos); return; } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Slayer.java b/src/main/java/at/hannibal2/skyhanni/config/features/Slayer.java index 9ad0a8047..eadb19cbb 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/Slayer.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/Slayer.java @@ -27,16 +27,28 @@ public class Slayer { public boolean damageSplash = false; @Expose - @ConfigOption(name = "Fire Pillars", desc = "Cooldown when the Fire Pillars from the blaze slayer will kill you.") + @ConfigOption(name = "Pillar Display", desc = "Cooldown when the Fire Pillar from the blaze slayer will kill you.") @ConfigEditorBoolean @ConfigAccordionId(id = 0) - public boolean firePillars = false; + public boolean firePillarDisplay = false; @Expose - @ConfigOption(name = "Fire Pillars Position", desc = "") - @ConfigEditorButton(runnableId = "firePillars", buttonText = "Edit") + @ConfigOption(name = "Pillar Display Position", desc = "") + @ConfigEditorButton(runnableId = "firePillar", buttonText = "Edit") @ConfigAccordionId(id = 0) - public Position firePillarsPos = new Position(10, 10, false, true); + public Position firePillarPos = new Position(10, 10, false, true); + + @Expose + @ConfigOption(name = "Pillar Sound", desc = "Custom countdown sound for the Fire Pillar timer for the blaze slayer.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean firePillarSound = false; + + @Expose + @ConfigOption(name = "Hide Pillar", desc = "Hide sound and entities when building the Fire Pillar for the blaze slayer.") + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean firePillarBuildHider = false; @Expose @ConfigOption(name = "Blaze Daggers", desc = "Faster and permanent display for the blaze slayer daggers") diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillar.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillar.kt index 2612f8aa8..f75f31e9d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillar.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillar.kt @@ -2,11 +2,17 @@ package at.hannibal2.skyhanni.features.slayer.blaze import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.PlaySoundEvent import at.hannibal2.skyhanni.features.damageindicator.BossType import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager +import at.hannibal2.skyhanni.utils.ItemUtils.getSkullTexture +import at.hannibal2.skyhanni.utils.LocationUtils import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.matchRegex import at.hannibal2.skyhanni.utils.RenderUtils.renderString +import at.hannibal2.skyhanni.utils.SoundUtils +import at.hannibal2.skyhanni.utils.SoundUtils.playSound +import at.hannibal2.skyhanni.utils.getLorenzVec import net.minecraft.client.Minecraft import net.minecraft.entity.item.EntityArmorStand import net.minecraftforge.client.event.RenderGameOverlayEvent @@ -15,25 +21,61 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent import java.text.DecimalFormat import java.util.regex.Pattern +import kotlin.math.roundToInt class BlazeSlayerPillar { + private var patternPillarExploded = + Pattern.compile("§cYou took §r§f(.+) §r§ctrue damage from an exploding fire pillar!") + private val pillarEntities = mutableListOf<EntityArmorStand>() + private val pillarWarningTexture = + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWMyZTlkODM5NWNhY2Q5OTIyODY5YzE1MzczY2Y3Y2IxNmRhMGE1Y2U1ZjNjNjMyYjE5Y2ViMzkyOWM5YTExIn19fQ==" - private var patternPillarExploded = Pattern.compile("§cYou took §r§f(.+) §r§ctrue damage from an exploding fire pillar!") private var lastPillarSpawnTime = -1L - private val pillarEntities = mutableListOf<EntityArmorStand>() + private var lastSoundMoment = 0.0 + private var lastPillarBuildEntitiesFound = 0L + private var pillarBuildEntityList = mutableListOf<EntityArmorStand>() @SubscribeEvent fun onTick(event: TickEvent.ClientTickEvent) { if (!isEnabled()) return + + val list = mutableListOf<EntityArmorStand>() + val playerLocation = LocationUtils.playerLocation() for (armorStand in Minecraft.getMinecraft().theWorld.loadedEntityList.filterIsInstance<EntityArmorStand>()) { val name = armorStand.name if (name.matchRegex("§6§l.s §c§l8 hits")) { if (armorStand !in pillarEntities) { pillarEntities.add(armorStand) - lastPillarSpawnTime = System.currentTimeMillis() + + val lastPillarEntities = System.currentTimeMillis() - lastPillarBuildEntitiesFound + if (lastPillarEntities in 2500..4500) { + lastPillarSpawnTime = System.currentTimeMillis() + } + } + } + + if (armorStand in pillarBuildEntityList || armorStand.inventory.any { it != null && it.getSkullTexture() == pillarWarningTexture }) { + if (armorStand !in pillarBuildEntityList) { + pillarBuildEntityList.add(armorStand) + if (SkyHanniMod.feature.slayer.firePillarBuildHider) { + armorStand.inventory[0] = null + armorStand.inventory[1] = null + armorStand.inventory[2] = null + armorStand.inventory[3] = null + } + } + if (armorStand.getLorenzVec().distance(playerLocation) < 15) { + list.add(armorStand) } } } + val size = list.size + if (size == 0) return + if (size % 12 == 0) { + if (System.currentTimeMillis() > lastPillarBuildEntitiesFound + 10_000) { + lastPillarBuildEntitiesFound = System.currentTimeMillis() + } + } } @SubscribeEvent @@ -44,13 +86,14 @@ class BlazeSlayerPillar { val matcher = patternPillarExploded.matcher(message) if (matcher.matches()) { lastPillarSpawnTime = -1L - } - if (message == " §r§a§lSLAYER QUEST COMPLETE!") { - lastPillarSpawnTime = -1L + SoundUtils.createSound("note.pling", 0.7f).playSound() } - if (message == "§eYour Slayer boss was despawned, but you have kept your quest progress!") { - lastPillarSpawnTime = -1L + when (message) { + " §r§a§lSLAYER QUEST COMPLETE!", + " §r§c§lSLAYER QUEST FAILED!", + "§eYour Slayer boss was despawned, but you have kept your quest progress!", + -> lastPillarSpawnTime = -1L } } @@ -61,21 +104,82 @@ class BlazeSlayerPillar { val duration = System.currentTimeMillis() - lastPillarSpawnTime val maxDuration = 7_000 - val remainingLong = maxDuration - duration val remaining = (remainingLong.toFloat() / 1000) - val format = DecimalFormat("0.0").format(remaining + 0.1) - SkyHanniMod.feature.slayer.firePillarsPos.renderString("§cBlaze Pillar: §a${format}s") + if (SkyHanniMod.feature.slayer.firePillarSound) { + playSound(remaining) + } + + if (SkyHanniMod.feature.slayer.firePillarDisplay) { + val format = DecimalFormat("0.0").format(remaining + 0.1) + SkyHanniMod.feature.slayer.firePillarPos.renderString("§cBlaze Pillar: §a${format}s") + } + } + + private fun playSound(remaining: Float) { + val time = (remaining * 10).roundToInt().toDouble() / 10 + if (time == lastSoundMoment) return + lastSoundMoment = time + + val playSound = if (time < 0) { + false + } else if (time <= 0.7) { + true + } else if (time <= 2.1) { + when (time) { + 0.9 -> true + 1.2 -> true + 1.5 -> true + 1.8 -> true + 2.1 -> true + else -> false + } + } else if (time <= 4 && time % 0.5 == 0.0) { + true + } else time % 1.0 == 0.0 + + if (playSound) { +// SoundUtils.createSound("random.orb", 11.2f).playSound() + SoundUtils.createSound("random.click", 1.3f).playSound() + } } private fun isEnabled(): Boolean { - return LorenzUtils.inSkyblock && SkyHanniMod.feature.slayer.firePillars && DamageIndicatorManager.isBossSpawned( - BossType.SLAYER_BLAZE_2, BossType.SLAYER_BLAZE_3, BossType.SLAYER_BLAZE_4 + return LorenzUtils.inSkyblock && DamageIndicatorManager.isBossSpawned( + BossType.SLAYER_BLAZE_2, + BossType.SLAYER_BLAZE_3, + BossType.SLAYER_BLAZE_4, + BossType.SLAYER_BLAZE_QUAZII_2, + BossType.SLAYER_BLAZE_QUAZII_3, + BossType.SLAYER_BLAZE_QUAZII_4, + BossType.SLAYER_BLAZE_TYPHOEUS_2, + BossType.SLAYER_BLAZE_TYPHOEUS_3, + BossType.SLAYER_BLAZE_TYPHOEUS_4, ) } @SubscribeEvent fun onWorldChange(event: WorldEvent.Load) { pillarEntities.clear() + lastPillarSpawnTime = -1 + } + + @SubscribeEvent + fun onSoundEvent(event: PlaySoundEvent) { + if (!isEnabled()) return + + if (!SkyHanniMod.feature.slayer.firePillarBuildHider) return + + when (event.soundName) { + "mob.chicken.plop", + "mob.bat.takeoff", + -> { + event.isCanceled = true + } + } } + + private fun isPillarWarningEntity(armorStand: EntityArmorStand) = + armorStand.inventory.any { it != null && it.getSkullTexture() == pillarWarningTexture } + }
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt new file mode 100644 index 000000000..1fb107375 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt @@ -0,0 +1,34 @@ +package at.hannibal2.skyhanni.utils + +import net.minecraft.client.Minecraft +import net.minecraft.client.audio.ISound +import net.minecraft.client.audio.PositionedSound +import net.minecraft.client.audio.SoundCategory +import net.minecraft.util.ResourceLocation + +object SoundUtils { + fun ISound.playSound() { + val gameSettings = Minecraft.getMinecraft().gameSettings + val oldLevel = gameSettings.getSoundLevel(SoundCategory.PLAYERS) + gameSettings.setSoundLevel(SoundCategory.PLAYERS, 1f) + try { + Minecraft.getMinecraft().soundHandler.playSound(this) + } catch (e: Exception) { + e.printStackTrace() + } + gameSettings.setSoundLevel(SoundCategory.PLAYERS, oldLevel) + } + + fun createSound(name: String, pitch: Float): ISound { + val sound: ISound = object : PositionedSound(ResourceLocation(name)) { + init { + volume = 50f + repeat = false + repeatDelay = 0 + attenuationType = ISound.AttenuationType.NONE + this.pitch = pitch + } + } + return sound + } +}
\ No newline at end of file |