WaterdogPE
——by 一只鸽纸
未经允许,严禁转载!
一、前言
二、使用WaterdogPE开设群组服的优势
三、使用WaterdogPE前的准备
首先是玩家用客户端登陆WaterdogPE代理服务端(这个服务端本身只是起一个网络转发的作用,它本身并不会创建地图,也就是说单独开启WaterdogPE服务端是无法登入的),然后WaterdogPE代理服务端会把你的数据转发到子服务器上面,子服务器可以是普通的Nukkit/PowerNukkit/PocketMine等服务端。假设我们在这里有“登陆服、生存服、游戏服”三个服务端,并且将“登陆服”设置为默认登陆到的服务器,那么当玩家连入WaterdogPE代理端时,实际上就会进入到“登陆服”中。
然后玩家可以使用一些命令在“登陆服”、“生存服”、“游戏服”之间互相传送,而这个传送过程就和单服内多世界的切换一样简单,跳过了传统使用Transfer命令跨服时保存本服务器世界、定位其他服务器、加载世界的繁琐且耗时较长的过程,玩家仅仅看到一个短暂的跨世界画面之后就进到了另一个服务器里,可以说是无缝跨服了。
但是WaterdogPE仅仅是起到了转发玩家的功能,本身是没有跨服同步玩家背包、经济数据等功能的。如果你有这方面需要,你就要搭配数据库和支持数据库的插件使用来达到同步玩家数据的功能。当然,如果你的服务器各个子服玩法不同且无需同步数据,那就不用操心数据库的事情了,把WaterdogPE当成一个快速跨服工具即可。所以,对数据库这方面知识没有掌握的服主,也不建议搭设需要跨服同步数据群组服,否则十分容易弄巧成拙。
下面让我们正式开始吧。
四、WaterdogPE的下载与安装
Java:
java -jar waterdog.jar
在Windows系统上,你需要创建一个.bat(即批处理)文件,将以上命令写进.bat文件里,将这个.bat文件放在WDPE所在的目录下并双击启动;在Linux系统上,需要切换到WDPE核心所在的目录下,然后输入这行命令并回车执行。这里我放几张图片进行说明,以免我拙劣的语言表达能力造成有人还是看不懂(已经明白的可以直接跳过):
在Windows上:
在Linux上:

