Minecraft(我的世界)中文论坛

标题: [WorldEdit]CraftScript脚本 - 编写出你想要的WE功能! [~3200字]

作者: LocusAzzurro    时间: 2016-3-10 00:03
本帖最后由 LocusAzzurro 于 2016-3-9 19:05 编辑

CraftScript 安装与使用例子

CraftScript为WorldEdit中的一个脚本系统(以下简称CS),提供了使用JavaScript调用WorldEdit功能来实现自己需要的功能的平台。我们可以安装其他人开发的CS脚本来为WorldEdit添加额外的功能(与我们为Minecraft添加Mod是差不多的意思),也可以按自己的需要编写一个脚本。本部分将会讲到WorldEdit中使用已编写好的CS的方法。

安装Rhino

首先,为了能使用CS,我们需要安装Mozilla Rhino作为我们的脚本解析器,只有这样我们才能正常使用脚本。

Rhino下载页面:
https://developer.mozilla.org/en ... hino/Download_Rhino

在此页面中选择需要的版本点击Download link一栏下的链接进行下载,这里我们下载的是版本1.7R5 (一般情况下可以下载最新版本,不过1.7R5目前较为稳定),下载链接位置如下图标示位置。


下载的文件为zip压缩包,在解压缩后其中有一系列文件,在这些中我们需要的是 js.jar ,如下图标示出的。




在找到文件后,需要将其放置在服务端的 plugins 文件夹中 (与其他插件jar文件放在一起)。




这样,我们的解析器就安装完成了,在服务器下一次启动时就会被加载。

安装脚本

现在,我们需要创建一个存放CS脚本的文件夹,我们需要在plugins文件夹中,WorldEdit文件夹下创建一个名为craftscripts 的文件夹,在这个文件夹中来存放要使用的脚本。





接下来只要下载我们需要的脚本并放进之前创建的文件夹,重载WorldEdit就可以使用了,这里我将会使用WorldEdit官方的四个脚本中的maze.js迷宫生成脚本来展示一个使用例子。

WorldEdit CraftScript GitHub页:
https://github.com/sk89q/WorldEd ... ontrib/craftscripts

如下图这里有官方的四个脚本,这里我们使用其中的maze.js





可以看到我从GitHub中复制了maze.js的源码并将文件放置到了craftscripts文件夹中。




这里提示一个可能出现的后台错误,由于js.jar不是一个插件,在服务器启动时可能会出现下面的插件无法加载的错误,这属于正常现象。




在安装了maze.js之后,我查看了WorldEdit百科来了解这个脚本使用时需要的参数,可以看到需要的参数分别为block,width,length,即使用的方块,迷宫宽度,迷宫高度。在这里提示一下,安装脚本时建议仔细查看它的使用方式,发布脚本时也记得介绍脚本的使用方式与需要的参数。





接下来我们登陆服务器来进行测试,运行脚本有三个指令,分别为:
/cs <脚本名> [参数] - 用给出的参数运行目标脚本
/<脚本名>.js [参数] - 上一个指令的快捷方式
/.s [参数] - 使用新给出的参数再次运行最后运行过的脚本

<脚本名> 为脚本文件的名称,即存储在craftscripts文件夹下的脚本的文件名
[参数] 为执行脚本时使用的参数,具体数量与每个参数的意义根据每个脚本而不同(见上一步)

这里我们使用的指令是
  1. /cs maze 1 10 10
复制代码

即使用原石方块生成一个宽度10高度10的迷宫。





输入指令后,便成功生成了迷宫。





作者: LocusAzzurro    时间: 2016-3-10 00:03
本帖最后由 LocusAzzurro 于 2016-3-9 19:06 编辑

WorldEdit 官方CraftScript脚本使用讲解
先前我们讲解了使用CS需要的的前置步骤,现在我们来看一下官方提供的4个脚本

脚本介绍与安装
WorldEdit官方脚本共有四个,本文主要介绍其中的maze.js与roof.js,另外两个脚本quickshot.js与draw.js均有不同程度的错误与兼容性问题故不进行介绍。

如下图,官方的脚本列表





安装官方脚本时需要前往对应脚本的GitHub页面来获取相应的代码(后文每一部分均给出了对应的链接),一个比较简单的获取代码的方式是点击页面上的Raw按钮,即纯文本,即可查看代码的纯文本格式,在此格式下复制全部代码,并粘贴至一个文本文档中即可,粘贴完成保存后需要将文件重命名为 <脚本名>.js,最后将重命名后的脚本文件放置在脚本文件夹即可使用,脚本名可以随意命名,本篇教程中我们使用的命名均为官方的命名(即每一章中提到的),因为调用脚本时需要使用文件名,如果安装时使用了别的文件名,调用时使用对应的即可。

