diff --git a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt index 2950030..41e2cb1 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt @@ -25,6 +25,7 @@ import club.mcscrims.speedhg.kit.listener.KitEventDispatcher import club.mcscrims.speedhg.listener.ChatListener import club.mcscrims.speedhg.listener.ConnectListener import club.mcscrims.speedhg.listener.GameStateListener +import club.mcscrims.speedhg.listener.HungerListener import club.mcscrims.speedhg.listener.SoupListener import club.mcscrims.speedhg.listener.StatsListener import club.mcscrims.speedhg.perk.PerkManager @@ -300,6 +301,7 @@ class SpeedHG : JavaPlugin() { pm.registerEvents(ChatListener( this, VolcanoServerRankProvider() ), this ) pm.registerEvents(KnockbackListener( this ), this ) pm.registerEvents(TeamSelectionListener( this ), this ) + pm.registerEvents( HungerListener(), this ) } private fun registerRecipes() diff --git a/src/main/kotlin/club/mcscrims/speedhg/listener/HungerListener.kt b/src/main/kotlin/club/mcscrims/speedhg/listener/HungerListener.kt new file mode 100644 index 0000000..42449a2 --- /dev/null +++ b/src/main/kotlin/club/mcscrims/speedhg/listener/HungerListener.kt @@ -0,0 +1,63 @@ +package club.mcscrims.speedhg.listener + +import club.mcscrims.speedhg.SpeedHG +import club.mcscrims.speedhg.game.GameState +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityExhaustionEvent + +/** + * ## HungerListener + * + * Verlangsamt den Hunger-Verlust aller Spieler während des aktiven Spiels + * auf einen konfigurierbaren Bruchteil der Vanilla-Rate. + * + * ## Mechanik + * Vanilla Minecraft akkumuliert *Exhaustion*. Sobald sie `4.0` überschreitet, + * wird sie auf `0.0` zurückgesetzt und die *Saturation* (bzw. der Hunger-Balken) + * sinkt. Durch Halbieren jedes Exhaustion-Deltas halbiert sich effektiv die + * gesamte Hunger-Rate — ohne den `FoodLevelChangeEvent` zu canceln, was den + * natürlichen Regenerations-Mechanismus intakt lässt. + * + * ## Anwendungsfälle + * | Spielphase | Verhalten | + * |---------------------|----------------------------------------| + * | `LOBBY` | Kein Einfluss (Hunger ohnehin gesperrt)| + * | `INVINCIBILITY` | Halbierung aktiv | + * | `INGAME` | Halbierung aktiv | + * | `END` | Halbierung aktiv | + * + * ## Konfiguration + * Den Faktor `EXHAUSTION_MULTIPLIER` im `companion object` anpassen: + * * `0.5` → halbe Hunger-Rate (Standard) + * * `0.25` → Viertel der Hunger-Rate + * * `0.0` → kein Hunger-Verlust + */ +class HungerListener : Listener { + + private val plugin get() = SpeedHG.instance + private val gameManager get() = plugin.gameManager + + companion object { + /** + * Faktor, mit dem jedes Exhaustion-Delta multipliziert wird. + * `0.5` = 50 % der normalen Vanilla Hunger-Rate. + */ + const val EXHAUSTION_MULTIPLIER = 0.5f + } + + @EventHandler( + priority = EventPriority.NORMAL, + ignoreCancelled = true + ) + fun onExhaustion( + event: EntityExhaustionEvent + ) { + if ( event.entity !is Player ) return + if ( gameManager.currentState == GameState.LOBBY ) return + event.exhaustion *= EXHAUSTION_MULTIPLIER + } + +} \ No newline at end of file