在您的插件 build.gradle.kts 中添加:
dependencies {
// Core 模块(必需)
api(project(":core"))
// PaperMC API
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
}确保您的项目支持 Kotlin:
plugins {
kotlin("jvm") version "2.2.0"
}
kotlin {
jvmToolchain(17)
}package com.example.myplugin
import city.newnan.core.base.BasePlugin
import org.bukkit.event.player.PlayerJoinEvent
class MyPlugin : BasePlugin() {
override fun onPluginLoad() {
// 插件加载阶段(可选)
logger.info("插件正在加载...")
}
override fun onPluginEnable() {
logger.info("插件已启用!")
// 注册事件监听器(不可重载的功能)
subscribeEvent<PlayerJoinEvent> { event ->
event.player.sendMessage("欢迎来到服务器!")
}
// 调用重载方法处理可重载的功能
reloadPlugin()
// 启动定时任务(不可重载的功能)
runSyncRepeating(0L, 20L) { task ->
// 每秒执行一次
logger.info("在线玩家数: ${server.onlinePlayers.size}")
}
}
override fun onPluginDisable() {
// 插件禁用逻辑
logger.info("插件已禁用")
// 所有资源自动清理,无需手动处理
}
/**
* 重载插件配置 - 必须实现
*/
override fun reloadPlugin() {
try {
logger.info("正在重载配置...")
// 重新设置语言管理器
setupLanguageManager()
// 其他可重载的逻辑...
logger.info("配置重载完成!")
} catch (e: Exception) {
logger.error("配置重载失败", e)
throw e
}
}
private fun setupLanguageManager() {
// 语言管理器设置逻辑
// 详见下面的示例
}
}name: MyPlugin
version: 1.0.0
main: com.example.myplugin.MyPlugin
api-version: 1.21
author: YourName
description: 我的第一个 Core 插件
# 如果使用了其他模块,添加软依赖
softdepend: []# 构建插件
./gradlew build
# 生成的 JAR 文件位于 build/libs/ 目录class MyPlugin : BasePlugin() {
override fun onPluginEnable() {
// 创建自定义资源
val myResource = MyCustomResource()
// 绑定到插件生命周期 - 插件禁用时自动清理
bind(myResource)
// 或者使用 bind 绑定模块
bind(MyModule())
}
}
// 自定义资源实现 Terminable 接口
class MyCustomResource : Terminable {
override fun close() {
// 清理逻辑
println("资源已清理")
}
}
// 模块实现 Terminable 接口
class MyModule(private val plugin: BasePlugin) : Terminable {
init {
// 模块初始化逻辑
plugin.bind(SomeResource())
}
override fun close() {
// 模块清理逻辑
}
}override fun onPluginEnable() {
// 基础事件订阅
subscribeEvent<PlayerJoinEvent> { event ->
event.player.sendMessage("欢迎!")
}
// 带过滤器的事件处理
subscribeEvent<PlayerJoinEvent>()
.filter { it.player.isOp }
.handler { event ->
event.player.sendMessage("管理员欢迎!")
}
// 限制次数的事件处理
subscribeEvent<PlayerJoinEvent>()
.expireAfter(5) // 只处理前5次
.handler { event ->
event.player.sendMessage("限时欢迎!")
}
// 限制时间的事件处理
subscribeEvent<PlayerJoinEvent>()
.expireAfter(Duration.ofMinutes(10)) // 10分钟后过期
.handler { event ->
event.player.sendMessage("时限欢迎!")
}
}override fun onPluginEnable() {
// 同步任务
runSync {
// 在主线程执行
logger.info("<%task.sync_executed%>")
}
// 异步任务
runAsync {
// 在异步线程执行
logger.info("<%task.async_executed%>")
}
// 延迟任务
runSyncLater(20L) { // 1秒后执行
logger.info("<%task.delayed_executed%>")
}
// 重复任务
runSyncRepeating(0L, 20L) { task ->
// 每秒执行一次
logger.info("<%task.repeating_executed%>")
// 可以在任务内部取消
if (someCondition) {
task.cancel()
}
}
}override fun onPluginEnable() {
// 设置语言管理器(必需)
setupLanguageManager()
// 发送消息给玩家
messager.printf(player, "<%message.info%>")
// 日志记录到控制台
logger.info("<%console.info%>")
logger.warn("<%console.warning%>")
logger.error("<%console.error%>")
// 格式化消息
messager.printf(player, true, true, "<%player.level_info%>", player.name, 10)
}
private fun setupLanguageManager() {
val languageManager = LanguageManager(this, configManager)
.register(Locale.SIMPLIFIED_CHINESE, "lang/zh_CN.yml")
.register(Locale.US, "lang/en_US.yml")
.setMajorLanguage(Locale.SIMPLIFIED_CHINESE)
.setDefaultLanguage(Locale.US)
// 通过BasePlugin统一设置语言提供者
setLanguageProvider(languageManager)
}
/**
* 重载配置 - 必须实现
*/
override fun reloadPlugin() {
try {
logger.info("<%config.reloading%>")
// 重新设置语言管理器
setupLanguageManager()
// 其他重载逻辑...
logger.info("<%config.reloaded%>")
} catch (e: Exception) {
logger.error("<%config.reload_failed%>", e)
throw e
}
}import city.newnan.core.utils.ItemBuilder
val item = ItemBuilder(Material.DIAMOND_SWORD)
.name("&6传奇之剑")
.lore("&7这是一把传奇武器", "&7攻击力: &c+10")
.enchant(Enchantment.SHARPNESS, 5)
.unbreakable(true)
.build()import city.newnan.core.utils.LocationUtils
// 计算距离
val distance = LocationUtils.distance(loc1, loc2)
// 安全传送
LocationUtils.safeTeleport(player, targetLocation)
// 检查区域
val inRegion = LocationUtils.isInRegion(location, corner1, corner2)import city.newnan.core.utils.PlayerUtils
// 给予物品
PlayerUtils.giveItem(player, item)
// 检查背包空间
val hasSpace = PlayerUtils.hasInventorySpace(player, 5)
// 播放音效
PlayerUtils.playSound(player, Sound.ENTITY_EXPERIENCE_ORB_PICKUP)现在您已经掌握了 Core 模块的基础用法,可以继续学习:
- 🎯 基础概念 - 深入理解核心概念
- 🔧 BasePlugin - 详细了解插件基类
- ♻️ Terminable体系 - 掌握资源管理
- ⚡ 事件处理 - 高级事件处理技巧
- ⏰ 任务调度 - 深入任务调度系统
继续学习 → 🎯 基础概念