NMS 季节染色
版本适配、批量群系更新、预算、持久化与降级。
当前方案
LISeasons 1.0.65 的季节群系颜色是纯客户端视图:
- 服务端照常向玩家发送真实区块;
- LISeasons 监听玩家收到的区块数据;
- 原始区块包发送完成后,通过 PacketEvents 追加
CHUNK_BIOMES; - 客户端使用季节目标群系重新计算草地、树叶、水面和天空颜色;
- 换季时,已有视距内的区块再按共享预算分批刷新。
插件不调用 Bukkit setBiome、refreshChunk,也不写 NMS 群系容器或 markUnsaved。
不会修改服务端群系
这条数据边界与 RealisticSeasons 官方描述的客户端数据包方案一致:看起来变了,服务端群系没有变化。
- 世界存档中的群系保持原样;
/locate biome和服务端群系查询仍使用真实群系;- Bukkit API 和其他插件读取到的仍是真实群系;
- 关闭 LISeasons 后不需要还原群系存档;
- 不会因为季节颜色把平原永久保存成雪原。
玩家客户端的 F3 群系显示可能变成当前伪装目标,这是客户端视图,不代表存档已经改变。
参考:RealisticSeasons 官方 FAQ明确说明其群系外观通过客户端数据包实现,不改变服务端群系。
PacketEvents 是强制前置
PacketEvents 负责:
- 按玩家客户端协议解析目标群系;
- 构造并合并
CHUNK_BIOMES; - 在玩家新收到区块时自动追加季节群系包;
- 静默发送 LISeasons 自己生成的数据包,避免重复进入监听链。
plugin.yml 使用 depend: [packetevents]。缺失 PacketEvents 时,LISeasons 不会加载;低于 2.13.0 时,颜色模块拒绝初始化。ProtocolLib 不再需要。
支持版本
当前编译基线和配置支持:
- Paper/Leaves/Lophine 1.21.1-1.21.8;
- 1.21.9(Paper 官方只有 Alpha 构建);
- 1.21.10;
- 1.21.11;
- 26.1.x,包括 26.1.2;
- 26.2。
Folia 使用独立区域调度路径,真实加载验证从官方稳定构建 1.21.8 开始。PaperMC 官方没有 Folia 1.21.1 构建,因此不声明不存在的 Folia 1.21.1 运行验证。
染色模块已经不依赖 CraftBukkit/NMS 类和字段;兼容重点变为 Paper API、PacketEvents 版本和对应客户端协议。
默认配置
season-switch:
spring: true
summer: true
autumn: true
winter: true
interval-ticks: 40
biome-spoof:
radius-chunks: 8
budget-chunks-per-tick: 8
packet:
enable: true
max-chunks-per-packet: 64
seasons:
spring: "flower_forest"
summer: "plains"
autumn: "windswept_savanna"
winter: "snowy_plains"
| 键 | 说明 |
|---|---|
season-switch.<season> |
单独控制某个季节是否发送颜色伪装 |
interval-ticks |
已有区块的分批检查间隔 |
radius-chunks |
玩家周围候选区块半径,取值 1~32 |
budget-chunks-per-tick |
所有玩家共享的每轮检查预算,取值 1~64 |
packet.enable |
PacketEvents 客户端季节颜色总开关 |
packet.max-chunks-per-packet |
单个 CHUNK_BIOMES 最多合并的区块数,取值 1~128 |
seasons.<season> |
当前季节在客户端伪装成的原版群系键 |
升级 1.0.63 时,旧 biome-spoof.nms.enable 和 max-chunks-per-packet 会迁移到 biome-spoof.packet,已有开关和数值保持不变。迁移完成后旧 nms 节点会从配置中移除。
与 RealisticSeasons 的差异
二者现在都遵循“不修改服务端群系,只改变客户端视图”的原则,但 LISeasons 当前实现更简单:
- LISeasons 把一个季节映射到一个现有的原版目标群系;
- RealisticSeasons 文档提供按真实群系分别设置草、叶、水、天空、雾的十六进制颜色;
- LISeasons 尚未注入自定义 RGB 群系,也没有四阶段颜色混合;
- 因此当前 LISeasons 的颜色可配置粒度不等同于 RealisticSeasons。
桦树叶和云杉叶的颜色由客户端材质规则固定,单纯更换群系可能不明显。visual-effects.autumn-leaf-color 是另一个模块,会真实替换部分叶块;必须保留原树种的服务器应单独关闭它。
性能与缓存
- 新区块:监听原始区块包并自动追加一次群系包;
- 换季:按共享预算刷新已在视距内的区块;
- 移动:缓存只保留玩家当前世界和配置半径内的区块;
- 重进或换世界:清理玩家缓存和旧世界目标;
- 普通 Paper 与 Folia 都不读取其他区域的区块数据,只发送玩家数据包。
高在线时优先降低 radius-chunks,其次降低 budget-chunks-per-tick。max-chunks-per-packet 建议保持 32~64。
不变色检查表
- 确认 LISeasons 为 1.0.65;
- 确认 PacketEvents 2.13.0 或更高兼容版本已启用;
- 确认
biome-spoof.packet.enable: true; - 确认当前季节的
season-switch为true; - 确认当前世界已启用季节;
- 重新进入世界,或等待预算刷新视距;
- 搜索日志中的
PacketEvents、CHUNK_BIOMES、客户端群系伪装错误; - 确认替换 Jar 后执行了完整重启。
如果日志出现:
bitsPerEntry must be between 1 and 32, inclusive
说明仍在使用 1.0.64 的单群系包构造路径。1.0.65 已改用协议原生的单值调色板,不会再创建非法的 0-bit 存储;更新 LISeasons Jar 后完整重启即可。