logs是服务端日志,一般不用管。当你服务端遇到莫名其妙的崩溃时,就可以查看日志找出是哪里的错误;
packs是放置资源包的文件夹。目前WDPE已经支持绝大多数基岩版材质包的加载,但不能加载addon、js等;
plugins是插件文件夹。没错,WDPE是有插件的,可以根据你的需要下载安装:https://cloudburstmc.org/resources/categories/waterdogpe-plugins.32/
lang.ini是WDPE的语言文件,可以根据需要进行修改,但一定要注意格式;
config.yml是WDPE的配置文件,是重中之重,下面将着重讲解如何进行配置。
五、WaterdogPE群组服的配置
YAML:
# Waterdog Main Configuration file
# Configure your desired network settings here.
# A list of all downstream servers that are available right after starting
# address field is formatted using ip:port
# publicAddress is optional and can be set to the ip players can directly connect through
servers:
lobby1:
address: 127.0.0.1:19133
public_address: play.myserver.com:19133
server_type: bedrock
listener:
# The Motd which will be displayed in the server tab of a player and returned during ping
motd: §bWaterdog§3PE
# The server priority list. If not changed by plugins, the proxy will connect the player to the first of those servers
priorities:
- lobby1
# The address to bind the server to
host: 0.0.0.0:19132
# The maximum amount of players that can connect to this proxy instance
max_players: 20
# Map the ip a player joined through to a specific server
# for example skywars.xyz.com => SkyWars-1
# when a player connects using skywars-xyz.com as the serverIp, he will be connected to SkyWars-1 directly
forced_hosts: {}
# Case-Sensitive permission list for players (empty using {})
permissions:
TobiasDev:
- waterdog.player.transfer
- waterdog.player.list
alemiz003:
- waterdog.player.transfer
- waterdog.player.list
# List of permissions each player should get by default (empty using [])
permissions_default:
- waterdog.command.help
- waterdog.command.info
# Whether the debug output in the console should be enabled or not
enable_debug: false
# If enabled, encrypted connection between client and proxy will be created
upstream_encryption: true
# If enabled, only players which are authenticated with XBOX Live can join. If disabled, anyone can connect *with any name*
online_mode: true
# If enabled, the proxy will be able to bind to an Ipv6 Address
enable_ipv6: false
# If enabled, the proxy will pass information like XUID or IP to the downstream server using custom fields in the LoginPacket
use_login_extras: true
# Replaces username spaces with underscores if enabled
replace_username_spaces: false
# Whether server query should be enabled
enable_query: true
# If enabled, when receiving a McpeTransferPacket, the proxy will check if the target server is in the downstream list, and if yes, use the fast transfer mechanism
prefer_fast_transfer: true
# Fast-codec only decodes the packets required by the proxy, everything else will be passed rawly. Disabling this can create a performance hit
use_fast_codec: true
# If enabled, the proxy will inject all the proxy commands in the AvailableCommandsPacket, enabling autocompletion
inject_proxy_commands: true
# Upstream server compression ratio(proxy to client), higher = less bandwidth, more cpu, lower vice versa
upstream_compression_level: 6
# Upstream server compression ratio(proxy to downstream server), higher = less bandwidth, more cpu, lower vice versa
downstream_compression_level: 2
# Education features require small adjustments to work correctly. Enable this option if any of downstream servers support education features.
enable_edu_features: false
# Enable/Disable the resource pack system
enable_packs: true
# If this is enabled, the client will not be able to use custom packs
overwrite_client_packs: false
# If enabled, the client will be forced to accept server-sided resource packs
force_server_packs: false
# You can set maximum pack size in MB to be cached.
pack_cache_size: 16
# Creating threads may be in some situations expensive. Specify minimum count of idle threads per internal thread executors. Set to -1 to auto-detect by core count.
default_idle_threads: -1
YAML:
servers:
lobby1:
address: 127.0.0.1:19133
public_address: play.myserver.com:19133
server_type: bedrock
这里lobby1就是下游服务器的名字,不要和其他服务器重复,且最好设置一个好记的名字,因为之后跨服等操作都会用的上。我个人建议把你要设置为大厅服务器的下游服务器放在这里的第一位,当然你也可以随意排列,毕竟是根据优先级判断大厅服的,我只是推荐你养成一个良好的习惯。
address就是这个下游服务器的地址,包括两部分:IP和端口。这里的IP是内网IP,端口也是内网端口。注意,所有下游服务器的内网IP要和WDPE本身的内网IP相同,但内网端口不能相同。内网IP要根据你自己服务器主机的内网IP来设置,一般买服务器时会给,或者问你的服务商去,实在不知道的就填0.0.0.0自动识别。假设你服务器的内网IP是192.168.1.8,那address这里就填192.168.1.8:端口。当然端口也是要按照你自己的实际情况更改的。
public_address是公网地址,包括公网IP和公网端口。这个是可选的,因为WDPE可以只需要一个公网端口用于连接整个群组服,而其余的下游服务器只要用内网连接即可,无需开放公网端口,这样也能保证安全,减少公网端口资源的占用。如果你开放下游服务器的公网地址,那么玩家就可以直连这些下游服务器。且不说这样做你开群组服的意义何在,尤其是那些小游戏服,让玩家直连下游服务器可能导致许多未知的错误。还有很多服主的服务器只有一两个公网端口,为所有下游服务器开放公网地址直连也是不现实的,这时WDPE的作用就显现出来了。
server_type是此下游服务器的类型,默认是bedrock即基岩版。既然你是来开基岩版群组服的,那这个选项也就不用更改了。
你可以按照该格式无限添加下游服务器,例如这样:
YAML:
servers:
lobby1:
address: 127.0.0.1:19133
public_address: play.myserver.com:19133
server_type: bedrock
SkyWars-1:
address: 127.0.0.1:19134
public_address: play.myserver.com:19134
server_type: bedrock
GunWar-1:
address: 127.0.0.1:19135
public_address: play.myserver.com:19135
server_type: bedrock
注意格式,别复制粘贴错位置或者少了多了几行的。
motd就是显示在服务器列表上的内容,比如这里的“gunwar - v1.18.0”
priorities是下游服务器的优先级设置。一个群组服至少要有一个大厅服,来作为玩家登录服务器时进入的第一个服务器,玩家可以在大厅服选择其他子服游玩。这里要把你想作为大厅服的下游服务器的名字写到第一位,比如这样:
YAML:
priorities:
- lobby1
那么排在第一位的lobby1服务器就成为玩家登录服务器时进入的第一个服务器了,也就是主大厅,不过前提是没有使用其他插件进行更改。
host是WDPE的连接地址,格式是内网IP:端口。前面我们说过,WDPE是一个独立的代理服务端,自然也和其他的服务端一样需要占用单独的进程和端口。这里给WDPE用的端口一定要开放到公网,且不能与任何下游服务器端口冲突。同时,WDPE的内网IP也要和所有下游服务器一致。我们仍然假设你的服务器内网IP是192.168.1.8,公网端口是19132,那么这里就要这么填:
YAML:
# The address to bind the server to
host: 192.168.1.8:19132
max_players是整个群组服的最大玩家数。请根据你的需要调整。
YAML:
# The maximum amount of players that can connect to this proxy instance
max_players: 114514
forced_hosts这个配置项比较有趣,根据注释我理解的是,这个选项可以允许玩家通过连接特定的IP进入特定的服务器,比如你服务器的IP是play.example.com,直接连接进入的是正常的lobby1服务器,想要玩SkyWars-1服务器就要通过主大厅的NPC菜单什么的进入;而如果你设置了对应的域名解析,就可以用skywars.example.com这个IP直接连接SkyWars-1这个服务器。我本人从来没有用过这个功能,相信大佬们应该可以用这个功能玩出花。
YAML:
# Map the ip a player joined through to a specific server
# for example skywars.xyz.com => SkyWars-1
# when a player connects using skywars-xyz.com as the serverIp, he will be connected to SkyWars-1 directly
forced_hosts: {}
permissions是给予特定的玩家权限。这里给的权限只对被给予的玩家生效,且全群组服生效。例如我们要给一个叫lT_Name的玩家和一个叫It_Name的玩家waterdog.player.transfer(传送玩家权限,也包括传送其他玩家的权限)和waterdog.player.list(查看全群组服在线玩家列表)权限,就可以这么写(如果需要留空请用{}代替):
YAML:
permissions:
lT_Name:
- waterdog.player.transfer
- waterdog.player.list
IT_Name:
- waterdog.player.transfer
- waterdog.player.list
permissions_default是玩家进入群组服的默认权限,也是全群组服生效,是每个进入服务器的玩家都会有的权限。例如给所有进入服务器的玩家waterdog.command.help(查询命令帮助)和waterdog.command.info(查询服务器信息)的权限,就可以这样写(如果需要留空请用[]代替):
YAML:
permissions_default:
- waterdog.command.help
- waterdog.command.info
enable_debug为是否开启debug模式,一般是给开发者用的,没有开发的需要或检查服务器问题的需要一般保持默认关闭即可,免得刷屏。
upstream_encryption为是否开启客户端与服务端间加密连接,默认保持开启即可。
online_mode:在线模式。这是一个很重要的配置项!由于微软XBOX服务和WDPE的一些蜜汁特性,如果开启在线模式(其实就相当于Nukkit中的开启XBOX验证)会导致玩家大概率无法进入服务器。因此WDPE的在线模式是必须要关闭的(也就是把true改为false)。同时,WDPE关闭在线模式后,下游服务器也必须是关闭XBOX验证的状态才行,因此所有下游服务器的XBOX验证(也就是xbox_auth=那项)都要改成off。不过关闭XBOX验证也意味着一些玩(纪)家(狗)有可能通过特殊手段绕开XBOX登录直接进入服务器大搞破坏,所以建议关闭在线模式后要加强对服务器的安全防护,例如加装登录插件等等。
enable_ipv6为是否启用IPV6。目前大部分服主都用不上,这项默认关闭即可。什么是IPV6?(来自百度百科):
use_login_extras
replace_username_spaces:是否替换玩家名中的空格,默认不替换。众所周知,基岩版XBOX ID允许玩家名中带有空格。然而空格玩家名也导致了许多问题,许多插件都需要进行专门的调整才能允许为名字中带有空格的玩家执行,例如在@p玩家变量前后加上英文双引号""。开启本选项后,玩家名字中的空格会被替换为“_”,会方便许多。但需要注意的是,玩家名变动后,一些依靠玩家名储存的数据可能会丢失,因此请在已有部分玩家数据的情况下谨慎开启本选项。
enable_query
prefer_fast_transfer
use_fast_codec
inject_proxy_commands
upstream_compression_level
downstream_compression_level
enable_edu_features:是否开启教育版模式。如果你的下游服务器有支持教育版内容的,就把此项改为true。
enable_packs:是否启用资源包系统。目前WDPE已支持大部分基岩版光影材质包加载,但不支持addon、js加载。开启本选项后,玩家进服时将提示本服务器已应用资源包,是否下载?玩家可以选择下载后进入服务器或直接进入服务器而不下载资源包。这里的资源包将会在全群组服生效。
overwrite_client_packs:是否允许客户端使用自定义资源包。如果开启,服务器将尝试禁止玩家客户端设置的全局资源包在服务器中加载。可避免一些矿物透视等资源包的使用。但也会影响部分玩家的游戏体验。默认关闭。
force_server_packs:是否强制玩家加载服务器资源包。如果开启,玩家进入服务器时将只能选择下载资源包并进入服务器或直接退出服务器。适合一些必须要搭配资源包才能获得良好游戏体验的服务器使用。
pack_cache_size
default_idle_threads
配置文件到这里就讲解完毕,没有解释的配置项是一般情况下保持默认设置就能用的。
六、如何连接下游服务器
这是本人在原TransferWDPE的基础上改制的插件。原插件并未发布在任何论坛上,仅在Github有下载地址:GitHub - VazziDE/TransferWDPE-Nukkit: TransferWDPE-Nukkit 是一个 nukkit 插件,用于通过 waterdogpe 代理转移玩家。
但是原插件有许多限制,比如语言是英文、仅拥有相应权限才能传送玩家等。本人在此基础上稍微修改了一下,使得它可以作为普通的跨服传送插件使用。具体的插件使用说明请见插件发布贴内,我在这里唯一要提醒的就是这个插件是Nukkit插件,不要防到WDPE的插件文件夹里。搭配插件后,玩家跨服只会看到一个十分快的“过场动画”就能进入其他服务器,非常稳定快速。
七、尾声
本教程到这里已经基本结束。写这篇教程的过程中我经历了两次没有成功保存的事故,因此后续部分写的可能有些仓促和混乱,希望大家多多包涵。本人不是十分专业的开发者,仅仅是抱着一颗想造福众多服主的心来完成这篇教程,如有问题,欢迎指出。教程编写不易,希望您能给予鼓励!
—— 从不咕咕的鸽纸
2022/1/15
2022/1/15
(终于写完了,累死我了)
最后编辑: