版本更新至:3.76

调整:开发框架改为 Gradle
新增:Language2 工具新增 [book] 类型
This commit is contained in:
坏黑
2018-03-10 21:13:05 +08:00
parent 6439e4b780
commit ad1a21196f
238 changed files with 1686 additions and 1132 deletions

View File

@@ -0,0 +1,131 @@
package me.skymc.taboolib.string;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import com.google.common.base.Charsets;
import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.message.MsgUtils;
public class Language {
private FileConfiguration conf = null;
private String langName;
private Plugin plugin;
public Language(Plugin plugin) {
this("zh_CN", plugin, false);
}
public Language(String name, Plugin plugin) {
this(name, plugin, false);
}
public Language(String name, Plugin plugin, boolean utf8) {
this.plugin = plugin;
this.langName = name;
File file = new File(getLanguageDir(), name + ".yml");
if (!file.exists()) {
plugin.saveResource("Language/" + name + ".yml", true);
}
if (utf8) {
reloadUTF8(this.langName);
}
else {
reload(this.langName);
}
}
public FileConfiguration getConfiguration() {
return conf;
}
public void send(CommandSender sender, String key) {
sender.sendMessage(get(key));
}
public void send(Player player, String key) {
player.sendMessage(get(key));
}
public void sendList(CommandSender sender, String key) {
List<String> list = getList(key);
for (String msg : list) {
sender.sendMessage(msg);
}
}
public void sendList(Player player, String key) {
List<String> list = getList(key);
for (String msg : list) {
player.sendMessage(msg);
}
}
public String get(String key) {
if (conf == null || conf.getString(key) == null) {
return "§4[Language \"" + key + "\" Not Found]";
}
return conf.getString(key).replace("&", "§");
}
public List<String> getList(String key) {
if (conf == null || conf.getString(key) == null) {
return Arrays.asList("§4[Language \"" + key + "\" Not Found]");
}
List<String> list = conf.getStringList(key);
for (int i = 0 ; i < list.size() ; i++) {
list.set(i, list.get(i).replace("&", "§"));
}
return list;
}
public void reload() {
reload(langName);
}
public void reload(String name) {
File langFile = new File(getLanguageDir(), name + ".yml");
if (!langFile.exists()) {
MsgUtils.warn("语言文件 " + langName + " 不存在, 请更改配置文件");
return;
}
conf = YamlConfiguration.loadConfiguration(langFile);
}
public void reloadUTF8(String name) {
File langFile = new File(getLanguageDir(), name + ".yml");
if (!langFile.exists()) {
MsgUtils.warn("语言文件 " + langName + " 不存在, 请更改配置文件");
return;
}
try {
conf = YamlConfiguration.loadConfiguration(new InputStreamReader(new FileInputStream(langFile), Charsets.UTF_8));
} catch (FileNotFoundException e) {
conf = new YamlConfiguration();
}
}
private File getLanguageDir() {
File dir = new File(plugin.getDataFolder(), "Language");
if (!dir.exists()) {
dir.mkdirs();
}
return dir;
}
}

View File

@@ -0,0 +1,105 @@
package me.skymc.taboolib.string;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import me.skymc.taboolib.message.MsgUtils;
@Deprecated
public class LanguagePack {
private File filedir;
private File file;
private FileConfiguration fileconf;
private String name;
private Plugin plugin;
private HashMap<String, List<String>> lang = new HashMap<>();
public LanguagePack(String name, Plugin plugin) {
this.plugin = plugin;
this.name = name;
filedir = new File(plugin.getDataFolder(), "Languages");
if (!filedir.exists()) {
filedir.mkdir();
}
file = new File(filedir, name + ".yml");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
MsgUtils.Console("&8[" + plugin.getName() + "]&4 载入语言文件出错");
}
}
fileconf = YamlConfiguration.loadConfiguration(file);
reloadLanguage();
MsgUtils.Console("&8[" + plugin.getName() + "]&7 载入语言文件&f: " + name + ".yml");
}
public File getLanguageFile() {
return file;
}
public File getLanguageDir() {
return filedir;
}
public FileConfiguration getLanguageConfiguration() {
return fileconf;
}
public HashMap<String, List<String>> getLanguage() {
return lang;
}
public String getLanguageName() {
return name;
}
public Plugin getLanguagePlugin() {
return plugin;
}
public void reloadLanguage(String name) {
file = new File(filedir, name + ".yml");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
fileconf = YamlConfiguration.loadConfiguration(file);
reloadLanguage();
}
public void reloadLanguage() {
lang.clear();
for (String key : fileconf.getConfigurationSection("").getKeys(false)) {
List<String> _lang = new ArrayList<>();
fileconf.getStringList(key).forEach(x -> _lang.add(x.replace("&", "§")
.replace("$plugin_name", plugin.getDescription().getName())
.replace("$plugin_authors", plugin.getDescription().getAuthors().toString())
.replace("$plugin_version", plugin.getDescription().getVersion())));
lang.put(key, _lang);
}
}
}

