From aefc98f17235c3e54733937f2754e800c7326eea Mon Sep 17 00:00:00 2001 From: walterhiggins Date: Sun, 12 Jan 2014 11:26:26 +0000 Subject: [PATCH] Fix issue #111, reorg of lib/ and (undoc'd) persistence --- build.xml | 11 +- docs/API-Reference.md | 59 +++++ docs/Using-Java-APIs-In-Javascript.md | 6 +- docs/img/cowclicker.png | Bin 0 -> 100388 bytes docs/release-notes.md | 22 ++ src/docs/javascript/generateTOC.js | 7 + .../scriptcraft/ScriptCraftPlugin.java | 29 ++- src/main/javascript/lib/js-patch.js | 33 +++ src/main/javascript/lib/persistence.js | 37 +++ src/main/javascript/lib/plugin.js | 52 +--- src/main/javascript/lib/require.js | 13 +- src/main/javascript/lib/scriptcraft.js | 66 ++--- .../javascript/modules/utils/string-exts.js | 6 - .../javascript/plugins/classroom/classroom.js | 1 + .../plugins/minigames/NumberGuess.js | 16 ++ .../plugins/minigames/cow-clicker.js | 225 ++++++++++++++++++ src/main/javascript/plugins/spawn.js | 35 +++ src/main/resources/plugin.yml | 2 +- 18 files changed, 514 insertions(+), 106 deletions(-) create mode 100644 docs/img/cowclicker.png create mode 100644 src/main/javascript/lib/js-patch.js create mode 100644 src/main/javascript/lib/persistence.js create mode 100644 src/main/javascript/plugins/minigames/cow-clicker.js create mode 100644 src/main/javascript/plugins/spawn.js diff --git a/build.xml b/build.xml index d82e4bb..f9988f5 100644 --- a/build.xml +++ b/build.xml @@ -7,13 +7,6 @@ - - - - @@ -144,7 +137,7 @@ Walter Higgins - + @@ -157,6 +150,6 @@ Walter Higgins - + diff --git a/docs/API-Reference.md b/docs/API-Reference.md index 7119a64..4caef0f 100644 --- a/docs/API-Reference.md +++ b/docs/API-Reference.md @@ -117,6 +117,8 @@ Walter Higgins * [Example Plugin #7 - Listening for events, Greet players when they join the game.](#example-plugin-7---listening-for-events-greet-players-when-they-join-the-game) * [Arrows Plugin](#arrows-plugin) * [Usage:](#usage-6) + * [Spawn Plugin](#spawn-plugin) + * [Usage](#usage-7) * [alias Plugin](#alias-plugin) * [Examples](#examples-2) * [Classroom Plugin](#classroom-plugin) @@ -135,6 +137,10 @@ Walter Higgins * [Example](#example-1) * [SnowballFight mini-game](#snowballfight-mini-game) * [Description](#description-2) + * [Cow Clicker Mini-Game](#cow-clicker-mini-game) + * [How to Play](#how-to-play) + * [Rules](#rules) + * [Gameplay Mechanics](#gameplay-mechanics) ## Modules in Scriptcraft @@ -2340,6 +2346,18 @@ All of the above functions can take an optional player object or name as a parameter. For example: `/js arrows.explosive('player23')` makes player23's arrows explosive. +## Spawn Plugin + +Allows in-game operators to easily spawn creatures at current location. + +### Usage + + /jsp spawn cow + /jsp spawn sheep + /jsp spawn wolf + +See for a list of possible entities (creatures) which can be spawned. + ## alias Plugin The alias module lets players and server admins create their own @@ -2621,3 +2639,44 @@ player returns to their previous mode of play (creative or survival). Create a small arena with a couple of small buildings for cover to make the game more fun. +## Cow Clicker Mini-Game + +### How to Play + +At the in-game prompt type `jsp cowclicker` to start or stop +playing. Right-Click on Cows to score points. No points for killing +cows (hint: use the same keyboard keys you'd use for opening doors). + +Every time you click a cow your score increases by 1 point. Your score +is displayed in a side-bar along the right edge of of the screen. + +![cow clicker](img/cowclicker.png) + +### Rules + + * You can join and leave the Cow Clicker game at any time by typing + `/jsp cowclicker` at the in-game prompt. + + * Once you leave the game, your score is reset to zero. + + * You can disconnect from the server and your score will be saved for + the next time you join. + +### Gameplay Mechanics + +This is meant as a trivially simple use of the [Bukkit Scoreboard +API][bukscore]. There are many things you'll want to consider when constructing +your own mini-game... + + * Is the game itself a long-lived game - that is - should players and + scores be persisted (stored) between server restarts? + + * What should happen when a player quits the server - should this also be + understood as quitting the mini-game? + + * What should happen when a player who was previously playing the + mini-game, joins the server - should they automatically resume the + mini-game? + +[bukscore]: http://jd.bukkit.org/beta/apidocs/org/bukkit/scoreboard/package-summary.html + diff --git a/docs/Using-Java-APIs-In-Javascript.md b/docs/Using-Java-APIs-In-Javascript.md index f295159..cfc2cc4 100644 --- a/docs/Using-Java-APIs-In-Javascript.md +++ b/docs/Using-Java-APIs-In-Javascript.md @@ -35,11 +35,11 @@ using the more succinct... it is easier to read. The important thing to remember when using the Bukkit (or any Java API) from Javascript is that for any Java Bean, a property called `propertyName` will have a getter called -`getPropertyName()` and a setter called `setPropertyName`. From this +`getPropertyName()` and a setter called `setPropertyName()`. From this rule you can infer what any Bukkit class properties are. For example, the [Bukkit Player][bukpl] object has the following methods... - * float getWalSpeed() + * float getWalkSpeed() * void setWalkSpeed(float speed) ... so from this you can infer that every Player object has a @@ -61,7 +61,7 @@ the world in which a player is located... If you're new to Java and the [Bukkit API][bukapi] is the first time you've browsed Java documentation, you may be wondering where the `location` property came from - the `location` property is "inherited" -by one of the Player classes super-classes. You'll see the +from one of the Player class's super-classes (it's ancestors). You'll see the `getLocation()` method listed under a section titled **Methods inherited from interface org.bukkit.entity.Entity** in the [Player][bukpl] javadoc page. diff --git a/docs/img/cowclicker.png b/docs/img/cowclicker.png new file mode 100644 index 0000000000000000000000000000000000000000..43e2fe9c1dace0ea52bce716fd4a904f9029c61f GIT binary patch literal 100388 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

