diff --git a/build.gradle.kts b/build.gradle.kts index 6aa3d62..8fe4b6c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,8 +43,8 @@ dependencies { compileOnly("org.popcraft:chunky-common:1.3.38") - implementation("club.mcscrims:core:1.4.2") - implementation("club.mcscrims:spigot:1.4.2") + implementation("club.mcscrims:core:1.4.3.1") + implementation("club.mcscrims:spigot:1.4.3.1") compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") paperweight.paperDevBundle("1.21.1-R0.1-SNAPSHOT") diff --git a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt index d8806e8..1354e14 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt @@ -15,6 +15,7 @@ import club.mcscrims.speedhg.config.PluginConfig import club.mcscrims.speedhg.database.StatsRepository import club.mcscrims.speedhg.game.GameManager import club.mcscrims.speedhg.command.KitsCommand +import club.mcscrims.speedhg.database.PlayerRepository import club.mcscrims.speedhg.kit.KitInventoryListener import club.mcscrims.speedhg.kit.KitInventoryManager import club.mcscrims.speedhg.kit.KitListener @@ -34,6 +35,7 @@ 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.Bukkit import org.bukkit.plugin.java.JavaPlugin class SpeedHG : JavaPlugin() { @@ -60,6 +62,7 @@ class SpeedHG : JavaPlugin() { private lateinit var mongoManager: MongoManager internal lateinit var statsRepository: StatsRepository + internal lateinit var playerRepository: PlayerRepository internal lateinit var networkManager: SpigotNetworkManager internal lateinit var schedulerManager: SchedulerManager @@ -95,7 +98,8 @@ class SpeedHG : JavaPlugin() { chatFormatter = ChatFormatter.create( plugin = this, configClass = MessageConfig::class, - messageExtractor = { config -> config.getAllMessages() } + messageExtractor = { config -> config.getAllMessages() }, + listExtractor = { config -> config.getListMessages() } ) chatManager = ChatManager.withCustomConfig( this, chatFormatter ) @@ -128,7 +132,7 @@ class SpeedHG : JavaPlugin() { override fun onDisable() { kitManager.clearAll() - mongoManager.shutdown() + closeDatabase() networkManager.shutdown() } @@ -175,6 +179,7 @@ class SpeedHG : JavaPlugin() { // Repositories initialisieren statsRepository = StatsRepository( connection ) + playerRepository = PlayerRepository( connection ) // Indizes erstellen runBlocking { @@ -185,6 +190,7 @@ class SpeedHG : JavaPlugin() { connection.createIndex( "player_stats", Indexes.ascending( "wins" )) connection.createIndex( "player_stats", Indexes.ascending( "unathleticIndex" )) connection.createIndex( "player_stats", Indexes.ascending( "ironFarmed" )) + connection.createIndex( "kit_players", Indexes.text( "server" )) } catch ( ex: Exception ) { logger.warning( "Failed to create MongoDB indexes: ${ex.message}" ) @@ -195,6 +201,29 @@ class SpeedHG : JavaPlugin() { logger.info( "Successfully enabled MongoDB" ) } + private fun closeDatabase() + { + // Alle Server von Kit-Spielern auf NULL setzen + runBlocking { + try + { + val players = Bukkit.getOnlinePlayers() + players.forEach { player -> + playerRepository.updateServer( player.uniqueId, "NULL" ) + } + logger.info( "Updated ${players.size} players server to NULL." ) + } + catch ( ex: Exception ) { + logger.warning( "Failed to update player server: ${ex.message}" ) + } + }.also { + // MongoManager beenden + mongoManager.shutdown() + + logger.info( "Successfully disabled MongoDB" ) + } + } + /* * CONFIG >> */ diff --git a/src/main/kotlin/club/mcscrims/speedhg/config/MessageConfig.kt b/src/main/kotlin/club/mcscrims/speedhg/config/MessageConfig.kt index a15b4df..84b0d19 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/config/MessageConfig.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/config/MessageConfig.kt @@ -13,7 +13,10 @@ data class MessageConfig( val defaultMessages: Map = getDefaultMessages(), @ConfigField(name = "commands", description = "Command messages") - val commandMessages: Map = getCommandMessages() + val commandMessages: Map = getCommandMessages(), + + @ConfigField(name = "death", description = "Death messages") + val deathMessages: Map> = getDeathMessages() ) { fun getAllMessages(): Map @@ -21,6 +24,11 @@ data class MessageConfig( return defaultMessages + commandMessages } + fun getListMessages(): Map> + { + return deathMessages + } + } private fun getDefaultMessages(): Map = mapOf( @@ -33,4 +41,16 @@ private fun getDefaultMessages(): Map = mapOf( private fun getCommandMessages(): Map = mapOf( "commands.unknown" to "%prefix% Unknown subcommand: {unknown} \n%prefix% Use /{command} for an overview." +) + +private fun getDeathMessages(): Map> = mapOf( + "player" to listOf( + " {player} was killed by {killer}!" + ), + "entity" to listOf( + " {player} was killed by {entity}!" + ), + "world" to listOf( + " {player} has died!" + ) ) \ No newline at end of file diff --git a/src/main/kotlin/club/mcscrims/speedhg/database/PlayerRepository.kt b/src/main/kotlin/club/mcscrims/speedhg/database/PlayerRepository.kt new file mode 100644 index 0000000..9151d87 --- /dev/null +++ b/src/main/kotlin/club/mcscrims/speedhg/database/PlayerRepository.kt @@ -0,0 +1,125 @@ +package club.mcscrims.speedhg.database + +import club.mcscrims.core.database.mongodb.MongoConnection +import club.mcscrims.core.database.mongodb.MongoRepository +import com.mongodb.client.model.Filters +import com.mongodb.client.model.Updates +import org.bson.codecs.pojo.annotations.BsonId +import org.bson.codecs.pojo.annotations.BsonProperty +import org.bson.conversions.Bson +import org.bson.types.ObjectId +import org.bukkit.Bukkit +import java.util.UUID + +/** + * MongoDB-Entity für einen Spieler + */ +data class KitPlayer( + @BsonId + val id: ObjectId = ObjectId(), + + @BsonProperty + val uuid: String, + + @BsonProperty + val isAlive: Boolean, + + @BsonProperty + val unlockedKits: List, + + @BsonProperty + val server: String +) + +/** + * MongoDB-Repository für Spieler-Daten + */ +class PlayerRepository( + connection: MongoConnection +): MongoRepository( connection, "kit_players", KitPlayer::class.java ) { + + override fun getId( + entity: KitPlayer + ): ObjectId + { + return entity.id + } + + override fun setId( + entity: KitPlayer, + id: ObjectId + ): KitPlayer + { + return entity.copy( id = id ) + } + + override fun entityToUpdateDocument( + entity: KitPlayer + ): Bson = Updates.combine( + Updates.set("isAlive", entity.isAlive), + Updates.set("unlockedKits", entity.unlockedKits), + Updates.set("server", entity.server) + ) + + /** + * Findet einen Spieler anhand seiner UUID + */ + suspend fun findByUuid( + uuid: UUID + ): KitPlayer? + { + val filter = Filters.eq("uuid", uuid.toString()) + return findFirst(filter) + } + + /** + * Findet alle lebenden Spieler für einen Server + */ + suspend fun findAlivePlayers( + server: String + ): List + { + val filter = Filters.and( + Filters.eq("server", server), + Filters.eq("isAlive", true) + ) + return find(filter, Bukkit.getMaxPlayers()) + } + + /** + * Aktualisiert den Alive-Status eines Spielers + */ + suspend fun updateAliveStatus( + uuid: UUID, + isAlive: Boolean + ) { + val filter = Filters.eq("uuid", uuid.toString()) + val update = Updates.set("isAlive", isAlive) + connection.updateOne(collectionName, filter, update) + } + + /** + * Aktualisiert den Server eines Spielers + */ + suspend fun updateServer( + uuid: UUID, + server: String + ) { + val filter = Filters.eq("uuid", uuid.toString()) + val update = Updates.set("server", server) + connection.updateOne(collectionName, filter, update) + } + + /** + * Aktualisiert die freigeschalteten Kits eines Spielers + */ + suspend fun updateUnlockedKits( + uuid: UUID, + unlockedKits: List + ) { + val filter = Filters.eq("uuid", uuid.toString()) + val update = Updates.set("unlockedKits", unlockedKits) + connection.updateOne(collectionName, filter, update) + } + +} \ No newline at end of file