Wiki赞助.jpg
  • 欢迎来到Minecraft插件百科!请在注册后加入百科编辑
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 插件百科企鹅群:223812289

FastAsyncWorldEdit

From Minecraft插件百科
Revision as of 19:07, 28 July 2018 by C7w (talk | contribs) (总览: 删除重复部分)
Jump to: navigation, search


Contents

FastAsyncWorldEdit

FAWE 是一款 WorldEdit 插件的附属插件,它改变了 WorldEdit 插件中大量核心类,彻底的提升了原插件的性能,为其增加了大量的新功能。

- > 安装 <

- > 聊天IRC|Discord|Gitter|Spigot Forums<

- > 资源|API <

- > 构建版本 <

- > 命令 <

- > 权限 <

- > 教程 <

- > 汇报问题/特性 <

目前支持的平台

PC: SP/MP, MCPE: MP

  • CraftBukkit
  • Spigot
  • Paper
  • Thermos
  • Forge
  • Sponge
  • Nukkit

区域限制:

当前支持下列区域插件:

  • WorldGuard
  • Towny
  • GriefPrevention
  • PreciousStones
  • Factions (mcore, uuid, one)
  • Residence
  • Regios
  • PlotSquared
  • PlotMe

你可以在配置中禁用本项,也可以使用 /wea 或者 fawe.bypass 来跳过检查

记录与回滚操作

请在 config.yml 中启用 use-diskuse-database 来使用 FAWE 插件开发中的记录与回滚操作。作为记录选项,在安装 BlocksHub 插件后就支持下列的记录插件了。

  • CoreProtect
  • LogBlock
  • Prism
  • HawkEye

给予普通玩家使用 FAWE 回滚操作的权限是安全的,要想跳过记录请使用 //fast

命令

总览

本页面是由资源文件生成的。点击下列指令旁边的编辑(edit)按钮来直接修改命令的类。

你需要找到跟帮助文档对应的命令的相关部分。

命令的帮助文档与游戏中可使用的命令是一致的。

要想在游戏中查看这些信息的话请使用 //help [类型|命令] ## 命令的用法
- <arg> - 一个必需参数
- [arg] - 一个可选参数
- <arg1|arg2> - 提供的多选一选项
- <arg=value> - 默认或建议你使用的值
- -a - 一条命令的标记,如 //<command> -a [命令的标记的值] ## 也请看看 - Masks - Patterns - Transforms

目录

点击类型的名字去查看该类型下命令的列表,或者点击 更多信息 获取更多详细信息

