DeerFoliaPlus 相比于 DeerFolia 引入了更多额外功能,这些功能并非性能优化方面的改动,而是增强了服务器的功能性。
- FakePlayer (Leaves/Lumina)
- Bedrock-style Stronghold Generation — 基岩版风格的要塞生成,随机无限分布代替 Java 版的 128 个环状分布
- Syncmatica Protocol — 服务端与客户端之间共享 Litematica 投影,支持上传/下载/修改
- Servux Protocol — 为 MiniHUD/Litematica 提供结构边界框叠加层和实体 NBT 数据查看
- Recipe Sync Protocol — 向 NeoForge/Fabric 客户端同步完整配方数据,支持 JEI 等模组显示服务器配方
- Custom Recipe System — 通过配置文件定义自定义合成、烧炼、营火烹饪、高炉、切石机等配方
- Posture System — 支持原地坐下、躺下、趴下,以及将楼梯/台阶识别为可坐下的椅子
- 实用快捷命令 — 快速设置时间/天气、飞行、无敌、帽子、复制物品、自杀、查看玩家背包,以及快速打开末影箱和各类工作台
所有配置项位于 config/deer-folia-plus.yml 中,以下为各功能的配置说明:
| 配置项 | 默认值 | 说明 |
|---|---|---|
fake-player.enable |
true |
是否启用假人功能 |
fake-player.limit |
1 |
每个玩家最多创建的假人数量 |
fake-player.prefix |
"" |
假人名称前缀 |
fake-player.suffix |
"" |
假人名称后缀 |
fake-player.always-send-data |
true |
是否始终发送假人数据 |
fake-player.resident-fake-player |
true |
是否在服务器关闭时保存假人并在启动时恢复 |
fake-player.open-bot-inventory |
true |
是否允许打开假人物品栏 |
fake-player.skip-sleep-check |
true |
假人是否跳过睡觉检测 |
fake-player.spawn-phantom |
false |
假人是否生成幻翼 |
fake-player.can-ride-entity |
true |
假人是否可以骑乘实体 |
fake-player.use-action |
true |
假人是否可以使用 Action 系统 |
fake-player.modify-bot-permission |
Enum: OWNER |
修改假人的权限等级 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
bedrock-stronghold-generation.enabled |
false |
启用基岩版风格的要塞随机分布 |
bedrock-stronghold-generation.spacing |
48 |
要塞之间的平均距离(区块) |
bedrock-stronghold-generation.separation |
12 |
要塞之间的最小距离(区块),需小于 spacing |
| 配置项 | 默认值 | 说明 |
|---|---|---|
syncmatica.enable |
false |
启用 Syncmatica 协议支持 |
syncmatica.use-quota |
false |
启用上传配额限制 |
syncmatica.quota-limit |
40000000 |
配额启用时的最大上传大小(字节) |
| 配置项 | 默认值 | 说明 |
|---|---|---|
servux.structure-protocol |
false |
启用结构边界框叠加协议(MiniHUD 结构显示) |
servux.entity-protocol |
false |
启用实体数据协议(实体/方块实体 NBT 查看) |
| 配置项 | 默认值 | 说明 |
|---|---|---|
recipe-sync.neoforge |
true |
是否向 NeoForge 客户端发送 neoforge:recipe_content 配方同步数据 |
recipe-sync.fabric |
true |
是否向 Fabric 客户端发送 fabric:recipe_sync 配方同步数据 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
custom-recipe.enabled |
false |
是否启用自定义配方系统,启用后会从配置文件加载自定义配方 |
自定义配方内容定义在 config/custom-recipes.yml 中,可用于添加自定义合成、烧炼、高炉、营火烹饪、切石机等配方。
| 配置项 | 默认值 | 说明 |
|---|---|---|
posture.enabled |
false |
是否启用姿态系统;关闭时姿态命令与椅子交互均不可用 |
posture.chair-interaction |
true |
是否允许玩家空手右键楼梯或台阶坐下 |
posture.require-side-signs |
false |
是否要求一整排椅子的两端各有一个普通告示牌或墙上告示牌 |
posture.max-chair-chain-length |
8 |
连续楼梯/台阶可被识别为同一排椅子的最大数量,超过则不视为椅子 |
使用说明:
- 启用后,玩家可以空手右键下半砖或底部楼梯坐下;连续的楼梯或台阶会按同一排椅子识别,每个方块对应一个座位。
- 楼梯会按朝向修正坐姿位置;台阶会自动按连续长度更长的方向识别座位朝向。
posture.require-side-signs开启后,只有当整排椅子的首尾两端都有告示牌时,才允许右键坐下。/sit和/lay会锁定玩家位置,期间不能移动;/crawl会让玩家保持爬行姿态,但仍可正常移动。- 玩家可使用
/get-up主动起身;处于坐下或躺下状态时,也可以通过潜行或跳跃快速起身。
以下姿态命令默认对所有玩家开放:
| 命令 | 权限节点 | 说明 |
|---|---|---|
/sit |
deerfoliaplus.command.sit |
原地坐下;启用椅子交互后也可通过空手右键楼梯或台阶坐下 |
/lay |
deerfoliaplus.command.lay |
原地躺下,并锁定在当前位置 |
/crawl |
deerfoliaplus.command.crawl |
进入爬行状态,同时保留移动能力 |
/get-up |
deerfoliaplus.command.get-up |
从坐下、躺下或爬行状态恢复站立 |
以下命令无需额外配置,安装即可使用。带 * 标记的命令默认所有玩家可用,其余默认仅 OP 可用。
| 命令 | 权限节点 | 说明 |
|---|---|---|
/day |
deerfoliaplus.command.day |
将时间设置为白天(1000 tick) |
/noon |
deerfoliaplus.command.noon |
将时间设置为正午(6000 tick) |
/night |
deerfoliaplus.command.night |
将时间设置为夜晚(13000 tick) |
/rain |
deerfoliaplus.command.rain |
将天气设置为下雨 |
/storm |
deerfoliaplus.command.storm |
将天气设置为雷暴 |
/sun |
deerfoliaplus.command.sun |
将天气设置为晴天 |
/fly [player] |
deerfoliaplus.command.fly |
切换飞行模式,可指定玩家 |
/god [player] |
deerfoliaplus.command.god |
切换无敌模式,可指定玩家 |
/hat * |
deerfoliaplus.command.hat |
将主手物品戴在头上,头上有物品则交换到主手 |
/more [amount] |
deerfoliaplus.command.more |
复制主手物品到指定数量(默认增加到最大堆叠) |
/suicide * |
deerfoliaplus.command.suicide |
玩家自杀 |
/inspect <player> |
deerfoliaplus.command.inspect |
查看并操作目标玩家的背包、物品栏、装备 |
| /enderchest | deerfoliaplus.command.enderchest | 直接打开自己的末影箱 |
| /workbench | deerfoliaplus.command.workbench | 直接打开 3x3 合成台界面 |
| /craftingtable | deerfoliaplus.command.craftingtable | 直接打开 3x3 合成台界面 |
| /stonecutter | deerfoliaplus.command.stonecutter | 直接打开切石机界面 |
| /loom | deerfoliaplus.command.loom | 直接打开织布机界面 |
| /grindstone | deerfoliaplus.command.grindstone | 直接打开砂轮界面 |
| /anvil | deerfoliaplus.command.anvil | 直接打开铁砧界面 |
| /cartographytable | deerfoliaplus.command.cartographytable | 直接打开制图台界面 |
| /smithingtable | deerfoliaplus.command.smithingtable | 直接打开锻造台界面 |
- 克隆本仓库到本地;
- 在终端执行
./gradlew applyAllPatches应用补丁; - 完成后会在项目目录下生成
DeerFoliaPlus-server和DeerFoliaPlus-api,前者即为源码目录; - 执行
./gradlew createPaperclipJar,完成后会在DeerFoliaPlus-server/build/libs下生成服务器核心文件;
- 修改
DeerFoliaPlus-server或DeerFoliaPlus-api中的源码; - 在
DeerFoliaPlus-server或DeerFoliaPlus-api目录中将修改内容添加git add .并提交git commit,填写补丁信息; - 在根目录运行
./gradlew rebuildAllServerPatches,将刚才提交的修改生成为新补丁;
- 在
DeerFoliaPlus-server/src/main/java中新增相关文件; - 直接提交
git add .并提交git commit,填写补丁信息即可;
通过将与上游源码无关的新增文件独立开,减少对上游修改 patch 文件的长度使得项目更易于维护。
修改已有的补丁步骤相对复杂:
这种方法的工作原理是暂时将 HEAD 重置为所需的提交,然后使用 git rebase 进行编辑。
❗ 在编辑过程中,除非您 同时 将对应模块重置为相关提交,否则将无法编译。就 API 而言,您必须重新应用 Server 补丁,如果正在编辑 Server 补丁,则必须重新应用 API 补丁。还要注意的是,这样做时任何一个模块都可能无法编译。这不是一个正常的现象,但这种情况时有发生。请给 Paper 官方提交 ISSUE !
- 在
DeerFoliaPlus-server或DeerFoliaPlus-api目录中执行git rebase -i base,应该会输出 这样的 内容。 - 将你需要修改的补丁由
pick替换为edit然后保存退出;- 一次只能修改 一个 文件!
- 对你需要修改的补丁作出新的修改;
- 使用
git add .添加补丁,再使用git commit --amend提交;- 确保添加了
--amend选项 否则将会创建一个新补丁而不是修改原补丁。 - 此处提交时也可以修改补丁信息。
- 确保添加了
- 终端执行
git rebase --continue应用更新; - 再在跟项目目录执行
./gradlew rebuildAllServerPatches生成新的补丁;
如果你只是在编辑一个较新的提交,或者你的改动很小,那么在 HEAD 上进行改动,然后在测试后移动提交可能会更简单。
这种方法的好处是可以编译测试你的改动,而不必弄乱你的 HEAD。
- 修改相应位置源码;
- 提交修改(可以不写提交内容);
- 在
DeerFoliaPlus-server或DeerFoliaPlus-api目录中执行git rebase -i base,将刚才的提交移动到你想要修改的补丁提交下方; - 将新提交的
pick修改为如下内容:f/fixup:将你的新修改合并到补丁内,但不改变补丁信息;s/squash:将你的新修改合并到补丁内,并用新的补丁信息替换原补丁信息;
- 在跟项目目录执行
./gradlew rebuildAllServerPatches应用补丁更新;
- 修改相应位置源码;
- 提交修改内容
git commit -a --fixup <要修改的补丁 hash 值>;- 如果希望更新补丁信息,你可以使用
--squash替换--fixup; - 如果你不知道要修改的补丁 hash 值,你可以使用
git log查看; - 如果你只知道补丁的名称,你可以使用
git log --grep=<补丁名称>查看;
- 如果希望更新补丁信息,你可以使用
- 执行
git rebase -i --autosquash base,这将会自动将你的修改移动到对应的补丁下方; - 在跟项目目录执行
./gradlew rebuildAllServerPatches应用补丁更新;
- 首先在
gradle.properties中将deerFoliaRef更新为上游最新提交的 hash 值; - 应用更新的补丁:
./gradlew applyAllPatches。 - 如果存在冲突,解决冲突后执行
git add .将解决完的文件添加到暂存区;- 如果遇到
invalid object错误,可以使用git apply --reject <patch file>手动应用补丁; - 会生成
.rej文件,可在其中查看冲突内容,手动解决冲突; - 完成后删除
.rej文件,然后执行git add .;
- 如果遇到
- 然后运行
git am --resolved继续应用补丁; - 如果存在新的冲突,重复步骤 3 和 4;
- 全部补丁应用完成后,更新补丁:
./gradlew rebuildAllServerPatches。