WaterdogPE教程

从不咕咕的鸽纸留言 | 贡献2022年5月8日 (日) 08:41的版本 (创建页面,内容为“'''WaterdogPE保姆级教程''' ——by 从不咕咕的鸽纸 未经允许,严禁转载! 一、前言 Waterdog的教程我半年前就想写了,但是一直因为种种原因没有动笔(老鸽子了我)。没想到半年过去了,我还没写教程,Waterdog已经没了(其实是改成WaterdogPE了,原来的Waterdog已经停更了)。现在放寒假了,趁着年前还没有多少繁重的事,赶紧把这个坑填了,免得鸽过…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

WaterdogPE保姆级教程

——by 从不咕咕的鸽纸

未经允许,严禁转载!

一、前言

Waterdog的教程我半年前就想写了,但是一直因为种种原因没有动笔(老鸽子了我)。没想到半年过去了,我还没写教程,Waterdog已经没了(其实是改成WaterdogPE了,原来的Waterdog已经停更了)。现在放寒假了,趁着年前还没有多少繁重的事,赶紧把这个坑填了,免得鸽过年不吉利(bushi)。

在此之前,我曾写过一篇使用Nemisys开设群组服的教程(详见:[教程][开服]Nemisys —— 搭建一个无缝跨服的群组服吧! - 基岩版插件&服务端 - Minecraft(我的世界)中文论坛 - (mcbbs.net))。不过时过境迁,Nemisys现在已经不再积极维护更新,没有开发能力的服主很难仅依靠少数人维护的Nemisys继续开群组服,无法保持及时更新。在Nemisys式微之时,Waterdog(以下简称WD)已经小有名气。不过当时的Waterdog本质上还是魔改的BungeeCord(以下简称BC),主要为Java版(以下简称JE)服务器服务,但也有对基岩版(以下简称BE)协议的支持。虽然本意是为了让基岩版玩家也能进入JE服务器,但当时已经有部分基岩版服主选择用WD支持BE的功能来开设BE的群组服。面对日益增长的需求,WD也改为了WaterdogPE(以下简称WDPE),着重针对基岩版进行优化。因此,WDPE与BC可以算得上是远房亲戚,两者在诸如原理等很多方面都是相通的,甚至配置方法和部分教程也是可以照猫画虎学来的。如果你曾经在JE使用BC开设过群组服,那么相信你对WDPE会很快上手;从来没接触过BC和WD的也没有关系,本教程会尽量通俗易懂地讲解WDPE的使用方法。本人还是保持一贯的写教程习惯,注重实用性,着重介绍如何使用,而不过多对原理进行讲解。


二、使用WaterdogPE开设群组服的优势

群组服可以通过把玩家分散到多个服务器,来降低CPU的负荷,并且充分利用多核CPU(使用WaterdogPE跨服技术可以让每个服务端的主线程都使用到单独的核心,提升整体负载能力)。你可以把不同的游戏内容搭载到不同的子服务器上面,例如一个服务器开生存模式,一个服务器开创造模式,而且不同服务器的背包等数据还可以不互通,或利用数据库实现互通。

相对于原来的Waterdog而言,WaterdogPE也做出了许多改进,例如:减少内存使用、更简洁的插件API、更方便的配置、易于进行修改、对基岩版新版本的积极支持、支持基岩版多版本(1.2.X——最新版本)加入服务器(前提是你的子服是支持多版本的核心,如NukkitPM1Edition等)、积极维护的开发文档等等,具体优点还是要亲自体验的好。


三、使用WaterdogPE前的准备

首先,你要清楚群组服的定义。跨服群组是很流行的一种分布式部署Minecraft服务端从而提高服务器硬件资源利用率的技术。说人话,就是当你的玩家数量和游戏数量较多,单服务端已无法支撑如此庞大的数据量时,可以通过搭设群组服将压力分散到各个子服。换句话说,如果你的玩家数量没有那么多,比如日均也就十几人的,那搭设群组服实在是没有必要,还会占用你大量资源(如果你只是想开群组服装自己很NB,那当我没说。不过2H2G的那种服务器就别凑热闹了,万一到时候内存溢出可别怪我没提醒)。

由于WaterdogPE和BungeeCord几乎是远房亲戚的关系,BungeeCord的一些原理也能在WaterdogPE这里通用,比如说工作原理:(以下这段内容部分来自天空学院的BungeeCord教程:https://www.mcbbs.net/thread-450015-1-1.html) 首先是玩家用客户端登陆WaterdogPE代理服务端(这个服务端本身只是起一个网络转发的作用,它本身并不会创建地图,也就是说单独开启WaterdogPE服务端是无法登入的),然后WaterdogPE代理服务端会把你的数据转发到子服务器上面,子服务器可以是普通的Nukkit/PowerNukkit/PocketMine等服务端。假设我们在这里有“登陆服、生存服、游戏服”三个服务端,并且将“登陆服”设置为默认登陆到的服务器,那么当玩家连入WaterdogPE代理端时,实际上就会进入到“登陆服”中。 然后玩家可以使用一些命令在“登陆服”、“生存服”、“游戏服”之间互相传送,而这个传送过程就和单服内多世界的切换一样简单,跳过了传统使用Transfer命令跨服时保存本服务器世界、定位其他服务器、加载世界的繁琐且耗时较长的过程,玩家仅仅看到一个短暂的跨世界画面之后就进到了另一个服务器里,可以说是无缝跨服了。 但是WaterdogPE仅仅是起到了转发玩家的功能,本身是没有跨服同步玩家背包、经济数据等功能的。如果你有这方面需要,你就要搭配数据库和支持数据库的插件使用来达到同步玩家数据的功能。当然,如果你的服务器各个子服玩法不同且无需同步数据,那就不用操心数据库的事情了,把WaterdogPE当成一个快速跨服工具即可。所以,对数据库这方面知识没有掌握的服主,也不建议搭设需要跨服同步数据群组服,否则十分容易弄巧成拙。

WDPE是基于Java11开发的,因此你用来运行WDPE的Java版本也要是11及以上版本。在运行WDPE前,请先检查自己服务器主机上的Java版本,因为通常情况下大部分服主用的都是Java8。别担心,Java拥有向下兼容性,通常情况下你的服务器升级到Java11不会有任何影响(除非你的服务器插件都是基于Java8编写且有不可替换的变量等内容);实在不放心,也可以通过一些方法实现Java8与其他版本并存,并用不同的Java路径启动服务器,但这暂时不在本教程的讨论范围内,请自寻方法。 下面让我们正式开始吧。


四、WaterdogPE的下载与安装

首先是在何处下载WDPE。这里是WDPE的Github项目地址:https://github.com/WaterdogPE/WaterdogPE,如果没有特殊需求,只要下载最新的releases(即正式发行版本)即可:https://github.com/WaterdogPE/WaterdogPE/releases(看准了,下载那个Waterdog.jar,别下错了)。

接着是如何启动WDPE。前面说过,WDPE是一个单独的代理服务端,它不是一个插件,千万别把它放进plugins文件夹或者放到别的什么服务端的文件夹里然后问我为什么读取不了。你可以把它当作一个正常的服务端核心看待。所以,要为WDPE准备一个单独的文件夹路径。和启动所有Java编写的服务端一样,WDPE也可以用形如 <syntaxhighlight> @echo off java -jar waterdog.jar pause </syntaxhighlight> 的命令来启动。(在这里,waterdog.jar就是核心的名字,要改成你自己命名的名字,比如你下载的waterdog.jar被你改了个名字,可能是waterdogpe-1.15.jar,那么上面这个命令就要改成java -jar waterdogpe-1.15.jar。我也不知道我为什么要写这段说明,这本来是压根不用说明的笨道理,但经过前面几篇教程的反馈我发现不知道修改核心名字直接启动的大有人在)。 在Windows系统上,你需要创建一个.bat(即批处理)文件,将以上命令写进.bat文件里,将这个.bat文件放在WDPE所在的目录下并双击启动;在Linux系统上,需要切换到WDPE核心所在的目录下,然后输入这行命令:java -jar waterdog.jar并回车执行。这里我放几张图片进行说明,以免我拙劣的语言表达能力造成有人还是看不懂(已经明白的可以直接跳过):

成功启动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群组服的配置

打开config.yml,会看到如下内容。随着WDPE更新,配置文件可能会有所变化,但应该不会差太多。这里我只对常用的设置项进行讲解(配置文件内容较长,建议对着你自己的配置文件看): <syntaxhighlight>

  1. Waterdog Main Configuration file
  2. Configure your desired network settings here.


  1. A list of all downstream servers that are available right after starting
  2. address field is formatted using ip:port
  3. 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: {}
  1. Case-Sensitive permission list for players (empty using {})

permissions:

 TobiasDev:
 - waterdog.player.transfer
 - waterdog.player.list
 alemiz003:
 - waterdog.player.transfer
 - waterdog.player.list
  1. List of permissions each player should get by default (empty using [])

permissions_default: - waterdog.command.help - waterdog.command.info

  1. Whether the debug output in the console should be enabled or not

enable_debug: false

  1. If enabled, encrypted connection between client and proxy will be created

upstream_encryption: true

  1. If enabled, only players which are authenticated with XBOX Live can join. If disabled, anyone can connect *with any name*

online_mode: true

  1. If enabled, the proxy will be able to bind to an Ipv6 Address

enable_ipv6: false

  1. 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

  1. Replaces username spaces with underscores if enabled

replace_username_spaces: false

  1. Whether server query should be enabled

enable_query: true

  1. 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

  1. 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

  1. If enabled, the proxy will inject all the proxy commands in the AvailableCommandsPacket, enabling autocompletion

inject_proxy_commands: true

  1. Upstream server compression ratio(proxy to client), higher = less bandwidth, more cpu, lower vice versa

upstream_compression_level: 6

  1. Upstream server compression ratio(proxy to downstream server), higher = less bandwidth, more cpu, lower vice versa

downstream_compression_level: 2

  1. Education features require small adjustments to work correctly. Enable this option if any of downstream servers support education features.

enable_edu_features: false

  1. Enable/Disable the resource pack system

enable_packs: true

  1. If this is enabled, the client will not be able to use custom packs

overwrite_client_packs: false

  1. If enabled, the client will be forced to accept server-sided resource packs

force_server_packs: false

  1. You can set maximum pack size in MB to be cached.

pack_cache_size: 16

  1. 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 </syntaxhighlight> 首先是在servers这部分里,这是所有下游服务器的列表。虽然我们总说什么大厅服游戏服的,但实际上大厅服和那些游戏服都是下游服务器,本质上是平级的,需要你设置优先级来指定哪个是大厅服,稍后会讲。 <syntaxhighlight> servers:

 lobby1:
   address: 127.0.0.1:19133
   public_address: play.myserver.com:19133
   server_type: bedrock

</syntaxhighlight> 这里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即基岩版。既然你是来开基岩版群组服的,那这个选项也就不用更改了。 你可以按照该格式无限添加下游服务器,例如这样:

<syntaxhighlight> 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

</syntaxhighlight>

注意格式,别复制粘贴错位置或者少了多了几行的。

listener这里实际上就是WaterdogPE本身的配置了。 motd就是显示在服务器列表上的内容,比如这里的“gunwar - v1.18.0”

priorities是下游服务器的优先级设置。一个群组服至少要有一个大厅服,来作为玩家登录服务器时进入的第一个服务器,玩家可以在大厅服选择其他子服游玩。这里要把你想作为大厅服的下游服务器的名字写到第一位,比如这样: <syntaxhighlight> priorities:

 - lobby1

</syntaxhighlight> 那么排在第一位的lobby1服务器就成为玩家登录服务器时进入的第一个服务器了,也就是主大厅,不过前提是没有使用其他插件进行更改。 host是WDPE的连接地址,格式是内网IP:端口。前面我们说过,WDPE是一个独立的代理服务端,自然也和其他的服务端一样需要占用单独的进程和端口。这里给WDPE用的端口一定要开放到公网,且不能与任何下游服务器端口冲突。同时,WDPE的内网IP也要和所有下游服务器一致。我们仍然假设你的服务器内网IP是192.168.1.8,公网端口是19132,那么这里就要这么填: <syntaxhighlight>

  1. The address to bind the server to
 host: 192.168.1.8:19132

</syntaxhighlight> max_players是整个群组服的最大玩家数。请根据你的需要调整。 <syntaxhighlight>

  1. The maximum amount of players that can connect to this proxy instance
 max_players: 114514

</syntaxhighlight> forced_hosts这个配置项比较有趣,根据注释我理解的是,这个选项可以允许玩家通过连接特定的IP进入特定的服务器,比如你服务器的IP是play.example.com,直接连接进入的是正常的lobby1服务器,想要玩SkyWars-1服务器就要通过主大厅的NPC菜单什么的进入;而如果你设置了对应的域名解析,就可以用skywars.example.com这个IP直接连接SkyWars-1这个服务器。我本人从来没有用过这个功能,相信大佬们应该可以用这个功能玩出花。 <syntaxhighlight>

  1. 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: {}

</syntaxhighlight> permissions是给予特定的玩家权限。这里给的权限只对被给予的玩家生效,且全群组服生效。例如我们要给一个叫lT_Name的玩家和一个叫It_Name的玩家waterdog.player.transfer(传送玩家权限,也包括传送其他玩家的权限)和waterdog.player.list(查看全群组服在线玩家列表)权限,就可以这么写(如果需要留空请用{}代替): <syntaxhighlight> permissions:

 lT_Name:
 - waterdog.player.transfer
 - waterdog.player.list
 LT_Name:
 - waterdog.player.transfer
 - waterdog.player.list

</syntaxhighlight> permissions_default是玩家进入群组服的默认权限,也是全群组服生效,是每个进入服务器的玩家都会有的权限。例如给所有进入服务器的玩家waterdog.command.help(查询命令帮助)和waterdog.command.info(查询服务器信息)的权限,就可以这样写(如果需要留空请用[]代替): <syntaxhighlight> permissions_default: - waterdog.command.help - waterdog.command.info </syntaxhighlight> 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?(来自百度百科): IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址 [1] 。 由于IPv4最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍 。 互联网数字分配机构(IANA)在2016年已向国际互联网工程任务组(IETF)提出建议,要求新制定的国际互联网标准只支持IPv6,不再兼容IPv4。 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

配置文件到这里就讲解完毕,没有解释的配置项是一般情况下保持默认设置就能用的。


六、如何连接下游服务器

WDPE相较于Nemisys的优势在这里也得到了体现。在Nemisys中,我们需要在下游服务器中加上配套插件才能连接到代理服务端,十分滴麻烦,而且代理端和下游服务器开启关闭必须要有先后顺序。在WDPE中,你不需要对子服进行什么改动,只要保证WDPE和下游服务器在同一内网下(不是专属独立线路的服务器记得找服务商问问自己的内网IP,别直接127.0.0.1就干上去,那不管用),开启WDPE端,开启下游服务器,就会自动匹配,无需进行过多操作。唯一需要对下游服务器进行的操作就是:记得关掉XBOX验证!

玩家如何进入其他下游服务器呢?我们都知道,一个群组服不可能仅仅只有一个主大厅,势必会有其他游戏服。观察众大型群组服务器,玩家进入主大厅后,通常是使用NPC或菜单进入其他下游服务器的。在WDPE中,内置有一个/server命令可供玩家传送到其他服务器。但,这个命令只能玩家在聊天栏中输入使用,无法在服务器的插件中使用。换句话说,这个/server命令只能玩家客户端执行,不能服务端执行。如果想要让服务端也能执行玩家跨服命令,就需要用到这个插件:https://www.mcbbs.net/thread-1293177-1-1.html 这是本人在原TransferWDPE的基础上改制的插件。原插件并未发布在任何论坛上,仅在Github有下载地址:GitHub - VazziDE/TransferWDPE-Nukkit: TransferWDPE-Nukkit 是一个 nukkit 插件,用于通过 waterdogpe 代理转移玩家。 但是原插件有许多限制,比如语言是英文、仅拥有相应权限才能传送玩家等。本人在此基础上稍微修改了一下,使得它可以作为普通的跨服传送插件使用。具体的插件使用说明请见插件发布贴内,我在这里唯一要提醒的就是这个插件是Nukkit插件,不要防到WDPE的插件文件夹里。搭配插件后,玩家跨服只会看到一个十分快的“过场动画”就能进入其他服务器,非常稳定快速。


七、尾声 本教程到这里已经基本结束。写这篇教程的过程中我经历了两次没有成功保存的事故,因此后续部分写的可能有些仓促和混乱,希望大家多多包涵。本人不是十分专业的开发者,仅仅是抱着一颗想造福众多服主的心来完成这篇教程,如有问题,欢迎指出。教程编写不易,希望您能给予鼓励!