All versions
2.1.0
Release
PieMotd 2.1.02 days ago 12
Compatibility
Minecraft: Java Edition
26.3
26.2
26.1.x
1.21.x
1.20.x
Platform
Paper
Changes
更新日志 (Changelog)
本文件记录 PieMotd 自 1.0.0 以来的全部变更。
[2.1.0] - 2026-10-23
新增
- WebUI:MOTD 轮换控制重构为两组独立分段切换控件——「随机/顺序」(轮换方式)与「按间隔/每次 ping」(轮换时机),四种组合任意可用,不再有互斥误导
- WebUI:头像管理重做为"目录即列表"——轮换列表自动取自 icons 目录内全部图片(FTP 手动放图也生效),支持网页上传(自动缩放为 64x64、按
icon1、icon2…顺序命名追加)与一键删除文件 - WebUI:MOTD / 欢迎标题预览中的变量渲染为友好名称标签(
%online%显示为「在线人数」,悬停可查看原始写法),渐变/彩虹逐字渲染不受影响 - 插件加载时输出品牌渐变色 ASCII 艺术字横幅(#FF512F → #DD2476 逐行插值,基于 ConsoleSender 真 RGB)
- 中英双语 README(README.md / README_en.md)
修复
- WebUI 头像删除报
not found:/api/icons列表路径缺少icons/前缀,与图片 / 删除接口的路径解析基准不一致(同时导致缩略图无法显示)
移除
- 内置示例头像 icon1-3.png,仅保留 default.png(π 品牌图)
- 配置项
server-icon.icons:轮换列表改由 icons 目录自动扫描,WebUI 保存时自动清除旧配置中的残留键
[2.0.0] - 2026-10-23
新增
- 全新 WebUI 可视化配置界面
- 基于 JDK 内置 HttpServer,无额外运行时依赖
- 双模式部署:
PORT独立端口 /PATH子路径(适配单端口面板服反向代理),前端全部相对路径,两模式零改动适配 - 鉴权:控制台生成 128-bit 单次登录令牌(默认 10 分钟有效)→ HttpOnly + SameSite=Strict 会话 Cookie(默认 12 小时,滑动续期);登录限速(失败 10 次封禁 IP 60 秒)
- config.yml 全部配置项可视化编辑;保存保留原文件注释,写入后在主线程同步重载,立即生效
- MiniMessage 实时预览:渐变逐字符插值、彩虹、粗斜下划线、混淆字符动画
- 配置写入防呆:数值钳制、路径穿越清洗、枚举白名单,非法值保留原值并返回警告
- 响应携带 nosniff / X-Frame-Options / no-store 安全头
- 顶栏显示插件版本、MC 版本、在线人数、TPS
- 多语言体系重构:单一 language.yml 拆分为
lang/目录(zh_cn / en_us),首次运行自动释放,支持自定义语言与缺失回退链(配置语言 → en_us → zh_cn) - 欢迎标题显示模式完整实现:
EVERY_TIME(每次进入)/FIRST_JOIN(仅首次)/ONCE_PER_DAY(每天一次,基于玩家数据容器持久化,跨重启有效;旧配置ONCE_PER_SESSION自动映射) - 内置 π 品牌默认头像(64x64),首次运行自动释放到 icons 目录;WebUI 品牌区同步使用 π logo
修复
以下均为 1.0.0 遗留问题:
- 移除
--enable-preview编译标志:原构建产物在普通 JVM 上直接抛 UnsupportedClassVersionError,插件无法加载 - 顺序轮换模式在重载后消息列表变少时数组越界(
currentIndex未重置),导致 MOTD 失效并刷错误 - 命令回复使用
§色号包裹在 Adventure 组件中,实际显示原始§c...文本;现统一接入语言文件并按 MiniMessage 解析 - MOTD / 头像轮换时间与配置不符:原实现为 ping 驱动且定时任务为空壳,
update-interval完全不生效;改为纯时间驱动(周期取模 + 周期边界重抽),配置秒数严格生效,随机模式不连续重复同一条 - 欢迎标题
display-mode配置项完全未实现(无论配什么都每次显示) - 头像 128x128 能通过校验但 Bukkit 只接受 64x64,导致运行时加载失败并刷警告;现统一在加载阶段校验
- 每次 ping 都从磁盘读取并转换头像 → 改为加载时预缓存 CachedServerIcon,ping 时零磁盘 IO
- 语言文件(language.yml)从未被任何代码引用,
settings.language配置无效;现全部消息接入语言文件 - 玩家名可注入 MiniMessage 标签(包括
<click:run_command:...>等交互组件),替换前已做转义 - 进服延迟 1 秒后未检查
isOnline(),秒退玩家被当作在线处理 - Tab 补全不过滤权限,非管理员也能看到
preview选项;现按权限与输入前缀双重过滤 - TPS 格式化未指定 Locale,部分系统语言下显示为逗号小数(
20,00) - jar 资源打包遗漏:
icons/等非 yml 资源不会进 jar;已补全资源打包规则 - 配置 / 语言文件释放时未判空
getResource()返回值
变更
- 轮换机制重写:
update-enabled: false语义为每次 ping 切换,true时按update-interval严格轮换 - 轮换间隔代码默认值与 config.yml 统一(10 秒)
- 命令帮助与提示文案全部改为语言文件驱动,未知命令有专门提示
%server_version%改用getMinecraftVersion(),TPS 保留两位小数(Locale.US)
移除
- 空壳定时任务 MotdUpdateTask(时间驱动后无存在必要)
- IDE 模板残留文件 Main.java
- 死配置项
settings.debug、settings.auto-backup(代码从未读取) - 未使用的依赖
adventure-platform-bukkit、configurate-yaml;MiniMessage 与 Gson 改为 provided 作用域(Paper 自带) - config.yml 中所有 emoji
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:Q21SvXd4:1qTJ7H6T"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Q21SvXd4:1qTJ7H6T"
}

