improvements to Drone.paste() CommandScript.load now returns last statement of script
This commit is contained in:
parent
d9c47bf7ad
commit
9ce85bb5b3
2 changed files with 135 additions and 27 deletions
|
@ -104,8 +104,6 @@ public class CommandScript extends CommandBase {
|
|||
return "" + blockId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String getCommandName() {
|
||||
return "js";
|
||||
}
|
||||
|
@ -163,9 +161,11 @@ public class CommandScript extends CommandBase {
|
|||
return;
|
||||
}
|
||||
|
||||
public static void load(Context cx, Scriptable thisObj,
|
||||
public static Object load(Context cx, Scriptable thisObj,
|
||||
Object[] args, Function funObj)
|
||||
{
|
||||
Object result = null;
|
||||
|
||||
File scriptFile = null;
|
||||
String filename = null;
|
||||
|
||||
|
@ -175,7 +175,7 @@ public class CommandScript extends CommandBase {
|
|||
if (rc ==JFileChooser.APPROVE_OPTION){
|
||||
scriptFile = fc.getSelectedFile();
|
||||
}else{
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
}else{
|
||||
scriptFile = new File((String)args[0]);
|
||||
|
@ -188,7 +188,7 @@ public class CommandScript extends CommandBase {
|
|||
catch (FileNotFoundException ex) {
|
||||
notifyAdmins(CommandScript.sender, "Error - File not found " + args[0], args);
|
||||
Context.reportError("Couldn't open file \"" + scriptFile + "\".");
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
filename = scriptFile.getAbsolutePath();
|
||||
String filedir = scriptFile.getParentFile().getAbsolutePath();
|
||||
|
@ -203,7 +203,7 @@ public class CommandScript extends CommandBase {
|
|||
// a script. Text is printed only if the print() function
|
||||
// is called.
|
||||
notifyAdmins(CommandScript.sender, "Loading " + filename, args);
|
||||
cx.evaluateReader(thisObj, in, filename, 1, null);
|
||||
result = cx.evaluateReader(thisObj, in, filename, 1, null);
|
||||
notifyAdmins(CommandScript.sender, "Successfully loaded " + filename, args);
|
||||
}
|
||||
catch (WrappedException we) {
|
||||
|
@ -232,6 +232,7 @@ public class CommandScript extends CommandBase {
|
|||
System.err.println(ioe.toString());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public static void help(Context cx, Scriptable thisObj,
|
||||
Object[] args, Function funObj)
|
||||
|
@ -286,7 +287,6 @@ public class CommandScript extends CommandBase {
|
|||
z = (int)mousePos.z;
|
||||
b = new Double(args[0].toString()).intValue();
|
||||
m = new Double(args[1].toString()).intValue();
|
||||
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
|
|
148
drone.js
148
drone.js
|
@ -110,6 +110,8 @@ var Drone = {
|
|||
|
||||
// create a door - if a parameter is supplied an Iron door is created otherwise a wooden door is created.
|
||||
door: function(b){},
|
||||
// create double doors (left and right side)
|
||||
door2: function(b){},
|
||||
// signs must use block 63 (stand-alone signs) or 68 (signs on walls)
|
||||
// s can be a string or an array of strings.
|
||||
sign: function(s,b){},
|
||||
|
@ -133,8 +135,42 @@ var Drone = {
|
|||
//
|
||||
garden: function(w,d){},
|
||||
|
||||
// Copy & Paste
|
||||
// ============
|
||||
|
||||
// copy an area so it can be pasted elsewhere. The name can be used for pasting the copied area elsewhere...
|
||||
// drone.copy('somethingCool',10,5,10).right(12).paste('somethingCool');
|
||||
// ... copies a 10x5x10 area (using the drone's coordinates as the starting point) into memory.
|
||||
// the copied area can be referenced using the name 'somethingCool'. The drone moves 12 blocks right then
|
||||
// pastes the copy.
|
||||
//
|
||||
copy: function(name,w,h,d){},
|
||||
paste: function(name){}
|
||||
|
||||
// Chaining
|
||||
// ========
|
||||
//
|
||||
// All of the above methods return a Drone object, which means methods can be 'chained' together so instead of writing this...
|
||||
//
|
||||
// drone = new Drone();
|
||||
// drone.fwd(3);
|
||||
// drone.left(2);
|
||||
// drone.box(2); // create a grass block
|
||||
// drone.up();
|
||||
// drone.box(2); // create another grass block
|
||||
// drone.down();
|
||||
//
|
||||
// ...you could simply write ...
|
||||
//
|
||||
// var drone = new Drone().fwd(3).left(2).box(2).up().box(2).down();
|
||||
//
|
||||
// The Drone object uses a Fluent Interface ( http://en.wikipedia.org/wiki/Fluent_interface )
|
||||
// to make ScriptCraft scripts more concise and easier to write and read.
|
||||
// Minecraft's in-game command prompt is limited to about 80 characters so chaining drone commands together
|
||||
// means more can be done before hitting the command prompt limit. For complex building you should save your
|
||||
// commands in a new script file and load it using /js load()
|
||||
//
|
||||
|
||||
};
|
||||
//
|
||||
// Implementation
|
||||
|
@ -227,7 +263,7 @@ var Drone = {
|
|||
return;
|
||||
}
|
||||
if (block == 68){
|
||||
meta = this.playerToSignDirs[this.dir];
|
||||
meta = Drone.PLAYER_SIGN_FACING[this.dir];
|
||||
this.back();
|
||||
}
|
||||
putSign(message,this.x,this.y,this.z,block,meta);
|
||||
|
@ -281,13 +317,21 @@ var Drone = {
|
|||
}else{
|
||||
door = 71;
|
||||
}
|
||||
return this.cuboid(door+':' + this.dir,1,1,1).up().cuboid(door+':8',1,1,1).down();
|
||||
return this.cuboid(door+':' + this.dir).up().cuboid(door+':8').down();
|
||||
};
|
||||
Drone.prototype.door2 = function(door){
|
||||
if (typeof door == "undefined"){
|
||||
door = 64;
|
||||
}else{
|
||||
door = 71;
|
||||
}
|
||||
return this.cuboid(door+':' + this.dir).up().cuboid(door+':8').right().cuboid(door+':9').down().cuboid(door+':' + this.dir).left();
|
||||
};
|
||||
// player dirs: 0 = east, 1 = south, 2 = west, 3 = north
|
||||
// block dirs: 0 = east, 1 = west, 2 = south , 3 = north
|
||||
// sign dirs: 5 = east, 3 = south, 4 = west, 2 = north
|
||||
Drone.prototype.playerToBlockDirs = [0,2,1,3];
|
||||
Drone.prototype.playerToSignDirs = [4,2,5,3];
|
||||
Drone.PLAYER_STAIRS_FACING = [0,2,1,3];
|
||||
Drone.PLAYER_SIGN_FACING = [4,2,5,3]; // for blocks 68 (wall signs) 65 (ladders) 61,62 (furnaces) 23 (dispenser) and 54 (chest)
|
||||
|
||||
Drone.prototype.prism0 = function(block,w,d){
|
||||
this.prism(block,w,d).fwd().right().prism(0,w-2,d-2).left().back();
|
||||
|
@ -295,7 +339,7 @@ var Drone = {
|
|||
if (d % 2 == 1 && se){
|
||||
// top of roof will be open - need repair
|
||||
var f = Math.floor(d/2);
|
||||
this.fwd(f).up(f).cuboid(se,w,1,1).down(f).back(f);
|
||||
this.fwd(f).up(f).cuboid(se,w).down(f).back(f);
|
||||
}
|
||||
};
|
||||
Drone.STAIRBLOCKS = {53: 5 // oak wood
|
||||
|
@ -339,7 +383,7 @@ var Drone = {
|
|||
while (d2 < d)
|
||||
{
|
||||
var di = (d2 < middle?this.dir:(this.dir+2)%4);
|
||||
var bd = block + ':' + this.playerToBlockDirs[di];
|
||||
var bd = block + ':' + Drone.PLAYER_STAIRS_FACING[di];
|
||||
var putStep = true;
|
||||
if (d2 == middle){
|
||||
if (d % 2 == 1){
|
||||
|
@ -347,7 +391,7 @@ var Drone = {
|
|||
}
|
||||
}
|
||||
if (putStep)
|
||||
this.cuboid(bd,w,1,1);
|
||||
this.cuboid(bd,w);
|
||||
if (d2 < middle-1){
|
||||
this.up();
|
||||
uc++;
|
||||
|
@ -527,11 +571,7 @@ var Drone = {
|
|||
var randomized = _rand(dist);
|
||||
return this.box(randomized,w,h,d);
|
||||
};
|
||||
var _trees = {oak: 6
|
||||
,spruce: '6:1'
|
||||
,birch: '6:2'
|
||||
,jungle: '6:3'
|
||||
};
|
||||
var _trees = {oak: 6 ,spruce: '6:1' ,birch: '6:2' ,jungle: '6:3' };
|
||||
for (var p in _trees){
|
||||
Drone.prototype[p] = function(v){return function(){ return this.box(v);};}(_trees[p]);
|
||||
}
|
||||
|
@ -550,8 +590,12 @@ var Drone = {
|
|||
|
||||
return this.rand(dist,w,1,d);
|
||||
};
|
||||
//
|
||||
// Drone's clipboard
|
||||
//
|
||||
Drone.clipBoard = {};
|
||||
Drone.prototype.copy = function(name, w, h, d){
|
||||
Drone.prototype.copy = function(name, w, h, d)
|
||||
{
|
||||
var that = this;
|
||||
var ccContent = [];
|
||||
_traverse[this.dir].width(that,w,function(ww){
|
||||
|
@ -564,21 +608,86 @@ var Drone = {
|
|||
});
|
||||
});
|
||||
});
|
||||
Drone.clipBoard[name] = ccContent;
|
||||
Drone.clipBoard[name] = {dir: this.dir, blocks: ccContent};
|
||||
return this;
|
||||
};
|
||||
Drone.prototype.paste = function(name){
|
||||
|
||||
Drone.prototype.paste = function(name)
|
||||
{
|
||||
var ccContent = Drone.clipBoard[name];
|
||||
var srcBlocks = ccContent.blocks;
|
||||
var srcDir = ccContent.dir; // direction player was facing when copied.
|
||||
var dirOffset = (4 + (this.dir - srcDir)) %4;
|
||||
var that = this;
|
||||
_traverse[this.dir].width(that,ccContent.length,function(ww){
|
||||
var h = ccContent[ww].length;
|
||||
_traverse[this.dir].width(that,srcBlocks.length,function(ww){
|
||||
var h = srcBlocks[ww].length;
|
||||
_traverseHeight(that,h,function(hh){
|
||||
var d = ccContent[ww][hh].length;
|
||||
var d = srcBlocks[ww][hh].length;
|
||||
_traverse[that.dir].depth(that,d,function(dd){
|
||||
var b = ccContent[ww][hh][dd];
|
||||
var b = srcBlocks[ww][hh][dd];
|
||||
var bm = _getBlockIdAndMeta(b);
|
||||
var cb = bm[0];
|
||||
var md = bm[1];
|
||||
//
|
||||
// need to adjust blocks which face a direction
|
||||
//
|
||||
switch (cb)
|
||||
{
|
||||
//
|
||||
// doors
|
||||
//
|
||||
case 64: // wood
|
||||
case 71: // iron
|
||||
// top half of door doesn't need to change
|
||||
if (md < 8) {
|
||||
md = (md + dirOffset) % 4;
|
||||
}
|
||||
break;
|
||||
//
|
||||
// stairs
|
||||
//
|
||||
case 53: // oak
|
||||
case 67: // cobblestone
|
||||
case 108: // red brick
|
||||
case 109: // stone brick
|
||||
case 114: // nether brick
|
||||
case 128: // sandstone
|
||||
case 134: // spruce
|
||||
case 135: // birch
|
||||
case 136: // junglewood
|
||||
var dir = md & 0x3;
|
||||
var a = Drone.PLAYER_STAIRS_FACING;
|
||||
var len = a.length;
|
||||
for (var c=0;c < len;c++){
|
||||
if (a[c] == dir){
|
||||
break;
|
||||
}
|
||||
}
|
||||
c = (c + dirOffset) %4;
|
||||
var newDir = a[c];
|
||||
md = (md >>2<<2) + newDir;
|
||||
break;
|
||||
//
|
||||
// signs , ladders etc
|
||||
//
|
||||
case 23: // dispenser
|
||||
case 54: // chest
|
||||
case 61: // furnace
|
||||
case 62: // burning furnace
|
||||
case 65: // ladder
|
||||
case 68: // wall sign
|
||||
var a = Drone.PLAYER_SIGN_FACING;
|
||||
var len = a.length;
|
||||
for (var c=0;c < len;c++){
|
||||
if (a[c] == md){
|
||||
break;
|
||||
}
|
||||
}
|
||||
c = (c + dirOffset) %4;
|
||||
var newDir = a[c];
|
||||
md = newDir;
|
||||
break;
|
||||
}
|
||||
putBlock(that.x,that.y,that.z,cb,md);
|
||||
});
|
||||
});
|
||||
|
@ -597,4 +706,3 @@ getBlock = function(){};
|
|||
drone.copy('x',4,2,3);
|
||||
*/
|
||||
drone = new Drone();
|
||||
|
||||
|
|
Reference in a new issue