View File

@@ -0,0 +1,39 @@
package me.skymc.taboolib.string;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import me.skymc.taboolib.message.MsgUtils;
@Deprecated
public class LanguageUtils {
public static String a(LanguagePack l, String key) {
if (l.getLanguage().containsKey(key)) {
return l.getLanguage().get(key).get(0);
}
return "";
}
public static List<String> b(LanguagePack l, String key) {
if (l.getLanguage().containsKey(key)) {
return l.getLanguage().get(key);
}
return Arrays.asList("");
}
public static void saveLanguageFile(String name, Plugin plugin) {
if (!new File(new File(plugin.getDataFolder(), "Languages"), name + ".yml").exists()) {
plugin.saveResource("Languages/" + name + ".yml", true);
MsgUtils.Console("&8[" + plugin.getName() + "]&7 生成语言文件&f: " + name + ".yml");
}
}
}

View File

@@ -0,0 +1,23 @@
package me.skymc.taboolib.string;
@Deprecated
public class PatternUtils {
@Deprecated
public static String doubleNumber = "((\\-|\\+)?\\d+(\\.\\d+)?)";
@Deprecated
public static String doubleNumber2 = "(\\d+(\\.\\d+)?)";
public static String doubleNumber3 = "((?:\\-|\\+)?\\d+(?:\\.\\d+)?)";
public static String consolidateStrings(final String[] args, final int start) {
String ret = args[start];
if (args.length > start + 1) {
for (int i = start + 1; i < args.length; ++i) {
ret = ret + " " + args[i];
}
}
return ret;
}
}

View File

@@ -0,0 +1,36 @@
package me.skymc.taboolib.string;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author sky
* @since 2018年2月6日 下午1:28:38
*/
public class StringUtils {
public static String hashKeyForDisk(String key) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
private static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
}

View File

@@ -0,0 +1,157 @@
package me.skymc.taboolib.string.language2;
import java.io.File;
import java.io.FileNotFoundException;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import lombok.Getter;
import me.clip.placeholderapi.PlaceholderAPI;
import me.skymc.taboolib.fileutils.ConfigUtils;
/**
* @author sky
* @since 2018年2月13日 下午2:37:07
*/
public class Language2 {
@Getter
private FileConfiguration configuration;
@Getter
private File languageFile;
@Getter
private File languageFolder;
@Getter
private Plugin plugin;
@Getter
private String languageName;
/**
* 构造方法
*
* @param plugin 插件
*/
public Language2(Plugin plugin) {
this("zh_CN", plugin);
}
/**
* 构造方法
*
* @param languageName 语言文件
* @param plugin 插件
*/
public Language2(String languageName, Plugin plugin) {
this.languageName = languageName;
this.plugin = plugin;
// 重载语言文件
reload(languageName);
}
/**
* 获取语言文件
*
* @param key 键
* @return {@link Language2Value}
*/
public Language2Value get(String key) {
return new Language2Value(this, key);
}
/**
* 获取语言文件
*
* @param key 键
* @param placeholder 替换变量,从 @$0 开始
* @return {@link Language2Value}
*/
public Language2Value get(String key, String... placeholder) {
Language2Value value = new Language2Value(this, key);
for (int i = 0 ; i < placeholder.length ; i++) {
value.addPlaceholder("$" + i, placeholder[i]);
}
return value;
}
/**
* 重载语言文件
*/
public void reload() {
reload(this.languageName);
}
/**
* 重载语言文件
*
* @param languageName 新语言文件名称
*/
public void reload(String languageName) {
// 初始化文件夹
createFolder(plugin);
// 格式化配置名
languageName = formatName(languageName);
// 获取文件
languageFile = new File(languageFolder, languageName);
// 文件不存在
if (!languageFile.exists()) {
// 如果语言文件不存在
if (plugin.getResource("Language2/" + languageName) == null) {
try {
throw new FileNotFoundException("语言文件 " + languageName + " 不存在");
}
catch (Exception e) {
// TODO: handle exception
}
}
else {
// 释放资源
plugin.saveResource("Language2/" + languageName, true);
}
}
// 载入配置
configuration = ConfigUtils.load(plugin, languageFile);
}
/**
* PlaceholderAPI 变量识别
*
* @param player 玩家
* @param string 文本
* @return String
*/
public String setPlaceholderAPI(Player player, String string) {
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null && player != null) {
return PlaceholderAPI.setPlaceholders(player, string);
}
return string;
}
/**
* 语言文件名称格式化
*
* @param name 语言文件名称
* @return String
*/
private String formatName(String name) {
return name.contains(".yml") ? name : name + ".yml";
}
/**
* 语言文件夹初始化
*
* @param plugin
*/
private void createFolder(Plugin plugin) {
languageFolder = new File(plugin.getDataFolder(), "Language2");
if (!languageFolder.exists()) {
languageFolder.mkdir();
}
}
}

