Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ jobs:
uses: actions/upload-artifact@v6
with:
name: PlayerIDCounter
path: PlayerIDCounter-*.jar
path: build/libs/PlayerIDCounter-*.jar
21 changes: 17 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
kotlin("jvm") version "2.3.10"
id("com.gradleup.shadow") version "9.3.1"
`maven-publish`
}

Expand All @@ -16,11 +17,18 @@ repositories {
maven {
url = uri("https://repo.helpch.at/releases/")
}

maven {
url = uri("https://repo.tcoded.com/releases/")
}
}

dependencies {
compileOnly(libs.io.papermc.paper.api)
compileOnly(libs.me.clip.placeholderapi)

implementation(libs.de.exlll.configlib.yaml)
implementation(libs.com.tcoded.foliaLib)
}

tasks {
Expand All @@ -32,13 +40,18 @@ tasks {
options.encoding = "UTF-8"
}

jar {
from(configurations.runtimeClasspath.get().map { zipTree(it) })
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
shadowJar {
archiveFileName.set("${rootProject.name}-${project.version}.${archiveExtension.get()}")
exclude("META-INF/**")
minimize {
exclude(dependency("com.tcoded:FoliaLib:.*"))
}
relocate("de.exlll.configlib", "${project.group}.libs.configlib")
relocate("com.tcoded.folialib", "${project.group}.libs.folialib")
}

build {
dependsOn(jar)
dependsOn(shadowJar)
}

kotlin {
Expand Down
4 changes: 4 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
[versions]
me-clip-placeholderapi = "2.12.2"
io-papermc-paper-api = "1.21.11-R0.1-SNAPSHOT"
de-exlll-configlib-yaml = "4.8.1"
com-tcoded-foliaLib = "0.5.1"

[libraries]
me-clip-placeholderapi = { module = "me.clip:placeholderapi", version.ref = "me-clip-placeholderapi" }
io-papermc-paper-api = { module = "io.papermc.paper:paper-api", version.ref = "io-papermc-paper-api" }
de-exlll-configlib-yaml = { module = "de.exlll:configlib-yaml", version.ref = "de-exlll-configlib-yaml" }
com-tcoded-foliaLib = { module = "com.tcoded:FoliaLib", version.ref = "com-tcoded-foliaLib" }
60 changes: 17 additions & 43 deletions src/main/kotlin/org/crashvibe/playeridcounter/PlayerIDCounter.kt
Original file line number Diff line number Diff line change
@@ -1,38 +1,33 @@
package org.crashvibe.playeridcounter

import com.tcoded.folialib.FoliaLib
import net.kyori.adventure.text.logger.slf4j.ComponentLogger
import org.bukkit.Bukkit
import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.event.Listener
import org.bukkit.plugin.java.JavaPlugin
import org.crashvibe.playeridcounter.config.Config
import org.crashvibe.playeridcounter.config.Config.getLang
import org.crashvibe.playeridcounter.hooks.IDPlaceholderExpansion
import org.crashvibe.playeridcounter.listener.PlayerListener
import org.crashvibe.playeridcounter.util.Util.getLang
import java.io.File
import java.io.IOException
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicInteger
import java.util.function.Consumer

class PlayerIDCounter : JavaPlugin(), Listener {

lateinit var playersConfigFile: File
lateinit var playersConfig: FileConfiguration
lateinit var langConfig: FileConfiguration
class PlayerIDCounter : JavaPlugin() {

override fun onEnable() {
instance = this
foliaLib = FoliaLib(instance)

initFiles() // 初始化文件
Config.init(dataPath) // 初始化文件

playerIds = ConcurrentHashMap<UUID, Int>()
nextId = AtomicInteger(playersConfig.getInt("next-id", 1))
nextId = AtomicInteger(Config.playersConfig.getInt("next-id", 1))

playersConfig.getKeys(false).forEach(Consumer { key: String? ->
Config.playersConfig.getKeys(false).forEach(Consumer { key: String ->
if (key != "next-id") {
val uuid = UUID.fromString(key)
val id = playersConfig.getInt(key!!)
val id = Config.playersConfig.getInt(key)
playerIds[uuid] = id // 加载玩家ID
}
})
Expand All @@ -42,43 +37,22 @@ class PlayerIDCounter : JavaPlugin(), Listener {
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
IDPlaceholderExpansion(instance).register() // 注册PlaceholderAPI
} else {
logger.warning(getLang("papi_not_found"))
LOGGER.warn(getLang(Config.langData.papiNotFound))
}

logger.info(getLang("plugin_enabled")) // 插件启用
LOGGER.info(getLang(Config.langData.pluginEnabled)) // 插件启用
}

override fun onDisable() {
savePlayerData() // 保存玩家数据
logger.info(getLang("plugin_disabled")) // 插件禁用
}

private fun initFiles() {
saveDefaultConfig()

playersConfigFile = File(dataFolder, "players.yml")
if (!playersConfigFile.exists()) {
saveResource("players.yml", false) // 初始化players.yml
}
playersConfig = YamlConfiguration.loadConfiguration(playersConfigFile)

val langFile = File(dataFolder, "lang.yml")
if (!langFile.exists()) {
saveResource("lang.yml", false) // 初始化lang.yml
}
langConfig = YamlConfiguration.loadConfiguration(langFile)
}

fun savePlayerData() {
try {
playersConfig.save(playersConfigFile) // 保存玩家数据
} catch (e: IOException) {
logger.severe("无法保存玩家数据到 players.yml!错误: " + e.message)
}
Config.savePlayerData() // 保存玩家数据
LOGGER.info(getLang(Config.langData.pluginDisabled)) // 插件禁用
}

companion object {
val LOGGER: ComponentLogger = ComponentLogger.logger(PlayerIDCounter::class.java.simpleName)

lateinit var instance: PlayerIDCounter
lateinit var foliaLib: FoliaLib

lateinit var playerIds: ConcurrentHashMap<UUID, Int>
lateinit var nextId: AtomicInteger
Expand Down
54 changes: 54 additions & 0 deletions src/main/kotlin/org/crashvibe/playeridcounter/config/Config.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.crashvibe.playeridcounter.config

import de.exlll.configlib.YamlConfigurations
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.Component.text
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.configuration.file.YamlConfiguration
import org.crashvibe.playeridcounter.PlayerIDCounter
import org.crashvibe.playeridcounter.PlayerIDCounter.Companion.instance
import java.io.File
import java.io.IOException
import java.nio.file.Path

object Config {

lateinit var configData: PluginConfig
private set
lateinit var langData: Lang
private set
lateinit var playersConfigFile: File
lateinit var playersConfig: FileConfiguration

fun init(configFile: Path) {
configData = YamlConfigurations.update(
configFile.resolve("config.yml"), // 初始化 config.yml
PluginConfig::class.java,
)
langData = YamlConfigurations.update(
configFile.resolve("lang.yml"), // 初始化 lang.yml
Lang::class.java,
)

instance.saveDefaultConfig()

playersConfigFile = File(instance.dataFolder, "players.yml")
if (!playersConfigFile.exists()) {
instance.saveResource("players.yml", false) // 初始化 players.yml
}
playersConfig = YamlConfiguration.loadConfiguration(playersConfigFile)
}

fun savePlayerData() {
try {
playersConfig.save(playersConfigFile) // 保存玩家数据
} catch (e: IOException) {
PlayerIDCounter.LOGGER.error(text("无法保存玩家数据到 players.yml!错误: "), e)
}
}

fun getLang(key: String): Component {
return MiniMessage.miniMessage().deserialize(key) // 获取语言配置
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/org/crashvibe/playeridcounter/config/Lang.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.crashvibe.playeridcounter.config

import de.exlll.configlib.Configuration

@Configuration
data class Lang(
var pluginEnabled: String = "<green>插件已启用!",
var pluginDisabled: String = "<red>插件已禁用!",
var papiNotFound: String = "<red>PlaceholderAPI 未找到,功能可能无法使用!",
var welcomeMessage: String = "<yellow>欢迎!你的ID是:{id}"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.crashvibe.playeridcounter.config

import de.exlll.configlib.Configuration

/**
* 插件配置数据结构
*/
@Configuration
data class PluginConfig(
var settings: Settings = Settings(),
) {
@Configuration
data class Settings(
var debug: Boolean = false,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.crashvibe.playeridcounter.PlayerIDCounter
import org.crashvibe.playeridcounter.util.Util
import org.crashvibe.playeridcounter.util.getPlayerId

class IDPlaceholderExpansion(private val plugin: PlayerIDCounter) : PlaceholderExpansion() {

Expand Down Expand Up @@ -34,12 +34,12 @@ class IDPlaceholderExpansion(private val plugin: PlayerIDCounter) : PlaceholderE
}

if (params.equals("id", ignoreCase = true)) {
return Util.getPlayerId(player.uniqueId).toString() // 返回玩家ID
return getPlayerId(player.uniqueId).toString() // 返回玩家ID
}

if (params.matches("\\d".toRegex())) {
val id = params.toInt()
val name: String? = PlayerIDCounter.playerIds
val name = PlayerIDCounter.playerIds
.entries
.firstOrNull { it.value == id }
?.key
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
package org.crashvibe.playeridcounter.listener

import org.bukkit.Bukkit
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.crashvibe.playeridcounter.PlayerIDCounter
import org.crashvibe.playeridcounter.util.Util
import org.crashvibe.playeridcounter.util.Util.getLang
import org.crashvibe.playeridcounter.config.Config
import org.crashvibe.playeridcounter.config.Config.getLang
import org.crashvibe.playeridcounter.util.getPlayerId

class PlayerListener : Listener {

@EventHandler
fun onPlayerJoin(event: PlayerJoinEvent) {
val instance = PlayerIDCounter.instance
val player = event.getPlayer()
val uuid = player.uniqueId

Bukkit.getScheduler().runTaskAsynchronously(instance, Runnable {
var id = Util.getPlayerId(uuid)
PlayerIDCounter.foliaLib.scheduler.runAsync {
var id = getPlayerId(uuid)
if (id == -1) {
id = PlayerIDCounter.nextId.get()
PlayerIDCounter.playerIds[uuid] = id

instance.playersConfig.set(uuid.toString(), id)
instance.playersConfig.set("next-id", PlayerIDCounter.nextId.incrementAndGet()) // 分配新ID
Config.playersConfig.set(uuid.toString(), id)
Config.playersConfig.set("next-id", PlayerIDCounter.nextId.incrementAndGet()) // 分配新ID

instance.savePlayerData()
Config.savePlayerData()
}

val welcomeMessage = getLang("welcome_message").replace("{id}", id.toString())
val welcomeMessage = Config.langData.welcomeMessage.replace("{id}", id.toString())

player.sendMessage(welcomeMessage) // 发送欢迎消息
})
player.sendMessage(getLang(welcomeMessage)) // 发送欢迎消息
}
}
}
13 changes: 2 additions & 11 deletions src/main/kotlin/org/crashvibe/playeridcounter/util/Util.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,8 @@
package org.crashvibe.playeridcounter.util

import org.bukkit.ChatColor
import org.crashvibe.playeridcounter.PlayerIDCounter
import org.crashvibe.playeridcounter.PlayerIDCounter.Companion.instance
import java.util.UUID

object Util {

fun getPlayerId(uuid: UUID): Int {
return PlayerIDCounter.playerIds.getOrDefault(uuid, -1) // 获取玩家ID
}

fun getLang(key: String): String {
return ChatColor.translateAlternateColorCodes('&', instance.langConfig.getString(key, key)!!) // 获取语言配置
}
fun getPlayerId(uuid: UUID): Int {
return PlayerIDCounter.playerIds.getOrDefault(uuid, -1) // 获取玩家ID
}
2 changes: 0 additions & 2 deletions src/main/resources/config.yml

This file was deleted.

4 changes: 0 additions & 4 deletions src/main/resources/lang.yml

This file was deleted.