diff --git a/src/main/resources/plugins/HelloWorld.js b/src/main/resources/plugins/HelloWorld.js new file mode 100644 index 0000000..3d9b10e --- /dev/null +++ b/src/main/resources/plugins/HelloWorld.js @@ -0,0 +1,67 @@ +'use strict'; +/** + * Hello Wrold 测试插件 + */ +/*global Java, base, module, exports, require*/ + +var event = require('modules/event'); +var command = require('modules/command'); +var papi = require('./ext/papi'); +var join; + +var description = { + name: 'HelloWorld', + version: '1.0', + //commands: { + // 'hello': { + // description: 'HelloWorld主命令' + // } + //} +}; + +function load() { + console.log('载入 Hello Wrold 测试插件!'); +} + +function enable() { + command.on(this, 'hello', { + cmd: function (sender, command, args) { + console.log(command, Array.prototype.join.call(args, ' ')); + return true; + }, + tab: function (sender, command, args) { + switch (args.length) { + case 1: + return "arg1"; + case 2: + return "arg2"; + case 3: + return "arg3"; + default: + return 'default'; + } + } + }); + console.log('启用 Hello Wrold 测试插件!'); + join = event.on(this, 'playerloginevent', function join(event) { + // noinspection JSUnresolvedVariable + console.debug('玩家', event.player.name, "触发事件", event.name); + setTimeout(function () { + // noinspection JSUnresolvedVariable + event.player.sendMessage(papi.$(event.player, "§a欢迎来到 §bMiaoScript §a的世界! 当前在线: %server_online%")); + }, 10); + }); +} + +function disable() { + console.log('卸载 Hello Wrold 测试插件!'); + // 可以不用关闭事件 程序将自动处理 + // event.off(join); +} + +module.exports = { + description: description, + load: load, + enable: enable, + disable: disable +}; \ No newline at end of file diff --git a/src/main/resources/plugins/MiaoTag.js b/src/main/resources/plugins/MiaoTag.js new file mode 100644 index 0000000..21f7763 --- /dev/null +++ b/src/main/resources/plugins/MiaoTag.js @@ -0,0 +1,148 @@ +'use strict'; +/** + * MiaoTag + * 可兼容任何记分板 + */ +/*global Java, base, module, exports, require*/ + +var fs = require('core/fs'); +var event = require('modules/event'); +var bukkit = require('modules/bukkit'); +var command = require('modules/command'); + +var papi = require('plugins/ext/papi'); + +var fakeTag; + +var description = { + name: 'MiaoTag', + version: '1.0.1', + author: '喵♂呜', + config: { + update: 20, + format: '§4§l❤' + }, + commands: { + 'mtag': { + description: 'MiaoTag主命令', + usage: '', + permission: 'MiaoTag.admin', + } + }, + permissions: { + 'MiaoTag.default': { + default: true, + description: '默认权限 赋予玩家' + }, + 'MiaoTag.admin': { + default: false, + description: '管理权限' + } + } +}; + +var config; + +function load() { + config = self.getConfig(); + fakeTag = new FakeTag(config.format); +} + +function enable() { + command.on(self, 'mtag', { + cmd: function cmd (sender, command, args){ + var subcommand = args[0]; + switch (subcommand) { + case 'reload': + self.reloadConfig(); + break; + case 'test': + // var IllegalStateException = Java.type("java.lang.IllegalStateException"); + // throw new IllegalStateException('TEST'); + throw new TypeError('TEST'); + } + }, + tab: function tab (sender, command, args){ + return ['reload']; + } + }) + bukkit.players(function (p) fakeTag.set(p)); + event.on(self, 'PlayerJoin', function (event) fakeTag.set(event.player)); + event.on(self, 'EntityDamage', function (event) { + var player = event.entity; + if(player instanceof org.bukkit.entity.Player){ + setTimeout(function () { + fakeTag.update(player); + }, 1); + } + }, false); + //event.on(this, 'playerquitevent', function quit(event) removeTask(event.player)); +} + +function disable() { + fakeTag.disable(); +} + +function FakeTag(name) { + // NMS CLASS + var Scoreboard = bukkit.nmsCls('Scoreboard'); + var ScoreboardScore = bukkit.nmsCls('ScoreboardScore'); + var ScoreboardBaseCriteria = bukkit.nmsCls('ScoreboardBaseCriteria'); + var PacketPlayOutScoreboardScore = bukkit.nmsCls('PacketPlayOutScoreboardScore'); + var PacketPlayOutScoreboardObjective = bukkit.nmsCls('PacketPlayOutScoreboardObjective'); + var PacketPlayOutScoreboardDisplayObjective = bukkit.nmsCls('PacketPlayOutScoreboardDisplayObjective'); + + var scoreboardManager = bukkit.$.scoreboardManager; + var mainScoreboard = scoreboardManager.mainScoreboard.handle; + + try { + // 注册tag对象 + mainScoreboard.registerObjective(name, new ScoreboardBaseCriteria(name)); + } catch (ex){ + // ignore 忽略创建错误 eg: java.lang.IllegalArgumentException: An objective with the name 'xxxxx' already exists! + } + var objective = mainScoreboard.getObjective(name); + + // 缓存虚拟的tag包 + var cache = { + objective: new PacketPlayOutScoreboardObjective(objective, 0), + display: new PacketPlayOutScoreboardDisplayObjective(2, objective) + }; + + function sendPacket(player, p) { + player.handle.playerConnection.sendPacket(p); + } + + this.set = function (player) { + sendPacket(player, cache.objective); + sendPacket(player, cache.display); + this.update(player); + } + + this.update = function (player){ + var score = mainScoreboard.getPlayerScoreForObjective(player.name, objective); + score.setScore(player.getHealth()); + var scorePack = new PacketPlayOutScoreboardScore(score); + //把其他玩家缓存的包发给这个玩家 + bukkit.players(function (t) { + sendPacket(t, scorePack); + if (t.name != player.name) { + var outher = mainScoreboard.getPlayerScoreForObjective(t.name, objective); + outher.setScore(t.getHealth()); + sendPacket(player, new PacketPlayOutScoreboardScore(outher)); + } + }); + } + + this.disable = function (){ + // 注销tag对象 + mainScoreboard.unregisterObjective(objective); + } +} + +module.exports = { + description: description, + load: load, + enable: enable, + disable: disable +}; \ No newline at end of file