maze.js 迷宫生成

下载地址
maze.js
https://github.com/sk89q/worlded ... raftscripts/maze.js

maze.js的功能是根据给出的参数随机生成一个迷宫,它的许多参数都可以被设定来生成需要的效果,首先让我们来看一下它的参数格式:

  1. <方块> [长度] [宽度] [高度] [大小] [厚度] [标示]
复制代码


当然,这只是脚本本身的参数,如果我们要使用它就要使用执行脚本的指令 /cs
我们的命令将会是

  1. /cs maze <方块> [长度] [宽度] [高度] [大小] [厚度] [标示]
复制代码


  1. /maze.js <方块> [长度] [宽度] [高度] [大小] [厚度] [标示]
复制代码

或者,如果上一个运行的脚本也是这个的话,可以使用快捷指令格式,即
  1. /.s <方块> [长度] [宽度] [高度] [大小] [厚度] [标示]
复制代码


现在让我们先来看一下主要的参数

<方块> 为生成的时候使用的方块,也就是墙壁的方块
[宽度] 是迷宫的宽度
[长度] 是迷宫的长度
长度和宽度指的是平面上迷宫的长宽,即两边上通道的数量,并不是实际的大小,生成出的迷宫的实际大小除了与这两个参数有关,也可[大小]和[厚度]有关。
[高度] 是迷宫墙壁的高度
[大小] 是迷宫内走廊的宽度
[厚度] 是迷宫墙壁的厚度
[标示] 为生成时可以使用的一系列标示,我们将会一一讲到,目前我们先通过例子看一下上面的几个主要参数的使用方式。


可以看到这些参数中只有<方块>是必须参数,所以首先我们仅使用这个参数,使用指令
  1. /cs maze 1
复制代码

即生成一个墙壁为原石的迷宫,可以生成如下图的迷宫





可以看到这样生成的迷宫使用了默认的长宽参数,即5,可以看到这个迷宫横向和竖向都各有5条走廊


接下来我们来逐渐添加参数来观察效果
首先是长度和宽度,使用指令
  1. /cs maze 1 10 6
复制代码

即生成原石墙壁,长度为10,宽度为6
生成结果如下,可以看到按需要生成了指定大小的迷宫





接下来是高度,这一次使用的还是同样的方块,长宽均为10,高度设定为4,指令为
  1. /cs maze 1 10 10 4
复制代码

可以看到生成了下面的迷宫,墙壁高度变为了4(默认为2)





接下来我们来调整走廊宽度,使用指令
  1. /cs maze 1 10 10 3 2
复制代码

走廊宽度设定为2,如下图,这样就有了更宽的走廊,同时迷宫整体也会变得更大





接着是墙壁厚度,这里我们使用厚度为2的墙壁,指令为
  1. /cs maze 1 5 5 3 2 2
复制代码

可以看到下图的生成效果





介绍完了这些参数,让我们来看一下标示,标示可以加在参数之后来控制生成的一些方式,首先我们来看一下可以使用的标示



迷宫解答器相关


标示加在所有其他参数之后即可使用,如果需要同时使用多个同时填写即可,不需要空格分隔,让我们用例子来看一下每个参数的作用


首先是 i 标示,即添加入口与出口,这里使用的指令是
  1. /cs maze 1 10 10 i
复制代码

下图中可以看到迷宫被添加了出入口





如果使用 y 标示的话就可以随机出入口位置,如下图效果,使用的指令是
  1. /cs maze 1 10 10 y
复制代码






接下来我们来看一下迷宫的顶与地面的设定
使用 f 标示可以同时生成地板
下图使用的指令是
  1. /cs maze 1 10 10 f
复制代码

可以看到同时生成了地板





接下来是顶,下图使用了
  1. /cs maze 1 10 10 c
复制代码

使用的是 c 标示,即生成顶





接下来是顶加底的组合使用,下图使用的是
  1. /cs maze ice 10 10 3 2 cf
复制代码

使用了冰作为材料来看到生成的情况,可以看到同时使用了两个标示





