Files
GameModes-SpeedHG/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt
2025-12-09 01:01:00 +01:00

232 lines
6.3 KiB
Kotlin

package club.mcscrims.speedhg
import club.mcscrims.core.config.ConfigData
import club.mcscrims.core.config.ConfigFormat
import club.mcscrims.core.config.ConfigLoader
import club.mcscrims.core.database.DatabaseConfig
import club.mcscrims.core.database.mongodb.MongoManager
import club.mcscrims.speedhg.ability.AbilityContext
import club.mcscrims.speedhg.ability.AbilityHitListener
import club.mcscrims.speedhg.ability.CooldownManager
import club.mcscrims.speedhg.ability.HitCounterManager
import club.mcscrims.speedhg.config.KitConfig
import club.mcscrims.speedhg.config.MessageConfig
import club.mcscrims.speedhg.config.PluginConfig
import club.mcscrims.speedhg.database.StatsRepository
import club.mcscrims.speedhg.game.GameManager
import club.mcscrims.speedhg.kit.KitListener
import club.mcscrims.speedhg.kit.KitManager
import club.mcscrims.speedhg.listener.GameStateListener
import club.mcscrims.speedhg.listener.LunarClientListener
import club.mcscrims.speedhg.world.WorldManager
import club.mcscrims.spigot.chat.ChatFormatter
import club.mcscrims.spigot.chat.ChatManager
import club.mcscrims.spigot.network.SpigotNetworkManager
import club.mcscrims.spigot.scheduler.SchedulerManager
import club.mcscrims.spigot.util.WorldEditUtils
import com.mongodb.client.model.Indexes
import kotlinx.coroutines.runBlocking
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
import net.luckperms.api.LuckPerms
import org.bukkit.plugin.java.JavaPlugin
class SpeedHG : JavaPlugin() {
companion object {
internal lateinit var instance: SpeedHG
fun Component.content(): String
{
return LegacyComponentSerializer.legacySection().serialize( this )
}
}
private lateinit var configLoader: ConfigLoader
internal lateinit var pluginConfig: ConfigData<PluginConfig>
internal lateinit var messageConfig: ConfigData<MessageConfig>
internal lateinit var kitConfig: ConfigData<KitConfig>
internal lateinit var databaseConfig: ConfigData<DatabaseConfig>
internal lateinit var chatManager: ChatManager<MessageConfig>
internal lateinit var chatFormatter: ChatFormatter<MessageConfig>
private lateinit var mongoManager: MongoManager
internal lateinit var statsRepository: StatsRepository
internal lateinit var networkManager: SpigotNetworkManager
internal lateinit var schedulerManager: SchedulerManager
internal lateinit var gameManager: GameManager
internal lateinit var worldManager: WorldManager
internal lateinit var abilityContext: AbilityContext
internal lateinit var kitManager: KitManager
internal lateinit var worldEditUtils: WorldEditUtils
internal lateinit var luckPerms: LuckPerms
internal var isReady: Boolean = false
override fun onLoad()
{
instance = this
loadConfigurations()
setupDatabase()
networkManager = SpigotNetworkManager.getInstance()!!
worldManager = WorldManager( this )
worldManager.deleteWorld()
}
override fun onEnable()
{
worldManager.setupWorld()
chatFormatter = ChatFormatter.create(
plugin = this,
configClass = MessageConfig::class,
messageExtractor = { config -> config.getAllMessages() }
)
chatManager = ChatManager.withCustomConfig( this, chatFormatter )
chatManager.initialize()
schedulerManager = SchedulerManager( this )
worldEditUtils = WorldEditUtils( this )
gameManager = GameManager( this )
gameManager.initialize()
val cooldownManager = CooldownManager()
val hitCounterManager = HitCounterManager()
abilityContext = AbilityContext( cooldownManager, hitCounterManager )
kitManager = KitManager( this )
kitManager.initialize()
setupLuckPerms()
registerListener()
}
override fun onDisable()
{
kitManager.clearAll()
mongoManager.shutdown()
networkManager.shutdown()
}
private fun registerListener()
{
server.pluginManager.registerEvents(GameStateListener( this, gameManager ), this )
server.pluginManager.registerEvents(KitListener( this, kitManager ), this )
server.pluginManager.registerEvents(AbilityHitListener( this, abilityContext ), this )
LunarClientListener( this )
}
/*
* LUCKPERMS >>
*/
private fun setupLuckPerms()
{
val provider = server.servicesManager.getRegistration( LuckPerms::class.java )
if ( provider != null )
luckPerms = provider.provider
if ( !::luckPerms.isInitialized )
logger.warning( "LuckPerms could not be loaded." )
else
logger.info( "LuckPerms has successfully been loaded." )
}
/*
* DATABASE >>
*/
private fun setupDatabase()
{
// MongoManager initialisieren
mongoManager = MongoManager.getInstance( name, logger )
val connection = mongoManager.createConnection( "speedhg", databaseConfig.data )
// Repositories initialisieren
statsRepository = StatsRepository( connection )
// Indizes erstellen
runBlocking {
try
{
connection.createIndex( "player_stats", Indexes.ascending( "kills" ))
connection.createIndex( "player_stats", Indexes.descending( "deaths" ))
connection.createIndex( "player_stats", Indexes.ascending( "wins" ))
connection.createIndex( "player_stats", Indexes.ascending( "unathleticIndex" ))
connection.createIndex( "player_stats", Indexes.ascending( "ironFarmed" ))
}
catch ( ex: Exception ) {
logger.warning( "Failed to create MongoDB indexes: ${ex.message}" )
return@runBlocking
}
}
logger.info( "Successfully enabled MongoDB" )
}
/*
* CONFIG >>
*/
private fun loadConfigurations()
{
configLoader = ConfigLoader.getInstance( name, logger, dataFolder )
createConfigurations()
}
private fun createConfigurations()
{
pluginConfig = configLoader.loadConfig<PluginConfig>(
fileName = "config.yml",
format = ConfigFormat.YAML,
autoReload = true
)
messageConfig = configLoader.loadConfig<MessageConfig>(
fileName = "messages.yml",
format = ConfigFormat.YAML,
autoReload = false
)
kitConfig = configLoader.loadConfig<KitConfig>(
fileName = "kits.yml",
format = ConfigFormat.YAML,
autoReload = false
)
databaseConfig = configLoader.loadConfig<DatabaseConfig>(
fileName = "database.json",
format = ConfigFormat.JSON,
autoReload = false
)
}
fun reloadConfigurations()
{
try
{
pluginConfig.reload()
messageConfig.reload()
kitConfig.reload()
databaseConfig.reload()
}
catch ( ex: Exception ) {
logger.severe( "Failed to reload configurations: ${ex.message}" )
}
}
}