Proxy Compatible Forge

Proxy Compatible Forge

该模组将Velocity的现代、Lucko的BungeeGuard以及BungeeCord的传统玩家信息转发模式带到了Neo/Forge服务器上

管理

Proxy Compatible Forge 代理兼容版

Github Github Issues Discord

Github Releases Modrinth

特别感谢 FabricProxy-Lite 和 CrossStitch 在模组代理领域的开拓性工作。我们在移植和适配 Neo/Forge 环境方面做了不少工作,但不可否认我们是站在巨人的肩膀上。

该模组将 Velocity 的 modern、 Lucko 的 BungeeGuard 以及 BungeeCord 的旧版玩家信息转发模式带到了 Neo/Forge 服务器。

支持的版本/平台

  • Forge 1.7.2 - 26.2 版本
  • NeoForge 1.20.1 - 26.2 版本
  • SpongeForge/SpongeNeo
    • 通常不需要 PCF,因为 Sponge 支持旧版+新版转发和命令参数包装
    • 但如果安装了 Forgified Fabric API(特别是 fabric_networking_api_v1),可能需要使用 PCF 并禁用 Sponge 的转发功能
  • Bukkit+Neo/Forge 混合服务器
    • 尽可能使用混合服务器自带的转发支持,如果其实现不兼容则使用 PCF

更多关于支持的平台和整合包的信息,请参阅 兼容性 页面。

快速入门

关于 Forge 1.13 - 1.20.1 的说明

如果你想在 Velocity 代理后面托管现代 Forge 服务器(1.13 - 1.20.1),请查看 Ambassador:https://modrinth.com/plugin/ambassador

注意:Ambassador 1.2.0-beta 或更高版本不再需要此模组,但如果你想要现代转发功能,仍然可以使用它。

安装

以下步骤假设你已经 配置好了 Velocity 代理 并且有一个可用的环境。

  1. 下载此模组并将其放入 Neo/Forge 服务器的 mods 文件夹中(可在 Modrinth 或 Releases 标签页中找到 JAR 文件)。
  2. 启动 Neo/Forge 服务器以生成默认配置文件。
  3. 停止 Neo/Forge 服务器。
  4. 打开 config 文件夹中的 proxy-compatible-forge.toml,将你的转发密钥填入 forwarding.secret 配置字段。
  5. 在 server.properties 中确保 online-mode 设置为 false。
  6. 现在你可以启动服务器并通过 Velocity 连接它了!

配置

配置文件位于 config/proxy-compatible-forge.toml,包含以下选项:

设置组 设置名称 默认值 描述
forwarding enabled true 启用或禁用玩家信息转发。更改此设置需要重启服务器。
forwarding mode "MODERN" 使用的转发类型。
forwarding secret "" 用于验证玩家连接来自受信任代理的密钥。
forwarding approvedProxyHosts [] 受信任的代理主机名或 IP 地址列表。如果连接的代理主机名或 IP 不在此列表中,玩家将被断开连接。留空以允许所有。
crossStitch enabled true 启用或禁用 CrossStitch 支持。更改此设置需要重启服务器。
crossStitch forceWrappedArguments [] 在此添加不兼容的模组或原版命令参数类型。
crossStitch forceWrapVanillaArguments false 强制包装原版命令参数类型。当上述设置变得过时时很有用。
debug enabled false 启用或禁用调试日志。
debug disabledMixins [] 要禁用的 Mixin 列表。使用 Mixin 的名称并加上其部分或完整包名作为前缀。
advanced modernForwardingVersion "NO_OVERRIDE" 覆盖由 PCF 决定的现代转发版本。如果遇到聊天签名问题,请将其改为 "MODERN_DEFAULT"。更改此设置需要重启服务器。

功能特性

玩家信息转发

如上所述,PCF 实现了 Velocity 的 MODERN 转发协议,允许你在代理后面安全地托管模组服务器。

支持现代转发版本 1-4:

名称 值 支持的 MC 版本
MODERN_DEFAULT 1 任意
MODERN_FORWARDING_WITH_KEY 2 1.19
MODERN_FORWARDING_WITH_KEY_V2 3 1.19.1 - 1.19.2
MODERN_LAZY_SESSION 4 1.19.3 及以上