接下来是ea标示,分别为带有空气方块的生成与只生成空气方块,首先是e标示,作用的生成空气方块,因为如果不使用此标示进行生成会只生成墙壁方块,剩余部分(即走廊)的原有方块并不会受到影响
下图是不使用e标示的生成效果






可以看到原先位置得石英块并没有被移除,接下来同样的生成,这次使用e标示
  1. /cs maze 1 5 5 e
复制代码

可以看到在走廊中的石英块也被替换成了空气方块





接下来是a标示,它的作用是仅生成空气方块,即为只有走廊的位置会被替换成空气方块,
如下图我们创建了一个需要作为场景的地面





使用指令
  1. /cs maze 1 10 10 a
复制代码

其实这里的墙壁方块并不重要,因为并不会生成,但也要加上,否则会参数检测错误
输入指令后生成效果如下图,这种生成模式可以用在已经事先做好生成材料的情况下或者用于地下生成





然后生成控制类最后一个标示v,它的作用是使迷宫竖直生成,如下图所示,使用的指令是
  1. /cs maze 1 10 10 v
复制代码






接下来是解答器相关的几个标示
首先是s,即开启解答器,使用后会在生成迷宫后用绿色羊毛标注出正确路线
如下图,使用了
  1. /cs maze 1 10 10 s
复制代码






接下来是g标示,它会在解答的基础上用玻璃封死错误的路线
  1. /cs maze 1 10 10 g
复制代码






然后是r标示,它会用红色羊毛标注出在解答器运行过程中确定的错误线路,下图指令为
  1. /cs maze 1 10 10 r
复制代码






最后是b标示,它会用蓝色羊毛标注出在解答器运行过程中没有探寻的路径,下图指令为
  1. /cs maze 1 10 10 b
复制代码






如果同时使用解答器的四个标示,即
  1. /cs maze 1 10 10 sgrb
复制代码

效果会是这样





介绍完了各个参数,我们来看一个实际的使用
我们使用的是
  1. /cs maze 15 15 10 3 2 fe
复制代码

生成了一个较大的迷宫





接着我们用百分比替换对墙壁做一些处理,一个简单的遗迹迷宫就完成了~
可以作为活动场地,竞技场等等





roof.js 屋顶生成
下载地址
https://github.com/sk89q/worlded ... raftscripts/roof.js

屋顶生成脚本的功能是在指定的选区上方生成1:1的金字塔形屋顶,参数格式很简单,为
  1. <方块>
复制代码


即为仅需要指定生成使用的方块即可
加入指令中即为
  1. /cs roof <方块>
复制代码

让我们来看一个简单的例子,如下图我们选择了一个选区,并使用指令
  1. /cs roof 1
复制代码






如下图,可以以选区为底生成一个金字塔形屋顶






作者: LocusAzzurro    时间: 2016-3-10 00:04
本帖最后由 LocusAzzurro 于 2016-3-9 19:06 编辑

Craftscript 编写浅谈
通过编写CraftScript脚本,我们可以按自己的需求调用WorldEdit的各种功能来达到需要的目的,以及实现一些基于WorldEdit的拓展功能,就像我们在上一章讲到的两个脚本一样。
通过编写CraftScript并在WorldEdit中使用它们有很多优势,如使用WorldEdit撤销与重做系统,方块放置优先级系统,高级方块语法系统以及通过玩家的选区执行操作等。

介绍

CraftScript是通过JavaScript编写的,这也使创建一个脚本变得十分简单。
首先,CraftScript中有以下三个全局命名空间中的变量:
context  CraftScriptContext类的一个实例
player  玩家的副本,LocalPlayer类的实例
argv  以string储存的参数的Java数组

使用方块

WorldEdit中的所有编辑都通过一个EditSession (编辑会话)来完成,这个对象会自动处理方块放置顺序与编辑历史,通过下面的语句可以在脚本中添加一个编辑会话:

  1. var sess = context.remember();
复制代码


每次这个方法被调用时,你就会得到一个新的EditSession
当设定方块时,我们不可以直接设定方块的种类,因为如此做会造成一些数据的丢失,如数据值,内容物等,所以我们要使用一个BaseBlock (基本方块),一个BaseBlock是一个方块独立的展示并且不包括坐标,这说明我们可以声明一个新的BaseBlock并在多处重复使用它,一个BaseBlock包含了方块的种类和数据值,如果需要如箱子和牌子等复杂的方块,则需要使用一个BaseBlock的变种,如SignBlock

