• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

“WorldGuard”的版本间的差异

来自Minecraft插件百科
跳转至: 导航搜索
取读WorldGuard
 
(未显示5个用户的81个中间版本)
第1行: 第1行:
Mcbbs发布贴http://www.mcbbs.net/thread-505810-1-1.html
+
{{Bukkit Plugin Infobox
='''配设文件'''=
+
|插件名=WorldGuard
='''指令介绍'''=
+
|图标=[[文件:WorldGuard Icon.png|无|居中|]]
==Region指令==
+
|版本=6.1.2
===定义和重定义区域(define和redifine)===
+
|前置插件=[[WorldEdit]]
 +
|兼容服务端版本=1.10
 +
|网址=https://dev.bukkit.org/bukkit-plugins/worldguard/
 +
}}
 +
'''WorldGuard'''是一款对服务器管理员,地图制作者,生存服务器等提供许多功能的一个插件。
  
/region define 区域名称 (玩家1) (玩家2) (玩家...)<br />
+
*在你创造区域后,只会允许有权限的玩家和一些插件去改变区域。
/region def 区域名称 (玩家1) (玩家2) (玩家...)<br />
+
*你可以在你的区域里设置一些标记,如(取消 凋零伤害 掉落伤害 等)
/region d 区域名称 (玩家1) (玩家2) (玩家...)<br />
+
*同时在特殊的世界的区域中你也可以改变一些标记,如(饱食度回复 生命值回复 PVP的开关 TNT 怪物伤害)
()内容为可选项,如果没有指定玩家,定义后的区域将会属于输入命令的玩家(可以设定多个拥有者)<br />
+
*黑名单包括了玩家不能使用的物品和方块
 +
*可以记录服务器的统计和信息 (/wg report -p)
 +
*可以管理服务器的CPU(/wg profile -p)
 +
*增加例如停止所有火焰传播的指令 “STOP ALL FIRE SPREAD” .
 +
*可以与其他的Bukkit插件进行交♂易
 +
*保护与防止许多事件 (树长大 TNT爆炸 药水机器 等)
 +
*某些触发事件也可以修改 (门 拉杆 等)
 +
*开源,是Minecraft的最老的插件之一(比Bukkit还老)
 +
*启用你想要的特性!'''默认所有都是关闭的。'''你可以先安装WG,然后再配置它。
  
这个指令主要是创造区域,创造后才可以进行更多的设定,这个指令是没有限制区域大小的(根据WorldEdit选择的大小)<br />
+
==安装==
玩家部分也可以设定为权限组,这个指令主要是给管理员使用,玩家会有另外一个指令 /claim<br />
+
WG需要一个能支持Bukkit API的Minecraft服务端及版本,如 CraftBukkit, MCPC+, Cauldron, 和 Spigot. 不支持官方的Minecraft服务器。
  
