@@ -4,9 +4,9 @@ import kotlinx.coroutines.DelicateCoroutinesApi
44import kotlinx.coroutines.GlobalScope
55import kotlinx.coroutines.launch
66import net.fabricmc.api.ClientModInitializer
7- import net.fabricmc.api.ModInitializer
87import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
98import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents.EndTick
9+ import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents
1010import net.minecraft.client.MinecraftClient
1111import net.minecraft.client.gui.screen.GameMenuScreen
1212import net.minecraft.client.network.ClientPlayerEntity
@@ -29,12 +29,21 @@ object ShockCraft : ClientModInitializer {
2929 ShockCraftConfig .HANDLER .load()
3030
3131 ClientTickEvents .END_CLIENT_TICK .register(EndTick { clientTickLoopFun() })
32+
33+ ClientReceiveMessageEvents .CHAT .register { message, _, _, _, _ ->
34+ val config = ShockCraftConfig .HANDLER .instance()
35+ if (config.onChatEvent) {
36+ onChatMessage(message.string)
37+ }
38+ }
3239 }
3340
3441 var lastTickHealth: Float = 20f
3542 var lastTickReset: Boolean = false
3643 var pauseMenuOpen: Boolean = true
3744
45+ var lastTickXpLevel: Int = 0
46+
3847 val DamageSource ?.attackerName: String
3948 get() = this ?.attacker?.stringifiedName ? : " Unknown"
4049
@@ -44,10 +53,12 @@ object ShockCraft : ClientModInitializer {
4453
4554 if (player == null ) {
4655 lastTickHealth = 20f
56+ lastTickXpLevel = 0
4757 return
4858 }
4959
5060 lastTickHealth = player.maxHealth
61+ lastTickXpLevel = player.experienceLevel
5162 }
5263
5364 @OptIn(DelicateCoroutinesApi ::class )
@@ -91,12 +102,15 @@ object ShockCraft : ClientModInitializer {
91102 if (lastTickReset) {
92103 lastTickReset = false
93104 lastTickHealth = player.health
105+ lastTickXpLevel = player.experienceLevel
94106 }
95107
96108 val damageSinceLastTick = (lastTickHealth - player.health).coerceAtLeast(0f )
109+ val xpLevelChange = player.experienceLevel - lastTickXpLevel
97110
98- // Set last tick health, we already calculated what we need
111+ // Set last tick health and experience level , we already calculated what we need
99112 lastTickHealth = player.health
113+ lastTickXpLevel = player.experienceLevel
100114
101115 // Did we take damage?
102116 if (damageSinceLastTick > 0 ) {
@@ -112,6 +126,43 @@ object ShockCraft : ClientModInitializer {
112126
113127 GlobalScope .launch { onDamage(player, damageSinceLastTick) }
114128 }
129+
130+ if (xpLevelChange > 0 ) {
131+ logger.debug(" Player leveled up by $xpLevelChange levels" )
132+ GlobalScope .launch {
133+ onLevelUp(xpLevelChange)
134+ }
135+ }
136+ }
137+
138+ private suspend fun onLevelUp (levels : Int ) {
139+ val config = ShockCraftConfig .HANDLER .instance()
140+ if (! config.onLevelUp) return
141+
142+ OpenShockApi .control(
143+ ControlType .Shock ,
144+ config.onLevelUpIntensity,
145+ config.onLevelUpDuration,
146+ " XP Level Up ($levels )" ,
147+ )
148+ }
149+
150+ @OptIn(DelicateCoroutinesApi ::class )
151+ private fun onChatMessage (message : String ) {
152+ val config = ShockCraftConfig .HANDLER .instance()
153+ if (config.chatMessagePhrase.isBlank()) return
154+
155+ if (message.contains(config.chatMessagePhrase, ignoreCase = true )) {
156+ logger.debug(" Chat message triggered shock: $message " )
157+ GlobalScope .launch {
158+ OpenShockApi .control(
159+ ControlType .Shock ,
160+ config.onChatMessageIntensity,
161+ config.onChatMessageDuration,
162+ " Chat Message Event" ,
163+ )
164+ }
165+ }
115166 }
116167
117168 private suspend fun onDeath (player : ClientPlayerEntity ) {
@@ -176,4 +227,4 @@ object ShockCraft : ClientModInitializer {
176227 player.recentDamageSource.attackerName,
177228 )
178229 }
179- }
230+ }
0 commit comments