例程:放置一个颜色数据值为4的羊毛


  1. importPackage(Packages.com.sk89q.worldedit.blocks);
  2. var sess = context.remember();
  3. sess.setBlock(player.getBlockOn(), new BaseBlock(BlockID.CLOTH, 4));
复制代码


setBlock为放置方块的方法,第一个参数为坐标,第二个参数即为使用的方块,在使用的方块处声明了需要使用的方块。

完整的方块名列表:
http://docs.sk89q.com/worldedit/ ... ocks/BaseBlock.html

通过在EditSession中调用getBlock(),也可以获取一个以BaseBlock表示的方块。

使用Java包

在编写脚本时我们需要导入对应的Java包才能使用其中的方法,如同我们在之前看到的,包的导入方法为:

  1. importPackage(Packages.包.名.称);
复制代码


之前我们使用的是:

  1. importPackage(Packages.com.sk89q.worldedit.blocks);
复制代码


这样就导入了WorldEdit方块类的包,当我们需要使用一个方法的时候,就要导入对应的包,每个类的具体内容可以通过查阅WorldEdit的APIDocs来了解。

处理参数

参数是通过argv参数来传递的,如果需要检查用户是否输入了正确数量的参数,可以使用CraftScriptContext.checkArgs() 来完成。

例子:检查参数
  1. context.checkArgs(1, 3, "<block> [width] [height]");
复制代码



第一个参数为需要的最小的参数数量,第二个为最大参数数量,第三个为错误时输出的使用方式提示。
如果需要将得到的参数转换为一个BaseBlock,则需要使用CraftScriptContext.getBlock(),这个方法会检查方块黑名单,但如果需要忽略黑名单,则可以通过在方法第三个参数的位置使用true的布尔值。

例子:获取输入的方块

  1. context.checkArgs(1, 3, "<block> [width] [height]");
  2. var block = context.getBlock(argv[1]);
复制代码

如果用户输入了一个无效的方块,就会出现一个异常,脚本运行将会终止且用户将会收到一个错误信息。

例程讲解

例程:将附近的发射器用箭填充
By sk89q



  1. importPackage(Packages.com.sk89q.worldedit.blocks); //导入Java包

  2. var session = context.remember(); //编辑会话声明
  3. var origin = player.getPosition(); //获取玩家位置

  4. var arrows = new BaseItemStack(262, 64); //声明物品堆变量,此处为一组箭

  5. var items = [arrows, arrows, arrows,
  6.              arrows, arrows, arrows,
  7.              arrows, arrows, arrows] //声明发射器内容变量

  8. for (var x = -4; x <= 4; x++) {
  9.     for (var y = -4; y <= 4; y++) {
  10.         for (var z = -4; z <= 4; z++) {
  11.             var pt = origin.add(x, y, z); //通过递归检查附近方块
  12.             var id = session.getBlockType(pt); //每次获取方块种类
  13.             
  14.             if (id == BlockID.DISPENSER) { //如果方块种类为发射器即进行填充
  15.                 var block = session.getBlock(pt); //声明方块种类,即发射器
  16.                 block.setItems(items); //设置方块内容,即9组箭
  17.                 session.setBlock(pt, block); //放置带有箭的发射器方块
  18.                
  19.                 player.print("Arrows set @ " + pt); //向玩家输出放置坐标
  20.             }
  21.         }
  22.     }
  23. }
复制代码



例程:空心球体
By Lucky77777



  1. //通过生成两个半径不同球体来完成生成空心球体的效果

  2. importPackage(Packages.com.sk89q.worldedit);
  3. importPackage(Packages.com.sk89q.worldedit.blocks);
  4. importPackage(Packages.com.sk89q.worldedit.patterns);
  5. importPackage(Packages.com.sk89q.worldedit.function.pattern); //导入包

  6. context.checkArgs(1, 3, "<block> [inside_radius] [outside_radius]"); //检查参数数量

  7. var session = context.remember(); //编辑会话声明
  8. var position = player.getPosition(); //获取玩家位置
  9. var patterno = new SingleBlockPattern(new BaseBlock(context.getBlock(argv[1]))); //声明大球体材料,获取第一个参数作为材料
  10. var patterni = new SingleBlockPattern(new BaseBlock(BlockID.AIR)); //声明小球体材料,空气方块作为材料

  11. var inside = argv.length > 2 ? argv[2] : 3; //获取外半径,获取失败使用默认值
  12. var outside = argv.length > 3 ? argv[3] : 5; //获取内半径,获取失败使用默认值

  13. session.makeSphere(position,patterno,outside,true); //创建外球体
  14. session.makeSphere(position,patterni,inside,true); //创建内球体