/region define 区域名称 g:权限组名称 玩家1 玩家2<br />
+
另一个需求是[[http://www.enginehub.org/worldedit WorldEdit]]插件,一个非常轻量的地图编辑器,同样也是我们的作品,注意你不能使用Forge版本的WE,请使用插件版本。
'''注*整个世界区域叫做 __global__'''
 
  
/region redefine 区域名称<br />
+
由于[[https://www.reddit.com/r/Minecraft/comments/2fkz55/as_one_of_the_original_contributors_to_bukkit 一个争论和随从法律的崩溃]],你不能再下载官方Bukkit服务器了。供MC1.8+ 用户选择的服务端是 Spigot 。
/region update 区域名称<br />
 
/region move 区域名称<br />
 
  
这个指令会重定义已定义区域,选择好新区域后,输入指令后就可以重定义指定区域<br />
+
===如何安装===
 +
WG可以从[[http://dev.bukkit.org/bukkit-plugins/worldguard BukkitDev]]下载。
  
===区域圈地(claim)===
+
如果你下载下来的文件是 .zip的话,解压它,你会找到一个WorldGurad.jar。否则,你会直接下载下来一个.jar文件
  
/region claim 区域名称 (玩家1) (玩家2) (玩家...)<br />
+
在你的服务器根目录下,如果没有plugins文件夹,创建之。
  
'''注意!'''这个指令是在2010年11至12月出现的,是很早期的指令,比Bukkit都早,在不久的将来会受到改善!<br />
+
把jar文件放入plugins中
这个指令和define指令非常相似,但是加入了一些其他设定<br />
 
  
如果配设内有启动claim功能,玩家将会被限制区域数量<br />
+
开启你的服务器,检查服务器日志,如果有错误,检查帮助页面。
创造新区域时不可以重复区域名称,除非你是拥有者,那么就会重定义该区域<br />
 
新区域不可覆盖其他区域<br />
 
如果配设内有启动claim功能,重新新区域时可以覆盖玩家拥有的其他区域<br />
 
如果配设内有启动claim功能,玩家将会被限制区域大小<br />
 
  
===区域信息(information)===
+
==配置==
 +
许多WG的特性都与配置相关(如药水,水中呼吸等模式)。每个配置选项都在这页列出了。
  
/region info (-s)(世界名称) (区域名称)<br />
+
在你第一次运行WG的时候,主配置在plugins/WorldGuard/
 +
*config.yml
 +
每个世界都有特殊的配置文件
 +
*worlds/world/config.yml
 +
*worlds/world_nether/config.yml
 +
*worlds/mining_world/config.yml
 +
如果你打开了每个世界的配置文件,他们会是空的,如果你想要配置的话,你需要从主配置复制
 +
<pre>
 +
示例:如何自定义世界配置
 +
在主世界配置中,你可能把 block-creeper-block-damage 设置为true
 +
mobs:
 +
    block-creeper-explosions: false
 +
    block-creeper-block-damage: true
 +
    block-wither-explosions: false
 +
但你想在地狱世界把其设置为false
 +
打开worlds/world_nether/config.yml
 +
然后添加文本
 +
mobs:
 +
    block-creeper-block-damage: false
 +
这一行会覆盖继承的true,表现为false
 +
</pre>
 +
===设置===
 +
这些是作为参考的顺序,并不是真正的顺序,你要现在config.yml找到它们
 +
[[File: WG-config.png]]
  
列出区域的详细信息,内含<br />
+
==权限==
 +
[[文件: WG-PERM.png]]
 +
===建筑权限===
 +
worldguard.build.block.place.<material>
  
区域名称(区域类型,优先权)<br />
+
worldguard.build.block.remove.<material>
区域flags<br />
 
区域拥有者<br />
 
区域成员<br />
 
区域边界<br />
 
  
空的信息项不会显示<br />
+
worldguard.build.block.interact.<material>
在指令内加入-s 会在显示信息的同时选择该区域<br />
 
如果没有输入区域名称,插件会自动取读脚下的区域<br />
 
  
'''列子:查看“TownPlot”区域的信息'''
+
worldguard.build.entity.place.<type>
/region info townplot<br />
 
  
'''列子:查看地狱世界“TownPlot”区域的信息'''
+
worldguard.build.entity.remove.<type>
/region info world_nether TownPlot<br />
 
<br />
 
  
===区域选择(select)===
+
worldguard.build.entity.interact.<type>
  
/region select [区域名称]<br />
+
worldguard.build.entity.damage.<type>
这个指令会选择区域<br />
 
如果没有输入区域名称,插件会自动取读脚下的区域<br />
 
  
'''列子:选择“TownPlot”区域'''
+
worldguard.build.item.use.<material>
/region select townplot<br />
 
  
===区域表列(list)===
+
==命令==
 +
[[文件: WG-Command-1.jpg]]
 +
[[文件: WG-Command-2.jpg]]
  
区域表列(list)<br />
+
==黑名单==
 +
黑名单可以禁止玩家做一些事,这是一些情况:
  
/region list (页数)(-w 世界名称)(-p 玩家)<br />
+
禁止玩家挖金矿
  
'''列子:列出第一页区域列表'''
+
当找到钻石时通知所有管理员
/region list<br />
 
  
'''列子:列出地狱世界第三页区域列表'''
+
当放置附魔台时告诉玩家一些事
/region list 3 -w world_nether<br />
 
  
同时也可以只显示"玩家"的区域,影藏其他区域,需要在指令内加入-p 玩家<br />
+
这是一个示例配置:
 +
<pre>
 +
# Deny lava buckets
 +
[lavabucket]
 +
ignore-groups=admins,mods
 +
on-use=deny,tell
 +
message=Sorry, you can't use lava buckets!
  
'''列子:列出玩家1的区域列表'''
+
# Deny some ore
/region list -p 玩家1<br />
+
[goldore,ironore]
 +
ignore-groups=admins
 +
on-break=deny,tell,notify
  
===设定flag===
+
# No TNT!
 +
[tnt]
 +
ignore-groups=admins
 +
on-place=deny,notify,kick
 +
</pre>
  
/region flag 区域名称 flag (-g 权限组) [-w 世界名称] (数据值)<br />
+
每个世界都会有配置文件
这个指令可以为区域设定flag,如果(数据值)没有填的话,选择的flag就会被清除(还原)<br />
 
你们必须明白区域优先权和父子区域的关系才可以正确的设定flag,所以最好去查看flag列表<br />
 
  
'''列子:“TownPlot”区域禁止pvp的flag'''<br />
+
[*]worlds/world/blacklist.txt
/region flag townplot pvp deny<br />
 
  
'''列子:在“duduworld”世界“TownPlot”区域禁止pvp的flag'''<br />
+
[*]worlds/world_nether/blacklist.txt
/region flag townplot pvp -w duduworld deny<br />
 
  
'''列子:“TownPlot”区域设定欢迎信息的flag'''<br />
+
[*]worlds/mining_world/blacklist.txt
/region flag townplot greeting 欢迎你来到这个区域, %name%!<br />
 
进入“TownPlot”区域显示:欢迎你来到这个区域, 玩家ID!<br />
 
  
'''列子:“TownPlot”区域清除退出信息的flag'''<br />
+
这是格式
/region flag townplot farewell<br />
+
<pre>
效果:退出“TownPlot”区域时不显示退出信息<br />
+
[a list of items/blocks to match]
 +
event to watch=what to do
 +
event to watch=what to do
 +
event to watch=what to do
 +
option=value
 +
</pre>
  
===设定优先权(priority)f===
+
#是注释行
  
/region setpriority [区域名称] (-w 世界名称) [优先权]<br />
+
可以使用ID和名字:
/region priority [区域名称] (-w 世界名称) [优先权]<br />
+
[wood,brick,glass]
/region pri [区域名称] (-w 世界名称) [优先权]<br />
 
  
设定区域优先权,[优先权]处得填一个整数,可以是正数也可以是负数。<br />
+
可以增加数据值:
 +
[wood:0]
  
===设定子区域(parent)===
+
多个数据值用;隔开
 +
Multiple data values can be matched by separating each one with a semicolon (;):
 +
[wood:0;2;3]
  
/region setparent [子区域] [父区域]<br />
+
也可以用范围:
/region parent [子区域] [父区域]<br />
+
[wood:2-3]
/region par [子区域] [父区域]<br />
 
  
设定子区域。<br />
+
可以用大于等于 小于等于
 +
[wood:>=2,<=3]
  
===删除区域(remove)===
+
你也可以这样:
 +
[wood:0;>=2,grass:1-2]
  
/region remove [区域名称] (-w 世界名称)<br />
+
事件
/region rem [区域名称] (-w 世界名称)<br />
+
<pre>
/region delete [区域名称] (-w 世界名称)<br />
+
on-break
/region del [区域名称] -w 世界名称)<br />
+
on-destroy-with
 +
on-place
 +
on-use
 +
on-interact
 +
on-drop
 +
on-acquire
 +
on-dispense
 +
</pre>
 +
行动
 +
<pre>
 +
deny
 +
allow
 +
notify
 +
log
 +
tell
 +
kick
 +
ban
 +
</pre>
 +
选项
 +
<pre>
 +
ignore-groups
 +
ignore-perms
 +
comment
 +
message
 +
</pre>
 +
示例
 +
<pre>
 +
[lavabucket,waterbucket,bucket]
 +
on-use=deny,tell
  
删除一个区域<br />
+
[tnt]
 +
ignore-groups=admins
 +
on-place=deny,notify,kick
  
===区域传送(teleport)===
+
[obsidian]
 +
ignore-groups=admins,obsidian
 +
on-place=deny,tell
 +
on-break=deny,tell
 +
</pre>
  
/region teleport (-s) [区域名称]<br />
+
记录的参数: Console  File  Database
/region tp (-s) [区域名称]<br />
 
  
传送到某个区域内,如果加入-s就会传送到区域设定的重生点。<br />
+
CONSOLE: 控制台
  
===区域管理(management)===
+
FILE 文件
  
/region load (-w 世界名称)<br />
+
%Y the year (YYYY)
/region save (-w 世界名称)<br />
 
  
加载或者保存设定完的区域。<br />
+
%m the month (MM)
'''注意!如果没保存加载时会丢失设定的项目,但WorldGuard的指令在修改完某项设定会自动保存。(通常不会出现这种情况)'''<br />
 
  
/region migratedb [1] [2]<br />
+
%d the day (DD)
转移region文件yml格式到数据库MySQL,或者相反。<br />
 
  
=权限介绍=
+
%W the week of the year (00-52)
=regions教程=
 
==基础教程==
 
  
开始前我们必须安装Worldedit配合WorldGuard才可以使用!<br />
+
%H 24-hour time (HH)
不熟悉/不知道[[WorldEdit|Worldedit]]? <br />
 
以下教程内Worledit会简称为WE,Worldguard为WG。<br />
 
  
1.通过WE选择2点来确定一个立方体(于平时WE选择一样)<br />
+
%h 12-hour time (HH)
扩大选择区域<br />
 
指令:
 
          //expand <amount> [direction]<br />
 
          //expand <amount> <reverse-amount> [direction]<br />
 
          //expand vert<br />
 
效果:第一个:通过指定的方向扩大(东南西北上下)<br />
 
          第二个:通过面向的方向扩大(东南西北)<br />
 
          第三个:垂直方向扩展到基岩以及天空<br />
 
说明:对于指定的方向,用”N”(),”S”(南),”W”(西),”E”(东),”U”(上),”D”(下)来代表方向(实际太阳升起的方向是南方。。即S,至于为什么我也不知道)。对于面向的方向,如果不出入WENS之类的就会默认为像面向的方向扩展。最后一个则是垂直方向上下完全扩展。<br />
 
  
 +
%i the minute (mm)
  
用法:
+
%s the second (ss)
          //expand  扩大格数(数字) 方向(N S W E U D)<br />
 
          //expand 扩大格数  反向扩大格数(可以不写)<br />
 
          //expand vert<br />
 
  
2.创造region<br />
+
%u the user’s name
/region define <region_名称> <br />
 
或(更详细指令)<br />
 
/region define <region_名称> [拥有者1] [拥有者2] [拥有者3] (…….)<br />
 
创造这个region,创造一个region后,例如我们的就叫做Mcbbs,那么默认玩家就不能破坏这个region内的物品(其他设定稍后再说)<br />
 
  
3.添加成员/会员以及删除<br />
+
%% translates to a single percent sign “%”
  
/region addmember <region_名称> [会员1] [会员2] [会员3] (…….)<br />
+
可用变量
例如<br />
 
/region addmember Mcbbs Lichi2050<br />
 
意思就是在Mcbbs这个region内,玩家Lichi2050也就是我,可以破坏(默认没有修改破坏flag时都有效)。<br />
 
  
删除也是原理,只不过指令稍微改变了一下<br />
+
数据库
/region remember <region_名称> [会员1] [会员2] [会员3] (…….)<br />
 
  
4.添加拥有者以及删除<br />
+
示例
 +
<pre>
 +
CREATE TABLE IF NOT EXISTS `blacklist_events` (
 +
`id` int(11) NOT NULL AUTO_INCREMENT,
 +
`world` varchar(10) NOT NULL,
 +
`event` varchar(25) NOT NULL,
 +
`player` varchar(16) NOT NULL,
 +
`x` int(11) NOT NULL,
 +
`y` int(11) NOT NULL,
 +
`z` int(11) NOT NULL,
 +
`item` int(11) NOT NULL,
 +
`time` int(11) NOT NULL,
 +
`comment` varchar(255) DEFAULT NULL,
 +
PRIMARY KEY (`id`)
 +
);
 +
</pre>
  
 +
==区域==
 +
===快速开始===
 +
====选择区域====
 +
要创建一个区域,你要告诉WG你的区域范围。WE用于选范围。
  
/region addowner <region_名称> [拥有者1] [拥有者2] [拥有者3] (…….)<br />
+
区域可以是以下形状:
例如<br />
 
/region addowner Mcbbs Lichi2050<br />
 
意思就是在Mcbbs这个region内,我Lichi2050是这个region的拥有者(可以设定/修改这个region的任何设置)。<br />
 
  
删除也是原理,只不过指令稍微改变了一下<br />
+
立方体
/region remowner <region_名称> [拥有者1] [拥有者2] [拥有者3] (…….)<br />
 
  
5.region优先权以及子区域<br />
+
多边形
  
/region setpriority <region_名称> <优先权><br />
+
不支持圆!
<优先权>是一个数字,他可以是正数例如3,也可以是负数例如-1<br />
 
数字越大,优先权就越大,例如region1的优先权是2,region2的优先权是5 那么region2的配设会取代/覆盖region1的设定(当然如果2个区域没有覆盖那么设不设定优先权都无所谓)。<br />
 
  
/region setparent <子_region_名称> <父_region_名称> <br />
+
====基础指令====
首先我们得先了解什么是子区域,子区域有什么用处其实设定父子区域意思和继承差不多(使用权限组插件的朋友相信会很清楚)<br />
+
创建区域
子region会取读父region的拥有者,会员,以及flag设定(就不用重复设定了,方便)<br />
 
  
==flag列表==
+
使用这个指令创建区域 /region define:
===区域权限组===
 
  
区域权限组为<br />
+
/region define town
members 成员<br />
 
nonmembers 非成员<br />
 
owners 拥有者<br />
 
nonowners 非拥有者<br />
 
everyone 全部玩家<br />
 
  
注*如果直接修改regions.yml区域权限组有改动(全部变成大写并且everyone变成ALL)!<br />
+
/rg和/region是相同的
  
MEMBERS 成员<br />
+
/rg define town
NON_MEMBERS 非成员<br />
 
OWNERS 拥有者<br />
 
NON_OWNERS 非拥有者<br />
 
ALL 全部玩家<br />
 
  
 +
新的区域默认为禁止玩家破坏方块,为使玩家可以建筑,为区域增加主人和成员,你可以为每个成员增加单独的权限。
  
区域权限组有什么用呢? 在设定flag时可以专门只为一个权限组设定flag(别和权限组插件搞混了!!!)<br />
+
所有玩家都可以成为主人或成员,下面是指令:
例如<br />
+
<pre>
/rg flag <region_名称> exit deny<br />
+
/rg addmember town Notch sk89q g:builders
/rg flag <region_名称> exit -g nonowners<br />
+
/rg addowner town sk89q
我们的region还是叫做Mcbbs<br />
+
/rg removemember town g:builders
 +
/rg removeowner town sk89q
 +
</pre>
 +
更多请去区域命令页。
  
首先第一个指令禁止了退出(出去)这个region<br />
+
你在创建区域的同时也可以很简单的去增加成员:
下一个指令设定了-g nonowners 意思就是非拥有者玩家不可退出Mcbbs这个region<br />
 
  
或者你也可以设定例如只禁止什么人进入,又或者什么人进入后会无敌等等(看各自的脑洞吧)<br />
+
/rg define town Notch sk89q g:builders
  
==开发者 API==
+
区域会自动保存,不需要保存指令。
===取读WorldGuard===<br />
 
  
一个参考的列子<br />
+
示例:创建一个只有builders可以建筑的区域spawn
  
Example: Getting a reference to WorldGuard<br />
+
选择spawn的范围
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;<br />
+
 
import org.bukkit.plugin.Plugin;<br />
+
创建一个叫做spawn的区域:
+
/rg define spawn
private WorldGuardPlugin getWorldGuard() {<br />
+
 
     Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");<br />
+
增加建筑团队为成员:
+
/rg addmember spawn g:builders
     // WorldGuard 没有加载<br />
+
 
     if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {<br />
+
提示:区域会在一定间隔后自动保存,如果你想强制保存,使用/rg save
         return null; // 也许你想提示一个错误<br />
+
 
 +
你可以这样删除区域:
 +
/rg remove town
 +
 
 +
列出区域消息
 +
/rg info town
 +
 
 +
列出所有区域
 +
/rg list
 +
 
 +
这样重新选择区域
 +
/rg redefine town
 +
 
 +
更多请看区域命令
 +
 
 +
====区域的配置====
 +
区域的重叠
 +
 
 +
区域可以互相重叠。
 +
 
 +
如果重叠的话,玩家必须拥有这些重叠区域的所有建筑权限才能在重叠区域建筑。
 +
 
 +
如果你想要一个区域覆盖另一个,使用继承。
 +
 
 +
如果你想要一个区域可以建筑,使用build权限。
 +
 
 +
如果区域不支持保护这个区域,使用 passthrough 权限。
 +
 
 +
示例:创建一个重叠于spawn的免费挖矿区域
 +
 
 +
选择出区域范围
 +
 
 +
创建区域:
 +
/rg define mine
 +
 
 +
允许破坏:
 +
/rg flag mine build allow
 +
 
 +
权限:
 +
每个区域都有他们的权限,如PVP可以用pvp权限。
 +
 
 +
/rg flag town pvp deny
 +
 
 +
阅读区域权限来获取更多信息。
 +
 
 +
示例:做一个不能破坏方块[建筑者可以] 允许PVP的区域
 +
 
 +
选择区域范围
 +
 
 +
创建区域
 +
/rg define arena
 +
 
 +
允许PVP
 +
/rg flag arena pvp allow
 +
 
 +
因为建筑师们不是区域的一员,所以他们不能建筑,甚至当他们是区域成员时也不行。
 +
 
 +
但你创建区域的原因是使用PVP权限,所以你可以使用 权限来允许。
 +
/rg flag arena passthrough allow
 +
 
 +
常见情节
 +
见常见情节页。
 +
 
 +
===区域魔杖===
 +
区域魔杖列出当前位置的所有区域。它是一个MC物品,右键来检测。
 +
 
 +
默认的,这个物品是皮革,但可以在配置中更改。
 +
 
 +
要使用这个魔杖,需要  worldguard.region.wand  权限
 +
 
 +
===区域标志===
 +
[[File: WG-FLAG.png]]
 +
 
 +
===优先级与继承===
 +
在快速开始中提到,区域可以覆盖。如果要在覆盖的区域内建筑,需要有所有区域的权限。
 +
 
 +
但有了优先级不同。
 +
 
 +
====优先级====
 +
每个区域默认的优先级是0,但它可以更改,大的数字意味着高的优先级。-2147483648 到 2147483647 都可以作为优先级的数字,但你也可以使用 -2, 10, 15,  100.
 +
 
 +
覆盖的区域中考虑优先级最高的那一个。
 +
 
 +
在区域中,使用优先级最高的那一个的权限。
 +
 
 +
使用优先级最高的标志。
 +
 
 +
这样改变优先级:
 +
/rg setpriority example 5
 +
 
 +
 
 +
示例:创建一个pub区域,使pub组可以建筑。spawn中builders组已经可以建筑。
 +
 
 +
选择区域
 +
 
 +
创建区域:
 +
/rg define pub
 +
 
 +
设置优先级:
 +
/rg setpriority pub 10
 +
 
 +
 
 +
在PVP区域中创建一个治疗区域。
 +
 
 +
选择区域
 +
 
 +
创建区域
 +
/rg define heal
 +
 
 +
禁止PVP
 +
/rg flag heal pvp deny
 +
 
 +
优先级
 +
/rg setpriority heal 10
 +
 
 +
 
 +
====继承====
 +
在上面说过,创建pub区域你是否想让pub组和builder组都可以建筑?
 +
 
 +
你可以把builder组加到成员里,但你也可以使用继承。
 +
 
 +
 
 +
子区域继承父区域的成员、主人,没有设置的权限
 +
 
 +
这是为了方便:
 +
 
 +
大区域中的小区域
 +
 
 +
创建一个模板
 +
 
 +
每个区域至多有一个父区域。
 +
 
 +
使用这个指令:
 +
/rg setparent:
 +
 
 +
/rg setparent 子区域 父区域
 +
 
 +
移除父区域:
 +
/rg setparent 子区域
 +
 
 +
 
 +
WG会自动检测继承。
 +
 
 +
例子:创建一个mall
 +
 
 +
/rg setparent plot1 mall
 +
 
 +
/rg setparent plot2 mall
 +
 
 +
/rg addowner mall g:mall_owners
 +
 
 +
/rg addowner plot1 sk89q
 +
 
 +
 
 +
====区域模板====
 +
之前提到,因为继承,所以父区域可以作为子区域的模板。
 +
 
 +
但你可能想要模板不是真正的区域,你不想保护这个区域,做到这个的方法之一是全局区域,使用-g来创建:
 +
/rg define -g plot_template
 +
 
 +
 
 +
例子:
 +
 
 +
/rg define -g plot_template
 +
 
 +
/rg setparent plot1 plot_template
 +
 
 +
/rg setparent plot2 plot_template
 +
 
 +
/rg setparent plot_template mall
 +
 
 +
/rg flag mall chest-access allow
 +
 
 +
/rg flag plot_template chest-access deny
 +
 
 +
 
 +
高优先级的父区域会覆盖子区域。
 +
 
 +
====区域组和覆盖区域====
 +
你可能知道,标志可以只对于一些特殊的组有用。
 +
 
 +
/rg flag mall pvp -g nonmembers deny
 +
 
 +
当只有一个区域的时候,知道谁是成员谁是主人很清楚。但在覆盖区域中不这样:玩家只是其中一个区域的成员呢?
 +
 
 +
答案是否定的,玩家必须在标志设置的区域为成员。例如,让我们想象有两个组——
 +
 
 +
Spawn, 标志 pvp -g nonmembers deny ,没有成员
 +
Market, 成员 “sk89q”
 +
sk89q不能PVP因为他不是spawn的一员。
 +
 
 +
当子区域继承父区域,成员和标志以及主人都会被继承,对于这个是不通用的。
 +
 
 +
例子:
 +
 
 +
Market, 标志 pvp -g nonmembers deny 无成员
 +
Shop1, 成员 “sk89q,” 继承Market
 +
sk89q是成员吗?是,所以 sk89q 可以PVP
 +
 
 +
先前提到,父区域的优先级不能比子区域高,否则会覆盖子区域。
 +
 
 +
===全局区域===
 +
全局区域是一个特殊的区域:
 +
 
 +
包括整个世界
 +
 
 +
有最低的优先级
 +
 
 +
有一些特殊功能
 +
 
 +
每个世界都有它的全局区域。但是除了你尝试配置它,全局区域不会创建。
 +
 
 +
例如,这样会自动创建全局区域。
 +
 
 +
/rg flag __global__ pvp deny
 +
 
 +
 
 +
把全局区域当做一个一直在那儿的区域,在全局区域中的标志在该世界的区域中工作。
 +
 
 +
 
 +
但,像普通区域一样,passthrough 区域标志必须设置为allow。把 passthrough 设置为 allow 会让区域成为一个没有保护的区域,所以只要没有区域防止破坏,玩家就可以建筑。
 +
 
 +
如果你把passthrough标志设置成了deny,会让区域像一个真正的区域一样,玩家必须是主人或成员才能建筑。因为全局区域包括整个世界,所以默认会禁止破坏。
 +
 
 +
因为全局区域的极低优先级,其他区域会直接覆盖全局区域的标志。
 +
 
 +
注意
 +
passthrough标志与移动无关,它是建筑权限的缩写。
 +
 
 +
 
 +
例子:没有区域的地方无法建筑
 +
 
 +
 
 +
/rg flag __global__ passthrough deny
 +
 
 +
增加主人和成员会把passthrough打开。
 +
 
 +
建筑标志
 +
 
 +
建筑标志不能设置成allow,原因是会自动让区域的建筑标志都不工作。把标志设置为deny使它像其他区域一样,但也意味着不能破坏和放置方块。因为全局区域包含整个世界,所以整个世界都不能建筑。
 +
 
 +
警告:
 +
不建议设置全局区域的build标志。如果你想保护世界,使用 passthrough 标志。如果你设置了全局区域的build标志,其他区域不会覆盖这个标志。
 +
 
 +
所以,如果你把全局区域的build设置为了deny,无论他们是区域的主人或成员,都不能建筑了。
 +
 
 +
默认覆盖
 +
 
 +
WE的标志有一些不同。如 exp-drop 标志如果没有区域设置的话,甚至是成员和主人都不能掉落经验。
 +
 
 +
如果你想要用把它设置为deny的方式覆盖 exp-drops 标志,使它可以运行,在全局区域上就不会工作。
 +
 
 +
如你尝试使用 /rg flag __global__ exp-drop -g nonmembers deny但这不会工作。当你指定不是成员时,会指定不是全局区域的成员。所以,如果你制作一个地皮区域,经验不会生成,因为地皮区域的成员不是全局区域的成员。
 +
 
 +
记住,即使全局区域的优先级是最低的,但区域不会继承,标志不会传播。
 +
 
 +
这样的话,推荐你创建一个模板区域。见优先级与继承。
 +
 
 +
===区域认领===
 +
WG中可以使用区域认领系统。它像 /rg define 一样,但玩家必须有特殊的权限。
 +
 
 +
这里同时也需要WE来选择区域,所以你需要 worldedit.selection 权限。
 +
 
 +
玩家可以这样认领选中的区域:
 +
/rg claim region_name
 +
 
 +
当玩家输入指令后,会自动变成区域主人。这需要worldguard.region.claim权限。
 +
 
 +
规则:
 +
 
 +
最大的区域数量: 除非有 worldguard.region.unlimited 权限,玩家的区域数不能超过这个数量。
 +
 
 +
最大区域提及: 除非有 worldguard.region.unlimited 权限,不然体积不能超过配置。
 +
 
 +
预防覆盖:区域不能使用同名。
 +
 
 +
预防重叠:区域不能重叠于其他区域。
 +
 
 +
只能重叠自己的区域: 如果regions.claim-only-inside-existing-regions启用,只能重叠于自己的区域。
 +
 
 +
这时不支持多边形区域。
 +
 
 +
你也可以给予玩家其他指令的权限。
 +
 
 +
===存储===
 +
区域数据可以这样存储:
 +
 
 +
YAML 不需要数据库 简单的更改,简单备份,快速读取
 +
 
 +
MYSQL 使用数据库 保存只更改一部分
 +
 
 +
注意:其他数据库,如PostgreSQL, SQL Server, SQLite不支持
 +
 
 +
切换存储:默认是YAML
 +
 
 +
在配置中 regions.sql.use 可以切换为MYSQL 这会禁用 YAML. 如果你切换至 MySQL, 数据表会自动生成, 当然要为 SQL 用户提供相应权限
 +
 
 +
警告
 +
强烈建议在你更换数据库之前做备份。
 +
 
 +
如果你只是简单的切换数据库,你之前所有数据都会丢失。你可以使用你哥简单的指令来切换,你在切换之前和之后都可以使用。
 +
 
 +
To migrate data, use: /rg migratedb 之前 之后,如要把YAML换成MYSQL 使用
 +
/rg migratedb yaml mysql
 +
 
 +
请确保目标数据库是空的。
 +
 
 +
在你更改的时候不要忘记备份。
 +
 
 +
YAML
 +
在region.yml中,每个世界下都有。 可以使用/rg load来读取。
 +
 
 +
这是个示例:
 +
<pre>
 +
regions:
 +
    test:
 +
        min: {x: 1730.0, y: 0.0, z: -169.0}
 +
        max: {x: 1742.0, y: 255.0, z: -158.0}
 +
        members:
 +
            players: [bobby]
 +
            unique-ids: [0ea8eca3-dbf6-47cc-9d1a-c64551ca975c]
 +
        flags: {use: allow, greeting: Welcome!, pvp: allow, pvp-group: MEMBERS}
 +
        owners:
 +
            groups: [admins]
 +
        type: cuboid
 +
        priority: 4
 +
    __global__:
 +
        members: {}
 +
        flags: {}
 +
        owners: {}
 +
        type: global
 +
        priority: 0
 +
</pre>
 +
UUID经常使用
 +
 
 +
MySQL
 +
只有一个服务器可以使用MYSQL
 +
前缀可以更改
 +
如果有错误发生会回档
 +
默认WG只会记录更改
 +
这个是讲解
 +
<pre>
 +
Table Purpose
 +
region Region data, with shape, priority, and parent information.
 +
region_cuboid Data for cuboid regions, with bounds.
 +
region_poly2d Data for polygonal regions, with minimumum and maximum Y values.
 +
region_poly2d_point Individual rows for points of polygonal regions.
 +
region_flag Per-region flag data.
 +
region_players List of players on regions.
 +
region_groups List of groups on regions.
 +
world Normalizes worlds into a world ID.
 +
user Normalizes users into a user ID.
 +
group Normalizes groups into a group ID.
 +
Each user row will either have a UUID or name set.
 +
</pre>
 +
不推荐在运行的服务器上修改MYSQL。经常会导致出错。
 +
 
 +
===保护功能的使用===
 +
保护是综合性的:
 +
 
 +
可以保护方块的破坏和放置,物品栏的打开,外部TNT的爆炸,外部重力方块的掉落,外部植物的生长,牌子的切换,作物的踩踏,画和展示框,红石触发机关,动物,喷溅药水和弹射物。
 +
 
 +
其实,WG也支持一些MOD物品的保护。
 +
 
 +
水和岩浆的流动在配置中默认禁止,可以打开。
 +
 
 +
如果你找到了破坏的方式,请汇报BUG。
 +
 
 +
例外
 +
一些标志会自动为不是成员的人关闭
 +
 
 +
如物品掉落和物品拾取。
 +
 
 +
经验值也不允许掉落。
 +
 
 +
这些可以通过区域标志来移除。
 +
 
 +
但是漏斗不行。漏斗会自动吸取区域下部箱子的物品,所以不要把区域箱子放在下部。这不能被更改。
 +
 
 +
其实例外可以对每个区域都增加,也可以用触发白名单在全局区域开启。
 +
 
 +
例子:在保护的区域中允许任何人使用红石机关:
 +
 
 +
/rg flag __global__ use allow
 +
 
 +
例子:在spawn区域为所有不是成员的玩家锁定物品丢弃和拾取:
 +
 
 +
/rg flag spawn item-pickup -g nonmembers deny
 +
 
 +
/rg flag spawn item-drop -g nonmembers deny
 +
 
 +
例子:为所有地皮的不是成员的玩家锁定经验掉落
 +
 
 +
 
 +
/rg flag mall_parent exp-drops -g nonmembers deny
 +
 
 +
 
 +
这是错的 /rg flag __global__ exp-drops -g nonmembers deny
 +
 
 +
这因为区域没有继承全局区域。
 +
 
 +
方块和实体
 +
 
 +
一个WG保护区域的重要特性是控制方块和实体,玩家可以成为一个区域的成员,但WG把方块和实体也这样看待,它们也可以成员区域的成员之一。
 +
 
 +
但是方块和实体不能像玩家一样通过命令加入区域。一个外部的活塞的方块不能进入区域,这就是原因。这是因为那个方块像non-member组,同样的,一些东西也不能改变方块。在区域中的活塞可以推动方块的原因是它像区域的一个成员。
 +
 
 +
WG同时也尝试检测事件真正的触发器。如一个砂砾在一个被保护区域上空被放置,它会调入被保护区域。WG认为最后生成的方块是由于掉落的砂砾,掉落的砂砾是由于高出的方块砂砾,因为它在区域外,不是区域内的“成员”,所以就会被保护。
 +
 
 +
当build标志在区域中设置为了deny没有人可以建筑,活塞也不会工作,因为人们不可以建筑,活塞像成员一般,也不会工作。
 +
 
 +
其他MOD和插件的支持:
 +
 
 +
一些MOD增加了新的游戏物品,如方块,道具,实体,MOD们需要API。
 +
 
 +
通常的,BUkkit插件一般会遵循保护插件,但事实不总是这样。有些MOD的支持几乎少的可怜,这些MOD不会遵循其他MOD和插件的保护。
 +
 
 +
最优保护
 +
 
 +
要注意的东西
 +
 
 +
可以改变其他方块和实体的方块和实体
 +
 
 +
发射弹射物的东西
 +
 
 +
WG可以在更多方块和实体上去保护。保护会预防左键右键方块和实体。这通常是足够的,因为这是与大多数方块和实体进行交互的唯一方法。
 +
 
 +
但WG不能保护在客户端上打开GUI的方块和实体,因为他们发送和接收的东西与WG无关。
 +
 
 +
其实,WG本身有的行动也不能控制,如一些自定义方块和实体。因为MC本身的一些方块也会影响世界,如活塞,但Bukkit组或你正在使用的服务端的维护者注意到这改变了世界,所以WG可以保护它们。
 +
 
 +
但是MOD的方块和实体不同,所以WG有时不能保护这些。
 +
 
 +
一些MOD会为了某些效果而虚拟一个玩家。这些玩家的名字基本上都是以MOD名来命名。但是这个消息除了对于识别是哪个MOD造成的,也可以使WG来预防一些行为。
 +
 
 +
要让MOD在保护的区域中发挥作用,虚拟玩家有特殊权限,这个配置可以在fake-player-build-override修改,这样就不会预防MOD在保护区域中工作了。
 +
 
 +
弹射物[和一些魔法MOD中的弹射物效果]是作者目前主要关注的问题。这是因为MOD不会提示插件弹射物的发射。
 +
 
 +
WG有一个工作区 emit-block-use-at-feet 设置,这个设置可以允许你设置一些物品类型,这会假装改变玩家的脚底下的方块。这会防止玩家烧掉他们自己的物品,但玩家不能在区域中使用物品,但在保护区域外,这不会工作
 +
 
 +
解决方案
 +
如果出问题的是一个Bukkit插件,联系它的作者以增加对于保护插件的支持。这也可以通过使用WG API来解决。
 +
 
 +
如果出问题的是一个MOD,那你只能联系发布者以获得支持。
 +
 
 +
修复选择的区域可以:
 +
 
 +
如果你确信的话,你可以忽略。
 +
 
 +
你也可以禁用出问题的物品。
 +
 
 +
===常见情节===
 +
如何启用红石开关?
 +
/rg flag REGION_NAME use allow
 +
 
 +
/rg flag __global__ use allow
 +
 
 +
如何让玩家骑马和矿车?
 +
 
 +
/rg flag REGION_NAME ride allow
 +
 
 +
/rg flag __global__ ride allow
 +
 
 +
如何预防在野外建筑?
 +
 
 +
/rg flag __global__ passthrough deny
 +
 
 +
怎么让不是成员的玩家不能出去?
 +
 
 +
/rg addmember example_region sk89q
 +
 
 +
/rg flag example_region exit -g nonmembers deny
 +
 
 +
如何让不是成员的玩家只能从一边出去?
 +
 
 +
设置两个区域
 +
 
 +
一个与上面相同
 +
 
 +
一个在区域的一侧,覆盖掉标志。exit=allow.
 +
 
 +
 
 +
如何不保护所有附魔台?
 +
 
 +
在配置中的 interaction-whitelist 设置,加入 enchantment table. 使用Material来获取正确的名字。
 +
 
 +
怎么允许挖但不会破坏方块?
 +
 
 +
把 block-break 标志设置为allow:
 +
 
 +
* /rg flag mining_area block-break allow
 +
 
 +
怎么只能破坏一些方块?
 +
 
 +
对不起,现在不支持。
 +
 
 +
地皮设置
 +
 
 +
怎么设置地皮?
 +
 
 +
你首先要阅读优先级和继承,然后根据例子来创建,
 +
 
 +
/rg define mall
 +
 
 +
/rg define shop_template -g
 +
 
 +
/rg define shop1
 +
 
 +
/rg define shop2
 +
 
 +
/rg define shop3
 +
 
 +
/rg setparent shop_template mall
 +
 
 +
/rg setparent shop1 shop_template
 +
 
 +
/rg setparent shop2 shop_template
 +
 
 +
/rg setparent shop3 shop_template
 +
 
 +
/rg flag mall use deny
 +
 
 +
/rg flag shop_template use allow
 +
 
 +
 
 +
问题
 +
 
 +
为什么活塞不工作?
 +
 
 +
你设置建筑权限了吗?
 +
 
 +
/rg flag __global__ build
 +
 
 +
如果你想保护野外,使用这个
 +
 
 +
/rg flag __global__ passthrough deny
 +
 
 +
不支持用活塞把一个区域中的方块推到另一个区域中。
 +
 
 +
 
 +
为什么其他MOD的一些物品被禁用了?
 +
 
 +
参阅保护什么页面
 +
 
 +
==箱子保护==
 +
WG提供了一个基础的自带的箱子保护功能,只需使用特殊的格式。我们不建议新手使用这个部分因为它不是WG一个活跃的部分。此外,WG有特殊的方式使得没法用漏斗从箱子偷东西。
 +
 
 +
如果你对于这个箱子保护感兴趣的话,我们推荐你使用第三方插件,如 Lockette 和 LWC.
 +
===起步===
 +
箱子保护必须先在配置中启用。当它被禁用时,箱子保护不会激活,但可以使用牌子锁[这个也可以在配置内禁用]
 +
 
 +
只要箱子下放一个牌子,就会保护,这个牌子:
 +
 
 +
必须是个标示牌
 +
 
 +
必须在箱子下面 (双层箱子需要最少在一个下面)
 +
 
 +
在第一行写下[Lock]
 +
 
 +
第二行有玩家的名字
 +
 
 +
可以在下面2行写下其他玩家的名字
 +
 
 +
在第二行写下别人的名字是不允许的
 +
 
 +
注意
 +
 
 +
WG中的箱子保护不支持UUID
 +
 
 +
警告
 +
 
 +
因为1.8的改变,把其他版本的箱子锁升级到1.8会破坏所有牌子。[其实是会破坏带有 [ ] 的牌子]
 +
 
 +
==WG API==
 +
===开发者===
 +
{{Hide|内容=
 +
译者毕竟不是开发者,所以翻译见谅
 +
 
 +
WG API在5.X和6.X版本就有了,推荐6.X
 +
 
 +
maven存储库:  http://maven.sk89q.com/repo/
 +
 
 +
人工制品:  com.sk89q:worldguard:VERSION VERSION即为版本
 +
 
 +
下面是作者给的一些示例
 +
<pre>
 +
<repositories>
 +
    <repository>
 +
        <id>sk89q-repo</id>
 +
        <url>http://maven.sk89q.com/repo/</url>
 +
    </repository>
 +
</repositories>
 +
 
 +
<dependencies>
 +
    <dependency>
 +
        <groupId>com.sk89q</groupId>
 +
        <artifactId>worldguard</artifactId>
 +
        <version>VERSION</version>
 +
    </dependency>
 +
</dependencies>
 +
 
 +
 
 +
repositories {
 +
    mavenCentral()
 +
    maven { url "http://maven.sk89q.com/repo/" }
 +
}
 +
 
 +
dependencies {
 +
    compile 'com.sk89q:worldguard:VERSION'
 +
}
 +
</pre>
 +
 
 +
 
 +
配置plugin.yml
 +
<pre>
 +
name: My Plugin
 +
version: 1.0
 +
description: This is my plugin!
 +
depend: [WorldGuard]
 +
</pre>
 +
 
 +
 
 +
 
 +
<pre>
 +
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
 +
import org.bukkit.plugin.Plugin;
 +
 
 +
private WorldGuardPlugin getWorldGuard() {
 +
     Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
 +
 
 +
     // WorldGuard may not be loaded
 +
     if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
 +
         return null; // Maybe you want throw an exception instead
 
     }
 
     }
 
    return (WorldGuardPlugin) plugin;<br />
 
}<br />
 
  
在较新的Worldguard(我说版本)内,你可以使用Static方式<br />
+
    return (WorldGuardPlugin) plugin;
列子:使用WGbukkit取读Worldguard<br />
+
}
  
import com.sk89q.worldguard.bukkit.WGBukkit;<br />
 
 
// 现在你需要取读Worldguard<br />
 
// 例如, 集合所有的region到一个点<br />
 
    ApplicableRegionSet set = WGBukkit.getRegionManager(world).getApplicableRegions(location);<br />
 
  
===基础权限===
+
import com.sk89q.worldguard.bukkit.WGBukkit;
===区域管理===
 
====查看Flags====
 
====取读一个区域====
 
===Javadocs===
 
  
查看[http://docs.sk89q.com/worldguard/apidocs/com/sk89q/worldguard/bukkit/WGBukkit.html Javadocs]
+
WorldGuardPlugin plugin = WGBukkit.getPlugin();
  
==数据格式==
 
  
'''Region数据都保存在regions.txt内. 打开后首先会有:'''
+
class MyPlugin {
 +
    public void onEnable() {
 +
        ProtectedCuboidRegion region = new ProtectedCuboidRegion(...);
 +
    }
 +
}
  
Region ID<br />
+
class RegionHolder {
Region 类型(type)<br />
+
    private final ProtectedCuboidRegion region;
  
Worldguard3.0版本以下的保存方式:<br />
+
    public MyPlugin() {
Point 1 X  region坐标<br />
+
        region = new ProtectedCuboidRegion(...);
Point 1 Y  ↓<br />
+
    }
Point 1 Z  ↓<br />
+
}
Point 2 X  ↑<br />
+
 
Point 2 Y  ↑<br />
+
class MyPlugin {
Point 2 Z  region坐标<br />
+
    public void onEnable() {
Priority 优先权(请勿设定为0)<br />
+
        try {
List of owners 拥有者列表<br />
+
            new RegionHolder();
List of flags Flags列表(设置过的)<br />
+
        } catch (NoClassDefFoundException e) {
Entry message (进入region提示信息/欢迎语)<br />
+
            // Do something here
 +
        }
 +
    }
 +
}
 +
 
 +
class MyPlugin {
 +
    public void onEnable() {
 +
        try {
 +
            boolean result = SomeClass.staticMethod();
 +
        } catch (NoClassDefFoundException e) {
 +
            // Do something here
 +
        }
 +
    }
 +
}
 +
 
 +
</pre>
 +
译者是个翻译官,开发什么的就免了。
 +
有问题还是去问作者吧 这个我是没法解答了。
 +
}}
 +
 
 +
===建筑检查===
 +
{{Hide|内容=
 +
<pre>
 +
boolean canBuild(Player player, Location loc);
 +
boolean canBuild(Player player, Block block);
 +
 
 +
getWorldGuardPlugin().canBuild(player, block.getRelative(0, -1, 0));
 +
</pre>
 +
}}
 +
 
 +
===区域构建===
 +
====管理者====
 +
{{Hide|内容=
 +
<pre>
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionManager regions = container.get(world);
 +
ProtectedRegion region = regions.getRegion("spawn");
 +
 
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionManager regions = container.get(world);
 +
if (regions != null) {
 +
    return regions.getRegion("spawn");
 +
} else {
 +
    // The world has no region support or region data failed to load
 +
}
 +
 
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionManager regions = container.get(world);
 +
regions.addRegion(region);
 +
 
 +
regions.removeRegion("mall", RemovalStrategy.UNSET_PARENT_IN_CHILDREN);
 +
 
 +
save()
 +
saveChanges()
 +
 
 +
load()
 +
</pre>
 +
}}
 +
 
 +
====区域====
 +
{{Hide|内容=
 +
<pre>
 +
ProtectedRegion class
 +
子class
 +
ProtectedCuboidRegion
 +
ProtectedPolygonalRegion
 +
GlobalProtectedRegion
 +
 
 +
region.setPriority(100);
 +
 
 +
mall.setParent(null); // No parent
 +
plot.setParent(mall);
 +
 
 +
if (region instanceof ProtectedPolygonalRegion) {
 +
    ProtectedPolygonalRegion polygon = (ProtectedPolygonalRegion) region;
 +
    List<BlockVector2D> points = polygon.getPoints();
 +
}
 +
 
 +
DefaultDomain members = region.getMembers();
 +
members.addPlayer("sk89q");
 +
members.addPlayer(UUID.fromString("0ea8eca3-dbf6-47cc-9d1a-c64551ca975c"));
 +
members.addGroup("admins");
 +
 
 +
// Google's Guava library provides useful concurrency classes.
 +
// The following executor would be re-used in your plugin.
 +
ListeningExecutorService executor =
 +
        MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
 +
 
 +
String[] input = new String[] { "sk89q", "g:admins" };
 +
ProfileService profiles = getWorldGuard().getProfileService();
 +
DomainInputResolver resolver = new DomainInputResolver(profiles, input);
 +
resolver.setLocatorPolicy(UserLocatorPolicy.UUID_AND_NAME);
 +
ListenableFuture<DefaultDomain> future = executor.submit(resolver);
  
Worldguard3.0版本以上的保存方式:<br />
+
// Add a callback using Guava
Point 1 X  region坐标<br />
+
Futures.addCallback(future, new FutureCallback<DefaultDomain>() {
Point 1 Y  ↓<br />
+
    @Override
Point 1 Z  ↓<br />
+
    public void onSuccess(DefaultDomain result) {
Point 2 X  ↑<br />
+
        region.getOwners().addAll(result);
Point 2 Y  ↑<br />
+
    }
Point 2 Z  region坐标<br />
 
  
Priority 优先权(请勿设定为0)<br />
+
    @Override
ID of parent region 父regionID(设置过子region才会显示)<br />
+
    public void onFailure(Throwable throwable) {
List of owners 拥有者列表<br />
+
        // Do something about the error
List of members 会员列表<br />
+
    }
List of flags Flags列表(设置过的)<br />
+
});
Entry message (进入region提示信息/欢迎语)<br />
 
Exit message (退出region提示信息)<br />
 
  
拥有者以及会员数据保存方式:<br />
+
DefaultFlag.BUILD
u: 玩家名称<br />
+
DefaultFlag.PVP
g: region权限组<br />
+
DefaultFlag.LEAF_DECAY
 +
DefaultFlag.LIGHTNING
  
例如<br />
+
String message = region.getFlag(DefaultFlag.GREET_MESSAGE);
u:sk89q,u:tetsu,g:admins<br />
+
player.sendMessage(message);
  
意思就是sk89q以及tetsu这两个玩家都在admins组内。
+
region.setFlag(DefaultFlag.GREET_MESSAGE, "Hi there!");
  
Flags数据保存方式:<br />
+
RegionGroupFlag flag = DefaultFlag.PVP.getRegionGroupFlag();
每一个flag都会有一个特殊的字母,例如Build就是b,通过一个+或者-我们能够查看这个flag的状态<br />
 
+就是启动<br />
 
-就是关闭/禁止<br />
 
如果没有+或- 那么代表这个flag默认就是启动的<br />
 
例如<br />
 
+bpmc-t-l-f-F<br />
 
  
{| class="wikitable"
+
region.setFlag(DefaultFlag.USE, StateFlag.State.ALLOW);
|-
+
region.setFlag(DefaultFlag.USE.getRegionGroupFlag(), RegionGroup.MEMBERS);
! Flag 名称 !! 代表字母
+
 
|-
+
BlockVector min = new BlockVector(-10, 5, -4);
| Passthrough || z
+
BlockVector max = new BlockVector(5, -8, 10);
|-
+
ProtectedRegion region = new ProtectedCuboidRegion("spawn", min, max);
| Build || b
+
 
|-
+
List<BlockVector2D> points = Lists.newArrayList(); // Call from Guava
| PvP || p
+
points.add(new BlockVector2D(3, 4, 5));
|-
+
points.add(new BlockVector2D(0, 0, 0));
| Mob damage || m
+
points.add(new BlockVector2D(19, 3, 4));
|-
+
int minY = 0;
| Creeper explosion || c
+
int maxY = 54;
|-
+
ProtectedRegion region = new ProtectedPolygonalRegion("spawn", points, minY, maxY);
| TNT || t
+
 
|-
+
ProtectedRegion region = new GlobalProtectedRegion("template");
| Flint and steel || l
+
 
|-
+
region.contains(new Vector(20, 0, 30));
| Fire spread || f
+
 
|-
+
List<ProtectedRegion> candidates = Lists.newArrayList();
| Lava fire spread || F
+
candidates.add(mall);
|}
+
candidates.add(hospital);
 +
 
 +
List<ProtectedRegion> overlapping = spawn.getIntersectingRegions(candidates);
 +
 
 +
isDirty()
 +
</pre>
 +
}}
 +
 
 +
====空间查询====
 +
{{Hide|内容=
 +
<pre>
 +
ApplicableRegionSet
 +
 
 +
RegionQuery query = container.createQuery();
 +
ApplicableRegionSet set = query.getApplicableRegions(location);
 +
 
 +
Location loc = new Location(world, 10, 64, 100);
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionQuery query = container.createQuery();
 +
ApplicableRegionSet set = query.getApplicableRegions(loc);
 +
 
 +
Vector position = new Vector(20, 10, 4);
 +
ApplicableRegionSet set = regions.getApplicableRegions(position);
 +
 
 +
Location loc = new Location(world, 10, 64, 100);
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionManager regions = container.get(loc.getWorld());
 +
// Check to make sure that "regions" is not null
 +
ApplicableRegionSet set = regions.getApplicableRegions(BukkitUtil.toVector(loc));
 +
 
 +
Vector min = new Vector(0, 0, 0);
 +
Vector max = new Vector(10, 10, 10);
 +
ProtectedRegion test = new ProtectedCuboidRegion("dummy", min, max);
 +
ApplicableRegionSet set = regions.getApplicableRegions(test);
 +
 
 +
List<ProtectedRegion> regions = Lists.newArrayList();
 +
regions.add(spawn);
 +
regions.add(mall);
 +
regions.add(pub);
 +
 
 +
ApplicableRegionSet set = new RegionResultSet(regions, null); // No global region
 +
 
 +
for (ProtectedRegion region : set) {
 +
    // Do something with each region
 +
}
 +
 
 +
List<ProtectedRegion> region = Lists.newArrayList(set);
 +
 
 +
</pre>
 +
}}
 +
 
 +
====计算权限====
 +
{{Hide|内容=
 +
<pre>
 +
queryAllValues(RegionAssociable, Flag)
 +
 
 +
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
 +
Collection<String> greetings = set.queryAllValues(localPlayer, DefaultFlag.GREET_MESSAGE);
 +
 
 +
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
 +
String greeting = set.queryValue(localPlayer, DefaultFlag.GREET_MESSAGE);
 +
 
 +
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
 +
if (!set.testState(localPlayer, DefaultFlag.BUILD)) {
 +
    event.setCancelled(true);
 +
}
 +
 
 +
if (!set.testState(null, DefaultFlag.CREEPER_EXPLOSION)) {
 +
    event.setCancelled(true);
 +
}
 +
 
 +
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
 +
Location loc = new Location(world, 10, 64, 100);
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionQuery query = container.createQuery();
 +
 
 +
// No need to bother:
 +
// ApplicableRegionSet set = query.getApplicableRegions(loc);
 +
 
 +
// Just directly test the flag
 +
query.testState(loc, localPlayer, DefaultFlag.BUILD);
 +
 
 +
testState(..., DefaultFlag.BUILD, your flags)
 +
 
 +
List<ProtectedRegion> regions = Arrays.asList(spawnRegion, buildersClub);
 +
builderPlayer.getAssociation(regions) == Association.OWNER;
 +
 
 +
Set deepInside    = newHashSet(spawn, mall);
 +
Set inside        = newHashSet(spawn);
 +
Set outside      = newHashSet(); // Empty set
 +
 
 +
// outside -> inside = BLOCKED
 +
new RegionOverlapAssociation(outside).getAssociation(inside) == NON_MEMBER
 +
 
 +
// inside -> inside = ALLOWED
 +
new RegionOverlapAssociation(inside).getAssociation(inside) == MEMBER
 +
 
 +
// inside -> deepInside = ALLOWED
 +
new RegionOverlapAssociation(inside).getAssociation(deepInside) == MEMBER
 +
 
 +
// inside -> outside = ALLOWED
 +
new RegionOverlapAssociation(inside).getAssociation(outside) == MEMBER
 +
 
 +
private RegionAssociable createRegionAssociable(Object cause) {
 +
    if (cause instanceof Player) {
 +
        return getWorldGuard().wrapPlayer((Player) cause);
 +
    } else if (cause instanceof Entity) {
 +
        RegionQuery query = getWorldGuard().getRegionContainer().createQuery();
 +
        return new DelayedRegionOverlapAssociation(query, ((Entity) cause).getLocation());
 +
    } else if (cause instanceof Block) {
 +
        RegionQuery query = getWorldGuard().getRegionContainer().createQuery();
 +
        return new DelayedRegionOverlapAssociation(query, ((Block) cause).getLocation());
 +
    } else {
 +
        return Associables.constant(Association.NON_MEMBER);
 +
    }
 +
}
 +
 
 +
@EventHandler
 +
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
 +
    Player player = event.getPlayer();
 +
    RegionAssociable associable = createRegionAssociable(getWorldGuard().wrapPlayer(player));
 +
 
 +
    if (!set.testState(associable, /* flags here */)) {
 +
        event.setCancelled(true);
 +
    }
 +
}
 +
</pre>
 +
}}
 +
 
 +
====保护查询====
 +
{{Hide|内容=
 +
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
 +
Location loc = new Location(world, 10, 64, 100);
 +
RegionContainer container = getWorldGuard().getRegionContainer();
 +
RegionQuery query = container.createQuery();
 +
 
 +
if (!query.testState(loc, localPlayer, DefaultFlag.BUILD)) {
 +
    // Can't build
 +
}
 +
}}
 +
 
 +
====区域事件====
 +
DisallowedPVPEvent
 +
禁止PVP
 +
 
 +
===从水桶服的一些物体===
 +
getWorldGuard().wrapPlayer(player);
 +
 
 +
BukkitUtil.toVector(location);
 +
 
 +
==高级话题==
 +
===事件的记录===
 +
====漏斗式事件====
 +
Bukkit 在发生事件的时候通知插件,有许多所谓的事件,如
 +
 
 +
*Bucket fill
 +
*Bucket empty
 +
*Right click of an entity by a player
 +
*Placement of a block by a player
 +
*Digging of a block by a player
 +
*Change of a block by an entity
 +
*Piston push
 +
*Push retract
 +
 
 +
但这些可以在MC中归于三类
 +
 
 +
*Items
 +
*Blocks
 +
*Entities
 +
 
 +
你可以关于这些做一些事
 +
 
 +
*Place them
 +
*Break them
 +
*Interact with them
 +
*Damage them
 +
 
 +
为了简化事件,WG提供了以下方式
 +
 
 +
*Bucket fill → Interact with a block, Interact with an item
 +
*Bucket empty → Interact with a block, Interact with an item
 +
*Right click of an entity by a player → Interact with an entity
 +
*Placement of a block by a player → Interact with a block
 +
*Digging of a block by a player → Interact with a block
 +
*Change of a block by an entity → Interact with a block
 +
*Piston push → Interact with a block
 +
*Push retract → Interact with a block
 +
 
 +
WG的部分,如区域保护,需要“interact with a block,” “interact with an entity,” 等 ,然后会检测方块 实体被触发。
 +
 
 +
===检测触发===
 +
计算一些东西的另一方面是可以用简介的东西来完成这个复杂的事件。
 +
 
 +
例如,如果一个玩家对另一个玩家射箭,直接的触发器 -- 箭 -- 不是真正的触发器,玩家才是。
 +
 
 +
另一个例子是放置砂砾,它会掉落:最后掉在地上是因为(1)掉落实体,因为(2)砂砾方块被触发,(3)被玩家放置。
 +
 
 +
记住它是玩家导致的,其他例子可能是方块或实体。
 +
 
 +
但是,不可能总是检测正确。WG有时必须追踪事件链。
 +
 
 +
===显示内部事件===
 +
这里只有一些有用的内部事件来检测。把它们放到服务器记录是可能的,允许你:
 +
 
 +
找出某些活动的黑名单
 +
 
 +
查看WG是否在操控活动
 +
 
 +
加入WG贡献组来查看它支持的内部事件
 +
 
 +
要使用这个模式,在命令行加入参数 -Dworldguard.debug.listener=true
 +
 
 +
提示:
 +
这个特性最好在一个私人服务器上使用,不要在大型服务器使用,会刷屏。
 +
 
 +
可以在BAT文件启用
 +
 
 +
原来你的BAT是这样的
 +
 
 +
<pre>
 +
@ECHO OFF
 +
SET BINDIR=%~dp0
 +
CD /D "%BINDIR%"
 +
"%ProgramFiles(x86)%\Java\jre7\bin\java.exe" -Xincgc -Xmx1G -jar craftbukkit.jar
 +
PAUSE
 +
You’d add -Dworldguard.debug.listener=true like so:
 +
</pre>
 +
改为这样
 +
<pre>
 +
@ECHO OFF
 +
SET BINDIR=%~dp0
 +
CD /D "%BINDIR%"
 +
"%ProgramFiles(x86)%\Java\jre7\bin\java.exe" -Dworldguard.debug.listener=true -Xincgc -Xmx1G -jar craftbukkit.jar
 +
PAUSE
 +
</pre>
 +
放在-jar之前的任意位置,在java.exe之后。
 +
 
 +
===解释输出===
 +
让我们看看在区域上方放一个砂砾,你可以看到在控制台中:
 +
<pre>
 +
* USE  GRAVEL        [Player{sk89q}] @world :BlockPlaceEvent
 +
* PLACE GRAVEL @0,99,0 [Player{sk89q}] :BlockPlaceEvent
 +
* SPAWN FALLING_BLOCK  [Block{0,99,0}] @-0,99,0 :EntityChangeBlockEvent
 +
* PLACE GRAVEL @      [Block{0,99,0} | FallingSand] :EntityChangeBlockEvent [CANCELLED]
 +
* SPAWN DROPPED_ITEM  [Block{0,99,0} | FallingSand] @-0,0,0 :EntityChangeBlockEvent
 +
</pre>
 +
 
 +
输出已经缩短并且有格式化
 +
 
 +
每行的语法是这样的
 +
 
 +
ACTION TYPE/LOCATION [CAUSES] @LOOCATION :BUKKIT-EVENT [CANCELLED?]
 +
 
 +
''取消的事件被锁定?''
 +
 
 +
===讲解实例===
 +
首先,当砂砾被放置,会<pre>
 +
* USE  GRAVEL        [Player{sk89q}] @world :BlockPlaceEvent</pre>
 +
这是玩家放置,然后是真正的放置触发
 +
<pre>
 +
* PLACE GRAVEL @0,99,0 [Player{sk89q}] :BlockPlaceEvent</pre>
 +
因为砂砾被放在空气中,会掉落成实体——
 +
<pre>* SPAWN FALLING_BLOCK  [Block{0,99,0}] @-0,99,0 :EntityChangeBlockEvent</pre>
 +
当砂砾落地时会尝试生成一个新的砂砾方块并移除实体——
 +
<pre>* PLACE GRAVEL @      [Block{0,99,0} | FallingSand] :EntityChangeBlockEvent [CANCELLED]</pre>
 +
因为掉落进了一保护区域,会生成一个掉落物——
 +
<pre>* SPAWN DROPPED_ITEM  [Block{0,99,0} | FallingSand] @-0,0,0 :EntityChangeBlockEvent</pre>
 +
--全过程
 +
 
 +
==普通问题==
 +
===常规===
 +
====为什么一个命令都不工作?====
 +
 
 +
如果没有命令工作,可能是WG启动失败了。
 +
 
 +
请注意你的服务端是Bukkit或[其他兼容插件的服务器],在后台或游戏里使用/version来查看版本。
 +
 
 +
确保你安装了WE。
 +
 
 +
确保如果你下载的是zip文件,你已经解压。
 +
 
 +
确保你使用的是对应Minecraft版本的WG。
 +
 
 +
如果这些不能帮助你,你需要查看你的启动日志。
 +
 
 +
你可以打开latest.log来查看日志。
 +
 
 +
如果你还是不能发现问题,在获取帮助页面的汇报BUG链接中反馈。
 +
 
 +
 
 +
====WG多大了?====
 +
WG是2010.11被sk89q写出的,当时是个MOD,之后便有了插件的版本。
 +
 
 +
====谁在发展WG====
 +
WG被许多人发展,WG的很多代码都是贡献代码,贡献者列表可以在Github找寻。
 +
 
 +
===不能破坏===
 +
====为什么玩家不能破坏方块?====
 +
 
 +
 
 +
全新的WG中的许多特性都是未启用的,所以这基本不可能是WG引起。
 +
 
 +
一个简单去找寻原因的方法是查看在你破坏方块时收到的信息。WG一般使用暗红和深红的颜色,和这样的消息“Hey! Sorry, but you can’t _____ here.”如果你没有收到信息,那就不是WG的锅。
 +
 
 +
如果不是一安装WG就这样的话,确保出生点保护没有启用。出生点保护会保护世界出生点以内的区域,若要取消,把 spawn-protection 改为0 [server.properties]。
 +
 
 +
同样确保你没有使用冒险模式。更新你的Bukkit/Spigot/Cauldron的版本。
 +
 
 +
如果这些步骤不行的话,WG中有一个简单的指令可以探测是什么插件阻止了这个事件的发生。使用 “testbreak” 和 “testplace” 来查看。
 +
 
 +
如果是WG造成的话:
 +
 
 +
使用区域魔杖来查看是否有区域保护了方块,如果有一些的话,可能你不知道,查看下一个问题。
 +
 
 +
检查是否启用了建筑权限,检查配置文件是否禁止了这个事件。
 +
 
 +
如果你不能解决问题,查看获取帮助页。
 +
 
 +
如果指令列出了另一个插件:
 +
 
 +
查看你是否关于那个插件要给予另外的权限。
 +
 
 +
如果什么都没有列出,查看上方的出生点保护设置,然后去获取帮助页。
 +
 
 +
====在设置了区域之后,为什么都不能建筑?====
 +
使用区域魔杖,然后右键一个方块,去查看所有区域。使用/rg info来查看每个区域的信息。
 +
 
 +
确保合适所有区域的成员。
 +
 
 +
确保建筑权限没有禁止。
 +
 
 +
====这里只有全局区域吗?====
 +
确保全局设置没有被禁用;确保M全局区域的穿过没有设置为禁用;确保全局区域没有成员和主人。
 +
===建筑没有锁定===
 +
====为什么保护没有工作?但玩家没有收到消息?====
 +
 
 +
你是OP,有完全权限,但玩家没有
 +
 
 +
你把一个区域的建筑和穿过权限设置成了allow
  
=黑名单(Blacklist)=
+
你把其他的一些权限设置成了allow
worldguard黑名单可以指定玩家进行某些动作时的处理方法
 
  
比如:
+
物品可能来自于MOD或第三方插件[见保护什么
阻止玩家挖掉金矿石。
 
当有人挖掘钻石块时通知在线管理员。
 
当玩家放置附魔台时,向放置者发送一条提示消息。
 
  
下面是一个黑名单的例子:
+
WG并不会保护你特别说明的一些东西。这不是简单的方块破坏或放置的情况。请确保你在使用最新版本的WG,如果还是有BUG,做BUG反馈。
  
除admins,mods组以外 禁止使用岩浆桶 并向使用者发送自定义提示消息<br />
+
这是你Bukkit, Spigot, 或 Cauldron 版本中的BUG
[lavabucket]<br />
 
ignore-groups=admins,mods<br />
 
on-use=deny,tell<br />
 
message=不可以使用岩浆桶呢喵!<br />
 
  
禁止挖掉铁矿和金矿并提示默认消息 同时通知在线管理员<br />
+
如果你还不能解决问题,查看问题解决页面
[goldore,ironore]<br />
 
ignore-groups=admins<br />
 
on-break=deny,tell,notify<br />
 
  
除admins组外禁止放置tnt 放置时会通知管理员并且踢出去 <br />
+
====为什么建筑控制不工作?玩家收到信息====
[tnt]<br />
+
如果WG锁定了一个事件,对于第三方插件来说也是可以解除锁定的,但是WG也发送了你不能XX的消息。
ignore-groups=admins<br />
 
on-place=deny,notify,kick<br />
 
  
黑名单配置文件
+
你可以使用testbreak和testplace指令来查看,如果在列表中发现ALLOW,就是那个插件造成的。
  
黑名单的配置文件保存在plugins\WorldGuard\worlds下面,每个世界都有单独的配置文件<br />
+
另一个原因是版本错误。如果还不能解决问题,查看问题帮助。
例子:
 
  
worlds/world/blacklist.txt 主世界<br />
+
===区域保护===
worlds/world_the_end/blacklist.txt 末地<br />
+
====为什么活塞不工作?====
worlds/mining_world/blacklist.txt 资源世界(如果服务器有多世界的话)<br />
+
你可能把权限设置成deny了。查看 常见情节 节
  
提示
+
====关于区域保护我怎么XXXX====
worldguard不支持多个世界共用同一个黑名单配置文件,但是你可以利用文件系统的“链接”实现。<br />
+
查看 常见情节 节
注意:编辑黑名单后需要用/wg reload重新加载才能生效<br />
 
  
格式:<br />
+
==获取帮助==
 +
如果你有一个问题的话
 +
[[http://forum.sk89q.com/ 在论坛询问]]
 +
[[http://wiki.sk89q.com/wiki/IRC 加入IRC]]
 +
[[http://twitter.com/sk89q 在Twitter上联系sk89q]]
  
[物品或方块列表]<br />
+
如果你要汇报BUG的话
事件=操作<br />
+
[[http://youtrack.sk89q.com/issues?q=project%3A+WorldGuard 在这里汇报]]
选项=值<br />
 
  
匹配规则:<br />
+
译者注:全部都要翻墙
  
物品/方块列表可以填写数字id或bukkit的材料名(可参考 https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html)<br />
+
==开源地址==
多个项目之间用半角逗号分隔<br />
+
你可以在[[https://github.com/sk89q/worldguard Github]]找到资源代码。
[wood,brick,glass]<br />
+
WG是开源的,但贡献者必须遵守GNU Lesser General Public License v3。
还可以指定数据值如白桦木:<br />
 
[17:1]<br />
 
白桦木和丛林木:<br />
 
[17:1;3]<br />
 
指定数据值范围<br />
 
[wood:2-3]<br />
 
[wood:>=2,<=3]<br />
 
这些写法是可以混合使用的<br />
 
[wood:0;>=2,grass:1-2]<br />
 
  
事件:
+
==链接==
{| class="wikitable"
+
*[[http://www.enginehub.org/worldguard 主页地址]]
 +
*[[http://dev.bukkit.org/bukkit-plugins/worldguard/files/ BukkitDev下载地址]]
 +
*[[http://wiki.sk89q.com/wiki/WorldGuard 旧版WIKI]]
 +
==地址==
 +
http://docs.enginehub.org/manual/worldguard/latest/regions/priorities/
 +
[[Category: 管理]] [[Category: 安全]] [[Category: 修正]] [[Category: 综合]]
 +
== '''<big>Setting</big>''' ==
 +
'''注意''':以下内容的设置仅供参考,你应该在<code>config.yml</code>文件中进行你喜欢的设置.
 +
*'''总体'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
! Event !! Explanation
+
|op-permissions
 +
|TRUE
 +
|拥有OP权限的玩家是否应该同时享有WorldGuard的所有权限,即使第三方Permission插件禁止这么做.
 
|-
 
|-
| on-break || 破坏方块
+
|summary-on-start
 +
|TRUE
 +
|在服务器启动时,WorldGuard会将每个世界的配置汇报给后台.虽然这样子有点吵,但是对管理很有帮助.
 
|-
 
|-
| on-destroy-with || 用此物品打破方块
+
|auto-invincible
 +
|FALSE
 +
|让玩家无敌.并将<code>worldguard.auto-invincible</code>权限自动添加给玩家.
 
|-
 
|-
| on-place || 放置方块
+
|auto-invincible-group
 +
|FALSE
 +
|给每一个权限组添加<code>wg-invincible</code>权限,让其中的玩家无敌.
 
|-
 
|-
| on-use || 使用
+
|auto-no-drowning-group
 +
|FALSE
 +
|让玩家不会溺死.并将<code>wg-amphibious</code>权限自动添加给玩家.
 
|-
 
|-
| on-interact || 交互,如右键门、拉杆、箱子等
+
|use-player-move-event
 +
|TRUE
 +
|是否让WorldGuard记录玩家行为,包括吃、动、恢复生命等等,这将会占用一部分CPU.
 
|-
 
|-
| on-drop || 丢弃特定物品
+
|use-player-teleports
 +
|TRUE
 +
|传送事件是否考虑传送轨迹.传送事件并非指玩家自主TPA,而是指某些任意传送行为.
 
|-
 
|-
| on-acquire || 获得物品
+
|host-keys
 +
|
 +
|是玩家连接的一系列主机名称.
 +
|}
 +
 
 +
*'''安全(security.*)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
| on-dispense || 针对发射器,发射特定物品
+
|deop-everyone-on-join
 +
|False
 +
|在玩家进入服务器时,洗掉TA的OP权限
 
|-
 
|-
 +
|block-in-game-op-command
 +
|FALSE
 +
|令<code>/op</code>命令只能在后台使用,游戏中不可用.
 
|}
 
|}
  
操作:
+
*'''建造(build-permission-nodes.*)'''
{| class="wikitable"
+
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
! Action !! Explanation
+
|enable
 +
|FALSE
 +
|若设置为TRUE,你需要给予玩家特定BuildPermissions玩家才可以建造.
 
|-
 
|-
| deny || 阻止操作 (黑名单模式)
+
|deny-message
 +
|
 +
|设置提示玩家被授予了什么BuildPermissions,如果其值为空,则应用默认提示消息.
 +
|}
 +
 
 +
*'''事件(event-handling.)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
| allow || 允许操作(仅白名单模式)
+
|block-entity-spawns-with-untraceable-cause
 +
|FALSE
 +
|Bukkit服务端并不总是相插件提供所有的实体生成信息,导致一些玩家可以跳过Bukkit设置生成实体(例如使用怪物蛋),<br />
 +
这个设置就是为了弥补这种不足,让生成实体的真正执行者被记录.不过,现在这个选项建议设置为FALSE,因为会导致一些BUG出现.
 
|-
 
|-
| notify || 发送通知消息给有worldguard.notify权限的人
+
|interaction-whitelist
 +
|[]
 +
|设置哪些物品不受WorldGuard保护.例如,在列表下填写chest,则region下的箱子将不会受到保护.<br />
 +
这个设置在你使用一些插件或MOD时,有一些物品希望被玩家使用或破坏时,很有用.
 
|-
 
|-
| log || 记录日志到终端、日志文件、数据库。
+
|emit-block-use-at-feet
 +
|[]
 +
|当玩家使用列表下的方块时,同时要求玩家脚下站着一块同样的方块.这个设置在你使用一些插件或MOD时很有用.<br />
 +
但是这个解决方案还不算完美,因为玩家可以通过某些方块,将自己发射至目标区域.
 +
|}
 +
例子:例如我要把工作台添加到'''interaction-whitelist'''列表中,我需要:<br />
 +
<code>interaction-whitelist: [workbench]</code>
 +
 
 +
*'''保护(protection.*)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
| tell || 给玩家一个提示消息
+
|item-durability
 +
|TRUE
 +
|如果设置为False,那么物品永远都不会消失.(会永远待在玩家背包中并且耐久不会被消耗)
 
|-
 
|-
| kick || 踢出玩家
+
|remove-infinite-stacks
 +
|FALSE
 +
|针对堆叠数为负数的作弊行为准备.设置为TRUE,将自动移除“无限”物品(即堆叠数为负数的物品)
 
|-
 
|-
| ban || 将玩家ban掉(永久性)
+
|disable-xp-orb-drops
 +
|FALSE
 +
|开启/关闭经验球(掉落、效果都关闭)
 
|-
 
|-
 +
|disable-obsidian-generators
 +
|FALSE
 +
|开启/关闭黑曜石生成(岩浆和水生成)
 
|}
 
|}
  
选项:
+
*'''游戏(gameplay.*)'''
{| class="wikitable"
+
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
! Option !! Explanation
+
|block-potions
 +
|[]
 +
|一系列药水不能被使用,药水类型点击:[https://jd.bukkit.org/rb/apidocs/org/bukkit/potion/PotionEffectType.html BukkitType]
 
|-
 
|-
| ignore-groups || 忽略特定权限组,多个组用半角逗号分隔
+
|block-potions-overly-reliably
 +
|FALSE
 +
|让WorldGuard更加严格地限制药水,甚至会限制同种类型的所有药水.
 +
|}
 +
例子:限制夜视和加速药水:
 +
<code>block-potions: [night_vision, speed]</code>
 +
 
 +
*'''海绵模拟(simulation.sponge.*)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 
|-
 
|-
| ignore-perms || 忽略有特定权限的玩家,多个权限同样是用逗号分隔
+
|enable
 +
|FALSE
 +
|让海绵能够在生存模式下合成并产生效果.自从MineCraft1.8之后,海绵就几乎不存在了,这个功能能够让海绵重换新生.
 
|-
 
|-
| comment || 自定义通知消息
+
|radius
 +
|3
 +
|效果半径
 
|-
 
|-
| message || 自定义tell的消息,可用%s表示相应物品名
+
|restone
 +
|FALSE
 +
|让海绵效果应用于红石电路中.
 
|}
 
|}
  
另外一个列子
+
*'''默认(default.*)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 +
|-
 +
|pumpkin-scuba
 +
|FALSE
 +
|是否让头戴南瓜的玩家同时拥有水下呼吸的特效.
 +
|-
 +
|disable-health-regain
 +
|FALSE
 +
|是否关闭自动回血区域
 +
|}
  
放置和打破信标时通知在线管理员<br />
+
*'''物理(physics.*)'''
[beacon]<br />
+
{| border="1" cellpadding="20" cellspacing="0"
on-break=notify<br />
+
!语句
on-place=notify<br />
+
!值
阻止用钻石镐和金铲子破坏方块<br />
+
!描述
[diamond_pickaxe,284]<br />
+
|-
on-destroy-with=tell,deny<br />
+
|no-physics-gravel
阻止使用铁锄、钻石剑耕地和攻击<br />
+
|FALSE
[iron_hoe,276]<br />
+
|是否开启树叶无重力效果(TRUE:树叶不会掉落)
on-use=tell,deny<br />
+
|-
阻止与箱子、石头按钮交互<br />
+
|no-physics-sand
[chest,stone_button]<br />
+
|FALSE
on-interact=deny,tell<br />
+
|是否开启沙子无重力效果(TRUE:沙子不会掉落)
阻止丢出命令方块<br />
+
|-
[commandblock]<br />
+
|vine-like-rope-ladders
on-drop=deny,tell<br />
+
|FALSE
message=不要乱丢命令方块~<br />
+
|是否让梯子做到藤蔓的特效(TRUE:梯子会自己生长)
除admins组外 阻止获得基岩<br />
+
|-
[bedrock]<br />
+
|allow-portal-anywhere
on-acquire=deny<br />
+
|FALSE
ignore-groups=admins<br />
+
|是否允许在有效区域内随意打开传送门
阻止发射器发射岩浆桶和漏斗矿车<br />
+
|-
[lavabucket,hopper_minecart]<br />
+
|disable-water-damage-blocks
on-dispense=deny,log,notify<br />
+
|[]
[tnt]<br />
+
|列表下的方块不会受到水的破坏,
on-break=deny,notify,kick<br />
+
|}
on-use=deny,notify,kick<br />
+
例子:保护红石电线和红石火把不受水的破坏:
on-place=deny,ban<br />
+
<code>disable-water-damage-blocks: [redstone_wire, redstone_torch</code>
on-acquire=deny<br />
 
  
日志
+
*'''点火(ignition.*)'''
日志有三种选择
+
{| border="1" cellpadding="20" cellspacing="0"
* 输出到终端(就是服务器后台)
+
!语句
* 记录日志到文件
+
!值
* 记录到数据库
+
!描述
 +
|-
 +
|block-tnt
 +
|FALSE
 +
|禁止TNT破坏方块
 +
|-
 +
|block-tnt-block-damage
 +
|FALSE
 +
|禁止TNT对玩家的伤害
 +
|-
 +
|block-lighter
 +
|FALSE
 +
|禁止点火工具点火(打火石、烈焰球)
 +
|}
  
在worldguard配置文件(plugins\WorldGuard\config.yml)中可以对日志文件和数据库进行具体设置。
+
*'''火(fire.*)'''
 +
{| border="1" cellpadding="20" cellspacing="0"
 +
!语句
 +
!值
 +
!描述
 +
|-
 +
|disable-lava-fire-spread
 +
|TRUE
 +
|让岩浆不能点燃附近方块
 +
|-
 +
|disable-all-fire-spread
 +
|TRUE
 +
|禁止所有火焰的传播
 +
|-
 +
|disable-fire-spread-blocks
 +
|[]
 +
|列表中的方块无法让火焰传播,火焰也无法破坏它们.
 +
|-
 +
|lava-spread-blocks
 +
|[]
 +
|岩浆只允许在列表下的方块上流动(自动包括空气)
 +
|}
  
blacklist:<br />
+
*生物(mobs.*)
    use-as-whitelist: false<br />
+
{| border="1" cellpadding="20" cellspacing="0"
    logging:<br />
+
!语句
        console:<br />
+
!值
            enable: true<br />
+
!描述
        database:<br />
+
|-
            enable: false<br />
+
|block-creeper-explosions
            dsn: jdbc:mysql://localhost:3306/minecraft<br />
+
|FALSE
            user: root<br />
+
|关闭苦力怕爆炸效果(TRUE为关闭,FALSE为开启,下同)
            pass: ''<br />
+
|-
            table: blacklist_events<br />
+
|block-creeper-block-damage
        file:<br />
+
|FALSE
            enable: false<br />
+
|关闭苦力怕破坏方块的效果
            path: worldguard/logs/%Y-%m-%d.log<br />
+
|-
            open-files: 10<br />
+
|block-wither-explosions
 
+
|FALSE
日志文件的路径中可使用以下“变量”:<br />
+
|关闭凋零爆炸效果
%Y 年 (YYYY)<br />
+
|-
%m 月 (MM)<br />
+
|block-wither-block-damage
%d 日 (DD)<br />
+
|FALSE
%W 周 (00-52)<br />
+
|关闭凋零破坏方块的效果
%H 小时(24小时) (HH)<br />
+
|-
%h 小时(12小时) (HH)<br />
+
|block-wither-skull-explosions
%i 分 (mm)<br />
+
|FALSE
%s 秒 (ss)<br />
+
|关闭凋零骷髅爆炸效果
%u 用户名<br />
+
|-
%% 表示“%”符号<br />
+
|block-wither-skull-block-damage
 
+
|FALSE
数据库<br />
+
|关闭凋零骷髅破坏方块的效果
worldguard可以将日志记录进mysql数据库,但需要先创建数据库和表,你可以使用下面的语句创建专用的表<br />
+
|-
 
+
|block-enderdragon-block-damage
CREATE TABLE IF NOT EXISTS `blacklist_events` (<br />
+
|FALSE
`id` int(11) NOT NULL AUTO_INCREMENT,<br />
+
|关闭末影龙破坏方块的效果.
`world` varchar(10) NOT NULL,<br />
+
|-
`event` varchar(25) NOT NULL,<br />
+
|block-enderdragon-portal-creation
`player` varchar(16) NOT NULL,<br />
+
|FALSE
`x` int(11) NOT NULL,<br />
+
|关闭末影龙传送门的创建.
`y` int(11) NOT NULL,<br />
+
|-
`z` int(11) NOT NULL,<br />
+
|block-fireball-explosions
`item` int(11) NOT NULL,<br />
+
|FALSE
`time` int(11) NOT NULL,<br />
+
|关闭火球爆炸效果
`comment` varchar(255) DEFAULT NULL,<br />
+
|-
PRIMARY KEY (`id`)<br />
+
|block-fireball-block-damage
);<br />
+
|FALSE
 
+
|关闭火球破坏方块的效果
最后说一下,使用时发现,日志文件功能在某些平台下可能无法正常工作,同时会导致黑名单失效,开启此功能时请务必进行测试。
+
|-
发射器的部分可能会和其他插件的发射器黑名单冲突导致报错。
+
|anti-wolf-dumbness
 
+
|TRUE
 
+
|让狼(狗)智能化.MoJang在设置狼时并没有让它们拥有IQ,所以总会出现走丢,掉进岩浆,卡区域的情况(TRUE为开启,下同)
=箱子保护=
+
|-
WorldGuard提供基础的箱子保护服务,
+
|allow-tamed-spawns
玩家可以通过在箱子下方放置特殊字符的牌子来达到保护的目的。
+
|TRUE
我们不建议新设置的WorldGuard使用本功能因为本功能并不是WorldGuard常用的一部分
+
|开启驯养动物生成(例如狼、马、猫等)
除此以外,区域设置是比本功能更好的保护拥有者财产的方法。
+
|-
因为它不涉及像漏斗一类方块的问题。
+
|disable-enderman-griefing
 
+
|FALSE
提示:如果你是希望保护单块的方块,箱子等,
+
|关闭末影人拾取方块(TRUE为关闭,下同)
我们建议使用第三方保护插件。
+
|-
例如Lockette 或者 LWC.  
+
|disable-snowman-trails
 
+
|TRUE
启用此功能:
+
|关闭雪人生成雪迹
首先箱子保护功能必须在配置文件中启用。
+
|-
如果没有手动启用,箱子保护功能不会自动工作
+
|block-painting-destroy
这时不能使用牌子锁功能。(此项功能也可在配置文件中禁用)
+
|TRUE
 
+
|关闭生物破坏画的效果
使用方法:
+
|-
# 必须是一个信息牌
+
|block-item-frame-destroy
# 必须位于箱子下面(如果是大箱子,只需在其一侧下面)
+
|TRUE
# 在第一行输入[Lock]
+
|关闭生物破坏展示框的效果.
# 在第二行输入玩家的名字
+
|-
# 在剩余两行写上其他允许使用玩家的名字
+
|block-plugin-spawning
注:不可将其他玩家名字放在第二行的位置
+
|FALSE
提示:WorldGuard功能并不支持UUID功能
+
|关闭其它插件对生物生成的限制,这主要是为了保护WorldGuard领域.
警告:由于Minecraft1.8版本的改变
+
|-
从旧版本升级将会破坏掉所有的保护牌子
+
|block-above-ground-slimes
实际上它将破坏全部写有[]的牌子
+
|FALSE
 
+
|关闭史莱姆区块生成.
=主机密码(登录密码)=
+
|-
在过去由于Minecraft的登录代码问题,玩家可以登录到服务器的任何玩家包括拥有者和管理者的账号上,
+
|block-other-explosions
在2010-2013年间,有五次利用该性质的漏洞经常导致成千上万的服务器被黑客攻击。
+
|FALSE
 
+
|关闭其它类型的爆炸.
这项登录密码功能作为一个额外的登录屏障被添加到WorldGuard中。
+
|-
其工作原理是作为一项额外的屏障来达到此功能,与Mojang的登录无关。
+
|block-zombie-door-destruction
在登录时必须发送指定信息 (通俗的说就是输入你的密码)才能登录服务器。
+
|TRUE
即使攻击者有能力破坏Minecraft的登录系统来成为一个管理员。
+
|关闭僵尸破坏门
但因在服务器缺少发送指定的信息,经服务器检测后无法活动。
+
|-
注:这种登录验证方式的漏洞是很不明显的,很少见的。
+
|block-creature-spawn
 
+
|[]
启用功能:
+
|列表下的生物将不会生成
当一个玩家通过某一个地址连接服务器时,输入play.example.com
+
|}
Minecraft将会告诉服务器该玩家通过这个地址登录
 
管理者可以通过一个特殊的秘密语句来登录,
 
比如secretmod.play.example.com这个地址
 
服务器将会检测到该管理者登录使用的这个地址。
 
也就是一个类似密码的机制,不过密码是地址格式。
 
 
 
主机密码允许特定玩家使用特定地址登录,
 
如果地址错误,他将立即被踢下线
 
 
 
配置:
 
 
 
host-keys:
 
    your_username: bagels.play.example.com
 
    moderator1_name: manoverboard.play.example.com
 
提示:主机密码功能暂不支持UUID功能
 
 
 
DNS配置:
 
为了使此功能工作,你需要bagels.play.example.com 和 manoverboard.play.example.com 指向你的服务
 
然而不要在您使用的域名中添加域名的记录,因为很容易使得攻击者找出管理员域名从而登录。
 
 
 
 
 
相比之下,我们建议您安装通用地址-“wildcard addresses.”。例如设置了play.example.com,
 
这将意味着任何相同前缀会允许登录。(例如aa.play.example.com,ab.play.example.com,ac.play.example.com,等)。
 
提示:如果你没有一个域名或不能设置通配符地址,你可以使用xip.io。
 
 
 
=更多帮助=
 
 
 
你需要更多的帮助吗?我建议你<br />
 
 
 
你可以去[http://skq.me/irc/irc.esper.net/sk-dev/ IRC]提问<br />
 
注*IRC聊天频道是维基百科24小时开放的“聊天室”<br />
 
 
 
你可以在Twitter上联系[https://twitter.com/sk89q sk89q] <br />
 
sk89q是Worldguard的作者(也是Worldedit以及其他不少插件的作者)<br />
 
 
 
你可以查看[https://github.com/sk89q/worldguard/commits Changelog](全英文,英文不好的直接跳过吧)<br />
 
Changelog就是更新信息(每次更新修改/增加/删除等等了什么)<br />
 
  
你如果有什么建议,或者发现了什么Bug可以到[http://youtrack.sk89q.com/issues?q=project%3A+WorldGuard 这里]反馈  (全英文,英文不好的直接跳过吧)<br />
+
[[Category:安全]][[Category:管理]][[Category:修正]][[Category:综合]][[Category:创世]]

2021年5月24日 (一) 22:24的最新版本

WorldGuard
WorldGuard Icon.png
外文名WorldGuard
插件类型Spigot / CraftBukkit
最新版本6.1.2
兼容服务端1.10
前置插件WorldEdit
源地址https://dev.bukkit.org/bukkit-plugins/worldguard/

WorldGuard是一款对服务器管理员,地图制作者,生存服务器等提供许多功能的一个插件。

  • 在你创造区域后,只会允许有权限的玩家和一些插件去改变区域。
  • 你可以在你的区域里设置一些标记,如(取消 凋零伤害 掉落伤害 等)
  • 同时在特殊的世界的区域中你也可以改变一些标记,如(饱食度回复 生命值回复 PVP的开关 TNT 怪物伤害)
  • 黑名单包括了玩家不能使用的物品和方块
  • 可以记录服务器的统计和信息 (/wg report -p)
  • 可以管理服务器的CPU(/wg profile -p)
  • 增加例如停止所有火焰传播的指令 “STOP ALL FIRE SPREAD” .
  • 可以与其他的Bukkit插件进行交♂易
  • 保护与防止许多事件 (树长大 TNT爆炸 药水机器 等)
  • 某些触发事件也可以修改 (门 拉杆 等)
  • 开源,是Minecraft的最老的插件之一(比Bukkit还老)
  • 启用你想要的特性!默认所有都是关闭的。你可以先安装WG,然后再配置它。

安装

WG需要一个能支持Bukkit API的Minecraft服务端及版本,如 CraftBukkit, MCPC+, Cauldron, 和 Spigot. 不支持官方的Minecraft服务器。

另一个需求是[WorldEdit]插件,一个非常轻量的地图编辑器,同样也是我们的作品,注意你不能使用Forge版本的WE,请使用插件版本。

由于[一个争论和随从法律的崩溃],你不能再下载官方Bukkit服务器了。供MC1.8+ 用户选择的服务端是 Spigot 。

如何安装

WG可以从[BukkitDev]下载。

如果你下载下来的文件是 .zip的话,解压它,你会找到一个WorldGurad.jar。否则,你会直接下载下来一个.jar文件

在你的服务器根目录下,如果没有plugins文件夹,创建之。

把jar文件放入plugins中

开启你的服务器,检查服务器日志,如果有错误,检查帮助页面。

配置

许多WG的特性都与配置相关(如药水,水中呼吸等模式)。每个配置选项都在这页列出了。

在你第一次运行WG的时候,主配置在plugins/WorldGuard/

  • config.yml

每个世界都有特殊的配置文件

  • worlds/world/config.yml
  • worlds/world_nether/config.yml
  • worlds/mining_world/config.yml

如果你打开了每个世界的配置文件,他们会是空的,如果你想要配置的话,你需要从主配置复制

示例:如何自定义世界配置
在主世界配置中,你可能把 block-creeper-block-damage 设置为true
mobs:
    block-creeper-explosions: false
    block-creeper-block-damage: true
    block-wither-explosions: false
但你想在地狱世界把其设置为false
打开worlds/world_nether/config.yml
然后添加文本
mobs:
    block-creeper-block-damage: false
这一行会覆盖继承的true,表现为false

设置

这些是作为参考的顺序,并不是真正的顺序,你要现在config.yml找到它们 WG-config.png

权限

WG-PERM.png

建筑权限

worldguard.build.block.place.<material>

worldguard.build.block.remove.<material>

worldguard.build.block.interact.<material>

worldguard.build.entity.place.<type>

worldguard.build.entity.remove.<type>

worldguard.build.entity.interact.<type>

worldguard.build.entity.damage.<type>

worldguard.build.item.use.<material>

命令

WG-Command-1.jpg WG-Command-2.jpg

黑名单

黑名单可以禁止玩家做一些事,这是一些情况:

禁止玩家挖金矿

当找到钻石时通知所有管理员

当放置附魔台时告诉玩家一些事

这是一个示例配置:

# Deny lava buckets
[lavabucket]
ignore-groups=admins,mods
on-use=deny,tell
message=Sorry, you can't use lava buckets!

# Deny some ore
[goldore,ironore]
ignore-groups=admins
on-break=deny,tell,notify

# No TNT!
[tnt]
ignore-groups=admins
on-place=deny,notify,kick

每个世界都会有配置文件

[*]worlds/world/blacklist.txt

[*]worlds/world_nether/blacklist.txt

[*]worlds/mining_world/blacklist.txt

这是格式

[a list of items/blocks to match]
event to watch=what to do
event to watch=what to do
event to watch=what to do
option=value
  1. 是注释行

可以使用ID和名字: [wood,brick,glass]

可以增加数据值: [wood:0]

多个数据值用;隔开 Multiple data values can be matched by separating each one with a semicolon (;): [wood:0;2;3]

也可以用范围: [wood:2-3]

可以用大于等于 小于等于 [wood:>=2,<=3]

你也可以这样: [wood:0;>=2,grass:1-2]

事件

on-break	
on-destroy-with	
on-place	
on-use	
on-interact	
on-drop	
on-acquire	
on-dispense	

行动

deny	
allow	
notify	
log	
tell	
kick	
ban	

选项

ignore-groups	
ignore-perms	
comment	
message	

示例

[lavabucket,waterbucket,bucket]
on-use=deny,tell

[tnt]
ignore-groups=admins
on-place=deny,notify,kick

[obsidian]
ignore-groups=admins,obsidian
on-place=deny,tell
on-break=deny,tell

记录的参数: Console File Database

CONSOLE: 控制台

FILE 文件

%Y the year (YYYY)

%m the month (MM)

%d the day (DD)

%W the week of the year (00-52)

%H 24-hour time (HH)

%h 12-hour time (HH)

%i the minute (mm)

%s the second (ss)

%u the user’s name

%% translates to a single percent sign “%”

可用变量

数据库

示例

CREATE TABLE IF NOT EXISTS `blacklist_events` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `world` varchar(10) NOT NULL,
 `event` varchar(25) NOT NULL,
 `player` varchar(16) NOT NULL,
 `x` int(11) NOT NULL,
 `y` int(11) NOT NULL,
 `z` int(11) NOT NULL,
 `item` int(11) NOT NULL,
 `time` int(11) NOT NULL,
 `comment` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
);

区域

快速开始

选择区域

要创建一个区域,你要告诉WG你的区域范围。WE用于选范围。

区域可以是以下形状:

立方体

多边形

不支持圆!

基础指令

创建区域

使用这个指令创建区域 /region define:

/region define town

/rg和/region是相同的

/rg define town

新的区域默认为禁止玩家破坏方块,为使玩家可以建筑,为区域增加主人和成员,你可以为每个成员增加单独的权限。

所有玩家都可以成为主人或成员,下面是指令:

/rg addmember town Notch sk89q g:builders
/rg addowner town sk89q
/rg removemember town g:builders
/rg removeowner town sk89q

更多请去区域命令页。

你在创建区域的同时也可以很简单的去增加成员:

/rg define town Notch sk89q g:builders

区域会自动保存,不需要保存指令。

示例:创建一个只有builders可以建筑的区域spawn

选择spawn的范围

创建一个叫做spawn的区域: /rg define spawn

增加建筑团队为成员: /rg addmember spawn g:builders

提示:区域会在一定间隔后自动保存,如果你想强制保存,使用/rg save

你可以这样删除区域: /rg remove town

列出区域消息 /rg info town

列出所有区域 /rg list

这样重新选择区域 /rg redefine town

更多请看区域命令

区域的配置

区域的重叠

区域可以互相重叠。

如果重叠的话,玩家必须拥有这些重叠区域的所有建筑权限才能在重叠区域建筑。

如果你想要一个区域覆盖另一个,使用继承。

如果你想要一个区域可以建筑,使用build权限。

如果区域不支持保护这个区域,使用 passthrough 权限。

示例:创建一个重叠于spawn的免费挖矿区域

选择出区域范围

创建区域: /rg define mine

允许破坏: /rg flag mine build allow

权限: 每个区域都有他们的权限,如PVP可以用pvp权限。

/rg flag town pvp deny

阅读区域权限来获取更多信息。

示例:做一个不能破坏方块[建筑者可以] 允许PVP的区域

选择区域范围

创建区域 /rg define arena

允许PVP /rg flag arena pvp allow

因为建筑师们不是区域的一员,所以他们不能建筑,甚至当他们是区域成员时也不行。

但你创建区域的原因是使用PVP权限,所以你可以使用 权限来允许。 /rg flag arena passthrough allow

常见情节 见常见情节页。

区域魔杖

区域魔杖列出当前位置的所有区域。它是一个MC物品,右键来检测。

默认的,这个物品是皮革,但可以在配置中更改。

要使用这个魔杖,需要 worldguard.region.wand 权限

区域标志

WG-FLAG.png

优先级与继承

在快速开始中提到,区域可以覆盖。如果要在覆盖的区域内建筑,需要有所有区域的权限。

但有了优先级不同。

优先级

每个区域默认的优先级是0,但它可以更改,大的数字意味着高的优先级。-2147483648 到 2147483647 都可以作为优先级的数字,但你也可以使用 -2, 10, 15, 100.

覆盖的区域中考虑优先级最高的那一个。

在区域中,使用优先级最高的那一个的权限。

使用优先级最高的标志。

这样改变优先级: /rg setpriority example 5


示例:创建一个pub区域,使pub组可以建筑。spawn中builders组已经可以建筑。

选择区域

创建区域: /rg define pub

设置优先级: /rg setpriority pub 10


在PVP区域中创建一个治疗区域。

选择区域

创建区域 /rg define heal

禁止PVP /rg flag heal pvp deny

优先级 /rg setpriority heal 10


继承

在上面说过,创建pub区域你是否想让pub组和builder组都可以建筑?

你可以把builder组加到成员里,但你也可以使用继承。


子区域继承父区域的成员、主人,没有设置的权限

这是为了方便:

大区域中的小区域

创建一个模板

每个区域至多有一个父区域。

使用这个指令: /rg setparent:

/rg setparent 子区域 父区域

移除父区域: /rg setparent 子区域


WG会自动检测继承。

例子:创建一个mall

/rg setparent plot1 mall

/rg setparent plot2 mall

/rg addowner mall g:mall_owners

/rg addowner plot1 sk89q


区域模板

之前提到,因为继承,所以父区域可以作为子区域的模板。

但你可能想要模板不是真正的区域,你不想保护这个区域,做到这个的方法之一是全局区域,使用-g来创建: /rg define -g plot_template


例子:

/rg define -g plot_template

/rg setparent plot1 plot_template

/rg setparent plot2 plot_template

/rg setparent plot_template mall

/rg flag mall chest-access allow

/rg flag plot_template chest-access deny


高优先级的父区域会覆盖子区域。

区域组和覆盖区域

你可能知道,标志可以只对于一些特殊的组有用。

/rg flag mall pvp -g nonmembers deny

当只有一个区域的时候,知道谁是成员谁是主人很清楚。但在覆盖区域中不这样:玩家只是其中一个区域的成员呢?

答案是否定的,玩家必须在标志设置的区域为成员。例如,让我们想象有两个组——

Spawn, 标志 pvp -g nonmembers deny ,没有成员 Market, 成员 “sk89q” sk89q不能PVP因为他不是spawn的一员。

当子区域继承父区域,成员和标志以及主人都会被继承,对于这个是不通用的。

例子:

Market, 标志 pvp -g nonmembers deny 无成员 Shop1, 成员 “sk89q,” 继承Market sk89q是成员吗?是,所以 sk89q 可以PVP

先前提到,父区域的优先级不能比子区域高,否则会覆盖子区域。

全局区域

全局区域是一个特殊的区域:

包括整个世界

有最低的优先级

有一些特殊功能

每个世界都有它的全局区域。但是除了你尝试配置它,全局区域不会创建。

例如,这样会自动创建全局区域。

/rg flag __global__ pvp deny


把全局区域当做一个一直在那儿的区域,在全局区域中的标志在该世界的区域中工作。


但,像普通区域一样,passthrough 区域标志必须设置为allow。把 passthrough 设置为 allow 会让区域成为一个没有保护的区域,所以只要没有区域防止破坏,玩家就可以建筑。

如果你把passthrough标志设置成了deny,会让区域像一个真正的区域一样,玩家必须是主人或成员才能建筑。因为全局区域包括整个世界,所以默认会禁止破坏。

因为全局区域的极低优先级,其他区域会直接覆盖全局区域的标志。

注意 passthrough标志与移动无关,它是建筑权限的缩写。


例子:没有区域的地方无法建筑


/rg flag __global__ passthrough deny

增加主人和成员会把passthrough打开。

建筑标志

建筑标志不能设置成allow,原因是会自动让区域的建筑标志都不工作。把标志设置为deny使它像其他区域一样,但也意味着不能破坏和放置方块。因为全局区域包含整个世界,所以整个世界都不能建筑。

警告: 不建议设置全局区域的build标志。如果你想保护世界,使用 passthrough 标志。如果你设置了全局区域的build标志,其他区域不会覆盖这个标志。

所以,如果你把全局区域的build设置为了deny,无论他们是区域的主人或成员,都不能建筑了。

默认覆盖

WE的标志有一些不同。如 exp-drop 标志如果没有区域设置的话,甚至是成员和主人都不能掉落经验。

如果你想要用把它设置为deny的方式覆盖 exp-drops 标志,使它可以运行,在全局区域上就不会工作。

如你尝试使用 /rg flag __global__ exp-drop -g nonmembers deny但这不会工作。当你指定不是成员时,会指定不是全局区域的成员。所以,如果你制作一个地皮区域,经验不会生成,因为地皮区域的成员不是全局区域的成员。

记住,即使全局区域的优先级是最低的,但区域不会继承,标志不会传播。

这样的话,推荐你创建一个模板区域。见优先级与继承。

区域认领

WG中可以使用区域认领系统。它像 /rg define 一样,但玩家必须有特殊的权限。

这里同时也需要WE来选择区域,所以你需要 worldedit.selection 权限。

玩家可以这样认领选中的区域: /rg claim region_name

当玩家输入指令后,会自动变成区域主人。这需要worldguard.region.claim权限。

规则:

最大的区域数量: 除非有 worldguard.region.unlimited 权限,玩家的区域数不能超过这个数量。

最大区域提及: 除非有 worldguard.region.unlimited 权限,不然体积不能超过配置。

预防覆盖:区域不能使用同名。

预防重叠:区域不能重叠于其他区域。

只能重叠自己的区域: 如果regions.claim-only-inside-existing-regions启用,只能重叠于自己的区域。

这时不支持多边形区域。

你也可以给予玩家其他指令的权限。

存储

区域数据可以这样存储:

YAML 不需要数据库 简单的更改,简单备份,快速读取

MYSQL 使用数据库 保存只更改一部分

注意:其他数据库,如PostgreSQL, SQL Server, SQLite不支持

切换存储:默认是YAML

在配置中 regions.sql.use 可以切换为MYSQL 这会禁用 YAML. 如果你切换至 MySQL, 数据表会自动生成, 当然要为 SQL 用户提供相应权限

警告 强烈建议在你更换数据库之前做备份。

如果你只是简单的切换数据库,你之前所有数据都会丢失。你可以使用你哥简单的指令来切换,你在切换之前和之后都可以使用。

To migrate data, use: /rg migratedb 之前 之后,如要把YAML换成MYSQL 使用 /rg migratedb yaml mysql

请确保目标数据库是空的。

在你更改的时候不要忘记备份。

YAML 在region.yml中,每个世界下都有。 可以使用/rg load来读取。

这是个示例:

regions:
    test:
        min: {x: 1730.0, y: 0.0, z: -169.0}
        max: {x: 1742.0, y: 255.0, z: -158.0}
        members:
            players: [bobby]
            unique-ids: [0ea8eca3-dbf6-47cc-9d1a-c64551ca975c]
        flags: {use: allow, greeting: Welcome!, pvp: allow, pvp-group: MEMBERS}
        owners:
            groups: [admins]
        type: cuboid
        priority: 4
    __global__:
        members: {}
        flags: {}
        owners: {}
        type: global
        priority: 0

UUID经常使用

MySQL 只有一个服务器可以使用MYSQL 前缀可以更改 如果有错误发生会回档 默认WG只会记录更改 这个是讲解

Table	Purpose
region	Region data, with shape, priority, and parent information.
region_cuboid	Data for cuboid regions, with bounds.
region_poly2d	Data for polygonal regions, with minimumum and maximum Y values.
region_poly2d_point	Individual rows for points of polygonal regions.
region_flag	Per-region flag data.
region_players	List of players on regions.
region_groups	List of groups on regions.
world	Normalizes worlds into a world ID.
user	Normalizes users into a user ID.
group	Normalizes groups into a group ID.
Each user row will either have a UUID or name set.

不推荐在运行的服务器上修改MYSQL。经常会导致出错。

保护功能的使用

保护是综合性的:

可以保护方块的破坏和放置,物品栏的打开,外部TNT的爆炸,外部重力方块的掉落,外部植物的生长,牌子的切换,作物的踩踏,画和展示框,红石触发机关,动物,喷溅药水和弹射物。

其实,WG也支持一些MOD物品的保护。

水和岩浆的流动在配置中默认禁止,可以打开。

如果你找到了破坏的方式,请汇报BUG。

例外 一些标志会自动为不是成员的人关闭

如物品掉落和物品拾取。

经验值也不允许掉落。

这些可以通过区域标志来移除。

但是漏斗不行。漏斗会自动吸取区域下部箱子的物品,所以不要把区域箱子放在下部。这不能被更改。

其实例外可以对每个区域都增加,也可以用触发白名单在全局区域开启。

例子:在保护的区域中允许任何人使用红石机关:

/rg flag __global__ use allow

例子:在spawn区域为所有不是成员的玩家锁定物品丢弃和拾取:

/rg flag spawn item-pickup -g nonmembers deny

/rg flag spawn item-drop -g nonmembers deny

例子:为所有地皮的不是成员的玩家锁定经验掉落


/rg flag mall_parent exp-drops -g nonmembers deny


这是错的 /rg flag __global__ exp-drops -g nonmembers deny

这因为区域没有继承全局区域。

方块和实体

一个WG保护区域的重要特性是控制方块和实体,玩家可以成为一个区域的成员,但WG把方块和实体也这样看待,它们也可以成员区域的成员之一。

但是方块和实体不能像玩家一样通过命令加入区域。一个外部的活塞的方块不能进入区域,这就是原因。这是因为那个方块像non-member组,同样的,一些东西也不能改变方块。在区域中的活塞可以推动方块的原因是它像区域的一个成员。

WG同时也尝试检测事件真正的触发器。如一个砂砾在一个被保护区域上空被放置,它会调入被保护区域。WG认为最后生成的方块是由于掉落的砂砾,掉落的砂砾是由于高出的方块砂砾,因为它在区域外,不是区域内的“成员”,所以就会被保护。

当build标志在区域中设置为了deny没有人可以建筑,活塞也不会工作,因为人们不可以建筑,活塞像成员一般,也不会工作。

其他MOD和插件的支持:

一些MOD增加了新的游戏物品,如方块,道具,实体,MOD们需要API。

通常的,BUkkit插件一般会遵循保护插件,但事实不总是这样。有些MOD的支持几乎少的可怜,这些MOD不会遵循其他MOD和插件的保护。

最优保护

要注意的东西

可以改变其他方块和实体的方块和实体

发射弹射物的东西

WG可以在更多方块和实体上去保护。保护会预防左键右键方块和实体。这通常是足够的,因为这是与大多数方块和实体进行交互的唯一方法。

但WG不能保护在客户端上打开GUI的方块和实体,因为他们发送和接收的东西与WG无关。

其实,WG本身有的行动也不能控制,如一些自定义方块和实体。因为MC本身的一些方块也会影响世界,如活塞,但Bukkit组或你正在使用的服务端的维护者注意到这改变了世界,所以WG可以保护它们。

但是MOD的方块和实体不同,所以WG有时不能保护这些。

一些MOD会为了某些效果而虚拟一个玩家。这些玩家的名字基本上都是以MOD名来命名。但是这个消息除了对于识别是哪个MOD造成的,也可以使WG来预防一些行为。

要让MOD在保护的区域中发挥作用,虚拟玩家有特殊权限,这个配置可以在fake-player-build-override修改,这样就不会预防MOD在保护区域中工作了。

弹射物[和一些魔法MOD中的弹射物效果]是作者目前主要关注的问题。这是因为MOD不会提示插件弹射物的发射。

WG有一个工作区 emit-block-use-at-feet 设置,这个设置可以允许你设置一些物品类型,这会假装改变玩家的脚底下的方块。这会防止玩家烧掉他们自己的物品,但玩家不能在区域中使用物品,但在保护区域外,这不会工作

解决方案 如果出问题的是一个Bukkit插件,联系它的作者以增加对于保护插件的支持。这也可以通过使用WG API来解决。

如果出问题的是一个MOD,那你只能联系发布者以获得支持。

修复选择的区域可以:

如果你确信的话,你可以忽略。

你也可以禁用出问题的物品。

常见情节

如何启用红石开关? /rg flag REGION_NAME use allow

/rg flag __global__ use allow

如何让玩家骑马和矿车?

/rg flag REGION_NAME ride allow

/rg flag __global__ ride allow

如何预防在野外建筑?

/rg flag __global__ passthrough deny

怎么让不是成员的玩家不能出去?

/rg addmember example_region sk89q

/rg flag example_region exit -g nonmembers deny

如何让不是成员的玩家只能从一边出去?

设置两个区域

一个与上面相同

一个在区域的一侧,覆盖掉标志。exit=allow.


如何不保护所有附魔台?

在配置中的 interaction-whitelist 设置,加入 enchantment table. 使用Material来获取正确的名字。

怎么允许挖但不会破坏方块?

把 block-break 标志设置为allow:

  • /rg flag mining_area block-break allow

怎么只能破坏一些方块?

对不起,现在不支持。

地皮设置

怎么设置地皮?

你首先要阅读优先级和继承,然后根据例子来创建,

/rg define mall

/rg define shop_template -g

/rg define shop1

/rg define shop2

/rg define shop3

/rg setparent shop_template mall

/rg setparent shop1 shop_template

/rg setparent shop2 shop_template

/rg setparent shop3 shop_template

/rg flag mall use deny

/rg flag shop_template use allow


问题

为什么活塞不工作?

你设置建筑权限了吗?

/rg flag __global__ build

如果你想保护野外,使用这个

/rg flag __global__ passthrough deny

不支持用活塞把一个区域中的方块推到另一个区域中。


为什么其他MOD的一些物品被禁用了?

参阅保护什么页面

箱子保护

WG提供了一个基础的自带的箱子保护功能,只需使用特殊的格式。我们不建议新手使用这个部分因为它不是WG一个活跃的部分。此外,WG有特殊的方式使得没法用漏斗从箱子偷东西。

如果你对于这个箱子保护感兴趣的话,我们推荐你使用第三方插件,如 Lockette 和 LWC.

起步

箱子保护必须先在配置中启用。当它被禁用时,箱子保护不会激活,但可以使用牌子锁[这个也可以在配置内禁用]

只要箱子下放一个牌子,就会保护,这个牌子:

必须是个标示牌

必须在箱子下面 (双层箱子需要最少在一个下面)

在第一行写下[Lock]

第二行有玩家的名字

可以在下面2行写下其他玩家的名字

在第二行写下别人的名字是不允许的

注意

WG中的箱子保护不支持UUID

警告

因为1.8的改变,把其他版本的箱子锁升级到1.8会破坏所有牌子。[其实是会破坏带有 [ ] 的牌子]

WG API

开发者

{{{标题}}}
译者毕竟不是开发者,所以翻译见谅

WG API在5.X和6.X版本就有了,推荐6.X

maven存储库: http://maven.sk89q.com/repo/

人工制品: com.sk89q:worldguard:VERSION VERSION即为版本

下面是作者给的一些示例

<repositories>
    <repository>
        <id>sk89q-repo</id>
        <url>http://maven.sk89q.com/repo/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.sk89q</groupId>
        <artifactId>worldguard</artifactId>
        <version>VERSION</version>
    </dependency>
</dependencies>


repositories {
    mavenCentral()
    maven { url "http://maven.sk89q.com/repo/" }
}

dependencies {
    compile 'com.sk89q:worldguard:VERSION'
}


配置plugin.yml

name: My Plugin
version: 1.0
description: This is my plugin!
depend: [WorldGuard]


import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import org.bukkit.plugin.Plugin;

private WorldGuardPlugin getWorldGuard() {
    Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");

    // WorldGuard may not be loaded
    if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
        return null; // Maybe you want throw an exception instead
    }

    return (WorldGuardPlugin) plugin;
}


import com.sk89q.worldguard.bukkit.WGBukkit;

WorldGuardPlugin plugin = WGBukkit.getPlugin();


class MyPlugin {
    public void onEnable() {
        ProtectedCuboidRegion region = new ProtectedCuboidRegion(...);
    }
}

class RegionHolder {
    private final ProtectedCuboidRegion region;

    public MyPlugin() {
        region = new ProtectedCuboidRegion(...);
    }
}

class MyPlugin {
    public void onEnable() {
        try {
            new RegionHolder();
        } catch (NoClassDefFoundException e) {
            // Do something here
        }
    }
}

class MyPlugin {
    public void onEnable() {
        try {
            boolean result = SomeClass.staticMethod();
        } catch (NoClassDefFoundException e) {
            // Do something here
        }
    }
}

译者是个翻译官,开发什么的就免了。 有问题还是去问作者吧 这个我是没法解答了。

建筑检查

{{{标题}}}
boolean canBuild(Player player, Location loc);
boolean canBuild(Player player, Block block);

getWorldGuardPlugin().canBuild(player, block.getRelative(0, -1, 0));

区域构建

管理者

{{{标题}}}
RegionContainer container = getWorldGuard().getRegionContainer();
RegionManager regions = container.get(world);
ProtectedRegion region = regions.getRegion("spawn");

RegionContainer container = getWorldGuard().getRegionContainer();
RegionManager regions = container.get(world);
if (regions != null) {
    return regions.getRegion("spawn");
} else {
    // The world has no region support or region data failed to load
}

RegionContainer container = getWorldGuard().getRegionContainer();
RegionManager regions = container.get(world);
regions.addRegion(region);

regions.removeRegion("mall", RemovalStrategy.UNSET_PARENT_IN_CHILDREN);

save()
saveChanges()

load()

区域

{{{标题}}}
ProtectedRegion class
子class
ProtectedCuboidRegion
ProtectedPolygonalRegion
GlobalProtectedRegion

region.setPriority(100);

mall.setParent(null); // No parent
plot.setParent(mall);

if (region instanceof ProtectedPolygonalRegion) {
    ProtectedPolygonalRegion polygon = (ProtectedPolygonalRegion) region;
    List<BlockVector2D> points = polygon.getPoints();
}

DefaultDomain members = region.getMembers();
members.addPlayer("sk89q");
members.addPlayer(UUID.fromString("0ea8eca3-dbf6-47cc-9d1a-c64551ca975c"));
members.addGroup("admins");

// Google's Guava library provides useful concurrency classes.
// The following executor would be re-used in your plugin.
ListeningExecutorService executor =
        MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

String[] input = new String[] { "sk89q", "g:admins" };
ProfileService profiles = getWorldGuard().getProfileService();
DomainInputResolver resolver = new DomainInputResolver(profiles, input);
resolver.setLocatorPolicy(UserLocatorPolicy.UUID_AND_NAME);
ListenableFuture<DefaultDomain> future = executor.submit(resolver);

// Add a callback using Guava
Futures.addCallback(future, new FutureCallback<DefaultDomain>() {
    @Override
    public void onSuccess(DefaultDomain result) {
        region.getOwners().addAll(result);
    }

    @Override
    public void onFailure(Throwable throwable) {
        // Do something about the error
    }
});

DefaultFlag.BUILD
DefaultFlag.PVP
DefaultFlag.LEAF_DECAY
DefaultFlag.LIGHTNING

String message = region.getFlag(DefaultFlag.GREET_MESSAGE);
player.sendMessage(message);

region.setFlag(DefaultFlag.GREET_MESSAGE, "Hi there!");

RegionGroupFlag flag = DefaultFlag.PVP.getRegionGroupFlag();

region.setFlag(DefaultFlag.USE, StateFlag.State.ALLOW);
region.setFlag(DefaultFlag.USE.getRegionGroupFlag(), RegionGroup.MEMBERS);

BlockVector min = new BlockVector(-10, 5, -4);
BlockVector max = new BlockVector(5, -8, 10);
ProtectedRegion region = new ProtectedCuboidRegion("spawn", min, max);

List<BlockVector2D> points = Lists.newArrayList(); // Call from Guava
points.add(new BlockVector2D(3, 4, 5));
points.add(new BlockVector2D(0, 0, 0));
points.add(new BlockVector2D(19, 3, 4));
int minY = 0;
int maxY = 54;
ProtectedRegion region = new ProtectedPolygonalRegion("spawn", points, minY, maxY);

ProtectedRegion region = new GlobalProtectedRegion("template");

region.contains(new Vector(20, 0, 30));

List<ProtectedRegion> candidates = Lists.newArrayList();
candidates.add(mall);
candidates.add(hospital);

List<ProtectedRegion> overlapping = spawn.getIntersectingRegions(candidates);

isDirty()

空间查询

{{{标题}}}
ApplicableRegionSet

RegionQuery query = container.createQuery();
ApplicableRegionSet set = query.getApplicableRegions(location);

Location loc = new Location(world, 10, 64, 100);
RegionContainer container = getWorldGuard().getRegionContainer();
RegionQuery query = container.createQuery();
ApplicableRegionSet set = query.getApplicableRegions(loc);

Vector position = new Vector(20, 10, 4);
ApplicableRegionSet set = regions.getApplicableRegions(position);

Location loc = new Location(world, 10, 64, 100);
RegionContainer container = getWorldGuard().getRegionContainer();
RegionManager regions = container.get(loc.getWorld());
// Check to make sure that "regions" is not null
ApplicableRegionSet set = regions.getApplicableRegions(BukkitUtil.toVector(loc));

Vector min = new Vector(0, 0, 0);
Vector max = new Vector(10, 10, 10);
ProtectedRegion test = new ProtectedCuboidRegion("dummy", min, max);
ApplicableRegionSet set = regions.getApplicableRegions(test);

List<ProtectedRegion> regions = Lists.newArrayList();
regions.add(spawn);
regions.add(mall);
regions.add(pub);

ApplicableRegionSet set = new RegionResultSet(regions, null); // No global region

for (ProtectedRegion region : set) {
    // Do something with each region
}

List<ProtectedRegion> region = Lists.newArrayList(set);

计算权限

{{{标题}}}
queryAllValues(RegionAssociable, Flag)

LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
Collection<String> greetings = set.queryAllValues(localPlayer, DefaultFlag.GREET_MESSAGE);

LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
String greeting = set.queryValue(localPlayer, DefaultFlag.GREET_MESSAGE);

LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
if (!set.testState(localPlayer, DefaultFlag.BUILD)) {
    event.setCancelled(true);
}

if (!set.testState(null, DefaultFlag.CREEPER_EXPLOSION)) {
    event.setCancelled(true);
}

LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)
Location loc = new Location(world, 10, 64, 100);
RegionContainer container = getWorldGuard().getRegionContainer();
RegionQuery query = container.createQuery();

// No need to bother:
// ApplicableRegionSet set = query.getApplicableRegions(loc);

// Just directly test the flag
query.testState(loc, localPlayer, DefaultFlag.BUILD);

testState(..., DefaultFlag.BUILD, your flags)

List<ProtectedRegion> regions = Arrays.asList(spawnRegion, buildersClub);
builderPlayer.getAssociation(regions) == Association.OWNER;

Set deepInside    = newHashSet(spawn, mall);
Set inside        = newHashSet(spawn);
Set outside       = newHashSet(); // Empty set

// outside -> inside = BLOCKED
new RegionOverlapAssociation(outside).getAssociation(inside) == NON_MEMBER

// inside -> inside = ALLOWED
new RegionOverlapAssociation(inside).getAssociation(inside) == MEMBER

// inside -> deepInside = ALLOWED
new RegionOverlapAssociation(inside).getAssociation(deepInside) == MEMBER

// inside -> outside = ALLOWED
new RegionOverlapAssociation(inside).getAssociation(outside) == MEMBER

private RegionAssociable createRegionAssociable(Object cause) {
    if (cause instanceof Player) {
        return getWorldGuard().wrapPlayer((Player) cause);
    } else if (cause instanceof Entity) {
        RegionQuery query = getWorldGuard().getRegionContainer().createQuery();
        return new DelayedRegionOverlapAssociation(query, ((Entity) cause).getLocation());
    } else if (cause instanceof Block) {
        RegionQuery query = getWorldGuard().getRegionContainer().createQuery();
        return new DelayedRegionOverlapAssociation(query, ((Block) cause).getLocation());
    } else {
        return Associables.constant(Association.NON_MEMBER);
    }
}

@EventHandler
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
    Player player = event.getPlayer();
    RegionAssociable associable = createRegionAssociable(getWorldGuard().wrapPlayer(player));

    if (!set.testState(associable, /* flags here */)) {
        event.setCancelled(true);
    }
}

保护查询

{{{标题}}}
LocalPlayer localPlayer = getWorldGuard().wrapPlayer(player)

Location loc = new Location(world, 10, 64, 100); RegionContainer container = getWorldGuard().getRegionContainer(); RegionQuery query = container.createQuery();

if (!query.testState(loc, localPlayer, DefaultFlag.BUILD)) {

   // Can't build

}

区域事件

DisallowedPVPEvent 禁止PVP

从水桶服的一些物体

getWorldGuard().wrapPlayer(player);

BukkitUtil.toVector(location);

高级话题

事件的记录

漏斗式事件

Bukkit 在发生事件的时候通知插件,有许多所谓的事件,如

  • Bucket fill
  • Bucket empty
  • Right click of an entity by a player
  • Placement of a block by a player
  • Digging of a block by a player
  • Change of a block by an entity
  • Piston push
  • Push retract

但这些可以在MC中归于三类

  • Items
  • Blocks
  • Entities

你可以关于这些做一些事

  • Place them
  • Break them
  • Interact with them
  • Damage them

为了简化事件,WG提供了以下方式

  • Bucket fill → Interact with a block, Interact with an item
  • Bucket empty → Interact with a block, Interact with an item
  • Right click of an entity by a player → Interact with an entity
  • Placement of a block by a player → Interact with a block
  • Digging of a block by a player → Interact with a block
  • Change of a block by an entity → Interact with a block
  • Piston push → Interact with a block
  • Push retract → Interact with a block

WG的部分,如区域保护,需要“interact with a block,” “interact with an entity,” 等 ,然后会检测方块 实体被触发。

检测触发

计算一些东西的另一方面是可以用简介的东西来完成这个复杂的事件。

例如,如果一个玩家对另一个玩家射箭,直接的触发器 -- 箭 -- 不是真正的触发器,玩家才是。

另一个例子是放置砂砾,它会掉落:最后掉在地上是因为(1)掉落实体,因为(2)砂砾方块被触发,(3)被玩家放置。

记住它是玩家导致的,其他例子可能是方块或实体。

但是,不可能总是检测正确。WG有时必须追踪事件链。

显示内部事件

这里只有一些有用的内部事件来检测。把它们放到服务器记录是可能的,允许你:

找出某些活动的黑名单

查看WG是否在操控活动

加入WG贡献组来查看它支持的内部事件

要使用这个模式,在命令行加入参数 -Dworldguard.debug.listener=true

提示: 这个特性最好在一个私人服务器上使用,不要在大型服务器使用,会刷屏。

可以在BAT文件启用

原来你的BAT是这样的

@ECHO OFF
SET BINDIR=%~dp0
CD /D "%BINDIR%"
"%ProgramFiles(x86)%\Java\jre7\bin\java.exe" -Xincgc -Xmx1G -jar craftbukkit.jar
PAUSE
You’d add -Dworldguard.debug.listener=true like so:

改为这样

@ECHO OFF
SET BINDIR=%~dp0
CD /D "%BINDIR%"
"%ProgramFiles(x86)%\Java\jre7\bin\java.exe" -Dworldguard.debug.listener=true -Xincgc -Xmx1G -jar craftbukkit.jar
PAUSE

放在-jar之前的任意位置,在java.exe之后。

解释输出

让我们看看在区域上方放一个砂砾,你可以看到在控制台中:

* USE   GRAVEL         [Player{sk89q}] @world :BlockPlaceEvent
* PLACE GRAVEL @0,99,0 [Player{sk89q}] :BlockPlaceEvent
* SPAWN FALLING_BLOCK  [Block{0,99,0}] @-0,99,0 :EntityChangeBlockEvent
* PLACE GRAVEL @       [Block{0,99,0} | FallingSand] :EntityChangeBlockEvent [CANCELLED]
* SPAWN DROPPED_ITEM   [Block{0,99,0} | FallingSand] @-0,0,0 :EntityChangeBlockEvent

输出已经缩短并且有格式化

每行的语法是这样的

ACTION TYPE/LOCATION [CAUSES] @LOOCATION :BUKKIT-EVENT [CANCELLED?]

取消的事件被锁定?

讲解实例

首先,当砂砾被放置,会

* USE   GRAVEL         [Player{sk89q}] @world :BlockPlaceEvent

这是玩家放置,然后是真正的放置触发

* PLACE GRAVEL @0,99,0 [Player{sk89q}] :BlockPlaceEvent

因为砂砾被放在空气中,会掉落成实体——

* SPAWN FALLING_BLOCK  [Block{0,99,0}] @-0,99,0 :EntityChangeBlockEvent

当砂砾落地时会尝试生成一个新的砂砾方块并移除实体——

* PLACE GRAVEL @       [Block{0,99,0} | FallingSand] :EntityChangeBlockEvent [CANCELLED]

因为掉落进了一保护区域,会生成一个掉落物——

* SPAWN DROPPED_ITEM   [Block{0,99,0} | FallingSand] @-0,0,0 :EntityChangeBlockEvent

--全过程

普通问题

常规

为什么一个命令都不工作?

如果没有命令工作,可能是WG启动失败了。

请注意你的服务端是Bukkit或[其他兼容插件的服务器],在后台或游戏里使用/version来查看版本。

确保你安装了WE。

确保如果你下载的是zip文件,你已经解压。

确保你使用的是对应Minecraft版本的WG。

如果这些不能帮助你,你需要查看你的启动日志。

你可以打开latest.log来查看日志。

如果你还是不能发现问题,在获取帮助页面的汇报BUG链接中反馈。


WG多大了?

WG是2010.11被sk89q写出的,当时是个MOD,之后便有了插件的版本。

谁在发展WG

WG被许多人发展,WG的很多代码都是贡献代码,贡献者列表可以在Github找寻。

不能破坏

为什么玩家不能破坏方块?

全新的WG中的许多特性都是未启用的,所以这基本不可能是WG引起。

一个简单去找寻原因的方法是查看在你破坏方块时收到的信息。WG一般使用暗红和深红的颜色,和这样的消息“Hey! Sorry, but you can’t _____ here.”如果你没有收到信息,那就不是WG的锅。

如果不是一安装WG就这样的话,确保出生点保护没有启用。出生点保护会保护世界出生点以内的区域,若要取消,把 spawn-protection 改为0 [server.properties]。

同样确保你没有使用冒险模式。更新你的Bukkit/Spigot/Cauldron的版本。

如果这些步骤不行的话,WG中有一个简单的指令可以探测是什么插件阻止了这个事件的发生。使用 “testbreak” 和 “testplace” 来查看。

如果是WG造成的话:

使用区域魔杖来查看是否有区域保护了方块,如果有一些的话,可能你不知道,查看下一个问题。

检查是否启用了建筑权限,检查配置文件是否禁止了这个事件。

如果你不能解决问题,查看获取帮助页。

如果指令列出了另一个插件:

查看你是否关于那个插件要给予另外的权限。

如果什么都没有列出,查看上方的出生点保护设置,然后去获取帮助页。

在设置了区域之后,为什么都不能建筑?

使用区域魔杖,然后右键一个方块,去查看所有区域。使用/rg info来查看每个区域的信息。

确保合适所有区域的成员。

确保建筑权限没有禁止。

这里只有全局区域吗?

确保全局设置没有被禁用;确保M全局区域的穿过没有设置为禁用;确保全局区域没有成员和主人。

建筑没有锁定

为什么保护没有工作?但玩家没有收到消息?

你是OP,有完全权限,但玩家没有

你把一个区域的建筑和穿过权限设置成了allow

你把其他的一些权限设置成了allow

物品可能来自于MOD或第三方插件[见保护什么

WG并不会保护你特别说明的一些东西。这不是简单的方块破坏或放置的情况。请确保你在使用最新版本的WG,如果还是有BUG,做BUG反馈。

这是你Bukkit, Spigot, 或 Cauldron 版本中的BUG

如果你还不能解决问题,查看问题解决页面

为什么建筑控制不工作?玩家收到信息

如果WG锁定了一个事件,对于第三方插件来说也是可以解除锁定的,但是WG也发送了你不能XX的消息。

你可以使用testbreak和testplace指令来查看,如果在列表中发现ALLOW,就是那个插件造成的。

另一个原因是版本错误。如果还不能解决问题,查看问题帮助。

区域保护

为什么活塞不工作?

你可能把权限设置成deny了。查看 常见情节 节

关于区域保护我怎么XXXX

查看 常见情节 节

获取帮助

如果你有一个问题的话 [在论坛询问] [加入IRC] [在Twitter上联系sk89q]

如果你要汇报BUG的话 [在这里汇报]

译者注:全部都要翻墙

开源地址

你可以在[Github]找到资源代码。 WG是开源的,但贡献者必须遵守GNU Lesser General Public License v3。

链接

地址

http://docs.enginehub.org/manual/worldguard/latest/regions/priorities/

Setting

注意:以下内容的设置仅供参考,你应该在config.yml文件中进行你喜欢的设置.
  • 总体
语句 描述
op-permissions TRUE 拥有OP权限的玩家是否应该同时享有WorldGuard的所有权限,即使第三方Permission插件禁止这么做.
summary-on-start TRUE 在服务器启动时,WorldGuard会将每个世界的配置汇报给后台.虽然这样子有点吵,但是对管理很有帮助.
auto-invincible FALSE 让玩家无敌.并将worldguard.auto-invincible权限自动添加给玩家.
auto-invincible-group FALSE 给每一个权限组添加wg-invincible权限,让其中的玩家无敌.
auto-no-drowning-group FALSE 让玩家不会溺死.并将wg-amphibious权限自动添加给玩家.
use-player-move-event TRUE 是否让WorldGuard记录玩家行为,包括吃、动、恢复生命等等,这将会占用一部分CPU.
use-player-teleports TRUE 传送事件是否考虑传送轨迹.传送事件并非指玩家自主TPA,而是指某些任意传送行为.
host-keys 是玩家连接的一系列主机名称.
  • 安全(security.*)
语句 描述
deop-everyone-on-join False 在玩家进入服务器时,洗掉TA的OP权限
block-in-game-op-command FALSE /op命令只能在后台使用,游戏中不可用.
  • 建造(build-permission-nodes.*)
语句 描述
enable FALSE 若设置为TRUE,你需要给予玩家特定BuildPermissions玩家才可以建造.
deny-message 设置提示玩家被授予了什么BuildPermissions,如果其值为空,则应用默认提示消息.
  • 事件(event-handling.)
语句 描述
block-entity-spawns-with-untraceable-cause FALSE Bukkit服务端并不总是相插件提供所有的实体生成信息,导致一些玩家可以跳过Bukkit设置生成实体(例如使用怪物蛋),

这个设置就是为了弥补这种不足,让生成实体的真正执行者被记录.不过,现在这个选项建议设置为FALSE,因为会导致一些BUG出现.

interaction-whitelist [] 设置哪些物品不受WorldGuard保护.例如,在列表下填写chest,则region下的箱子将不会受到保护.

这个设置在你使用一些插件或MOD时,有一些物品希望被玩家使用或破坏时,很有用.

emit-block-use-at-feet [] 当玩家使用列表下的方块时,同时要求玩家脚下站着一块同样的方块.这个设置在你使用一些插件或MOD时很有用.

但是这个解决方案还不算完美,因为玩家可以通过某些方块,将自己发射至目标区域.

例子:例如我要把工作台添加到interaction-whitelist列表中,我需要:
interaction-whitelist: [workbench]
  • 保护(protection.*)
语句 描述
item-durability TRUE 如果设置为False,那么物品永远都不会消失.(会永远待在玩家背包中并且耐久不会被消耗)
remove-infinite-stacks FALSE 针对堆叠数为负数的作弊行为准备.设置为TRUE,将自动移除“无限”物品(即堆叠数为负数的物品)
disable-xp-orb-drops FALSE 开启/关闭经验球(掉落、效果都关闭)
disable-obsidian-generators FALSE 开启/关闭黑曜石生成(岩浆和水生成)
  • 游戏(gameplay.*)
语句 描述
block-potions [] 一系列药水不能被使用,药水类型点击:BukkitType
block-potions-overly-reliably FALSE 让WorldGuard更加严格地限制药水,甚至会限制同种类型的所有药水.
例子:限制夜视和加速药水:
block-potions: [night_vision, speed]
  • 海绵模拟(simulation.sponge.*)
语句 描述
enable FALSE 让海绵能够在生存模式下合成并产生效果.自从MineCraft1.8之后,海绵就几乎不存在了,这个功能能够让海绵重换新生.
radius 3 效果半径
restone FALSE 让海绵效果应用于红石电路中.
  • 默认(default.*)
语句 描述
pumpkin-scuba FALSE 是否让头戴南瓜的玩家同时拥有水下呼吸的特效.
disable-health-regain FALSE 是否关闭自动回血区域
  • 物理(physics.*)
语句 描述
no-physics-gravel FALSE 是否开启树叶无重力效果(TRUE:树叶不会掉落)
no-physics-sand FALSE 是否开启沙子无重力效果(TRUE:沙子不会掉落)
vine-like-rope-ladders FALSE 是否让梯子做到藤蔓的特效(TRUE:梯子会自己生长)
allow-portal-anywhere FALSE 是否允许在有效区域内随意打开传送门
disable-water-damage-blocks [] 列表下的方块不会受到水的破坏,
例子:保护红石电线和红石火把不受水的破坏:
disable-water-damage-blocks: [redstone_wire, redstone_torch
  • 点火(ignition.*)
语句 描述
block-tnt FALSE 禁止TNT破坏方块
block-tnt-block-damage FALSE 禁止TNT对玩家的伤害
block-lighter FALSE 禁止点火工具点火(打火石、烈焰球)
  • 火(fire.*)
语句 描述
disable-lava-fire-spread TRUE 让岩浆不能点燃附近方块
disable-all-fire-spread TRUE 禁止所有火焰的传播
disable-fire-spread-blocks [] 列表中的方块无法让火焰传播,火焰也无法破坏它们.
lava-spread-blocks [] 岩浆只允许在列表下的方块上流动(自动包括空气)
  • 生物(mobs.*)
语句 描述
block-creeper-explosions FALSE 关闭苦力怕爆炸效果(TRUE为关闭,FALSE为开启,下同)
block-creeper-block-damage FALSE 关闭苦力怕破坏方块的效果
block-wither-explosions FALSE 关闭凋零爆炸效果
block-wither-block-damage FALSE 关闭凋零破坏方块的效果
block-wither-skull-explosions FALSE 关闭凋零骷髅爆炸效果
block-wither-skull-block-damage FALSE 关闭凋零骷髅破坏方块的效果
block-enderdragon-block-damage FALSE 关闭末影龙破坏方块的效果.
block-enderdragon-portal-creation FALSE 关闭末影龙传送门的创建.
block-fireball-explosions FALSE 关闭火球爆炸效果
block-fireball-block-damage FALSE 关闭火球破坏方块的效果
anti-wolf-dumbness TRUE 让狼(狗)智能化.MoJang在设置狼时并没有让它们拥有IQ,所以总会出现走丢,掉进岩浆,卡区域的情况(TRUE为开启,下同)
allow-tamed-spawns TRUE 开启驯养动物生成(例如狼、马、猫等)
disable-enderman-griefing FALSE 关闭末影人拾取方块(TRUE为关闭,下同)
disable-snowman-trails TRUE 关闭雪人生成雪迹
block-painting-destroy TRUE 关闭生物破坏画的效果
block-item-frame-destroy TRUE 关闭生物破坏展示框的效果.
block-plugin-spawning FALSE 关闭其它插件对生物生成的限制,这主要是为了保护WorldGuard领域.
block-above-ground-slimes FALSE 关闭史莱姆区块生成.
block-other-explosions FALSE 关闭其它类型的爆炸.
block-zombie-door-destruction TRUE 关闭僵尸破坏门
block-creature-spawn [] 列表下的生物将不会生成