diff --git a/src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java b/src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java index 9f3eeae..cb90dee 100644 --- a/src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java +++ b/src/main/java/pw/yumc/YumCore/tellraw/ItemSerialize.java @@ -60,9 +60,7 @@ public abstract class ItemSerialize { @Override public String parse(final ItemStack item) { try { - final JsonBuilder j = new JsonBuilder(); - j.append(nmsSaveNBTMethod.invoke(asNMSCopyMethod.invoke(null, item), nmsNBTTagCompound.newInstance()).toString()); - return j.toString(); + return new JsonBuilder((nmsSaveNBTMethod.invoke(asNMSCopyMethod.invoke(null, item), nmsNBTTagCompound.newInstance()).toString())).toString(); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) { itemSerialize = new Manual(); return itemSerialize.parse(item); @@ -70,74 +68,6 @@ public abstract class ItemSerialize { } } - static class JsonBuilder { - public static final String[] REPLACEMENT_CHARS; - static { - REPLACEMENT_CHARS = new String[128]; - for (int i = 0; i <= 0x1f; i++) { - REPLACEMENT_CHARS[i] = String.format("\\u%04x", i); - } - REPLACEMENT_CHARS['"'] = "\\\""; - REPLACEMENT_CHARS['\\'] = "\\\\"; - REPLACEMENT_CHARS['\t'] = "\\t"; - REPLACEMENT_CHARS['\b'] = "\\b"; - REPLACEMENT_CHARS['\n'] = "\\n"; - REPLACEMENT_CHARS['\r'] = "\\r"; - REPLACEMENT_CHARS['\f'] = "\\f"; - } - StringBuffer json; - - public JsonBuilder() { - json = new StringBuffer(); - } - - public JsonBuilder(final String string) { - json = new StringBuffer(string); - } - - public void append(final String value) { - int last = 0; - final int length = value.length(); - for (int i = 0; i < length; i++) { - final char c = value.charAt(i); - String replacement; - if (c < 128) { - replacement = REPLACEMENT_CHARS[c]; - if (replacement == null) { - continue; - } - } else if (c == '\u2028') { - replacement = "\\u2028"; - } else if (c == '\u2029') { - replacement = "\\u2029"; - } else { - continue; - } - if (last < i) { - json.append(value, last, i); - } - json.append(replacement); - last = i + 1; - } - if (last < length) { - json.append(value, last, length); - } - } - - public void deleteCharAt(final int length) { - json.deleteCharAt(length - 1); - } - - public int length() { - return json.length(); - } - - @Override - public String toString() { - return json.toString(); - } - } - static class Manual extends ItemSerialize { @Override @@ -162,9 +92,7 @@ public abstract class ItemSerialize { display.append("Lore:["); int i = 0; for (final String line : im.getLore()) { - final JsonBuilder j = new JsonBuilder(); - j.append(line); - display.append(String.format("%s:%s,", i, j.toString())); + display.append(String.format("%s:%s,", i, new JsonBuilder(line).toString())); i++; } display.deleteCharAt(display.length() - 1); diff --git a/src/main/java/pw/yumc/YumCore/tellraw/JsonBuilder.java b/src/main/java/pw/yumc/YumCore/tellraw/JsonBuilder.java new file mode 100644 index 0000000..58d1034 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/tellraw/JsonBuilder.java @@ -0,0 +1,70 @@ +package pw.yumc.YumCore.tellraw; + +public class JsonBuilder { + public static final String[] REPLACEMENT_CHARS; + static { + REPLACEMENT_CHARS = new String[128]; + for (int i = 0; i <= 0x1f; i++) { + REPLACEMENT_CHARS[i] = String.format("\\u%04x", i); + } + REPLACEMENT_CHARS['"'] = "\\\""; + REPLACEMENT_CHARS['\\'] = "\\\\"; + REPLACEMENT_CHARS['\t'] = "\\t"; + REPLACEMENT_CHARS['\b'] = "\\b"; + REPLACEMENT_CHARS['\n'] = "\\n"; + REPLACEMENT_CHARS['\r'] = "\\r"; + REPLACEMENT_CHARS['\f'] = "\\f"; + } + StringBuffer json; + + public JsonBuilder() { + json = new StringBuffer(); + } + + public JsonBuilder(final String string) { + this(); + append(string); + } + + public void append(final String value) { + int last = 0; + final int length = value.length(); + for (int i = 0; i < length; i++) { + final char c = value.charAt(i); + String replacement; + if (c < 128) { + replacement = REPLACEMENT_CHARS[c]; + if (replacement == null) { + continue; + } + } else if (c == '\u2028') { + replacement = "\\u2028"; + } else if (c == '\u2029') { + replacement = "\\u2029"; + } else { + continue; + } + if (last < i) { + json.append(value, last, i); + } + json.append(replacement); + last = i + 1; + } + if (last < length) { + json.append(value, last, length); + } + } + + public void deleteLastChar() { + json.deleteCharAt(json.length() - 1); + } + + public int length() { + return json.length(); + } + + @Override + public String toString() { + return json.toString(); + } +} diff --git a/src/main/java/pw/yumc/YumCore/tellraw/MessagePart.java b/src/main/java/pw/yumc/YumCore/tellraw/MessagePart.java index c2752af..7a68b79 100644 --- a/src/main/java/pw/yumc/YumCore/tellraw/MessagePart.java +++ b/src/main/java/pw/yumc/YumCore/tellraw/MessagePart.java @@ -7,6 +7,10 @@ package pw.yumc.YumCore.tellraw; * @author 喵♂呜 */ public class MessagePart { + private static final String TEXT_FORMAT = "\"text\":\"%s\""; + private static final String CLICK_FORMAT = "\"clickEvent\":{\"action\":\"%s\",\"value\":\"%s\"}"; + private static final String HOVER_FORMAT = "\"hoverEvent\":{\"action\":\"%s\",\"value\":\"%s\"}"; + private static final String INSERT_FORMAT = " \"insertion\":\"%s\""; /** * 消息文本 */ @@ -55,18 +59,18 @@ public class MessagePart { */ public void writeJson(final StringBuffer str) { str.append("{"); - str.append("\"text\":\"" + text + "\""); + str.append(String.format(TEXT_FORMAT, text)); if (clickActionName != null) { str.append(","); - str.append(String.format("\"clickEvent\":{\"action\":\"%s\",\"value\":\"%s\"}", clickActionName, clickActionData)); + str.append(String.format(CLICK_FORMAT, clickActionName, clickActionData)); } if (hoverActionName != null) { str.append(","); - str.append(String.format("\"hoverEvent\":{\"action\":\"%s\",\"value\":\"%s\"}", hoverActionName, hoverActionData)); + str.append(String.format(HOVER_FORMAT, hoverActionName, hoverActionData)); } if (insertionData != null) { str.append(","); - str.append(String.format(" \"insertion\":\"%s\"", insertionData)); + str.append(String.format(INSERT_FORMAT, insertionData)); } str.append("}"); } diff --git a/src/main/java/pw/yumc/YumCore/tellraw/Tellraw.java b/src/main/java/pw/yumc/YumCore/tellraw/Tellraw.java index 82ef60b..2ae7154 100644 --- a/src/main/java/pw/yumc/YumCore/tellraw/Tellraw.java +++ b/src/main/java/pw/yumc/YumCore/tellraw/Tellraw.java @@ -117,8 +117,8 @@ public class Tellraw { /** * 悬浮物品 * - * @param text - * 文本 + * @param json + * 物品Json串 * @return {@link Tellraw} */ public Tellraw item(final String json) { @@ -136,6 +136,17 @@ public class Tellraw { return onClick("open_url", url); } + /** + * 打开网址 + * + * @param url + * 网址 + * @return {@link Tellraw} + */ + public Tellraw openurl(final String url) { + return onClick("open_url", url); + } + /** * 发送Tellraw * @@ -206,6 +217,19 @@ public class Tellraw { return then(new MessagePart(text)); } + /** + * 悬浮物品 + * + * @param name + * 物品名称 + * @param item + * {@link ItemStack} + * @return {@link Tellraw} + */ + public Tellraw then(final String name, final ItemStack item) { + return then(name).item(ItemSerialize.$(item)); + } + /** * 悬浮消息 *