Ever wanted to make your own plugin? but you only have javascript skills? well, maybe you should try PandawaJS! PandawaJS will read your javascript code so that it can run on your server! The fact that making a plugin using javascript is faster than making it with Java!
- ECMAScript v6 syntax support
- XML syntax support
- JSON syntax support
- Yaml config support
- Built-in modules
- Pre-made scripts
- Java Libraries support
var last = {}; // new hashmap
var messageFormat = '&d&lPM &7[&aYou &8-> &a{player}&7] &e';
var receiveFormat = '&d&lPM &7[&a{player} &8-> &aYou&7] &e';
/*
Private Message command.
*/
Commands['pm'].also('msg').also('message').executor(function(sender,args) {
if (args.length > 0) {
if (args.length > 1) {
var player = Players[args[0]];
if (player) {
var message = args[1];
for (var i = 2; i < args.length; i++) {
message += args[i];
}
message = tryColor(sender,message);
sender.sendMessage(color(messageFormat.replace('{player}', player.getName()))+message);
player.sendMessage(color(receiveFormat.replace('{player}', sender.getName()))+message);
last[sender.getName()] = player.getName();
last[player.getName()] = sender.getName();
} else {
sender.sendMessage(color('&cPlayer not found!'));
}
return;
}
sender.sendMessage(color('&cPlease specify the message to be sent to '+args[0]));
return;
}
sender.sendMessage(color('&eSend message privately to a player. Usage: &b/msg <player> <message>'));
}).register(); // don't forget to register it!
/*
Reply command.
*/
Commands['reply'].also('r').executor(function(sender,args) {
var lastReply = last[sender.getName()];
if (lastReply) {
if (args.length > 0) {
var player = Players[lastReply];
if (player) {
var message = args[0];
for (var i = 1; i < args.length; i++) {
message += args[i];
}
message = tryColor(sender,message);
sender.sendMessage(color(messageFormat.replace('{player}', player.getName()))+message);
player.sendMessage(color(receiveFormat.replace('{player}', sender.getName()))+message);
last[sender.getName()] = player.getName();
last[player.getName()] = sender.getName();
} else {
sender.sendMessage(color('&c'+lastReply+' is Offline'));
}
} else {
sender.sendMessage(color('&eReply a message to the last person you chat with (Last: '+lastReply+'). Usage: &b/r <message>'));
}
return;
}
sender.sendMessage(color('&cYou don\'t have anyone to reply!'));
}).register(); //don't forget to register it!
/**
Return a colored message if sender has permission "message.color"
*/
function tryColor(sender,message) {
if (sender.hasPermission('message.color')) {
return color(message);
} else return message;
}
let configFile = Files['userdata.yml'];
let config;
if (configFile.exists()) {
config = configFile.loadConfig();
} else {
config = new Yaml();
configFile.createNewFile(); //create the file
}
Hooks.onDisable(function() {
configFile.write(config);
});
function getBalance(name) {
var balance = config.balance[name];
return balance ? balance : 0; //ternary operator
}
function setBalance(name,value) {
config.balance[name] = value;
}
function addBalance(name,value) {
setBalance(name,getBalance(name)+value);
}
function removeBalance(name,value) {
setBalance(name,getBalance(name)-value);
}
let prefix = color('&6Coins &8- &7');
function oncommand(sx,ar) {
if (ar.length > 0) {
let a1 = ar[0];
if (a1.equalsIgnoreCase('balance') || a1.equalsIgnoreCase('bal')) {
if (ar.length > 1 && sx.hasPermission('coins.balance.other')) {
var target = ar[1];
var balance = getBalance(target);
sx.sendMessage(prefix+target+' balance: '+balance);
return;
}
var bal = getBalance(sx.getName());
sx.sendMessage(prefix+sx.getName()+' balance: '+bal);
return;
}
if (a1.equalsIgnoreCase('pay')) {
if (ar.length > 2) {
var target = ar[1];
if (target.equals(sx.getName())) {
sx.sendMessage(prefix+'You cannot pay yourself!');
return;
}
var amount;
try {
amount = parseInt(ar[2]);
} catch (thrown) {
sx.sendMessage(prefix+'Please input a number!');
return;
}
var balance = getBalance(sx.getName());
if (balance < amount) {
sx.sendMessage(prefix+'You dont have enough money!');
return;
}
removeBalance(sx.getName(),amount);
addBalance(target,amount);
sx.sendMessage(prefix+'You paid '+target+' '+amount+' coins');
var player = Players[target];
if (player) {
player.sendMessage(prefix+sx.getName()+' paid you '+amount+' coins!');
}
return;
}
sx.sendMessage(prefix+'Pay someone. Usage: /coin pay <target> <amount>');
return;
}
if (sx.hasPermission('server.admin')) {
if (a1.equalsIgnoreCase('set')) {
if (ar.length > 2) {
var target = ar[1];
var amount;
try {
amount = parseInt(ar[2]);
} catch (thrown) {
sx.sendMessage(prefix+'Please input a number!');
return;
}
setBalance(target,amount);
sx.sendMessage(prefix+'You set '+target+' coins to '+amount+' coins');
return;
}
sx.sendMessage(prefix+'Set player coin amount. Usage: /coin set <target> <amount>');
return;
}
if (a1.equalsIgnoreCase('add')) {
if (ar.length > 2) {
var target = ar[1];
var amount;
try {
amount = parseInt(ar[2]);
} catch (thrown) {
sx.sendMessage(prefix+'Please input a number!');
return;
}
addBalance(target,amount);
sx.sendMessage(prefix+'You set '+target+' coins to '+amount+' coins');
return;
}
sx.sendMessage(prefix+'Set player coin amount. Usage: /coin set <target> <amount>');
return;
}
if (a1.equalsIgnoreCase('remove')) {
if (ar.length > 2) {
var target = ar[1];
var amount;
try {
amount = parseInt(ar[2]);
} catch (thrown) {
sx.sendMessage(prefix+'Please input a number!');
return;
}
addBalance(target,amount);
sx.sendMessage(prefix+'You set '+target+' coins to '+amount+' coins');
return;
}
sx.sendMessage(prefix+'Set player coin amount. Usage: /coin set <target> <amount>');
return;
}
}
}
if (sx.hasPermission('server.admin')) {
sx.sendMessage(prefix+'Usage: /coin <balance|pay|set|add|remove>');
} else {
sx.sendMessage(prefix+'Usage: /coin <balance|pay>')
}
}
function tabcomp(sx,ar) {
if (ar.length == 0) {
if (sx.hasPermission('server.admin')) {
return ['balance','pay','set','remove'];
} else return ['balance','pay'];
}
}
Commands['coin'].alias('coins').alias('c').executor(oncommand).tabcompleter(tabcomp).register();
let gui = new GUI('Actions', 27);
gui[10] = Items.APPLE.display(color('&aHeal')).executor(function(event) {
event.getWhoClicked().performCommand('/heal');
});
gui[12] = Items.POTION.display(color('&dNausea')).lore(color('&7Gives you confusion effect'),color('&7for 20 seconds.')).executor(function(event) {
Potions.CONFUSION.duration(seconds(20)).amplifier(2).apply(event.getWhoClicked());
});
gui[16] = Items.BARRIER.display(color('&cDisconnect')).lore(color('&7get out from this server.')).executor(function(event) {
event.getWhoClicked().kickPlayer('Disconnected');
});
function cmd(sender,args) {
if (isPlayer(sender)) {
sender.sendMessage(color('&eOpening GUI...'));
gui.open(sender);
} else sender.sendMessage(color('&cThis command is only for players!'));
}
Commands['guitest'].permission('server.tester').executor(cmd).register();
This framework uses modified source of Rhino. Report bugs or suggest feature on my discord server.
Similar projects
Script →Let Me Despawn
Improves performance by tweaking mob despawn rules. Say bye to pesky unintentional persistent mobs.
25MSueta
JourneyMap
Real-time map used for mapping in-game or your browser as you explore.
14.7MSueta
Emotecraft
Create your own emotes in Minecraft.
7.5MSueta
Simple Tpa
A simple tpa plugin which sends requests
5.4MSueta
Common Network
Forge and Fabric Unified Networking Solution
3.9MSueta
Set Home
A lightweight plugin for players to set their homes.
3.8MSueta