View File

@@ -0,0 +1,151 @@
package me.skymc.taboolib.string.language2;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import lombok.Getter;
import me.skymc.taboolib.string.language2.value.Language2Action;
import me.skymc.taboolib.string.language2.value.Language2Book;
import me.skymc.taboolib.string.language2.value.Language2Json;
import me.skymc.taboolib.string.language2.value.Language2Sound;
import me.skymc.taboolib.string.language2.value.Language2Text;
import me.skymc.taboolib.string.language2.value.Language2Title;
/**
* @author sky
* @since 2018-03-08 22:45:56
*/
public class Language2Format implements Language2Line {
@Getter
private Language2Value language2Value = null;
@Getter
private List<Language2Line> language2Lines = new ArrayList<>();
/**
* 构造方法
*
* @param value 父类
*/
public Language2Format(Player player, Language2Value value) {
language2Value = value;
// 语言类型
Language2Type type = Language2Type.TEXT;
// 递交数据
List<String> values = new LinkedList<>();
// 遍历内容
for (String line : value.getLanguageValue()) {
// 文本类型
if (line.contains("[text]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.TEXT;
}
// 大标题
else if (line.contains("[title]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.TITLE;
}
// 小标题
else if (line.contains("[action]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.ACTION;
}
// JSON
else if (line.contains("[json]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.JSON;
}
// 音效
else if (line.contains("[sound]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.SOUND;
}
// 书本
else if (line.contains("[book]")) {
// 递交数据
parseValue(player, values, type);
// 更改类型
type = Language2Type.BOOK;
}
else if (line.contains("[return]")) {
// 递交数据
parseValue(player, values, type);
}
// 默认
else {
// 追加内容
values.add(line);
}
}
}
/**
* 识别内容
*
* @param player 玩家
* @param list 数据
* @param type 类型
*/
private void parseValue(Player player, List<String> list, Language2Type type) {
if (list.size() == 0) {
return;
}
// 大标题
if (type == Language2Type.TITLE) {
language2Lines.add(new Language2Title(this, list));
}
// 小标题
else if (type == Language2Type.ACTION) {
language2Lines.add(new Language2Action(this, list));
}
// JSON
else if (type == Language2Type.JSON) {
language2Lines.add(new Language2Json(this, list, player));
}
// 音效
else if (type == Language2Type.SOUND) {
language2Lines.add(new Language2Sound(this, list));
}
// 书本
else if (type == Language2Type.BOOK) {
language2Lines.add(new Language2Book(this, list, player));
}
else {
language2Lines.add(new Language2Text(this, list));
}
// 清理数据
list.clear();
}
@Override
public void send(Player player) {
for (Language2Line line : language2Lines) {
line.send(player);
}
}
@Override
public void console() {
for (Language2Line line : language2Lines) {
line.console();
}
}
}

View File

@@ -0,0 +1,17 @@
package me.skymc.taboolib.string.language2;
import java.util.List;
import org.bukkit.entity.Player;
/**
* @author sky
* @since 2018-03-08 23:36:22
*/
public abstract interface Language2Line {
abstract void send(Player player);
abstract void console();
}

View File

@@ -0,0 +1,38 @@
package me.skymc.taboolib.string.language2;
/**
* @author sky
* @since 2018年2月13日 下午3:14:00
*/
public enum Language2Type {
/**
* 一般文本
*/
TEXT,
/**
* JSON 文本
*/
JSON,
/**
* 大标题
*/
TITLE,
/**
* 小标题
*/
ACTION,
/**
* 音效
*/
SOUND,
/**
* 书本
*/
BOOK
}

View File

@@ -0,0 +1,213 @@
package me.skymc.taboolib.string.language2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import lombok.Getter;
import me.skymc.taboolib.string.language2.value.Language2Text;
/**
* @author sky
* @since 2018年2月13日 下午3:05:15
*/
public class Language2Value extends Object {
@Getter
private Language2 language;
@Getter
private String languageKey;
@Getter
private List<String> languageValue;
@Getter
private LinkedHashMap<String, String> placeholder = new LinkedHashMap<>();
@Getter
private boolean enablePlaceholderAPI = false;
/**
* 构造方法
*/
public Language2Value(Language2 language, String languageKey) {
// 如果语言文件不存在
if (language == null || languageKey == null) {
languageValue = Arrays.asList(ChatColor.DARK_RED + "[<ERROR-0>]");
return;
}
// 如果语言文本不存在
if (!language.getConfiguration().contains(languageKey)) {
languageValue = Arrays.asList(ChatColor.DARK_RED + "[<ERROR-1: " + languageKey + ">]");
return;
}
// 如果不是集合类型
if (language.getConfiguration().get(languageKey) instanceof List) {
// 设置文本
languageValue = asColored(language.getConfiguration().getStringList(languageKey));
// 追加结尾
languageValue.add("[return]");
// 是否启用PAPI
if (languageValue.get(0).contains("[papi]")) {
enablePlaceholderAPI = true;
}
}
else {
// 设置文本
languageValue = Arrays.asList(ChatColor.translateAlternateColorCodes('&', language.getConfiguration().getString(languageKey)), "[return]");
}
// 初始化变量
this.language = language;
this.languageKey = languageKey;
}
/**
* 向玩家发送信息
*
* @param player
*/
public void send(Player player) {
new Language2Format(player, this).send(player);
}
/**
* 向玩家发送信息
*
* @param players 玩家
*/
public void send(List<Player> players) {
for (Player player : players) {
send(player);
}
}
/**
* 向指令发送者发送信息
*
* @param sender
*/
public void send(CommandSender sender) {
if (sender instanceof Player) {
send((Player) sender);
}
else {
console();
}
}
/**
* 全服公告
*/
public void broadcast() {
send(new ArrayList<>(Bukkit.getOnlinePlayers()));
}
/**
* 发送到后台
*/
public void console() {
new Language2Format(null, this).console();
}
/**
* 获取文本
*
* @return
*/
public String asString() {
Language2Format format = new Language2Format(null, this);
if (format.getLanguage2Lines().get(0) instanceof Language2Text) {
Language2Text text = (Language2Text) format.getLanguage2Lines().get(0);
return setPlaceholder(text.getText().get(0), null);
}
else {
return languageValue.size() == 0 ? ChatColor.DARK_RED + "[<ERROR-1>]" : setPlaceholder(languageValue.get(0), null);
}
}
/**
* 获取文本集合
*
* @return
*/
public List<String> asStringList() {
Language2Format format = new Language2Format(null, this);
if (format.getLanguage2Lines().get(0) instanceof Language2Text) {
Language2Text text = (Language2Text) format.getLanguage2Lines().get(0);
return setPlaceholder(text.getText(), null);
}
else {
return Arrays.asList(languageValue.size() == 0 ? ChatColor.DARK_RED + "[<ERROR-1>]" : setPlaceholder(languageValue.get(0), null));
}
}
/**
* 变量替换
*
* @param value 替换文本
* @param player 检测玩家
* @return String
*/
public String setPlaceholder(String value, Player player) {
for (Entry<String, String> entry : placeholder.entrySet()) {
value = value.replace(entry.getKey(), entry.getValue());
}
return isEnablePlaceholderAPI() ? this.language.setPlaceholderAPI(player, value) : value;
}
/**
* 变量替换
*
* @param list 替换集合
* @param player 检测玩家
* @return {@link List}
*/
public List<String> setPlaceholder(List<String> list, Player player) {
List<String> _list = new ArrayList<>(list);
for (int i = 0 ; i < _list.size() ; i++) {
_list.set(i, setPlaceholder(_list.get(i), player));
}
return _list;
}
/**
* 变量替换构造
*
* @param key 键
* @param value 值
* @return {@link Language2Value}
*/
public Language2Value addPlaceholder(String key, String value) {
this.placeholder.put(key, value);
return this;
}
/**
* 替换颜色
*
* @param list
* @return
*/
public List<String> asColored(List<String> list) {
for (int i = 0 ; i < list.size() ; i++) {
list.set(i, ChatColor.translateAlternateColorCodes('&', list.get(i)));
}
return list;
}
@Override
public String toString() {
return asString();
}
}

View File

@@ -0,0 +1,96 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import lombok.Getter;
import me.skymc.taboolib.Main;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.display.ActionUtils;
import me.skymc.taboolib.message.MsgUtils;
import me.skymc.taboolib.other.NumberUtils;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018年2月13日 下午3:58:07
*/
public class Language2Action implements Language2Line {
private static final String KEY_TEXT = " text: ";
private static final String KEY_STAY = " repeat: ";
@Getter
private String text = "";
@Getter
private int repeat = 1;
@Getter
private Language2Value value;
public Language2Action(Language2Format format, List<String> list) {
// 变量初始化
this.value = format.getLanguage2Value();
// 遍历文本
for (String message : list) {
try {
// 动作栏提示
if (message.startsWith(KEY_TEXT)) {
text = message.substring(KEY_TEXT.length());
}
// 持续时间
if (message.startsWith(KEY_STAY)) {
repeat = NumberUtils.getInteger(message.substring(KEY_STAY.length()));
}
}
catch (Exception e) {
// 识别异常
text = ChatColor.DARK_RED + "[<ERROR-11: " + value.getLanguageKey() + ">]";
}
}
// 检查重复次数
if (repeat < 0) {
repeat = 1;
text = ChatColor.DARK_RED + "[<ERROR-12: " + value.getLanguageKey() + ">]";
}
}
/**
* 发送给玩家
*
* @param player 玩家
*/
public void send(Player player) {
// 检查版本
if (TabooLib.getVerint() < 10800) {
player.sendMessage(ChatColor.DARK_RED + "[<ERROR-30: " + value.getLanguageKey() + ">]");
}
else {
new BukkitRunnable() {
int times = 0;
@Override
public void run() {
ActionUtils.send(player, value.setPlaceholder(text, player));
if ((times += 1) >= repeat) {
cancel();
}
}
}.runTaskTimer(Main.getInst(), 0, 20);
}
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
}
}

View File

@@ -0,0 +1,215 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import lombok.Getter;
import me.skymc.taboolib.bookformatter.BookFormatter;
import me.skymc.taboolib.bookformatter.action.ClickAction;
import me.skymc.taboolib.bookformatter.action.HoverAction;
import me.skymc.taboolib.bookformatter.builder.BookBuilder;
import me.skymc.taboolib.bookformatter.builder.PageBuilder;
import me.skymc.taboolib.bookformatter.builder.TextBuilder;
import me.skymc.taboolib.inventory.ItemUtils;
import me.skymc.taboolib.other.NumberUtils;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018-03-10 15:55:28
*/
public class Language2Book implements Language2Line {
private static final String KEY_TEXT = " text: ";
private static final String KEY_COMMAND = " command: ";
private static final String KEY_SUGGEST = " suggest: ";
private static final String KEY_URL = " url: ";
private static final String KEY_PAGE = " page: ";
private static final String KEY_SHOWTEXT = " showtext: ";
private static final String KEY_SHOWITEM = " showitem: ";
private static final String KEY_OPTION = "@option:";
private static final Pattern pattern = Pattern.compile("<@(\\S+)>");
@Getter
private Player player;
@Getter
private Language2Value value;
@Getter
private HashMap<String, TextBuilder> options = new HashMap<>();
@Getter
private BookBuilder book;
public Language2Book(Language2Format format, List<String> list, Player player) {
// 变量
this.player = player;
this.value = format.getLanguage2Value();
// 获取书本设置
formatOptions(list);
// 书本
book = BookFormatter.writtenBook();
// 内容
PageBuilder page = new PageBuilder();
// 遍历内容
for (String line : list) {
// 翻页
if (line.equals("[page]")) {
book.addPages(page.build());
page = new PageBuilder();
}
// 设置
else if (line.startsWith("@option")) {
break;
}
else {
Matcher matcher = pattern.matcher(line);
boolean find = false;
while (matcher.find()) {
find = true;
String optionName = matcher.group(1);
String optionFullName = "<@" + matcher.group(1) + ">";
// 判断设置是否存在
if (!options.containsKey(optionName)) {
page.add("§4[<ERROR-50: " + format.getLanguage2Value().getLanguageKey() + ">]");
}
else {
String[] line_split = line.split(optionFullName);
try {
// 单独一行
if (line_split.length == 0) {
page.add(options.get(optionName).build()).endLine();
} else {
// 前段
page.add(line_split[0]);
// 变量
page.add(options.get(optionName).build());
// 后段
if (line_split.length >= 2) {
// 获取文本
StringBuilder sb = new StringBuilder();
for (int i = 1 ; i < line_split.length ; i++) {
sb.append(line_split[i] + optionFullName);
}
// 更改文本
line = sb.substring(0, sb.length() - optionFullName.length());
// 如果后段还有变量
if (!pattern.matcher(line).find()) {
page.add(line_split[1]).endLine();
}
} else {
page.endLine();
}
}
}
catch (Exception e) {
page.add("§4[<ERROR-51: " + format.getLanguage2Value().getLanguageKey() + ">]");
}
}
}
if (!find) {
page.add(line).endLine();
}
}
}
// 结尾
book.addPages(page.build());
}
private void formatOptions(List<String> list) {
// 获取书本设置
HashMap<String, List<String>> _options = getOptions(list);
for (Entry<String, List<String>> entry : _options.entrySet()) {
TextBuilder builder = new TextBuilder();
// 遍历内容
for (String _option : entry.getValue()) {
if (_option.startsWith(KEY_TEXT)) {
builder.text(value.setPlaceholder(_option.substring(KEY_TEXT.length()), player));
}
else if (_option.startsWith(KEY_COMMAND)) {
builder.onClick(ClickAction.runCommand(value.setPlaceholder(_option.substring(KEY_COMMAND.length()), player)));
}
else if (_option.startsWith(KEY_SUGGEST)) {
builder.onClick(ClickAction.suggestCommand(value.setPlaceholder(_option.substring(KEY_SUGGEST.length()), player)));
}
else if (_option.startsWith(KEY_URL)) {
try {
builder.onClick(ClickAction.openUrl(value.setPlaceholder(_option.substring(KEY_URL.length()), player)));
}
catch (Exception e) {
builder.text("§4[<ERROR-52: " + value.getLanguageKey() + ">]");
}
}
else if (_option.startsWith(KEY_PAGE)) {
builder.onClick(ClickAction.changePage(NumberUtils.getInteger(_option.substring(KEY_PAGE.length()))));
}
else if (_option.startsWith(KEY_SHOWTEXT)) {
builder.onHover(HoverAction.showText(value.setPlaceholder(_option.substring(KEY_SHOWTEXT.length()), player)));
}
else if (_option.startsWith(KEY_SHOWITEM)) {
ItemStack item = ItemUtils.getCacheItem(_option.substring(KEY_SHOWITEM.length()));
if (item == null) {
item = new ItemStack(Material.STONE);
}
builder.onHover(HoverAction.showItem(item));
}
}
options.put(entry.getKey(), builder);
}
}
private HashMap<String, List<String>> getOptions(List<String> list) {
HashMap<String, List<String>> options_source = new HashMap<>();
List<String> option = new ArrayList<>();
// 遍历
String optionName = null;
boolean start = false;
// 遍历所有代码
for (String line : list) {
if (line.startsWith(KEY_OPTION)) {
// 如果已经开始检测
if (start) {
// 返回源码
options_source.put(optionName, new ArrayList<>(option));
// 清除源码
option.clear();
}
// 标签
start = true;
// 当前设置名称
optionName = line.substring(KEY_OPTION.length());
}
else if (start) {
option.add(line);
}
}
// 返回最后设置
options_source.put(optionName, option);
return options_source;
}
@Override
public void send(Player player) {
BookFormatter.forceOpen(player, book.build());
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
}
}

View File

@@ -0,0 +1,166 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import lombok.Getter;
import me.skymc.taboolib.inventory.ItemUtils;
import me.skymc.taboolib.jsonformatter.JSONFormatter;
import me.skymc.taboolib.jsonformatter.click.ClickEvent;
import me.skymc.taboolib.jsonformatter.click.OpenUrlEvent;
import me.skymc.taboolib.jsonformatter.click.RunCommandEvent;
import me.skymc.taboolib.jsonformatter.click.SuggestCommandEvent;
import me.skymc.taboolib.jsonformatter.hover.HoverEvent;
import me.skymc.taboolib.jsonformatter.hover.ShowItemEvent;
import me.skymc.taboolib.jsonformatter.hover.ShowTextEvent;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018年2月13日 下午4:11:33
*/
public class Language2Json implements Language2Line {
private static final String KEY_TEXT = " text: ";
private static final String KEY_COMMAND = " command: ";
private static final String KEY_SUGGEST = " suggest: ";
private static final String KEY_URL = " url: ";
private static final String KEY_ITEM = " item: ";
@Getter
private Player player;
@Getter
private Language2Value value;
@Getter
private JSONFormatter json = new JSONFormatter();
@Getter
private StringBuffer text = new StringBuffer();
public Language2Json(Language2Format format, List<String> list, Player player) {
// 首次检测
boolean isFirst = true;
boolean isBreak = false;
// 变量初始化
this.value = format.getLanguage2Value();
this.player = player;
// 动作初始化
ClickEvent clickEvent = null;
HoverEvent hoverEvent = null;
// 文本初始化
String current = ChatColor.DARK_RED + "[<ERROR-20: " + value.getLanguageKey() + ">]";
// 遍历文本
for (String message : list) {
try {
// 如果是显示文本
if (message.startsWith(KEY_TEXT)) {
hoverEvent = new ShowTextEvent(value.setPlaceholder(message.replace("||", "\n").substring(KEY_TEXT.length()), player));
}
// 显示物品
else if (message.startsWith(KEY_ITEM)) {
ItemStack item = ItemUtils.getCacheItem(message.substring(KEY_ITEM.length()));
if (item == null) {
item = new ItemStack(Material.STONE);
}
hoverEvent = new ShowItemEvent(item);
}
// 执行指令
else if (message.startsWith(KEY_COMMAND)) {
clickEvent = new RunCommandEvent(value.setPlaceholder(message.substring(KEY_COMMAND.length()), player));
}
// 打印指令
else if (message.startsWith(KEY_SUGGEST)) {
clickEvent = new SuggestCommandEvent(value.setPlaceholder(message.substring(KEY_SUGGEST.length()), player));
}
// 打开连接
else if (message.startsWith(KEY_URL)) {
clickEvent = new OpenUrlEvent(value.setPlaceholder(message.substring(KEY_SUGGEST.length()), player));
}
// 换行
else if (message.equals("[break]")) {
append(current, clickEvent, hoverEvent);
// 删除动作
clickEvent = null;
hoverEvent = null;
// 换行
json.newLine();
// 标记
isBreak = true;
}
// 新内容
else {
if (!isFirst && !isBreak) {
append(current, clickEvent, hoverEvent);
// 删除动作
clickEvent = null;
hoverEvent = null;
}
// 更新
current = message;
// 标记
isFirst = false;
isBreak = false;
}
}
catch (Exception e) {
// 识别异常
json.append(ChatColor.DARK_RED + "[<ERROR-21: " + value.getLanguageKey() + ">]");
}
}
// 追加
append(current, clickEvent, hoverEvent);
}
/**
* 发送给玩家
*
* @param player 玩家
*/
public void send(Player player) {
json.send(player);
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(text.toString());
}
/**
* 追加 JSON 内容
*
* @param current 文本
* @param clickevent 点击动作
* @param hoverEvent 显示动作
*/
private void append(String current, ClickEvent clickEvent, HoverEvent hoverEvent) {
if (clickEvent == null && hoverEvent == null) {
// 纯文本
json.append(value.setPlaceholder(current, player));
} else if (clickEvent != null && hoverEvent == null) {
// 纯点击
json.appendClick(value.setPlaceholder(current, player), clickEvent);
} else if (clickEvent == null && hoverEvent != null) {
// 纯显示
json.appendHover(value.setPlaceholder(current, player), hoverEvent);
} else {
// 全部
json.appendHoverClick(value.setPlaceholder(current, player), hoverEvent, clickEvent);
}
// 追加显示文本
text.append(current);
}
}

View File

@@ -0,0 +1,47 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import lombok.Getter;
import me.skymc.taboolib.sound.SoundPack;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018-03-08 22:43:27
*/
public class Language2Sound implements Language2Line {
@Getter
private List<SoundPack> sounds = new ArrayList<>();
@Getter
private Language2Value value;
public Language2Sound(Language2Format format, List<String> list) {
this.value = format.getLanguage2Value();
// 遍历文本
for (String line : list) {
sounds.add(new SoundPack(line));
}
}
@Override
public void send(Player player) {
for (SoundPack sound : sounds) {
sound.play(player);
}
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
}
}

View File

@@ -0,0 +1,49 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import lombok.Getter;
import me.skymc.taboolib.sound.SoundPack;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018-03-08 22:43:27
*/
public class Language2Text implements Language2Line {
@Getter
private List<String> text = new ArrayList<>();
@Getter
private Language2Value value;
public Language2Text(Language2Format format, List<String> list) {
this.value = format.getLanguage2Value();
// 遍历文本
for (String line : list) {
text.add(line);
}
}
@Override
public void send(Player player) {
for (String line : text) {
player.sendMessage(value.setPlaceholder(line, player));
}
}
@Override
public void console() {
for (String line : text) {
Bukkit.getConsoleSender().sendMessage(value.setPlaceholder(line, null));
}
}
}

View File

@@ -0,0 +1,90 @@
package me.skymc.taboolib.string.language2.value;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import lombok.Getter;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.display.TitleUtils;
import me.skymc.taboolib.string.language2.Language2Format;
import me.skymc.taboolib.string.language2.Language2Line;
import me.skymc.taboolib.string.language2.Language2Value;
/**
* @author sky
* @since 2018年2月13日 下午3:58:07
*/
public class Language2Title implements Language2Line {
private static final String KEY_TITLE = " title: ";
private static final String KEY_SUBTITLE = " subtitle: ";
private static final String KEY_STAYRULE = " stay: ";
@Getter
private String title = "";
@Getter
private String subtitle = "";
@Getter
private int fade1 = 0;
@Getter
private int fade2 = 0;
@Getter
private int stay = 20;
@Getter
private Language2Value value;
public Language2Title(Language2Format format, List<String> list) {
// 变量初始化
this.value = format.getLanguage2Value();
// 遍历文本
for (String message : list) {
try {
// 大标题
if (message.startsWith(KEY_TITLE)) {
title = message.substring(KEY_TITLE.length());
}
// 小标题
else if (message.startsWith(KEY_SUBTITLE)) {
subtitle = message.substring(KEY_SUBTITLE.length());
}
// 持续时间
else if (message.startsWith(KEY_STAYRULE)) {
String rule = message.substring(KEY_STAYRULE.length());
fade1 = Integer.valueOf(rule.split("\\|")[0]);
stay = Integer.valueOf(rule.split("\\|")[1]);
fade2 = Integer.valueOf(rule.split("\\|")[2]);
}
}
catch (Exception e) {
// 识别异常
title = ChatColor.DARK_RED + "[<ERROR-10: " + value.getLanguageKey() + ">]";
subtitle = ChatColor.DARK_RED + "[<ERROR-10: " + value.getLanguageKey() + ">]";
}
}
}
@Override
public void send(Player player) {
// 检查版本
if (TabooLib.getVerint() < 10800) {
player.sendMessage(ChatColor.DARK_RED + "[<ERROR-31: " + value.getLanguageKey() + ">]");
}
else {
TitleUtils.sendTitle(player, value.setPlaceholder(title, player), value.setPlaceholder(subtitle, player), fade1, stay, fade2);
}
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
}
}

View File

@@ -0,0 +1,49 @@
package me.skymc.taboolib.string.obfuscated;
import javax.xml.bind.DatatypeConverter;
public class CT {
public static enum CodeType {
BASE64,
BINARY;
}
public static String encode(CodeType type, String string) {
switch (type) {
case BASE64: {
return DatatypeConverter.printBase64Binary(string.getBytes());
}
case BINARY: {
StringBuilder binary = new StringBuilder();
for (byte b: string.getBytes()) {
int value = b;
for (int i = 0; i < 8; i++) {
binary.append((value & 128) == 0 ? 0: 1);
value <<= 1;
}
binary.append(" ");
}
return binary.toString();
}
}
return "";
}
public static String decode(CodeType type, String string) {
switch (type) {
case BASE64: {
return new String(DatatypeConverter.parseBase64Binary(string));
}
case BINARY: {
StringBuilder text = new StringBuilder();
for (String segment: string.split(" ")) {
text.append(new Character((char) Integer.parseInt(segment, 2)).toString());
}
return text.toString();
}
}
return "";
}
}

View File

@@ -0,0 +1,59 @@
package me.skymc.taboolib.string.obfuscated;
@Deprecated
public class FZ {
public static String toByte(final String string) {
final StringBuilder sb = new StringBuilder("");
final byte[] bs = string.getBytes();
byte[] array;
for (int length = (array = bs).length, i = 0; i < length; ++i) {
final byte b = array[i];
sb.append(String.valueOf(b) + "#");
}
return sb.toString();
}
public static byte[] getByte(final String string) {
final String[] value = string.split("#");
final byte[] bs = new byte[value.length];
for (int i = 0; i < value.length; ++i) {
bs[i] = Byte.valueOf(value[i]);
}
return bs;
}
public static String unByte(final String string) {
final String[] value = string.split("#");
final byte[] bs = new byte[value.length];
for (int i = 0; i < value.length; ++i) {
bs[i] = Byte.valueOf(value[i]);
}
return new String(bs);
}
public static String load(final String string, final int power) {
final StringBuilder sb = new StringBuilder("");
char[] charArray;
for (int length = (charArray = string.toCharArray()).length, j = 0; j < length; ++j) {
int i;
final char c = (char)(i = charArray[j]);
i *= power;
sb.append(String.valueOf(i) + "#");
}
return sb.toString();
}
public static String load2(final String string, final int power) {
final String[] value = string.split("#");
final StringBuilder sb = new StringBuilder("");
String[] array;
for (int length = (array = value).length, j = 0; j < length; ++j) {
final String c = array[j];
int i = Integer.valueOf(c);
i /= power;
sb.append((char)i);
}
return sb.toString();
}
}

View File

@@ -0,0 +1,48 @@
package me.skymc.taboolib.string.obfuscated;
import me.skymc.taboolib.Main;
@Deprecated
public class RS {
private static final char[] charsDown = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final char[] charsUp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
public static char getRandomCharacter() {
return charsDown[Main.getRandom().nextInt(charsDown.length)];
}
public static char getRandomCharacter(Boolean isUp) {
if (isUp) {
return charsUp[Main.getRandom().nextInt(charsUp.length)];
}
return charsDown[Main.getRandom().nextInt(charsDown.length)];
}
public static String getRandomString(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append(getRandomCharacter());
}
return builder.toString();
}
public static String getRandomString(String prefix, String rule, Boolean isUp) {
StringBuilder builder = new StringBuilder(prefix + "-");
String[] value = rule.split("-");
int size = 0;
for (String subrule : value) {
size++;
for (int i = 0; i < Integer.valueOf(subrule); i++) {
builder.append(getRandomCharacter(isUp));
}
if (!(size == value.length)) {
builder.append("-");
}
}
return builder.toString();
}
}