复制代码



例程:直线彩虹生成
By LocusAzzurro



  1. //指令使用 /cs rainbow <宽度> <方向>
  2. //<宽度> = 每种颜色方块数
  3. //<方向> = 1|2|3|4 之一

  4. importPackage(Packages.com.sk89q.worldedit); //加入库
  5. importPackage(Packages.com.sk89q.worldedit.blocks);

  6. var sess = context.remember(); //设定session记录(这样可以被//undo)
  7. var origin = player.getPosition(); //设定原点为玩家位置

  8. context.checkArgs(2, 2, "Usage: <Length> <Direction> "); //检查参数
  9. var red = new BaseBlock(BlockID.CLOTH, 14); //七个颜色的羊毛声明
  10. var orange = new BaseBlock(BlockID.CLOTH, 1);
  11. var yellow = new BaseBlock(BlockID.CLOTH, 4);
  12. var green = new BaseBlock(BlockID.CLOTH, 5);
  13. var cyan = new BaseBlock(BlockID.CLOTH, 9);
  14. var blue = new BaseBlock(BlockID.CLOTH, 11);
  15. var purple = new BaseBlock(BlockID.CLOTH, 10);


  16. var length = argv[1]; //第一个参数为每种颜色宽度
  17. var dir = argv[2]; //第二个参数为方向 1/2/3/4 对应四个方向

  18. for (i=0;i<length;i++) //红色羊毛放置
  19. {
  20.         if (dir==1) var spt=origin.add(i,0,0); //检查方向确定放置位置
  21.         if (dir==2) var spt=origin.add(0,0,i);
  22.         if (dir==3) var spt=origin.add(-i,0,0);
  23.         if (dir==4) var spt=origin.add(0,0,-i);
  24.         sess.setBlock(spt, red); //放置方块
  25. }
  26. for (i=length;i<2*length;i++) //橙色
  27. {
  28.         if (dir==1) var spt=origin.add(i,0,0);
  29.         if (dir==2) var spt=origin.add(0,0,i);
  30.         if (dir==3) var spt=origin.add(-i,0,0);
  31.         if (dir==4) var spt=origin.add(0,0,-i);
  32.         sess.setBlock(spt, orange);
  33. }
  34. for (i=2*length;i<3*length;i++) //黄色
  35. {
  36.         if (dir==1) var spt=origin.add(i,0,0);
  37.         if (dir==2) var spt=origin.add(0,0,i);
  38.         if (dir==3) var spt=origin.add(-i,0,0);
  39.         if (dir==4) var spt=origin.add(0,0,-i);
  40.         sess.setBlock(spt, yellow);
  41. }
  42. for (i=3*length;i<4*length;i++) //绿色
  43. {
  44.         if (dir==1) var spt=origin.add(i,0,0);
  45.         if (dir==2) var spt=origin.add(0,0,i);
  46.         if (dir==3) var spt=origin.add(-i,0,0);
  47.         if (dir==4) var spt=origin.add(0,0,-i);
  48.         sess.setBlock(spt, green);
  49. }
  50. for (i=4*length;i<5*length;i++) //青色
  51. {
  52.         if (dir==1) var spt=origin.add(i,0,0);
  53.         if (dir==2) var spt=origin.add(0,0,i);
  54.         if (dir==3) var spt=origin.add(-i,0,0);
  55.         if (dir==4) var spt=origin.add(0,0,-i);
  56.         sess.setBlock(spt, cyan);
  57. }
  58. for (i=5*length;i<6*length;i++) //蓝色
  59. {
  60.         if (dir==1) var spt=origin.add(i,0,0);
  61.         if (dir==2) var spt=origin.add(0,0,i);
  62.         if (dir==3) var spt=origin.add(-i,0,0);
  63.         if (dir==4) var spt=origin.add(0,0,-i);
  64.         sess.setBlock(spt, blue);
  65. }
  66. for (i=6*length;i<7*length;i++) //紫色
  67. {
  68.         if (dir==1) var spt=origin.add(i,0,0);
  69.         if (dir==2) var spt=origin.add(0,0,i);
  70.         if (dir==3) var spt=origin.add(-i,0,0);
  71.         if (dir==4) var spt=origin.add(0,0,-i);
  72.         sess.setBlock(spt, purple);
  73. }
