feat: 新增MiaoBoard插件
This commit is contained in:
		
							
								
								
									
										198
									
								
								src/main/resources/plugins/MiaoBoard.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/main/resources/plugins/MiaoBoard.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,198 @@
 | 
				
			|||||||
 | 
					'use strict';
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * MiaoBoard 喵式聊天插件
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/*global Java, base, module, exports, require*/
 | 
				
			||||||
 | 
					var task = require('api/task');
 | 
				
			||||||
 | 
					var event = require('api/event');
 | 
				
			||||||
 | 
					var server = require('api/server');
 | 
				
			||||||
 | 
					var command = require('api/command');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var papi = require('papi');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var Scoreboard = Java.type('org.spongepowered.api.scoreboard.Scoreboard');
 | 
				
			||||||
 | 
					var Objective = Java.type('org.spongepowered.api.scoreboard.objective.Objective');
 | 
				
			||||||
 | 
					var Criteria = Java.type('org.spongepowered.api.scoreboard.critieria.Criteria');
 | 
				
			||||||
 | 
					var Text = Java.type('org.spongepowered.api.text.Text');
 | 
				
			||||||
 | 
					var DisplaySlots = Java.type('org.spongepowered.api.scoreboard.displayslot.DisplaySlots');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var Player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var boards = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var description = {
 | 
				
			||||||
 | 
					    name: 'MiaoBoard',
 | 
				
			||||||
 | 
					    version: '1.0',
 | 
				
			||||||
 | 
					    author: '喵呜',
 | 
				
			||||||
 | 
					    commands: {
 | 
				
			||||||
 | 
					        'mboard': {
 | 
				
			||||||
 | 
					            description: '喵式记分板主命令'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    permissions: {
 | 
				
			||||||
 | 
					        'mb.default': {
 | 
				
			||||||
 | 
					            default: true,
 | 
				
			||||||
 | 
					            description: '默认权限 赋予玩家'
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        'mb.admin': {
 | 
				
			||||||
 | 
					            default: false,
 | 
				
			||||||
 | 
					            description: '管理权限'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    config: {
 | 
				
			||||||
 | 
					        "Version": 2,
 | 
				
			||||||
 | 
					        "UpdateTime": 10,
 | 
				
			||||||
 | 
					        "DisableWorld": [
 | 
				
			||||||
 | 
					            "WorldName"
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "Boards": {
 | 
				
			||||||
 | 
					            "default": {
 | 
				
			||||||
 | 
					                "index": 50,
 | 
				
			||||||
 | 
					                "time": {
 | 
				
			||||||
 | 
					                    "start": "2016-01-01 00:00:00",
 | 
				
			||||||
 | 
					                    "end": "2020-01-01 00:00:00"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "title": "玩家信息",
 | 
				
			||||||
 | 
					                "permission": "mb.default",
 | 
				
			||||||
 | 
					                "lines": [
 | 
				
			||||||
 | 
					                    "&6名 称: &a%player_displayname%",
 | 
				
			||||||
 | 
					                    "&6世 界: &b%player_world%",
 | 
				
			||||||
 | 
					                    "&6位 置: &3%player_x%,%player_y%,%player_z%",
 | 
				
			||||||
 | 
					                    "&6等 级: &e%player_level%",
 | 
				
			||||||
 | 
					                    "&6血 量: &c%player_health%",
 | 
				
			||||||
 | 
					                    "&6饥 饿: &d%player_food_level%",
 | 
				
			||||||
 | 
					                    "&6模 式: &4%player_gamemode%"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "admin": {
 | 
				
			||||||
 | 
					                "index": 49,
 | 
				
			||||||
 | 
					                "title": "服务器信息",
 | 
				
			||||||
 | 
					                "permission": "mb.reload",
 | 
				
			||||||
 | 
					                "lines": [
 | 
				
			||||||
 | 
					                    "&6名 称: &aMiaoBoard",
 | 
				
			||||||
 | 
					                    "&6版 本: &b" + this.version,
 | 
				
			||||||
 | 
					                    "&6作 者: &cMiaoWoo",
 | 
				
			||||||
 | 
					                    "&6人 数: &c%server_online%/%server_max%",
 | 
				
			||||||
 | 
					                    "&6内 存: &a%server_ram_used%/%server_ram_total%/%server_ram_max%"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var update_task;
 | 
				
			||||||
 | 
					var board_formats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function load() {
 | 
				
			||||||
 | 
					    board_formats = self.config.Boards;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function enable() {
 | 
				
			||||||
 | 
					    registerCommand();
 | 
				
			||||||
 | 
					    registerEvent();
 | 
				
			||||||
 | 
					    registerTask();
 | 
				
			||||||
 | 
					    server.players(function (player) {
 | 
				
			||||||
 | 
					        boards[player.name] = new MiaoBoard(player);
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function registerCommand() {
 | 
				
			||||||
 | 
					    command.on(self, 'mboard', {
 | 
				
			||||||
 | 
					        cmd: mainCommand
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mainCommand(sender, command, args) {
 | 
				
			||||||
 | 
					    boards[sender.name].update('MiaoBoard', ['第一行', '第二行', '第三行']);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function registerEvent() {
 | 
				
			||||||
 | 
					    switch (DetectServerType) {
 | 
				
			||||||
 | 
					        case ServerType.Bukkit:
 | 
				
			||||||
 | 
					            event.on(self, 'PlayerLoginEvent', handlerPlayerJoin);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case ServerType.Sponge:
 | 
				
			||||||
 | 
					            Player = org.spongepowered.api.entity.living.player.Player;
 | 
				
			||||||
 | 
					            event.on(self, 'ClientConnectionEvent.Join', handlerPlayerJoin);
 | 
				
			||||||
 | 
					            event.on(self, 'ClientConnectionEvent.Disconnect', handlerPlayerQuit);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function handlerPlayerJoin(event) {
 | 
				
			||||||
 | 
					    var player = event.player || event.targetEntity;
 | 
				
			||||||
 | 
					    boards[player.name] = new MiaoBoard(player);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function handlerPlayerQuit(event) {
 | 
				
			||||||
 | 
					    var player = event.player || event.targetEntity;
 | 
				
			||||||
 | 
					    delete boards[player.name];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function registerTask() {
 | 
				
			||||||
 | 
					    update_task = task.timerAsync(updateBoard, self.config.UpdateTime);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function updateBoard() {
 | 
				
			||||||
 | 
					    for (var i in boards) {
 | 
				
			||||||
 | 
					        var player = server.player(i);
 | 
				
			||||||
 | 
					        if (player.isOnline()) {
 | 
				
			||||||
 | 
					            var format = getBoardFormat(player);
 | 
				
			||||||
 | 
					            if (format) {
 | 
				
			||||||
 | 
					                boards[i].update(format.title, papi.replace(player, format.lines));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                boards[i].clear();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            delete boards[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getBoardFormat(player) {
 | 
				
			||||||
 | 
					    for (var i in board_formats) {
 | 
				
			||||||
 | 
					        var format = board_formats[i];
 | 
				
			||||||
 | 
					        if (player.hasPermission(format.permission)) {
 | 
				
			||||||
 | 
					            return format;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function disable() {
 | 
				
			||||||
 | 
					    update_task.cancel();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function MiaoBoard(player) {
 | 
				
			||||||
 | 
					    var uuid = player.uniqueId;
 | 
				
			||||||
 | 
					    var scoreboard = Scoreboard.builder().build();
 | 
				
			||||||
 | 
					    var sidebar = Objective.builder().criterion(Criteria.DUMMY).displayName(Text.EMPTY).name("Sidebar").build();
 | 
				
			||||||
 | 
					    var origin = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scoreboard.addObjective(sidebar);
 | 
				
			||||||
 | 
					    player.setScoreboard(scoreboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.update = function (title, lines) {
 | 
				
			||||||
 | 
					        sidebar.scores.values().forEach(function removeScore(score) {
 | 
				
			||||||
 | 
					            sidebar.removeScore(score)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        var max = lines.length;
 | 
				
			||||||
 | 
					        var i = 0;
 | 
				
			||||||
 | 
					        sidebar.setDisplayName(Text.of(title));
 | 
				
			||||||
 | 
					        lines.forEach(function addScore(line) {
 | 
				
			||||||
 | 
					            sidebar.getOrCreateScore(Text.of(line)).setScore(max - i++);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        scoreboard.updateDisplaySlot(sidebar, DisplaySlots.SIDEBAR);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.clear = function () {
 | 
				
			||||||
 | 
					        player.setScoreboard(Scoreboard.builder().build());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
					    description: description,
 | 
				
			||||||
 | 
					    load: load,
 | 
				
			||||||
 | 
					    enable: enable,
 | 
				
			||||||
 | 
					    disable: disable
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Reference in New Issue
	
	Block a user