Files
GameModes-SpeedHG/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt
TDSTOS 1382de63fc Add natural disasters system
Introduce a natural-disasters feature: add DisasterManager, an abstract NaturalDisaster base class, and four concrete implementations (Earthquake, Meteor, Thunder, Tornado). Integrate the manager into SpeedHG (property, initialization/start) so disasters run on a timed cycle with guards for game state, grace period and per-disaster validation. Implementations: Meteor spawns a non-destructive LargeFireball impact, Earthquake applies nausea/impulses and particles, Thunder triggers multiple lightning strikes with fire chance, Tornado creates a particle vortex and pulls nearby players (uses a coroutine for precomputation). Add localization keys for disaster warnings in en_US.yml. Safety/cancel logic and flight/timeout cutoffs included to avoid leaks or invalid triggers.
2026-04-04 07:13:39 +02:00

228 lines
6.5 KiB
Kotlin

package club.mcscrims.speedhg
import club.mcscrims.speedhg.command.KitCommand
import club.mcscrims.speedhg.command.LeaderboardCommand
import club.mcscrims.speedhg.command.PerksCommand
import club.mcscrims.speedhg.command.RankingCommand
import club.mcscrims.speedhg.command.TimerCommand
import club.mcscrims.speedhg.config.CustomGameManager
import club.mcscrims.speedhg.config.CustomGameSettings
import club.mcscrims.speedhg.config.LanguageManager
import club.mcscrims.speedhg.database.DatabaseManager
import club.mcscrims.speedhg.database.StatsManager
import club.mcscrims.speedhg.disaster.DisasterManager
import club.mcscrims.speedhg.game.GameManager
import club.mcscrims.speedhg.game.PodiumManager
import club.mcscrims.speedhg.game.modules.AntiRunningManager
import club.mcscrims.speedhg.gui.listener.MenuListener
import club.mcscrims.speedhg.kit.KitManager
import club.mcscrims.speedhg.kit.impl.*
import club.mcscrims.speedhg.kit.listener.KitEventDispatcher
import club.mcscrims.speedhg.listener.ConnectListener
import club.mcscrims.speedhg.listener.GameStateListener
import club.mcscrims.speedhg.listener.SoupListener
import club.mcscrims.speedhg.listener.StatsListener
import club.mcscrims.speedhg.perk.PerkManager
import club.mcscrims.speedhg.perk.impl.BloodlustPerk
import club.mcscrims.speedhg.perk.impl.FeatherweightPerk
import club.mcscrims.speedhg.perk.impl.OraclePerk
import club.mcscrims.speedhg.perk.impl.VampirePerk
import club.mcscrims.speedhg.perk.listener.PerkEventDispatcher
import club.mcscrims.speedhg.ranking.RankingManager
import club.mcscrims.speedhg.scoreboard.ScoreboardManager
import club.mcscrims.speedhg.webhook.DiscordWebhookManager
import club.mcscrims.speedhg.world.WorldManager
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.NamespacedKey
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.ShapelessRecipe
import org.bukkit.plugin.java.JavaPlugin
class SpeedHG : JavaPlugin() {
companion object {
lateinit var instance: SpeedHG
private set
}
lateinit var languageManager: LanguageManager
private set
lateinit var gameManager: GameManager
private set
lateinit var antiRunningManager: AntiRunningManager
private set
lateinit var scoreboardManager: ScoreboardManager
private set
lateinit var kitManager: KitManager
private set
lateinit var perkManager: PerkManager
private set
lateinit var databaseManager: DatabaseManager
private set
lateinit var statsManager: StatsManager
private set
lateinit var discordWebhookManager: DiscordWebhookManager
private set
lateinit var customGameManager: CustomGameManager
private set
lateinit var rankingManager: RankingManager
private set
lateinit var podiumManager: PodiumManager
private set
lateinit var disasterManager: DisasterManager
private set
override fun onLoad()
{
instance = this
customGameManager = CustomGameManager( this )
customGameManager.load()
saveDefaultConfig()
reloadConfig()
val worldManager = WorldManager( this )
worldManager.prepareRandomWorld()
}
override fun onEnable()
{
databaseManager = DatabaseManager( this )
try {
databaseManager.connect()
} catch ( e: Exception ) {
logger.severe( "[Database] Verbindung fehlgeschlagen: ${e.message}" )
logger.severe( "[Database] Plugin wird deaktiviert." )
server.pluginManager.disablePlugin( this )
return
}
statsManager = StatsManager( this )
statsManager.initialize()
languageManager = LanguageManager( this )
gameManager = GameManager( this )
rankingManager = RankingManager( this )
podiumManager = PodiumManager( this )
antiRunningManager = AntiRunningManager( this )
scoreboardManager = ScoreboardManager( this )
kitManager = KitManager( this )
discordWebhookManager = DiscordWebhookManager( this )
perkManager = PerkManager( this )
perkManager.initialize()
disasterManager = DisasterManager( this )
disasterManager.start()
registerKits()
registerPerks()
registerCommands()
registerListener()
registerRecipes()
logger.info("SpeedHG wurde geladen!")
}
override fun onDisable()
{
podiumManager.cleanup()
if ( ::perkManager.isInitialized ) perkManager.shutdown()
if ( ::statsManager.isInitialized ) statsManager.shutdown()
if ( ::databaseManager.isInitialized ) databaseManager.disconnect()
kitManager.clearAll()
super.onDisable()
}
private fun registerKits()
{
kitManager.registerKit( ArmorerKit() )
kitManager.registerKit( BackupKit() )
kitManager.registerKit( BlackPantherKit() )
kitManager.registerKit( GladiatorKit() )
kitManager.registerKit( GoblinKit() )
kitManager.registerKit( IceMageKit() )
kitManager.registerKit( RattlesnakeKit() )
kitManager.registerKit( TheWorldKit() )
kitManager.registerKit( VenomKit() )
kitManager.registerKit( VoodooKit() )
}
private fun registerPerks()
{
perkManager.registerPerk( OraclePerk() )
perkManager.registerPerk( VampirePerk() )
perkManager.registerPerk( FeatherweightPerk() )
perkManager.registerPerk( BloodlustPerk() )
}
private fun registerCommands()
{
val kitCommand = KitCommand()
getCommand( "kit" )?.apply {
setExecutor( kitCommand )
tabCompleter = kitCommand
}
val timerCommand = TimerCommand( this )
getCommand( "timer" )?.apply {
setExecutor( timerCommand )
tabCompleter = timerCommand
}
val rankingCommand = RankingCommand( this )
getCommand( "ranking" )?.apply {
setExecutor( rankingCommand )
tabCompleter = rankingCommand
}
getCommand( "leaderboard" )?.setExecutor( LeaderboardCommand() )
getCommand( "perks" )?.setExecutor( PerksCommand() )
}
private fun registerListener()
{
val pm = Bukkit.getPluginManager()
pm.registerEvents( ConnectListener(), this )
pm.registerEvents( GameStateListener(), this )
pm.registerEvents( SoupListener(), this )
pm.registerEvents(KitEventDispatcher( this, kitManager ), this )
pm.registerEvents( StatsListener(), this )
pm.registerEvents( MenuListener(), this )
pm.registerEvents(PerkEventDispatcher( this, perkManager ), this )
}
private fun registerRecipes()
{
val soup = ItemStack( Material.MUSHROOM_STEW )
val cocoRecipe = ShapelessRecipe(NamespacedKey.minecraft( "cocoa_soup" ), soup )
cocoRecipe.addIngredient( Material.COCOA_BEANS )
cocoRecipe.addIngredient( Material.BOWL )
val cactiRecipe = ShapelessRecipe(NamespacedKey.minecraft( "cacti_soup" ), soup )
cactiRecipe.addIngredient( Material.CACTUS )
cactiRecipe.addIngredient( Material.BOWL )
Bukkit.addRecipe( cocoRecipe )
Bukkit.addRecipe( cactiRecipe )
}
}