Make drone build processing more evenly distributed for multiple players
This commit is contained in:
parent
9bbc3a45ca
commit
3c7f8ae94e
6 changed files with 124 additions and 53 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -15,3 +15,5 @@ build.local.properties
|
|||
/src/main/javascript/plugins/.#example-1.js
|
||||
/nbproject/private/private.xml
|
||||
/nbproject/project.xml
|
||||
/src/docs/nbproject/private/
|
||||
/src/docs/build/
|
|
@ -62,7 +62,7 @@ easy addition of 'Mods' and extensions to Minecraft. ScriptCraft is a
|
|||
difficult but CraftBukkit makes it easy. Follow these steps to
|
||||
Install ScriptCraft on your computer...
|
||||
|
||||
1. [Download and install CraftBukkit][dlbuk]. Then follow the [Bukkit
|
||||
1. [Download and install CraftBukkit][dlbuk2] (choose either Recommended, Beta or Development) . Then follow the [Bukkit
|
||||
Installation Instructions][bii]. (Tip: You can grab the very latest
|
||||
version of bukkit from the [alternative versions list][dlbuk2])
|
||||
|
||||
|
@ -139,8 +139,13 @@ Minecraft server and are ready to connect ...
|
|||
4. Type any name you like in the name field then type `localhost` in the
|
||||
address field. `localhost` is a special internet address that points to
|
||||
your own computer.
|
||||
5. Click 'Join Server' to join the craftbukkit server.
|
||||
If you get a message of client disconnected, check your client version. If it's 1.7.2, you need to edit your profile and select 1.6.4 to match craftbukkit.
|
||||
5. Click 'Join Server' to join the craftbukkit server. If the version
|
||||
of Minecraft is incompatible with the version of CraftBukkit you will
|
||||
not be able to connect to the server. To fix this, you can create a
|
||||
Minecraft profile in your client. Profiles let you decide which
|
||||
version of Minecraft client you want to run so that your client and
|
||||
server are compatible.
|
||||
|
||||
6. Once you've joined the game, press the `/` key located at the bottom
|
||||
right of your keyboard. A prompt will appear. Type the following then
|
||||
press enter: `js 1 + 1` The number 2 should be displayed.
|
||||
|
@ -1269,7 +1274,6 @@ different objects and methods available for use by ScriptCraft.
|
|||
|
||||
|
||||
[buk]: http://wiki.bukkit.org/Setting_up_a_server
|
||||
[dlbuk]: http://dl.bukkit.org/
|
||||
[dlbuk2]: http://dl.bukkit.org/downloads/craftbukkit/
|
||||
[bii]: http://wiki.bukkit.org/Setting_up_a_server
|
||||
[sc-plugin]: http://scriptcraftjs.org/download/
|
||||
|
|
14
nbproject/ide-targets.xml
Normal file
14
nbproject/ide-targets.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project basedir=".." name="scriptcraft-IDE">
|
||||
<import file="../build.xml"/>
|
||||
<!-- TODO: edit the following target according to your needs -->
|
||||
<!-- (more info: http://www.netbeans.org/kb/articles/freeform-config.html#debugj2se) -->
|
||||
<target depends="server-setup, package, update-live-cb" description="Starts Bukkit with ScriptCraft" name="debug-nb">
|
||||
<echo>Starting Bukkit with ScriptCraft</echo>
|
||||
<nbjpdastart addressproperty="jpda.address" name="scriptcraft" transport="dt_socket"/>
|
||||
<java dir="${minecraft.dir}" fork="true" jar="${minecraft.dir}/craftbukkit.jar" maxmemory="1024m">
|
||||
<jvmarg value="-Xdebug"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
||||
</java>
|
||||
</target>
|
||||
</project>
|
11
src/docs/templates/ypgpm.md
vendored
11
src/docs/templates/ypgpm.md
vendored
|
@ -26,7 +26,7 @@ easy addition of 'Mods' and extensions to Minecraft. ScriptCraft is a
|
|||
difficult but CraftBukkit makes it easy. Follow these steps to
|
||||
Install ScriptCraft on your computer...
|
||||
|
||||
1. [Download and install CraftBukkit][dlbuk]. Then follow the [Bukkit
|
||||
1. [Download and install CraftBukkit][dlbuk2] (choose either Recommended, Beta or Development) . Then follow the [Bukkit
|
||||
Installation Instructions][bii]. (Tip: You can grab the very latest
|
||||
version of bukkit from the [alternative versions list][dlbuk2])
|
||||
|
||||
|
@ -103,7 +103,13 @@ Minecraft server and are ready to connect ...
|
|||
4. Type any name you like in the name field then type `localhost` in the
|
||||
address field. `localhost` is a special internet address that points to
|
||||
your own computer.
|
||||
5. Click 'Join Server' to join the craftbukkit server.
|
||||
5. Click 'Join Server' to join the craftbukkit server. If the version
|
||||
of Minecraft is incompatible with the version of CraftBukkit you will
|
||||
not be able to connect to the server. To fix this, you can create a
|
||||
Minecraft profile in your client. Profiles let you decide which
|
||||
version of Minecraft client you want to run so that your client and
|
||||
server are compatible.
|
||||
|
||||
6. Once you've joined the game, press the `/` key located at the bottom
|
||||
right of your keyboard. A prompt will appear. Type the following then
|
||||
press enter: `js 1 + 1` The number 2 should be displayed.
|
||||
|
@ -1232,7 +1238,6 @@ different objects and methods available for use by ScriptCraft.
|
|||
|
||||
|
||||
[buk]: http://wiki.bukkit.org/Setting_up_a_server
|
||||
[dlbuk]: http://dl.bukkit.org/
|
||||
[dlbuk2]: http://dl.bukkit.org/downloads/craftbukkit/
|
||||
[bii]: http://wiki.bukkit.org/Setting_up_a_server
|
||||
[sc-plugin]: http://scriptcraftjs.org/download/
|
||||
|
|
|
@ -14,17 +14,20 @@ var Drone = require('../drone').Drone;
|
|||
Drone.extend('cottage',function ( ) {
|
||||
this.chkpt('cottage')
|
||||
.box0(48,7,2,6) // 4 walls
|
||||
.right(3).door() // door front and center
|
||||
.up(1).left(2).box(102) // windows to left and right
|
||||
.right(4).box(102)
|
||||
.left(5).up().prism0(53,7,6);
|
||||
//
|
||||
// put up a sign near door.
|
||||
//
|
||||
this.down().right(4)
|
||||
.sign(['Home','Sweet','Home'],68);
|
||||
|
||||
return this.move('cottage');
|
||||
.right(3)
|
||||
.door() // door front and center
|
||||
.up(1)
|
||||
.left(2)
|
||||
.box(102) // windows to left and right
|
||||
.right(4)
|
||||
.box(102)
|
||||
.left(5)
|
||||
.up()
|
||||
.prism0(53,7,6)
|
||||
.down()
|
||||
.right(4)
|
||||
.sign(['Home','Sweet','Home'],68)
|
||||
.move('cottage');
|
||||
});
|
||||
//
|
||||
// a more complex script that builds an tree-lined avenue with
|
||||
|
@ -41,8 +44,9 @@ Drone.extend('cottage_road', function( numberCottages ) {
|
|||
var cottagesPerSide = Math.floor(numberCottages/2);
|
||||
this
|
||||
.chkpt('cottage_road') // make sure the drone's state is saved.
|
||||
.box(43,3,1,cottagesPerSide*(distanceBetweenTrees+1)) // build the road
|
||||
.up().right() // now centered in middle of road
|
||||
.box( 43, 3, 1, cottagesPerSide * ( distanceBetweenTrees + 1 ) ) // build the road
|
||||
.up()
|
||||
.right() // now centered in middle of road
|
||||
.chkpt('cr'); // will be returning to this position later
|
||||
|
||||
//
|
||||
|
@ -50,26 +54,39 @@ Drone.extend('cottage_road', function( numberCottages ) {
|
|||
//
|
||||
for ( ; i < cottagesPerSide+1;i++ ) {
|
||||
this
|
||||
.left(5).oak()
|
||||
.right(10).oak()
|
||||
.left(5)
|
||||
.oak()
|
||||
.right(10)
|
||||
.oak()
|
||||
.left(5) // return to middle of road
|
||||
.fwd(distanceBetweenTrees+1); // move forward.
|
||||
.fwd( distanceBetweenTrees + 1 ); // move forward.
|
||||
}
|
||||
this.move('cr').back(6); // move back 1/2 the distance between trees
|
||||
this
|
||||
.move('cr')
|
||||
.back(6); // move back 1/2 the distance between trees
|
||||
|
||||
// this function builds a path leading to a cottage.
|
||||
function pathAndCottage( d ) {
|
||||
return d.down().box(43,1,1,5).fwd(5).left(3).up().cottage();
|
||||
function pathAndCottage( drone ) {
|
||||
drone
|
||||
.down()
|
||||
.box(43,1,1,5)
|
||||
.fwd(5)
|
||||
.left(3)
|
||||
.up()
|
||||
.cottage();
|
||||
return drone;
|
||||
};
|
||||
//
|
||||
// step 3 build cottages on each side
|
||||
//
|
||||
for ( i = 0; i < cottagesPerSide; i++ ) {
|
||||
this.fwd(distanceBetweenTrees+1).chkpt('r'+i);
|
||||
this
|
||||
.fwd( distanceBetweenTrees + 1 )
|
||||
.chkpt('r'+i);
|
||||
// build cottage on left
|
||||
pathAndCottage( this.turn(3) ).move( 'r' + i );
|
||||
// build cottage on right
|
||||
pathAndCottage(this.turn()).move( 'r' + i );
|
||||
pathAndCottage( this.turn() ).move( 'r' + i );
|
||||
}
|
||||
// return drone to where it was at start of function
|
||||
return this.move('cottage_road');
|
||||
|
|
|
@ -658,13 +658,13 @@ var putBlock = function( x, y, z, blockId, metadata, world ) {
|
|||
}
|
||||
};
|
||||
|
||||
var putSign = function( texts, x, y, z, blockId, meta, world, immediate ) {
|
||||
var putSign = function( drone, x, y, z, world, texts, blockId, meta, immediate ) {
|
||||
var i,
|
||||
block,
|
||||
state;
|
||||
|
||||
if ( !immediate ) {
|
||||
Drone.queue.push(function(){ putSign(texts, x, y, z, blockId, meta, world, true); });
|
||||
getQueue(drone).push(function(){ putSign( drone, x, y, z, world, texts, blockId, meta, true); });
|
||||
return;
|
||||
}
|
||||
if ( blockId != 63 && blockId != 68 ) {
|
||||
|
@ -755,9 +755,15 @@ exports.Drone = Drone;
|
|||
exports.blocks = blocks;
|
||||
|
||||
Drone.queue = [];
|
||||
|
||||
Drone.opsPerSec = 10;
|
||||
Drone.processQueue = function(){
|
||||
var process = Drone.queue.shift();
|
||||
var process,
|
||||
i = 0,
|
||||
queues = getAllQueues();
|
||||
|
||||
for ( ; i < queues.length; i++ ) {
|
||||
process = queues[i].shift();
|
||||
if (process){
|
||||
try {
|
||||
process();
|
||||
|
@ -765,11 +771,17 @@ Drone.processQueue = function(){
|
|||
console.log('Drone build error: %s', e);
|
||||
}
|
||||
}
|
||||
setTimeout(Drone.processQueue,1000/Drone.opsPerSec);
|
||||
}
|
||||
setTimeout( Drone.processQueue, 1000 / Drone.opsPerSec );
|
||||
};
|
||||
setTimeout(Drone.processQueue,1000/Drone.opsPerSec);
|
||||
addUnloadHandler(function(){
|
||||
var pendingBuildOps = Drone.queue.length;
|
||||
setTimeout( Drone.processQueue, 1000 / Drone.opsPerSec );
|
||||
|
||||
addUnloadHandler( function() {
|
||||
var pendingBuildOps = 0;
|
||||
var allQueues = getAllQueues();
|
||||
for (var i = 0; i < allQueues.length; i++){
|
||||
pendingBuildOps += allQueues[i].length;
|
||||
}
|
||||
if (pendingBuildOps > 0){
|
||||
console.warn('There were ' + pendingBuildOps + ' pending build operations which were cancelled');
|
||||
}
|
||||
|
@ -792,15 +804,7 @@ Drone.extend = function( name, func ) {
|
|||
|
||||
global[name] = function( ) {
|
||||
var result = new Drone( self );
|
||||
var len = Drone.queue.length;
|
||||
result[name].apply( result, arguments );
|
||||
var newLen = Drone.queue.length;
|
||||
if ( len > (3 * Drone.opsPerSec) || (newLen - len) > (3 * Drone.opsPerSec)) {
|
||||
if ( result.player && !result.playerNotifiedPending ) {
|
||||
result.player.sendMessage('Build queue will complete in ' + Math.ceil( newLen / Drone.opsPerSec ) + ' seconds (approx.)');
|
||||
result.playerNotifiedPending = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
};
|
||||
|
@ -1008,12 +1012,37 @@ Drone.extend( 'sign', function( message, block ) {
|
|||
if ( block == 63 ) {
|
||||
meta = ( 12 + ( ( this.dir + 2 ) * 4 ) ) % 16;
|
||||
}
|
||||
putSign( message, this.x, this.y, this.z, block, meta, this.world );
|
||||
putSign( this, this.x, this.y, this.z, this.world, message, block, meta);
|
||||
if ( block == 68 ) {
|
||||
this.fwd();
|
||||
}
|
||||
});
|
||||
|
||||
var playerQueues = {};
|
||||
/*
|
||||
if the drone has an associated player, then use that player's queue otherwise
|
||||
use the global queue.
|
||||
*/
|
||||
function getQueue( drone ){
|
||||
if ( drone.player ) {
|
||||
var playerName = ''+drone.player.name;
|
||||
var result = playerQueues[playerName];
|
||||
if (result === undefined){
|
||||
playerQueues[playerName] = [];
|
||||
return playerQueues[playerName];
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
return Drone.queue;
|
||||
}
|
||||
}
|
||||
function getAllQueues() {
|
||||
var result = [ Drone.queue ];
|
||||
for (var pq in playerQueues) {
|
||||
result.push(playerQueues[pq]) ;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
Drone.prototype.cuboida = function(/* Array */ blocks, w, h, d, overwrite, immediate ) {
|
||||
|
||||
var len = blocks.length,
|
||||
|
@ -1024,7 +1053,7 @@ Drone.prototype.cuboida = function(/* Array */ blocks, w, h, d, overwrite, immed
|
|||
blocks[i] = this._getBlockIdAndMeta( blocks[ i ] );
|
||||
}
|
||||
var clone = Drone.clone(this);
|
||||
Drone.queue.push(this.cuboida.bind(clone, blocks, w, h, d, overwrite, true) );
|
||||
getQueue(this).push(this.cuboida.bind(clone, blocks, w, h, d, overwrite, true) );
|
||||
return this;
|
||||
}
|
||||
if ( typeof overwrite == 'undefined' ) {
|
||||
|
@ -1096,7 +1125,7 @@ Drone.prototype.cuboidX = function( blockType, meta, w, h, d, immediate ) {
|
|||
|
||||
if ( !immediate ) {
|
||||
var clone = Drone.clone(this);
|
||||
Drone.queue.push(this.cuboidX.bind(clone, blockType, meta, w, h, d, true));
|
||||
getQueue(this).push(this.cuboidX.bind(clone, blockType, meta, w, h, d, true));
|
||||
return this;
|
||||
}
|
||||
var depthFunc = function( ) {
|
||||
|
@ -1550,7 +1579,7 @@ var _paste = function( name, immediate )
|
|||
{
|
||||
|
||||
if ( !immediate ) {
|
||||
Drone.queue.push(function(){ _paste(name, true);});
|
||||
getQueue(this).push(function(){ _paste(name, true);});
|
||||
return;
|
||||
}
|
||||
var ccContent = Drone.clipBoard[name];
|
||||
|
|
Reference in a new issue