Persistence - Yay
This commit is contained in:
parent
eb42cf3c11
commit
e46451b13b
6 changed files with 423 additions and 508 deletions
|
@ -1,90 +1,124 @@
|
||||||
/*************************************************************************
|
/*
|
||||||
*
|
|
||||||
* The arrows mod adds fancy arrows to the game.
|
The arrows mod adds fancy arrows to the game.
|
||||||
*
|
|
||||||
* Usage:
|
Usage:
|
||||||
* /js arrows.sign() turns a targeted sign into a Arrows menu
|
|
||||||
* /js arrows.normal() sets arrow type to normal.
|
/js arrows.sign() turns a targeted sign into a Arrows menu
|
||||||
* /js arrows.explosive() - makes arrows explode.
|
/js arrows.normal() sets arrow type to normal.
|
||||||
* /js arrows.teleport() - makes player teleport to where arrow has landed.
|
/js arrows.explosive() - makes arrows explode.
|
||||||
* /js arrows.flourish() - makes a tree grow where the arrow lands.
|
/js arrows.teleport() - makes player teleport to where arrow has landed.
|
||||||
* /js arrows.lightning() - lightning strikes where the arrow lands.
|
/js arrows.flourish() - makes a tree grow where the arrow lands.
|
||||||
*
|
/js arrows.lightning() - lightning strikes where the arrow lands.
|
||||||
* All of the above functions can take an optional player object or name as
|
|
||||||
* a parameter. E.g.
|
All of the above functions can take an optional player object or name as
|
||||||
*
|
a parameter. E.g.
|
||||||
* /js arrows.explosive('player23') makes player23's arrows explosive.
|
|
||||||
*
|
/js arrows.explosive('player23') makes player23's arrows explosive.
|
||||||
************************************************************************/
|
|
||||||
var rootDir = __folder;
|
*/
|
||||||
load(rootDir + "../signs/select.js");
|
|
||||||
load(rootDir + "../events/events.js");
|
var arrows = arrows || plugin("arrows",{
|
||||||
var arrows = arrows || {};
|
/*
|
||||||
// ------------------------------------------------------------------------
|
turn a sign into a menu of arrow choices
|
||||||
// Private implementation
|
*/
|
||||||
// ------------------------------------------------------------------------
|
sign: function(sign){},
|
||||||
|
/*
|
||||||
|
change player's arrows to normal
|
||||||
|
*/
|
||||||
|
normal: function(player){},
|
||||||
|
/*
|
||||||
|
change player's arrows to explode on impact
|
||||||
|
*/
|
||||||
|
explosive: function(player){},
|
||||||
|
/*
|
||||||
|
change player's arrows to teleporting
|
||||||
|
*/
|
||||||
|
teleport: function(player){},
|
||||||
|
/*
|
||||||
|
change player's arrows to plant trees where they land
|
||||||
|
*/
|
||||||
|
flourish: function(player){},
|
||||||
|
/*
|
||||||
|
change player's arrows to strike lightning where they land
|
||||||
|
*/
|
||||||
|
lightning: function(player){}
|
||||||
|
},true);
|
||||||
|
|
||||||
|
/*
|
||||||
|
private implementation of normal, explosive, teleport, flourish and lightning functions
|
||||||
|
*/
|
||||||
(function(){
|
(function(){
|
||||||
var _players = {};
|
//
|
||||||
//
|
// setup functions for the arrow types
|
||||||
// setup functions for the arrow types
|
//
|
||||||
//
|
var _types = {normal: 0, explosive: 1, teleport: 2, flourish: 3, lightning: 4};
|
||||||
var _types = {normal: 0, explosive: 1, teleport: 2, flourish: 3, lightning: 4};
|
for (var type in _types)
|
||||||
for (var i in _types){
|
{
|
||||||
arrows[[i]] = (function(n){
|
arrows[type] = (function(n){
|
||||||
return function(player){
|
return function(player){
|
||||||
if (typeof player == "undefined")
|
if (typeof player == "undefined")
|
||||||
player = __self;
|
player = __self;
|
||||||
var playerName = null;
|
var playerName = null;
|
||||||
if (typeof player == "string")
|
if (typeof player == "string")
|
||||||
playerName = player;
|
playerName = player;
|
||||||
else
|
else
|
||||||
playerName = player.name;
|
playerName = player.name;
|
||||||
_players[playerName] = n;
|
arrows.store.players[playerName] = n;
|
||||||
};
|
};
|
||||||
})(_types[i]);
|
})(_types[type]);
|
||||||
}
|
}
|
||||||
if (typeof arrows.sign != "undefined")
|
|
||||||
return;
|
|
||||||
|
|
||||||
var _arrowSign =
|
|
||||||
signs.select("Arrow",
|
|
||||||
["Normal","Explosive","Teleport","Flourish","Lightning"],
|
|
||||||
function(player,sign,selectedText,selectedIndex){
|
|
||||||
_players[player.name] = selectedIndex;
|
|
||||||
});
|
|
||||||
//
|
|
||||||
// event handler called when a projectile hits something
|
|
||||||
//
|
|
||||||
var _onArrowHit = function(listener,event)
|
|
||||||
{
|
|
||||||
var projectile = event.entity;
|
|
||||||
var world = projectile.world;
|
|
||||||
var shooter = projectile.shooter;
|
|
||||||
if (projectile instanceof org.bukkit.entity.Arrow &&
|
|
||||||
shooter instanceof org.bukkit.entity.Player)
|
|
||||||
{
|
|
||||||
var arrowType = _players[shooter.name];
|
|
||||||
switch (arrowType){
|
|
||||||
case 1:
|
|
||||||
projectile.remove();
|
|
||||||
world.createExplosion(projectile.location,2.5);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
projectile.remove();
|
|
||||||
shooter.teleport(projectile.location,
|
|
||||||
org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.ENDER_PEARL);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
projectile.remove();
|
|
||||||
world.generateTree(projectile.location, org.bukkit.TreeType.BIG_TREE);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
projectile.remove();
|
|
||||||
world.strikeLightning(projectile.location);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
arrows.sign = _arrowSign;
|
|
||||||
events.on("entity.ProjectileHitEvent",_onArrowHit);
|
|
||||||
}());
|
}());
|
||||||
|
/*
|
||||||
|
Arrows depends on 2 other modules: 'signs' and 'events' so the following code
|
||||||
|
can't execute until all modules have loaded (ready).
|
||||||
|
*/
|
||||||
|
ready(function()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
called when the player chooses an arrow option from a menu sign
|
||||||
|
*/
|
||||||
|
var _onMenuChoice = function(event){
|
||||||
|
if (typeof arrows.store.players == "undefined")
|
||||||
|
arrows.store.players = {};
|
||||||
|
arrows.store.players[event.player.name] = event.number;
|
||||||
|
};
|
||||||
|
arrows.sign = signs.menu("Arrow",
|
||||||
|
["Normal","Explosive","Teleport","Flourish","Lightning"],
|
||||||
|
_onMenuChoice );
|
||||||
|
|
||||||
|
/*
|
||||||
|
event handler called when a projectile hits something
|
||||||
|
*/
|
||||||
|
var _onArrowHit = function(listener,event)
|
||||||
|
{
|
||||||
|
var projectile = event.entity;
|
||||||
|
var world = projectile.world;
|
||||||
|
var shooter = projectile.shooter;
|
||||||
|
if (projectile instanceof org.bukkit.entity.Arrow &&
|
||||||
|
shooter instanceof org.bukkit.entity.Player)
|
||||||
|
{
|
||||||
|
var arrowType = arrows.store.players[shooter.name];
|
||||||
|
switch (arrowType){
|
||||||
|
case 1:
|
||||||
|
projectile.remove();
|
||||||
|
world.createExplosion(projectile.location,2.5);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
projectile.remove();
|
||||||
|
shooter.teleport(projectile.location,
|
||||||
|
org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.ENDER_PEARL);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
projectile.remove();
|
||||||
|
world.generateTree(projectile.location, org.bukkit.TreeType.BIG_TREE);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
projectile.remove();
|
||||||
|
world.strikeLightning(projectile.location);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
events.on("entity.ProjectileHitEvent",_onArrowHit);
|
||||||
|
});
|
||||||
|
|
|
@ -1,131 +1,131 @@
|
||||||
//
|
//
|
||||||
// define these primitive methods used by drone.js (and potentiall others)
|
// Define these primitive methods used by drone.js (and potentiall others)
|
||||||
//
|
//
|
||||||
// getPlayerPos returns the player's x,y,z and yaw (direction)
|
// getPlayerPos returns the player's x,y,z and yaw (direction)
|
||||||
// getMousePos returns the x,y,z of the current block being targeted.
|
// getMousePos returns the x,y,z of the current block being targeted.
|
||||||
// putBlock(x,y,z,blockId,metadata) puts a block at a location in current world
|
// putBlock(x,y,z,blockId,metadata) puts a block at a location in current world
|
||||||
// getBlock(x,y,z) gets the block and metadata (returned as a string in form '35:15')
|
// getBlock(x,y,z) gets the block and metadata (returned as a string in form '35:15')
|
||||||
// putSign(texts,x,y,z,blockId,metadata) puts a sign at the given location
|
// putSign(texts,x,y,z,blockId,metadata) puts a sign at the given location
|
||||||
// notifyAdministrators(msg) sends a message to all admins/ops.
|
// notifyAdministrators(msg) sends a message to all admins/ops.
|
||||||
// echo(msg) prints a message on screen to current user.
|
// echo(msg) prints a message on screen to current user.
|
||||||
//
|
//
|
||||||
(function(){
|
(function(){
|
||||||
|
|
||||||
//
|
//
|
||||||
// only execute once
|
// only execute once
|
||||||
//
|
//
|
||||||
if (typeof getPlayerPos != "undefined"){
|
if (typeof getPlayerPos != "undefined"){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var _getPlayerPos = function(){
|
var _getPlayerPos = function(){
|
||||||
if (typeof __self == "undefined")
|
if (typeof __self == "undefined")
|
||||||
return;
|
return;
|
||||||
return __self.location;
|
return __self.location;
|
||||||
};
|
};
|
||||||
|
|
||||||
var _getMousePos = function(){
|
var _getMousePos = function(){
|
||||||
if (typeof __self == "undefined")
|
if (typeof __self == "undefined")
|
||||||
return;
|
return;
|
||||||
// __self might be CONSOLE or a CommandBlock
|
// __self might be CONSOLE or a CommandBlock
|
||||||
if (!__self.getTargetBlock)
|
if (!__self.getTargetBlock)
|
||||||
return;
|
return;
|
||||||
var targetedBlock = __self.getTargetBlock(null,5);
|
var targetedBlock = __self.getTargetBlock(null,5);
|
||||||
if (targetedBlock == null || targetedBlock.isEmpty()){
|
if (targetedBlock == null || targetedBlock.isEmpty()){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return targetedBlock.location;
|
return targetedBlock.location;
|
||||||
};
|
};
|
||||||
|
|
||||||
var _putBlock = function(x,y,z,blockId,metadata){
|
var _putBlock = function(x,y,z,blockId,metadata){
|
||||||
|
|
||||||
if (typeof metadata == "undefined"){
|
if (typeof metadata == "undefined"){
|
||||||
metadata = 0;
|
metadata = 0;
|
||||||
}
|
}
|
||||||
var world = _getWorld();
|
var world = _getWorld();
|
||||||
if (!world)
|
if (!world)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var block = world.getBlockAt(x,y,z);
|
var block = world.getBlockAt(x,y,z);
|
||||||
|
|
||||||
if (blockId === 6){
|
if (blockId === 6){
|
||||||
var treeType = null;
|
var treeType = null;
|
||||||
switch (metadata){
|
switch (metadata){
|
||||||
case 0:
|
case 0:
|
||||||
treeType = org.bukkit.TreeType.BIG_TREE;
|
treeType = org.bukkit.TreeType.BIG_TREE;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
treeType = org.bukkit.TreeType.REDWOOD;
|
treeType = org.bukkit.TreeType.REDWOOD;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
treeType = org.bukkit.TreeType.BIRCH;
|
treeType = org.bukkit.TreeType.BIRCH;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
treeType = org.bukkit.TreeType.JUNGLE;
|
treeType = org.bukkit.TreeType.JUNGLE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return world.generateTree(block.location,treeType);
|
return world.generateTree(block.location,treeType);
|
||||||
}else{
|
}else{
|
||||||
block.setTypeId(blockId);
|
block.setTypeId(blockId);
|
||||||
block.setData(metadata);
|
block.setData(metadata);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var _putSign = function(texts, x, y, z, blockId, meta){
|
var _putSign = function(texts, x, y, z, blockId, meta){
|
||||||
putBlock(x,y,z,blockId,meta);
|
putBlock(x,y,z,blockId,meta);
|
||||||
var block = _getBlockObject(x,y,z);
|
var block = _getBlockObject(x,y,z);
|
||||||
state = block.state;
|
state = block.state;
|
||||||
if (state instanceof org.bukkit.block.Sign){
|
if (state instanceof org.bukkit.block.Sign){
|
||||||
for (var i = 0;i < texts.length; i++)
|
for (var i = 0;i < texts.length; i++)
|
||||||
state.setLine(i%4,texts[i]);
|
state.setLine(i%4,texts[i]);
|
||||||
state.update(true);
|
state.update(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var _getBlock = function(x,y,z){
|
var _getBlock = function(x,y,z){
|
||||||
var block = _getBlockObject(x,y,z);
|
var block = _getBlockObject(x,y,z);
|
||||||
if (block)
|
if (block)
|
||||||
return "" + block.typeId + ":" + block.data;
|
return "" + block.typeId + ":" + block.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
var _getBlockObject = function(x,y,z){
|
var _getBlockObject = function(x,y,z){
|
||||||
var world = _getWorld();
|
var world = _getWorld();
|
||||||
if (world)
|
if (world)
|
||||||
return world.getBlockAt(x,y,z);
|
return world.getBlockAt(x,y,z);
|
||||||
};
|
};
|
||||||
|
|
||||||
var _getWorld = function(){
|
var _getWorld = function(){
|
||||||
if (typeof __self == "undefined")
|
if (typeof __self == "undefined")
|
||||||
return;
|
return;
|
||||||
if (__self instanceof org.bukkit.command.BlockCommandSender)
|
if (__self instanceof org.bukkit.command.BlockCommandSender)
|
||||||
return __self.block.location.world;
|
return __self.block.location.world;
|
||||||
if (__self instanceof org.bukkit.entity.Player)
|
if (__self instanceof org.bukkit.entity.Player)
|
||||||
return __self.location.world;
|
return __self.location.world;
|
||||||
};
|
};
|
||||||
|
|
||||||
var _notifyAdministrators = function(msg){
|
var _notifyAdministrators = function(msg){
|
||||||
var ops = __plugin.server.operators;
|
var ops = __plugin.server.operators;
|
||||||
for (var i = 0; i < ops.size();i++){
|
for (var i = 0; i < ops.size();i++){
|
||||||
if (ops[i].isOnline())
|
if (ops[i].isOnline())
|
||||||
ops[i].player.chat(msg);
|
ops[i].player.chat(msg);
|
||||||
}
|
}
|
||||||
__plugin.logger.info(msg);
|
__plugin.logger.info(msg);
|
||||||
};
|
};
|
||||||
var _echo = function(msg){
|
var _echo = function(msg){
|
||||||
__plugin.logger.info(msg);
|
__plugin.logger.info(msg);
|
||||||
if (typeof __self == "undefined"){
|
if (typeof __self == "undefined"){
|
||||||
java.lang.System.out.println(msg);
|
java.lang.System.out.println(msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
__self.sendMessage(msg);
|
__self.sendMessage(msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
getPlayerPos = _getPlayerPos;
|
getPlayerPos = _getPlayerPos;
|
||||||
getMousePos = _getMousePos;
|
getMousePos = _getMousePos;
|
||||||
putBlock = _putBlock;
|
putBlock = _putBlock;
|
||||||
getBlock = _getBlock;
|
getBlock = _getBlock;
|
||||||
putSign = _putSign;
|
putSign = _putSign;
|
||||||
notifyAdministrators = _notifyAdministrators;
|
notifyAdministrators = _notifyAdministrators;
|
||||||
echo = _echo;
|
echo = _echo;
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -5,13 +5,14 @@
|
||||||
|
|
||||||
save (object, filename) - saves an object to a file.
|
save (object, filename) - saves an object to a file.
|
||||||
|
|
||||||
plugin (name, interface, isPersistent) - defines a new plugin. If isPersistent is true then
|
plugin (name, interface, isPersistent)
|
||||||
the plugin doesn't have to worry about loading and saving
|
- defines a new plugin. If isPersistent is true then
|
||||||
state - that will be done by the framework. Just make sure
|
the plugin doesn't have to worry about loading and saving
|
||||||
that anything you want to save (and restore) is in the 'store'
|
state - that will be done by the framework. Just make sure
|
||||||
property - this will be created automatically if not already defined.
|
that anything you want to save (and restore) is in the 'store'
|
||||||
(its type is object {} )
|
property - this will be created automatically if not already defined.
|
||||||
|
(its type is object {} )
|
||||||
|
|
||||||
ready (function) - specifies code to be executed only when all the plugins have loaded.
|
ready (function) - specifies code to be executed only when all the plugins have loaded.
|
||||||
|
|
||||||
command (name, function) - defines a command that can be used by non-operators.
|
command (name, function) - defines a command that can be used by non-operators.
|
||||||
|
@ -32,25 +33,23 @@ var verbose = true;//verbose || false;
|
||||||
var _canonize = function(file){ return file.getCanonicalPath().replaceAll("\\\\","/"); };
|
var _canonize = function(file){ return file.getCanonicalPath().replaceAll("\\\\","/"); };
|
||||||
|
|
||||||
var _originalScript = __script;
|
var _originalScript = __script;
|
||||||
var parentFileObj = new java.io.File(__script).getParentFile();
|
var parentFileObj = new java.io.File(__script).getParentFile();
|
||||||
var jsPluginsRootDir = parentFileObj.getParentFile();
|
var jsPluginsRootDir = parentFileObj.getParentFile();
|
||||||
var jsPluginsRootDirName = _canonize(jsPluginsRootDir);
|
var jsPluginsRootDirName = _canonize(jsPluginsRootDir);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Load the contents of the file and evaluate as javascript
|
||||||
Load the contents of the file and evaluate as javascript
|
*/
|
||||||
|
|
||||||
*/
|
|
||||||
var _load = function(filename)
|
var _load = function(filename)
|
||||||
{
|
{
|
||||||
var result = null;
|
var result = null;
|
||||||
var file = new java.io.File(filename);
|
var file = new java.io.File(filename);
|
||||||
|
|
||||||
var canonizedFilename = _canonize(file);
|
var canonizedFilename = _canonize(file);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
print("loading " + canonizedFilename);
|
print("loading " + canonizedFilename);
|
||||||
|
|
||||||
if (file.exists()){
|
if (file.exists()){
|
||||||
var parent = file.getParentFile();
|
var parent = file.getParentFile();
|
||||||
|
@ -61,13 +60,11 @@ var verbose = true;//verbose || false;
|
||||||
}else{
|
}else{
|
||||||
print("Error: " + canonizedFilename + " not found");
|
print("Error: " + canonizedFilename + " not found");
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
|
recursively walk the given directory and return a list of all .js files
|
||||||
recursively walk the given directory and return a list of all .js files
|
*/
|
||||||
|
|
||||||
*/
|
|
||||||
var _listJsFiles = function(store,dir)
|
var _listJsFiles = function(store,dir)
|
||||||
{
|
{
|
||||||
if (typeof dir == "undefined"){
|
if (typeof dir == "undefined"){
|
||||||
|
@ -75,24 +72,22 @@ var verbose = true;//verbose || false;
|
||||||
}
|
}
|
||||||
var files = dir.listFiles();
|
var files = dir.listFiles();
|
||||||
for (var i = 0;i < files.length; i++){
|
for (var i = 0;i < files.length; i++){
|
||||||
var file = files[i];
|
var file = files[i];
|
||||||
if (file.isDirectory()){
|
if (file.isDirectory()){
|
||||||
_listJsFiles(store,file);
|
_listJsFiles(store,file);
|
||||||
}else{
|
}else{
|
||||||
if (file.getCanonicalPath().endsWith(".js") &&
|
if (file.getCanonicalPath().endsWith(".js") &&
|
||||||
!(file.getName().startsWith("_")) &&
|
!(file.getName().startsWith("_")) &&
|
||||||
file.exists())
|
file.exists())
|
||||||
{
|
{
|
||||||
store.push(file);
|
store.push(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
|
Reload all of the .js files in the given directory
|
||||||
Reload all of the .js files in the given directory
|
*/
|
||||||
|
|
||||||
*/
|
|
||||||
var _reload = function(pluginDir)
|
var _reload = function(pluginDir)
|
||||||
{
|
{
|
||||||
var jsFiles = [];
|
var jsFiles = [];
|
||||||
|
@ -112,76 +107,73 @@ var verbose = true;//verbose || false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Save a javascript object to a file (saves using JSON notation)
|
||||||
Save a javascript object to a file (saves using JSON notation)
|
*/
|
||||||
|
var _save = function(object, filename){
|
||||||
*/
|
print(filename);
|
||||||
var _save = function(object, filename){
|
var objectToStr = JSON.stringify(object);
|
||||||
var objectToStr = JSON.stringify(object);
|
var f = new java.io.File(filename);
|
||||||
var f = new java.io.File(filename);
|
var out = new java.io.PrintWriter(new java.io.FileWriter(f));
|
||||||
print(filename);
|
out.println("__data = " + objectToStr);
|
||||||
var out = new java.io.PrintWriter(new java.io.FileWriter(f));
|
out.close();
|
||||||
out.println("__data = " + objectToStr);
|
};
|
||||||
out.close();
|
/*
|
||||||
};
|
plugin management
|
||||||
|
*/
|
||||||
|
var _plugins = {};
|
||||||
|
var _plugin = function(/* String */ moduleName, /* Object */ moduleObject, isPersistent)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// don't load plugin more than once
|
||||||
|
//
|
||||||
|
if (typeof _plugins[moduleName] != "undefined")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var pluginData = {persistent: isPersistent, module: moduleObject};
|
||||||
|
moduleObject.store = moduleObject.store || {};
|
||||||
|
_plugins[moduleName] = pluginData;
|
||||||
|
|
||||||
/*
|
if (isPersistent)
|
||||||
plugin mgmt
|
moduleObject.store = load(jsPluginsRootDirName + "/" + moduleName + "-store.txt") || {};
|
||||||
*/
|
|
||||||
var _plugins = {};
|
global[moduleName] = moduleObject;
|
||||||
var _plugin = function(/* String */ moduleName, /* Object */ moduleObject, isPersistent)
|
return moduleObject;
|
||||||
{
|
};
|
||||||
//
|
/*
|
||||||
// don't load plugin more than once
|
allow for deferred execution (once all modules have loaded)
|
||||||
//
|
*/
|
||||||
if (typeof _plugins[moduleName] != "undefined")
|
var _deferred = [];
|
||||||
return;
|
var _ready = function( func ){
|
||||||
|
_deferred.push(func);
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
command management - allow for non-ops to execute approved javascript code.
|
||||||
|
*/
|
||||||
|
var _commands = {};
|
||||||
|
var _command = function(name,func){
|
||||||
|
if (typeof name == "undefined"){
|
||||||
|
// it's an invocation from the Java Plugin!
|
||||||
|
if (__cmdArgs.length === 0)
|
||||||
|
throw new Error("Usage: jsp command-name command-parameters");
|
||||||
|
var name = __cmdArgs[0];
|
||||||
|
func = _commands[name]
|
||||||
|
if (typeof func === "undefined")
|
||||||
|
throw new Error("Command '" + name + "' does not exist.");
|
||||||
|
var params = [];
|
||||||
|
for (var i =1; i < __cmdArgs.length;i++){
|
||||||
|
params.push("" + __cmdArgs[i]);
|
||||||
|
}
|
||||||
|
return func(params);
|
||||||
|
}else{
|
||||||
|
_commands[name] = func;
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var pluginData = {persistent: isPersistent, module: moduleObject};
|
/*
|
||||||
moduleObject.store = moduleObject.store || {};
|
Tab Completion of the /js and /jsp commands
|
||||||
_plugins[moduleName] = pluginData;
|
*/
|
||||||
|
|
||||||
if (isPersistent)
|
|
||||||
moduleObject.store = load(jsPluginsRootDirName + "/" + moduleName + "-store.txt") || {};
|
|
||||||
|
|
||||||
global[moduleName] = moduleObject;
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
allow for deferred execution (once all modules have loaded)
|
|
||||||
*/
|
|
||||||
var _deferred = [];
|
|
||||||
var _ready = function( func ){
|
|
||||||
_deferred.push(func);
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
command management - allow for non-ops to execute approved javascript code.
|
|
||||||
*/
|
|
||||||
var _commands = {};
|
|
||||||
var _command = function(name,func){
|
|
||||||
if (typeof name == "undefined"){
|
|
||||||
// it's an invocation from the Java Plugin!
|
|
||||||
if (__cmdArgs.length === 0)
|
|
||||||
throw new Error("Usage: jsp command-name command-parameters");
|
|
||||||
var name = __cmdArgs[0];
|
|
||||||
func = _commands[name]
|
|
||||||
if (typeof func === "undefined")
|
|
||||||
throw new Error("Command '" + name + "' does not exist.");
|
|
||||||
var params = [];
|
|
||||||
for (var i =1; i < __cmdArgs.length;i++){
|
|
||||||
params.push("" + __cmdArgs[i]);
|
|
||||||
}
|
|
||||||
return func(params);
|
|
||||||
}else{
|
|
||||||
_commands[name] = func;
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Tab Completion of the /js and /jsp commands
|
|
||||||
*/
|
|
||||||
var _isJavaObject = function(o){
|
var _isJavaObject = function(o){
|
||||||
var result = false;
|
var result = false;
|
||||||
try {
|
try {
|
||||||
|
@ -198,10 +190,10 @@ var verbose = true;//verbose || false;
|
||||||
{
|
{
|
||||||
var result = [];
|
var result = [];
|
||||||
if (_isJavaObject(o))
|
if (_isJavaObject(o))
|
||||||
{
|
{
|
||||||
propertyLoop:
|
propertyLoop:
|
||||||
for (var i in o)
|
for (var i in o)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// don't include standard Object methods
|
// don't include standard Object methods
|
||||||
//
|
//
|
||||||
|
@ -228,32 +220,32 @@ var verbose = true;//verbose || false;
|
||||||
}
|
}
|
||||||
return result.sort();
|
return result.sort();
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
Tab completion for the /jsp commmand
|
Tab completion for the /jsp commmand
|
||||||
*/
|
*/
|
||||||
var __onTabCompleteJSP = function() {
|
var __onTabCompleteJSP = function() {
|
||||||
var result = global.__onTC_result;
|
var result = global.__onTC_result;
|
||||||
for (var i in _commands)
|
for (var i in _commands)
|
||||||
result.add(i);
|
result.add(i);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
Tab completion for the /js command
|
Tab completion for the /js command
|
||||||
*/
|
*/
|
||||||
var __onTabCompleteJS = function()
|
var __onTabCompleteJS = function()
|
||||||
{
|
{
|
||||||
if (__onTC_cmd.name == "jsp")
|
if (__onTC_cmd.name == "jsp")
|
||||||
return __onTabCompleteJSP()
|
return __onTabCompleteJSP()
|
||||||
|
|
||||||
var _globalSymbols = _getProperties(global)
|
var _globalSymbols = _getProperties(global)
|
||||||
var result = global.__onTC_result;
|
var result = global.__onTC_result;
|
||||||
var args = global.__onTC_args;
|
var args = global.__onTC_args;
|
||||||
var propsOfLastArg = [];
|
var propsOfLastArg = [];
|
||||||
var statement = args.join(" ");
|
var statement = args.join(" ");
|
||||||
statement = statement.replace(/^\s+/,"").replace(/\s+$/,"");
|
statement = statement.replace(/^\s+/,"").replace(/\s+$/,"");
|
||||||
|
|
||||||
if (statement.length == 0)
|
if (statement.length == 0)
|
||||||
propsOfLastArg = _globalSymbols;
|
propsOfLastArg = _globalSymbols;
|
||||||
else{
|
else{
|
||||||
var statementSyms = statement.split(/[^a-zA-Z0-9_\.]/);
|
var statementSyms = statement.split(/[^a-zA-Z0-9_\.]/);
|
||||||
var lastSymbol = statementSyms[statementSyms.length-1];
|
var lastSymbol = statementSyms[statementSyms.length-1];
|
||||||
|
@ -274,28 +266,28 @@ var verbose = true;//verbose || false;
|
||||||
lastGoodSymbol = symbol;
|
lastGoodSymbol = symbol;
|
||||||
}
|
}
|
||||||
if (typeof symbol == "undefined"){
|
if (typeof symbol == "undefined"){
|
||||||
//
|
//
|
||||||
// look up partial matches against last good symbol
|
// look up partial matches against last good symbol
|
||||||
//
|
//
|
||||||
var objectProps = _getProperties(lastGoodSymbol);
|
var objectProps = _getProperties(lastGoodSymbol);
|
||||||
if (name == ""){
|
if (name == ""){
|
||||||
// if the last symbol looks like this..
|
// if the last symbol looks like this..
|
||||||
// ScriptCraft.
|
// ScriptCraft.
|
||||||
//
|
//
|
||||||
for (var i =0;i < objectProps.length;i++)
|
for (var i =0;i < objectProps.length;i++)
|
||||||
propsOfLastArg.push(statement+objectProps[i]);
|
propsOfLastArg.push(statement+objectProps[i]);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
// it looks like this..
|
// it looks like this..
|
||||||
// ScriptCraft.co
|
// ScriptCraft.co
|
||||||
//
|
//
|
||||||
var li = statement.lastIndexOf(name);
|
var li = statement.lastIndexOf(name);
|
||||||
statement = statement.substring(0,li);
|
statement = statement.substring(0,li);
|
||||||
|
|
||||||
for (var i = 0; i < objectProps.length;i++)
|
for (var i = 0; i < objectProps.length;i++)
|
||||||
if (objectProps[i].indexOf(name) == 0)
|
if (objectProps[i].indexOf(name) == 0)
|
||||||
propsOfLastArg.push(statement + objectProps[i]);
|
propsOfLastArg.push(statement + objectProps[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
var objectProps = _getProperties(symbol);
|
var objectProps = _getProperties(symbol);
|
||||||
|
@ -307,44 +299,51 @@ var verbose = true;//verbose || false;
|
||||||
for (var i = 0;i < _globalSymbols.length; i++)
|
for (var i = 0;i < _globalSymbols.length; i++)
|
||||||
if (_globalSymbols[i].indexOf(lastSymbol) == 0)
|
if (_globalSymbols[i].indexOf(lastSymbol) == 0)
|
||||||
propsOfLastArg.push(statement.replace(lastSymbol,_globalSymbols[i]));
|
propsOfLastArg.push(statement.replace(lastSymbol,_globalSymbols[i]));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var i = 0;i < propsOfLastArg.length; i++)
|
for (var i = 0;i < propsOfLastArg.length; i++)
|
||||||
result.add(propsOfLastArg[i]);
|
result.add(propsOfLastArg[i]);
|
||||||
};
|
};
|
||||||
|
|
||||||
global.load = _load;
|
/*
|
||||||
global.save = _save;
|
utility function - convert a Location to a string
|
||||||
global.reload = _reload;
|
*/
|
||||||
global.plugin = _plugin;
|
var _locToString = function(location){
|
||||||
global.ready = _ready;
|
return JSON.stringify([""+location.world.name,location.x, location.y, location.z]);
|
||||||
global.command = _command;
|
};
|
||||||
|
global.load = _load;
|
||||||
|
global.save = _save;
|
||||||
|
global.reload = _reload;
|
||||||
|
global.plugin = _plugin;
|
||||||
|
global.ready = _ready;
|
||||||
|
global.command = _command;
|
||||||
global._onTabComplete = __onTabCompleteJS;
|
global._onTabComplete = __onTabCompleteJS;
|
||||||
|
global.locationToString = _locToString;
|
||||||
|
|
||||||
//
|
//
|
||||||
// assumes this was loaded from js-plugins/core/
|
// assumes this was loaded from js-plugins/core/
|
||||||
// load all of the plugins.
|
// load all of the plugins.
|
||||||
//
|
//
|
||||||
reload(jsPluginsRootDir);
|
reload(jsPluginsRootDir);
|
||||||
|
|
||||||
//
|
//
|
||||||
// all modules have loaded
|
// all modules have loaded
|
||||||
//
|
//
|
||||||
for (var i =0;i < _deferred.length;i++)
|
for (var i =0;i < _deferred.length;i++)
|
||||||
_deferred[i]();
|
_deferred[i]();
|
||||||
|
|
||||||
events.on("server.PluginDisableEvent",function(l,e){
|
events.on("server.PluginDisableEvent",function(l,e){
|
||||||
//
|
//
|
||||||
// save all plugins which have persistent data
|
// save all plugins which have persistent data
|
||||||
//
|
//
|
||||||
for (var moduleName in _plugins){
|
for (var moduleName in _plugins){
|
||||||
var pluginData = _plugins[moduleName];
|
var pluginData = _plugins[moduleName];
|
||||||
if (pluginData.persistent)
|
if (pluginData.persistent)
|
||||||
save(pluginData.module.store, jsPluginsRootDirName + "/" + moduleName + "-store.txt");
|
save(pluginData.module.store, jsPluginsRootDirName + "/" + moduleName + "-store.txt");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ var Drone = Drone || {
|
||||||
// /js box(5).right(2).box('35:15',4,9,1)
|
// /js box(5).right(2).box('35:15',4,9,1)
|
||||||
//
|
//
|
||||||
// ... creates a single wooden block and a 2001 black obelisk that is
|
// ... creates a single wooden block and a 2001 black obelisk that is
|
||||||
// 4 wide x 9 tall x 1 long in size.
|
// 4 wide x 9 tall x 1 long in size.
|
||||||
//
|
//
|
||||||
// If you want to see what else ScriptCraft's Drone can do, read on...
|
// If you want to see what else ScriptCraft's Drone can do, read on...
|
||||||
//
|
//
|
||||||
// creating a new drone
|
// creating a new drone
|
||||||
|
@ -248,11 +248,11 @@ var Drone = Drone || {
|
||||||
// There is no need to read any further unless you want to understand how the Drone object works.
|
// There is no need to read any further unless you want to understand how the Drone object works.
|
||||||
//
|
//
|
||||||
(function(){
|
(function(){
|
||||||
//
|
//
|
||||||
// don't want to declare object more than once
|
// don't want to declare object more than once
|
||||||
//
|
//
|
||||||
if (Drone.constructor == Function)
|
if (Drone.constructor == Function)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Drone Constructor
|
// Drone Constructor
|
||||||
|
@ -270,13 +270,13 @@ var Drone = Drone || {
|
||||||
}else{
|
}else{
|
||||||
// base it on the player's current location
|
// base it on the player's current location
|
||||||
usePlayerCoords = true;
|
usePlayerCoords = true;
|
||||||
//
|
//
|
||||||
// it's possible that drone.js could be loaded by a non-playing op
|
// it's possible that drone.js could be loaded by a non-playing op
|
||||||
// (from the server console)
|
// (from the server console)
|
||||||
//
|
//
|
||||||
if (!playerPos){
|
if (!playerPos){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
this.x = playerPos.x;
|
this.x = playerPos.x;
|
||||||
this.y = playerPos.y;
|
this.y = playerPos.y;
|
||||||
this.z = playerPos.z;
|
this.z = playerPos.z;
|
||||||
|
@ -572,10 +572,10 @@ var Drone = Drone || {
|
||||||
var xo = (a-x0);
|
var xo = (a-x0);
|
||||||
var yo = (b-y0);
|
var yo = (b-y0);
|
||||||
if (fill){
|
if (fill){
|
||||||
// wph 20130114 more efficient esp. for large cylinders/spheres
|
// wph 20130114 more efficient esp. for large cylinders/spheres
|
||||||
if (yo < 0){
|
if (yo < 0){
|
||||||
drone.fwd(yo).right(xo).box(block,1,height,Math.abs(yo*2)+1).back(yo).left(xo);
|
drone.fwd(yo).right(xo).box(block,1,height,Math.abs(yo*2)+1).back(yo).left(xo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gotoxy(xo,yo).box(block,1,height,1).move('center');
|
gotoxy(xo,yo).box(block,1,height,1).move('center');
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,9 +40,9 @@ var events = events || {
|
||||||
}
|
}
|
||||||
var _event = org.bukkit.event;
|
var _event = org.bukkit.event;
|
||||||
var _plugin = org.bukkit.plugin;
|
var _plugin = org.bukkit.plugin;
|
||||||
//
|
//
|
||||||
// can't have objects that implement multiple interface in javax.scripts.*
|
// can't have objects that implement multiple interface in javax.scripts.*
|
||||||
//
|
//
|
||||||
var theListener = new _event.Listener(){};
|
var theListener = new _event.Listener(){};
|
||||||
|
|
||||||
var _on = function(eventType, handler, priority)
|
var _on = function(eventType, handler, priority)
|
||||||
|
@ -60,17 +60,17 @@ var events = events || {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var handlerList = eventType.getHandlerList();
|
var handlerList = eventType.getHandlerList();
|
||||||
var listener = {};
|
var listener = {};
|
||||||
var eventExecutor = new _plugin.EventExecutor(){
|
var eventExecutor = new _plugin.EventExecutor(){
|
||||||
execute: function(l,e){
|
execute: function(l,e){
|
||||||
handler(listener.reg,e);
|
handler(listener.reg,e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
listener.reg = new _plugin.RegisteredListener(
|
listener.reg = new _plugin.RegisteredListener(
|
||||||
theListener,eventExecutor,priority,__plugin,true
|
theListener,eventExecutor,priority,__plugin,true
|
||||||
)
|
)
|
||||||
handlerList.register(listener.reg);
|
handlerList.register(listener.reg);
|
||||||
return listener.reg;
|
return listener.reg;
|
||||||
};
|
};
|
||||||
events.on = _on;
|
events.on = _on;
|
||||||
events._eventsLoaded = true;
|
events._eventsLoaded = true;
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
load(__folder + "../events/events.js");
|
|
||||||
//
|
|
||||||
// signs module declaration
|
|
||||||
//
|
|
||||||
var signs = signs || {};
|
|
||||||
/**
|
|
||||||
* signs.select returns a function which when passed an org.bukkit.block.Sign object, will
|
|
||||||
* turn that sign into an interactive menu with a list of options which can be changed by
|
|
||||||
* right-clicking the sign.
|
|
||||||
* Usage:
|
|
||||||
*
|
|
||||||
* var dinnerMenu = signs.select("Dinner",["Lamb","Pork","Chicken","Duck","Beef"],
|
|
||||||
* function(player,sign,selectedText,selectedIndex){
|
|
||||||
* player.sendMessage("You chose " + selectedText);
|
|
||||||
* });
|
|
||||||
* ... get an org.bukkit.block.Sign object...
|
|
||||||
* var aSign = aBlock.state;
|
|
||||||
* ... turn the sign into an interactive menu.
|
|
||||||
* var dinnerMenuSign = dinnerMenu(aSign);
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
signs.select = function(/* String */ label, /* Array */ options, /* Function */ callback, /* Number */ selectedIndex){};
|
|
||||||
|
|
||||||
(function(){
|
|
||||||
if (typeof signs._refresh != "undefined")
|
|
||||||
return;
|
|
||||||
var _refresh = function(p_sign,p_selectedIndex,p_displayOptions)
|
|
||||||
{
|
|
||||||
var optLen = p_displayOptions.length;
|
|
||||||
// the offset is where the menu window begins
|
|
||||||
var offset = Math.max(0, Math.min(optLen-3, Math.floor(p_selectedIndex/3) * 3));
|
|
||||||
for (var i = 0;i < 3; i++){
|
|
||||||
var text = "";
|
|
||||||
if (offset+i < optLen)
|
|
||||||
text = p_displayOptions[offset+i];
|
|
||||||
if (offset+i == p_selectedIndex)
|
|
||||||
text = ("" + text).replace(/^ /,">");
|
|
||||||
p_sign.setLine(i+1,text);
|
|
||||||
}
|
|
||||||
p_sign.update(true);
|
|
||||||
};
|
|
||||||
var _select = function(
|
|
||||||
/* String */ label,
|
|
||||||
/* Array */ options,
|
|
||||||
/* Function */ callback,
|
|
||||||
/* Number */ selectedIndex)
|
|
||||||
{
|
|
||||||
importPackage(org.bukkit.block);
|
|
||||||
|
|
||||||
if (typeof selectedIndex == "undefined")
|
|
||||||
selectedIndex = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
// variables common to all instances of this menu can go here
|
|
||||||
//
|
|
||||||
var labelPadding = "---------------";
|
|
||||||
var optionPadding = " ";
|
|
||||||
|
|
||||||
var paddedLabel = (labelPadding+label+labelPadding).substr(((label.length+30)/2)-7,15);
|
|
||||||
var optLen = options.length;
|
|
||||||
var displayOptions = [];
|
|
||||||
for (var i =0;i < options.length;i++){
|
|
||||||
displayOptions[i] = (" " + options[i] + optionPadding).substring(0,15);
|
|
||||||
}
|
|
||||||
|
|
||||||
return function(/* Sign */ sign){
|
|
||||||
if (typeof sign == "undefined"){
|
|
||||||
var mouseLoc = getMousePos();
|
|
||||||
if (mouseLoc){
|
|
||||||
sign = mouseLoc.block.state;
|
|
||||||
}else{
|
|
||||||
throw new Exception("You must provide a sign!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// per-sign variables go here
|
|
||||||
//
|
|
||||||
var cSelectedIndex = selectedIndex;
|
|
||||||
sign.setLine(0,paddedLabel);
|
|
||||||
var _updateSign = function(p_player,p_sign) {
|
|
||||||
cSelectedIndex = (cSelectedIndex+1) % optLen;
|
|
||||||
_refresh(p_sign,cSelectedIndex,displayOptions);
|
|
||||||
callback(p_player,p_sign,options[cSelectedIndex],cSelectedIndex);
|
|
||||||
};
|
|
||||||
// initialize the sign
|
|
||||||
_refresh(sign,cSelectedIndex,displayOptions);
|
|
||||||
//
|
|
||||||
// update it every time player interacts with it.
|
|
||||||
//
|
|
||||||
events.on("player.PlayerInteractEvent",function(listener, event) {
|
|
||||||
if (event.clickedBlock.state.equals(sign))
|
|
||||||
_updateSign(event.player,sign);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
signs.select = _select;
|
|
||||||
}());
|
|
||||||
|
|
||||||
//
|
|
||||||
// Usage:
|
|
||||||
// In game, create a sign , target it and type /js signs.testSelect()
|
|
||||||
//
|
|
||||||
signs.testSelect = signs.select("Dinner",
|
|
||||||
["Lamb","Pork","Chicken","Duck","Beef"],
|
|
||||||
function(player,sign,selectedText,selectedIndex){
|
|
||||||
player.sendMessage("You chose " + selectedText);
|
|
||||||
});
|
|
||||||
//
|
|
||||||
// This is an example sign that displays a menu of times of day
|
|
||||||
// interacting with the sign will change the time of day accordingly.
|
|
||||||
//
|
|
||||||
// In game, create a sign , target it and type /js signs.timeOfDay()
|
|
||||||
//
|
|
||||||
signs.timeOfDay = signs.select("Time",
|
|
||||||
["Dawn","Midday","Dusk","Midnight"],
|
|
||||||
function(player,sign,selectedText,selectedIndex){
|
|
||||||
player.location.world.setTime(selectedIndex*6000);
|
|
||||||
});
|
|
Reference in a new issue