保护什么?
保护的内容是非常易于理解的:
- 阻止方块的破坏与放置事件;
- 禁止打开容器(箱子、熔炉);
- (从区域外打进来的)TNT 炮弹可以被禁止爆炸;
- (从区域外打进来的)落沙实体炮弹可以被禁止形成方块;
- (从区域外生长进区域内的)树可以被阻止;
- 边界附近的活塞会被阻止推动(活塞不可以将区块内外的方块推入或推出);
- 阻止利用漏洞修改告示牌;
- 船和矿车都会受到保护;
- 挂画和物品展示框都会受到保护;
- 门、按钮、压力板和拉杆都会受到保护;
- 动物(无论被拴住的、被驯服的、被剃毛的)都会受到保护;
- 区域外的喷溅型药水等其他弹射物都会被阻止。
额外地,WorldGuard 也支持模组的自定义方块和实体(有些例外,稍后会提到)。
水和岩浆的流动保护是默认禁用的,但你可以在配置文本中重新启用它。
提示
如果你找到了绕过保护的方法,请向我们的漏洞追踪器提交有关信息。
例外
有些功能是默认对非成员生效的:
- 物品的掉落与拾取是默认不阻止的;
- 经验掉落也是默认不阻止的。
这些例外可以通过区域标志被全局或按区域禁用。
额外的例外也可以按区域通过区域标志修改,或通过配置文本中的 interaction-whitelist
选项进行全局修改。
示例:即使是在受到相应保护的区域中也允许所有玩家在任何区域使用门、拉杆、按钮和压力板
/rg flag __global__ use allow
关于内建变量 __global__
的更多信息,请参阅“全局区域”章节。
示例:在主城区域为所有非成员玩家阻止物品的掉落与拾取
这里对物品的丢弃与拾取的标志是不一样的。
/rg flag spawn item-pickup -g nonmembers deny
/rg flag spawn item-drop -g nonmembers deny
示例:为所有非成员设置阻止所有地皮区域的经验掉落标志
所有地皮区域肯定是某个模板区域的子区域。在这个示例中,这个临时区域的名称为 mall_parent
:
/rg flag mall_parent exp-drops -g nonmembers deny
所有地皮区域都会继承这个标志,且“nonmembers”参数会使得每个地皮区域的该参数对非成员玩家生效。
而下文的命令则不会正常工作:
不会正常工作: /rg flag __global__ exp-drops -g nonmembers deny
这是因为区域不会从全局区域 __global__
继承,所以在 __global__
的“非成员”表示的是该区域之内特定区域的非成员玩家。
方块与实体
WorldGuard 保护区域最重要的一个特点就是它对方块和实体的处理方式。玩家绝对可以被添加为一个保护区域的成员,而 WorldGuard 会将方块和实体也一视同仁:它们也可以是区域的成员。
但是,实体与方块不会默认被添加为区域的成员。一个实体或方块只要处于区域中,它就是区域的成员。这就是为什么,例如一个区域外的活塞不能伸入区域内的原因。这是因为活塞被当做了一个非成员,也就是说,它不能改动区域内的任何方块。在另一方面,在区域内的活塞可以推动区域内的其他方块,因为这个时候它就算作区域内的成员。
WorldGuard 同时也会尝试寻找事件的真正来源。例如,如果一个落沙(砂砾)方块被放置在了保护区域的外部,于是掉进了保护区,那么 WorldGuard 就会认为最后放置的方块(也就是落沙落地所产生的哪一个方块)是被落沙实体所放置的,且落沙实体是被原来放置在区域外上方的落沙(砂砾)(但是要想追溯最初放置这个方块的玩家显然是非常困难的。)因为原来的落沙方块在区域外,它不能掉落至区域内是因为原本的方块不是该区域的成员。
警告
当 build
标签在一个区域内被设置为 deny
时,没有人可以建筑且活塞也并不会工作。这是因为 build 标志会阻止其成员进行建造行为,就如上文解释的那样,活塞也可以像正常玩家那样是一个区域的成员。
模组与插件支持
一些模组添加了全新的游戏机制,例如添加了新的方块、物品、实体,或者是对已有的方块、物品或实体添加了新的功能。模组可以是 Bukkit 插件的形式,也可以是支持其他模组平台的文件形式(例如 NeoForge 或 Fabric)
总体来说,Bukkit 插件更倾向于尊重其他 Bukkit 插件所添加的保护功能,但这不会总是成立。非 Bukkit 插件的模组,总的来讲,更倾向于更少更少对 Bukkit 保护插件的支持。该部分文章着重考虑了那些与保护区域的插件和模组如 WorldGuard 的模组。
基础保护
本篇概述
- 会改变其他方块或实体的方块或实体;
- 会发射弹射物的武器、魔法或工具。
WorldGuard 致力于拓展到对大部分自定义方块和实体的保护。在这种情况下的保护一般都是阻止对未知方块或实体的左右键交互,通常对大部分依赖这些交互方式的方块或实体都有效。
但是,WorldGuard 不能保护那些能在客户端(可以判断这些内容打开的速度远比打开容器要快得多)上打开 GUI 界面的方块或实体,因为它们发送的交互数据完全不在 WorldGuard 力所能及的地方。
额外地,WorldGuard 不能有效的对自定义方块或实体(例如虚拟的方块挖掘机)进行控制(例如挖掘方块),至少大部分是这样的。因为虽然原版的 Minecraft 有能够改变世界的方块(例如活塞),但是 Bukkit 开发团队(或者你使用的服务端核心的维护团队)能做到在这些方块对周围环境进行更改之后提醒其他插件。但是,由模组添加的方块和实体很少有会这么做的,所以 WorldGuard 很遗憾不能管理这些事情。
有些模组也会模拟玩家,用以基于方块或实体的行为来执行特定的操作。这些假玩家的名称通常包含 [模组名称]
的命名。但是,这个信息很少用于鉴定真正做出修改行为的实体,这会让 WorldGuard 很难鉴别哪些行为应当被允许或阻止。若要允许模组机械在所有受保护的区域中运作,假玩家需要被给予自由操作的权利,并可绕过所有区域的保护。这个行为可以在配置文件的 fake-player-build-override
设置项中更改,但这会阻止该自然状态下的模组在保护区域中工作。
弹射物(以及那些有弹射物作粒子效果的魔法模组)是一大问题。这是因为这些模组大部分不会被插件修改弹射物的效果。WorldGuard 有一个相对有用的办法——在配置文本中的 emit-block-use-at-feet
设置项允许你配置一系列的物品——会尝试修改脚下方块的物品。这很有效地阻止了处在某个保护区域之内的玩家使用这些武器,因为玩家会被阻止在该区域中使用这些物品,但是这不能阻止区域之外的玩家对着区域内发射这些弹射物。
解决方法
如果这个模组与 Bukkit 插件存在冲突,请寻求模组开发者的帮助,并让他加入对保护插件的支持。这可以通过加入正确的 Bukkit 事件检测,或只是使用本插件提供的 WorldGuard API 做到。
如果这个模组不是 Bukkit 插件[1],那很难让作者添加对 Bukkit 的支持。
其他修复保护区域问题的方法有:
- 在玩家群体足够受信任的情况下无视这个问题;
- 禁用存在问题的物品或者方块。
本维基中,模组被视作依赖 Forge/Fabric 的一种“插件”。 ↩︎