Add HungerListener to slow player hunger

Introduce HungerListener to reduce player exhaustion during active game states, slowing vanilla hunger loss. The listener multiplies EntityExhaustionEvent.exhaustion for Player entities by EXHAUSTION_MULTIPLIER (default 0.5) and does nothing in the LOBBY state. Also register the new listener in SpeedHG so it's active at runtime. The multiplier is configurable in the listener's companion object.
This commit is contained in:
TDSTOS
2026-04-13 02:32:48 +02:00
parent 8cea132c6a
commit f9dba5b10d
2 changed files with 65 additions and 0 deletions

View File

@@ -25,6 +25,7 @@ import club.mcscrims.speedhg.kit.listener.KitEventDispatcher
import club.mcscrims.speedhg.listener.ChatListener import club.mcscrims.speedhg.listener.ChatListener
import club.mcscrims.speedhg.listener.ConnectListener import club.mcscrims.speedhg.listener.ConnectListener
import club.mcscrims.speedhg.listener.GameStateListener import club.mcscrims.speedhg.listener.GameStateListener
import club.mcscrims.speedhg.listener.HungerListener
import club.mcscrims.speedhg.listener.SoupListener import club.mcscrims.speedhg.listener.SoupListener
import club.mcscrims.speedhg.listener.StatsListener import club.mcscrims.speedhg.listener.StatsListener
import club.mcscrims.speedhg.perk.PerkManager import club.mcscrims.speedhg.perk.PerkManager
@@ -300,6 +301,7 @@ class SpeedHG : JavaPlugin() {
pm.registerEvents(ChatListener( this, VolcanoServerRankProvider() ), this ) pm.registerEvents(ChatListener( this, VolcanoServerRankProvider() ), this )
pm.registerEvents(KnockbackListener( this ), this ) pm.registerEvents(KnockbackListener( this ), this )
pm.registerEvents(TeamSelectionListener( this ), this ) pm.registerEvents(TeamSelectionListener( this ), this )
pm.registerEvents( HungerListener(), this )
} }
private fun registerRecipes() private fun registerRecipes()

View File

@@ -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
}
}