Refactor language, kits, and event handling
Major refactor and bugfixes across language loading, kit lifecycle, and event handling:
- LanguageManager: Introduce LangData to hold string and list entries, load YAML lists alongside strings, and centralize retrieval (avoid reloading files at access time).
- GameManager: Use apply {} to configure worldBorder more concisely.
- KitManager.clearAll: Handle offline players by cleaning chargeData without calling lifecycle hooks (onActivate/onDeactivate cannot run for offline players).
- GoblinKit: Track per-player steal BukkitTask, cancel tasks on kit removal, only restore kits if player is still alive, and fix inventory removal by removing cached items and cleaning cache.
- KitEventDispatcher: Use null-safe chaining for victim passive hooks and early-return on non-block-position moves to ignore head-rotation events.
- GameStateListener: Add feastStarted flag placeholder and adjust iron ore handling/messages; add TODO for DB update.
- Extensions: Change legacySerializer visibility to internal.
These changes improve stability around scheduled tasks, offline cleanup, and language list support.
This commit is contained in:
@@ -129,7 +129,16 @@ class KitManager(
|
||||
fun clearAll()
|
||||
{
|
||||
selectedKits.keys.toList().forEach { uuid ->
|
||||
plugin.server.getPlayer( uuid )?.let { removeKit( it ) }
|
||||
val player = plugin.server.getPlayer( uuid )
|
||||
if ( player != null )
|
||||
removeKit( player )
|
||||
else
|
||||
{
|
||||
// Daten bereinigen ohne Lifecycle-Hooks (Spieler ist offline)
|
||||
chargeData.remove( uuid )
|
||||
// Hinweis: onDeactivate/onRemove können nicht aufgerufen werden
|
||||
// → Kits müssen in onActivate gestartete Tasks UUID-basiert führen
|
||||
}
|
||||
}
|
||||
selectedKits.clear()
|
||||
selectedPlaystyles.clear()
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.bukkit.Material
|
||||
import org.bukkit.Sound
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.scheduler.BukkitTask
|
||||
import java.util.UUID
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
@@ -98,12 +99,15 @@ class GoblinKit : Kit() {
|
||||
override fun onRemove(
|
||||
player: Player
|
||||
) {
|
||||
val items = cachedItems[ player.uniqueId ] ?: return
|
||||
player.inventory.removeAll { items.contains( it ) }
|
||||
aggressiveActive.cancelStealTask( player )
|
||||
val items = cachedItems.remove( player.uniqueId ) ?: return
|
||||
items.forEach { player.inventory.remove( it ) }
|
||||
}
|
||||
|
||||
private inner class AggressiveActive : ActiveAbility( Playstyle.AGGRESSIVE ) {
|
||||
|
||||
private val plugin get() = SpeedHG.instance
|
||||
|
||||
override val name: String
|
||||
get() = plugin.languageManager.getDefaultRawMessage( "kits.goblin.items.steal.name" )
|
||||
|
||||
@@ -116,6 +120,8 @@ class GoblinKit : Kit() {
|
||||
override val triggerMaterial: Material
|
||||
get() = Material.GLASS
|
||||
|
||||
private val activeStealTasks = ConcurrentHashMap<UUID, BukkitTask>()
|
||||
|
||||
override fun execute(
|
||||
player: Player
|
||||
): AbilityResult
|
||||
@@ -129,16 +135,25 @@ class GoblinKit : Kit() {
|
||||
val currentKit = plugin.kitManager.getSelectedKit( player )
|
||||
?: return AbilityResult.ConditionNotMet( "Error while copying kit" )
|
||||
|
||||
activeStealTasks.remove( player.uniqueId )
|
||||
|
||||
plugin.kitManager.removeKit( player )
|
||||
plugin.kitManager.selectKit( player, targetKit )
|
||||
plugin.kitManager.applyKit( player )
|
||||
|
||||
Bukkit.getScheduler().runTaskLater( plugin, { ->
|
||||
plugin.kitManager.removeKit( player )
|
||||
plugin.kitManager.selectKit( player, currentKit )
|
||||
plugin.kitManager.applyKit( player )
|
||||
val task = Bukkit.getScheduler().runTaskLater( plugin, { ->
|
||||
activeStealTasks.remove( player.uniqueId )
|
||||
// Nur wiederherstellen, wenn Spieler noch alive und Spiel läuft
|
||||
if (plugin.gameManager.alivePlayers.contains( player.uniqueId ))
|
||||
{
|
||||
plugin.kitManager.removeKit( player )
|
||||
plugin.kitManager.selectKit( player, currentKit )
|
||||
plugin.kitManager.applyKit( player )
|
||||
}
|
||||
}, 20L * 60)
|
||||
|
||||
activeStealTasks[ player.uniqueId ] = task
|
||||
|
||||
player.playSound( player.location, Sound.ENTITY_EVOKER_CAST_SPELL, 1f, 1.5f )
|
||||
player.sendActionBar(player.trans( "kits.goblin.messages.stole_kit", "kit" to legacySerializer.serialize( targetKit.displayName )))
|
||||
|
||||
@@ -152,10 +167,18 @@ class GoblinKit : Kit() {
|
||||
player.sendActionBar(player.trans( "kits.goblin.messages.ability_charged" ))
|
||||
}
|
||||
|
||||
fun cancelStealTask(
|
||||
player: Player
|
||||
) {
|
||||
activeStealTasks.remove( player.uniqueId )?.cancel()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private inner class DefensiveActive : ActiveAbility( Playstyle.DEFENSIVE ) {
|
||||
|
||||
private val plugin get() = SpeedHG.instance
|
||||
|
||||
override val name: String
|
||||
get() = plugin.languageManager.getDefaultRawMessage( "kits.goblin.items.bunker.name" )
|
||||
|
||||
|
||||
@@ -75,9 +75,9 @@ class KitEventDispatcher(
|
||||
.onHitEnemy( attacker, victim, event )
|
||||
|
||||
// ── 3. Victim passive hook ────────────────────────────────────────────
|
||||
val victimKit = kitManager.getSelectedKit( victim ) ?: return
|
||||
victimKit.getPassiveAbility(kitManager.getSelectedPlaystyle( victim ))
|
||||
.onHitByEnemy( victim, attacker, event )
|
||||
kitManager.getSelectedKit( victim )
|
||||
?.getPassiveAbility(kitManager.getSelectedPlaystyle( victim ))
|
||||
?.onHitByEnemy( victim, attacker, event )
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
@@ -159,13 +159,16 @@ class KitEventDispatcher(
|
||||
fun onMove(
|
||||
event: PlayerMoveEvent
|
||||
) {
|
||||
// Frühexit: nur echte Positionsänderungen, keine Kopfdrehungen
|
||||
val from = event.from
|
||||
val to = event.to
|
||||
if ( from.blockX == to.blockX && from.blockY == to.blockY && from.blockZ == to.blockZ ) return
|
||||
|
||||
if ( !isIngame() ) return
|
||||
|
||||
val player = event.player
|
||||
val kit = kitManager.getSelectedKit( player ) ?: return
|
||||
|
||||
kit.getPassiveAbility(kitManager.getSelectedPlaystyle( player ))
|
||||
.onMove( player, event )
|
||||
val kit = kitManager.getSelectedKit( player ) ?: return
|
||||
kit.getPassiveAbility(kitManager.getSelectedPlaystyle( player )).onMove( player, event )
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
|
||||
Reference in New Issue
Block a user