如果遇到聊天签名相关的兼容性问题,请报告问题,然后将 PCF 配置中的 advanced.modernForwardingVersion 改为 MODERN_DEFAULT。

接下来,BUNGEEGUARD 转发要求你使用 Velocity 的 BUNGEEGUARD 转发模式,或者使用安装了 BungeeGuard 插件的 BungeeCord。

最后,LEGACY 转发要求你使用 Velocity 的 LEGACY 转发模式或 BungeeCord 并启用 IP 转发。建议不要使用此转发模式,但你可以使用 forwarding.approvedProxyHosts 设置来在一定程度上保护安全。

模组命令参数包装,即 CrossStitch

这可以解决类似以下错误:

io.netty.handler.codec.CorruptedFrameException: Error decoding class com.velocitypowered.proxy.protocol.packet.AvailableCommandsPacket

PCF 移植了此 Fabric 模组的模组命令参数包装功能,允许它们通过 Velocity 发送,而无需为每个模组添加的命令参数编写自定义数据包反序列化器。请注意,BungeeCord 不支持包装的命令参数,因此如果你使用(或运行 BungeeCord 的分支),可能需要禁用此功能。

在少数情况下,模组会在 minecraft 命名空间下注册其命令参数,或者修改原版参数,绕过 PCF 的参数包装器。在这种情况下,你可以将自定义参数的 ID 添加到 PCF 的 crossStitch.forceWrappedArguments 设置中,强制 PCF 包装该参数。

在模组在原版之前注入并注册其参数,导致所有参数 ID 值偏移的情况下,你可以启用 crossStitch.forceWrapVanillaArguments 设置来强制包装 minecraft 和 brigadier 命名空间。这更像是一个临时解决方案,因为偏移的参数 ID 无法被 Velocity 读取,如果客户端上的参数 ID 具有相同偏移,Velocity 命令也无法被客户端读取,除非你通过权限禁用代理上的所有命令或移除添加命令的插件,否则将完全阻止连接。

判断是否发生此情况的最简单方法是启用 PCF 配置中的调试日志,检查 brigadier:boolean 的参数 ID 是否不是 0。

常见的解决方法是让相关模组将其注册 Mixin 改为 RETURN,并确保其参数的注册使用其 modid 作为命名空间。

如果你发现任何奇怪的参数,请提交 issue,以便我们将其添加到默认配置中,或者利用提供的信息为导致问题的模组编写 PR。

常见问题

频道过多(Too Many Channels)

客户端错误:

Invalid payload REGISTER!

Velocity:

Velocity 修复:在 Velocity 启动参数中添加 -Dvelocity.max-known-packs=#,其中 # 是 64 + 模组数量 × 1.5(向上取整)的数字。

例如:对于 40 个模组,使用 64 + 40×1.5 = 124,所以 -Dvelocity.max-known-packs=124

Paper 服务器错误:

[00:00:00 ERROR]: Couldn't register custom payload
java.lang.IllegalStateException: Cannot register channel 'modid:channel'. Too many channels registered!

Paper 修复:在 Paper 服务器启动参数中添加 -Dpaper.disableChannelLimit=true

注意:由于涉及大量频道和模组,加入原版服务器时客户端上的纹理/物品可能会出现不匹配。

发生内部服务器连接错误

客户端错误:

An internal server connection error occurred.

Velocity 错误:

io.netty.handler.codec.CorruptedFrameException: Packet sent for class com.velocitypowered.proxy.protocol.packet.PluginMessagePacket was too big (expected 1234567 bytes, got 7654321 bytes)

在 Velocity 端解决:在 Velocity 启动参数中添加 -Dvelocity.max-plugin-message-payload-size=#######,其中 ####### 比错误信息中最后的 "got ####### bytes" 数字稍大一些。重复此操作直到你的客户端能够登录。

构建项目

  1. 克隆仓库。git clone https://github.com/adde0109/Proxy-Compatible-Forge.git

  2. 在项目根目录下运行 ./gradlew build(Windows 上为 gradlew.exe build)

  3. JAR 文件将在 build/libs/ 目录中