This plugin allows you to create "modifications" with JS.
Making commands (no tab-completion currently)
Code (Text):
CommandManager.registerCommand("test", function (ev) {
// ev - CmdEventsArgs
// ev.getSender() - returns a CommandSender
// ev.getCommand() - returns command name
// ev.getArgs() - returns an arguments String[]
ev.getSender().sendMessage("Hello world!");
// unregister command: CommandManager.unregisterCommand("test");
});
Using events
Code (Text):
var a =
function (ev) {
var Player = ev.getPlayer();
if(ev.getMessage().equalsIgnoreCase("hello")) Server.broadcastMessage("Hello, " + Player.getName() + "!");
};
EventManager.on("PlayerChatEvent", a);
// remove all listeners for an event: EventManager.removeAllListeners("PlayerChatEvent");
// remove a listener: EventManager.removeListener("PlayerChatEvent", a);
Variables passed to script:
CommandManager - with this you can make commands
EventManager - listen to events
Server - returns getServer()
You also can create scripted items like in Custom NPCs
Code (Text):
var HoldingEntities = new HashMap();
EventManager.on("Loop", function (n) {
//Server.broadcastMessage("loop");
HoldingEntities.keySet().forEach(function (p) {
HoldingEntities.get(p).teleport(Server.getPlayer(p).getTargetBlock(null, 3).getLocation());
});
});
CommandManager.registerCommand("gravitygun", function(e) {
var Player = Server.getPlayer(e.getSender().getName());
if(Player == null) {
e.getSender().sendMessage("You must be a player to do that.");
return;
}
var si = EventManager.createScriptedItem(Material.STICK, Player);
var im = si.item.getItemMeta();
im.setDisplayName("§6§lGravityGun");
si.item.setItemMeta(im);
si.item.addUnsafeEnchantment(Enchantment.DURABILITY, 10);
EventManager.__items.add(si);
Player.getInventory().addItem(si.item);
EventManager.on(si.id + "InteractEntity", function (ev) {
//ev.player.sendMessage("interact entity");
if(ev.event.getHand() != "HAND") return;
//if(!ev.player.isSneaking()) return;
var entity = ev.event.getRightClicked();
HoldingEntities.put(ev.player.getName(), entity);
entity.setGravity(false);
//ev.player.sendMessage("grabbed entity");
});
EventManager.on(si.id + "Interact", function (ev) {
//ev.player.sendMessage("interact");
if(ev.event.getAction() != "RIGHT_CLICK_AIR" && ev.event.getAction() != "RIGHT_CLICK_BLOCK") return;
if(!ev.player.isSneaking()) return;
if(HoldingEntities.containsKey(ev.player.getName())) {
// ev.player.sendMessage("released entity");
HoldingEntities.get(ev.player.getName()).setGravity(true);
HoldingEntities.remove(ev.player.getName());
return;
}
});
});
Here is an additional events:
Loop - called every 5 ticks (I'll change later)
{scripteditemid}Loop - called every 5 ticks
{scripteditemid}BlockPlace
{scripteditemid}BlockBreak
{scripteditemid}Interact
{scripteditemid}InteractEntity
{scripteditemid}ItemDrop
{scripteditemid}ItemPickup
{scripteditemid}ItemConsume
{scripteditemid}ItemHeld
{scripteditemid}AttackEntity
The scripted item event args contains player, ScriptedItem instance and Event
ev.event - Event
ev.player - Player
ev.item - ScriptedItem
Commands:
/jsrun <code> - execute JS code (permission: spigotjs.jsrun)
/loadscript <file (extension required)> - loads a script from ./plugins/SpigotJavascript folder (scripts aren't loading automatically) (permission: spigotjs.use)
/firecustomevent <Name> <EventArgs, String[]> - fire custom event (can be used in command blocks) (permission: spigotjs.use)
/evaluate - run a code from writable book you holding (permission: spigotjs.use)
Also, you can connect with Telnet to server (port 5841) so you can script directly there (only one-line)
I will provide a link for non-telnet client, and I'm working on .NET port of Bukkit API.