
E-Utils
一个提供可复用组件的模组工具,用于配置文件、命令系统和用户界面
EverlastingUtils
EverlastingUtils 是一个功能强大的、服务端实用工具与 API 库,适用于 Fabric 模组开发工具链。它为模组开发者经常需要的常见但复杂的功能提供了健壮的框架,使开发者能够更专注于其模组的独特内容。
给玩家的话: 如果你下载的模组需要“EverlastingUtils”,你只需将此库安装到你的
mods文件夹中。你可以忽略以下所有技术信息。旧版本: 如果你使用的是需要此库的旧版模组,请下载 EverlastingUtils 版本
1.0.2。
依赖项
开发者注意
以下信息面向希望在自身项目中使用 EverlastingUtils 作为依赖项的模组开发者。
核心特性
EverlastingUtils 旨在通过提供即用型、高质量的系统来加速开发,涵盖以下方面:
- 配置管理:类型安全、多文件的配置系统,支持 JSONC、热重载和自动版本迁移。
- 任务调度:一个了解服务器环境的调度器,可正确处理同步(主线程)和异步任务,避免常见的并发问题。
- 命令系统:一个基于 Brigadier 的流畅命令构建器,集成了权限处理。
- GUI 框架:一个简单而强大的框架,用于创建基于物品栏的交互式 GUI,包括标准类型和铁砧类型。
- 实用工具:一系列辅助工具,例如 MiniMessage 颜色解析和可切换的、按模组区分的调试日志记录。
系统亮点
配置系统(ConfigManager)
ConfigManager 是一个精密的系统,旨在以最少的样板代码处理配置管理的所有方面。
关键功能:
- 类型安全且现代化:使用 Kotlin 数据类实现类型安全的配置访问,并使用 JSONC 实现带注释且人类可读的文件。
- 热重载:当配置文件在磁盘上被修改时自动重新加载,允许服务器所有者无需重启即可调整设置。
- 多文件支持:管理一个主
config.jsonc文件和子目录中任意数量的“次要”配置,非常适合组织复杂数据,如宝可梦或战利品表。 - 自动迁移:当你发布新版本的模组时,
ConfigManager会将用户配置文件中的版本号与你模组的当前版本进行比较。如果它们不匹配,它会自动将用户现有的设置合并到新的、更新后的配置结构中,保留他们的更改。 - 元数据与注释:以编程方式向配置文件添加头部注释、尾部注释和字段描述,使文件具有自文档性。
使用示例:
// 1. 定义你的配置结构
data class MyConfig(
override val version: String = "1.0.0",
override val configId: String = "mymod", // 用于配置文件夹名称
var debugMode: Boolean = false,
var welcomeMessage: String = "<green>欢迎来到我的服务器!"
) : ConfigData
// 2. 在模组入口点初始化管理器
val configManager = ConfigManager(
currentVersion = "1.0.0", // 你模组的当前版本
defaultConfig = MyConfig(),
configClass = MyConfig::class,
metadata = ConfigMetadata(
headerComments = listOf("MyMod 的主配置文件。"),
sectionComments = mapOf("debugMode" to "启用详细的控制台日志记录。")
)
)
// 3. 在任意位置访问你的配置
val isDebug = configManager.getCurrentConfig().debugMode
任务调度器(SchedulerManager)
SchedulerManager 提供了一种安全高效的方式来调度延迟或重复任务,专为 Minecraft 服务器环境而构建。
关键功能:
- 服务器感知:调度器与服务器生命周期绑定。它会在服务器停止时自动关闭,并在重启时重新创建线程池,防止线程泄漏和错误。
- 同步与异步:轻松指定任务应在主服务器线程上同步运行(几乎所有 Minecraft API 调用都需要)还是在工作线程上异步运行(用于非 API 的重型操作,如数据库查询)。
- 高效线程管理:使用共享的、受管理的线程池,防止单个模组创建过多线程而拖慢服务器。
- 任务追踪:所有计划任务都通过唯一 ID 进行跟踪,以便在需要时取消它们。
使用示例:
// 在服务端初始化器中(例如,在 ServerLifecycleEvents.SERVER_STARTED 内部)
val server = ... // 获取 MinecraftServer 实例
// 调度一个每 5 分钟在主服务器线程上运行的任务
SchedulerManager.scheduleAtFixedRate(
id = "mymod-broadcast-task", // 此任务的唯一 ID
server = server,
initialDelay = 0,
period = 5,
unit = TimeUnit.MINUTES,
runAsync = false, // 重要提示:false 表示在主服务器线程上运行
task = {
// 此代码是安全的,因为 runAsync 为 false
server.playerManager.broadcast(Text.literal("已经过去 5 分钟了!"), false)
}
)
其他特性
命令系统(CommandManager)
一个流畅的构建器,用于以更少的样板代码创建 Brigadier 命令。它自动处理权限检查,同时支持原版 OP 等级和 Fabric Permissions API。
val commandManager = CommandManager(modId = "mymod")
commandManager.command("hello", permission = "mymod.hello") {
executes { context ->
context.source.sendFeedback({ Text.literal("你好,世界!") }, false)
1 // 成功
}
subcommand("admin") {
executes { context -> /* ... */ }
}
}
// 别忘了注册它!
commandManager.register()
GUI 框架(CustomGui 与 AnvilGuiManager)
通过基于回调的逻辑、动态更新以及标题和描述行完整的 MiniMessage 支持,快速为你的玩家创建交互式 GUI。
// 简单箱子 GUI 示例
CustomGui.openGuiFormatted(
player = player,
title = "<gradient:gold:yellow>我的超棒 GUI",
layout = listOf(
CustomGui.createFormattedButton(
ItemStack(Items.DIAMOND),
"<blue>点击我!",
listOf("<gray>这是一个按钮。"),
player
)
),
onInteract = { context ->
if (context.slotIndex == 0) {
player.sendMessage(Text.literal("你点击了按钮!"))
CustomGui.closeGui(player)
}
},
onClose = { /* ... */ }
)
开发者指南:入门
要在你的项目中使用 EverlastingUtils,请将其添加到依赖项中。
build.gradle.kts
repositories {
// 添加托管 EverlastingUtils 的仓库
maven { url = "https://api.modrinth.com/maven" }
}
dependencies {
// 将库添加为依赖项
modImplementation("maven.modrinth:e-utils:1.1.2") // 替换为最新版本
}
fabric.mod.json
确保在你的 fabric.mod.json 文件中声明依赖。
"depends": {
"everlastingutils": ">=1.1.2" // 替换为你正在使用的版本
}
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。