Skip to content

Commit

Permalink
Feature: Sound Responses (Meow) (#2222)
Browse files Browse the repository at this point in the history
Co-authored-by: Cal <cwolfson58@gmail.com>
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com>
  • Loading branch information
3 people authored Jan 11, 2025
1 parent 7d4e044 commit d154001
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ class ChatConfig {
@Accordion
var playerMessage: PlayerMessagesConfig = PlayerMessagesConfig()

@Expose
@ConfigOption(name = "Sound Responses", desc = "")
@Accordion
var soundResponse: ChatSoundResponseConfig = ChatSoundResponseConfig()

@Expose
@ConfigOption(name = "Dungeon Filters", desc = "Hide specific message types in Dungeons.")
@ConfigEditorDraggableList
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package at.hannibal2.skyhanni.config.features.chat

import at.hannibal2.skyhanni.config.FeatureToggle
import at.hannibal2.skyhanni.features.chat.SoundResponseTypes
import com.google.gson.annotations.Expose
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean
import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDraggableList
import io.github.notenoughupdates.moulconfig.annotations.ConfigOption

class ChatSoundResponseConfig {
@Expose
@ConfigOption(
name = "Enabled",
desc = "Enable sound responses which play animal sounds when they are said in chat.",
)
@FeatureToggle
@ConfigEditorBoolean
var enabled: Boolean = false

@Expose
@ConfigOption(name = "Sound Responses", desc = "Add animal sounds to play when certain words are said in chat.")
@ConfigEditorDraggableList
var soundResponses = SoundResponseTypes.entries.toMutableList()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package at.hannibal2.skyhanni.features.chat

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.SoundUtils
import at.hannibal2.skyhanni.utils.SoundUtils.playSound
import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object ChatSoundResponse {

private val config get() = SkyHanniMod.feature.chat.soundResponse

init {
SoundResponseTypes.entries.forEach { it.pattern }
}

@SubscribeEvent
fun onLorenzChat(event: LorenzChatEvent) {
if (!isEnabled()) return

for (soundType in SoundResponseTypes.entries) {
if (!config.soundResponses.contains(soundType)) continue
if (soundType.pattern.matches(event.message)) {
soundType.sound.playSound()
return
}
}
}

fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled
}

private const val START_PATTERN = "(?:^|^.* )(?: |§.)*(?i)"
private const val END_PATTERN = "(?: |§.|!|\\?|\\.)*(?:\$| .*\$)"

enum class SoundResponseTypes(soundLocation: String, triggersOn: List<String>) {
CAT("mob.cat.meow", listOf("meow")),
DOG("mob.wolf.bark", listOf("bark", "arf", "woof")),
SHEEP("mob.sheep.say", listOf("baa+h*")),
COW("mob.cow.say", listOf("moo+")),
PIG("mob.pig.say", listOf("oink")),
CHICKEN("mob.chicken.say", listOf("cluck")),
;

val sound by lazy { SoundUtils.createSound(soundLocation, 1f) }

// creates a pattern that looks for if the message contains any of the triggerOn strings but as a full word
val pattern by RepoPattern.pattern(
"chat.sound.response" + name.lowercase(),
"$START_PATTERN(?:${triggersOn.joinToString("|")})$END_PATTERN",
)

override fun toString(): String = name.firstLetterUppercase()
}
6 changes: 5 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/utils/SoundUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ object SoundUtils {
if (e.message?.startsWith("value already present:") == true) return@execute
ErrorManager.logErrorWithData(e, "Failed to play a sound", "soundLocation" to this.soundLocation)
} catch (e: Exception) {
ErrorManager.logErrorWithData(e, "Failed to play a sound", "soundLocation" to this.soundLocation)

ErrorManager.logErrorWithData(
e, "Failed to play a sound",
"soundLocation" to this.soundLocation,
)
} finally {
if (!SkyHanniMod.feature.misc.maintainGameVolume) {
gameSettings.setSoundLevel(SoundCategory.PLAYERS, oldLevel)
Expand Down

0 comments on commit d154001

Please sign in to comment.