复制代码



API

通过查阅WorldEdit的API可以了解所有类的方法以及使用方式。

API: http://docs.sk89q.com/worldedit/apidocs/

常用类:

EditSession类: http://docs.sk89q.com/worldedit/ ... it/EditSession.html
LocalPlayer类: http://docs.sk89q.com/worldedit/ ... it/LocalPlayer.html
CraftScriptContext类: http://docs.sk89q.com/worldedit/ ... tScriptContext.html
BaseBlock类: http://docs.sk89q.com/worldedit/ ... ocks/BaseBlock.html


作者: LocusAzzurro    时间: 2016-3-10 00:04
本帖最后由 LocusAzzurro 于 2016-3-9 21:13 编辑

总结


CraftScript为玩家们提供了一个创造自己需要的功能的机会,这里仅对编写方面进行了简单的探讨,更深层的使用方式还有待各位发掘。也希望脚本安装与使用的部分有令各位更多的了解这个功能。


作者: LocusAzzurro    时间: 2016-3-10 00:05
标题: [WorldEdit]CraftScript脚本 - 编写出你想要的WE功能! [~3200字]
本帖最后由 LocusAzzurro 于 2016-3-9 19:08 编辑


编写出你想要的WE功能!

大家好,这里Az,最近和小组研究了一下WorldEdit中的CraftScript功能,再此分享一下研究的成果,也希望大家可以继续利用这个功能开发出更多的功能。



本文由 Minecraft插件百科 小组合作完成

编写参与者:LocusAzzurro, henry5041, Lucky777777


本帖由三篇文章组成
CraftScript 安装与使用例子 - 探讨使用本功能前需要的准备工作以及基本的使用方法
WorldEdit 官方CraftScript脚本使用讲解 - 探讨官方CraftScript脚本的使用方式
Craftscript 编写浅谈 - 浅谈关于CraftScript的写法

阅读提示:你可能需要如下知识来理解本文并了解它的使用方式





WorldEdit插件资源(作者 sjjklh):
http://www.mcbbs.net/thread-68815-1-1.html
WorldEdit插件简短介绍:
WorldEdit是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。

[groupid=1151]Minecraft插件百科[/groupid]
作者: LittleSkep    时间: 2016-3-10 01:16
本帖最后由 迷踪 于 2016-3-10 01:22 编辑

加油填坑
原来WE还能自己编写..涨姿势了,等写完一定好好看


你连楼了
作者: 云闪    时间: 2016-3-10 01:44
LocusAzzurro 发表于 2016-3-10 00:04
Craftscript 编写浅谈
通过编写CraftScript脚本,我们可以按自己的需求调用WorldEdit的各种功能来达到需要 ...

刚刚看到那层楼的【code】【/code】部分挂了_(:зゝ∠)_结果刚评完分就好了_(:зゝ∠)_

加油~我学习到了好多WE的高级用法= ̄ω ̄=
作者: hhttll    时间: 2016-3-10 04:54
【又是你】

关于迷宫的教程我给满分

关于自己编写的那个教程 ._. 233
作者: 丿灬狂    时间: 2016-3-10 05:56
LocusAzzurro 发表于 2016-3-10 00:04
总结

我见过你耶 原来你不是版主呢我等只能看看  话说还能自己编写 好孽海
作者: 爱拍、小少    时间: 2016-3-10 07:01
最近都没啥人上论坛,这时候发不好吧= =
作者: Lucky777777    时间: 2016-3-10 07:34
hhttll 发表于 2016-3-10 04:54
【又是你】

关于迷宫的教程我给满分


