我的世界WorldGuard插件高级话题
事件的记录
漏斗式事件
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
–全过程