TabooLib/src/main/scala/me/skymc/taboolib/string/language2/value/Language2Json.java

175 lines
5.7 KiB
Java

package me.skymc.taboolib.string.language2.value;
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;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
/**
* @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: ";
private Player player;
private Language2Value value;
private JSONFormatter json = new JSONFormatter();
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(message.replace("||", "\n").substring(KEY_TEXT.length()));
}
// 显示物品
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(message.substring(KEY_COMMAND.length()));
}
// 打印指令
else if (message.startsWith(KEY_SUGGEST)) {
clickEvent = new SuggestCommandEvent(message.substring(KEY_SUGGEST.length()));
}
// 打开连接
else if (message.startsWith(KEY_URL)) {
clickEvent = new OpenUrlEvent(message.substring(KEY_URL.length()));
}
// 换行
else if ("[break]".equals(message)) {
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);
}
public Player getPlayer() {
return player;
}
public Language2Value getValue() {
return value;
}
public JSONFormatter getJson() {
return json;
}
public StringBuffer getText() {
return text;
}
/**
* 发送给玩家
*
* @param player 玩家
*/
@Override
public void send(Player player) {
json.send(player);
}
@Override
public void console() {
Bukkit.getConsoleSender().sendMessage(text.toString());
}
/**
* 追加 JSON 内容
*
* @param current 文本
* @param hoverEvent 显示动作
*/
private void append(String current, ClickEvent clickEvent, HoverEvent hoverEvent) {
if (clickEvent == null && hoverEvent == null) {
// 纯文本
json.append(current);
} else if (clickEvent != null && hoverEvent == null) {
// 纯点击
json.appendClick(current, clickEvent);
} else if (clickEvent == null && hoverEvent != null) {
// 纯显示
json.appendHover(current, hoverEvent);
} else {
// 全部
json.appendHoverClick(current, hoverEvent, clickEvent);
}
// 追加显示文本
text.append(current);
}
}