简单的运用,具体想实现什么还是自己参考着写吧:)
作者: hhttll    时间: 2016-3-11 09:37
伟大的LZ,你的那个彩虹代码真的复杂化了,作为一个专门写js的,帮你简化了一下。
警告:以下代码未经过正式测试,但是已通过 Node.js 模拟。

  1. //指令使用 /cs rainbow <宽度> <方向>
  2. //<宽度> = 每种颜色方块数
  3. //<方向> = 1|2|3|4 之一
  4. importPackage(Packages.com.sk89q.worldedit); //加入库
  5. importPackage(Packages.com.sk89q.worldedit.blocks);
  6. var sess = context.remember(); //设定session记录(这样可以被//undo)
  7. var origin = player.getPosition(); //设定原点为玩家位置
  8. context.checkArgs(2, 2, "Usage: <Length> <Direction> "); //检查参数
  9. var length = argv[1]; //第一个参数为每种颜色宽度
  10. var dir = argv[2]; //第二个参数为方向 1/2/3/4 对应四个方向
  11. //以上保持不变

  12. var posBias = 0; //偏移格子数
  13. var nextPos = (dir === 1) ? (function(){ return origin.add(posBias++,0,0); })
  14.              :(dir === 2) ? (function(){ return origin.add(0,0,posBias++); })
  15.              :(dir === 3) ? (function(){ return origin.add(-posBias++,0,0); })
  16.              :(function(){ return origin.add(0,0,-posBias++); });
  17. [   new BaseBlock(BlockID.CLOTH, 14),
  18.     new BaseBlock(BlockID.CLOTH, 1),
  19.     new BaseBlock(BlockID.CLOTH, 4),
  20.     new BaseBlock(BlockID.CLOTH, 5),
  21.     new BaseBlock(BlockID.CLOTH, 9),
  22.     new BaseBlock(BlockID.CLOTH, 11),
  23.     new BaseBlock(BlockID.CLOTH, 10)
  24. ].forEach(function (block) {
  25.     var i;
  26.     for (i = 0; i < length; i++) {
  27.         sess.setBlock(nextPos(), block);
  28.     }
  29. });
复制代码

作者: 黑星nova    时间: 2016-3-11 23:55
讲道理,这个方法能不能再完善搞出一个随机dungeon的东西,然后在服务器里由指令方块插件触发,每次生成不同的dungeon供玩家挑战。
作者: LocusAzzurro    时间: 2016-3-12 04:31
darknova 发表于 2016-3-11 16:55
讲道理,这个方法能不能再完善搞出一个随机dungeon的东西,然后在服务器里由指令方块插件触发,每次生成不 ...

讲道理随机箱子内容和随机走廊理论上是可以做到的,然而最大的问题是WE指令不能通过CB触发
作者: hhttll    时间: 2016-3-12 06:37
本帖最后由 hhttll 于 2016-3-12 06:40 编辑
hhttll 发表于 2016-3-11 09:37
伟大的LZ,你的那个彩虹代码真的复杂化了,作为一个专门写js的,帮你简化了一下。
警告:以下代码未经过正 ...

@LocusAzzurro
有报错吗
作者: hhttll    时间: 2016-3-12 06:42
本帖最后由 hhttll 于 2016-3-12 06:45 编辑
LocusAzzurro 发表于 2016-3-12 04:31
讲道理随机箱子内容和随机走廊理论上是可以做到的,然而最大的问题是WE指令不能通过CB触发 ...

