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:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user