* 生成命令 (创建结构或特性: 更多信息

未分类的命令

别称 权限 标记 使用方法
//cancel fawe.cancel 取消你当前正在进行的任务
/plot replaceall plots.replaceall 替换地皮世界中所有的方块
/plot createfromimage plots.createfromimage 从一张高度图图片开始世界生成: 更多信息

/we threads

权限worldedit.threads
描述: 显示出所有的线程堆栈

  • /we version 描述: 获取当前 WorldEdit / FAWE 插件的版本信息 * /we help [<command>] 权限worldedit.help

描述: 显示出 FAWE 插件的命令帮助信息

  • /we debugpaste 权限worldedit.debugpaste

描述: 将调试信息上传到 hastebin.com

  • /we changelog 权限worldedit.changelog

描述: 查看 FAWE 插件的更新日志

  • /we reload 权限worldedit.reload

描述: 重载插件配置

  • /we tz [timezone] 描述: 设置你的快照的时间区域
  • /we cui 描述: 完成 CUI 信息交换(内部开发使用)



Utility 命令 [编辑|回到顶部]

(一些功能命令: 更多信息)


/remove <type> <radius>

权限worldedit.remove
描述: 移除所有指定类型的实体

  • //fill <block> <radius> [depth] 权限worldedit.fill

描述: 填充一块洞

  • //help [<command>] 描述: 显示 WorldEdit 插件的帮助命令
  • //drain <radius> 权限worldedit.drain

描述: 排开一片池塘内的水

  • //removenear <block> [size] 权限worldedit.removenear

描述: 移除你附近的方块

  • //fillr <block> <radius> [depth] 权限worldedit.fill.recursive

描述: 递归填充周围的洞

  • //removeabove [size] [height] 权限worldedit.removeabove

描述: 移除你头上方的方块

  • //fixlava <radius> 权限worldedit.fixlava

描述: 让岩浆静止

  • //removebelow [size] [height] 权限worldedit.removebelow

描述: 移除你脚下方的方块

  • //fixwater <radius> 权限worldedit.fixwater

描述: 让水静止

  • //green [radius] [-f] 权限worldedit.green

描述: 绿化半径中的区域

  • //replacenear <size> <from-id> <to-id> [-f] 权限worldedit.replacenear

描述: 替换附近的方块

  • //snow [radius] 权限worldedit.snow

描述: 模仿下雪

  • /butcher [radius] [-p] [-l] [-a] [-n] [-g] [-b] [-t] [-f] [-r] 权限worldedit.butcher

描述: 击杀附近的怪物,根据半径,如果没有特别给出半径的话则使用配置文件中的默认半径。
可用的标记:
-p 也击杀宠物
-n 也击杀 NPC
-g 也击杀铁傀儡
-a 也击杀动物。
-b 也击杀中立生物
-t 也击杀带有名字的怪物
-f 相当于这以前所有标记的混合
-r 也击杀盔甲架
-l 目前啥都不能干 * //ex [radius] 权限worldedit.extinguish
描述: 熄灭周围的火 * //thaw [radius] 权限worldedit.thaw
描述: 使周围的区域中的雪与冰熔化

  • //calc <expression> 权限worldedit.calc

描述: 求一个数学表达式的值

  • //confirm 描述: 确认一条命令



Region 命令 [编辑|回到顶部]

(一些对区域起作用的命令: 更多信息)


//replace [from-mask] <to-pattern> [-f]

权限worldedit.region.replace
描述: 用给定的方块替换选区中所有另一给定的方块 * //stack [count] [direction] [-s] [-a] [-m] 权限worldedit.region.stack
描述: 重复选区中的内容
标记:
-s 将上一堆叠的选取换挡为最终选区
-a 跳过空气方块 * //set [pattern] 权限worldedit.region.set
描述: 将选取设置为给定方块

  • //fall [replace] [-m] 权限worldedit.region.fall

描述: 让选区中的方块掉落
-m 标记仅会让方块在竖直位置上下落。

  • //faces <block> 权限worldedit.region.faces

描述: 建造出选区的墙壁,天花板和地板 * //center <block> 权限worldedit.region.center
描述: 设置出选区的中心方块 * //hollow [<thickness>[ <block>]] 权限worldedit.region.hollow
描述: 挖空本区域中的物体
你可定义挖空的部分用什么方块填充
厚度用曼哈顿距离来计算。 * //smooth [iterations] [-n] 权限worldedit.region.smoothsnow
描述: 平滑化区域的陡峭程度。
-n 标记互让它仅更改自然生成的方块。
-s 标记让它只更改雪方块。 * //nbtinfo 权限worldedit.nbtinfo
描述: 查看一个方块的NBT信息

  • //setskylight 权限worldedit.light.set

描述: 设置一个选区的天空亮度

  • //line <block> [thickness] [-h] 权限worldedit.region.line

描述: 在长方体选择区域的两个角落划出一条对角线线段。
仅能够在长方体选区中使用。
可用的标记:
-h 仅会生成外形 * //getlighting 权限worldedit.light.fix
描述: 获取某位置的亮度信息

  • //overlay <block> 权限worldedit.region.overlay

描述: 在给定区域的顶层方块上方覆盖给定方块

  • //wea 权限fawe.admin

描述: 跳过区域检测限制

  • //wer 权限fawe.worldeditregion

描述: 选择你当前允许的区域

  • //fixlighting 权限worldedit.light.fix

描述: 修复某位置的光照

  • //removelight 权限worldedit.light.remove

描述: 移除某位置的光照

  • //curve <block> [thickness] [-h] 权限worldedit.region.curve

描述: 过选择的点画一条曲线。
只能在使用凸多面体选区类型时才能使用。
Flags:
-h 仅会生成外形

  • //naturalize 权限worldedit.region.naturalize

描述: 顶层覆盖3层泥土,下面为石头

  • //walls <block> 权限worldedit.region.walls

描述: 围上选区的四边

  • //setblocklight 权限worldedit.light.set

描述: 设置选区中的方块亮度

  • //lay <block> 权限worldedit.region.overlay

描述: 设置选区的顶层方块

  • //move [count] [direction] [leave-id] [-s] 权限worldedit.region.move

描述: 将选区中的内容移动。.
-s 标记会将选区换挡到目标位置。
-b 也会复制生物群系
-e 忽略实体
-a 忽略空气
自动使用 <leave-id> 填充旧区域。

  • //forest [type] [density] 权限worldedit.region.forest

描述: 在区域内生成森林

  • //flora [density] 权限worldedit.region.flora

描述: 在区域内生成植物群 * //deform <expression> [-r] [-o] 权限worldedit.region.deform
描述: 使用给定的表达式使区域变形
表达式对每个方块都会执行,它可以
将方块的x,y,z修改到新方块的位置
来实现。也请看看 tinyurl.com/wesyntax。

  • //regen [biome] [seed] 权限worldedit.regen

描述: 重新生成当前选区中的内容。
这条命令也有可能影响选区外的东西,
如果它们在相同区块中的话。



Selection 命令 [编辑|回到顶部]

(改变你选区的点,选取模式或是查看关于你的选区的信息: 更多信息)


//count <block> [-d]

权限worldedit.analysis.count
描述: 为当前选区中某种类型的方块计数

  • //size [-c] 权限worldedit.selection.size

描述: 获取当前选区的信息

  • //expand <amount> [reverse-amount] <direction> 权限worldedit.selection.expand

描述: 延展选区区域

  • //shift <amount> [direction] 权限worldedit.selection.shift

描述: 移动选区区域

  • //sel [cuboid|extend|poly|ellipsoid|sphere|cyl|convex] [-d] 描述: 选择选区类型
  • //contract <amount> [reverse-amount] [direction] 权限worldedit.selection.contract

描述: 缩小选区区域

  • //pos1 [coordinates] 权限worldedit.selection.pos

描述: 设置选取点1

  • //pos2 [coordinates] 权限worldedit.selection.pos

描述: 设置选取点2

  • //chunk [x,z coordinates] [-s] [-c] 权限worldedit.selection.chunk

描述: 将选取设置为当前你所在的区块。
写入 -s 标记你当前的选区会被延展
来包括所有为它的部分的区块。

也可以使用给定的坐标,这会替代你的
当前位置。使用-c来指定区块坐标,
否则就会使用全局坐标。
(举个例子,坐标5,5和 -c 0,0 是一样的) * //hpos1 权限worldedit.selection.hpos
描述: 将选取点1设置为目标方块

  • //wand 权限worldedit.wand

描述: 获取魔杖物品

  • /toggleeditwand 权限worldedit.wand.toggle

描述: 切换编辑魔杖的功能启用与否

  • //hpos2 权限worldedit.selection.hpos

描述: 将选取点2设置为目标方块

  • //outset <amount> [-h] [-v] 权限worldedit.selection.outset

描述: 使用给定的数值,在所有方向上延展选区。
可用标记:
-h 仅会延展横向
-v 仅会延展纵向

  • //distr [-c] [-d] 权限worldedit.analysis.distr

描述: 获得选区内方块的分布情况。
-c 标记会获得你剪切板内容的分布情况。
-d 标记会将方块用数据分割

  • //inset <amount> [-h] [-v] 权限worldedit.selection.inset

描述: 使用给定的数值,在所有方向上缩小选区。
可用标记:
-h 仅会缩小横向
-v 仅会缩小纵向



History 命令 [编辑|回到顶部]

(能够撤销操作,反撤销操作,清除历史的相关命令: 更多信息)


//redo [times] [player]

权限worldedit.history.redo
描述: 反撤销上个操作(从历史记录中)

  • //clearhistory 权限worldedit.history.clear

描述: 清除你的历史记录

  • //undo [times] [player] 权限worldedit.history.undo

描述: 撤销上个操作

  • //frb <user=Empire92> <radius=5> <time=3d4h> 权限worldedit.history.rollback

描述: 撤销某个给定的操作。 - 时间使用以下单位: s(秒), m(分钟), h(小时), d(天), y(年)。
- 从硬盘中导入: /frb #import



Schematic 命令 [编辑|回到顶部]

(跟 schematic 文件有关的命令)


/schematic load [<format>] <filename>

权限worldedit.clipboard.load, worldedit.schematic.load, worldedit.schematic.upload, worldedit.schematic.load.other
描述: 将某个schematic文件导入到你的剪切板中

  • /schematic delete <filename> 权限worldedit.schematic.delete

描述: 将某个schematic文件从文件列表中移除

  • /schematic list [mine|<filter>] [page=1] [-d] [-n] [-p] 权限worldedit.schematic.list

描述: 列出所有schematic路径下的可用文件
-p <页码数> 能够列出指定页面的文件
-f <format> 启用格式限制

  • /schematic save [<format>] <filename> 权限worldedit.clipboard.save, worldedit.schematic.save, worldedit.schematic.save.other

描述: 使用你的剪切板的内容储存到schematic文件中

  • /schematic remap 权限worldedit.schematic.remap

描述: 将剪切板在MCPE/PC的值之间交换 * /schematic formats 权限worldedit.schematic.formats
描述: 列出所有可用的格式

  • /schematic loadall [<format>] <filename|url> 权限worldedit.clipboard.load, worldedit.schematic.load, worldedit.schematic.upload

描述: 读取多个剪切板
-r 标记可以应用随机旋转位置



Clipboard 命令 [编辑|回到顶部]

(跟复制和粘贴方块有关的命令: 更多信息)


//copy [-e] [-m]

权限worldedit.clipboard.copy
描述: 将选区中的内容复制到剪切板中
可用标记:
-e 跳过复制实体
-m 设置资源蒙版,蒙版外的方块会作为空气复制
-b 也会复制生物群系
警告:实体的粘贴不能被撤销!

  • //flip [<direction>] 权限worldedit.clipboard.flip

描述: 沿着复制发生时的那个点为剪切板中的内容进行镜面翻转。

  • //rotate <y-axis> [<x-axis>] [<z-axis>] 权限worldedit.clipboard.rotate

描述: 不会有破坏性的旋转剪切板中的内容。
角度需要输入度数,正数会进行顺时针旋转。你也可以堆叠进行多次旋转。插值是不被接受,且没有任何作用的,所以角度的度数应该是90的倍数。

  • //lazycopy [-e] [-m] 权限worldedit.clipboard.lazycopy

描述: 将选区中的内容延迟复制到剪切板中
可用标记:
-e 跳过复制实体
-m 设置资源蒙版,蒙版外的方块会作为空气复制
-b 也会复制生物群系
警告:实体的粘贴不能被撤销!

  • //place [-s] [-a] [-o] 权限worldedit.clipboard.place

描述: 不应用任何变化(例如:旋转)放置剪切板的内容。
可用参数:
-a 跳过空气方块
-o 粘贴在原位置
-s 在粘贴之后将选区定在粘贴区域

  • //cut [leave-id] [-e] [-m] 权限worldedit.clipboard.cut

描述: 将选区剪切到粘贴板之中
可用参数:
-e 跳过复制实体
-m 设置资源蒙版,蒙版外的方块会作为空气复制
-b 也会复制生物群系
警告:实体的粘贴不能被撤销! * /download 权限worldedit.clipboard.download
描述: 通过配置的网页接口下载剪切板的内容

  • /asset [category] 权限worldedit.clipboard.asset

描述: 将你的剪切板的内容保存到网页资源接口中

  • //paste [-s] [-a] [-o] 权限worldedit.clipboard.paste

描述: 粘贴剪切板的内容。
可用参数:
-a 跳过空气方块
-b 跳过粘贴生物群系
-e 跳过粘贴实体
-o 粘贴到原位置
-s 在粘贴之后将选区定在粘贴区域

  • //lazycut [-e] [-m] 权限worldedit.clipboard.lazycut

描述: 将选区中的内容延迟剪切到剪切板之中
可用参数:
-e 跳过复制实体
-m 设置资源蒙版,蒙版外的方块会作为空气复制
-b 也会复制生物群系
警告:实体的粘贴不能被撤销!

  • /clearclipboard 权限worldedit.clipboard.clear

描述: 清除你的剪切板



Generation 命令 [编辑|回到顶部]

(创建结构或特性: 更多信息)


//image <imgur> [randomize=true] [complexity=100]

权限worldedit.generation.image
描述: 创建一张图片

  • //generate <block> <expression> [-h] [-r] [-o] [-c] 权限worldedit.generation.shape

描述: 根据表达式创建结构,表达式返回的值
应该是正数(返回true,如果选择点在结构内的话)
可选地,你可以设置目标方块的类型或数据。
可选参数:
-h 创建凹下去的结构
-r 使用原版Minecraft坐标
-o 与 -r 相似,但使用相对坐标。
-c 与 -r 相似,但相对坐标的中心不同。
如果你既没有没有输入 -r ,也没有输入 -o 的话,选区会自动映射为 -1..1
详见 tinyurl.com/wesyntax。

  • //cyl <block> <radius>[,<radius>] [height] [-h] 权限worldedit.generation.cylinder

描述: 生成圆柱体。
通过指定用逗号分隔的两个半径,
你能够创建椭圆体。
第一个参数指定南北距离,第二个参数指定东西距离。

  • //sphere <block> <radius>[,<radius>,<radius>] [raised?] [-h] 权限worldedit.generation.sphere

描述: 生成内部填充的球。
通过指定用逗号分隔的三个半径,
你能够创建椭球体。椭球体半径的距离的指定顺序为:
南北,上下,东西。

  • //ore <mask> <pattern> <size> <freq> <rarity> <minY> <maxY> 权限worldedit.generation.ore

描述: 生成矿物

  • //caves [size=8] [freq=40] [rarity=7] [minY=8] [maxY=127] [sysFreq=1] [sysRarity=25] [pocketRarity=0] [pocketMin=0] [pocketMax=3] 权限worldedit.generation.caves

描述: 生成网状的洞穴结构

  • //hcyl <pattern> <radius>[,<radius>] [height] 权限worldedit.generation.cylinder

描述: 生成中空的圆柱体。
通过指定用逗号分隔的两个半径,
你能够创建椭圆体。
第一个参数指定南北距离,第二个参数指定东西距离。

  • //ores 权限worldedit.generation.ore

描述: 生成矿物

  • //hsphere <block> <radius>[,<radius>,<radius>] [raised?] 权限worldedit.generation.sphere

描述: 生成中空的球体。
通过指定用逗号分隔的三个半径,
你能够创建椭球体。椭球体半径的距离的指定顺序为:
南北,上下,东西。

  • /forestgen [size] [type] [density] 权限worldedit.generation.forest

描述: 生成森林

  • //hpyramid <block> <size> 权限worldedit.generation.pyramid

描述: 生成中空的金字塔

  • /pumpkins [size] 权限worldedit.generation.pumpkins

描述: 生成南瓜群

  • //pyramid <block> <size> [-h] 权限worldedit.generation.pyramid

描述: 生成填充过的金字塔

  • //generatebiome <biome> <expression> [-h] [-r] [-o] [-c] 权限worldedit.generation.shape, worldedit.biome.set

描述: 根据表达式创建结构,表达式返回的值
应该是正数(返回true,如果选择点在结构内的话)
可选地,你可以设置目标方块的类型或数据。
可选参数:
-h 创建凹下去的结构
-r 使用原版Minecraft坐标
-o 与 -r 相似,但使用相对坐标。
-c 与 -r 相似,但相对坐标的中心不同。
如果你既没有没有输入 -r ,也没有输入 -o 的话,选区会自动映射为 -1..1
详见 tinyurl.com/wesyntax。



Biome 命令 [编辑|回到顶部]

(改变,列出或检查生物群系)


//setbiome <biome> [-p]

权限worldedit.biome.set
描述: 设置区域的生物群系。
默认生成的生物群系会使用你选区中所有的方块构成。
-p 会使用你当前所在的区块。

  • /biomeinfo [-p] [-t] 权限worldedit.biome.info

描述: 获取区块的生物群系。
默认获取的生物群系会检测你选区中所有的方块。
-t 使用你正在看着的那个区块。
-p 会使用你当前所在的区块。

  • /biomelist [page] 权限worldedit.biome.list

描述: 获取所有可用的生物群系。



Anvil 命令 [编辑|回到顶部]

(Manipulate billions of blocks: 更多信息)


/anvil count <ids> [-d]

权限worldedit.anvil.count
描述: 为选区中的方块计数

  • /anvil replace [from-block] <to-block> 权限worldedit.anvil.replace

描述: 用一种方块替换选区中的所有另一种方块

  • /anvil replaceall <folder> [from-block] <to-block> [-d] [-f] 权限worldedit.anvil.replaceall

描述: 用另一种方块替换选区中的所有方块
-d 标记会禁用通配符的匹配

  • /anvil copy 权限worldedit.anvil.copychunks

描述: 将区块延迟复制到你的anvil剪切板中

  • /anvil paste [-c] 权限worldedit.anvil.pastechunks

描述: 从anvil剪切板将内容粘贴出来。
-c 标记会调整将内容粘贴到区块中。

  • /anvil distr 权限worldedit.anvil.distr

描述: 用另一种方块替换选区中的所有方块

  • /anvil trimallplots 权限worldedit.anvil.trimallplots

描述: 修剪地皮世界中的区块
未认领的区块会被删除
未修改的区块会被删除
使用 -v 来删除没有人去过的区块

  • /anvil countall <folder> [hasSky] <id> [-d] 权限worldedit.anvil.countall

描述: 为世界中的方块计数

  • /anvil clear 权限worldedit.anvil.clear

描述: 清除选区的区块(不整理磁盘碎片就删除)

  • /anvil removelayers <id> 权限worldedit.anvil.removelayer

描述: 如果某一区块的顶层方块全部都匹配提供的方块类型的话,就移除顶层方块。

  • /anvil replacepattern [from-mask] <to-pattern> 权限worldedit.anvil.replace

描述: 移除选区内所有匹配模型的方块

  • /anvil remapall <folder> 权限worldedit.anvil.remapall

描述: 将世界在MCPE和PC的存档格式之间转换

  • /anvil deletealloldregions <folder> <time> 权限worldedit.anvil.deletealloldregions

描述: 移除一段时间内没有人进入的区域
你可以使用秒 (s), 分钟 (m), 小时 (h), 天 (d), 周 (w),和 年 (y) 来计算时间
(请注意:月份不是计算时间的单位)
举个例子: 8h5m12s

  • /anvil replaceallpattern <folder> [from-block] <to-pattern> [-d] [-m] 权限worldedit.anvil.replaceall

描述: 将选区中所有的方块替换成另一种

  • /anvil deleteallunvisited <folder> <age-ticks> [file-age=60000] 权限worldedit.anvil.deleteallunvisited

描述: 移除所有加载时间没有到指定整数刻的区块(20t = 1s) and
在创建文件后的文件持续时间 file-duration (ms) 内不能访问
没有在过去的 chunk-inactivity (ms)中使用。自动保存的间隔推荐是 file-durationchunk-inactivity 的值



Super Pickaxe 命令 [编辑|回到顶部]

(超级镐子相关命令: 更多信息)


/sp recur <radius>

权限worldedit.superpickaxe.recursive
描述: 启用递归超级镐子模式

  • /sp area <radius> 权限worldedit.superpickaxe.area

描述: 启用区域超级镐子模式

  • /sp single 权限worldedit.superpickaxe

描述: 启用单个方块的超级镐子模式



Navigation 命令 [编辑|回到顶部]

(关于玩家在地面上移动的相关命令: 更多信息)


/descend [# of floors]

权限worldedit.navigation.descend
描述: 向下降一层

  • /ascend [# of levels] 权限worldedit.navigation.ascend

描述: 向上升一层

  • /thru 权限worldedit.navigation.thru.command

描述: 穿过墙壁

  • /jumpto [world,x,y,z] 权限worldedit.navigation.jumpto.command

描述: 传送到某一位置

  • /ceil [clearance] [-f] [-g] 权限worldedit.navigation.ceiling

描述: 去天花板上

  • /up <block> [-f] [-g] 权限worldedit.navigation.up

描述: 向上移动一段距离

  • /unstuck 权限worldedit.navigation.unstuck

描述: 在卡在方块中的情况下逃脱



Snapshot 命令 [编辑|回到顶部]

(列出,读取快照以及查看跟快照有关的信息)


/snapshotlist [num]

权限worldedit.snapshots.list
描述: 列出某一快照

  • /snapshotafter <date> 权限worldedit.snapshots.restore

描述: 选择距离一个时间最近的快照,快照发布时间在该时间之后

  • /snapshotbefore <date> 权限worldedit.snapshots.restore

描述: 选择距离一个时间最近的快照,快照发布时间在该时间之前

  • /snapshotuse <snapshot> 权限worldedit.snapshots.restore

描述: 选择要使用的快照

  • /snapshotsel <index> 权限worldedit.snapshots.restore

描述: 选择根据列表ID排序的某一快照



Snapshot Util 命令 [编辑|回到顶部]

(更多信息)


/restore [snapshot]

权限worldedit.snapshots.restore
描述: 从某一快照恢复选区



Scripting 命令 [编辑|回到顶部]

(执行 CraftScript 脚本 更多信息)


/cs <filename> [args...]

权限worldedit.scripting.execute
描述: 执行一个 CraftScript 脚本

  • /.s [args...] 权限worldedit.scripting.execute

描述: 执行上一个 CraftScript 脚本



Chunk 命令 [编辑|回到顶部]

([旧版] 检索区块: 更多信息)


/chunkinfo

权限worldedit.chunkinfo
描述: 获得你当前所在的区块的有关信息

  • /listchunks 权限worldedit.listchunks

描述: 列出你的选取包括的区块

  • /delchunks 权限worldedit.delchunks

描述: 已过期,请使用 anvil 命令



Options 命令 [编辑|回到顶部]

(玩家切换设置和物品信息)


//searchitem <query> [-b] [-i]

描述: 搜索某个物品。
Flags:
-b 仅搜索方块
-i 仅搜索物品

  • //gtransform [transform] 权限worldedit.global-trasnform

描述: 获取全局变换式

  • //toggleplace 描述: 在你当前位置和第一个选取点直接切换位置
  • //tips 描述: 切换FAWE提示是否开启
  • //gsmask [mask] 权限worldedit.global-mask

描述: 能够应用给你的所有编辑的全局资源蒙版,你做出的资源性更改符合本蒙版(例如:剪切板中的方块)

  • //gmask [mask] 权限worldedit.global-mask

描述: 能够应用给你的所有编辑的全局目标蒙版,你所有的目标性更改都符合本蒙版(例如:世界中的方块)

  • //fast [on|off] 权限worldedit.fast

描述: 切换FAWE插件能否进行撤销操作



Brush Options 命令 [编辑|回到顶部]

(工具命令)


/target [mode]

描述: 在不同的目标模式之间切换

  • /size [pattern] 权限worldedit.brush.options.size

描述: 设置笔刷大小

  • //listbrush [mine|<filter>] [page=1] [-d] [-n] [-p] 权限worldedit.brush.list

描述: 列出所有笔刷路径下的笔刷
-p <页码数> 会列出指定页面

  • /mask [mask] 权限worldedit.brush.options.mask

描述: 设置笔刷的目标蒙版

  • /range [pattern] 权限worldedit.brush.options.range

描述: 设置笔刷的范围

  • /transform [transform] 权限worldedit.brush.options.transform

描述: 设置笔刷的变换式

  • /mat [pattern] 权限worldedit.brush.options.material

描述: 设置笔刷的材料

  • /patterns [page=1|search|pattern] 描述: 模型可以决定哪些方块被放置
    - 使用[括号]来输入参数
    - 使用 , 来代表 或 的分割
    举个例子: #surfacespread[10][#existing],andesite
    更多信息: https://git.io/vSPmA
  • /savebrush [name] 权限worldedit.brush.save

描述: 保存你当前的笔刷
使用 -g 标记来做出全局储存

  • /loadbrush [name] 权限worldedit.brush.load

描述: 读取笔刷

  • /transforms [page=1|search|transform] 描述: 变换方块被放置的方式
    - 使用[括号]来输入参数
    - 使用 , 来代表 或 的分割
    - 使用 & 来表示 和 的分割
    更多信息: https://git.io/v9KHO
  • /primary [brush arguments] 描述: 设置右键点击激活的笔刷
  • // [on|off] 权限worldedit.superpickaxe

描述: 切换超级镐子功能

  • /targetmask [mask] 描述: 设置目标蒙版
  • /none 描述: 从当前物品上解除绑定功能
  • /visualize [mode=0] 描述: 在不同的预览模式之间进行切换
    0 = 没有预览
    1 = 预览单个目标方块
    2 = 用玻璃预览所有将会改变的方块
  • /scroll [none|clipboard|mask|pattern|range|size|visual|target] 描述: 在不同的目标模式之间进行切换
  • /secondary [brush arguments] 描述: 设置左键点击激活的笔刷
  • /smask [mask] 权限worldedit.brush.options.mask

描述: 设置笔刷的资源蒙版

  • /masks [page=1|search|mask] 描述: 能够决定方块能否被放置的蒙版
    - 使用[括号]来输入参数
    - 使用 , 来代表 或 的分割
    - 使用 & 来表示 和 的分割
    举个例子: >[stone,dirt],#light[0][5],$jungle
    更多信息: https://git.io/v9r4K



Tool 命令 [编辑|回到顶部]

(将某些功能绑定到持有的物品之上: 更多信息)


/tool tree [type]

权限worldedit.tool.tree
描述: 生成树的工具

  • /tool repl <block> 权限worldedit.tool.replacer

描述: 方块替换工具

  • /tool info 权限worldedit.tool.info

描述: 方块信息工具

  • /tool lrbuild <leftclick block> <rightclick block> 权限worldedit.tool.lrbuild

描述: 大范围建筑工具

  • /tool cycler 权限worldedit.tool.data-cycler

描述: 方块数据值循环工具

  • /tool deltree 权限worldedit.tool.deltree

描述: 移除漂浮的树的工具

  • /tool inspect 权限worldedit.tool.inspect

描述: 选择检查笔刷

  • /tool floodfill <pattern> <range> 权限worldedit.tool.flood-fill

描述: 池塘填充工具

  • /tool farwand 权限worldedit.tool.farwand

描述: 远程选区工具



Brush 命令 [编辑|回到顶部]

(从远程建筑与涂画的工具。 更多信息)


/brush copypaste [depth=5]

权限worldedit.brush.copy
描述: 左键点击一个物体的底座来复制。
右键点击来粘贴
-r 标记能够在粘贴时应用随机旋转
注意:能和剪切板滚动一起搭配使用
视频: https://www.youtube.com/watch?v=RPZIaTbqoZw

  • /brush command <radius> [cmd1;cmd2...] 权限worldedit.brush.command

描述: 在点击的位置执行一条命令。
- 你的选区会延展到包括该点
- 可用的变量: {x}, {y}, {z}, {world}, {size}

  • /brush populateschematic <mask> <file|folder|url> [radius=30] [points=5] [-r] 权限worldedit.brush.populateschematic

描述: 选择分散型schematic笔刷。
-r 标记能够应用随机旋转

  • /brush scmd <scatter-radius> <points> <cmd-radius=1> <cmd1;cmd2...> 权限worldedit.brush.scattercommand

描述: 在表面的随机一点执行命令
- 分散的半径是每个点之间的最小距离
- 你的选区会延展到包括该点
- 可用的变量: {x}, {y}, {z}, {world}, {size}

  • /brush erode [radius=5] 权限worldedit.brush.erode

描述: 侵蚀地形

  • /brush pull [radius=5] 权限worldedit.brush.pull

描述: 将地形推向你

  • /brush blendball [radius=5] 权限worldedit.brush.blendball

描述: 平滑化,混合化地形
图片: https://i.imgur.com/cNUQUkj.png -> https://i.imgur.com/hFOFsNf.png

  • /brush stencil <pattern> [radius=5] [file|#clipboard|imgur=null] [rotation=360] [yscale=1.0] 权限worldedit.brush.stencil

描述: 使用高度图来画出地形表面。
-w 标记仅会应用于最大饱和度
-r 标记会应用随机旋转

  • /brush splatter <pattern> [radius=5] [seeds=1] [recursion=5] [solid=true] 权限worldedit.brush.splatter

描述: 设置物体表面为随机方块。
图片: https://i.imgur.com/hMD29oO.png
使用示例: /br splatter stone,dirt 30 15
注意:种子决定着会有多少斑点,递归次数决定着其大小,solid决定着模型是按照每个种子应用还是每个方块应用。

  • /brush cylinder <block> [radius=2] [height=1] [-h] 权限worldedit.brush.cylinder

描述: 创建圆柱体。
-h 标记会创建空心的圆柱体。

  • /brush shatter <pattern> [radius=10] [count=10] 权限worldedit.brush.shatter

描述: 创建将地形分成多个部分的不均匀的线
图片: https://i.imgur.com/2xKsZf2.png

  • /brush circle <pattern> [radius=5] 权限worldedit.brush.sphere

描述: 围绕着你看向的方向创建一个圆。
注意:无视笔刷的半径,并且启用预览可以帮助你看到将要放置的东西

  • /brush smooth [size=2] [iterations=4] [-n] 权限worldedit.brush.smooth

描述: 选择地形平滑化笔刷。
-n 标记会只让它更改自然生成的方块。

  • /brush ex [radius=5] 权限worldedit.brush.ex

描述: 火焰熄灭笔刷的快捷方式

  • /brush gravity [radius=5] [-h] 权限worldedit.brush.gravity

描述: 这个笔刷会模仿重力的作用。
-h 标记能够让它从世界的最大Y坐标开始计算,而不是点击方块的Y坐标。

  • /brush sspl <pattern> [size=0] [tension=0] [bias=0] [continuity=0] [quality=10] 权限worldedit.brush.surfacespline

描述: 在地面上创建一条曲线。
视频: https://www.youtube.com/watch?v=zSN-2jJxXlM

  • /brush spline <pattern> 权限worldedit.brush.spline

描述: 点击一些物体,然后再次点击相同的方块来让你的物体之间进行连接。
笔刷半径设置过小,或是点击位置错误或导致变形。形状必须是简单的线条或者封闭的环形。
图片: http://i.imgur.com/CeRYAoV.jpg -> http://i.imgur.com/jtM0jA4.png
图片2: http://i.imgur.com/bUeyc72.png -> http://i.imgur.com/tg6MkcF.png

  • /brush surface <pattern> [radius=5] 权限worldedit.brush.surface

描述: 使用高度图来画出表面。
-w 标记仅会应用于最大饱和度
-r 标记会应用随机旋转

  • /brush layer <radius> [color|<pattern1> <patern2>...] 权限worldedit.brush.layer

描述: 使用覆盖层来替换地形。
示例:/br layer 5 95:1 95:2 35:15 - 会在地面上放置一些覆盖层
图片: https://i.imgur.com/XV0vYoX.png

  • /brush sphere <pattern> [radius=2] [-h] 权限worldedit.brush.sphere

描述: 创建一个球体。
-h 标记能够创建中空的球体。

  • /brush clipboard 权限worldedit.brush.clipboard

描述: 选择剪切板笔刷。
-a 标记会使其不会粘贴空气方块。
不输入 -p 标记,粘贴后的内容的中心会出现在目标位置。输入该标记后,粘贴内容所在的位置就会根据你在复制内容时所站的位置而定义了。

  • /brush recursive <pattern-to> [radius=5] 权限worldedit.brush.recursive

描述: 设置所有连接起来的方块。
-d 标记会应用深度优先的顺序
注意:设置蒙版可以递归指定的方块

  • /brush scatter <pattern> [radius=5] [points=5] [distance=1] [-o] 权限worldedit.brush.scatter

描述: 在地面上随机放置方块,每两个方块之间有某种距离的联系。
-o 标记会覆盖原方块
视频: https://youtu.be/RPZIaTbqoZw?t=34s

  • /brush line <pattern> [radius=0] [-h] [-s] [-f] 权限worldedit.brush.line

描述: 创建线段。
-h 标记仅会创建外壳
-s 标记在创建之后会选择点击的点。
-f 标记会创建平坦的线段。

  • /brush height [radius=5] [file|#clipboard|imgur=null] [rotation=0] [yscale=1.00] [-h] 权限worldedit.brush.height

描述: 这个笔刷可以使地形上升或下降。
- -r 标记启用随机坐标旋转
- -l 标记也会在某些雪层中工作
- -s 标记禁用平滑
注意!注意!如果你要降低地形的话请将yscale的值设置为负数
雪的图片: https://i.imgur.com/Hrzn0I4.png

  • /brush butcher [radius=5] [-p] [-l] [-a] [-n] [-g] [-b] [-t] [-f] [-r] 权限worldedit.brush.butcher

描述: 击杀在指定的半径内的怪物。
可用的标记:
-p 也击杀宠物
-n 也击杀 NPC
-g 也击杀铁傀儡
-a 也击杀动物。
-b 也击杀中立生物
-t 也击杀带有名字的怪物
-f 相当于这以前所有标记的混合
-r 也击杀盔甲架
-l 目前啥都不能干

  • /brush flatten [radius=5] [file|#clipboard|imgur=null] [rotation=0] [yscale=1.00] [-h] 权限worldedit.brush.height

描述: 平坦笔刷,可以使地形平坦
- -r 标记启用随机坐标旋转
- -l 标记也会在某些雪层中工作
- -s 标记禁用平滑

  • /brush cliff [radius=5] [file|#clipboard|imgur=null] [rotation=0] [yscale=1.00] [-h] 权限worldedit.brush.height

描述: 这个笔刷可以平坦地形且创建悬崖。
- -r 标记启用随机坐标旋转
- -l 标记也会在某些雪层中工作
- -s 标记禁用平滑



/Masks [编辑|回到顶部]

(Help for the various masks. 更多信息)

蒙版决定了方块能否被放置 - 使用 [brackets] 来输入参数 - 使用 , 来代表 或 的分割 - 使用 & 来代表 和 的分割 例如: >[stone,dirt],#light[0][5],$jungle 更多信息: https://git.io/v9r4K


#offset <dx> <dy> <dz> <mask>

描述: 使蒙版偏移

  • % <chance> 描述: 百分比的几率
  • #id 描述: 限制初始ID
  • #data 描述: 限制初始数据值
  • { <min> <max> 描述: 限制方块与初始方块的距离范围
  • #existing 描述: 设置为非空气方块
  • $ <biome> 描述: 在特殊的生物群系中,要想列出所有的生物群系请使用 //biomelist
  • #surface 描述: 限制为地面(任何接触空气的固体方块
  • ! <mask> 描述: 使其他蒙版反向
  • = <expression> 描述: 表达式蒙版
  • #region 描述: 在某个提供的选取内部
  • \ <min> <max> 描述: 限制为特殊的地形角度
    -o 标记仅仅会覆盖,举个例子: /[0d][45d]
    作用解释:能够选出任何对角线在0-45度之间的方块
    示例:/[3][20]
    作用解释:能够选出任何对角线在3-20度之间的方块
  • #dregion 描述: 在玩家的选取之中
  • #xaxis 描述: 限制为特殊的x轴位置
  • #yaxis 描述: 限制为特殊的y轴位置
  • #opacity <min> <max> 描述: 限制为指定的不透明度等级
  • #light <min> <max> 描述: 限制为指定的光亮等级
  • #blocklight <min> <max> 描述: 限制为指定的方块亮度等级
  • #haslight 描述: 限制为方块是否拥有光照(天空或环境)
  • ~ <mask> [min=1] [max=8] 描述: 邻近的其他方块的数量
  • #brightness <min> <max> 描述: 限制指定的方块光照等级
  • #nolight 描述: 限制方块需要没有光亮(天空或环境)
  • #skylight <min> <max> 描述: 限制需要指定天空光亮等级
  • #simplex <scale=10> <min=0> <max=100> 描述: 使用噪声算法作为蒙版
  • #zaxis 描述: 限制为特殊的z轴位置
  • > <mask> 描述: 在某一指定方块的上面
  • #wall 描述: 限制为墙壁(任意方块,东西南北任意一面为空气)
  • | <mask> <min> <max> 描述: 旁边位置拥有指定数量的其他方块
  • #iddata 描述: 限制指定的方块ID与数据值
  • < <mask> 描述: 在某一指定方块之下
  • #solid 描述: 如果是固体方块



/Patterns [编辑|回到顶部]

(对于某些模板信息的帮助。 更多信息)

模板决定着放置什么方块 - 使用 [brackets] 输入参数 - 使用 , 来代表 或 的分割 举个例子: #surfacespread[10][#existing],andesite 更多信息: https://git.io/vSPmA


#offset <dx> <dy> <dz> <pattern>

描述: 使模板偏移

  • #mask <mask> <pattern-true> <pattern-false> 描述: 根据蒙版应用模板
  • #id <pattern> 描述: 只改变方块ID
  • #spread <dx> <dy> <dz> <pattern> 描述: 随机扩散方块
  • #buffer <pattern> 描述: 只有当模板在使用时才放置方块
    如果你不想点击某些地方两次时,用它和笔刷搭配
  • #clipboard 描述: 使用你剪切板中的方块作为模板
  • #relative <pattern> 描述: 将模板偏移到你所点击的位置
  • #data <pattern> 描述: 只会改变方块的数据值
  • #biome <biome> 描述: 设置生物群系
  • #existing 描述: 使用已经存在的方块
  • = <expression> 描述: 表达式模板: http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax
  • #simplex <scale=10> <pattern> 描述: 使用噪声算法来随机放置方块
  • #averagecolor <color> [randomize=true] [max-complexity=100] 描述: 在已经存在的方块和颜色之间平均化
  • #desaturate [percent=100] [randomize=true] [max-complexity=100] 描述: 减小已经存在的方块的颜色的饱和度
  • #darken [randomize=true] [max-complexity=100] 描述: 使已经存在的方块变暗
  • #fullcopy [schem|folder|url=#copy] [rotate=false] [flip=false] 描述: 将你全部的剪切板放置在每个方块上
  • #buffer2d <pattern> 描述: 只有在一列中的模板在使用时才会放置方块
  • #lighten [randomize=true] [max-complexity=100] 描述: 使已存在的方块变亮
  • #saturate <color> [randomize=true] [max-complexity=100] 描述: 增加已经存在的方块的颜色的饱和度
  • #anglecolor [randomize=true] [max-complexity=100] 描述: 依靠于地形偏角的较暗的方块
  • #iddatamask <bitmask=15> <pattern> 描述: 使用模板的ID和提供的蒙版的已存在的方块数据
    - 用于替换半砖,数据值需要换挡而不是设置
  • #angledata 描述: 根据已存在的地形偏角的方块数据
  • #!x <pattern> 描述: 本模板不会提供z轴的信息。
    举个例子: #!x[#!z[#~[#l3d[pattern]]]]
  • #!y <pattern> 描述: 本模板不会提供y轴的信息
  • #linear <pattern> 描述: 从列表的模板中循序设置方块
  • #!z <pattern> 描述: 本模板不会提供z轴的信息
  • #surfacespread <distance> <pattern> 描述: 随机改变地面上一个方块的位置
  • #linear3d <pattern> 描述: 使用 x,y,z 坐标选定一个来自列表中的方块
  • #solidspread <dx> <dy> <dz> <pattern> 描述: 随机传播固体方块
  • #color <color> 描述: 使用接近于指定颜色的方块



/Transforms [编辑|回到顶部]

(Help for the various transforms. 更多信息)

变换式会修改方块怎么被放置 - 使用 [brackets] 来输入参数 - 使用 , 来代表 或 的分割 - 使用 & 来代表 和 的分割 更多信息: https://git.io/v9KHO


#offset <dx> <dy> <dz> [transform]

描述: 偏移变换式

  • #rotate <rotateX> <rotateY> <rotateZ> [transform] 描述: 所有的变化都会被绕着指定位置旋转
  • #scale <dx> <dy> <dz> [transform] 描述: 所有的变化都会依比例决定
  • #pattern <pattern> [transform] 描述: 总是使用给定的模板
  • #spread <dx> <dy> <dz> [transform] 描述: 随机偏移变换式
  • #linear <transform> 描述: 从变换式列表中顺序选择变换式
  • #linear3d <transform> 描述: 使用 x,y,z 坐标选定一个来自列表中的变换式



配置

FAWE 开箱即用,非常高效,但是在限制和队列操作方面的配置设置对于对你的 FAWE 插件进行微调也很有用。请参考下列的内容以及默认配置文件中的注释行。

如果你将配置更改后发现编辑操作有问题的话,请在进行其他微调操作之前将那一项改成默认设置。

要想重置 config.yml 文件的话,请删除它然后重启服务器或使用 /fawe 命令重新载入 FAWE 插件。

异步操作

WorldEdit 自己会在放置方块之前尝试将每个编辑操作完全储存在内存之中。

WorldEdit 也会在内存中储存撤销(历史)方块,在大型编辑时这会增加内存的需求,甚至会导致服务器内存溢出崩溃,或导致编辑失败。

FAWE 提供了大量的速度改善,它将每个编辑操作都分割成了异步的线程。

并且只要可以放置方块之时,方块就会开始放置,而不是等待操作完成。

这让全局编辑的整体速度更快。

同时,因为方块在准备完毕之时就放置完成,它们不会占用内存空间。

FAWE 也能够配置将撤销(历史)方块储存在硬盘之上,这可以与其他性能的改善搭配使用,最终使 FAWE 近乎可以在最小的影响的情况下完成无限大小的编辑。

限制设置

这些设置能够让你控制一些用户组一次编辑可以放置的 WorldEdit 方块的数目。“default”(默认)小节就是为非管理组用户和没有权限跳过限制的用户所准备的。

查看 fawe.bypassfawe.admin 权限来获取更多信息。

你也能通过使用权限节点来定义某些特定用户组的限制,请查看下方的默认配置文件中的注释行。

队列设置

这小节中的设置能够让你微调异步队列操作,影响内存的使用情况与编辑速度。

本地队列

FAWE 会将每个编辑命令放在分割的异步线程之中,而不是服务器主线程,队列中的方块由每个玩家的本地队列来处理。

在队列中,方块按照区域来排序,这能够让 FAWE 使用更高效的优化算法,最终将方块放置(分配)进世界之中。

举个例子,WorldEdit会使用插件本体来执行光照和物理效果,然后发包,每个方块都会改变。

但是另一方面,FAWE将它队列中的方块按照区块分开检测,使用更高效的优化算法,将方块放置进世界中。

在编辑开始时,本地队列进入未完成阶段。

当需要处理的队列方块为简单的 //set 或者是 //copy 这种类型的命令时,方块已经直接准备好放置了。

当使用其他命令(例如 //smooth 和 //deform)来编辑方块时,变化的方块会根据世界上的其他方块的位置决定,并且相关联的方块可能要改变好几次。(代表性地,所有本地更改都会在64个值得方块变化的区块之中完成)

当编辑完全完成之后,本地队列变化成完成状态。

全局队列

FAWE 使用全局队列来真正将所有激活的本地队列的编辑方块放置。

全局队列的处理顺序是按照编辑的优先级的,所以提交时间较长的编辑会首先放置其中的方块。全局队列中的方块放置在世界中是在服务器的主线程上工作的。

FAWE 总是会放置在本地队列中完成的方块。同时,在放置未完成的本地队列中的方块之前,完成的本地队列的列表必须是空的。

全局队列和本地队列连接起来以后编辑正在开发中。(在代码内部这是作为两个队列而执行的,——一个是完成的本地队列,另一个是未完成的)

效率改善

FAWE 也尝试通过“在没有完成的本地队列时,放置未完成的本地队列中的方块”的方式来改善插件的效率。

  • target–size

FAWE 使用 target–size 来控制放置未完成队列中的方块数目,同时确保拥有放置的方块稳定不会再次改变的可能。

一些例如 //smooth 和 //deform 的命令,如果它们在命令仍然在处理中分配方块的话结果可能不会按照你想象的那样平滑或变形(虽然这些通常不会修改周围64个区块内的东西)。

这些方块的改变会依照世界上其他方块的位置,并且一些方块可能要多次改变。

在这种情况下,在64个区块进入队列之后任何单个方块都会被不会被重新修改了。

但是对于简单的操作来说不会有这种问题,例如 //copy 和 //set,因为这些方块不会进行多次的改变。

如果没有完成的本地队列等候放置方块,且target–size已设置更多在处理中的编辑区块进入队列的话,全局队列会直接开始处理仍然在处理中的可放置的方块。

这项设置能够确保像 //smooth 和 //deform 这样的命令稳定,同时它也能确保全局队列保持放置可用的方块,而不是闲置。

默认的 target–size 的值是64.

如果不设置 target–size 的话,使用 /fastmode 运行巨大的编辑会导致未完成的队列的填充速度比 max–wait–ms 设置的清空速度更快。

减少 target–size 可能会削弱像 //smooth 和 //deform 这样的命令的表现情况,因为花费在重新改变方块上的时间没了,方块已经放置了。

同时,也因为这些命令会依赖于其他方块的位置,如果 target–size 设置不够大的话,来自未完成队列中的方块会首先放置,但会晚些再改变,方块放置的最终结果和先处理完成再改变的最终结果会有所不同。

这会导致命令的表现不正确。

所以请将 target–size 选项的值设定的足够大来避免这个问题。

增加 target–size 的值可能不是很有帮助,因为大多数相关联的变更都是在64个区块的处理时间内完成的。

同时如果将它设置的很大的话,就会减少 FAWE 能够阻止大型编辑使服务器内存溢出的能力。

  • max–wait–ms

FAWE 对于放置已经完成处理的编辑的方块是非常高效的。

但是,等待完成既耗费时间,也占用内存,因此,本设置就是用来尝试将全局队列中的方块分配,而不是让它在编辑还没有完成,但有能放置的方块时闲置的。

全局队列会在没有完成的本地队列,且全局队列空闲时间比 max–wait–ms 所设置的时间长(单位为毫秒)时开始放置仍然在处理中的方块。

max–wait–ms 设置也能解决区块读取连接超时的问题。区块通常的读取速度都是小于一秒的,所以默认的 max–wait–ms 的值是 1000,用于避免编辑冻结或是区块读取错误。

如果区块没有及时加载的话请增加这个数值。

默认配置文件

默认的配置文件展示在了下面。

请注意服务器生成的配置文件是不带注释的。

# 前六项是不能配置的
issues: "https://github.com/boy0001/FastAsyncWorldedit/issues"
wiki: "https://github.com/boy0001/FastAsyncWorldedit/wiki/"
date: "27 Aug 2017 14:00:00 GMT"
build: "https://ci.athion.net/job/FastAsyncWorldEdit/<build>"
commit: "https://github.com/boy0001/FastAsyncWorldedit/commit/<hash>"
platform: "<platform>"
# 可用选项:de
# 请创建pull request来贡献翻译: https://github.com/boy0001/FastAsyncWorldedit/new/master/core/src/main/resources
language: ''
# 允许插件更新
update: true
# 将使用的统计发送到 mcstats.org
metrics: true
# FAWE 在没有足够的可用内存时会跳过处理区块
prevent-crashes: false
# 设置为 true 来启用 WorldEdit 对每个区域的限制。(例如: PlotSquared 或 WorldGuard)
# 要想在区域中启用 WorldEdit 的话,用户需要许可:
# fawe.<plugin>  权限。查看权限页面来获取支持的区域插件。
region-restrictions: true
# FAWE 在内存占用超过这个百分比时会取消非管理员做出的编辑
#  - 使用 `/wea` 或 `//fast` 或 `fawe.bypass` 跳过检测
#  - 写入 100 或 -1 禁用本项。
max-memory-percent: 95

clipboard:
  # 替代储存到内存中,将剪切板储存到硬盘上
  #  - 速度些许变慢
  #  - 每方块占用 2 字节
  use-disk: true
  # 压缩剪切板减少文件大小:
  #  - TODO: 目前还没有实现在硬盘上的压缩随机访问
  #  - 0 = 不进行压缩
  #  - 1 = 快速压缩
  #  - 2-17 = 较慢速度压缩
  compression-level: 1
  # 在删除之前储存在硬盘上的时间,单位为天
  delete-after-days: 1

lighting:
  # 是否应该在重新计算光照完成后再发包
  delay-packet-sending: true
  async: true
  # 重新计算光照的模式:
  #  - 0 = 无(不重新计算光照)
  #  - 1 = 优化(重新计算光源和改变的方块的光照)
  #  - 2 = 全局(缓慢重新计算每个方块的光照)
  mode: 1

# 一般的游戏刻限制(对 WorldEdit 来说不必要,但是可以防止滥用)
tick-limiter:
  # 是否启用限制
  enabled: true
  # 间隔,单位游戏刻
  interval: 20
  # 在每个间隔间最大的掉落方块数目(每区块)
  falling: 64
  # 每个间隔中最大执行的物理效果数目(每区块)
  physics: 8192
  # 每间隔最大生成的物品数目(每区块)
  items: 256

web:
  # 剪切板的网页接口
  #  - 所有的剪切板都匿名私有储存
  #  - 下载可以被用户删除
  #  - 支持剪切板的上传,下载和保存
  url: "http://empcraft.com/fawe/"
  # 资源的网页接口
  #  - 所有剪切板都是组织好后公开的
  #  - 资源能够被搜索,选择和下载
  assets: "http://empcraft.com/assetpack/"

extent:
  # 当这些插件拖慢了 WorldEdit 的操作速度时不要提示控制台
  #  - 如果你需要改变本选项时你会在控制台收到提示信息
  allowed-plugins: []
  # 当第三方延展插件安装后应该显示调试信息吗?
  debug: true

# 实验中的选项,你可以冒险试试
experimental:
  # [不安全] 直接修改区域文件(已过期——请使用Anvil命令)
  #  - 使用不当会导致世界错误!
  anvil-queue-mode: false
  # [安全] 动态增加渲染的区块的数目
  #  - 需要 Paper 服务端: ci.destroystokyo.com/job/PaperSpigot/
  #  - 将你的服务器视距上设置为 1 (spigot.yml, server.properties)
  #  - 取决于服务器的 tps 和玩家的移动
  #  - 请给我们提供反馈信息
  dynamic-chunk-rendering: false

# 这跟 FAWE 怎么放置区块相关联
queue:
  # 这个数值应该和你拥有的处理器的核数相同
  #  - 将此项设置为1,如果你需要可信的 `/timings` 的话
  parallel-threads: 8
  progress:
    # 显示一位用户的编辑的进度的恒定title
    #  - false = 禁用
    #  - title = 显示进度title
    #  - chat = 在聊天栏中显示进度
    display: "false"
    # 编辑进度多久显示一次
    interval: 1
    # 发送进度的延迟,单位毫秒(快些的话编辑不会刷屏)
    delay: 5000
  # 在编辑比这数目还多的区块时:
  #  - FAWE 会在所有运算完成之前直接开始放置方块
  #  - 大些的值会些微减少CPU的运算时间
  #  - 小写的值可以减少内存使用
  #  - 太小的值会导致一些操作坏掉(例如 deform)
  target-size: 64
  # 强制 FAWE 开始放置区块,不管一项编辑是否完成处理
  #  - 大些的值会些微减少CPU的运算时间
  #  - 小写的值可以减少内存使用
  #  - 太小的值会导致一些操作坏掉(例如 deform)
  max-wait-ms: 1000
  # 增加或减少队列强度(毫秒) [-50,50]:
  #     0 = 平衡性能与稳定性
  #     -10 = 为区块放置少分配 10ms
  # 值太大的话会造成卡顿(你可能感觉没关系)
  # 值太小的话编辑进度会很慢
  extra-time-ms: 0
  # 在提速操作之前读取多少数量的区块
  #  - 值太小的话会导致FAWE等待主线程的请求
  #  - 值太大的话会占用更多内存也不会感觉变快
  preload-chunks: 32
  # 抛弃已经闲置了一段时间(ms)的编辑
  #  - 例如:一款插件创建了 EditSession 但没有使用它做任何事
  #  - 这只会对不正确使用 WorldEdit 的旧版 API 的插件起作用
  discard-after-ms: 60000

history:
  # 历史记录是否应储存在硬盘上:
  #  - 空闲大量的内存
  #  - 服务器重启可以存留
  #  - 可以无限撤销
  #  - 不会影响编辑的性能,依照 `combine-stages`
  use-disk: true
  # 使用数据库来储存硬盘储存的概要:
  #  - 启用检测和回档
  #  - 不会影响性能
  use-database: true
  # 在分配时记录到历史中:
  #  - 速度更快,因为它避免了重复的方块检查
  #  - 压缩可能会糟糕一些,因为分配顺序不同
  combine-stages: true
  # 大些的压缩等级减少历史记录的大小,但以占用 CPU 使用率为代价
  # 0 = 不压缩字节数组(最快)
  # 1 = 1 级快速压缩(默认)
  # 2 = 2 x 快速
  # 3 = 3 x 快速
  # 4 = 1 x 中速, 1 x 快速
  # 5 = 1 x 中速, 2 x 快速
  # 6 = 1 x 中速, 3 x 快速
  # 7 = 1 x 慢速, 1 x 中速, 1 x 快速
  # 8 = 1 x 慢速, 1 x 中速, 2 x 快速
  # 9 = 1 x 慢速, 1 x 中速, 3 x 快速 (最佳压缩文件)
  # 注意:如果你使用硬盘的话,请最好使用压缩,因为较小的文件可以储存的更快
  compression-level: 3
  # 压缩的缓冲大小:
  #  - 较大 = 更好的比率,但是占用更多内存
  #  - 必须在以下范围中 [64, 33554432]
  buffer-size: 531441
  # 编辑时最大等待一个区块加载的时间,单位是毫秒。
  #  (50ms = 1 游戏刻, 0 = 最快).
  #  默认值 100 应该对大多数情况来说都是安全的。
  # 
  # 需要读取区块的操作(例如:复制)在没有及时读取区块时
  # 会使用上个区块作为过滤器,这会出现大量复制出的方块。
  # 每个读取区块的操作在读取区块时通常都需要25-50ms,在服务器卡顿时甚至更多。
  # 所以100ms的等待时间如果区块在10ms内加载完毕了的话也不需要等待100ms。
  # 
  # 本值也可以作为万一区块无法读取时(不管是什么原因)操作超时的值
  # 如果操作超时了的话,操作就会使用上个区块作为过滤器,
  # 然后显示出一条错误信息,在这种情况下,你需要要么将选区调整的更小,
  # 要么将本项的值设置的大一些。
  # 输入 0 这个值的速度会很快因为它即不会阻止读取区块也不会等待。
  chunk-wait-ms: 1000
  # 在几天之后删除硬盘上的历史记录
  delete-after-days: 7
  # 在玩家登出时是否删除内存中的历史记录(不影响硬盘存储)
  delete-on-logout: true
  # 对于一些使用 WorldEdit 的插件来说,历史记录是否默认启用:
  #  - 禁用本项速度会更快
  #  - 使用 FAWE API 的插件不会受影响
  enable-for-console: true
  # 是否储存反撤销的相关信息:
  #  - 历史记录文件要大大约 20%
  #  - 允许使用 /redo 命令
  store-redo: true
  # 仅记录所有比 4096x256x256 小的编辑:
  #  - 减少历史记录文件的大小大概10%
  small-edits: false

# 一些路径的文件夹名
paths:
  # 将任何Minecraft或Mod的Jar文件放在这里来使用方块的材质
  textures: "textures"
  heightmap: "heightmap"
  history: "history"
  # 群组服务器可以使用相同的剪切板
  clipboard: "clipboard"
  # 是否分离每个玩家schematic文件的路径
  per-player-schematics: true
# "default" 限制组会影响没有特殊限制权限的用户。
# 要想给某人不同的限制,请复制默认限制组
# 然后重新给他命个名(例如:newbie)。然后给予用户限制的
# 权限节点,使用该限制名(例如: fawe.limit.newbie  )
limits:
  default:
    # 能够同时运行的操作(例如:命令)
    max-actions: 1
    # 每次最大改变的方块数量(例如:使用 `//set stone` )。
    max-changes: 50000000
    # 每次最大检测的方块数量(例如:使用 `//count stone` 不会改变方块的命令)
    max-checks: 50000000
    # 一次更改失败的最大次数(例如:玩家没有访问该区域的权限)
    max-fails: 50000000
    # 最大允许的笔刷递归次数(例如: `//brush smooth` )
    max-iterations: 1000
    # 一次最大能够允许的实体数目(例如:牛)
    max-entities: 1337
    # 包括 Banner, Beacon, BrewingStand, Chest, CommandBlock, 
    # CreatureSpawner, Dispenser, Dropper, EndGateway, Furnace, Hopper, Jukebox, 
    # NoteBlock, Sign, Skull, Structure 的最大方块状态
    max-blockstates: 1337
    # 玩家历史文件的最大尺寸,单位是MB:
    #  - 超过这个尺寸的历史文件,不管是在硬盘上还是内存中都会被删除
    max-history-mb: -1
    # //calc 能够执行的每次操作的最大时间,单位毫秒 
    max-expression-ms: 50
    # 动画化方块放置:
    #  - 为方块放置增加延迟(ms/方块)
    #  - 使用虚伪的延迟会导致使用更多CPU与内存
    speed-reduction: 0
    # 放置区块,而不是单个方块:
    #  - 禁用本项会大幅度降低性能
    #  - 只有在与动画化方块放置冲突时才禁用本项
    fast-placement: true
    # WorldEdit 应该使用玩家的物品栏放置物品吗?
    # 0 = 不使用物品栏(创造模式)
    # 1 = 移除和放置都使用物品栏(免费建筑区)
    # 2 = 仅放置使用物品栏(生存模式)
    inventory-mode: 0
    # 大型的编辑是否需要确认(需要区块数目大于16384)
    confirm-large: true

Anvil-API

Anvil API 是用来修改未读取的 MCA 文件的。( <world>/region

有关的包: https://github.com/boy0001/FastAsyncWorldedit/tree/master/core/src/main/java/com/boydti/fawe/jnbt/anvil # 使用 FaweQueue

String worldName = "world";
boolean hasSky = true;
File root = new File(worldName + File.separator + "region");
MCAWorld world = new MCAWorld(worldName, root, hasSky);
MCAQueue queue = world.getQueue();
// 在这里使用FaweQueue来做些什么

创建 MCA 文件

请查看 HeightMapMCAGenerator

File dir = new File("TestWorld/region");
// 从高度图创建新生成器
// 注意:如果你不想使用图片的话,请使用另一个构造函数
BufferedImage heightMap = ImageIO.read(new URL("https://i.imgur.com/plFXYiI.png"));
// 我们的新生成器
HeightMapMCAGenerator gen = new HeightMapMCAGenerator(heightMap, dir);
// 加入一些峭壁
BufferedImage cliffHeightMap = ImageIO.read(new URL("https://i.imgur.com/wx5oiA7.png"));
boolean onlyWhite = false; // Only use the white parts of the heightmap
gen.setColumn(cliffHeightMap, new BaseBlock(BlockID.STONE), onlyWhite);
// 加入一些高草
gen.setOverlay(new BlockMask(gen, new BaseBlock(BlockID.GRASS)), new BaseBlock(BlockID.LONG_GRASS));
// 加入一些洞穴
gen.addCaves();
// 加入一些矿石
gen.addDefaultOres(new BlockMask(gen, new BaseBlock(BlockID.STONE)));
// 加入一些树
World world = WorldEdit.getInstance().getServer().getWorlds().get(0);
WorldData worldData = world.getWorldData();
File treeFolder = new File("trees");
ClipboardHolder[] trees = ClipboardFormat.SCHEMATIC.loadAllFromDirectory(treeFolder, worldData);
Mask flat = new AngleMask(gen, 0, 0); // Only flat terrain
boolean randomRotate = true;
gen.addSchems(flat, worldData, trees, 50, randomRotate);
// 你也能获得/设置指定的方块
// 注意:使用独特的方块的话,速度会比上面提供的方法更慢
gen.setBlock(0, 255, 0, new BaseBlock(BlockID.SPONGE)); // Set a specific block
System.out.println(gen.getLazyBlock(0, 255, 0)); // Get a specific block
// 好了,让我们创建世界吧!
gen.generate();

使用 EditSession

String worldName = "world";
boolean hasSky = true;
File root = new File(worldName + File.separator + "region");
MCAWorld world = new MCAWorld(worldName, root, hasSky);
EditSession editSession = new EditSessionBuilder(world)
    .checkMemory(false)
    .allowedRegionsEverywhere()
    .fastmode(true)
    .changeSetNull()
    .limitUnlimited()
    .build();
// 在这里使用 editSession 来做些什么(世界中没有被创建的区域不能被修改)

替换方块

String worldName = "world";
File root = new File(worldName + File.separator + "region");
MCAQueue queue = new MCAQueue(worldName, root, true);
MCAFilterCounter counter = queue.filterWorld(new MCAFilterCounter() {
    @Override
    public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong ignore) {
        if (block.getId() == 5) { // Change the id if it's 5
            block.setId(7);
        }
    }
});
// 看: FaweBlockMatcher.fromBlocks(...) 会在方块与指定类型匹配时返回 true
// 看: FaweBlockMatcher.setBlocks(...) 能够修改指定方块的类型

删除指定半径外的区块

MCAQueue queue = new MCAQueue(worldName, root, true);

final int radius = 4000;
final int radiusSquared = radius * radius;

queue.filterWorld(new MCAFilter() {
    @Override
    public MCAFile applyFile(MCAFile mca) {
        int distanceX = Math.abs((mca.getX() << 9) + 256) - 256;
        int distanceZ = Math.abs((mca.getZ() << 9) + 256) - 256;
        int distanceSquared = distanceX * distanceX + distanceZ * distanceZ;
        if (distanceSquared > radiusSquared) {
            // 因为这个区块超出半径,删除这个文件
            mca.close();
            mca.getFile().delete();
            return null;
        } else if (distanceSquared + 512 < radiusSquared) {
            // 因为这个 MCA 文件在指定半径内,不修改这个文件
            return null;
        } else {
            return mca;
        }
    }

    @Override
    public boolean appliesChunk(int cx, int cz) {
        int distanceX = Math.abs((cx << 9) + 8) - 8;
        int distanceZ = Math.abs((cz << 9) + 8) - 8;
        int distanceSquared = distanceX * distanceX + distanceZ * distanceZ;
        if (distanceSquared > radiusSquared) {
            // 区块在半径外
            return true;
        } else {
            // 我们不关心在半径内的区块
            return false;
        }
    }

    @Override
    public MCAChunk applyChunk(MCAChunk chunk) {
        chunk.setDeleted(true);
        // 我们不想修改方块
        return null;
    }
});

API

需要帮助?

如果你在写代码这方面需要帮助的话,请随意在 IRC 这里询问。

移植 WorldEdit API 的代码到 FAWE 中

首先,FAWE 不会修改 WorldEdit API 的表现,不过安装 FAWE 之后已经存在的代码会运行的更快。

使代码(使用 WorldEdit API的相关代码)异步工作和将它放入异步线程中一样简单(例如:使用Bukkit 的 scheduler)。

即便如此,FAWE API 也提供了目前 WorldEdit 所不能做到的一些额外功能。下面是一些 WorldEdit 和 FAWE 的例子:

Maven

储存库(Repository): http://ci.athion.net/job/FastAsyncWorldEdit/ws/mvn/
前置(Dependency): com.boydti:fawe-api:<version>com.boydti:fawe-api:latest

  1. Gradle 你能够使用Gradle来为FAWE编码,它已经在本储存库中了:
$ gradlew setupDecompWorkspace
$ gradlew build

线程

玩家

异步修改世界(或是读取世界)

NBT 与格式

NMS 相关概念

网页

其他功能

延展特性

FaweAPI 的类

https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/FaweAPI.java


AsyncWorld

AsyncWorld 实现了 Bukkit 世界接口,这能够让你异步访问世界或做出改变。 - 很多对象都能从接口中获得,可以被异步使用(坐标,方块,区块等等) - 只有对方块和生物群系的操控才能优化队列 - 其他操作在使用异步时只会变得更慢 - 你可以使用 AsyncWorld.create(...) 来异步读取某个世界

请注意: AsyncWorld 类只存在于 FastAsyncWorldEdit-bukkit ,而不是 API 中。

TaskManager.IMP.async(new Runnable() {
    @Override
    public void run() {
        // 使用给定的世界创建设定异步创建或读取世界
        AsyncWorld world = AsyncWorld.create(new WorldCreator("MyWorld"));
        // AsyncWorld world = AsyncWorld.wrap(bukkitWorld); // 或是封包已存在的世界
        Block block = world.getBlockAt(0, 0, 0);
        block.setType(Material.BEDROCK);
        // 在你完成更改之后,请写入
        world.commit();
    }
});

资源文件: https://github.com/boy0001/FastAsyncWorldedit/tree/master/bukkit0/src/main/java/com/boydti/fawe/bukkit/wrapper

一些关于异步性能的相关提示

https://github.com/c7w/FastAsyncWorldedit/wiki/Notes-on-async-performance 以及: https://github.com/c7w/FastAsyncWorldedit/wiki/Fawe-TaskManager#sync-task

笔刷

总览

FAWE 拥有能够让你在远处建筑或涂画的笔刷工具。当你启用了一个笔刷之后,笔刷就会绑定在你当前持有的物品上,你可以将不同的工具绑定在不同类型的物品上,单个物品最多绑定两个笔刷。

装备上你的笔刷:

绑定到任意点击上: /br <brush>
绑定到右键点击上: /br primary <brush>
绑定到左键点击上: /br secondary <brush>

修改笔刷设置

  • /transform <transform> - 放置方块处的变换式
  • /range <range> - 你能够使用笔刷的距离
  • /size <size> - 你的笔刷的大小(如:半径为10的球体)
  • /none - 取消工具的绑定 使用 -h 标志来改变你副手中笔刷的相关设定。

改变笔刷的目标位置

你可以改变笔刷对目标定位的相关设置来符合在不同区域建筑的需要(空气,墙,地面等等) 改变 //brush range 也会很有用。 /br target <0-3>
- 0 = 定位方块 - 1 = 定位直接指向的方块,距离由 Pitch 决定 - 2 = 定位一点,距离由自地面算起的高度决定 - 3 = 定位方块的面

增加笔刷行为

使用你的鼠标滚轮来改变笔刷表现 - /br scroll clipboard <file|folder|asset url>
- /br scroll mask <mask1> <mask2...>
- /br scroll pattern <mat1> <mat2...>
- /br scroll range
- /br scroll size
- /br scroll target

重设笔刷

潜行(shift)然后点击来重设笔刷。 这将会,举个例子,清除你的粘贴笔刷的剪切板,或者重设你的曲线笔刷的相关点。

显现笔刷的范围

使用 FAWE 你能够显现出笔刷将会怎么改变方块: /br vis <0-2>
- 0 = 不显现 - 1 = 显现单个点 - 2 = 所有将会改变的方块全部显现

视频: https://www.youtube.com/watch?v=xX-MTSLoNXw
图片: https://i.imgur.com/J2g6Qfn.jpg

笔刷:

要想列出所有笔刷的话,请查看命令页面。


剪切板-API

FAWE 安装之后,你就能使用 API 来注册一个新的 ClipboardFormat 了

 // (格式的名字,别名……)
ClipboardFormat.addFormat(new AbstractClipboardFormat("CUSTOM", "custom") {
    @Override
    public ClipboardReader getReader(InputStream inputStream) throws IOException {
        return new yourCustomClipboardReader();
    }

    @Override
    public ClipboardWriter getWriter(OutputStream outputStream) throws IOException {
        return new yourCustomClipboardWriter();
    }

    @Override
    public boolean isFormat(File file) {
        // 如果这个文件使用这个格式的话就返回 true (通常只会检查扩展名)
        return file.getName().endsWith(".custom");
    }

    @Override
    public String getExtension() {
        return "custom";
    }
});

然后格式就可以在游戏中使用了: //schem load <format> <file>

将区域复制到另一个世界

一些关于将一个世界中的区域复制到另一个世界的代码。

如果世界没有在使用中的话,Anvil API 处理的速度比这更快: - https://github.com/c7w/FastAsyncWorldedit/wiki/Anvil-API - 但是使用起来可能会很困难

EditSession copyWorld = new EditSessionBuilder("world").autoQueue(false).build(); // 请查看 https://github.com/boy0001/FastAsyncWorldedit/wiki/WorldEdit-EditSession
EditSession pasteWorld = new EditSessionBuilder("newWorld").build(); // 请查看 https://github.com/boy0001/FastAsyncWorldedit/wiki/WorldEdit-EditSession
Vector pos1 = new Vector(10, 3, 10);
Vector pos2 = new Vector(50, 90, 50);
CuboidRegion copyRegion = new CuboidRegion(pos1, pos2);

BlockArrayClipboard lazyCopy = copyWorld.lazyCopy(copyRegion);

Schematic schem = new Schematic(lazyCopy);
boolean pasteAir = true;
Vector to = new Vector(30, 10, 30);
schem.paste(pasteWorld, to, pasteAir);
pasteWorld.flushQueue();

从图片中创建地形

总览

从图片中创建 命令可以用于从大型的高度图中生成地形。

高度图可以使用 WorldMachine 生成,或在网上找到。

示例: FAWE-1.jpg

视频: - https://www.youtube.com/watch?v=pPR-w6cRNTc - https://www.youtube.com/watch?v=cJZk1GTig7A

前置插件: - PlotSquared (dev 构建版本)配置文件中 enabled-components.worlds 项设置为 true - 将任何带有你想要的材质的 jar 文件(例如你的 Minecraft 核心文件: .minecraft/versions/<version>/<version>.jar)放入 FastAsyncWorldEdit/textures 之中

命令用法

  • <arg> - 一个必需参数
  • [arg] - 一个可选参数
  • <arg1|arg2> - 提供的多选一选项
  • <arg=value> - 默认或建议你使用的值

开始

要想开始你需要指定想要的高度图(图床链接)和你想要使用的世界。 - 使用高度图: /2 cfi <url> - 使用固定大小: /2 cfi <width> <length>

查看下面这两条命令,在你完成之后请使用其中的一条: - /2 cfi done - /2 cfi cancel

修改世界

调色板

  • 地形能够通过使用图像染色。
  • 如果你想要使用颜色的话,你需要预先调整好调色板和其他设置。 ##### /2 cfi paletteComplexity <min=0> <max=100>
  • 根据它们的对比度来过滤方块,测量材质中有多少适合那个方块的对比度的颜色。
  • 使用 0 50 分别作为最小值与最大值会使用最简单的方块的50%来染色。 ##### /2 cfi paletteRandomization <enabled=true>
  • 默认是启用的,随机会为方块增加一些随机的颜色来匹配接近于给定图像上的颜色。
  • 如果禁用了的话,最接近于方块的颜色总是会被使用。 ##### /2 cfi paletteBlocks <block-list|#clipboard>
  • 仅允许某些方块能够用于染色 ##### /2 cfi paletteBiomePriority <percent=50>
  • 在使用 blockBiomeColor 时你可以增加或减少生物群系的优先级。
  • 默认的值是 50 。 ### 染色命令 ##### /2 cfi color <image-url>
  • 仅使用方块为地形染色 ##### /2 cfi glass <image-url>
  • 使用玻璃为地形染色(很奇特,但是从另一个角度来看也很奇怪) ##### /2 cfi biomeColor <image-url>
  • 使用生物群系为地形染色。

注意:使用生物群系染色不会改变方块: - 如果你将方块更改为除了草方块之外的别的方块你就什么都看不到了。

  • /2 cfi blockBiomeColor <image-url> - 使用方块和生物群系来为地形染色。
  • /2 cfi biome [url|mask] <biome> [white=false] 设置地图某些部分的生物群系。

- 如果使用图片了的话,生物群系有几率被设置,取决于像素点的色彩中白的程度(白色 #FFF = 100% 的几率)

- 是否仅为白色参数决定着是否仅设置图片上的白色值 - 如果使用了蒙版的话,生物群系在任何蒙版应用的地方都会被设置

高度设置

  • /2 cfi height <url|height>

- 设置地形的高度,取决于高度图图片或数值。

* /2 cfi waterHeight <height=0> 

- 改变水平面的生成高度。 - 默认水平面是禁用的(即值为0)

  • /2 cfi waterId <number-id> - 使用另外一种方块来代替水方块,例如你可能想使用岩浆。

杂项设定

  • /2 cfi overlay [url|mask] <pattern> [white=false]

- 改变作为覆盖层的方块(默认:none)

* /2 cfi main [url|mask] <pattern> [white=false]
- 改变作为填充层的方块(默认:stone) 
  • /2 cfi floor [url|mask] <pattern> [white=false]

- 改变作为顶层的方块(默认:grass)

* /2 cfi column [url|mask] <pattern> [white=false]
- 改变顶层和主方块。

其他选项

* /2 cfi caves 

- 生成洞穴

* /2 cfi ore[s] 
  • /2 cfi addores
- 增加默认的 Minecraft 原版矿石。 
  • /2 cfi ore <mask> <pattern> <size> <frequency> <rarity> <min-Y> <max-Y>
- 使用给定的模板和设置来生成矿石。 
  • /2 cfi schem [url] <mask> <file|folder|url> <rarity> <distance> <rotate>

- 在地形上使用schematic文件。

- 改变蒙版(例如:角蒙版)来仅在某些特殊的位置放置schematic文件中的内容。
- 稀有程度是一个在 0 到 100 之间的值。
  • /2 cfi blockBiomeColor <image-url>
- 使用方块和生物群系来为地形染色。
* /2 cfi biome [url|mask] <biome> [white=false] 设置地图某些部分的生物群系。
- 如果使用图片了的话,生物群系有几率被设置,取决于像素点的色彩中白的程度(白色 #FFF = 100% 的几率)
- 是否仅为白色参数决定着是否仅设置图片上的白色值 - 如果使用了蒙版的话,生物群系在任何蒙版应用的地方都会被设置 

高度设置

* /2 cfi height <url|height> 

- 设置地形的高度,取决于高度图图片或数值。

  • /2 cfi waterHeight <height=0>
- 改变水平面的生成高度。
- 默认水平面是禁用的(即值为0) 
  • /2 cfi waterId <number-id>

- 使用另外一种方块来代替水方块,例如你可能想使用岩浆。

杂项设定

* /2 cfi overlay [url|mask] <pattern> [white=false] 

- 改变作为覆盖层的方块(默认:none)

  • /2 cfi main [url|mask] <pattern> [white=false]

- 改变作为填充层的方块(默认:stone)

  • /2 cfi floor [url|mask] <pattern> [white=false]
- 改变作为顶层的方块(默认:grass)
* /2 cfi column [url|mask] <pattern> [white=false]
- 改变顶层和主方块。 

其他选项

* /2 cfi caves 

- 生成洞穴 * /2 cfi ore[s]

  • /2 cfi addores

- 增加默认的 Minecraft 原版矿石。

* /2 cfi ore <mask> <pattern> <size> <frequency> <rarity> <min-Y> <max-Y> 

- 使用给定的模板和设置来生成矿石。

* /2 cfi schem  [url] <mask> <file|folder|url> <rarity> <distance> <rotate>
- 在地形上使用schematic文件。 

- 改变蒙版(例如:角蒙版)来仅在某些特殊的位置放置schematic文件中的内容。

- 稀有程度是一个在 0 到 100 之间的值。

FawePlayer

要想得到new Player的话请使用 FawePlayer.wrap(玩家, uuid, 用户名, 等等)

这里是方法 - getWorld - getLocation - sendTitle - resetTitle - getLimit - getName - getUUID - hasPermission - setPermission - sendMessage - executeCommand - getPlayer - getSession - getSelection - setSelection - getCurrentRegions - getLargestRegion - hasWorldEditBypass - setMeta - getMeta - deleteMeta - getNewEditSession - runIfFree - runAsyncIfFree

请查看: https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/object/FawePlayer.java

FaweQueue

免责声明

FaweQueue 是修改世界最基础的类,当正确使用时处理速度很快。但替代使用这个,我推荐使用 Operations 或EditSession,因为它们可以将很抽象的任务简化,并且相对于FaweQueue的普通方法而言,它们可以提供更好的表现。如果你想让更能适应 Bukkit API 的话,你也可以使用 AsyncWorld

FaweQueue

FaweQueue 是从异步线程中修改世界的基础队列 - 使用它有效率地修改整个区块或其中的个别方块 - 查看 EditSession 或 AsyncWorld ,这些使用起来更简单,但是速度会慢些 - 如果你想控制更多的话,队列(queue)能够强制转换为 NMSMappedFaweQueue.

// 自动进入队列意味着方块会在它们被刷新之前开始放置
FaweQueue queue = FaweAPI.createQueue(worldName, autoQueue);
queue.setBlock(0, 0, 0, id, data);
queue.setBiome(0, 0, biome);
// 设置整个区块
FaweChunk<?> chunk = queue.getFaweChunk(5, 5);
chunk.fill(id, data);
chunk.addToQueue();
// 为位置重复相同任务
chunk = chunk.copy(true);
chunk.setLoc(queue, 5, 6);
chunk.addToQueue();

NMS 方法

对于一些支持的平台也有更多方法。你可以通过将 FaweQueue 类型来强制转换为 NMSMappedFaweQueue 来访问这些。 更多信息: https://github.com/c7w/FastAsyncWorldedit/wiki/Light-API

Fawe-TaskManager

异步任务

很基础的东西,但这是你可以使用 FAWE TaskManager 来运行异步任务的方法。

TaskManager.IMP.async(new Runnable() {
    @Override
    public void run() {
        // Do stuff here?
    }
});

同步任务

使用 FAWE TaskManager 你可以切换使用主线程(原来为异步处理)然后执行任务。

// 从异步线程中获得玩家背包内容
// 例如:方法异步处理不安全的话
PlayerInventory inventory = TaskManager.IMP.sync(new RunnableVal<PlayerInventory>() {
    @Override
    public void run(PlayerInventory value) {
        this.value = player.getInventory();
    }
});

什么时候使用这个? - 你想调用的方法使用异步处理不安全 - 使用异步处理任务会有性能问题

Jobs-API

一些类似于 Job API 的东西。

SetQueue

这个类中有成队列的本地队列。每个本地队列都是由成队列的区块改变组成的可能与 EditSession 相关联,它可能与一个玩家有关。

SetQueue 会检测激活和未激活的队列:

// 激活的队列已经完成了等候
Collection<FaweQueue> active = SetQueue.IMP.getActiveQueues();
// 未激活的队列可能还在等候其他区块改变或其他任务
Collection<FaweQueue> inactive = SetQueue.IMP.getInactiveQueues();
Collection<FaweQueue> all = SetQueue.IMP.getAllQueues();

示例:获得一名玩家等候队列中的方块!

你可以从这里获得一名玩家当前运行的 EditSessions :FawePlayer#getTrackedSessions
在每个 EditSession 中你能获得改变的方块: EditSession#getLimitUsed,但是这不会一定对应于当前队列中的方块(当队列任务完成后才能分配)。

你也可以通过使用 FaweQueue (EditSession#getQueue), 你可以获得激活的区块: FaweQueue#getFaweChunks, 然后每个激活的区块都可以强制转换类型为 CharFaweChunk 然后使用 CharFaweChunk#getTotalCount

撤销一次修改

在获取当前的 EditSession 之后,只要使用 EditSession#cancel 就好了。

Light-API

FaweQueue 有关联

获取当前的 NMS 队列

boolean autoQueue = false;
NMSMappedFaweQueue nmsQueue = (NMSMappedFaweQueue) SetQueue.IMP.getNewQueue("worldName", true, autoQueue);

相关联的方法 - relight(int x, int y, int z) - relightBlock(int x, int y, int z) - relightSky(int x, int y, int z) - setSkyLight(int x, int y, int z, int value) - setBlockLight(int x, int y, int z, int value)

相关联的类 - FaweQueue - MappedFaweQueue - NMSMappedFaweQueue

NBT-stream-API

安装 FAWE 以后,你能够在不将schem文件(schematic)或NBT不整体储存在内存中即可编辑它们。 - 如果文件太大而不适合装入内存的话,你就需要这样做 - 如果你想要从其中获得某些信息的话,你就需要这样做

// 让我们不将schematic文件加载到内存中,但从中读取一些信息吧
// Schematics 文件是被压缩储存的,所以在使用 NBTInputStream 之前我们首先需要使用 GZIPInputStream 
File file = new File("blah.schematic");
NBTInputStream is = new NBTInputStream(new GZIPInputStream(new FileInputStream(file)));
NBTStreamer streamer = new NBTStreamer(is);

// 获得长,宽,高
final Map<String, Short> dimensions = new HashMap<>();
// 你需要了解NBT文件的结构储存方式,这些特殊值都是用缩写储存的
streamer.addReader(new NBTStreamer.NBTStreamReader<Integer, Short>() {
    @Override
    public void run(Integer index, Short value) {
        // Index对这个来说是不那么重要的,但是如果想要做列表或数组的话它就很有用了
        dimensions.put(getNode(), value); // Put e.g. Schematic.Width -> 53
    }
}, "Schematic.Width", "Schematic.Height", "Schematic.Length");

// 让我们从其中获取实体吧,我知道它们将会是 CompoundTag 类型
streamer.addReader("Schematic.Entities.#", new NBTStreamer.NBTStreamReader<Integer, CompoundTag>() {
    @Override
    public void run(Integer index, CompoundTag entity) {
        // 对于 .# 和普通加载方式来说,它将会是 Index 和 Value
        // 在这里我们可以对每个实体进行不同的操作
    }
});

// 关于方块小节获得信息(也包括ID)(也可以使用 AddBlocks 和 Data)
streamer.addReader("Schematic.Blocks.?", new NBTStreamer.NBTStreamReader<Integer, Integer>() {
    @Override
    public void run(Integer length, Integer type) {
        Class<? extends Tag> clazz = NBTConstants.getClassFromType(type);
        // 这里我们可以做一些能够知道小节的长度和它的类型的事情
    }
});

// 现在我们就写好了我们想要的加载方式了,我们就可以读取文件了
streamer.readFully();
// 同时如果你想要 FAWE 在你找到你想找的东西之后停止读取的话,你也可以:
// streamer.readQuick();

System.out.println("Dimensions are: " + dimensions);

使用本 API 的类: - SchematicWriter 直接可写入压缩后的 schematic 文件的数据中 - The SchematicStreamer 会将一个 schematic 文件直接读取到剪切板上


发包

FAWE 能够在刷新区块或发送单独的方块变化时发送方块变化信息。

笔刷的预览就是后者的一个例子,这些方块改变只会发送给一个玩家(注意:服务器上的方块不需要改变)。

这就是用于优化仅发送 1 个方块(玻璃),然后稍后重置改变的 VisualExtent 。

VisualExtent extent = new VisualExtent(editSession.getExtent(), editSession.getQueue());
// 设置方块
extent.visualize(player);
// 一段时间后,重置所有方块
// 如果你同时也启用了另外一个预览效果的话,这个方法不会重置那其中的方块。
extent.clear(VisualExtent or null);

要想将指定的方块变化发送给一群玩家的话请使用 FaweQueue。

你可以使用任何 FaweChunk 中的类,例如 CharFaweChunk, VisualChunk 等等。

FaweQueue.sendBlockUpdate(FaweChunk, FawePlayer...);

粘贴 schematic 文件

粘贴 schematic 文件

File file = new File("path/to/schematic");
boolean noAir = false;
boolean entities = true;
Vector position = new Vector(0, 0, 0);
SchematicFormat.getFormat(file).load(file).paste(editSession, position, noAir, entities);
editSession.flushQueue();

// 如果你安装了 FAWE 的话作为替代你也能使用这个:
boolean allowUndo = true;
EditSession editSession = ClipboardFormat.SCHEMATIC.load(file).paste(world, position, allowUndo, !noAir, (Transform) null);

保存为 schematic 文件

File file = new File("mySchem.schematic");
Vector bot = new Vector(0, 0, 0);
Vector top = new Vector(50, 255, 50);
CuboidRegion region = new CuboidRegion(new BukkitWorld(world), bot, top);
Schematic schem = new Schematic(region);
schem.save(file, ClipboardFormat.SCHEMATIC);

权限

要想获得跟指令相关的权限请: 查看这里


管理员权限:

  • fawe.admin (允许通过使用 /wea 命令来跳过检测)
  • fawe.bypass (自动跳过 WorldEdit 的区域限制)
  • worldedit.anyblock (跳过 WorldEdit 插件的 disallowed-blocks 的限制)
  • worldedit.inventory.unrestricted (当背包限制启用时,跳过该限制)

用户权限:

  • fawe.limit.<限制组名> (给予玩家给定组的限制)
  • fawe.permpack.basic (对于创造服来说可以使用的一堆 WorldEdit 权限)
  • worldedit.navigation.jumpto.tool (能够使用 jumpto 魔杖的权限)
  • worldedit.navigation.thru.tool (能够使用 thru 魔杖的权限)

区域权限:

FAWE 模式是被区域所限制的,这对于想给予普通玩家 WorldEdit 权限的服务器来说是很有用的。要想起用区域限制,将配置文件中的 region-restrictions 设置设置为 true,然后给予玩家对应的区域权限。如果你想让管理员在任何地方都可以使用 WorldEdit 的话,请使用 //wea 命令,给予他们 fawe.admin 权限。

  • fawe.factions
  • fawe.plotsquared
  • fawe.plotsquared.member - 允许地皮的成员(/plot add)使用 WorldEdit
  • fawe.griefprevention
  • fawe.plotme
  • fawe.preciousstones
  • fawe.residence
  • fawe.towny
  • fawe.towny.*
  • fawe.worldguard
  • fawe.worldguard.member

延展的 WorldEdit 命令:

  • worldedit.schematic.load.other (在每个玩家的schematic储存文件分离时,允许玩家读取主schematic文件夹下的所有文件)
  • worldedit.schematic.save.other (在每个玩家的schematic储存文件分离时,允许玩家储存文件到主schematic文件夹下)

进度API

请注意:如果你想查看 EditSession 的工作进度的话,请使用下面这个 EditSession 事件作为代替: - wiki.sk89q.com/wiki/WorldEdit/API/Hooking_EditSession - 这样以后你需要在 FAWE 插件的配置文件中的 extent.allowed-plugins 项目添加 Settings.EXTENT.ALLOWED_PLUGINS 你的插件。

要想检测 EditSession 的工作进度或是队列的工作进度很简单:

editSession.getQueue().setProgressTracker(new RunnableVal2<ProgressType, Integer>() {
    @Override
    public void run(ProgressType type, Integer amount) {
        // FAWE 能够在完整尺寸知晓前就开始操作
        switch (type) {
            case QUEUE:
                // <amount> 正在队列中的区块
            case DISPATCH:
                // <amount> 已离开队列的区块
            case DONE:
                // 队列为空(已完成)
        }
    }
});

要想使用默认的进度追踪器(title标题)请查看: https://github.com/c7w/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/object/progress/DefaultProgressTracker.java

默认只有当队列中的区块数目大于64时消息才会提示(最大数目为 4,194,304 区块),不然的话它完成的太快了,但是你可以用这个自定义示踪器做你喜欢的事情。

恢复错误的 NBT 文件

注意:如果你需要帮助恢复文件的话请联系我(ticket,IRC等等)

如果一个NBT格式的文件部分损坏的话,还是能恢复部分数据的——只要压缩文件的开头还是完整的(如果它是压缩文件),且NBT TAG的名字还是完整的。

对于 GZIP 而言,不需要出现压缩格式。

CorruptSchematicReader 已经包括在 FAWE 插件中了,它可以恢复错误的schematic文件,但是它所使用的方法对于格式相似的MCA文件和其他以NBT为基础格式的文件也同样适用。

这是一段匹配 Width 标签且能够设置 width 变量的值的片段。

match("Width", new CorruptSchematicStreamer.CorruptReader() {
    @Override
    public void run(DataInputStream in) throws IOException {
        width.set(in.readShort());
    }
});

也有另外一种方法,能够猜出schematic文件所在的维度,它需要了解某些数据值的程度来了解是否缺少了维度标签: Vector guessDimensions(int volume, int width, int height, int length)

区域限制API

FAWE 可以限制玩家对 WorldEdit 的使用,需要配置文件中设置 Settings.REGION_RESTRICTIONS=true

注册提供器

FaweAPI.addMaskManager(new PlotSquaredFeature());

查看:https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSquaredFeature.java

注册自定义笔刷和命令

安装 FAWE 插件之后你可以注册你自己的笔刷和命令:

/**
 * 使用提供的别称创建一条命令以及注册类的所有方法作为子命令。<br>
 *  - 你应该尝试在安装时注册命令
 *  - 如果没有指定别称的话,所有的方法都会变成根命令
 * @param clazz 类中包含了所有的子命令方法
 * @param aliases 给予本命令的别称(也可以不设置)
 */
FaweAPI.registerCommands(Object clazz, String... aliases);

来自 BrushCommands 类的片段,注册圆柱体笔刷

@Command(
        aliases = { "cylinder", "cyl", "c" },
        usage = "<block> [radius] [height]",
        flags = "h",
        desc = "Choose the cylinder brush",
        help =
                "Chooses the cylinder brush.\n" +
                        "The -h flag creates hollow cylinders instead.",
        min = 1,
        max = 3
)
@CommandPermissions("worldedit.brush.cylinder")
public void cylinderBrush(Player player, LocalSession session, Pattern fill,
                          @Optional("2") double radius, @Optional("1") int height, @Switch('h') boolean hollow) throws WorldEditException {
    worldEdit.checkMaxBrushRadius(radius);
    worldEdit.checkMaxBrushRadius(height);
    BrushTool tool = session.getBrushTool(player);
    tool.setFill(fill);
    tool.setSize(radius);
    if (hollow) {
        tool.setBrush(new HollowCylinderBrush(height), "worldedit.brush.cylinder", player);
    } else {
        tool.setBrush(new CylinderBrush(height), "worldedit.brush.cylinder", player);
    }
    player.print(BBC.getPrefix() + BBC.BRUSH_SPHERE.f(radius, height));
}

圆柱体笔刷:

public class CylinderBrush implements Brush {

    private int height;

    public CylinderBrush(int height) {
        this.height = height;
    }

    @Override
    public void build(EditSession editSession, Vector position, Pattern pattern, double size) throws MaxChangedBlocksException {
        if (pattern == null) {
            pattern = new BlockPattern(new BaseBlock(BlockID.COBBLESTONE));
        }
        editSession.makeCylinder(position, Patterns.wrap(pattern), size, size, height, true);
    }

}

注册自定义蒙版,模板和变换式

安装 FAWE 插件后你能够注册你自己的蒙版,模板和变换式

FaweAPI.registerMasks(maskMethods);
FaweAPI.registerPatterns(patternMethods);
FaweAPI.registerTransforms(transformMethods);

将其中替换 - maskMethods 是像如下内容的类 这个 - patternMethods 是像如下内容的类 这个 - transformMethods 是像如下内容的类 这个

回滚API

如果你没有使用 WorldEdit 第三方的记录插件,例如 BlocksHub 的话,FAWE 插件内置了明显更快,且占用硬盘空间更少(压缩)的记录器。

需求

  • Settings.HISTORY.USE_DISK=true
  • Settings.HISTORY.USE_DATABASE=true

实现一次查找

数据库中只包含了编辑的列表和影响的区域,不是所有改变的方块。

要想执行一次完全回滚你需要读取每一次潜在的编辑的内容。

RollbackDatabase db = DBHandler.IMP.getDatabase(worldName);
boolean deleteAfterLookup = false;
// 搜索所有没有提供uuid的玩家
// 全部时间搜索,使用 0 为最小时间
// pos1 和 pos2 可以指定为单个点
db.getPotentialEdits(uuid, minTime, pos1, pos2, new RunnableVal<DiskStorageHistory>() {
    @Override
    public void run(DiskStorageHistory potentialEdit) {
        try {
            UUID uuid = potentialEdit.getUUID();
            String name = Fawe.imp().getName(uuid);
            int index = potentialEdit.getIndex();
            long age = System.currentTimeMillis() - potentialEdit.getBDFile().lastModified();
            String ageFormatted = MainUtil.secToTime(age / 1000);
            // 我现在想要读取编辑中每个方块的变化
            // 注意:也会有关于实体和掉落物的迭代器的变化
            //  - 或是使用 `potentialEdit.getIterator(dir)` 来检测所有变化
            Iterator<MutableFullBlockChange> iter = potentialEdit.getFullBlockIterator(false);
            while (iter.hasNext()) {
                MutableFullBlockChange change = iter.next();
                /* Maybe you only want to do something if the block is in a certain position?
                if (change.x != x || change.y != y || change.z != z) {
                    continue;
                }
                */
                // combinedId (查看 FaweCache#getId(combined), FaweCache#getData(combined))
                int from = change.from;
                int to = change.to;
                // 用这个信息来做些什么?
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}, new Runnable() {
    @Override
    public void run() {
        // 在查阅完成之后会运行这个
    }
}, deleteAfterLookup);

在使用FAWE API 的一些小提示

使用 FAWE API 的一些性能提示:

1. 使用 EditSessionBuilder ,同时请不要启用你用不到的东西。

查看这里。

2. 在可能时使用内置的迭代器:

// 幼稚的做法:
for (Vector pt : region) {
    BaseBlock block = editSession.getBlock(pt);
    // 做些什么
}
// 不错的做法:
// - 执行区块预读取
for (Vector pt : new FastIterator(region, editSession)) {
    BaseBlock block = editSession.getBlock(pt);
    // 做些什么
}

下列的类会执行区块预读取: - FastIterator - Fast2DIterator - FastChunkIterator - BreadFirstSearch - RegionVisitor

3. 使用已存在的功能或操作而不是设置单个方块:

// 幼稚的做法:单个方块改变
for (int x = 0; x <= 100; x++) {
    for (int z = 0; z <= 100; z++) {
        editSession.setBlock(x, 64, z, block);   
    }
}
// 不错的做法: 
//  - 执行区块预读取
//  - 执行整个区块而不是单个方块
//  - 并行处理一些东西
Region region = new CuboidRegion(new Vector(0, 64, 0), new Vector(100, 64, 100));
editSession.setBlocks(region, block);

4. 使用 FAWE 带来的 Sets 与 Collections

// 幼稚的做法:储存单个位置
Set<Vector> positions = new HashSet<>(); // 然后在这里储存一些方块的位置

// 不错的做法:
// - 更快速,仅仅占用八百分之一的内存
positions = new BlockVectorSet();

5. 避免调用 AsyncWorld 或 Actor 类中一些与非方块或生物群系相关联的方法:

FAWE 还没有将这些进行异步优化。尝试使用 TaskBuilder 来将它在主线程上分解。

TaskBuilder

总览

TaskBuilder 能够创建相继的同步或异步任务的简化版。 https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java ### 方法: - sync([Runnable|ReturnTask|ReceiveTask|Task]) - 在主线程上执行任务 - async([Runnable|ReturnTask|ReceiveTask|Task]) - 在主线程外执行任务 - delay([int|DelayedTask]) - 延迟几个游戏刻,然后再进行下个任务 - syncParallel([Runnable|ReturnTask|ReceiveTask|Task]) - 执行所有并行的下个 syncParallel 任务 - asyncParallel([Runnable|ReturnTask|ReceiveTask|Task]) - 执行所有并行的下个 asyncParallel 任务 - syncWhenFree([SplitTask|ReturnTask|ReceiveTask|Task]) - 在主线程空闲时执行任务 - abortIfTrue(Task<Boolean,Object>) - 如果为 true 停止所有进程 - build() - 开始执行 - buildAsync() - 从某一异步线程开始执行

多任务

输出数字 6

new TaskBuilder()
.async((ReturnTask<Integer>) () -> 5 + 1)
.sync((ReceiveTask) input -> System.out.println(input))
.build();

SplitTask 的示例

分离一个任务并且在主线程空闲时运行它。

// 在现实中你需要使用 EditSession, AsyncWorld,与 FaweQueue 的其中之一作为代替。
// 但这仅仅是你怎么使用 FAWE API 分离一个任务的示例

final World world = Bukkit.getWorld("world");
new TaskBuilder()
// 执行任务会被分成多个 20ms 的任务
.syncWhenFree(new TaskBuilder.SplitTask(20) {
    @Override
    public Object exec(Object previous) {
        for (int x = 0; x < 100; x++) {
            for (int y = 0; y < 100; y++) {
                for (int z = 0; z < 100; z++) {
                    world.getBlockAt(x, y, z).setType(Material.STONE);
                    // FAWE 会使用这个点来分离任务
                    // 你可以设置多个分离点
                    split();
                }
            }
        }
        // 我们不需要对于下个任务的结果
        return null;
    }
})
.build();

任务元数据

TaskBuilder 继承 Metadatable,所以你可以使用它储存临时数据: https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/object/Metadatable.java

final TaskBuilder task = new TaskBuilder();
task.sync(() -> {
    task.setMeta("blah", 5);
    return task.<Integer>getMeta("blah") + 56;
});

TextureUtil

注意:

  • 将带有你想要的材质的 jar 文件(例如 .minecraft/versions/<version>/<version>.jar)放入 FastAsyncWorldEdit/textures 文件夹中
  • 颜色使用 RGB(A) 颜色整数来表示,它可以通过使用 Color#getRGB() 获得。

构造函数

randomization = 方块会随机化拥有更加棒的本地颜色而不是照搬像素 Complexity 是一个方块的材质有多少种颜色,例如:石英方块就很低,TNT就很高 minComplexity, maxComplexity 是百分比值,对于 mc:1.11 我找到了 0, 73 为合适的值 > TextureUtil tu = Fawe.get().getCachedTextureUtil(randomization, minComplexity, maxComplexity)

要想指定方块我们可以使用 FilteredTextureUtil,它封包在 CachedTextureUtil 之中
> TextureUtil tu = new CachedTextureUtil(new FilteredTextureUtil(Fawe.get().getTextureUtil(), blocks))

方法

获得一个方块的平均颜色
> tu.getColor(BaseBlock block)

获取距离一个颜色最近的方块
> tu.getNearestBlock(int color)

getNextNearestBlock(getColor(block)) 的别称
> tu.getNearestBlock(BaseBlock block)

获取距离一个颜色最近的方块 —— 如果没有精准匹配的话,它会返回下面的最近的方块 > tu.getNextNearestBlock(int color)

为一种颜色获取最接近的玻璃+方块搭配。 它会返回 char { int glassCombinedId, int blockCombinedId }
combinedId 为 (id << 4) + 数据值,请查看 FaweCache.getId(combined), FaweCache.getData(combined)
> tu.getNearestLayer(int color)

获取比这亮的最近的方块
> tu.getLighterBlock(BaseBlock block)

获取比这暗的最近的方块
> tu.getDarkerBaseBlock block)

从一个生物群系ID获得 BiomeColor 对象
从 biomeRegistry 中获得生物群系ID
BiomeRegistry biomeRegistry = FaweAPI.getWorld(worldName).getWorldData().getBiomeRegistry()
> tu.getBiome(int biome)

获得对一个颜色来说最接近的 BiomeColor 对象
> tu.getNearestBiome(int color)

变换式

变换式能够应用在笔刷上或在全局中,它可以修改方块变化的位置和方式。

又见: http://wiki.sk89q.com/wiki/WorldEdit/Region_operations#Deforming_regions



用法

多个变换式

使用半角逗号 (,) 来随机从列表中使用一个变换式,例如: #offset[0][1][0],#pattern[wood] (将方块向上偏移一个位置,或是将它变成木头)

使用这个符号 (&) 来为一个方块使用多个变换式,例如: #offset[0][1][0]&#pattern[wood] (将方块向上偏移一个位置,且将它变成木头) #### 参数 变换式的参数应该写在方括号之中,例如: #offset[0][1][0]



设置变换式

//gtransform [transforms...]

权限: worldedit.global-transform
描述: 设置全局变换式 #### //transform [transform...] 权限: worldedit.brush.options.transform
描述: 设置笔刷的变换式(将多个变换式用空格 ` 或者半角冒号:` 分割)

>> 点这里查看变换式的列表……

网页接口API

FAWE 能够让你从一个兼容且配置过的网页服务器中上传或下载 schematic 文件。

有关的配置选项

web:
  # 我已经在这里为你配置好了一个网页接口了
  url: "http://empcraft.com/fawe/"

网页软件

https://github.com/boy0001/plotupload + custom style

上传剪切板

如果返回了 null 的话,那就是指示上传失败了。

URL url = FaweAPI.upload(clipboard, format);

下载:

URL base = new URL(Settings.WEB.URL);
URL url = new URL(base, "uploads/" + uuid + ".schematic");
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
InputStream in = Channels.newInputStream(rbc);
// 读取并粘贴字符(假设它是 schematic 格式)等等
EditSession editSession = ClipboardFormat.SCHEMATIC.load(in).paste(world, position, allowUndo, !noAir, (Transform) null);

WorldEdit 和 FAWE 的模板

某些变换方块的命令就用到了模板。举个例子: //set <模板>//material <模板>



用法

方块

使用方块的名字或者ID (举个例子: stone)。要想查看更多信息请查看 方块数据用法页面 #### 多模板 使用半角逗号 (,) 来随机使用一个模板。要想指定几率你可以使用 % ,举个例子: 80%stone,20%planks #### 参数 模板的参数应该放入方括号之中,举个例子: #simplex[10][stone,wood]

>> 点这里查看模板列表……

WorldEdit-EditSession

EditSession 是 WorldEdit 用来在世界中制造并记录变化的。EditSessionBuilder 能够让你你完全控制它。 - 你必须提供世界,查看 FaweAPI.getWorld(...)

示例:

EditSession editSession = new EditSessionBuilder(world).fastmode(true).build();

不设置参数会使用它们的默认值: - player: 做出编辑的玩家(默认是 null) - limit: 方块,实体或操作限制(默认是玩家的限制或无限制) - changeSet: 存储变更(默认是 config.yml 中的值) - allowedRegions: 允许可编辑的区域(默认是玩家能够编辑的区域,或是所有地方) - autoQueue: 在 flushQueue() 之前的改变(默认是 true) - fastmode: 跳过记录历史(默认是玩家的快速模式或是 config.yml 中设置不记录历史) - checkMemory: 是否启用内存剩余过低检查(默认是玩家的快速模式是否启用或 true) - combineStages: 历史记录是否结合分配(默认是配置文件中的配置) - blockBag: 使用的 blockbag (默认是 null) - eventBus: 使用的 eventBus (默认是 null) - event: 要调用的事件 (默认是 null)

请查看:https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java

这是非 FAWE 插件的示例:

// 如果没有玩家做出变更
EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(worldEditWorld, -1);
// 指定特殊玩家
editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(worldEditWorld, -1, actor);

// 用 EditSession 做些什么
editSession.setBlock(new Vector(x, y, z), new BaseBlock(id, data));
// 在调用 flushQueue 之后就会开始变更
editSession.flushQueue();

这是一个结合 FAWE 插件的示例:

EditSession editSession = new EditSessionBuilder(world).fastmode(true).build();
editSession.setBlock(new Vector(x, y, z), new BaseBlock(id, data));
editSession.flushQueue();

撤销 EditSession 的修改

Where editSession is what you are undoing.

// 用你喜欢的方式创建 EditSession 
EditSession newEditSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(editSession.getWorld(), -1, null, null);
// 撤销操作
editSession.undo(newEditSession);
editSession.flushQueue();

WorldEdit Fawe 蒙版列表

蒙版

蒙版是限制方块什么时候能够放置出来的,举个例子:只在石头下方放置方块。

全局蒙版会应用于所有编辑中,笔刷蒙版只会应用于当前笔刷上。



用法

方块

使用方块的名字或ID(例如: stone)。要想获得更多信息请查看 方块数据用法 #### 多个蒙版 使用 ,(或) 或者 &(和) 来分割多个蒙版,举个例子: grass,$desert #### 参数 蒙版的参数应该写在方括号之中,例如: #offset[0][5][3]



设置蒙版

//gmask [masks...]

权限: worldedit.global-mask 描述: 全局目标蒙版,应用到你做的所有编辑中,蒙版跟目标方块有关(即世界中的方块)。 #### //gsmask [masks...] 权限: worldedit.global-mask
描述: 全局资源蒙版,应用到你做的所有编辑中,蒙版跟资源方块有关(例如:你剪切板中的方块)

        1. //mask [masks...] 权限: worldedit.brush.options.mask

描述: 设置笔刷的目标蒙版 #### //smask [masks...] 权限: worldedit.brush.options.mask
描述: 设置笔刷的资源蒙版

>> 点这里来查看所有蒙版……

WorldEdit World 与 Player

WorldEdit 拥有插件自己提供的 Player 和 World 的类,一些方法就需要这个。

获得 WE 的 World 对象:

WorldEdit.getInstance().getServer().getWorlds();
// 或者特别使用 Bukkit
BukkitUtil.getLocalWorld(bukkitWorld);

获取玩家对象

// Bukkit
WorldEditPlugin worldEdit = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
worldedit.wrapPlayer(bukkitPlayer);
// Forge
ForgeWorldEdit.inst.wrap(entityPlayer);
// FAWE 的变更
FawePlayer.wrap(uuid or username or actor or player object here).getPlayer();

要想异步使用请查看,例如: PlayerWrapper.wrap(player) - PlayerWrapper (WorldEdit Player) - WorldWrapper (WorldEdit World)