讲道理 scriptblock 的 @bypass /tp @bypass //we command
作者: -流动水-    时间: 2016-3-12 23:04
AZ继续玩坏WEing
作者: wjr_youhu~    时间: 2016-3-13 10:02
LZ好牛!已收藏!
作者: zhanshi123    时间: 2016-3-13 16:14
感觉好高深的样子,有点不懂,不过也是涨姿势了!
作者: fcc2333    时间: 2016-3-14 21:11
66666666666
作者: 懒虫哥    时间: 2016-3-19 12:51
现在才知道我是WE渣渣
作者: 婲样的女孩    时间: 2016-3-25 06:41
写的好详细,我都看乱了{:10_492:}
作者: suger574    时间: 2016-3-26 18:15
哇简直惹
WE还可以自己写
以后有要比CB的局势
(要是能用WE执行指令
作者: simon3000    时间: 2016-4-25 01:39
hhttll 发表于 2016-3-11 09:37
伟大的LZ,你的那个彩虹代码真的复杂化了,作为一个专门写js的,帮你简化了一下。
警告:以下代码未经过正 ...

神tm nodejs测试这个(╯‵□′)╯︵┻━┻
作者: hhttll    时间: 2016-4-25 01:42
simon3000 发表于 2016-4-25 01:39
神tm nodejs测试这个(╯‵□′)╯︵┻━┻

然而完全懒得装 一大堆乱七八糟的东西
作者: hhttll    时间: 2016-4-25 02:04

  1. //指令使用 /cs rainbow <宽度> <方向>
  2. //<宽度> = 每种颜色方块数
  3. //<方向> = 1|2|3|4 之一
  4. importPackage(Packages.com.sk89q.worldedit); //加入库
  5. importPackage(Packages.com.sk89q.worldedit.blocks);
  6. var sess = context.remember(); //设定session记录(这样可以被//undo)
  7. var origin = player.getPosition(); //设定原点为玩家位置
  8. context.checkArgs(2, 2, "Usage: <Length> <Direction> "); //检查参数
  9. var length = argv[1]; //第一个参数为每种颜色宽度
  10. var dir = argv[2]; //第二个参数为方向 1/2/3/4 对应四个方向
  11. //以上保持不变

  12. var posBias = 0; //偏移格子数
  13. var nextPos = (dir == 1) ? (function(){ return origin.add(posBias++,0,0); })
  14.              :(dir == 2) ? (function(){ return origin.add(0,0,posBias++); })
  15.              :(dir == 3) ? (function(){ return origin.add(posBias--,0,0); })
  16.              :(function(){ return origin.add(0,0,posBias--); });
  17. [   new BaseBlock(BlockID.CLOTH, 14),
  18.     new BaseBlock(BlockID.CLOTH, 1),
  19.     new BaseBlock(BlockID.CLOTH, 4),
  20.     new BaseBlock(BlockID.CLOTH, 5),
  21.     new BaseBlock(BlockID.CLOTH, 9),
  22.     new BaseBlock(BlockID.CLOTH, 11),
  23.     new BaseBlock(BlockID.CLOTH, 10)
  24. ].forEach(function (block) {
  25.     var i;
  26.     for (i = 0; i < length; i++) {
  27.         sess.setBlock(nextPos(), block);
  28.     }
  29. });
复制代码


已测试可用。我竟然天真的以为输入的数据是 int。。。
作者: simon3000    时间: 2016-4-25 10:42
hhttll 发表于 2016-4-25 02:04
已测试可用。我竟然天真的以为输入的数据是 int。。。

神tm int
被你玩成java了
作者: fangchenxiao    时间: 2016-4-25 20:25
感觉就迷宫会了..........
作者: hhttll    时间: 2016-4-26 04:16
simon3000 发表于 2016-4-25 10:42
神tm int
被你玩成java了

我以为输入的值的类型是 number,因为 jshint 的关系,我判断相等用的是 ===(要求值等类型也等)。然而实际上输入数据是 string (可能吧),导致我判断方向那里永远都会出问题,都会进入最后一个 else。不过运行其实是可以运行的,只不过做出来的都逼彩虹永远是一个方向的。现在换成 == (值等) 就没问题了,然后 jshint 一直报错 浑身难受
作者: simon3000    时间: 2016-4-26 08:08
hhttll 发表于 2016-4-26 04:16
我以为输入的值的类型是 number,因为 jshint 的关系,我判断相等用的是 ===(要求值等类型也等)。然而 ...

Number(dir) ===
233

作者: Ksieus    时间: 2017-2-23 23:06
LocusAzzurro 发表于 2016-3-10 00:03
CraftScript 安装与使用例子

CraftScript为WorldEdit中的一个脚本系统(以下简称CS),提供了使用JavaScript ...

高度应该是长度吧
作者: Forsworn_    时间: 2017-3-15 21:15
不知道现在还算不算挖坟

我之前有个版本 1.7.2的 单机就可以加载插件 然而1.8之后不清楚怎么就无法弄了 rhino的话我这边也是有加的   
作者: 46864351    时间: 2017-11-2 10:50
mc有你更精彩
作者: 46864351    时间: 2017-11-2 10:50
mcbbs有你更精彩
作者: baijian_dada    时间: 2018-1-13 17:20
hhhhhhhhhhhhhhhhhhhhhhhhhh
作者: CarbonPaper99    时间: 2018-7-9 16:32
和JavaScript很像,学完了JAVASCRIPT的人看着没啥毛病
作者: JackMeds    时间: 2018-8-30 19:19
感谢大佬,教程很好
作者: 東冻Dong    时间: 2019-3-29 22:34
沙发有吗
作者: wspq    时间: 2019-12-14 19:53
typeerror:cannot find function tovector in object(214.0,41.0,15.0)我跟着提示在maze.js里面看了看是这一行origin = player.getBlockIn().toVector().toBlockPoint();怎么解决???
作者: Jack爷爷    时间: 2019-12-14 21:29
docs.sk89q.com炸了,现在目录该在哪看呢
作者: 3128554048    时间: 2020-2-21 10:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: nbnb565689    时间: 2020-6-13 16:48
图片为毛都显示不了?
作者: 亚托莉永远滴神    时间: 2020-8-17 17:11
感谢大佬!受教了