Add perk system with GUI and integrations

Introduce a complete passive perk system: Perk base class, PerkManager (registration, selection, lifecycle, persistence), and PlayerPerksRepository (DB schema + upsert/find). Add four example perks (Oracle, Vampire, Featherweight, Bloodlust) and a single PerkEventDispatcher to route combat/environment/kill events to active perks. Provide PerkSelectorMenu GUI and /perks command, integrate perk initialization, registration, application and cleanup into SpeedHG and GameManager, and hook load/evict into StatsListener. Also add language entries and register the command in plugin.yml. This change enables players to select up to two passive perks, persists selections, and dispatches relevant events to perk implementations.
This commit is contained in:
TDSTOS
2026-04-04 03:16:43 +02:00
parent 88b0ba8b97
commit 8c2ab684bb
15 changed files with 977 additions and 1 deletions

View File

@@ -2,6 +2,7 @@ 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
@@ -20,6 +21,12 @@ 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
@@ -55,6 +62,9 @@ class SpeedHG : JavaPlugin() {
lateinit var kitManager: KitManager
private set
lateinit var perkManager: PerkManager
private set
lateinit var databaseManager: DatabaseManager
private set
@@ -111,7 +121,11 @@ class SpeedHG : JavaPlugin() {
kitManager = KitManager( this )
discordWebhookManager = DiscordWebhookManager( this )
perkManager = PerkManager( this )
perkManager.initialize()
registerKits()
registerPerks()
registerCommands()
registerListener()
registerRecipes()
@@ -122,6 +136,7 @@ class SpeedHG : JavaPlugin() {
override fun onDisable()
{
podiumManager.cleanup()
if ( ::perkManager.isInitialized ) perkManager.shutdown()
if ( ::statsManager.isInitialized ) statsManager.shutdown()
if ( ::databaseManager.isInitialized ) databaseManager.disconnect()
kitManager.clearAll()
@@ -142,6 +157,14 @@ class SpeedHG : JavaPlugin() {
kitManager.registerKit( VoodooKit() )
}
private fun registerPerks()
{
perkManager.registerPerk( OraclePerk() )
perkManager.registerPerk( VampirePerk() )
perkManager.registerPerk( FeatherweightPerk() )
perkManager.registerPerk( BloodlustPerk() )
}
private fun registerCommands()
{
val kitCommand = KitCommand()
@@ -163,6 +186,7 @@ class SpeedHG : JavaPlugin() {
}
getCommand( "leaderboard" )?.setExecutor( LeaderboardCommand() )
getCommand( "perks" )?.setExecutor( PerksCommand() )
}
private fun registerListener()
@@ -175,6 +199,7 @@ class SpeedHG : JavaPlugin() {
pm.registerEvents(KitEventDispatcher( this, kitManager ), this )
pm.registerEvents( StatsListener(), this )
pm.registerEvents( MenuListener(), this )
pm.registerEvents(PerkEventDispatcher( this, perkManager ), this )
}
private fun registerRecipes()