Update Command & Locale
This commit is contained in:
		@@ -6,7 +6,7 @@ plugins {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
group = 'me.skymc'
 | 
			
		||||
version = '5.24'
 | 
			
		||||
version = '5.25'
 | 
			
		||||
 | 
			
		||||
sourceCompatibility = 1.8
 | 
			
		||||
targetCompatibility = 1.8
 | 
			
		||||
 
 | 
			
		||||
@@ -19,29 +19,66 @@ MYSQL-HIKARI:
 | 
			
		||||
  CLOSE-FAIL: '&7Plugin &f{0} &7Try to deregister connection used by &f{1} &7plugins.'
 | 
			
		||||
 | 
			
		||||
COMMANDS:
 | 
			
		||||
  GLOBAL:
 | 
			
		||||
    ONLY-PLAYER: '&8[&3&lTabooLib&8] &4This is only for player.'
 | 
			
		||||
    ONLY-STORAGE-SQL: '&8[&3&lTabooLib&8] &4Can only be done when SQL-Mode is enabled.'
 | 
			
		||||
  INTERNAL:
 | 
			
		||||
    COMMAND-CREATE-FAILED: '&c插件 &7{0} &c的 &7{1} &c命令注册失败: &7{2}'
 | 
			
		||||
    TYPE-ERROR: '&8[&3&lTabooLib&8] &7Command &f{0} &7can only be executed by &f{1} &7.'
 | 
			
		||||
    TYPE-PLAYER: 'Player'
 | 
			
		||||
    TYPE-CONSOLE: 'Console'
 | 
			
		||||
    ERROR-USAGE:
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7Command &f{0} &7'
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7Usage:'
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7{1}'
 | 
			
		||||
    ERROR-COMMAND:
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7Command &f{0} &7not found'
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7Maybe:'
 | 
			
		||||
      - '&8[&3&lTabooLib&8] &7{1}'
 | 
			
		||||
    COMMAND-CREATE-FAILED: '&c插件 &7{0} &c的 &7{1} &c命令注册失败: &7{2}'
 | 
			
		||||
    COMMAND-HELP: ' §f/{0} {1} {2}§6- §e{3}'
 | 
			
		||||
    COMMAND-HELP-EMPTY: ' §f/{0} {1} {2}'
 | 
			
		||||
    COMMAND-ARGUMENT: '§7<§8{0}§7>'
 | 
			
		||||
    COMMAND-ARGUMENT-REQUIRE: '§7[§8{0}§7]'
 | 
			
		||||
  PARAMETER:
 | 
			
		||||
    UNKNOWN: '&8[&3&lTabooLib&8] &4Invalid command.'
 | 
			
		||||
    INSUFFICIENT: '&8[&3&lTabooLib&8] &4Invalid arguments.'
 | 
			
		||||
  DISPLAY:
 | 
			
		||||
    CLASSIC:
 | 
			
		||||
      HELP: '§f/{0} {1} {2} §6- §e{3}'
 | 
			
		||||
      HELP-EMPTY: '§f/{0} {1} {2}'
 | 
			
		||||
      ARGUMENT-REQUIRED: '§7[§8{0}§7]'
 | 
			
		||||
      ARGUMENT-OPTIONAL: '§7<§8{0}§7>'
 | 
			
		||||
      ERROR-USAGE:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Command &f{0} &7is missing parameters'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Usage:'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7{1}'
 | 
			
		||||
      ERROR-COMMAND:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Command &f{0} &7not found'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Usage:'
 | 
			
		||||
        - '&8[&3&l{3}&8] &7{1}'
 | 
			
		||||
    FLAT:
 | 
			
		||||
      HELP: '§f/{0} {1} {2} §8- §7{3}'
 | 
			
		||||
      HELP-EMPTY: '§f/{0} {1} {2}'
 | 
			
		||||
      ARGUMENT-REQUIRED: '§7[§8{0}§7]'
 | 
			
		||||
      ARGUMENT-OPTIONAL: '§7<§8{0}§7>'
 | 
			
		||||
      ERROR-USAGE:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Command &f{0} &7is missing parameters'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Usage:'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7{1}'
 | 
			
		||||
      ERROR-COMMAND:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Command &f{0} &7not found'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7Usage:'
 | 
			
		||||
        - '&8[&3&l{3}&8] &7{1}'
 | 
			
		||||
      HEAD:
 | 
			
		||||
        - ' '
 | 
			
		||||
        - ' &f&l{0}&7 v{1}'
 | 
			
		||||
        - ' '
 | 
			
		||||
        - ' &7命令: &f/{2} &8[...]'
 | 
			
		||||
        - ' &7参数:'
 | 
			
		||||
      BOTTOM:
 | 
			
		||||
        - ' '
 | 
			
		||||
      PARAMETERS:
 | 
			
		||||
        ==: JSON
 | 
			
		||||
        text:
 | 
			
		||||
          - '   &8- &f<{0}@0>'
 | 
			
		||||
          - '   &8  &7{1}'
 | 
			
		||||
        args:
 | 
			
		||||
          0:
 | 
			
		||||
            hover: '{2}'
 | 
			
		||||
            suggest: '{3}'
 | 
			
		||||
      PARAMETERS-EMPTY:
 | 
			
		||||
        ==: JSON
 | 
			
		||||
        text:
 | 
			
		||||
          - '   &8- &f<{0}@0>'
 | 
			
		||||
        args:
 | 
			
		||||
          0:
 | 
			
		||||
            hover: '{2}'
 | 
			
		||||
            suggest: '{3}'
 | 
			
		||||
 | 
			
		||||
COMMUNICATION:
 | 
			
		||||
  FAILED-LOAD-SETTINGS: '§8[§3§lTabooLibClient§8] &4配置载入失败: {0}'
 | 
			
		||||
 
 | 
			
		||||
@@ -19,29 +19,66 @@ MYSQL-HIKARI:
 | 
			
		||||
  CLOSE-FAIL: '&7插件 &f{0} &7注册的连接池正在被 &f{1} &7个插件使用, 无法注销!'
 | 
			
		||||
 | 
			
		||||
COMMANDS:
 | 
			
		||||
  GLOBAL:
 | 
			
		||||
    ONLY-PLAYER: '&8[&3&lTabooLib&8] &4控制台无法这么做'
 | 
			
		||||
    ONLY-STORAGE-SQL: '&8[&3&lTabooLib&8] &4只有启用数据库储存时才能这么做'
 | 
			
		||||
  INTERNAL:
 | 
			
		||||
    TYPE-ERROR: '&8[&3&lTabooLib&8] &7指令 &f{0} &7只能由 &f{1} &7执行'
 | 
			
		||||
    COMMAND-CREATE-FAILED: '&c插件 &7{0} &c的 &7{1} &c命令注册失败: &7{2}'
 | 
			
		||||
    TYPE-ERROR: '&8[&3&l{2}&8] &7指令 &f{0} &7只能由 &f{1} &7执行'
 | 
			
		||||
    TYPE-PLAYER: '玩家'
 | 
			
		||||
    TYPE-CONSOLE: '控制台'
 | 
			
		||||
    ERROR-USAGE:
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7指令 &f{0} &7参数不足'
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7正确用法:'
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7{1}'
 | 
			
		||||
    ERROR-COMMAND:
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7指令 &f{0} &7不存在'
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7你可能想要:'
 | 
			
		||||
    - '&8[&3&lTabooLib&8] &7{1}'
 | 
			
		||||
    COMMAND-CREATE-FAILED: '&c插件 &7{0} &c的 &7{1} &c命令注册失败: &7{2}'
 | 
			
		||||
    COMMAND-HELP: ' §f/{0} {1} {2}§6- §e{3}'
 | 
			
		||||
    COMMAND-HELP-EMPTY: ' §f/{0} {1} {2}'
 | 
			
		||||
    COMMAND-ARGUMENT: '§7<§8{0}§7>'
 | 
			
		||||
    COMMAND-ARGUMENT-REQUIRE: '§7[§8{0}§7]'
 | 
			
		||||
  PARAMETER:
 | 
			
		||||
    UNKNOWN: '&8[&3&lTabooLib&8] &4指令错误'
 | 
			
		||||
    UNKNOWN: '&8[&3&lTabooLib&8] &4b指令错误'
 | 
			
		||||
    INSUFFICIENT: '&8[&3&lTabooLib&8] &4参数不足'
 | 
			
		||||
  DISPLAY:
 | 
			
		||||
    CLASSIC:
 | 
			
		||||
      HELP: '§f/{0} {1} {2} §6- §e{3}'
 | 
			
		||||
      HELP-EMPTY: '§f/{0} {1} {2}'
 | 
			
		||||
      ARGUMENT-REQUIRED: '§7[§8{0}§7]'
 | 
			
		||||
      ARGUMENT-OPTIONAL: '§7<§8{0}§7>'
 | 
			
		||||
      ERROR-USAGE:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7指令 &f{0} &7参数不足'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7正确用法:'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7{1}'
 | 
			
		||||
      ERROR-COMMAND:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7指令 &f{0} &7不存在'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7你可能想要:'
 | 
			
		||||
        - '&8[&3&l{3}&8] &7{1}'
 | 
			
		||||
    FLAT:
 | 
			
		||||
      HELP: '§f/{0} {1} {2} §8- §7{3}'
 | 
			
		||||
      HELP-EMPTY: '§f/{0} {1} {2}'
 | 
			
		||||
      ARGUMENT-REQUIRED: '§7[§8{0}§7]'
 | 
			
		||||
      ARGUMENT-OPTIONAL: '§7<§8{0}§7>'
 | 
			
		||||
      ERROR-USAGE:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7指令 &f{0} &7参数不足'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7正确用法:'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7{1}'
 | 
			
		||||
      ERROR-COMMAND:
 | 
			
		||||
        - '&8[&3&l{2}&8] &7指令 &f{0} &7不存在'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7你可能想要:'
 | 
			
		||||
        - '&8[&3&l{2}&8] &7{1}'
 | 
			
		||||
      HEAD:
 | 
			
		||||
        - ' '
 | 
			
		||||
        - ' &f&l{0}&7 v{1}'
 | 
			
		||||
        - ' '
 | 
			
		||||
        - ' &7命令: &f/{2} &8[...]'
 | 
			
		||||
        - ' &7参数:'
 | 
			
		||||
      BOTTOM:
 | 
			
		||||
        - ' '
 | 
			
		||||
      PARAMETERS:
 | 
			
		||||
        ==: JSON
 | 
			
		||||
        text:
 | 
			
		||||
          - '   &8- &f<{0}@0>'
 | 
			
		||||
          - '   &8  &7{1}'
 | 
			
		||||
        args:
 | 
			
		||||
          0:
 | 
			
		||||
            hover: '{2}'
 | 
			
		||||
            suggest: '{3}'
 | 
			
		||||
      PARAMETERS-EMPTY:
 | 
			
		||||
        ==: JSON
 | 
			
		||||
        text:
 | 
			
		||||
          - '   &8- &f<{0}@0>'
 | 
			
		||||
        args:
 | 
			
		||||
          0:
 | 
			
		||||
            hover: '{2}'
 | 
			
		||||
            suggest: '{3}'
 | 
			
		||||
 | 
			
		||||
COMMUNICATION:
 | 
			
		||||
  FAILED-LOAD-SETTINGS: '§8[§3§lTabooLibClient§8] &4配置载入失败: {0}'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
package io.izzel.taboolib.module.command.base;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocale;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
@@ -48,11 +46,6 @@ public class Argument {
 | 
			
		||||
        this.tab = tab;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return required ? TLocale.asString("COMMANDS.INTERNAL.COMMAND-ARGUMENT-REQUIRE", name) : TLocale.asString("COMMANDS.INTERNAL.COMMAND-ARGUMENT", name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object o) {
 | 
			
		||||
        if (this == o) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,8 @@ import com.google.common.base.Preconditions;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.TabooLibAPI;
 | 
			
		||||
import io.izzel.taboolib.Version;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.display.DisplayBase;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.display.DisplayFlat;
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocale;
 | 
			
		||||
import io.izzel.taboolib.util.ArrayUtil;
 | 
			
		||||
import io.izzel.taboolib.util.Ref;
 | 
			
		||||
@@ -17,7 +18,10 @@ import org.bukkit.scheduler.BukkitRunnable;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.CopyOnWriteArrayList;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@@ -27,6 +31,7 @@ import java.util.stream.Collectors;
 | 
			
		||||
 */
 | 
			
		||||
public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
 | 
			
		||||
    private DisplayBase display = new DisplayFlat();
 | 
			
		||||
    private PluginCommand registerCommand;
 | 
			
		||||
    private List<Class<?>> linkClasses = new CopyOnWriteArrayList<>();
 | 
			
		||||
    private List<BaseSubCommand> subCommands = new CopyOnWriteArrayList<>();
 | 
			
		||||
@@ -95,7 +100,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static BaseSubCommand buildSubCommand(BaseMainCommand baseMainCommand, Method method) {
 | 
			
		||||
    public static BaseSubCommand buildSubCommand(BaseMainCommand baseMainCommand, Method method) {
 | 
			
		||||
        return new BaseSubCommand() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onCommand(CommandSender sender, Command command, String label, String[] args) {
 | 
			
		||||
@@ -108,47 +113,24 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRegisterCommand(PluginCommand registerCommand) {
 | 
			
		||||
        this.registerCommand = registerCommand;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public PluginCommand getRegisterCommand() {
 | 
			
		||||
        return registerCommand;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Class<?>> getLinkClasses() {
 | 
			
		||||
        return linkClasses;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<BaseSubCommand> getSubCommands() {
 | 
			
		||||
        return subCommands;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void registerSubCommand(BaseSubCommand subCommand) {
 | 
			
		||||
        if (subCommand != null) {
 | 
			
		||||
        Preconditions.checkNotNull(subCommand);
 | 
			
		||||
        Preconditions.checkArgument(subCommand.getLabel() != null, "Command label can not be null");
 | 
			
		||||
        Preconditions.checkArgument(subCommand.getArguments() != null, "Command arguments can not be null");
 | 
			
		||||
        }
 | 
			
		||||
        subCommands.add(subCommand);
 | 
			
		||||
        subCommands.add(subCommand.mainCommand(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onCommandHelp(CommandSender sender, Command command, String label, String[] args) {
 | 
			
		||||
        sender.sendMessage(getEmptyLine());
 | 
			
		||||
        sender.sendMessage(getCommandTitle());
 | 
			
		||||
        sender.sendMessage(getEmptyLine());
 | 
			
		||||
        subCommands.stream().filter(subCommands -> !hideInHelp(subCommands) && hasPermission(sender, subCommands)).map(subCommand -> subCommand == null ? getEmptyLine() : subCommand.getCommandString(label)).forEach(sender::sendMessage);
 | 
			
		||||
        sender.sendMessage(getEmptyLine());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCommandTitle() {
 | 
			
		||||
        return "§e§l----- §6§l" + registerCommand.getPlugin().getName() + " Commands §e§l-----";
 | 
			
		||||
        display.displayHead(sender, this, label);
 | 
			
		||||
        subCommands.forEach(s -> display.displayParameters(sender, s, label));
 | 
			
		||||
        display.displayBottom(sender, this, label);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) {
 | 
			
		||||
    public List<String> onTabComplete(CommandSender sender, Command command, String s, String[] args) {
 | 
			
		||||
        if (args.length == 1) {
 | 
			
		||||
            List<String> label = Lists.newArrayList();
 | 
			
		||||
            subCommands.stream().filter(subCommand -> !hideInHelp(subCommand) && hasPermission(commandSender, subCommand)).forEach(l -> {
 | 
			
		||||
            subCommands.stream().filter(subCommand -> subCommand != null && !subCommand.hideInHelp() && subCommand.hasPermission(sender)).forEach(l -> {
 | 
			
		||||
                label.add(l.getLabel());
 | 
			
		||||
                label.addAll(Lists.newArrayList(l.getAliases()));
 | 
			
		||||
            });
 | 
			
		||||
@@ -172,18 +154,18 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
            onCommandHelp(sender, command, label, args);
 | 
			
		||||
        } else {
 | 
			
		||||
            for (BaseSubCommand subCommand : subCommands) {
 | 
			
		||||
                if (subCommand == null || !(args[0].equalsIgnoreCase(subCommand.getLabel()) || java.util.Arrays.stream(subCommand.getAliases()).anyMatch(args[0]::equalsIgnoreCase)) || !hasPermission(sender, subCommand)) {
 | 
			
		||||
                if (subCommand == null || !(args[0].equalsIgnoreCase(subCommand.getLabel()) || java.util.Arrays.stream(subCommand.getAliases()).anyMatch(args[0]::equalsIgnoreCase)) || !subCommand.hasPermission(sender)) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                if (!isConfirmType(sender, subCommand.getType())) {
 | 
			
		||||
                    TLocale.sendTo(sender, "COMMANDS.INTERNAL.TYPE-ERROR", args[0], TLocale.asString("COMMANDS.INTERNAL.TYPE-" + subCommand.getType()));
 | 
			
		||||
                    TLocale.sendTo(sender, "COMMANDS.INTERNAL.TYPE-ERROR", args[0], TLocale.asString("COMMANDS.INTERNAL.TYPE-" + subCommand.getType()), registerCommand.getPlugin().getName());
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
                String[] subCommandArgs = removeFirst(args);
 | 
			
		||||
                if (subCommand.isParameterConform(subCommandArgs)) {
 | 
			
		||||
                    subCommand.onCommand(sender, command, label, subCommand.ignoredLabel() ? subCommandArgs : args);
 | 
			
		||||
                } else {
 | 
			
		||||
                    TLocale.sendTo(sender, "COMMANDS.INTERNAL.ERROR-USAGE", args[0], subCommand.getCommandString(label));
 | 
			
		||||
                    display.displayErrorUsage(sender, this, args[0], subCommand.getCommandString(sender, label));
 | 
			
		||||
                }
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
@@ -191,9 +173,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run() {
 | 
			
		||||
                    List<BaseSubCommand> commandCompute = subCommands.stream().filter(x -> x != null && hasPermission(sender, x)).sorted((b, a) -> Double.compare(Strings.similarDegree(args[0], a.getLabel()), Strings.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList());
 | 
			
		||||
                    List<BaseSubCommand> commandCompute = subCommands.stream().filter(x -> x != null && x.hasPermission(sender)).sorted((b, a) -> Double.compare(Strings.similarDegree(args[0], a.getLabel()), Strings.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList());
 | 
			
		||||
                    if (commandCompute.size() > 0) {
 | 
			
		||||
                        TLocale.sendTo(sender, "COMMANDS.INTERNAL.ERROR-COMMAND", args[0], commandCompute.get(0).getCommandString(label).trim());
 | 
			
		||||
                        display.displayErrorCommand(sender, BaseMainCommand.this, args[0], commandCompute.get(0).getCommandString(sender, label));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }.runTaskAsynchronously(TabooLib.getPlugin());
 | 
			
		||||
@@ -203,24 +185,48 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "registerCommand=" + "BaseMainCommand{" + registerCommand + ", linkClasses=" + linkClasses + ", subCommands=" + subCommands + '}';
 | 
			
		||||
        return "BaseMainCommand{" +
 | 
			
		||||
                "display=" + display +
 | 
			
		||||
                ", registerCommand=" + registerCommand +
 | 
			
		||||
                ", linkClasses=" + linkClasses +
 | 
			
		||||
                ", subCommands=" + subCommands +
 | 
			
		||||
                '}';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object o) {
 | 
			
		||||
        if (this == o) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (!(o instanceof BaseMainCommand)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        BaseMainCommand that = (BaseMainCommand) o;
 | 
			
		||||
        return Objects.equals(getLinkClasses(), that.getLinkClasses()) && Objects.equals(getRegisterCommand(), that.getRegisterCommand()) && Objects.equals(getSubCommands(), that.getSubCommands());
 | 
			
		||||
    // *********************************
 | 
			
		||||
    //
 | 
			
		||||
    //        Getter and Setter
 | 
			
		||||
    //
 | 
			
		||||
    // *********************************
 | 
			
		||||
 | 
			
		||||
    public String getCommandTitle() {
 | 
			
		||||
        return "§e§l----- §6§l" + registerCommand.getPlugin().getName() + " Commands §e§l-----";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        return Objects.hash(getRegisterCommand(), getLinkClasses(), getSubCommands());
 | 
			
		||||
    public void setRegisterCommand(PluginCommand registerCommand) {
 | 
			
		||||
        Preconditions.checkNotNull(registerCommand);
 | 
			
		||||
        this.registerCommand = registerCommand;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public PluginCommand getRegisterCommand() {
 | 
			
		||||
        return registerCommand;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Class<?>> getLinkClasses() {
 | 
			
		||||
        return linkClasses;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<BaseSubCommand> getSubCommands() {
 | 
			
		||||
        return subCommands;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DisplayBase getDisplay() {
 | 
			
		||||
        return display;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDisplay(DisplayBase display) {
 | 
			
		||||
        Preconditions.checkNotNull(display);
 | 
			
		||||
        this.display = display;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // *********************************
 | 
			
		||||
@@ -229,10 +235,6 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
    //
 | 
			
		||||
    // *********************************
 | 
			
		||||
 | 
			
		||||
    private String getEmptyLine() {
 | 
			
		||||
        return Version.isAfter(Version.v1_8) ? "" : "~";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isConfirmType(CommandSender sender, CommandType commandType) {
 | 
			
		||||
        return commandType == CommandType.ALL
 | 
			
		||||
                || (sender instanceof Player && commandType == CommandType.PLAYER)
 | 
			
		||||
@@ -254,14 +256,6 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean hideInHelp(BaseSubCommand baseSubCommand) {
 | 
			
		||||
        return baseSubCommand != null && baseSubCommand.hideInHelp();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean hasPermission(CommandSender sender, BaseSubCommand baseSubCommand) {
 | 
			
		||||
        return baseSubCommand == null || Strings.isEmpty(baseSubCommand.getPermission()) || sender.hasPermission(baseSubCommand.getPermission());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String[] removeFirst(String[] args) {
 | 
			
		||||
        if (args.length <= 1) {
 | 
			
		||||
            return new String[0];
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,10 @@
 | 
			
		||||
package io.izzel.taboolib.module.command.base;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocale;
 | 
			
		||||
import io.izzel.taboolib.util.Strings;
 | 
			
		||||
import org.bukkit.command.Command;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -18,9 +16,14 @@ public abstract class BaseSubCommand {
 | 
			
		||||
    private String label;
 | 
			
		||||
    private boolean player;
 | 
			
		||||
    private SubCommand annotation;
 | 
			
		||||
    private BaseMainCommand mainCommand;
 | 
			
		||||
 | 
			
		||||
    abstract public void onCommand(CommandSender sender, Command command, String label, String[] args);
 | 
			
		||||
 | 
			
		||||
    public BaseMainCommand getMainCommand() {
 | 
			
		||||
        return mainCommand;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getLabel() {
 | 
			
		||||
        return label;
 | 
			
		||||
    }
 | 
			
		||||
@@ -61,8 +64,12 @@ public abstract class BaseSubCommand {
 | 
			
		||||
        return IntStream.range(0, getArguments().length).noneMatch(i -> getArguments()[i].isRequired() && (args == null || args.length <= i));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getCommandString(String label) {
 | 
			
		||||
        return TLocale.asString(Strings.isEmpty(getDescription()) ? "COMMANDS.INTERNAL.COMMAND-HELP-EMPTY" : "COMMANDS.INTERNAL.COMMAND-HELP", label, getLabel(), Arrays.stream(getArguments()).map(parameter -> parameter.toString() + " ").collect(Collectors.joining()), getDescription());
 | 
			
		||||
    public String getCommandString(CommandSender sender, String label) {
 | 
			
		||||
        return mainCommand.getDisplay().displayHelp(sender, this, label);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean hasPermission(CommandSender sender) {
 | 
			
		||||
        return Strings.isBlank(getPermission()) || sender.hasPermission(getPermission());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected BaseSubCommand label(String label) {
 | 
			
		||||
@@ -79,4 +86,9 @@ public abstract class BaseSubCommand {
 | 
			
		||||
        this.annotation = annotation;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected BaseSubCommand mainCommand(BaseMainCommand mainCommand) {
 | 
			
		||||
        this.mainCommand = mainCommand;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package io.izzel.taboolib.module.command.base.display;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 16:14
 | 
			
		||||
 */
 | 
			
		||||
public abstract class DisplayBase {
 | 
			
		||||
 | 
			
		||||
    abstract public void displayHead(CommandSender sender, BaseMainCommand baseMainCommand, String label);
 | 
			
		||||
 | 
			
		||||
    abstract public void displayBottom(CommandSender sender, BaseMainCommand baseMainCommand, String label);
 | 
			
		||||
 | 
			
		||||
    abstract public void displayParameters(CommandSender sender, BaseSubCommand baseSubCommand, String label);
 | 
			
		||||
 | 
			
		||||
    abstract public void displayErrorUsage(CommandSender sender, BaseMainCommand baseMainCommand, String label, String help);
 | 
			
		||||
 | 
			
		||||
    abstract public void displayErrorCommand(CommandSender sender, BaseMainCommand baseMainCommand, String label, String help);
 | 
			
		||||
 | 
			
		||||
    abstract public String displayHelp(CommandSender sender, BaseSubCommand baseSubCommand, String label);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
package io.izzel.taboolib.module.command.base.display;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.module.command.base.Argument;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocale;
 | 
			
		||||
import io.izzel.taboolib.util.Strings;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 16:17
 | 
			
		||||
 */
 | 
			
		||||
public class DisplayClassic extends DisplayBase {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayHead(CommandSender sender, BaseMainCommand main, String label) {
 | 
			
		||||
        sender.sendMessage(" ");
 | 
			
		||||
        sender.sendMessage(main.getCommandTitle());
 | 
			
		||||
        sender.sendMessage(" ");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayBottom(CommandSender sender, BaseMainCommand main, String label) {
 | 
			
		||||
        sender.sendMessage(" ");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayParameters(CommandSender sender, BaseSubCommand sub, String label) {
 | 
			
		||||
        if (sub == null) {
 | 
			
		||||
            sender.sendMessage(" ");
 | 
			
		||||
        } else if (!sub.hideInHelp() && sub.hasPermission(sender)) {
 | 
			
		||||
            sender.sendMessage(" " + displayHelp(sender, sub, label));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayErrorUsage(CommandSender sender, BaseMainCommand main, String label, String help) {
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.CLASSIC.ERROR-USAGE", label, help, main.getRegisterCommand().getPlugin().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayErrorCommand(CommandSender sender, BaseMainCommand main, String label, String help) {
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.CLASSIC.ERROR-COMMAND", label, help, main.getRegisterCommand().getPlugin().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String displayHelp(CommandSender sender, BaseSubCommand sub, String label) {
 | 
			
		||||
        if (Strings.nonBlack(sub.getDescription())) {
 | 
			
		||||
            return TLocale.asString("COMMANDS.DISPLAY.CLASSIC.HELP", label, sub.getLabel(), Arrays.stream(sub.getArguments()).map(a -> argument(sub, a)).collect(Collectors.joining(" ")), sub.getDescription());
 | 
			
		||||
        } else {
 | 
			
		||||
            return TLocale.asString("COMMANDS.DISPLAY.CLASSIC.HELP-EMPTY", label, sub.getLabel(), Arrays.stream(sub.getArguments()).map(a -> argument(sub, a)).collect(Collectors.joining(" ")));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String argument(BaseSubCommand subCommand, Argument argument) {
 | 
			
		||||
        return argument.isRequired() ? TLocale.asString("COMMANDS.DISPLAY.CLASSIC.ARGUMENT-REQUIRED", argument.getName()) : TLocale.asString("COMMANDS.DISPLAY.CLASSIC.ARGUMENT-OPTIONAL", argument.getName());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,63 @@
 | 
			
		||||
package io.izzel.taboolib.module.command.base.display;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.module.command.base.Argument;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
			
		||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocale;
 | 
			
		||||
import io.izzel.taboolib.util.Strings;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 16:18
 | 
			
		||||
 */
 | 
			
		||||
public class DisplayFlat extends DisplayBase {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayHead(CommandSender sender, BaseMainCommand main, String label) {
 | 
			
		||||
        Plugin plugin = main.getRegisterCommand().getPlugin();
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.HEAD", plugin.getName(), plugin.getDescription().getVersion(), main.getRegisterCommand().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayBottom(CommandSender sender, BaseMainCommand main, String label) {
 | 
			
		||||
        Plugin plugin = main.getRegisterCommand().getPlugin();
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.BOTTOM", plugin.getName(), plugin.getDescription().getVersion(), main.getRegisterCommand().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayParameters(CommandSender sender, BaseSubCommand sub, String label) {
 | 
			
		||||
        if (Strings.nonBlack(sub.getDescription())) {
 | 
			
		||||
            TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.PARAMETERS", sub.getLabel(), sub.getDescription(), displayHelp(sender, sub, label), "/" + label + " " + sub.getLabel() + " ");
 | 
			
		||||
        } else {
 | 
			
		||||
            TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.PARAMETERS-EMPTY", sub.getLabel(), sub.getDescription(), displayHelp(sender, sub, label), "/" + label + " " + sub.getLabel() + " ");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayErrorUsage(CommandSender sender, BaseMainCommand main, String label, String help) {
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.ERROR-USAGE", label, help, main.getRegisterCommand().getPlugin().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void displayErrorCommand(CommandSender sender, BaseMainCommand main, String label, String help) {
 | 
			
		||||
        TLocale.sendTo(sender, "COMMANDS.DISPLAY.FLAT.ERROR-COMMAND", label, help, main.getRegisterCommand().getPlugin().getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String displayHelp(CommandSender sender, BaseSubCommand sub, String label) {
 | 
			
		||||
        if (Strings.nonBlack(sub.getDescription())) {
 | 
			
		||||
            return TLocale.asString("COMMANDS.DISPLAY.FLAT.HELP", label, sub.getLabel(), Arrays.stream(sub.getArguments()).map(a -> argument(sub, a)).collect(Collectors.joining(" ")), sub.getDescription());
 | 
			
		||||
        } else {
 | 
			
		||||
            return TLocale.asString("COMMANDS.DISPLAY.FLAT.HELP-EMPTY", label, sub.getLabel(), Arrays.stream(sub.getArguments()).map(a -> argument(sub, a)).collect(Collectors.joining(" ")));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String argument(BaseSubCommand subCommand, Argument argument) {
 | 
			
		||||
        return argument.isRequired() ? TLocale.asString("COMMANDS.DISPLAY.FLAT.ARGUMENT-REQUIRED", argument.getName()) : TLocale.asString("COMMANDS.DISPLAY.FLAT.ARGUMENT-OPTIONAL", argument.getName());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								src/main/scala/io/izzel/taboolib/module/i18n/I18n.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/main/scala/io/izzel/taboolib/module/i18n/I18n.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
package io.izzel.taboolib.module.i18n;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.Maps;
 | 
			
		||||
import io.izzel.taboolib.Version;
 | 
			
		||||
import io.izzel.taboolib.module.i18n.version.I18n20w14a;
 | 
			
		||||
import io.izzel.taboolib.module.i18n.version.I18nOrigin;
 | 
			
		||||
import io.izzel.taboolib.module.inject.TFunction;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 19:33
 | 
			
		||||
 */
 | 
			
		||||
public class I18n {
 | 
			
		||||
 | 
			
		||||
    public static final Map<Version, I18nBase> VERSION = Maps.newHashMap();
 | 
			
		||||
 | 
			
		||||
    private static I18nBase base;
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        VERSION.put(Version.v1_7, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_8, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_9, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_10, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_11, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_12, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_13, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_14, I18nOrigin.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_15, I18n20w14a.INSTANCE);
 | 
			
		||||
        VERSION.put(Version.v1_16, I18n20w14a.INSTANCE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @TFunction.Init
 | 
			
		||||
    static void init() {
 | 
			
		||||
        base = VERSION.getOrDefault(Version.getCurrentVersion(), I18nOrigin.INSTANCE);
 | 
			
		||||
        base.init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static I18nBase get() {
 | 
			
		||||
        return base;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								src/main/scala/io/izzel/taboolib/module/i18n/I18nBase.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/main/scala/io/izzel/taboolib/module/i18n/I18nBase.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
package io.izzel.taboolib.module.i18n;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 19:42
 | 
			
		||||
 */
 | 
			
		||||
public abstract class I18nBase {
 | 
			
		||||
 | 
			
		||||
    abstract public void init();
 | 
			
		||||
 | 
			
		||||
    abstract public String getName(Player player, Entity entity);
 | 
			
		||||
 | 
			
		||||
    abstract public String getName(Player player, ItemStack itemStack);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,92 @@
 | 
			
		||||
package io.izzel.taboolib.module.i18n.version;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.Maps;
 | 
			
		||||
import com.google.gson.JsonElement;
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import com.google.gson.JsonParser;
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.module.i18n.I18nBase;
 | 
			
		||||
import io.izzel.taboolib.module.nms.NMS;
 | 
			
		||||
import io.izzel.taboolib.util.Files;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 19:51
 | 
			
		||||
 */
 | 
			
		||||
public class I18n20w14a extends I18nBase {
 | 
			
		||||
 | 
			
		||||
    public static final I18n20w14a INSTANCE = new I18n20w14a();
 | 
			
		||||
 | 
			
		||||
    // 20w14a
 | 
			
		||||
    public static final String[][] LOCALE = {
 | 
			
		||||
            {
 | 
			
		||||
                    "zh_cn", "5797b76621b4b335527cda6f903a1bb3d9b7ffa3"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                    "zh_tw", "71be70e62f4cf7e98c6bcb32d57d7ef66614853b"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                    "en_gb", "0f679e66f50f1dea4749cac3882cf5c6857bbfc3",
 | 
			
		||||
            }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private File folder = new File(TabooLib.getPlugin().getDataFolder(), "simpleI18n/v2/20w14a");
 | 
			
		||||
    private Map<String, JsonObject> cache = Maps.newHashMap();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void init() {
 | 
			
		||||
        if (folder.exists() && folder.isDirectory()) {
 | 
			
		||||
            load();
 | 
			
		||||
        } else {
 | 
			
		||||
            long time = System.currentTimeMillis();
 | 
			
		||||
            System.out.println("[TabooLib] Loading Assets...");
 | 
			
		||||
            try {
 | 
			
		||||
                for (String[] locale : LOCALE) {
 | 
			
		||||
                    Files.toFile(Files.readFromURL("https://resources.download.minecraft.net/" + locale[1].substring(0, 2) + "/" + locale[1], StandardCharsets.UTF_8, "{}"), Files.file(folder, locale[0]));
 | 
			
		||||
                }
 | 
			
		||||
                load();
 | 
			
		||||
                System.out.println("[TabooLib] Loading Successfully. (" + (System.currentTimeMillis() - time + "ms)"));
 | 
			
		||||
            } catch (Throwable ignored) {
 | 
			
		||||
                System.out.println("[TabooLib] Loading Failed. (" + (System.currentTimeMillis() - time + "ms)"));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName(Player player, Entity entity) {
 | 
			
		||||
        JsonObject locale = cache.get(player == null ? "zh_cn" : player.getLocale());
 | 
			
		||||
        if (locale == null) {
 | 
			
		||||
            locale = cache.get("en_gb");
 | 
			
		||||
        }
 | 
			
		||||
        if (locale == null) {
 | 
			
		||||
            return "[ERROR LOCALE]";
 | 
			
		||||
        }
 | 
			
		||||
        JsonElement element = locale.get(NMS.handle().getName(entity));
 | 
			
		||||
        return element == null ? entity.getName() : element.getAsString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName(Player player, ItemStack itemStack) {
 | 
			
		||||
        JsonObject locale = cache.get(player == null ? "zh_cn" : player.getLocale());
 | 
			
		||||
        if (locale == null) {
 | 
			
		||||
            locale = cache.get("en_gb");
 | 
			
		||||
        }
 | 
			
		||||
        if (locale == null) {
 | 
			
		||||
            return "[ERROR LOCALE]";
 | 
			
		||||
        }
 | 
			
		||||
        JsonElement element = locale.get(NMS.handle().getName(itemStack));
 | 
			
		||||
        return element == null ? itemStack.getType().name().toLowerCase().replace("_", "") : element.getAsString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void load() {
 | 
			
		||||
        Arrays.stream(folder.listFiles()).forEach(listFile -> cache.put(listFile.getName(), new JsonParser().parse(Files.readFromFile(listFile)).getAsJsonObject()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,89 @@
 | 
			
		||||
package io.izzel.taboolib.module.i18n.version;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.Version;
 | 
			
		||||
import io.izzel.taboolib.module.i18n.I18nBase;
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocaleLoader;
 | 
			
		||||
import io.izzel.taboolib.module.nms.NMS;
 | 
			
		||||
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
 | 
			
		||||
import io.izzel.taboolib.util.Files;
 | 
			
		||||
import org.bukkit.configuration.file.FileConfiguration;
 | 
			
		||||
import org.bukkit.configuration.file.YamlConfiguration;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.inventory.meta.BookMeta;
 | 
			
		||||
import org.bukkit.inventory.meta.ItemMeta;
 | 
			
		||||
import org.bukkit.inventory.meta.SpawnEggMeta;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-04-04 19:44
 | 
			
		||||
 */
 | 
			
		||||
public class I18nOrigin extends I18nBase {
 | 
			
		||||
 | 
			
		||||
    public static final I18nOrigin INSTANCE = new I18nOrigin();
 | 
			
		||||
 | 
			
		||||
    private static FileConfiguration lang;
 | 
			
		||||
    private static boolean released;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void init() {
 | 
			
		||||
        File localeFile = getLocaleFile(TabooLib.getPlugin());
 | 
			
		||||
        if (localeFile == null) {
 | 
			
		||||
            lang = new YamlConfiguration();
 | 
			
		||||
        } else {
 | 
			
		||||
            lang = Files.load(localeFile);
 | 
			
		||||
        }
 | 
			
		||||
        if (lang.getInt("version") < 3 && !released) {
 | 
			
		||||
            released = true;
 | 
			
		||||
            Files.deepDelete(new File(TabooLib.getPlugin().getDataFolder(), "simpleI18n"));
 | 
			
		||||
            init();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName(Player player, Entity entity) {
 | 
			
		||||
        return entity == null ? "-" : lang.getString(NMS.handle().getName(entity).replace(".", "_"), entity.getName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName(Player player, ItemStack itemStack) {
 | 
			
		||||
        if (itemStack == null) {
 | 
			
		||||
            return "-";
 | 
			
		||||
        }
 | 
			
		||||
        ItemMeta itemMeta = itemStack.getItemMeta();
 | 
			
		||||
        if (itemMeta instanceof BookMeta && ((BookMeta) itemMeta).getTitle() != null) {
 | 
			
		||||
            return ((BookMeta) itemMeta).getTitle();
 | 
			
		||||
        }
 | 
			
		||||
        if (!Version.isAfter(Version.v1_11)) {
 | 
			
		||||
            if (itemStack.getType().name().equals("MONSTER_EGG")) {
 | 
			
		||||
                NBTCompound nbtCompound = NMS.handle().loadNBT(itemStack);
 | 
			
		||||
                if (nbtCompound.containsKey("EntityTag")) {
 | 
			
		||||
                    return lang.getString("item_monsterPlacer_name") + " " + lang.getString("entity_" + nbtCompound.get("EntityTag").asCompound().get("id").asString() + "_name");
 | 
			
		||||
                }
 | 
			
		||||
                return lang.getString("item_monsterPlacer_name");
 | 
			
		||||
            }
 | 
			
		||||
        } else if (!Version.isAfter(Version.v1_13)) {
 | 
			
		||||
            if (itemMeta instanceof SpawnEggMeta) {
 | 
			
		||||
                String spawnEggType = lang.getString("entity_" + ((SpawnEggMeta) itemMeta).getSpawnedType().getEntityClass().getSimpleName().replace(".", "_") + "_name");
 | 
			
		||||
                if (spawnEggType != null) {
 | 
			
		||||
                    return lang.getString(NMS.handle().getName(itemStack).replace(".", "_"), itemStack.getType().name().toLowerCase().replace("_", "")) + " " + spawnEggType;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return lang.getString(NMS.handle().getName(itemStack).replace(".", "_"), itemStack.getType().name().toLowerCase().replace("_", ""));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private File getLocaleFile(Plugin plugin) {
 | 
			
		||||
        TLocaleLoader.getLocalePriority(plugin).forEach(localeName -> Files.releaseResource(plugin, "simpleI18n/" + getVersion() + "/" + localeName + ".yml", false));
 | 
			
		||||
        return TLocaleLoader.getLocalePriority(plugin).stream().map(localeName -> new File("plugins/TabooLib/simpleI18n/" + getVersion() + "/" + localeName + ".yml")).filter(File::exists).findFirst().orElse(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getVersion() {
 | 
			
		||||
        return Version.isAfter(Version.v1_13) ? "high" : "low";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,22 +1,11 @@
 | 
			
		||||
package io.izzel.taboolib.module.lite;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.Version;
 | 
			
		||||
import io.izzel.taboolib.module.locale.TLocaleLoader;
 | 
			
		||||
import io.izzel.taboolib.module.inject.TFunction;
 | 
			
		||||
import io.izzel.taboolib.module.nms.NMS;
 | 
			
		||||
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
 | 
			
		||||
import io.izzel.taboolib.util.Files;
 | 
			
		||||
import org.bukkit.configuration.file.FileConfiguration;
 | 
			
		||||
import org.bukkit.configuration.file.YamlConfiguration;
 | 
			
		||||
import io.izzel.taboolib.module.i18n.I18n;
 | 
			
		||||
import org.bukkit.entity.Entity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
import org.bukkit.inventory.meta.BookMeta;
 | 
			
		||||
import org.bukkit.inventory.meta.ItemMeta;
 | 
			
		||||
import org.bukkit.inventory.meta.SpawnEggMeta;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -25,24 +14,6 @@ import java.util.Optional;
 | 
			
		||||
 */
 | 
			
		||||
public class SimpleI18n {
 | 
			
		||||
 | 
			
		||||
    private static FileConfiguration lang;
 | 
			
		||||
    private static boolean released;
 | 
			
		||||
 | 
			
		||||
    @TFunction.Init
 | 
			
		||||
    static void init() {
 | 
			
		||||
        File localeFile = getLocaleFile(TabooLib.getPlugin());
 | 
			
		||||
        if (localeFile == null) {
 | 
			
		||||
            lang = new YamlConfiguration();
 | 
			
		||||
        } else {
 | 
			
		||||
            lang = Files.load(localeFile);
 | 
			
		||||
        }
 | 
			
		||||
        if (lang.getInt("version") < 3 && !released) {
 | 
			
		||||
            released = true;
 | 
			
		||||
            Files.deepDelete(new File(TabooLib.getPlugin().getDataFolder(), "simpleI18n"));
 | 
			
		||||
            init();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getCustomName(Entity entity) {
 | 
			
		||||
        return entity != null ? Optional.ofNullable(entity.getCustomName()).orElse(getName(entity)) : getName(entity);
 | 
			
		||||
    }
 | 
			
		||||
@@ -56,42 +27,18 @@ public class SimpleI18n {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getName(Entity entity) {
 | 
			
		||||
        return entity == null ? "-" : lang.getString(NMS.handle().getName(entity).replace(".", "_"), entity.getName());
 | 
			
		||||
        return I18n.get().getName(null, entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getName(ItemStack item) {
 | 
			
		||||
        if (item == null) {
 | 
			
		||||
            return "-";
 | 
			
		||||
        }
 | 
			
		||||
        ItemMeta itemMeta = item.getItemMeta();
 | 
			
		||||
        if (itemMeta instanceof BookMeta && ((BookMeta) itemMeta).getTitle() != null) {
 | 
			
		||||
            return ((BookMeta) itemMeta).getTitle();
 | 
			
		||||
        }
 | 
			
		||||
        if (!Version.isAfter(Version.v1_11)) {
 | 
			
		||||
            if (item.getType().name().equals("MONSTER_EGG")) {
 | 
			
		||||
                NBTCompound nbtCompound = NMS.handle().loadNBT(item);
 | 
			
		||||
                if (nbtCompound.containsKey("EntityTag")) {
 | 
			
		||||
                    return lang.getString("item_monsterPlacer_name") + " " + lang.getString("entity_" + nbtCompound.get("EntityTag").asCompound().get("id").asString() + "_name");
 | 
			
		||||
                }
 | 
			
		||||
                return lang.getString("item_monsterPlacer_name");
 | 
			
		||||
            }
 | 
			
		||||
        } else if (!Version.isAfter(Version.v1_13)) {
 | 
			
		||||
            if (itemMeta instanceof SpawnEggMeta) {
 | 
			
		||||
                String spawnEggType = lang.getString("entity_" + ((SpawnEggMeta) itemMeta).getSpawnedType().getEntityClass().getSimpleName().replace(".", "_") + "_name");
 | 
			
		||||
                if (spawnEggType != null) {
 | 
			
		||||
                    return lang.getString(NMS.handle().getName(item).replace(".", "_"), item.getType().name().toLowerCase().replace("_", "")) + " " + spawnEggType;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return lang.getString(NMS.handle().getName(item).replace(".", "_"), item.getType().name().toLowerCase().replace("_", ""));
 | 
			
		||||
        return I18n.get().getName(null, item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static File getLocaleFile(Plugin plugin) {
 | 
			
		||||
        TLocaleLoader.getLocalePriority(plugin).forEach(localeName -> Files.releaseResource(plugin, "simpleI18n/" + getVersion() + "/" + localeName + ".yml", false));
 | 
			
		||||
        return TLocaleLoader.getLocalePriority(plugin).stream().map(localeName -> new File("plugins/TabooLib/simpleI18n/" + getVersion() + "/" + localeName + ".yml")).filter(File::exists).findFirst().orElse(null);
 | 
			
		||||
    public static String getName(Player player, Entity entity) {
 | 
			
		||||
        return I18n.get().getName(player, entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static String getVersion() {
 | 
			
		||||
        return Version.isAfter(Version.v1_13) ? "high" : "low";
 | 
			
		||||
    public static String getName(Player player, ItemStack item) {
 | 
			
		||||
        return I18n.get().getName(player, item);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package io.izzel.taboolib.module.locale;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.TabooLibAPI;
 | 
			
		||||
import io.izzel.taboolib.common.plugin.InternalPlugin;
 | 
			
		||||
import io.izzel.taboolib.module.config.TConfigWatcher;
 | 
			
		||||
import io.izzel.taboolib.module.locale.logger.TLogger;
 | 
			
		||||
import io.izzel.taboolib.module.locale.type.*;
 | 
			
		||||
@@ -154,7 +155,7 @@ public class TLocaleLoader {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static YamlConfiguration getLocaleAsPlugin(Plugin plugin, File localeFile) {
 | 
			
		||||
        try (InputStream canonicalResource = Files.getCanonicalResource(plugin, "lang/" + localeFile.getName())) {
 | 
			
		||||
        try (InputStream canonicalResource = Files.getCanonicalResource(plugin, (plugin instanceof InternalPlugin ? "__resources__/" : "") + "lang/" + localeFile.getName())) {
 | 
			
		||||
            if (canonicalResource != null) {
 | 
			
		||||
                return YamlConfiguration.loadConfiguration(new InputStreamReader(canonicalResource, StandardCharsets.UTF_8));
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user