diff --git a/docs/API-Reference.md b/docs/API-Reference.md index aa45d48..a4b230b 100644 --- a/docs/API-Reference.md +++ b/docs/API-Reference.md @@ -884,14 +884,14 @@ present in the CraftBukkit classpath. To use this module, you should command... ```sh - java -classpath sc-mqtt.jar;craftbukit.jar org.bukkit.craftbukkit.Main + java -classpath sc-mqtt.jar;craftbukkit.jar org.bukkit.craftbukkit.Main ``` If you're using Mac OS, create a new craftbukkit-sc-mqtt.command file and edit it (using TextWrangler or another text editor) ... ```sh - java -classpath sc-mqtt.jar:craftbukkit.jar org.bukit.craftbukkit.Main + java -classpath sc-mqtt.jar:craftbukkit.jar org.bukkit.craftbukkit.Main ``` 4. Execute the craftbukkit-sc-mqtt batch file / command file to start diff --git a/docs/release-notes.md b/docs/release-notes.md index 3c18d1a..82b80a3 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,3 +1,11 @@ +# 2014 03 08 + +## Version 2.0.6 + +Fixed issues #122 #123 + +Improved background processing of Drone build commands. + # 2014 02 19 ## Version 2.0.5 diff --git a/src/main/js/lib/scriptcraft.js b/src/main/js/lib/scriptcraft.js index 8d57efa..6b0081f 100644 --- a/src/main/js/lib/scriptcraft.js +++ b/src/main/js/lib/scriptcraft.js @@ -548,6 +548,12 @@ function __onEnable ( __engine, __plugin, __script ) global.refresh = function( ) { + if ( typeof self !== 'undefined' ) { + if ( !self.op ) { + self.sendMessage('Only operators can refresh()'); + return; + } + } __plugin.pluginLoader.disablePlugin( __plugin ); __plugin.pluginLoader.enablePlugin( __plugin ); }; diff --git a/src/main/js/plugins/drone/drone.js b/src/main/js/plugins/drone/drone.js index e44e3de..432ff6e 100644 --- a/src/main/js/plugins/drone/drone.js +++ b/src/main/js/plugins/drone/drone.js @@ -750,33 +750,25 @@ exports.Drone = Drone; exports.blocks = blocks; Drone.queue = []; -Drone.processingQueue = false; -Drone.MAX_QUEUE_SIZE = 100000; -Drone.tick = setInterval( function() { - if ( Drone.processingQueue ) { - return; +Drone.opsPerSec = 10; +Drone.processQueue = function(){ + var process = Drone.queue.shift(); + if (process){ + try { + process(); + } catch( e ) { + console.log('Drone build error: %s', e); + } } - var maxOpsPerTick = Math.floor(Math.max(10,Math.sqrt(Drone.queue.length))) ; - var op; - Drone.processingQueue = true; - while ( maxOpsPerTick > 0 ) { - op = Drone.queue.shift(); - if (!op){ - Drone.processingQueue = false; - return; - } - var block = op.world.getBlockAt( op.x, op.y, op.z ); - block.setTypeIdAndData( op.typeid, op.meta, false ); - // wph 20130210 - dont' know if this is a bug in bukkit but for chests, - // the metadata is ignored (defaults to 2 - south facing) - // only way to change data is to set it using property/bean. - block.data = op.meta; - maxOpsPerTick--; + setTimeout(Drone.processQueue,1000/Drone.opsPerSec); +}; +setTimeout(Drone.processQueue,1000/Drone.opsPerSec); +addUnloadHandler(function(){ + var pendingBuildOps = Drone.queue.length; + if (pendingBuildOps > 0){ + console.warn('There were ' + pendingBuildOps + ' pending build operations which were cancelled'); } - Drone.processingQueue = false; - return; -}, 1); - +}); // // add custom methods to the Drone object using this function // @@ -1054,7 +1046,7 @@ Drone.prototype.cuboida = function(/* Array */ blocks, w, h, d, overwrite ) { faster cuboid because blockid, meta and world must be provided use this method when you need to repeatedly place blocks */ -Drone.prototype.cuboidX = function( blockType, meta, w, h, d ) { +Drone.prototype.cuboidX = function( blockType, meta, w, h, d, immediate ) { if ( typeof h == 'undefined' ) { h = 1; @@ -1065,23 +1057,32 @@ Drone.prototype.cuboidX = function( blockType, meta, w, h, d ) { if ( typeof w == 'undefined' ) { w = 1; } + if ( ( w * h * d ) >= 1000000 ) { + this.sign([ + 'Build too Big!', + 'width:' + w, + 'height:' + h, + 'depth:' + d + ], 68); + console.warn('Build too big! ' + w + ' X ' + h + ' X ' + d); + return this; + } var that = this; var dir = this.dir; + if ( !immediate ) { + var clone = Drone.clone(this); + Drone.queue.push(this.cuboidX.bind(clone, blockType, meta, w, h, d, true));; + return this; + } var depthFunc = function( ) { - var len = Drone.queue.length; - if ( len < Drone.MAX_QUEUE_SIZE ) { - Drone.queue.push({ - world: that.world, - x: that.x, - y: that.y, - z:that.z, - typeid: blockType, - meta: meta - }); - } else { - throw new Error('Drone is too busy!'); - } + + var block = that.world.getBlockAt( that.x, that.y, that.z ); + block.setTypeIdAndData( blockType, meta, false ); + // wph 20130210 - dont' know if this is a bug in bukkit but for chests, + // the metadata is ignored (defaults to 2 - south facing) + // only way to change data is to set it using property/bean. + block.data = meta; }; var heightFunc = function( ) { _traverse[dir].depth( that, d, depthFunc ); @@ -1337,7 +1338,6 @@ var _getStrokeDir = function( x,y ) { if you're drawing anything that bends it ends up here. */ var _arc2 = function( params ) { - var drone = params.drone; var orientation = params.orientation?params.orientation:'horizontal'; var quadrants = params.quadrants?params.quadrants:{ @@ -1490,12 +1490,13 @@ var _cylinder0 = function( block,radius,height,exactParams ) { radius: radius, fill: false, orientation: 'horizontal', - stack: height, + stack: height }; if ( exactParams ) { - arcParams.blockType = exactParams.blockType; - arcParams.meta = exactParams.meta; + for ( var p in exactParams ) { + arcParams[p] = exactParams[p]; + } }else{ var md = this._getBlockIdAndMeta(block ); arcParams.blockType = md[0]; @@ -1825,7 +1826,10 @@ for ( var p in _trees ) { }; }(_trees[p] ) ); } - +Drone.clone = function(origin) { + var result = {x: origin.x, y: origin.y, z: origin.z, world: origin.world, dir: origin.dir}; + return result; +}; // // Drone's clipboard // diff --git a/src/main/js/plugins/drone/sphere.js b/src/main/js/plugins/drone/sphere.js index 7b91a4f..a4c27b6 100644 --- a/src/main/js/plugins/drone/sphere.js +++ b/src/main/js/plugins/drone/sphere.js @@ -74,7 +74,7 @@ Drone.extend( 'sphere', function( block, radius ) { this.up( v ) .fwd( h ) .right( h ) - .cylinder( block, sr, sh, { blockType: bm[0], meta: bm[1] } ) + .cylinder( block, sr, sh, { blockType: bm[0], meta: bm[1]} ) .left( h ) .back( h ) .down( v );