diff --git a/pom.xml b/pom.xml
index 7f79861..5beb4be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
pw.yumc
YumCore
- 1.8.7
+ 1.8.8
${project.artifactId}
diff --git a/src/main/java/pw/yumc/YumCore/text/Replace.java b/src/main/java/pw/yumc/YumCore/text/Replace.java
index 40b88da..172ae4b 100644
--- a/src/main/java/pw/yumc/YumCore/text/Replace.java
+++ b/src/main/java/pw/yumc/YumCore/text/Replace.java
@@ -13,9 +13,13 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import me.clip.placeholderapi.PlaceholderAPI;
+import pw.yumc.YumCore.bukkit.Log;
import pw.yumc.YumCore.bukkit.P;
import pw.yumc.YumCore.bukkit.compatible.C;
+/**
+ * @author MiaoWoo
+ */
public class Replace {
private static boolean papi = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI");
@@ -32,16 +36,24 @@ public class Replace {
}
private static String p(final Player p, final String text) {
- return PlaceholderAPI.setPlaceholders(p, s(p, text));
+ String result = s(p, text);
+ try {
+ return PlaceholderAPI.setPlaceholders(p, result);
+ } catch (Exception ex) {
+ Log.console("§4[Replace] §cPAPI变量 §a%s 替换时发生错误 §4%s: %s §6请检查 §bPlaceholderAPI §6扩展配置!", text, ex.getClass().getName(), ex.getMessage());
+ ex.printStackTrace();
+ return result;
+ }
}
private static String s(final Player p, final String text) {
- return SimpleRelpace.$(p, text);
+ return SimpleReplace.$(p, text);
}
- static class SimpleRelpace {
+ static class SimpleReplace {
private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("[%]([^%]+)[%]");
- private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ private static final ThreadLocal DF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public static String $(final Player player, String text) {
final Matcher m = PLACEHOLDER_PATTERN.matcher(text);
@@ -51,18 +63,19 @@ public class Replace {
final String[] ka = format.split("_", 2);
String value = null;
switch (ka[0]) {
- case "player":
- value = player(player, ka[1]);
- break;
- case "server":
- value = server(player, ka[1]);
- break;
- case "plugin":
- value = plugin(player, ka[1]);
- break;
- case "time":
- value = time(player, ka[1]);
- break;
+ case "player":
+ value = player(player, ka[1]);
+ break;
+ case "server":
+ value = server(player, ka[1]);
+ break;
+ case "plugin":
+ value = plugin(player, ka[1]);
+ break;
+ case "time":
+ value = time(player, ka[1]);
+ break;
+ default:
}
if (value != null) {
text = text.replace("%" + format + "%", Matcher.quoteReplacement(value));
@@ -74,63 +87,63 @@ public class Replace {
private static String player(final Player player, final String key) {
switch (key) {
- case "x":
- return String.valueOf(player.getLocation().getBlockX());
- case "y":
- return String.valueOf(player.getLocation().getBlockY());
- case "z":
- return String.valueOf(player.getLocation().getBlockZ());
- case "yaw":
- return String.valueOf(Math.round(player.getLocation().getYaw() * 100) / 100);
- case "pitch":
- return String.valueOf(Math.round(player.getLocation().getPitch() * 100) / 100);
- case "world":
- return player.getWorld().getName();
- case "name":
- return player.getName();
- case "displayname":
- return player.getDisplayName();
- case "health":
- return String.valueOf(player.getHealth());
- case "max_health":
- return String.valueOf(player.getMaxHealth());
- default:
- return String.format("%%player_%s%%", key);
+ case "x":
+ return String.valueOf(player.getLocation().getBlockX());
+ case "y":
+ return String.valueOf(player.getLocation().getBlockY());
+ case "z":
+ return String.valueOf(player.getLocation().getBlockZ());
+ case "yaw":
+ return String.valueOf(Math.round(player.getLocation().getYaw() * 100) / 100);
+ case "pitch":
+ return String.valueOf(Math.round(player.getLocation().getPitch() * 100) / 100);
+ case "world":
+ return player.getWorld().getName();
+ case "name":
+ return player.getName();
+ case "displayname":
+ return player.getDisplayName();
+ case "health":
+ return String.valueOf(player.getHealth());
+ case "max_health":
+ return String.valueOf(player.getMaxHealth());
+ default:
+ return String.format("%%player_%s%%", key);
}
}
private static String plugin(final Player player, final String key) {
switch (key) {
- case "version":
- return P.getDescription().getVersion().split("-")[0];
- case "name":
- return P.getName();
- case "author":
- return Arrays.toString(P.getDescription().getAuthors().toArray());
- default:
- return String.format("%%plugin_%s%%", key);
+ case "version":
+ return P.getDescription().getVersion().split("-")[0];
+ case "name":
+ return P.getName();
+ case "author":
+ return Arrays.toString(P.getDescription().getAuthors().toArray());
+ default:
+ return String.format("%%plugin_%s%%", key);
}
}
private static String server(final Player player, final String key) {
final Runtime runtime = Runtime.getRuntime();
switch (key) {
- case "online":
- return String.valueOf(C.Player.getOnlinePlayers().size());
- case "max":
- return String.valueOf(Bukkit.getMaxPlayers());
- case "unique_joins":
- return String.valueOf(Bukkit.getOfflinePlayers().length);
- case "ram_used":
- return String.valueOf((runtime.totalMemory() - runtime.freeMemory()) / 1048576L);
- case "ram_free":
- return String.valueOf(runtime.freeMemory() / 1048576L);
- case "ram_total":
- return String.valueOf(runtime.totalMemory() / 1048576L);
- case "ram_max":
- return String.valueOf(runtime.maxMemory() / 1048576L);
- default:
- return String.format("%%server_%s%%", key);
+ case "online":
+ return String.valueOf(C.Player.getOnlinePlayers().size());
+ case "max":
+ return String.valueOf(Bukkit.getMaxPlayers());
+ case "unique_joins":
+ return String.valueOf(Bukkit.getOfflinePlayers().length);
+ case "ram_used":
+ return String.valueOf((runtime.totalMemory() - runtime.freeMemory()) / 1048576L);
+ case "ram_free":
+ return String.valueOf(runtime.freeMemory() / 1048576L);
+ case "ram_total":
+ return String.valueOf(runtime.totalMemory() / 1048576L);
+ case "ram_max":
+ return String.valueOf(runtime.maxMemory() / 1048576L);
+ default:
+ return String.format("%%server_%s%%", key);
}
}
@@ -140,27 +153,28 @@ public class Replace {
final String time = key.split("_")[1];
String value = "解析错误";
try {
- final long left = df.parse(time).getTime() - System.currentTimeMillis();
+ final long left = DF.get().parse(time).getTime() - System.currentTimeMillis();
value = String.valueOf(left / 1000);
} catch (final ParseException ignored) {
}
return value;
}
switch (key) {
- case "now":
- return df.format(date);
- case "year":
- return String.valueOf(date.getYear() + 1900);
- case "month":
- return String.valueOf(date.getMonth() + 1);
- case "day":
- return String.valueOf(date.getDate());
- case "hour":
- return String.valueOf(date.getHours() + 1);
- case "minute":
- return String.valueOf(date.getMinutes());
- case "second":
- return String.valueOf(date.getSeconds());
+ case "now":
+ return DF.get().format(date);
+ case "year":
+ return String.valueOf(date.getYear() + 1900);
+ case "month":
+ return String.valueOf(date.getMonth() + 1);
+ case "day":
+ return String.valueOf(date.getDate());
+ case "hour":
+ return String.valueOf(date.getHours() + 1);
+ case "minute":
+ return String.valueOf(date.getMinutes());
+ case "second":
+ return String.valueOf(date.getSeconds());
+ default:
}
return String.format("%%time_%s%%", key);
}