<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mineplugin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shugen</id>
	<title>Minecraft插件百科 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://mineplugin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shugen"/>
	<link rel="alternate" type="text/html" href="https://mineplugin.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Shugen"/>
	<updated>2026-05-06T04:04:49Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mineplugin.org/index.php?title=WorldEdit/CraftScript&amp;diff=1976</id>
		<title>WorldEdit/CraftScript</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=WorldEdit/CraftScript&amp;diff=1976"/>
		<updated>2016-01-09T09:20:36Z</updated>

		<summary type="html">&lt;p&gt;Shugen：​翻译了几句话&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[分类:开发教程]]&lt;br /&gt;
{{模板:待翻译}}&lt;br /&gt;
&lt;br /&gt;
WorldEdit里的脚本可以让你不用Java和编译你的代码，方便地写一个操控世界的代码。这个脚本在WorldEdit中被称作&#039;&#039;CraftScripts&#039;&#039;，并且这一切都基于JavaScript和你的&#039;&#039;&#039;craftscripts/&#039;&#039;&#039; 文件. 使用基于WorldEdit写的脚本有这些优点:&lt;br /&gt;
&lt;br /&gt;
* 能够与WorldEdit的 undo（撤销）/redo（反撤销） 功能对接&lt;br /&gt;
* 能够使用WorldEdit来优化编辑方块的操作&lt;br /&gt;
* 允许使用WorldEdit强大的方块类型语法 //set sign:3|How|are|you?&lt;br /&gt;
* 能够轻易获取用户选择的区域空间&lt;br /&gt;
&lt;br /&gt;
此脚本需要通过Mozilla Rhino JavaScript在Java 6 或更高版本上运行。但是，如果WorldEdit的路径下有一个独立的Rhino版本，它会被优先使用。为了最大化的兼容性，请在Rhino的Java稳定版本上编写脚本。&lt;br /&gt;
脚本支持在v0.8时曾被移除。在v2.13后，脚本支持被重新加入。然而v0.8或更低的版本的脚本并不能兼容。&lt;br /&gt;
{{warning|请不要运行来自不受信任的来源的脚本。}}&lt;br /&gt;
&lt;br /&gt;
请查看 [http://docs.sk89q.com/ WorldEdit的API文档].&lt;br /&gt;
&lt;br /&gt;
== 介绍 ==&lt;br /&gt;
&lt;br /&gt;
脚本有以下在他们的命名空间中的三个变量：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; is an instance of [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html CraftScriptContext]&lt;br /&gt;
* &amp;lt;code&amp;gt;player&amp;lt;/code&amp;gt; is a copy of the player, an instance of [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/LocalPlayer.html LocalPlayer]&lt;br /&gt;
* &amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt; 是一个String类型的Java数组&lt;br /&gt;
&lt;br /&gt;
想要运行一个脚本，请使用指令 /cs YourScript.js&lt;br /&gt;
&lt;br /&gt;
== 在方块上工作 ==&lt;br /&gt;
&lt;br /&gt;
在WorldEdit中所有的方块编辑操作都基于一个 &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/EditSession.html EditSession]&amp;lt;/code&amp;gt;. 这个对象会自动处理历史和方块放置的顺序。为了得到你自己的脚本的一个编辑样本，请使用：&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var sess = context.remember();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
任何时候你调用这个方法，你都会得到一个新的 &amp;lt;code&amp;gt;EditSession&amp;lt;/code&amp;gt;, 所以一定要保持一个左右。要设置一个方块，而不是给一个方块的物品ID。你给一个&amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/BaseBlock.html BaseBlock]&amp;lt;/code&amp;gt;. 这是因为方块包含各种各样的数据（如箱子方块里面的物品），如果只有方块类型ID的话，很多数据就会被丢失。 &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; is an independent representation of a block; it doesn&#039;t know where it is in the world. 这意味着你可以传递一个&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; 到任何地方并重复使用他。 &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;s remember block type and block data. For more complex blocks such as signs and chests, you will use a &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; derivative such as &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/SignBlock.html SignBlock]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
举个例子:&amp;lt;br/&amp;gt;&lt;br /&gt;
Setting a cloth block with color value 4&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
var sess = context.remember();&lt;br /&gt;
sess.setBlock(player.getBlockOn(), new BaseBlock(BlockID.CLOTH, 4));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
标记这个是因为 &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; 是在&#039;&#039;com.sk89q.worldedit.blocks&#039;&#039; 的命名空间,它必须被引入先. &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/BlockID.html BlockID]&amp;lt;/code&amp;gt; 有一个方块类型的列表. The first argument for &amp;lt;code&amp;gt;setBlock()&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/Vector.html Vector]&amp;lt;/code&amp;gt; indicating the position in the world.&lt;br /&gt;
&lt;br /&gt;
想要得到方块，使用基于&amp;lt;code&amp;gt;EditSession&amp;lt;/code&amp;gt;的&amp;lt;code&amp;gt;getBlock()&amp;lt;/code&amp;gt;函数。你将也能得到一个&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 处理参数 ==&lt;br /&gt;
&lt;br /&gt;
Arguments由&amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt;变量传递。如果你需要去检查用户提供的参数是不是正确的，你可以用 &amp;lt;code&amp;gt;CraftScriptContext.[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#checkArgs%28int,%20int,%20java.lang.String%29 checkArgs]()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
举个例子:检查参数&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你要去处理一个方块名字使其成为&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;, 你可以使用 &amp;lt;code&amp;gt;CraftScriptContext.[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#getBlock%28java.lang.String%29 getBlock]()&amp;lt;/code&amp;gt;. 这个方法可以检查方块黑名单, however. 如果你需要一个方块去, 比如说, 替换, 你可以 ignore the blacklist by [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#getBlock%28java.lang.String,%20boolean%29 adding a boolean &amp;quot;true&amp;quot; for a third parameter].&lt;br /&gt;
&lt;br /&gt;
举个例子:Getting the passed in block&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&lt;br /&gt;
var block = context.getBlock(argv[1]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户输入的是一个无效的方块会怎么样？会抛出一个异常。并且如果你没有去捕捉他，用户就会被提示这个异常，然后这个脚本就会被终止，不再进行下去。&lt;br /&gt;
&lt;br /&gt;
== 配合使用Java包 ==&lt;br /&gt;
&lt;br /&gt;
你可以通过使用以下的语法来引入一个Java包:&lt;br /&gt;
&lt;br /&gt;
 importPackage(Packages.package.name.here);&lt;br /&gt;
&lt;br /&gt;
注意：如果你安装了Mozilla&#039;s Rhino库，则不需要&amp;quot;Packages.&amp;quot;前缀，但为了保持在默认的Java Rhino上运行的稳定性，&amp;quot;Packages.&amp;quot;前缀是推荐的。&lt;br /&gt;
当安装了以后，你可以使用所有Java的扩展库，以及所有WorldEdit的类。&lt;br /&gt;
&lt;br /&gt;
== 例程 ==&lt;br /&gt;
&lt;br /&gt;
例子:设置附近的发射器装满箭&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
&lt;br /&gt;
var session = context.remember();&lt;br /&gt;
var origin = player.getPosition();&lt;br /&gt;
&lt;br /&gt;
var arrows = new BaseItemStack(262, 64);&lt;br /&gt;
&lt;br /&gt;
var items = [arrows, arrows, arrows,&lt;br /&gt;
             arrows, arrows, arrows,&lt;br /&gt;
             arrows, arrows, arrows]&lt;br /&gt;
&lt;br /&gt;
for (var x = -4; x &amp;lt;= 4; x++) {&lt;br /&gt;
    for (var y = -4; y &amp;lt;= 4; y++) {&lt;br /&gt;
        for (var z = -4; z &amp;lt;= 4; z++) {&lt;br /&gt;
            var pt = origin.add(x, y, z);&lt;br /&gt;
            var id = session.getBlockType(pt);&lt;br /&gt;
            &lt;br /&gt;
            if (id == BlockID.DISPENSER) {&lt;br /&gt;
                var block = session.getBlock(pt);&lt;br /&gt;
                block.setItems(items);&lt;br /&gt;
                session.setBlock(pt, block);&lt;br /&gt;
                &lt;br /&gt;
                player.print(&amp;quot;Arrows set @ &amp;quot; + pt);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Maze generation script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit);&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
&lt;br /&gt;
context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var sess = context.remember();&lt;br /&gt;
&lt;br /&gt;
// This may throw an exception that is caught by the script processor&lt;br /&gt;
var block = context.getBlock(argv[1]);&lt;br /&gt;
var w = argv.length &amp;gt; 2 ? parseInt(argv[2]) : 5;&lt;br /&gt;
var h = argv.length &amp;gt; 3 ? parseInt(argv[3]) : 5;&lt;br /&gt;
&lt;br /&gt;
function id(x, y) {&lt;br /&gt;
    return y * (w + 1) + x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function $x(i) {&lt;br /&gt;
    return i % (w + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function $y(i) {&lt;br /&gt;
    return Math.floor(i / (w + 1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function shuffle(arr) {&lt;br /&gt;
    var i = arr.length;&lt;br /&gt;
    if (i == 0) return false;&lt;br /&gt;
    while (--i) {&lt;br /&gt;
        var j = Math.floor(Math.random() * (i + 1));&lt;br /&gt;
        var tempi = arr[i];&lt;br /&gt;
        var tempj = arr[j];&lt;br /&gt;
        arr[i] = tempj;&lt;br /&gt;
        arr[j] = tempi;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var stack = [];&lt;br /&gt;
var visited = {};&lt;br /&gt;
var noWallLeft = new Array(w * h);&lt;br /&gt;
var noWallAbove = new Array(w * h);&lt;br /&gt;
var current = 0;&lt;br /&gt;
&lt;br /&gt;
stack.push(id(0, 0))&lt;br /&gt;
&lt;br /&gt;
while (stack.length &amp;gt; 0) {&lt;br /&gt;
    var cell = stack.pop();&lt;br /&gt;
    var x = $x(cell), y = $y(cell);&lt;br /&gt;
    visited[cell] = true;&lt;br /&gt;
    &lt;br /&gt;
    var neighbors = []&lt;br /&gt;
    &lt;br /&gt;
    if (x &amp;gt; 0) neighbors.push(id(x - 1, y));&lt;br /&gt;
    if (x &amp;lt; w - 1) neighbors.push(id(x + 1, y));&lt;br /&gt;
    if (y &amp;gt; 0) neighbors.push(id(x, y - 1));&lt;br /&gt;
    if (y &amp;lt; h - 1) neighbors.push(id(x, y + 1));&lt;br /&gt;
    &lt;br /&gt;
    shuffle(neighbors);&lt;br /&gt;
    &lt;br /&gt;
    while (neighbors.length &amp;gt; 0) {&lt;br /&gt;
        var neighbor = neighbors.pop();&lt;br /&gt;
        var nx = $x(neighbor), ny = $y(neighbor);&lt;br /&gt;
        &lt;br /&gt;
        if (visited[neighbor] != true) {&lt;br /&gt;
            stack.push(cell);&lt;br /&gt;
            &lt;br /&gt;
            if (y == ny) {&lt;br /&gt;
                if (nx &amp;lt; x) {&lt;br /&gt;
                    noWallLeft[cell] = true;&lt;br /&gt;
                } else {&lt;br /&gt;
                    noWallLeft[neighbor] = true;&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                if (ny &amp;lt; y) {&lt;br /&gt;
                    noWallAbove[cell] = true;&lt;br /&gt;
                } else {&lt;br /&gt;
                    noWallAbove[neighbor] = true;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            stack.push(neighbor);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var origin = player.getBlockIn();&lt;br /&gt;
&lt;br /&gt;
for (var y = 0; y &amp;lt;= h; y++) {&lt;br /&gt;
    for (var x = 0; x &amp;lt;= w; x++) {&lt;br /&gt;
        var cell = id(x, y)&lt;br /&gt;
        if (!noWallLeft[cell] &amp;amp;&amp;amp; y &amp;lt; h) {&lt;br /&gt;
            sess.setBlock(origin.add(x * 2 - 1, 0, y * 2), block);&lt;br /&gt;
            sess.setBlock(origin.add(x * 2 - 1, 1, y * 2), block);&lt;br /&gt;
        }&lt;br /&gt;
        if (!noWallAbove[cell] &amp;amp;&amp;amp; x &amp;lt; w) {&lt;br /&gt;
            sess.setBlock(origin.add(x * 2, 0, y * 2 - 1), block);&lt;br /&gt;
            sess.setBlock(origin.add(x * 2, 1, y * 2 - 1), block);&lt;br /&gt;
        }&lt;br /&gt;
        sess.setBlock(origin.add(x * 2 - 1, 0, y * 2 - 1), block);&lt;br /&gt;
        sess.setBlock(origin.add(x * 2 - 1, 1, y * 2 - 1), block);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shugen</name></author>
	</entry>
	<entry>
		<id>https://mineplugin.org/index.php?title=WorldEdit/CraftScript&amp;diff=1948</id>
		<title>WorldEdit/CraftScript</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=WorldEdit/CraftScript&amp;diff=1948"/>
		<updated>2016-01-05T14:56:02Z</updated>

		<summary type="html">&lt;p&gt;Shugen：​/* 在方块上工作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[分类:开发教程]]&lt;br /&gt;
{{模板:待翻译}}&lt;br /&gt;
&lt;br /&gt;
WorldEdit里的脚本可以让你不用Java和编译你的代码，方便地写一个操控世界的代码。这个脚本在WorldEdit中被称作&#039;&#039;CraftScripts&#039;&#039;，并且这一切都基于JavaScript和你的&#039;&#039;&#039;craftscripts/&#039;&#039;&#039; 文件. 使用基于WorldEdit写的脚本有这些优点:&lt;br /&gt;
&lt;br /&gt;
* 能够与WorldEdit的 undo（撤销）/redo（反撤销） 功能对接&lt;br /&gt;
* 能够使用WorldEdit来优化编辑方块的操作&lt;br /&gt;
* 允许使用WorldEdit强大的方块类型语法 //set sign:3|How|are|you?&lt;br /&gt;
* 能够轻易获取用户选择的区域空间&lt;br /&gt;
&lt;br /&gt;
此脚本需要通过Mozilla Rhino JavaScript在Java 6 或更高版本上运行。但是，如果WorldEdit的路径下有一个独立的Rhino版本，它会被优先使用。为了最大化的兼容性，请在Rhino的Java稳定版本上编写脚本。&lt;br /&gt;
脚本支持在v0.8时曾被移除。在v2.13后，脚本支持被重新加入。然而v0.8或更低的版本的脚本并不能兼容。&lt;br /&gt;
{{warning|请不要运行来自不受信任的来源的脚本。}}&lt;br /&gt;
&lt;br /&gt;
请查看 [http://docs.sk89q.com/ WorldEdit的API文档].&lt;br /&gt;
&lt;br /&gt;
== 介绍 ==&lt;br /&gt;
&lt;br /&gt;
脚本有以下在他们的命名空间中的三个变量：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; is an instance of [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html CraftScriptContext]&lt;br /&gt;
* &amp;lt;code&amp;gt;player&amp;lt;/code&amp;gt; is a copy of the player, an instance of [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/LocalPlayer.html LocalPlayer]&lt;br /&gt;
* &amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt; 是一个String类型的Java数组&lt;br /&gt;
&lt;br /&gt;
想要运行一个脚本，请使用指令 /cs YourScript.js&lt;br /&gt;
&lt;br /&gt;
== 在方块上工作 ==&lt;br /&gt;
&lt;br /&gt;
在WorldEdit中所有的方块编辑操作都基于一个 &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/EditSession.html EditSession]&amp;lt;/code&amp;gt;. 这个对象会自动处理历史和方块放置的顺序。为了得到你自己的脚本的一个编辑样本，请使用：&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var sess = context.remember();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
任何时候你调用这个方法，你都会得到一个新的 &amp;lt;code&amp;gt;EditSession&amp;lt;/code&amp;gt;, 所以一定要保持一个左右。要设置一个方块，而不是给一个方块的物品ID。你给一个&amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/BaseBlock.html BaseBlock]&amp;lt;/code&amp;gt;. 这是因为方块包含各种各样的数据（如箱子方块里面的物品），如果只有方块类型ID的话，很多数据就会被丢失。 &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; is an independent representation of a block; it doesn&#039;t know where it is in the world. 这意味着你可以传递一个&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; 到任何地方并重复使用他。 &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;s remember block type and block data. For more complex blocks such as signs and chests, you will use a &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; derivative such as &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/SignBlock.html SignBlock]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
举个例子:&amp;lt;br/&amp;gt;&lt;br /&gt;
Setting a cloth block with color value 4&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
var sess = context.remember();&lt;br /&gt;
sess.setBlock(player.getBlockOn(), new BaseBlock(BlockID.CLOTH, 4));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that because &amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt; is in the &#039;&#039;com.sk89q.worldedit.blocks&#039;&#039; namespace, it had to be imported first. &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/blocks/BlockID.html BlockID]&amp;lt;/code&amp;gt; has a list of block types. The first argument for &amp;lt;code&amp;gt;setBlock()&amp;lt;/code&amp;gt; is a &amp;lt;code&amp;gt;[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/Vector.html Vector]&amp;lt;/code&amp;gt; indicating the position in the world.&lt;br /&gt;
&lt;br /&gt;
想要得到方块，使用基于&amp;lt;code&amp;gt;EditSession&amp;lt;/code&amp;gt;的&amp;lt;code&amp;gt;getBlock()&amp;lt;/code&amp;gt;函数。你将也能得到一个&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 处理参数 ==&lt;br /&gt;
&lt;br /&gt;
Arguments由&amp;lt;code&amp;gt;argv&amp;lt;/code&amp;gt;变量传递。如果你需要去检查用户提供的参数是不是正确的，你可以用 &amp;lt;code&amp;gt;CraftScriptContext.[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#checkArgs%28int,%20int,%20java.lang.String%29 checkArgs]()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
举个例子:检查参数&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你要去处理一个方块名字使其成为&amp;lt;code&amp;gt;BaseBlock&amp;lt;/code&amp;gt;, 你可以使用 &amp;lt;code&amp;gt;CraftScriptContext.[http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#getBlock%28java.lang.String%29 getBlock]()&amp;lt;/code&amp;gt;. 这个方法可以检查方块黑名单, however. 如果你需要一个方块去, 比如说, 替换, 你可以 ignore the blacklist by [http://docs.sk89q.com/worldedit/apidocs/com/sk89q/worldedit/scripting/CraftScriptContext.html#getBlock%28java.lang.String,%20boolean%29 adding a boolean &amp;quot;true&amp;quot; for a third parameter].&lt;br /&gt;
&lt;br /&gt;
举个例子:Getting the passed in block&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&lt;br /&gt;
var block = context.getBlock(argv[1]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果用户输入的是一个无效的方块会怎么样？会抛出一个异常。并且如果你没有去捕捉他，用户就会被提示这个异常，然后这个脚本就会被终止，不再进行下去。&lt;br /&gt;
&lt;br /&gt;
== 配合使用Java包 ==&lt;br /&gt;
&lt;br /&gt;
你可以通过使用以下的语法来引入一个Java包:&lt;br /&gt;
&lt;br /&gt;
 importPackage(Packages.package.name.here);&lt;br /&gt;
&lt;br /&gt;
注意：如果你安装了Mozilla&#039;s Rhino库，则不需要&amp;quot;Packages.&amp;quot;前缀，但为了保持在默认的Java Rhino上运行的稳定性，&amp;quot;Packages.&amp;quot;前缀是推荐的。&lt;br /&gt;
当安装了以后，你可以使用所有Java的扩展库，以及所有WorldEdit的类。&lt;br /&gt;
&lt;br /&gt;
== 例程 ==&lt;br /&gt;
&lt;br /&gt;
例子:设置附近的发射器装满箭&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
&lt;br /&gt;
var session = context.remember();&lt;br /&gt;
var origin = player.getPosition();&lt;br /&gt;
&lt;br /&gt;
var arrows = new BaseItemStack(262, 64);&lt;br /&gt;
&lt;br /&gt;
var items = [arrows, arrows, arrows,&lt;br /&gt;
             arrows, arrows, arrows,&lt;br /&gt;
             arrows, arrows, arrows]&lt;br /&gt;
&lt;br /&gt;
for (var x = -4; x &amp;lt;= 4; x++) {&lt;br /&gt;
    for (var y = -4; y &amp;lt;= 4; y++) {&lt;br /&gt;
        for (var z = -4; z &amp;lt;= 4; z++) {&lt;br /&gt;
            var pt = origin.add(x, y, z);&lt;br /&gt;
            var id = session.getBlockType(pt);&lt;br /&gt;
            &lt;br /&gt;
            if (id == BlockID.DISPENSER) {&lt;br /&gt;
                var block = session.getBlock(pt);&lt;br /&gt;
                block.setItems(items);&lt;br /&gt;
                session.setBlock(pt, block);&lt;br /&gt;
                &lt;br /&gt;
                player.print(&amp;quot;Arrows set @ &amp;quot; + pt);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Maze generation script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit);&lt;br /&gt;
importPackage(Packages.com.sk89q.worldedit.blocks);&lt;br /&gt;
&lt;br /&gt;
context.checkArgs(1, 3, &amp;quot;&amp;lt;block&amp;gt; [width] [height]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var sess = context.remember();&lt;br /&gt;
&lt;br /&gt;
// This may throw an exception that is caught by the script processor&lt;br /&gt;
var block = context.getBlock(argv[1]);&lt;br /&gt;
var w = argv.length &amp;gt; 2 ? parseInt(argv[2]) : 5;&lt;br /&gt;
var h = argv.length &amp;gt; 3 ? parseInt(argv[3]) : 5;&lt;br /&gt;
&lt;br /&gt;
function id(x, y) {&lt;br /&gt;
    return y * (w + 1) + x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function $x(i) {&lt;br /&gt;
    return i % (w + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function $y(i) {&lt;br /&gt;
    return Math.floor(i / (w + 1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function shuffle(arr) {&lt;br /&gt;
    var i = arr.length;&lt;br /&gt;
    if (i == 0) return false;&lt;br /&gt;
    while (--i) {&lt;br /&gt;
        var j = Math.floor(Math.random() * (i + 1));&lt;br /&gt;
        var tempi = arr[i];&lt;br /&gt;
        var tempj = arr[j];&lt;br /&gt;
        arr[i] = tempj;&lt;br /&gt;
        arr[j] = tempi;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var stack = [];&lt;br /&gt;
var visited = {};&lt;br /&gt;
var noWallLeft = new Array(w * h);&lt;br /&gt;
var noWallAbove = new Array(w * h);&lt;br /&gt;
var current = 0;&lt;br /&gt;
&lt;br /&gt;
stack.push(id(0, 0))&lt;br /&gt;
&lt;br /&gt;
while (stack.length &amp;gt; 0) {&lt;br /&gt;
    var cell = stack.pop();&lt;br /&gt;
    var x = $x(cell), y = $y(cell);&lt;br /&gt;
    visited[cell] = true;&lt;br /&gt;
    &lt;br /&gt;
    var neighbors = []&lt;br /&gt;
    &lt;br /&gt;
    if (x &amp;gt; 0) neighbors.push(id(x - 1, y));&lt;br /&gt;
    if (x &amp;lt; w - 1) neighbors.push(id(x + 1, y));&lt;br /&gt;
    if (y &amp;gt; 0) neighbors.push(id(x, y - 1));&lt;br /&gt;
    if (y &amp;lt; h - 1) neighbors.push(id(x, y + 1));&lt;br /&gt;
    &lt;br /&gt;
    shuffle(neighbors);&lt;br /&gt;
    &lt;br /&gt;
    while (neighbors.length &amp;gt; 0) {&lt;br /&gt;
        var neighbor = neighbors.pop();&lt;br /&gt;
        var nx = $x(neighbor), ny = $y(neighbor);&lt;br /&gt;
        &lt;br /&gt;
        if (visited[neighbor] != true) {&lt;br /&gt;
            stack.push(cell);&lt;br /&gt;
            &lt;br /&gt;
            if (y == ny) {&lt;br /&gt;
                if (nx &amp;lt; x) {&lt;br /&gt;
                    noWallLeft[cell] = true;&lt;br /&gt;
                } else {&lt;br /&gt;
                    noWallLeft[neighbor] = true;&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                if (ny &amp;lt; y) {&lt;br /&gt;
                    noWallAbove[cell] = true;&lt;br /&gt;
                } else {&lt;br /&gt;
                    noWallAbove[neighbor] = true;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            stack.push(neighbor);&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var origin = player.getBlockIn();&lt;br /&gt;
&lt;br /&gt;
for (var y = 0; y &amp;lt;= h; y++) {&lt;br /&gt;
    for (var x = 0; x &amp;lt;= w; x++) {&lt;br /&gt;
        var cell = id(x, y)&lt;br /&gt;
        if (!noWallLeft[cell] &amp;amp;&amp;amp; y &amp;lt; h) {&lt;br /&gt;
            sess.setBlock(origin.add(x * 2 - 1, 0, y * 2), block);&lt;br /&gt;
            sess.setBlock(origin.add(x * 2 - 1, 1, y * 2), block);&lt;br /&gt;
        }&lt;br /&gt;
        if (!noWallAbove[cell] &amp;amp;&amp;amp; x &amp;lt; w) {&lt;br /&gt;
            sess.setBlock(origin.add(x * 2, 0, y * 2 - 1), block);&lt;br /&gt;
            sess.setBlock(origin.add(x * 2, 1, y * 2 - 1), block);&lt;br /&gt;
        }&lt;br /&gt;
        sess.setBlock(origin.add(x * 2 - 1, 0, y * 2 - 1), block);&lt;br /&gt;
        sess.setBlock(origin.add(x * 2 - 1, 1, y * 2 - 1), block);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shugen</name></author>
	</entry>
</feed>