9ncSYVlS}?Y6squhnMijTNZxtoWT0uiJsxgpdY^ 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%0Di+xV{7Kw{wC$M(!iMk8ujTs@$$q>9S^{pnrUuk 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 QIRF3v07*qoM6N<$f<~M13;+NC literal 0 HcmV?d00001 diff --git a/docs/release-notes.md b/docs/release-notes.md index 9445e24..5969b29 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,3 +1,25 @@ +# 2014 01 12 + +## Important +The ScriptCraft.jar file has been renamed scriptcraft.jar (see bug fix +details below). This means that you will have to remove the existing +`plugins/ScriptCraft.jar` file if present. + +Bug Fix: On Mac OS, the plugins/scriptcraft directory is copied to +plugins/ScriptCraftPlugin the 2nd time ScriptCraftPlugin is loaded. +This has been fixed by changing the plugin name from ScriptCraftPlugin +to scriptcraft. The jar file has also been rename from +ScriptCraft.jar to scriptcraft.jar. + +New command: `jsp spawn` lets in-game operators spawn any type of +entity. For example `/jsp spawn cow` will spawn a cow at the in-game +operator's current location. + +New minigame: Cow Clicker. A simple demonstration of using Bukkit's +Scoreboard API. Players click cows to score points. Scores are +displayed in a side bar on screen. Players join or leave the game by +typing `/jsp cowclicker` at the in-game prompt. + # 2014 01 05 Bug Fix: On Mac OS, alias plugin caused Exceptions due to missing diff --git a/src/docs/javascript/generateTOC.js b/src/docs/javascript/generateTOC.js index 5724472..f2fe8f8 100644 --- a/src/docs/javascript/generateTOC.js +++ b/src/docs/javascript/generateTOC.js @@ -1,5 +1,12 @@ args = args.slice(1); +// wph 20140105 trim not availabe in String on Mac OS. +if (typeof String.prototype.trim == 'undefined'){ + String.prototype.trim = function(){ + return this.replace(/^\s+|\s+$/g,''); + }; +} + var template = args[0]; var BufferedReader = java.io.BufferedReader; diff --git a/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java b/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java index bbdfae3..6d6b16e 100644 --- a/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java +++ b/src/main/java/net/walterhiggins/scriptcraft/ScriptCraftPlugin.java @@ -29,7 +29,7 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener /** * Unzips bundled javascript code. */ - private void unzipJS() + private void unzipJS() throws IOException { // // does the js-plugins directory exist? @@ -37,9 +37,13 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener File jsPlugins = new File(JS_PLUGINS_DIR); if (!jsPlugins.exists()) { - getLogger().finest("Directory " + JS_PLUGINS_DIR + " does not exist."); - getLogger().finest("Initializing " + JS_PLUGINS_DIR + " directory with contents from plugin archive."); - jsPlugins.mkdir(); + getLogger().info("Directory " + jsPlugins.getCanonicalPath() + " does not exist."); + getLogger().info("Initializing " + jsPlugins.getCanonicalPath() + " directory with contents from plugin archive."); + try{ + jsPlugins.mkdirs(); + }catch(Exception e){ + throw new RuntimeException("Failed to create directory " + jsPlugins.getCanonicalPath() + ":" + e.getMessage()); + } } ZipInputStream zis = new ZipInputStream(getResource(JS_PLUGINS_ZIP)); @@ -48,7 +52,7 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener while ( ( entry = zis.getNextEntry() ) != null) { String filename = entry.getName(); - //File newFile = new File(jsPlugins.getName() + File.separator + filename); + File newFile = new File(jsPlugins, filename); //create all non exists folders @@ -59,17 +63,23 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener // // only write out to file if zip entry is newer than file // + String reason = null; long zTime = entry.getTime(); boolean unzip = false; - if (!newFile.exists()) + if (!newFile.exists()){ + reason = "NE"; unzip = true; + } else{ long fTime = newFile.lastModified(); - if (zTime > fTime) + if (zTime > fTime){ + reason = "" + new Long((zTime-fTime)/3600000) + "h"; unzip = true; + } + } if (unzip){ - getLogger().info("Unzipping " + newFile.getCanonicalPath()); + getLogger().info("Unzipping " + newFile.getCanonicalPath() + " (" + reason + ")" ); FileOutputStream fout = new FileOutputStream(newFile); for (int c = zis.read(); c != -1; c = zis.read()) { fout.write(c); @@ -90,9 +100,9 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener @Override public void onEnable() { - unzipJS(); FileReader reader = null; try{ + unzipJS(); ScriptEngineManager factory = new ScriptEngineManager(); File bootScript = new File(JS_PLUGINS_DIR + "/lib/scriptcraft.js"); this.engine = factory.getEngineByName("JavaScript"); @@ -103,6 +113,7 @@ public class ScriptCraftPlugin extends JavaPlugin implements Listener }catch(Exception e){ e.printStackTrace(); + this.getLogger().severe(e.getMessage()); }finally { if (reader != null){ try { diff --git a/src/main/javascript/lib/js-patch.js b/src/main/javascript/lib/js-patch.js new file mode 100644 index 0000000..4403bbc --- /dev/null +++ b/src/main/javascript/lib/js-patch.js @@ -0,0 +1,33 @@ + +module.exports = function($){ + + // wph 20140105 trim not availabe in String on Mac OS. + if (typeof String.prototype.trim == 'undefined'){ + String.prototype.trim = function(){ + return this.replace(/^\s+|\s+$/g,''); + }; + } + + $.setTimeout = function( callback, delayInMillis){ + /* + javascript programmers familiar with setTimeout know that it expects + a delay in milliseconds. However, bukkit's scheduler expects a delay in ticks + (where 1 tick = 1/20th second) + */ + var bukkitTask = server.scheduler.runTaskLater(__plugin, callback, delayInMillis/50); + return bukkitTask; + }; + $.clearTimeout = function(bukkitTask){ + bukkitTask.cancel(); + }; + + $.setInterval = function(callback, intervalInMillis){ + var delay = intervalInMillis/ 50; + var bukkitTask = server.scheduler.runTaskTimer(__plugin, callback, delay, delay); + return bukkitTask; + }; + $.clearInterval = function(bukkitTask){ + bukkitTask.cancel(); + }; +}; + diff --git a/src/main/javascript/lib/persistence.js b/src/main/javascript/lib/persistence.js new file mode 100644 index 0000000..52614e1 --- /dev/null +++ b/src/main/javascript/lib/persistence.js @@ -0,0 +1,37 @@ + +var _dataDir = null; +var _persistentData = {}; + +module.exports = function( rootDir, $ ){ + + _dataDir = new java.io.File( rootDir, 'data'); + + $.persist = function(name, data, write){ + var i, dataFromFile; + if (typeof data == 'undefined') + data = {}; + if (typeof write == 'undefined') + write = false; + if (!write){ + dataFromFile = $.load(_dataDir.canonicalPath + '/' + name + '-store.json'); + if (dataFromFile){ + for (i in dataFromFile){ + data[i] = dataFromFile[i]; + } + } + }else{ + // flush data to file + $.save(data, _dataDir.canonicalPath + '/' + name + '-store.json'); + } + _persistentData[name] = data; + return data; + }; + + $.addUnloadHandler(function(){ + for (var name in _persistentData){ + var data = _persistentData[name]; + $.save(data, _dataDir.canonicalPath + '/' + name + '-store.json'); + } + }); +}; + diff --git a/src/main/javascript/lib/plugin.js b/src/main/javascript/lib/plugin.js index 0b8cb47..d41a0ef 100644 --- a/src/main/javascript/lib/plugin.js +++ b/src/main/javascript/lib/plugin.js @@ -3,23 +3,6 @@ var console = require('./console'); var File = java.io.File; var FileWriter = java.io.FileWriter; var PrintWriter = java.io.PrintWriter; - -/* - Save a javascript object to a file (saves using JSON notation) -*/ -var _save = function(object, filename){ - var objectToStr = null; - try{ - objectToStr = JSON.stringify(object,null,2); - }catch(e){ - print("ERROR: " + e.getMessage() + " while saving " + filename); - return; - } - var f = (filename instanceof File) ? filename : new File(filename); - var out = new PrintWriter(new FileWriter(f)); - out.println( objectToStr ); - out.close(); -}; /* plugin management */ @@ -34,25 +17,18 @@ var _plugin = function(/* String */ moduleName, /* Object */ moduleObject, isPer return _plugins[moduleName].module; var pluginData = {persistent: isPersistent, module: moduleObject}; - moduleObject.store = moduleObject.store || {}; + if (typeof moduleObject.store == 'undefined') + moduleObject.store = {}; + _plugins[moduleName] = pluginData; if (isPersistent){ - if (!moduleObject.store){ - moduleObject.store = {}; - } - var loadedStore = load(dataDir.canonicalPath + "/" + moduleName + "-store.json"); - if (loadedStore){ - for (var i in loadedStore){ - moduleObject.store[i] = loadedStore[i]; - } - } + moduleObject.store = persist(moduleName, moduleObject.store); } return moduleObject; }; exports.plugin = _plugin; -exports.save = _save; var scriptCraftDir = null; var pluginDir = null; @@ -65,7 +41,7 @@ exports.autoload = function(dir) { dataDir = new File(dir, "data"); var _canonize = function(file){ - return "" + file.getCanonicalPath().replaceAll("\\\\","/"); + return '' + file.canonicalPath.replaceAll("\\\\","/"); }; /* recursively walk the given directory and return a list of all .js files @@ -78,9 +54,7 @@ exports.autoload = function(dir) { if (file.isDirectory()){ _listSourceFiles(store,file); }else{ - if ((file.getCanonicalPath().endsWith(".js") - || file.getCanonicalPath().endsWith(".coffee")) - ) { + if ( file.canonicalPath.endsWith('.js') ){ store.push(file); } } @@ -97,11 +71,11 @@ exports.autoload = function(dir) { var len = sourceFiles.length; if (config.verbose) - console.info(len + " scriptcraft plugins found."); + console.info(len + ' scriptcraft plugins found.'); for (var i = 0;i < len; i++){ var pluginPath = _canonize(sourceFiles[i]); if (config.verbose) - console.info("Loading plugin: " + pluginPath); + console.info('Loading plugin: ' + pluginPath); var module = {}; try { module = require(pluginPath); @@ -119,13 +93,3 @@ exports.autoload = function(dir) { _reload(pluginDir); }; -addUnloadHandler(function(){ - // - // save all plugins which have persistent data - // - for (var moduleName in _plugins){ - var pluginData = _plugins[moduleName]; - if (pluginData.persistent) - _save(pluginData.module.store, dataDir.canonicalPath + "/" + moduleName + "-store.json"); - } -}); diff --git a/src/main/javascript/lib/require.js b/src/main/javascript/lib/require.js index 5bce81e..30923cb 100644 --- a/src/main/javascript/lib/require.js +++ b/src/main/javascript/lib/require.js @@ -187,11 +187,12 @@ When resolving module names to file paths, ScriptCraft uses the following rules. { var file = resolveModuleToFile(path, parentFile); if (!file){ - var errMsg = java.lang.String - .format("require() failed to find matching file for module '%s' " + - "while searching directory '%s' and paths %s.", - [path, parentFile.canonicalPath, JSON.stringify(modulePaths)]); - console.warn(errMsg); + var errMsg = '' + java.lang.String.format("require() failed to find matching file for module '%s' " + + "in working directory '%s' ", [path, parentFile.canonicalPath]); + if (! ( (''+path).match(/^\./) )){ + errMsg = errMsg + ' and not found in paths ' + JSON.stringify(modulePaths); + } + logger.warning(errMsg); throw new Error(errMsg); } var canonizedFilename = _canonize(file); @@ -242,7 +243,7 @@ When resolving module names to file paths, ScriptCraft uses the following rules. .apply(moduleInfo.exports, /* this */ parameters); } catch (e){ - console.error("Error:" + e + " while executing module " + canonizedFilename); + logger.severe('Error:' + e + ' while executing module ' + canonizedFilename); throw e; } if (verbose) diff --git a/src/main/javascript/lib/scriptcraft.js b/src/main/javascript/lib/scriptcraft.js index 6e7e854..6fa7e45 100644 --- a/src/main/javascript/lib/scriptcraft.js +++ b/src/main/javascript/lib/scriptcraft.js @@ -422,7 +422,9 @@ function __onEnable (__engine, __plugin, __script) return ; var File = java.io.File ,FileReader = java.io.FileReader - ,BufferedReader = java.io.BufferedReader; + ,BufferedReader = java.io.BufferedReader + ,PrintWriter = java.io.PrintWriter + ,FileWriter = java.io.FileWriter; var _canonize = function(file){ return "" + file.getCanonicalPath().replaceAll("\\\\","/"); @@ -432,6 +434,23 @@ function __onEnable (__engine, __plugin, __script) var jsPluginsRootDir = libDir.parentFile; // scriptcraft var jsPluginsRootDirName = _canonize(jsPluginsRootDir); + /* + Save a javascript object to a file (saves using JSON notation) + */ + var _save = function(object, filename){ + var objectToStr = null; + try{ + objectToStr = JSON.stringify(object,null,2); + }catch(e){ + print("ERROR: " + e.getMessage() + " while saving " + filename); + return; + } + var f = (filename instanceof File) ? filename : new File(filename); + var out = new PrintWriter(new FileWriter(f)); + out.println( objectToStr ); + out.close(); + }; + var _loaded = {}; /* Load the contents of the file and evaluate as javascript @@ -487,7 +506,7 @@ function __onEnable (__engine, __plugin, __script) /* now that load is defined, use it to load a global config object */ - var config = _load(new File(jsPluginsRootDir, "data/global-config.json" )); + var config = _load(new File(jsPluginsRootDir, 'data/global-config.json' )); if (!config) config = {verbose: false}; global.config = config; @@ -510,27 +529,6 @@ function __onEnable (__engine, __plugin, __script) } }; - global.setTimeout = function( callback, delayInMillis){ - /* - javascript programmers familiar with setTimeout know that it expects - a delay in milliseconds. However, bukkit's scheduler expects a delay in ticks - (where 1 tick = 1/20th second) - */ - var bukkitTask = server.scheduler.runTaskLater(__plugin, callback, delayInMillis/50); - return bukkitTask; - }; - global.clearTimeout = function(bukkitTask){ - bukkitTask.cancel(); - }; - - global.setInterval = function(callback, intervalInMillis){ - var delay = intervalInMillis/ 50; - var bukkitTask = server.scheduler.runTaskTimer(__plugin, callback, delay, delay); - return bukkitTask; - }; - global.clearInterval = function(bukkitTask){ - bukkitTask.cancel(); - }; global.refresh = function(){ __plugin.pluginLoader.disablePlugin(__plugin); __plugin.pluginLoader.enablePlugin(__plugin); @@ -547,6 +545,7 @@ function __onEnable (__engine, __plugin, __script) global.echo = _echo; global.alert = _echo; global.load = _load; + global.save = _save; global.addUnloadHandler = _addUnloadHandler; @@ -556,21 +555,30 @@ function __onEnable (__engine, __plugin, __script) */ var modulePaths = [jsPluginsRootDirName + '/lib/', jsPluginsRootDirName + '/modules/']; - global.require = fnRequire(__plugin.logger, __engine, config.verbose, jsPluginsRootDirName, modulePaths); + global.require = fnRequire(__plugin.logger, + __engine, + config.verbose, + jsPluginsRootDirName, + modulePaths); + require('js-patch')(global); global.console = require('console'); + /* + setup persistence + */ + require('persistence')(jsPluginsRootDir,global); + global.command = require('command').command; var plugins = require('plugin'); global.__onTabComplete = require('tabcomplete'); global.plugin = plugins.plugin; - global.save = plugins.save; var events = require('events'); events.on('server.PluginDisableEvent',function(l,e){ // save config - plugins.save(global.config, new File(jsPluginsRootDir, "data/global-config.json" )); + save(global.config, new File(jsPluginsRootDir, "data/global-config.json" )); _runUnloadHandlers(); org.bukkit.event.HandlerList["unregisterAll(org.bukkit.plugin.Plugin)"](__plugin); @@ -625,10 +633,12 @@ function __onEnable (__engine, __plugin, __script) for (var i = 0; i < legacyDirs.length; i++){ if (legacyDirs[i].exists() && legacyDirs[i].isDirectory()){ legacyExists = true; - console.warn('Legacy ScriptCraft directory ' + legacyDirs[i].canonicalPath + ' was found. This directory is no longer used.'); + console.warn('Legacy ScriptCraft directory %s was found. This directory is no longer used.', + legacyDirs[i].canonicalPath); } } if (legacyExists){ - console.info('Please note that the working directory for ' + __plugin + ' is ' + jsPluginsRootDir.canonicalPath); + console.info('Please note that the working directory for %s is %s', + __plugin, jsPluginsRootDir.canonicalPath); } } diff --git a/src/main/javascript/modules/utils/string-exts.js b/src/main/javascript/modules/utils/string-exts.js index 1e7159b..bb33e23 100644 --- a/src/main/javascript/modules/utils/string-exts.js +++ b/src/main/javascript/modules/utils/string-exts.js @@ -77,9 +77,3 @@ for (var method in formattingCodes){ return function(){return c+this;}; }(formattingCodes[method]); } -// wph 20140105 trim not availabe in String on Mac OS. -if (!String.prototype.trim){ - String.prototype.trim = function(){ - return this.replace(/^\s+|\s+$/g,''); - } -} diff --git a/src/main/javascript/plugins/classroom/classroom.js b/src/main/javascript/plugins/classroom/classroom.js index 2822b27..d674f96 100644 --- a/src/main/javascript/plugins/classroom/classroom.js +++ b/src/main/javascript/plugins/classroom/classroom.js @@ -47,6 +47,7 @@ var classroom = plugin("classroom", { allowScripting: function (/* boolean: true or false */ canScript, sender) { if (typeof sender == 'undefined'){ console.log("Attempt to set classroom scripting without credentials"); + console.log("classroom.allowScripting(boolean, sender)"); return; } if (!sender.op){ diff --git a/src/main/javascript/plugins/minigames/NumberGuess.js b/src/main/javascript/plugins/minigames/NumberGuess.js index 01424a4..a3ae132 100644 --- a/src/main/javascript/plugins/minigames/NumberGuess.js +++ b/src/main/javascript/plugins/minigames/NumberGuess.js @@ -15,8 +15,20 @@ Once the game begins, guess a number by typing the `/` character followed by a number between 1 and 10. ***/ + +var sb = function(cmd){ + org.bukkit.Bukkit.dispatchCommand(server.consoleSender, 'scoreboard ' + cmd) +}; + exports.Game_NumberGuess = { start: function(sender) { + + var guesses = 0; + + sb('objectives add NumberGuess dummy Guesses'); + sb('players set ' + sender.name + ' NumberGuess ' + guesses); + sb('objectives setdisplay sidebar NumberGuess'); + importPackage(org.bukkit.conversations); var number = Math.ceil(Math.random() * 10); @@ -38,6 +50,7 @@ exports.Game_NumberGuess = { if (s == number){ setTimeout(function(){ ctx.forWhom.sendRawMessage("You guessed Correct!"); + sb('objectives remove NumberGuess'); },100); return null; }else{ @@ -45,6 +58,9 @@ exports.Game_NumberGuess = { ctx.setSessionData("hint","too low\n"); if (s > number) ctx.setSessionData("hint","too high\n"); + guesses++; + sb('players set ' + sender.name + ' NumberGuess ' + guesses); + return prompt; } }, diff --git a/src/main/javascript/plugins/minigames/cow-clicker.js b/src/main/javascript/plugins/minigames/cow-clicker.js new file mode 100644 index 0000000..4abb5ef --- /dev/null +++ b/src/main/javascript/plugins/minigames/cow-clicker.js @@ -0,0 +1,225 @@ +/************************************************************************* +## Cow Clicker Mini-Game + +### How to Play + +At the in-game prompt type `jsp cowclicker` to start or stop +playing. Right-Click on Cows to score points. No points for killing +cows (hint: use the same keyboard keys you'd use for opening doors). + +Every time you click a cow your score increases by 1 point. Your score +is displayed in a side-bar along the right edge of of the screen. + +![cow clicker](img/cowclicker.png) + +### Rules + + * You can join and leave the Cow Clicker game at any time by typing + `/jsp cowclicker` at the in-game prompt. + + * Once you leave the game, your score is reset to zero. + + * You can disconnect from the server and your score will be saved for + the next time you join. + +### Gameplay Mechanics + +This is meant as a trivially simple use of the [Bukkit Scoreboard +API][bukscore]. There are many things you'll want to consider when constructing +your own mini-game... + + * Is the game itself a long-lived game - that is - should players and + scores be persisted (stored) between server restarts? + + * What should happen when a player quits the server - should this also be + understood as quitting the mini-game? + + * What should happen when a player who was previously playing the + mini-game, joins the server - should they automatically resume the + mini-game? + +[bukscore]: http://jd.bukkit.org/beta/apidocs/org/bukkit/scoreboard/package-summary.html + +***/ + +var store = {}; + +var scoreboardConfig = { + cowclicker: {SIDEBAR: 'Cows Clicked'} +}; + +/* + The scoreboard is a simple wrapper around the Bukkit Scoreboard API. + It's only concerned with display of scores, not maintaining them - that's the game's job. +*/ +var scoreboard = (function(options){ + var temp = {}; + var ccScoreboard; + var DisplaySlot = org.bukkit.scoreboard.DisplaySlot; + + return { + start: function(){ + var objective, slot; + ccScoreboard = server.scoreboardManager.getNewScoreboard(); + for (objective in options){ + var ccObj = ccScoreboard.registerNewObjective(objective,'dummy'); + for (slot in options[objective]){ + ccObj.displaySlot = DisplaySlot[slot]; + ccObj.displayName = options[objective][slot]; + } + } + }, + stop: function(){ + var objective, slot; + for (objective in options){ + ccScoreboard.getObjective(objective).unregister(); + for (slot in options[objective]){ + ccScoreboard.clearSlot(DisplaySlot[slot]); + } + } + }, + update: function(objective,player,score){ + if (player.scoreboard && player.scoreboard != ccScoreboard) + { + temp[player.name] = player.scoreboard; + player.scoreboard = ccScoreboard; + } + ccScoreboard.getObjective(objective).getScore(player).score = score; + }, + restore: function(player){ + // offlineplayers don't have a scoreboard + if (player.scoreboard) + player.scoreboard = temp[player.name]; + } + }; +}(scoreboardConfig)); + +var _onPlayerInteract = function(listener, event){ + var player = event.player; + var Bukkit = org.bukkit.Bukkit; + + if (!store[player.name]) + return; + + var clickedEntity = event.rightClicked; + var loc = clickedEntity.location; + var sound = function(snd,vol,pitch){ + loc.world.playSound(loc,snd,vol,pitch); + }; + if (clickedEntity instanceof org.bukkit.entity.Cow) + { + store[player.name].score++; + scoreboard.update('cowclicker', player, store[player.name].score); + + Bukkit.dispatchCommand(player, 'me clicked a cow!'); + sound(org.bukkit.Sound.CLICK,1,1); + setTimeout(function(){ + sound(org.bukkit.Sound.COW_HURT,10,0.85) + },200); + } +}; +var _onPlayerQuit = function(listener, event){ + _removePlayer(event.player) +}; +var _onPlayerJoin = function(listener, event){ + var gamePlayer = store[event.player.name]; + if (gamePlayer) + _addPlayer(event.player, gamePlayer.score); +}; + +var _startGame = function(){ + if (config.verbose) + console.log('Staring game: Cow Clicker'); + + events.on('player.PlayerQuitEvent', _onPlayerQuit); + events.on('player.PlayerJoinEvent', _onPlayerJoin); + events.on('player.PlayerInteractEntityEvent', _onPlayerInteract); + + scoreboard.start(); + + store = persist('cowclicker',store); + for (var p in store){ + var player = server.getPlayer(p); + if (player){ + /* + only add online players + */ + var score = store[p].score; + _addPlayer(player, score); + } + } +}; +var _addPlayer = function(player,score){ + if (config.verbose) + console.log('Adding player %s to Cow Clicker game',player); + + if (typeof score == 'undefined') + score = 0; + store[player.name] = {score: score}; + scoreboard.update('cowclicker', player,store[player.name].score); + + player.sendMessage('Go forth and click some cows!'); +}; + +var _removePlayer = function(player,notify){ + + if (player instanceof org.bukkit.OfflinePlayer && player.player) + player = player.player; + + if (!store[player.name]) + return; + if (config.verbose) + console.log('Removing player %s from Cow Clicker', player); + + var playerScore = store[player.name].score; + + scoreboard.restore(player); + + delete store[player.name]; + if (notify && player){ + player.sendMessage('You clicked ' + playerScore + ' cows! ' + + 'You must be tired after all that clicking.'); + } +}; +var _removeAllPlayers = function(notify){ + if (typeof notify == 'undefined') + notify = false; + for (var p in store){ + var player = server.getOfflinePlayer(p); + if (player) + _removePlayer(player,notify); + delete store[p]; + } +} +var _stopGame = function(removePlayers){ + if (typeof removePlayers == 'undefined') + removePlayers = true; + if (config.verbose) + console.log('Stopping game: Cow Clicker'); + scoreboard.stop(); + if (!removePlayers) + return; + _removeAllPlayers(false); + persist('cowclicker',store.pers,'w'); + +}; +/* + start the game automatically when this module is loaded. +*/ +_startGame(); +/* + players can join and leave the game by typing `jsp cowclicker` +*/ +command('cowclicker', function(params, sender){ + if (!store[sender.name]) + _addPlayer(sender); + else + _removePlayer(sender); +}); +/* + stop the game when ScriptCraft is unloaded. +*/ +addUnloadHandler(function(){ + _stopGame(false); +}); + diff --git a/src/main/javascript/plugins/spawn.js b/src/main/javascript/plugins/spawn.js new file mode 100644 index 0000000..975de56 --- /dev/null +++ b/src/main/javascript/plugins/spawn.js @@ -0,0 +1,35 @@ +/************************************************************************* +## Spawn Plugin + +Allows in-game operators to easily spawn creatures at current location. + +### Usage + + /jsp spawn cow + /jsp spawn sheep + /jsp spawn wolf + +This command supports TAB completion so to see a list of possible +entitities, type `/jsp spawn ' at the in-game command prompt, then +press TAB. Visit + +for a list of possible entities (creatures) which can be spawned. + +***/ +var entities = []; +var Types = org.bukkit.entity.EntityType +for (var t in Types){ + if (Types[t] && Types[t].ordinal){ + entities.push(t); + } +} +command('spawn', function(parameters, sender){ + if (!sender.op){ + sender.sendMessage('Only operators can perform this command'); + return; + } + var location = sender.location; + var world = location.world; + var type = ('' + parameters[0]).toUpperCase(); + world.spawnEntity(location, org.bukkit.entity.EntityType[type]); +},entities); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c856198..55e6fd2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,4 +1,4 @@ -name: ScriptCraftPlugin +name: scriptcraft main: net.walterhiggins.scriptcraft.ScriptCraftPlugin version: [[version]] commands: