@@ -44,12 +44,37 @@ export namespace command {
 | 
				
			|||||||
        protected setExecutor(plugin: plugin.Plugin, command: any, executor: Function) {
 | 
					        protected setExecutor(plugin: plugin.Plugin, command: any, executor: Function) {
 | 
				
			||||||
            return (sender: any, _: any, command: string, args: string[]) => {
 | 
					            return (sender: any, _: any, command: string, args: string[]) => {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    return executor(sender, command, Java.from(args))
 | 
					                    let time = Date.now()
 | 
				
			||||||
 | 
					                    let result = executor(sender, command, Java.from(args))
 | 
				
			||||||
 | 
					                    let cost = Date.now() - time
 | 
				
			||||||
 | 
					                    if (cost > global.ScriptSlowExecuteTime) {
 | 
				
			||||||
 | 
					                        console.i18n("ms.api.command.execute.slow", {
 | 
				
			||||||
 | 
					                            player: sender.name,
 | 
				
			||||||
 | 
					                            plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                            command,
 | 
				
			||||||
 | 
					                            args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                            cost
 | 
				
			||||||
 | 
					                        })
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return result
 | 
				
			||||||
                } catch (ex: any) {
 | 
					                } catch (ex: any) {
 | 
				
			||||||
                    console.i18n("ms.api.command.execute.error", { player: sender.name, plugin: plugin.description.name, command, args: Java.from(args).join(' '), ex })
 | 
					                    console.i18n("ms.api.command.execute.error", {
 | 
				
			||||||
 | 
					                        player: sender.name,
 | 
				
			||||||
 | 
					                        plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                        command,
 | 
				
			||||||
 | 
					                        args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                        ex
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
                    console.ex(ex)
 | 
					                    console.ex(ex)
 | 
				
			||||||
                    if (sender.name != 'CONSOLE') {
 | 
					                    if (sender.name != 'CONSOLE') {
 | 
				
			||||||
                        console.sender(sender, [i18n.translate("ms.api.command.execute.error", { player: sender.name, plugin: plugin.description.name, command, args: Java.from(args).join(' '), ex }), ...console.stack(ex)])
 | 
					                        console.sender(sender, [i18n.translate("ms.api.command.execute.error", {
 | 
				
			||||||
 | 
					                            player: sender.name,
 | 
				
			||||||
 | 
					                            plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                            command,
 | 
				
			||||||
 | 
					                            args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                            ex
 | 
				
			||||||
 | 
					                        }),
 | 
				
			||||||
 | 
					                        ...console.stack(ex)])
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return true
 | 
					                    return true
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -58,13 +83,42 @@ export namespace command {
 | 
				
			|||||||
        protected setTabCompleter(plugin: plugin.Plugin, command: any, tabCompleter: Function) {
 | 
					        protected setTabCompleter(plugin: plugin.Plugin, command: any, tabCompleter: Function) {
 | 
				
			||||||
            return (sender: any, _: any, command: string, args: string[]) => {
 | 
					            return (sender: any, _: any, command: string, args: string[]) => {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
 | 
					                    let time = Date.now()
 | 
				
			||||||
                    var token = args[args.length - 1]
 | 
					                    var token = args[args.length - 1]
 | 
				
			||||||
                    var complete = tabCompleter(sender, command, Java.from(args)) || []
 | 
					                    var complete = tabCompleter(sender, command, Java.from(args)) || []
 | 
				
			||||||
                    return this.copyPartialMatches(complete, token)
 | 
					                    let result = this.copyPartialMatches(complete, token)
 | 
				
			||||||
 | 
					                    let cost = Date.now() - time
 | 
				
			||||||
 | 
					                    if (cost > global.ScriptSlowExecuteTime) {
 | 
				
			||||||
 | 
					                        console.i18n("ms.api.command.tab.completer.slow", {
 | 
				
			||||||
 | 
					                            player: sender.name,
 | 
				
			||||||
 | 
					                            plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                            command,
 | 
				
			||||||
 | 
					                            args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                            cost
 | 
				
			||||||
 | 
					                        })
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return result
 | 
				
			||||||
                } catch (ex: any) {
 | 
					                } catch (ex: any) {
 | 
				
			||||||
                    console.i18n("ms.api.command.tab.completer.error", { player: sender.name, plugin: plugin.description.name, command, args: Java.from(args).join(' '), ex })
 | 
					                    console.i18n("ms.api.command.tab.completer.error", {
 | 
				
			||||||
 | 
					                        player: sender.name,
 | 
				
			||||||
 | 
					                        plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                        command,
 | 
				
			||||||
 | 
					                        args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                        ex
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
                    console.ex(ex)
 | 
					                    console.ex(ex)
 | 
				
			||||||
                    console.sender(sender, [i18n.translate("ms.api.command.tab.completer.error", { player: sender.name, plugin: plugin.description.name, command, args: Java.from(args).join(' '), ex }), ...console.stack(ex)])
 | 
					                    if (sender.name != 'CONSOLE') {
 | 
				
			||||||
 | 
					                        console.sender(sender, [
 | 
				
			||||||
 | 
					                            i18n.translate("ms.api.command.tab.completer.error", {
 | 
				
			||||||
 | 
					                                player: sender.name,
 | 
				
			||||||
 | 
					                                plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                                command,
 | 
				
			||||||
 | 
					                                args: Java.from(args).join(' '),
 | 
				
			||||||
 | 
					                                ex
 | 
				
			||||||
 | 
					                            }),
 | 
				
			||||||
 | 
					                            ...console.stack(ex)
 | 
				
			||||||
 | 
					                        ])
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    return []
 | 
					                    return []
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -100,7 +100,7 @@ export namespace event {
 | 
				
			|||||||
                        let time = Date.now()
 | 
					                        let time = Date.now()
 | 
				
			||||||
                        exec(event)
 | 
					                        exec(event)
 | 
				
			||||||
                        let cost = Date.now() - time
 | 
					                        let cost = Date.now() - time
 | 
				
			||||||
                        if (cost > 20) {
 | 
					                        if (cost > global.ScriptSlowExecuteTime) {
 | 
				
			||||||
                            console.i18n("ms.api.event.execute.slow", { name, event: this.class2Name(eventCls), cost })
 | 
					                            console.i18n("ms.api.event.execute.slow", { name, event: this.class2Name(eventCls), cost })
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,13 +40,13 @@ export namespace server {
 | 
				
			|||||||
        get(name: string): NativePlugin {
 | 
					        get(name: string): NativePlugin {
 | 
				
			||||||
            throw new Error("Method not implemented.")
 | 
					            throw new Error("Method not implemented.")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        load(name: string): boolean {
 | 
					        enable(name: string): NativePlugin {
 | 
				
			||||||
            throw new Error("Method not implemented.")
 | 
					            throw new Error("Method not implemented.")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        unload(name: string): boolean {
 | 
					        disable(name: string): NativePlugin {
 | 
				
			||||||
            throw new Error("Method not implemented.")
 | 
					            throw new Error("Method not implemented.")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        reload(name: string): boolean {
 | 
					        reload(name: string): NativePlugin {
 | 
				
			||||||
            throw new Error("Method not implemented.")
 | 
					            throw new Error("Method not implemented.")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        delete(name: string): boolean {
 | 
					        delete(name: string): boolean {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import { channel, plugin } from '@ccms/api'
 | 
					import { channel, plugin } from '@ccms/api'
 | 
				
			||||||
import { inject, provideSingleton } from '@ccms/container'
 | 
					import { inject, provideSingleton } from '@ccms/container'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Bukkit = org.bukkit.Bukkit
 | 
					const Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
const PluginMessageListener = Java.type("org.bukkit.plugin.messaging.PluginMessageListener")
 | 
					const PluginMessageListener = Java.type("org.bukkit.plugin.messaging.PluginMessageListener")
 | 
				
			||||||
const Messenger = Bukkit.getMessenger()
 | 
					const Messenger = Bukkit.getMessenger()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,12 @@
 | 
				
			|||||||
import { chat } from '@ccms/api'
 | 
					import { chat } from '@ccms/api'
 | 
				
			||||||
import { provideSingleton } from '@ccms/container'
 | 
					import { provideSingleton } from '@ccms/container'
 | 
				
			||||||
import bukkitChat from './enhance/chat'
 | 
					import bukkitChat from './internal/chat'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingleton(chat.Chat)
 | 
					@provideSingleton(chat.Chat)
 | 
				
			||||||
export class BukkitChat extends chat.Chat {
 | 
					export class BukkitChat extends chat.Chat {
 | 
				
			||||||
 | 
					    get handle(): any {
 | 
				
			||||||
 | 
					        return bukkitChat
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    sendJson(sender: any, json: string | object, type = 0) {
 | 
					    sendJson(sender: any, json: string | object, type = 0) {
 | 
				
			||||||
        bukkitChat.send(sender, typeof json === "string" ? json : JSON.stringify(json), type)
 | 
					        bukkitChat.send(sender, typeof json === "string" ? json : JSON.stringify(json), type)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,35 +1,38 @@
 | 
				
			|||||||
import '@ccms/nashorn'
 | 
					import '@ccms/nashorn'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { command, plugin } from '@ccms/api'
 | 
					import { command, plugin } from '@ccms/api'
 | 
				
			||||||
import * as reflect from '@ccms/common/dist/reflect'
 | 
					 | 
				
			||||||
import { provideSingleton, postConstruct, inject } from '@ccms/container'
 | 
					import { provideSingleton, postConstruct, inject } from '@ccms/container'
 | 
				
			||||||
 | 
					import * as reflect from '@ccms/common/dist/reflect'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let Bukkit = org.bukkit.Bukkit
 | 
					const Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
let TabCompleter = Java.type('org.bukkit.command.TabCompleter')
 | 
					const TabCompleter = Java.type('org.bukkit.command.TabCompleter')
 | 
				
			||||||
let PluginCommand = Java.type('org.bukkit.command.PluginCommand')
 | 
					const PluginCommand = Java.type('org.bukkit.command.PluginCommand')
 | 
				
			||||||
let CommandExecutor = Java.type('org.bukkit.command.CommandExecutor')
 | 
					const CommandExecutor = Java.type('org.bukkit.command.CommandExecutor')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingleton(command.Command)
 | 
					@provideSingleton(command.Command)
 | 
				
			||||||
export class BukkitCommand extends command.Command {
 | 
					export class BukkitCommand extends command.Command {
 | 
				
			||||||
    @inject(plugin.PluginInstance)
 | 
					    @inject(plugin.PluginInstance)
 | 
				
			||||||
    private pluginInstance: any
 | 
					    private pluginInstance: any
 | 
				
			||||||
    private commandMap: any
 | 
					    private commandMap: any
 | 
				
			||||||
 | 
					    private knownCommands: any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @postConstruct()
 | 
					    @postConstruct()
 | 
				
			||||||
    init() {
 | 
					    init() {
 | 
				
			||||||
        this.commandMap = reflect.on(Bukkit.getPluginManager()).get('commandMap').get()
 | 
					        this.commandMap = reflect.on(Bukkit.getPluginManager()).get('commandMap').get()
 | 
				
			||||||
 | 
					        this.knownCommands = reflect.on(this.commandMap).get('knownCommands').get()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    create(plugin: any, command: string) {
 | 
					    create(plugin: any, command: string) {
 | 
				
			||||||
        var cmd = this.commandMap.getCommand(command)
 | 
					        var cmd = this.commandMap.getCommand(command)
 | 
				
			||||||
        if (cmd && cmd instanceof PluginCommand) { return cmd };
 | 
					        if (cmd instanceof PluginCommand) { return cmd };
 | 
				
			||||||
        cmd = reflect.on(PluginCommand).create(command, this.pluginInstance).get()
 | 
					        cmd = reflect.on(PluginCommand).create(command, this.pluginInstance).get()
 | 
				
			||||||
        this.commandMap.register(plugin.description.name, cmd)
 | 
					        this.commandMap.register(plugin.description.name, cmd)
 | 
				
			||||||
        return cmd
 | 
					        return cmd
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    remove(plugin: any, command: string) {
 | 
					    remove(plugin: any, command: string) {
 | 
				
			||||||
        var cmd = this.commandMap.getCommand(command)
 | 
					        var cmd = this.commandMap.getCommand(command)
 | 
				
			||||||
        if (cmd && cmd instanceof PluginCommand) {
 | 
					        if (cmd instanceof PluginCommand) {
 | 
				
			||||||
            cmd.unregister(this.commandMap)
 | 
					            cmd.unregister(this.commandMap)
 | 
				
			||||||
 | 
					            this.knownCommands.remove(command)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    tabComplete(sender: any, input: string, index?: number): string[] {
 | 
					    tabComplete(sender: any, input: string, index?: number): string[] {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +1,20 @@
 | 
				
			|||||||
import { MiaoScriptConsole } from '@ccms/api'
 | 
					import { MiaoScriptConsole } from '@ccms/api'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let Bukkit = org.bukkit.Bukkit;
 | 
					const Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class BukkitConsole extends MiaoScriptConsole {
 | 
					export class BukkitConsole extends MiaoScriptConsole {
 | 
				
			||||||
    sender(sender, ...args) {
 | 
					    sender(sender, ...args) {
 | 
				
			||||||
        if (!(sender instanceof Java.type('org.bukkit.command.CommandSender'))) {
 | 
					        if (!(sender instanceof Java.type('org.bukkit.command.CommandSender'))) {
 | 
				
			||||||
            this.error(`First parameter ${sender} not instanceof org.bukkit.command.CommandSender can't send message!`)
 | 
					            this.error(`First parameter ${sender} not instanceof org.bukkit.command.CommandSender can't send message!`)
 | 
				
			||||||
            return;
 | 
					            return
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (Object.prototype.toString.call(args[0]) === "[object Array]") {
 | 
					        if (Object.prototype.toString.call(args[0]) === "[object Array]") {
 | 
				
			||||||
            args[0].forEach(line => sender.sendMessage(this.prefix + line))
 | 
					            args[0].forEach(line => sender.sendMessage(this.prefix + line))
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            sender.sendMessage(this.prefix + args.join(' '));
 | 
					            sender.sendMessage(this.prefix + args.join(' '))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    console(...args: string[]): void {
 | 
					    console(...args: string[]): void {
 | 
				
			||||||
        this.sender(Bukkit.getConsoleSender(), args.join(' '));
 | 
					        this.sender(Bukkit.getConsoleSender(), args.join(' '))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,13 @@
 | 
				
			|||||||
import { event, plugin } from '@ccms/api'
 | 
					import { event, plugin } from '@ccms/api'
 | 
				
			||||||
import { inject, provideSingleton } from '@ccms/container';
 | 
					import { inject, provideSingleton } from '@ccms/container'
 | 
				
			||||||
import * as reflect from '@ccms/common/dist/reflect'
 | 
					import * as reflect from '@ccms/common/dist/reflect'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Bukkit = Java.type("org.bukkit.Bukkit");
 | 
					const Bukkit = Java.type("org.bukkit.Bukkit")
 | 
				
			||||||
const Event = Java.type("org.bukkit.event.Event");
 | 
					const Event = Java.type("org.bukkit.event.Event")
 | 
				
			||||||
const Modifier = Java.type("java.lang.reflect.Modifier");
 | 
					const Modifier = Java.type("java.lang.reflect.Modifier")
 | 
				
			||||||
const Listener = Java.type("org.bukkit.event.Listener");
 | 
					const Listener = Java.type("org.bukkit.event.Listener")
 | 
				
			||||||
const EventPriority = Java.type("org.bukkit.event.EventPriority");
 | 
					const EventPriority = Java.type("org.bukkit.event.EventPriority")
 | 
				
			||||||
const EventExecutor = Java.type("org.bukkit.plugin.EventExecutor");
 | 
					const EventExecutor = Java.type("org.bukkit.plugin.EventExecutor")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingleton(event.Event)
 | 
					@provideSingleton(event.Event)
 | 
				
			||||||
export class BukkitEvent extends event.Event {
 | 
					export class BukkitEvent extends event.Event {
 | 
				
			||||||
@@ -15,7 +15,7 @@ export class BukkitEvent extends event.Event {
 | 
				
			|||||||
    private pluginInstance: any
 | 
					    private pluginInstance: any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
        super('org/bukkit/event');
 | 
					        super('org/bukkit/event')
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getJarFile(resource: string) {
 | 
					    getJarFile(resource: string) {
 | 
				
			||||||
@@ -27,10 +27,10 @@ export class BukkitEvent extends event.Event {
 | 
				
			|||||||
            // 访问符为Public
 | 
					            // 访问符为Public
 | 
				
			||||||
            Modifier.isPublic(clazz.getModifiers()) &&
 | 
					            Modifier.isPublic(clazz.getModifiers()) &&
 | 
				
			||||||
            // 不是抽象类
 | 
					            // 不是抽象类
 | 
				
			||||||
            !Modifier.isAbstract(clazz.getModifiers());
 | 
					            !Modifier.isAbstract(clazz.getModifiers())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    register(eventCls: any, exec: Function, priority: event.EventPriority, ignoreCancel: boolean) {
 | 
					    register(eventCls: any, exec: Function, priority: event.EventPriority, ignoreCancel: boolean) {
 | 
				
			||||||
        let listener = new Listener({});
 | 
					        let listener = new Listener({})
 | 
				
			||||||
        Bukkit.pluginManager.registerEvent(
 | 
					        Bukkit.pluginManager.registerEvent(
 | 
				
			||||||
            eventCls,
 | 
					            eventCls,
 | 
				
			||||||
            listener,
 | 
					            listener,
 | 
				
			||||||
@@ -39,10 +39,10 @@ export class BukkitEvent extends event.Event {
 | 
				
			|||||||
                execute: exec
 | 
					                execute: exec
 | 
				
			||||||
            }),
 | 
					            }),
 | 
				
			||||||
            this.pluginInstance,
 | 
					            this.pluginInstance,
 | 
				
			||||||
            ignoreCancel);
 | 
					            ignoreCancel)
 | 
				
			||||||
        return listener;
 | 
					        return listener
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    unregister(event: any, listener: any): void {
 | 
					    unregister(event: any, listener: any): void {
 | 
				
			||||||
        reflect.on(event).call('getHandlerList').get().unregister(listener);
 | 
					        reflect.on(event).call('getHandlerList').get().unregister(listener)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,17 +29,16 @@ abstract class BukkitChatInvoke {
 | 
				
			|||||||
            this.ChatSerializer = Java.type(nmsChatSerializerClass.getName())
 | 
					            this.ChatSerializer = Java.type(nmsChatSerializerClass.getName())
 | 
				
			||||||
            let packetTypeClass = this.getPacketPlayOutChatClass()
 | 
					            let packetTypeClass = this.getPacketPlayOutChatClass()
 | 
				
			||||||
            this.PacketPlayOutChat = Java.type(packetTypeClass.getName())
 | 
					            this.PacketPlayOutChat = Java.type(packetTypeClass.getName())
 | 
				
			||||||
            let packetTypeConstructor: { parameterTypes: any[] }
 | 
					 | 
				
			||||||
            let constructors = packetTypeClass.constructors
 | 
					            let constructors = packetTypeClass.constructors
 | 
				
			||||||
            Java.from(constructors).forEach(function (c) {
 | 
					            for (const constructor of Java.from(constructors)) {
 | 
				
			||||||
                if (c.parameterTypes.length === 2 || c.parameterTypes.length === 3) {
 | 
					                let parameterTypes = constructor.parameterTypes
 | 
				
			||||||
                    packetTypeConstructor = c
 | 
					                if (parameterTypes.length === 2 || parameterTypes.length === 3) {
 | 
				
			||||||
 | 
					                    let nmsChatMessageTypeClass = parameterTypes[1]
 | 
				
			||||||
 | 
					                    if (nmsChatMessageTypeClass.isEnum()) {
 | 
				
			||||||
 | 
					                        this.chatMessageTypes = nmsChatMessageTypeClass.getEnumConstants()
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            })
 | 
					 | 
				
			||||||
            let parameterTypes = packetTypeConstructor.parameterTypes
 | 
					 | 
				
			||||||
            let nmsChatMessageTypeClass = parameterTypes[1]
 | 
					 | 
				
			||||||
            if (nmsChatMessageTypeClass.isEnum()) {
 | 
					 | 
				
			||||||
                this.chatMessageTypes = nmsChatMessageTypeClass.getEnumConstants()
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            let playerConnectionField = this.getPlayerConnectionField()
 | 
					            let playerConnectionField = this.getPlayerConnectionField()
 | 
				
			||||||
            this.playerConnectionFieldName = playerConnectionField.getName()
 | 
					            this.playerConnectionFieldName = playerConnectionField.getName()
 | 
				
			||||||
@@ -151,8 +150,9 @@ class BukkitChatInvoke_1_17_1 extends BukkitChatInvoke_1_16_5 {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try {
 | 
					try {
 | 
				
			||||||
    //@ts-ignore
 | 
					    let Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
    let nmsVersion = org.bukkit.Bukkit.server.class.name.split('.')[3]
 | 
					    // @ts-ignore
 | 
				
			||||||
 | 
					    let nmsVersion = Bukkit.getServer().class.name.split('.')[3]
 | 
				
			||||||
    let nmsSubVersion = nmsVersion.split("_")[1]
 | 
					    let nmsSubVersion = nmsVersion.split("_")[1]
 | 
				
			||||||
    if (nmsSubVersion >= 8) {
 | 
					    if (nmsSubVersion >= 8) {
 | 
				
			||||||
        bukkitChatInvoke = new BukkitChatInvoke_1_8(nmsVersion)
 | 
					        bukkitChatInvoke = new BukkitChatInvoke_1_8(nmsVersion)
 | 
				
			||||||
@@ -168,6 +168,7 @@ try {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let chat = {
 | 
					let chat = {
 | 
				
			||||||
 | 
					    invoke: bukkitChatInvoke,
 | 
				
			||||||
    json: bukkitChatInvoke.json.bind(bukkitChatInvoke),
 | 
					    json: bukkitChatInvoke.json.bind(bukkitChatInvoke),
 | 
				
			||||||
    send: bukkitChatInvoke.send.bind(bukkitChatInvoke)
 | 
					    send: bukkitChatInvoke.send.bind(bukkitChatInvoke)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { provideSingleton } from '@ccms/container'
 | 
					import { provideSingleton } from '@ccms/container'
 | 
				
			||||||
import { particle, plugin } from '@ccms/api'
 | 
					import { particle } from '@ccms/api'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingleton(particle.ParticleManager)
 | 
					@provideSingleton(particle.ParticleManager)
 | 
				
			||||||
export class BukkitParticleManager extends particle.ParticleManager {
 | 
					export class BukkitParticleManager extends particle.ParticleManager {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,22 @@ export class BukkitNativePluginManager extends server.NativePluginManager {
 | 
				
			|||||||
    get(name: string): server.NativePlugin {
 | 
					    get(name: string): server.NativePlugin {
 | 
				
			||||||
        return this.convert(this.bukkitPluginManager.getPlugin(name))
 | 
					        return this.convert(this.bukkitPluginManager.getPlugin(name))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    enable(name: string): server.NativePlugin {
 | 
				
			||||||
 | 
					        let origin = this.bukkitPluginManager.getPlugin(name)
 | 
				
			||||||
 | 
					        if (!origin) { throw new Error(`Native Plugin ${name} not found.`) }
 | 
				
			||||||
 | 
					        if (!origin.isEnabled()) {
 | 
				
			||||||
 | 
					            this.bukkitPluginManager.enablePlugin(origin)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this.convert(origin)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    disable(name: string): server.NativePlugin {
 | 
				
			||||||
 | 
					        let origin = this.bukkitPluginManager.getPlugin(name)
 | 
				
			||||||
 | 
					        if (!origin) { throw new Error(`Native Plugin ${name} not found.`) }
 | 
				
			||||||
 | 
					        if (origin.isEnabled()) {
 | 
				
			||||||
 | 
					            this.bukkitPluginManager.disablePlugin(origin)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this.convert(origin)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private convert(plugin: org.bukkit.plugin.Plugin): server.NativePlugin {
 | 
					    private convert(plugin: org.bukkit.plugin.Plugin): server.NativePlugin {
 | 
				
			||||||
        if (!plugin) return plugin as any
 | 
					        if (!plugin) return plugin as any
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,9 @@
 | 
				
			|||||||
import { server, constants } from '@ccms/api'
 | 
					import { server } from '@ccms/api'
 | 
				
			||||||
import { provideSingleton } from '@ccms/container'
 | 
					import { provideSingleton } from '@ccms/container'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as reflect from '@ccms/common/dist/reflect'
 | 
					import * as reflect from '@ccms/common/dist/reflect'
 | 
				
			||||||
import chat from './enhance/chat'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
let Bukkit: typeof org.bukkit.Bukkit = org.bukkit.Bukkit
 | 
					const Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingleton(server.Server)
 | 
					@provideSingleton(server.Server)
 | 
				
			||||||
export class BukkitServer extends server.ReflectServer {
 | 
					export class BukkitServer extends server.ReflectServer {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { task, plugin } from '@ccms/api'
 | 
					import { task, plugin } from '@ccms/api'
 | 
				
			||||||
import { inject, provideSingleton } from '@ccms/container'
 | 
					import { provideSingleton } from '@ccms/container'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Bukkit = Java.type('org.bukkit.Bukkit')
 | 
					const Bukkit = Java.type('org.bukkit.Bukkit')
 | 
				
			||||||
const BukkitRunnable = Java.type('org.bukkit.scheduler.BukkitRunnable')
 | 
					const BukkitRunnable = Java.type('org.bukkit.scheduler.BukkitRunnable')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,11 @@ class MiaoScriptCore {
 | 
				
			|||||||
        this.pluginManager.disable(this.pluginManager.getPlugins())
 | 
					        this.pluginManager.disable(this.pluginManager.getPlugins())
 | 
				
			||||||
        this.taskManager.disable()
 | 
					        this.taskManager.disable()
 | 
				
			||||||
        process.exit(0)
 | 
					        process.exit(0)
 | 
				
			||||||
        console.i18n("ms.core.engine.disable.finish", { version: 'v' + global.ScriptEngineVersion, time: (new Date().getTime() - disableStartTime) / 1000 })
 | 
					        console.i18n("ms.core.engine.disable.finish", {
 | 
				
			||||||
 | 
					            loader: base.version,
 | 
				
			||||||
 | 
					            version: 'v' + global.ScriptEngineVersion,
 | 
				
			||||||
 | 
					            time: (new Date().getTime() - disableStartTime) / 1000
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,8 +81,16 @@ function detectServer(): constants.ServerType {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function initialize() {
 | 
					function initialize() {
 | 
				
			||||||
 | 
					    global.ScriptSlowExecuteTime = 30
 | 
				
			||||||
    global.ScriptEngineVersion = require('../package.json').version
 | 
					    global.ScriptEngineVersion = require('../package.json').version
 | 
				
			||||||
    try { engineLoad({ script: http.get("http://ms.yumc.pw/api/plugin/download/name/initialize"), name: 'core/initialize.js' }) } catch (error: any) { console.debug(error) }
 | 
					    try {
 | 
				
			||||||
 | 
					        engineLoad({
 | 
				
			||||||
 | 
					            script: http.get("https://ms.yumc.pw/api/plugin/download/name/initialize"),
 | 
				
			||||||
 | 
					            name: 'core/initialize.js'
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    } catch (error: any) {
 | 
				
			||||||
 | 
					        console.debug(error)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        let corePackageStartTime = new Date().getTime()
 | 
					        let corePackageStartTime = new Date().getTime()
 | 
				
			||||||
        container.bind(ContainerInstance).toConstantValue(container)
 | 
					        container.bind(ContainerInstance).toConstantValue(container)
 | 
				
			||||||
@@ -95,7 +107,11 @@ function initialize() {
 | 
				
			|||||||
        container.load(buildProviderModule())
 | 
					        container.load(buildProviderModule())
 | 
				
			||||||
        console.i18n("ms.core.package.completed", { scope: global.scope, type, time: (Date.now() - corePackageStartTime) / 1000 })
 | 
					        console.i18n("ms.core.package.completed", { scope: global.scope, type, time: (Date.now() - corePackageStartTime) / 1000 })
 | 
				
			||||||
        let disable = container.get<MiaoScriptCore>(MiaoScriptCore).enable()
 | 
					        let disable = container.get<MiaoScriptCore>(MiaoScriptCore).enable()
 | 
				
			||||||
        console.i18n("ms.core.engine.completed", { version: 'v' + global.ScriptEngineVersion, time: (Date.now() - global.ScriptEngineStartTime) / 1000 })
 | 
					        console.i18n("ms.core.engine.completed", {
 | 
				
			||||||
 | 
					            loader: base.version,
 | 
				
			||||||
 | 
					            version: 'v' + global.ScriptEngineVersion,
 | 
				
			||||||
 | 
					            time: (Date.now() - global.ScriptEngineStartTime) / 1000
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
        return disable
 | 
					        return disable
 | 
				
			||||||
    } catch (error: any) {
 | 
					    } catch (error: any) {
 | 
				
			||||||
        console.i18n("ms.core.initialize.error", { error })
 | 
					        console.i18n("ms.core.initialize.error", { error })
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,22 @@
 | 
				
			|||||||
 | 
					var fs = require('@ccms/common/dist/fs')
 | 
				
			||||||
 | 
					function updateJar() {
 | 
				
			||||||
 | 
					    if (!base.version) {
 | 
				
			||||||
 | 
					        var pluginFolder = fs.file(fs.concat(root, '..'))
 | 
				
			||||||
 | 
					        var updateFolder = fs.concat(pluginFolder, 'update')
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function upgradeModules() {
 | 
				
			||||||
 | 
					    var core = http.get('https://registry.npmmirror.com/@ccms/core')
 | 
				
			||||||
 | 
					    if (base.version && global.ScriptEngineVersion != core['dist-tags']['latest']) {
 | 
				
			||||||
 | 
					        var Paths = Java.type('java.nio.file.Paths')
 | 
				
			||||||
 | 
					        base.save(Paths.get(root, "upgrade"), core['dist-tags']['latest'])
 | 
				
			||||||
 | 
					        console.info('@ccms/core found new version ' + core['dist-tags']['latest'] + ' will upgrade after reboot!')
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
function initialize() {
 | 
					function initialize() {
 | 
				
			||||||
    var mspmc = 'http://ms.yumc.pw/api/plugin/download/name/'
 | 
					    var mspmc = 'https://ms.yumc.pw/api/plugin/download/name/'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var http = require('@ccms/common/dist/http').default
 | 
					    var http = require('@ccms/common/dist/http').default
 | 
				
			||||||
    var fs = require('@ccms/common/dist/fs')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var pluginFolder = fs.concat(root, 'plugins')
 | 
					    var pluginFolder = fs.concat(root, 'plugins')
 | 
				
			||||||
    var updateFolder = fs.concat(pluginFolder, 'update')
 | 
					    var updateFolder = fs.concat(pluginFolder, 'update')
 | 
				
			||||||
@@ -27,12 +41,12 @@ function initialize() {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    var core = http.get('https://registry.npmmirror.com/@ccms/core')
 | 
					    try {
 | 
				
			||||||
    if (base.VERSION && global.ScriptEngineVersion != core['dist-tags']['latest']) {
 | 
					        Java.type("org.bukkit.Bukkit")
 | 
				
			||||||
        var Paths = Java.type('java.nio.file.Paths')
 | 
					        updateJar()
 | 
				
			||||||
        base.save(Paths.get(root, "upgrade"), core['dist-tags']['latest'])
 | 
					    } catch (ignore) {
 | 
				
			||||||
        console.info('@ccms/core found new version ' + core['dist-tags']['latest'] + ' will upgrade after reboot!')
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    upgradeModules()
 | 
				
			||||||
    console.debug('initialize finish!')
 | 
					    console.debug('initialize finish!')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
initialize()
 | 
					initialize()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,9 +10,9 @@ ms.core.package.initialize: "初始化 MiaoScript 扩展 {scope}/core {scope}/{t
 | 
				
			|||||||
ms.core.package.completed: "MiaoScript 扩展 {scope}/core {scope}/{type} {scope}/plugin 加载完成 耗时({time}s)"
 | 
					ms.core.package.completed: "MiaoScript 扩展 {scope}/core {scope}/{type} {scope}/plugin 加载完成 耗时({time}s)"
 | 
				
			||||||
ms.core.plugin.initialize: "MiaoScript 开始引导插件系统. 请稍候..."
 | 
					ms.core.plugin.initialize: "MiaoScript 开始引导插件系统. 请稍候..."
 | 
				
			||||||
ms.core.plugin.completed: "MiaoScript 插件加载完毕 耗时({time}s)!"
 | 
					ms.core.plugin.completed: "MiaoScript 插件加载完毕 耗时({time}s)!"
 | 
				
			||||||
ms.core.engine.completed: "MiaoScript 脚本引擎 {version} 加载完毕... 耗时({time}s)!"
 | 
					ms.core.engine.completed: "MiaoScript 框架 {loader} 引擎 {version} 加载完毕... 耗时({time}s)!"
 | 
				
			||||||
ms.core.engine.disable: "MiaoScript 关闭脚本引擎 请稍候..."
 | 
					ms.core.engine.disable: "MiaoScript 关闭脚本引擎 请稍候..."
 | 
				
			||||||
ms.core.engine.disable.finish: "MiaoScript 脚本引擎 {version} 关闭完成... 耗时({time}s)!"
 | 
					ms.core.engine.disable.finish: "MiaoScript 框架 {loader} 引擎 {version} 关闭完成... 耗时({time}s)!"
 | 
				
			||||||
ms.core.engine.disable.abnormal: "引擎异常启动或初始化未完成 跳过关闭流程..."
 | 
					ms.core.engine.disable.abnormal: "引擎异常启动或初始化未完成 跳过关闭流程..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ms.api.event.resource.not.found: "无法映射事件 未找到资源文件 {resource}!"
 | 
					ms.api.event.resource.not.found: "无法映射事件 未找到资源文件 {resource}!"
 | 
				
			||||||
@@ -27,7 +27,9 @@ ms.api.event.unregister: "[{name}] 注销事件 {event} => 执行器 {exec}"
 | 
				
			|||||||
ms.api.command.register.input.error: "CommandExec 必须为一个函数... 输入: {exec}"
 | 
					ms.api.command.register.input.error: "CommandExec 必须为一个函数... 输入: {exec}"
 | 
				
			||||||
ms.api.command.register: "[{plugin}] 注册命令 {name}({cmd})..."
 | 
					ms.api.command.register: "[{plugin}] 注册命令 {name}({cmd})..."
 | 
				
			||||||
ms.api.command.unregister: "[{plugin}] 注销命令 {name}..."
 | 
					ms.api.command.unregister: "[{plugin}] 注销命令 {name}..."
 | 
				
			||||||
 | 
					ms.api.command.execute.slow: "§c注意! §6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6命令 §c耗时 §4{cost}ms !"
 | 
				
			||||||
ms.api.command.execute.error: "§6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6命令时发生异常 §4{ex}"
 | 
					ms.api.command.execute.error: "§6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6命令时发生异常 §4{ex}"
 | 
				
			||||||
 | 
					ms.api.command.tab.completer.slow: "§c注意! §6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6补全 §c耗时 §4{cost}ms !"
 | 
				
			||||||
ms.api.command.tab.completer.error: "§6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6补全时发生异常 §4{ex}"
 | 
					ms.api.command.tab.completer.error: "§6玩家 §a{player} §6执行 §b{plugin} §6插件 §d{command} {args} §6补全时发生异常 §4{ex}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ms.plugin.initialize: "初始化 MiaoScript 插件系统: 实例: {plugin} 加载器: {loader}..."
 | 
					ms.plugin.initialize: "初始化 MiaoScript 插件系统: 实例: {plugin} 加载器: {loader}..."
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,7 @@ declare global {
 | 
				
			|||||||
            debug: boolean
 | 
					            debug: boolean
 | 
				
			||||||
            level: string
 | 
					            level: string
 | 
				
			||||||
            ScriptEngineVersion: string
 | 
					            ScriptEngineVersion: string
 | 
				
			||||||
 | 
					            ScriptSlowExecuteTime: number
 | 
				
			||||||
            ScriptEngineStartTime: number
 | 
					            ScriptEngineStartTime: number
 | 
				
			||||||
            setGlobal: (key: string, value: any, config?: PropertyDescriptor & ThisType<any>) => void
 | 
					            setGlobal: (key: string, value: any, config?: PropertyDescriptor & ThisType<any>) => void
 | 
				
			||||||
            noop: () => void
 | 
					            noop: () => void
 | 
				
			||||||
@@ -65,6 +66,7 @@ declare global {
 | 
				
			|||||||
    const ScriptEngineContextHolder: any
 | 
					    const ScriptEngineContextHolder: any
 | 
				
			||||||
    function engineLoad(str: string | { script: string, name: string }): any
 | 
					    function engineLoad(str: string | { script: string, name: string }): any
 | 
				
			||||||
    interface Core {
 | 
					    interface Core {
 | 
				
			||||||
 | 
					        version: string
 | 
				
			||||||
        getClass(name: String): any
 | 
					        getClass(name: String): any
 | 
				
			||||||
        getProxyClass(): any
 | 
					        getProxyClass(): any
 | 
				
			||||||
        getJavaScriptTaskClass(): any
 | 
					        getJavaScriptTaskClass(): any
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@
 | 
				
			|||||||
        "@ccms/common": "^0.18.0",
 | 
					        "@ccms/common": "^0.18.0",
 | 
				
			||||||
        "@ccms/container": "^0.18.0",
 | 
					        "@ccms/container": "^0.18.0",
 | 
				
			||||||
        "@ccms/i18n": "^0.18.0",
 | 
					        "@ccms/i18n": "^0.18.0",
 | 
				
			||||||
 | 
					        "crypto-js": "^4.1.1",
 | 
				
			||||||
        "js-yaml": "^4.1.0",
 | 
					        "js-yaml": "^4.1.0",
 | 
				
			||||||
        "yaml": "^1.10.2"
 | 
					        "yaml": "^1.10.2"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,15 @@ export class PluginCommandManager {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private unregistryCommand(pluginInstance: plugin.Plugin) {
 | 
					    private unregistryCommand(pluginInstance: plugin.Plugin) {
 | 
				
			||||||
        let cmds = getPluginCommandMetadata(pluginInstance)
 | 
					        let cmds = getPluginCommandMetadata(pluginInstance)
 | 
				
			||||||
        cmds.forEach(cmd => this.CommandManager.off(pluginInstance, cmd.name))
 | 
					        for (const cmd of cmds) {
 | 
				
			||||||
 | 
					            if (!this.ServerChecker.check(cmd.servers)) {
 | 
				
			||||||
 | 
					                console.debug(`[${pluginInstance.description.name}] ${cmd.target.constructor.name} incompatible command ${cmd.name} server(${cmd.servers}) ignore.`)
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            for (let command of [cmd.name, ...cmd.alias]) {
 | 
				
			||||||
 | 
					                this.CommandManager.off(pluginInstance, command)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private generateAutoMainCommand(pluginInstance: plugin.Plugin, cmd: interfaces.CommandMetadata, tab: interfaces.CommandMetadata) {
 | 
					    private generateAutoMainCommand(pluginInstance: plugin.Plugin, cmd: interfaces.CommandMetadata, tab: interfaces.CommandMetadata) {
 | 
				
			||||||
@@ -46,17 +54,41 @@ export class PluginCommandManager {
 | 
				
			|||||||
            cmdExecutor = (sender: any, command: string, args: string[]) => {
 | 
					            cmdExecutor = (sender: any, command: string, args: string[]) => {
 | 
				
			||||||
                let subcommand = args[0]
 | 
					                let subcommand = args[0]
 | 
				
			||||||
                let cmdKey = 'cmd' + subcommand
 | 
					                let cmdKey = 'cmd' + subcommand
 | 
				
			||||||
                if (pluginInstance[cmdKey]) {
 | 
					                let subcommandexec = pluginInstance[cmdKey]
 | 
				
			||||||
 | 
					                if (!subcommandexec) {
 | 
				
			||||||
                    args.shift()
 | 
					                    args.shift()
 | 
				
			||||||
                    return pluginInstance[cmdKey].apply(pluginInstance, [sender, ...args])
 | 
					                    subcommandexec = pluginInstance['cmdmain']
 | 
				
			||||||
                } else if (pluginInstance['cmdmain']) {
 | 
					 | 
				
			||||||
                    return pluginInstance['cmdmain'].apply(pluginInstance, [sender, ...args])
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                pluginInstance.logger.sender(sender, '§4未知的子命令: §c' + subcommand)
 | 
					                if (!subcommandexec) {
 | 
				
			||||||
                pluginInstance['cmdhelp'] && pluginInstance.logger.sender(sender, `§6请执行 §b/${command} §ahelp §6查看帮助!`)
 | 
					                    subcommand && pluginInstance.logger.sender(sender, '§4未知的子命令: §c' + subcommand)
 | 
				
			||||||
 | 
					                    pluginInstance.logger.sender(
 | 
				
			||||||
 | 
					                        sender,
 | 
				
			||||||
 | 
					                        pluginInstance['cmdhelp'] ?
 | 
				
			||||||
 | 
					                            `§6请执行 §b/${command} §ahelp §6查看帮助!` :
 | 
				
			||||||
 | 
					                            `§b版本: §a ${pluginInstance.description.version}`
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    return
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                let permission: string
 | 
				
			||||||
 | 
					                if (typeof cmd.permission == "string") {
 | 
				
			||||||
 | 
					                    permission = cmd.permission as string
 | 
				
			||||||
 | 
					                } else if (cmd.permission) {
 | 
				
			||||||
 | 
					                    permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}.${subcommand}`
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (sender.hasPermission && !sender.hasPermission(permission)) {
 | 
				
			||||||
 | 
					                    return pluginInstance.logger.sender(sender, `§c你需要 ${permission} 权限 才可执行此命令.`)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return subcommandexec.apply(pluginInstance, [sender, ...args])
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            let originCompleter = cmdCompleter
 | 
					            let originCompleter = cmdCompleter
 | 
				
			||||||
            cmdCompleter = (sender: any, command: string, args: string[]) => {
 | 
					            cmdCompleter = (sender: any, command: string, args: string[]) => {
 | 
				
			||||||
 | 
					                let permission: string
 | 
				
			||||||
 | 
					                if (typeof cmd.permission == "string") {
 | 
				
			||||||
 | 
					                    permission = cmd.permission as string
 | 
				
			||||||
 | 
					                } else if (cmd.permission) {
 | 
				
			||||||
 | 
					                    permission = `${pluginInstance.description.name.toLocaleLowerCase()}.${command}`
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (sender.hasPermission && !sender.hasPermission(permission)) { return [] }
 | 
				
			||||||
                return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(pluginInstance, [sender, command, args]) || [])
 | 
					                return (args.length == 1 ? cmdSubCache : []).concat(originCompleter?.apply(pluginInstance, [sender, command, args]) || [])
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,7 +78,10 @@ export class PluginConfigManager {
 | 
				
			|||||||
            'save': { value: () => this.saveConfig0(plugin, metadata) },
 | 
					            'save': { value: () => this.saveConfig0(plugin, metadata) },
 | 
				
			||||||
            'reload': { value: () => this.loadConfig0(plugin, metadata) }
 | 
					            'reload': { value: () => this.loadConfig0(plugin, metadata) }
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        Object.defineProperty(plugin, metadata.variable, { value })
 | 
					        Object.defineProperty(plugin, metadata.variable, {
 | 
				
			||||||
 | 
					            value,
 | 
				
			||||||
 | 
					            configurable: true
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private loadConfig0(plugin: plugin.Plugin, metadata: interfaces.ConfigMetadata) {
 | 
					    private loadConfig0(plugin: plugin.Plugin, metadata: interfaces.ConfigMetadata) {
 | 
				
			||||||
@@ -86,37 +89,50 @@ export class PluginConfigManager {
 | 
				
			|||||||
            let defaultValue = metadata.default ?? plugin[metadata.variable]
 | 
					            let defaultValue = metadata.default ?? plugin[metadata.variable]
 | 
				
			||||||
            let configValue = defaultValue || {}
 | 
					            let configValue = defaultValue || {}
 | 
				
			||||||
            if (defaultValue) {
 | 
					            if (defaultValue) {
 | 
				
			||||||
                metadata.file = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, metadata.filename)
 | 
					                metadata.file = fs.concat(
 | 
				
			||||||
 | 
					                    fs.file(plugin.description.loadMetadata.file).parent,
 | 
				
			||||||
 | 
					                    plugin.description.name,
 | 
				
			||||||
 | 
					                    metadata.filename
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
                let configLoader = this.getConfigLoader(metadata.format)
 | 
					                let configLoader = this.getConfigLoader(metadata.format)
 | 
				
			||||||
                if (!fs.exists(metadata.file)) {
 | 
					                if (!fs.exists(metadata.file)) {
 | 
				
			||||||
                    base.save(metadata.file, configLoader.dump(defaultValue))
 | 
					                    base.save(metadata.file, configLoader.dump(defaultValue))
 | 
				
			||||||
                    console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: metadata.name, format: metadata.format })
 | 
					                    console.i18n("ms.plugin.manager.config.save.default", {
 | 
				
			||||||
 | 
					                        plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                        name: metadata.name,
 | 
				
			||||||
 | 
					                        format: metadata.format
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    configValue = configLoader.load(base.read(metadata.file)) || {}
 | 
					                    configValue = configLoader.load(base.read(metadata.file)) || {}
 | 
				
			||||||
                    if (defaultValue && this.setDefaultValue(configValue, defaultValue)) {
 | 
					                    if (defaultValue && this.setDefaultValue(configValue, defaultValue, !!metadata.default)) {
 | 
				
			||||||
                        base.save(metadata.file, configLoader.dump(configValue))
 | 
					                        base.save(metadata.file, configLoader.dump(configValue))
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    console.debug(`[${plugin.description.name}] Load Config ${metadata.variable} from file ${metadata.file} =>\n${JSON.stringify(configValue, undefined, 4).substr(0, 500)}`)
 | 
					                    console.debug(`[${plugin.description.name}] Load Config ${metadata.variable} from file ${metadata.file} =>
 | 
				
			||||||
 | 
					${JSON.stringify(configValue, undefined, 4).substring(0, 500)}`)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            this.defienConfigProp(plugin, metadata, configValue)
 | 
					            this.defienConfigProp(plugin, metadata, configValue)
 | 
				
			||||||
        } catch (error: any) {
 | 
					        } catch (error: any) {
 | 
				
			||||||
            console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: metadata.name, format: metadata.format, error })
 | 
					            console.i18n("ms.plugin.manager.config.load.error", {
 | 
				
			||||||
 | 
					                plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                name: metadata.name,
 | 
				
			||||||
 | 
					                format: metadata.format,
 | 
				
			||||||
 | 
					                error
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
            console.ex(error)
 | 
					            console.ex(error)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private setDefaultValue(configValue, defaultValue) {
 | 
					    private setDefaultValue(configValue, defaultValue, deepCopy) {
 | 
				
			||||||
        let needSave = false
 | 
					        let needSave = false
 | 
				
			||||||
        for (const key of Object.keys(defaultValue)) {
 | 
					        for (const key of Object.keys(defaultValue)) {
 | 
				
			||||||
            // 当配置文件不存在当前属性时才进行赋值
 | 
					            // 当配置文件不存在当前属性时才进行赋值
 | 
				
			||||||
            if (!Object.prototype.hasOwnProperty.call(configValue, key) && key != '____deep_copy____') {
 | 
					            if (!Object.prototype.hasOwnProperty.call(configValue, key)) {
 | 
				
			||||||
                configValue[key] = defaultValue[key]
 | 
					                configValue[key] = defaultValue[key]
 | 
				
			||||||
                needSave = true
 | 
					                needSave = true
 | 
				
			||||||
            } else if (Object.prototype.toString.call(configValue[key]) == "[object Object]"
 | 
					            } else if (Object.prototype.toString.call(configValue[key]) == "[object Object]" && deepCopy) {
 | 
				
			||||||
                && Object.prototype.hasOwnProperty.call(defaultValue[key], '____deep_copy____')) {
 | 
					                // 对象需要递归检测
 | 
				
			||||||
                // 对象需要递归检测 如果对象内存在 ____deep_copy____ 那就忽略设置
 | 
					                needSave ||= this.setDefaultValue(configValue[key], defaultValue[key], deepCopy)
 | 
				
			||||||
                needSave ||= this.setDefaultValue(configValue[key], defaultValue[key])
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return needSave
 | 
					        return needSave
 | 
				
			||||||
@@ -127,10 +143,16 @@ export class PluginConfigManager {
 | 
				
			|||||||
            metadata.file = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, metadata.filename)
 | 
					            metadata.file = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, metadata.filename)
 | 
				
			||||||
            let result = this.getConfigLoader(metadata.format).dump(plugin[metadata.variable])
 | 
					            let result = this.getConfigLoader(metadata.format).dump(plugin[metadata.variable])
 | 
				
			||||||
            base.save(metadata.file, result)
 | 
					            base.save(metadata.file, result)
 | 
				
			||||||
            console.debug(`[${plugin.description.name}] Save Config ${metadata.variable} to file ${metadata.file} =>\n${result.substr(0, 500)}`)
 | 
					            console.debug(`[${plugin.description.name}] Save Config ${metadata.variable} to file ${metadata.file} =>
 | 
				
			||||||
 | 
					${result.substring(0, 500)}`)
 | 
				
			||||||
            return true
 | 
					            return true
 | 
				
			||||||
        } catch (error: any) {
 | 
					        } catch (error: any) {
 | 
				
			||||||
            console.i18n("ms.plugin.manager.config.save.error", { plugin: plugin.description.name, name: metadata.name, format: metadata.format, error })
 | 
					            console.i18n("ms.plugin.manager.config.save.error", {
 | 
				
			||||||
 | 
					                plugin: plugin.description.name,
 | 
				
			||||||
 | 
					                name: metadata.name,
 | 
				
			||||||
 | 
					                format: metadata.format,
 | 
				
			||||||
 | 
					                error
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
            console.ex(error)
 | 
					            console.ex(error)
 | 
				
			||||||
            return false
 | 
					            return false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ export const METADATA_KEY = {
 | 
				
			|||||||
    tab: Symbol.for("@ccms/plugin:tab"),
 | 
					    tab: Symbol.for("@ccms/plugin:tab"),
 | 
				
			||||||
    listener: Symbol.for("@ccms/plugin:listener"),
 | 
					    listener: Symbol.for("@ccms/plugin:listener"),
 | 
				
			||||||
    config: Symbol.for("@ccms/plugin:config"),
 | 
					    config: Symbol.for("@ccms/plugin:config"),
 | 
				
			||||||
 | 
					    playerdata: Symbol.for("@ccms/plugin:playerdata"),
 | 
				
			||||||
    stage: {
 | 
					    stage: {
 | 
				
			||||||
        load: Symbol.for("@ccms/plugin:stage:load"),
 | 
					        load: Symbol.for("@ccms/plugin:stage:load"),
 | 
				
			||||||
        enable: Symbol.for("@ccms/plugin:stage:enable"),
 | 
					        enable: Symbol.for("@ccms/plugin:stage:enable"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ import { plugin as pluginApi } from "@ccms/api"
 | 
				
			|||||||
import { injectable, decorate } from "@ccms/container"
 | 
					import { injectable, decorate } from "@ccms/container"
 | 
				
			||||||
import { interfaces } from './interfaces'
 | 
					import { interfaces } from './interfaces'
 | 
				
			||||||
import { METADATA_KEY } from './constants'
 | 
					import { METADATA_KEY } from './constants'
 | 
				
			||||||
import { getPluginMetadatas, getPluginCommandMetadata, getPluginListenerMetadata, getPluginTabCompleterMetadata, getPluginConfigMetadata, getPluginStageMetadata, getPluginSources } from './utils'
 | 
					import { getPluginMetadatas, getPluginCommandMetadata, getPluginListenerMetadata, getPluginTabCompleterMetadata, getPluginConfigMetadata, getPluginStageMetadata, getPluginSources, getPluginPlayerDataMetadata } from './utils'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * MiaoScript plugin
 | 
					 * MiaoScript plugin
 | 
				
			||||||
@@ -84,6 +84,21 @@ export function config(metadata: interfaces.ConfigMetadata = {}) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function playerdata(metadata: interfaces.PlayerDataMetadata = {}) {
 | 
				
			||||||
 | 
					    return function (target: any, key: string) {
 | 
				
			||||||
 | 
					        metadata.name = metadata.name || key
 | 
				
			||||||
 | 
					        metadata.variable = key
 | 
				
			||||||
 | 
					        metadata.version = metadata.version ?? 1
 | 
				
			||||||
 | 
					        metadata.format = metadata.format ?? 'yml'
 | 
				
			||||||
 | 
					        metadata.autosave = metadata.autosave ?? false
 | 
				
			||||||
 | 
					        metadata.filename = metadata.filename ?? "username"
 | 
				
			||||||
 | 
					        metadata.dir = metadata.dir ?? "playerdata"
 | 
				
			||||||
 | 
					        let previousMetadata = getPluginPlayerDataMetadata(target)
 | 
				
			||||||
 | 
					        previousMetadata.set(metadata.name, metadata)
 | 
				
			||||||
 | 
					        Reflect.defineMetadata(METADATA_KEY.playerdata, previousMetadata, target.constructor)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function stage(stage: string) {
 | 
					function stage(stage: string) {
 | 
				
			||||||
    return (metadata: interfaces.ExecMetadata = {}) => {
 | 
					    return (metadata: interfaces.ExecMetadata = {}) => {
 | 
				
			||||||
        return function (target: any, key: string, value: any) {
 | 
					        return function (target: any, key: string, value: any) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import './scanner/file-scanner'
 | 
					import './scanner/js-scanner'
 | 
				
			||||||
 | 
					import './scanner/mjs-scanner'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import './loader/ioc-loader'
 | 
					import './loader/ioc-loader'
 | 
				
			||||||
import './loader/basic-loader'
 | 
					import './loader/basic-loader'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,5 +14,6 @@ export {
 | 
				
			|||||||
    cmd as Cmd,
 | 
					    cmd as Cmd,
 | 
				
			||||||
    tab as Tab,
 | 
					    tab as Tab,
 | 
				
			||||||
    listener as Listener,
 | 
					    listener as Listener,
 | 
				
			||||||
    config as Config
 | 
					    config as Config,
 | 
				
			||||||
 | 
					    playerdata as PlayerData
 | 
				
			||||||
} from './decorators'
 | 
					} from './decorators'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,10 @@ export namespace interfaces {
 | 
				
			|||||||
         * 自动化主命令
 | 
					         * 自动化主命令
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        autoMain?: boolean
 | 
					        autoMain?: boolean
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 子命令权限效验
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        permission?: boolean | string
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    export interface ListenerMetadata extends ExecMetadata {
 | 
					    export interface ListenerMetadata extends ExecMetadata {
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -100,4 +104,38 @@ export namespace interfaces {
 | 
				
			|||||||
         */
 | 
					         */
 | 
				
			||||||
        file?: any
 | 
					        file?: any
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    export interface PlayerDataMetadata extends plugin.BaseMetadata {
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 配置文件版本号
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        version?: number
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 默认配置
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        default?: any
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 实体变量名称
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        variable?: string
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 配置文件格式 默认 yml
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        format?: string
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 自动保存 默认为 false
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        autosave?: boolean
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 配置文件名称 默认玩家名称
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        filename?: "username" | "uuid"
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 配置文件目录 默认 playerdata
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        dir?: string
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 配置文件子目录 默认为空
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        subdir?: string
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,6 +169,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
    private loadAndRequirePlugin(loadMetadata: plugin.PluginLoadMetadata) {
 | 
					    private loadAndRequirePlugin(loadMetadata: plugin.PluginLoadMetadata) {
 | 
				
			||||||
        let startTime = Date.now()
 | 
					        let startTime = Date.now()
 | 
				
			||||||
        let metadata = this.loadPlugin(loadMetadata.scanner.load(loadMetadata))
 | 
					        let metadata = this.loadPlugin(loadMetadata.scanner.load(loadMetadata))
 | 
				
			||||||
 | 
					        if (!metadata) { throw new Error('load plugin metadata failed.') }
 | 
				
			||||||
        console.i18n('ms.plugin.manager.build', {
 | 
					        console.i18n('ms.plugin.manager.build', {
 | 
				
			||||||
            name: loadMetadata.metadata.name,
 | 
					            name: loadMetadata.metadata.name,
 | 
				
			||||||
            version: loadMetadata.metadata.version,
 | 
					            version: loadMetadata.metadata.version,
 | 
				
			||||||
@@ -184,9 +185,10 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
     * 从文件加载插件
 | 
					     * 从文件加载插件
 | 
				
			||||||
     * @param file java.io.File
 | 
					     * @param file java.io.File
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    loadFromFile(file: string, scanner = this.sacnnerMap.get('file')): plugin.Plugin {
 | 
					    loadFromFile(file: string, ext: any = 'js'): plugin.Plugin {
 | 
				
			||||||
        if (!file) { throw new Error('plugin file can\'t be undefiend!') }
 | 
					        if (!file) { throw new Error('plugin file can\'t be undefiend.') }
 | 
				
			||||||
        if (!scanner) { throw new Error('plugin scanner can\'t be undefiend!') }
 | 
					        let scanner = this.sacnnerMap.get(ext)
 | 
				
			||||||
 | 
					        if (!scanner) { throw new Error(`plugin scanner ${ext} can't found in sacnnerMap.`) }
 | 
				
			||||||
        let metadata = this.loadAndRequirePlugin(scanner.read(file))
 | 
					        let metadata = this.loadAndRequirePlugin(scanner.read(file))
 | 
				
			||||||
        let plugin = this.buildPlugin(metadata)
 | 
					        let plugin = this.buildPlugin(metadata)
 | 
				
			||||||
        this.load(plugin)
 | 
					        this.load(plugin)
 | 
				
			||||||
@@ -213,7 +215,7 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
    reload(...args: any[]): void {
 | 
					    reload(...args: any[]): void {
 | 
				
			||||||
        this.checkAndGet(args[0]).forEach((pl: plugin.Plugin) => {
 | 
					        this.checkAndGet(args[0]).forEach((pl: plugin.Plugin) => {
 | 
				
			||||||
            this.disable(pl)
 | 
					            this.disable(pl)
 | 
				
			||||||
            this.loadFromFile(pl.description.loadMetadata.file, pl.description.loadMetadata.scanner)
 | 
					            this.loadFromFile(pl.description.loadMetadata.file, pl.description.loadMetadata.scanner.type)
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -235,12 +237,12 @@ export class PluginManagerImpl implements plugin.PluginManager {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private checkAndGet(name: string | plugin.Plugin | undefined | any): Map<string, plugin.Plugin> | plugin.Plugin[] {
 | 
					    private checkAndGet(name: string | plugin.Plugin | undefined | any): Map<string, plugin.Plugin> | plugin.Plugin[] {
 | 
				
			||||||
        if (name === undefined) throw new Error(`checkAndGet Plugin can't be undefiend!`)
 | 
					        if (name === undefined) throw new Error(`checkAndGet Plugin can't be undefiend.`)
 | 
				
			||||||
        if (name == this.instanceMap) { return this.instanceMap }
 | 
					        if (name == this.instanceMap) { return this.instanceMap }
 | 
				
			||||||
        if (typeof name == 'string' && this.instanceMap.has(name)) { return [this.instanceMap.get(name)] }
 | 
					        if (typeof name == 'string' && this.instanceMap.has(name)) { return [this.instanceMap.get(name)] }
 | 
				
			||||||
        if (name instanceof interfaces.Plugin) { return [name as plugin.Plugin] }
 | 
					        if (name instanceof interfaces.Plugin) { return [name as plugin.Plugin] }
 | 
				
			||||||
        if (name.description?.name) { return [name as plugin.Plugin] }
 | 
					        if (name.description?.name) { return [name as plugin.Plugin] }
 | 
				
			||||||
        throw new Error(`Plugin ${JSON.stringify(name)} not exist!`)
 | 
					        throw new Error(`Plugin ${JSON.stringify(name)} not exist.`)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private buildPlugins() {
 | 
					    private buildPlugins() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ import { plugin } from "@ccms/api"
 | 
				
			|||||||
import * as fs from '@ccms/common/dist/fs'
 | 
					import * as fs from '@ccms/common/dist/fs'
 | 
				
			||||||
import { provideSingletonNamed } from "@ccms/container"
 | 
					import { provideSingletonNamed } from "@ccms/container"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const SCANNER_TYPE_NAME = 'file'
 | 
					const SCANNER_TYPE_NAME = 'js'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@provideSingletonNamed(plugin.PluginScanner, SCANNER_TYPE_NAME)
 | 
					@provideSingletonNamed(plugin.PluginScanner, SCANNER_TYPE_NAME)
 | 
				
			||||||
export class JSFileScanner implements plugin.PluginScanner {
 | 
					export class JSFileScanner implements plugin.PluginScanner {
 | 
				
			||||||
@@ -67,7 +67,13 @@ function getPluginConfigMetadata(target: any) {
 | 
				
			|||||||
    ) || new Map<string, interfaces.ConfigMetadata>()
 | 
					    ) || new Map<string, interfaces.ConfigMetadata>()
 | 
				
			||||||
    return configMetadata
 | 
					    return configMetadata
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					function getPluginPlayerDataMetadata(target: any) {
 | 
				
			||||||
 | 
					    let playerdataMetadata: Map<string, interfaces.ConfigMetadata> = Reflect.getMetadata(
 | 
				
			||||||
 | 
					        METADATA_KEY.playerdata,
 | 
				
			||||||
 | 
					        target.constructor
 | 
				
			||||||
 | 
					    ) || new Map<string, interfaces.ConfigMetadata>()
 | 
				
			||||||
 | 
					    return playerdataMetadata
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
function getPluginStageMetadata(target: any, stage: string) {
 | 
					function getPluginStageMetadata(target: any, stage: string) {
 | 
				
			||||||
    let stageMetadata: interfaces.ExecMetadata[] = Reflect.getMetadata(
 | 
					    let stageMetadata: interfaces.ExecMetadata[] = Reflect.getMetadata(
 | 
				
			||||||
        METADATA_KEY.stage[stage],
 | 
					        METADATA_KEY.stage[stage],
 | 
				
			||||||
@@ -86,5 +92,6 @@ export {
 | 
				
			|||||||
    getPluginTabCompleterMetadata,
 | 
					    getPluginTabCompleterMetadata,
 | 
				
			||||||
    getPluginListenerMetadata,
 | 
					    getPluginListenerMetadata,
 | 
				
			||||||
    getPluginConfigMetadata,
 | 
					    getPluginConfigMetadata,
 | 
				
			||||||
 | 
					    getPluginPlayerDataMetadata,
 | 
				
			||||||
    getPluginStageMetadata
 | 
					    getPluginStageMetadata
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user