From 2985a79db130ce88aa8e7092f7fb65d8c2c335d2 Mon Sep 17 00:00:00 2001 From: caoli5288 Date: Tue, 17 Dec 2019 11:09:06 +0800 Subject: [PATCH] Some refactor --- .../com/mengcraft/script/EventMapping.java | 4 +- .../com/mengcraft/script/HandledCommand.java | 47 ++++++++++++++ .../com/mengcraft/script/HandledExecutor.java | 42 ------------- .../com/mengcraft/script/ScriptBootstrap.java | 61 +++++++++--------- .../{MainCommand.java => ScriptCommand.java} | 49 ++++++++++----- .../com/mengcraft/script/ScriptExecutor.java | 12 ---- .../com/mengcraft/script/ScriptPlugin.java | 43 +++---------- .../mengcraft/script/loader/ScriptLoader.java | 12 ++-- .../script/plugin/ScriptingLoader.java | 5 +- .../mengcraft/script/util/ArrayHelper.java | 62 ------------------- .../com/mengcraft/script/util/LazyValue.java | 20 ++++++ .../java/com/mengcraft/script/util/Utils.java | 18 +++++- 12 files changed, 164 insertions(+), 211 deletions(-) create mode 100644 src/main/java/com/mengcraft/script/HandledCommand.java delete mode 100644 src/main/java/com/mengcraft/script/HandledExecutor.java rename src/main/java/com/mengcraft/script/{MainCommand.java => ScriptCommand.java} (64%) delete mode 100644 src/main/java/com/mengcraft/script/ScriptExecutor.java delete mode 100644 src/main/java/com/mengcraft/script/util/ArrayHelper.java create mode 100644 src/main/java/com/mengcraft/script/util/LazyValue.java diff --git a/src/main/java/com/mengcraft/script/EventMapping.java b/src/main/java/com/mengcraft/script/EventMapping.java index a2cb873..f8ac1e2 100644 --- a/src/main/java/com/mengcraft/script/EventMapping.java +++ b/src/main/java/com/mengcraft/script/EventMapping.java @@ -6,7 +6,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.common.io.Files; -import com.mengcraft.script.util.ArrayHelper; +import com.mengcraft.script.util.Utils; import lombok.Data; import lombok.SneakyThrows; import lombok.val; @@ -126,7 +126,7 @@ public Object filter(String regex) {// Export to scripts list.add(key); } }); - return ArrayHelper.toJSArray(list.toArray()); + return Utils.fromJava(list); } protected static HandlerList getHandler(Mapping mapping) { diff --git a/src/main/java/com/mengcraft/script/HandledCommand.java b/src/main/java/com/mengcraft/script/HandledCommand.java new file mode 100644 index 0000000..a9834c4 --- /dev/null +++ b/src/main/java/com/mengcraft/script/HandledCommand.java @@ -0,0 +1,47 @@ +package com.mengcraft.script; + +import com.mengcraft.script.util.Utils; +import lombok.RequiredArgsConstructor; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import javax.script.Bindings; +import java.util.function.BiConsumer; + +/** + * Created on 16-10-17. + */ +@RequiredArgsConstructor +public class HandledCommand implements CommandExecutor { + + private final ScriptPlugin script; + private final String label; + private final BiConsumer executor; + private final String permission; + + public boolean execute(CommandSender sender, Bindings params) { + if (permission == null || sender.hasPermission(permission)) { + executor.accept(sender, params); + return true; + } else { + sender.sendMessage(ChatColor.RED + "你没有执行权限"); + } + return false; + } + + + public boolean remove() { + return script.remove(this); + } + + public String getLabel() { + return label; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] params) { + return execute(sender, Utils.fromJava(params)); + } +} diff --git a/src/main/java/com/mengcraft/script/HandledExecutor.java b/src/main/java/com/mengcraft/script/HandledExecutor.java deleted file mode 100644 index cfbd391..0000000 --- a/src/main/java/com/mengcraft/script/HandledExecutor.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mengcraft.script; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -/** - * Created on 16-10-17. - */ -public class HandledExecutor { - - private final String label; - private final ScriptExecutor executor; - private final String permission; - private final ScriptPlugin plugin; - - public HandledExecutor(ScriptPlugin plugin, ScriptPlugin.Executor i) { - this.plugin = plugin; - label = i.getLabel(); - executor = i.getExecutor(); - permission = i.getPermission(); - } - - public boolean execute(CommandSender sender, Object input) { - if (permission == null || sender.hasPermission(permission)) { - executor.execute(sender, input); - return true; - } else { - sender.sendMessage(ChatColor.RED + "你没有执行权限"); - } - return false; - } - - - public boolean remove() { - return plugin.remove(this); - } - - public String getLabel() { - return label; - } - -} diff --git a/src/main/java/com/mengcraft/script/ScriptBootstrap.java b/src/main/java/com/mengcraft/script/ScriptBootstrap.java index 425cc0b..026943d 100644 --- a/src/main/java/com/mengcraft/script/ScriptBootstrap.java +++ b/src/main/java/com/mengcraft/script/ScriptBootstrap.java @@ -6,11 +6,11 @@ import com.mengcraft.script.loader.ScriptLoader; import com.mengcraft.script.loader.ScriptPluginException; import com.mengcraft.script.plugin.ScriptingLoader; -import com.mengcraft.script.util.ArrayHelper; import com.mengcraft.script.util.BossBarWrapper; import com.mengcraft.script.util.Named; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.experimental.var; import lombok.val; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -38,6 +38,7 @@ import java.util.Map; import java.util.logging.Level; +import static com.mengcraft.script.util.Utils.as; import static org.bukkit.util.NumberConversions.toInt; /** @@ -46,9 +47,9 @@ public final class ScriptBootstrap extends JavaPlugin implements IScriptSpi { private static ScriptBootstrap plugin; + private final ScriptCommand scriptCommand = new ScriptCommand(); private Map scripts; private ScriptEngine jsEngine; - private final Map executor = new HashMap<>(); private ScriptLoader scriptLoader; private Unsafe unsafe; @@ -89,9 +90,8 @@ public void onLoad() { @Override public void onEnable() { scriptLoader = new ScriptLoader(); - getServer().getConsoleSender().sendMessage(ArrayHelper.toArray( - ChatColor.GREEN + "梦梦家高性能服务器出租店", - ChatColor.GREEN + "shop105595113.taobao.com")); + getServer().getConsoleSender().sendMessage(ChatColor.GREEN + "梦梦家高性能服务器出租店"); + getServer().getConsoleSender().sendMessage(ChatColor.GREEN + "shop105595113.taobao.com"); EventMapping.INSTANCE.loadClasses();// Register build-in event getLogger().info("Initialized " + (EventMapping.INSTANCE.getKnownClasses().size() / 2) + " build-in event(s)"); @@ -100,7 +100,7 @@ public void onEnable() { Formatter.setReplacePlaceholder(true); } - getCommand("script").setExecutor(new MainCommand(this, executor)); + getCommand("script").setExecutor(scriptCommand); saveDefaultConfig(); unsafe = new Unsafe(this); @@ -176,7 +176,7 @@ public ScriptLoader.ScriptBinding loadScript(ScriptLoader.ScriptInfo info) throw ScriptPlugin loaded = binding.getPlugin(); if (loaded.isHandled() && !loaded.isIdled()) { String name = loaded.getDescription("name"); - Named named = (Named) scripts.get(name); + Named named = scripts.get(name); if (named != null) { ScriptPluginException.thr(loaded, "Name conflict with " + named.getId()); } @@ -185,7 +185,7 @@ public ScriptLoader.ScriptBinding loadScript(ScriptLoader.ScriptInfo info) throw return binding; } - Named lookById(String id) { + private Named lookById(String id) { for (Object obj : scripts.values()) { Named named = (Named) obj; if (named.getId().equals(id)) { @@ -200,30 +200,26 @@ public ImmutableList list() { } @SuppressWarnings("unchecked") - protected void addExecutor(HandledExecutor handled) { - String label = handled.getLabel(); - Preconditions.checkState(!executor.containsKey(label)); - try { - Field field = SimplePluginManager.class.getDeclaredField("commandMap"); - field.setAccessible(true); - SimpleCommandMap i = SimpleCommandMap.class.cast(field.get(getServer().getPluginManager())); - Field f = SimpleCommandMap.class.getDeclaredField("knownCommands"); - f.setAccessible(true); - Map handler = Map.class.cast(f.get(i)); - PluginCommand command = getCommand("script"); - handler.putIfAbsent(label, command); - handler.putIfAbsent("script:" + label, command); - executor.put(label, handled); - executor.put("script:" + label, handled); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e.getMessage()); - } + @SneakyThrows + protected void addExecutor(HandledCommand executor) { + Preconditions.checkState(!scriptCommand.containsKey(executor.getLabel())); + String label = executor.getLabel(); + Field field = SimplePluginManager.class.getDeclaredField("commandMap"); + field.setAccessible(true); + var commandMap = as(field.get(getServer().getPluginManager()), SimpleCommandMap.class); + Field f = SimpleCommandMap.class.getDeclaredField("knownCommands"); + f.setAccessible(true); + var knownCommands = as(f.get(commandMap), Map.class); + PluginCommand command = getCommand("script"); + knownCommands.putIfAbsent(label, command); + knownCommands.putIfAbsent("script:" + label, command); + scriptCommand.put(label, executor); + scriptCommand.put("script:" + label, executor); } @SneakyThrows - protected boolean remove(HandledExecutor handled) { - boolean b = executor.containsKey(handled.getLabel()); - if (b) { + protected boolean remove(HandledCommand handled) { + if (scriptCommand.containsKey(handled.getLabel())) { String label = handled.getLabel(); Field field = SimplePluginManager.class.getDeclaredField("commandMap"); field.setAccessible(true); @@ -234,10 +230,11 @@ protected boolean remove(HandledExecutor handled) { PluginCommand command = getCommand("script"); handler.remove(label, command); handler.remove("script:" + label, command); - executor.remove(label); - executor.remove("script:" + label); + scriptCommand.remove(label); + scriptCommand.remove("script:" + label); + return true; } - return b; + return false; } boolean unload(ScriptPlugin script) { diff --git a/src/main/java/com/mengcraft/script/MainCommand.java b/src/main/java/com/mengcraft/script/ScriptCommand.java similarity index 64% rename from src/main/java/com/mengcraft/script/MainCommand.java rename to src/main/java/com/mengcraft/script/ScriptCommand.java index 0e0b3af..27dda8d 100644 --- a/src/main/java/com/mengcraft/script/MainCommand.java +++ b/src/main/java/com/mengcraft/script/ScriptCommand.java @@ -1,7 +1,11 @@ package com.mengcraft.script; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.mengcraft.script.loader.ScriptPluginException; -import com.mengcraft.script.util.ArrayHelper; +import com.mengcraft.script.util.Utils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -15,30 +19,41 @@ /** * Created on 16-10-25. */ -public class MainCommand implements CommandExecutor { +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class ScriptCommand implements CommandExecutor { - private final Map executor; - private final ScriptBootstrap main; + private final Map commands = Maps.newHashMap(); - MainCommand(ScriptBootstrap main, Map executor) { - this.main = main; - this.executor = executor; + public boolean containsKey(Object key) { + return commands.containsKey(key); + } + + public HandledCommand get(Object key) { + return commands.get(key); + } + + public HandledCommand put(String key, HandledCommand value) { + return commands.put(key, value); + } + + public HandledCommand remove(Object key) { + return commands.remove(key); } @Override - public boolean onCommand(CommandSender who, Command i, String label, String[] j) { + public boolean onCommand(CommandSender who, Command _command, String label, String[] params) { if (label.equals("script") || label.equals("script:script")) { if (who.hasPermission("script.admin")) { - return admin(who, Arrays.asList(j).iterator()); + return admin(who, Arrays.asList(params).iterator()); } else { who.sendMessage(ChatColor.RED + "你没有执行权限"); } } else { - HandledExecutor handled = executor.get(label); - if (handled == null) { + HandledCommand executor = commands.get(label); + if (executor == null) { throw new IllegalStateException("喵"); } - return handled.execute(who, ArrayHelper.toJSArray(j)); + return executor.onCommand(who, _command, label, params); } return false; } @@ -50,7 +65,7 @@ private boolean admin(CommandSender who, Iterator i) { return list(who); } if (label.equals("load")) { - return i.hasNext() && load(who, i.next(), i.hasNext() ? ArrayHelper.toJSArray(i) : null); + return i.hasNext() && load(who, i.next(), i.hasNext() ? Utils.fromJava(Lists.newArrayList(i)) : null); } if (label.equals("unload")) { return i.hasNext() && unload(who, i.next()); @@ -68,13 +83,13 @@ private boolean admin(CommandSender who, Iterator i) { } private boolean reload(CommandSender who) { - main.reload(); + ScriptBootstrap.get().reload(); who.sendMessage(ChatColor.GREEN + "O-kay!"); return true; } private boolean unload(CommandSender who, String i) { - if (main.unload(i)) { + if (ScriptBootstrap.get().unload(i)) { who.sendMessage(ChatColor.GREEN + "O-kay!"); return true; } @@ -83,7 +98,7 @@ private boolean unload(CommandSender who, String i) { private boolean list(CommandSender who) { who.sendMessage(ChatColor.GREEN + "> Loaded script(s)"); - for (String l : main.list()) { + for (String l : ScriptBootstrap.get().list()) { who.sendMessage(ChatColor.GREEN + "- " + l); } return true; @@ -91,7 +106,7 @@ private boolean list(CommandSender who) { private boolean load(CommandSender who, String load, Object arg) { try { - main.load(who, new File(main.getDataFolder(), load), arg); + ScriptBootstrap.get().load(who, new File(ScriptBootstrap.get().getDataFolder(), load), arg); who.sendMessage(ChatColor.GREEN + "O-kay!"); return true; } catch (IllegalArgumentException | ScriptPluginException e) { diff --git a/src/main/java/com/mengcraft/script/ScriptExecutor.java b/src/main/java/com/mengcraft/script/ScriptExecutor.java deleted file mode 100644 index 60d86ff..0000000 --- a/src/main/java/com/mengcraft/script/ScriptExecutor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.mengcraft.script; - -import org.bukkit.command.CommandSender; - -/** - * Created on 16-10-17. - */ -public interface ScriptExecutor { - - void execute(CommandSender sender, Object input); - -} diff --git a/src/main/java/com/mengcraft/script/ScriptPlugin.java b/src/main/java/com/mengcraft/script/ScriptPlugin.java index 035bc02..af1643c 100644 --- a/src/main/java/com/mengcraft/script/ScriptPlugin.java +++ b/src/main/java/com/mengcraft/script/ScriptPlugin.java @@ -1,10 +1,10 @@ package com.mengcraft.script; import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; import com.mengcraft.script.loader.ScriptDescription; import com.mengcraft.script.loader.ScriptLogger; import com.mengcraft.script.util.Utils; -import com.mengcraft.script.util.ArrayHelper; import com.mengcraft.script.util.BossBarWrapper; import com.mengcraft.script.util.Named; import com.mengcraft.script.util.Reflector; @@ -15,20 +15,22 @@ import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.permissions.PermissionAttachment; +import javax.script.Bindings; import java.io.Closeable; import java.io.File; -import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; @@ -42,7 +44,7 @@ public final class ScriptPlugin implements Named, Closeable { private final ScriptDescription description; private final Logger logger; private LinkedList placeholders = new LinkedList<>(); - private LinkedList commands = new LinkedList<>(); + private LinkedList commands = new LinkedList<>(); private LinkedList listeners = new LinkedList<>(); private LinkedList tasks = new LinkedList<>(); private ScriptBootstrap main; @@ -131,7 +133,7 @@ public void runCommand(Player p, String command) { } public boolean depend(String depend, Runnable runnable) { - return depend(ArrayHelper.link(depend), runnable); + return depend(Lists.newArrayList(depend), runnable); } public boolean depend(List depend, Runnable runnable) { @@ -168,7 +170,7 @@ public HandledTask runTask(Runnable runnable, boolean b) { return runTask(runnable, 0, -1, b); } - boolean remove(HandledExecutor i) { + boolean remove(HandledCommand i) { return commands.remove(i) && main.remove(i); } @@ -214,13 +216,13 @@ public HandledListener addListener(String eventName, Consumer executor, i return add; } - public HandledExecutor addExecutor(String label, ScriptExecutor executor) { + public HandledCommand addExecutor(String label, BiConsumer executor) { return addExecutor(label, null, executor); } - public HandledExecutor addExecutor(String label, String permission, ScriptExecutor i) { + public HandledCommand addExecutor(String label, String permission, BiConsumer executor) { Preconditions.checkArgument(!label.equals("script")); - HandledExecutor handled = new HandledExecutor(this, new Executor(label, permission, i)); + HandledCommand handled = new HandledCommand(this, label, executor, permission); main.addExecutor(handled); commands.add(handled); return handled; @@ -337,31 +339,6 @@ public String getName() { return getDescription("name"); } - public static class Executor { - - private final String permission; - private final String label; - private final ScriptExecutor executor; - - public Executor(String label, String permission, ScriptExecutor executor) { - this.label = label; - this.permission = permission; - this.executor = executor; - } - - public String getPermission() { - return permission; - } - - public String getLabel() { - return label; - } - - public ScriptExecutor getExecutor() { - return executor; - } - } - @RequiredArgsConstructor static class DependCall { diff --git a/src/main/java/com/mengcraft/script/loader/ScriptLoader.java b/src/main/java/com/mengcraft/script/loader/ScriptLoader.java index 8313871..df549b0 100644 --- a/src/main/java/com/mengcraft/script/loader/ScriptLoader.java +++ b/src/main/java/com/mengcraft/script/loader/ScriptLoader.java @@ -4,12 +4,10 @@ import com.mengcraft.script.ScriptBootstrap; import com.mengcraft.script.ScriptPlugin; import com.mengcraft.script.util.Named; -import jdk.nashorn.api.scripting.ScriptObjectMirror; import lombok.Builder; import lombok.experimental.Delegate; import lombok.experimental.var; import org.bukkit.command.CommandSender; -import org.bukkit.event.Event; import javax.script.Bindings; import javax.script.Invocable; @@ -20,8 +18,6 @@ import java.util.Map; import java.util.function.Consumer; -import static com.mengcraft.script.util.Utils.as; - /** * Created on 16-10-17. */ @@ -81,9 +77,9 @@ private static String load(ScriptPlugin plugin) { private static void loadListener(ScriptPlugin plugin, ScriptEngine ctx) { String handle = plugin.getDescription("handle"); if (handle != null && EventMapping.INSTANCE.initialized(handle)) { - var obj = as(ctx.get("handle"), ScriptObjectMirror.class); + var obj = ctx.get("handle"); if (obj != null) { - plugin.addListener(handle, event -> obj.call(null, event)); + plugin.addListener(handle, ((Invocable) ctx).getInterface(obj, Consumer.class)); } } } @@ -112,8 +108,8 @@ public ScriptPlugin getPlugin() { return plugin; } - public ScriptObjectMirror getScriptObj() { - return (ScriptObjectMirror) scriptObj; + public Bindings getScriptObj() { + return (Bindings) scriptObj; } @Override diff --git a/src/main/java/com/mengcraft/script/plugin/ScriptingLoader.java b/src/main/java/com/mengcraft/script/plugin/ScriptingLoader.java index 452df39..7fcab85 100644 --- a/src/main/java/com/mengcraft/script/plugin/ScriptingLoader.java +++ b/src/main/java/com/mengcraft/script/plugin/ScriptingLoader.java @@ -4,6 +4,7 @@ import com.mengcraft.script.EventMapping; import com.mengcraft.script.Formatter; import com.mengcraft.script.ScriptBootstrap; +import com.mengcraft.script.util.LazyValue; import com.mengcraft.script.util.Named; import com.mengcraft.script.util.Utils; import lombok.Data; @@ -195,11 +196,11 @@ public ChunkGenerator getDefaultWorldGenerator(String s, String s1) { return null; } - private final Logger logger = new PluginLogger(this); + private final LazyValue logger = new LazyValue<>(() -> new PluginLogger(this)); @Override public Logger getLogger() { - return logger; + return logger.get(); } @Override diff --git a/src/main/java/com/mengcraft/script/util/ArrayHelper.java b/src/main/java/com/mengcraft/script/util/ArrayHelper.java deleted file mode 100644 index 6baa531..0000000 --- a/src/main/java/com/mengcraft/script/util/ArrayHelper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.mengcraft.script.util; - -import com.google.common.collect.Lists; -import com.mengcraft.script.ScriptBootstrap; -import lombok.SneakyThrows; -import lombok.experimental.var; - -import javax.script.Invocable; -import javax.script.ScriptContext; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -/** - * Created on 16-10-28. - */ -public enum ArrayHelper { - - INST; - - public interface Helper { - Object toJSArray(Object input); - } - - private final Helper helper; - - @SneakyThrows - ArrayHelper() { - var engine = ScriptBootstrap.jsEngine(); - var oldBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); - try { - engine.eval("" + - "function toJSArray(input) {\n" + - " return Array.prototype.slice.call(input);\n" + - "}"); - helper = ((Invocable) engine).getInterface(Helper.class); - } finally { - engine.setBindings(oldBindings, ScriptContext.ENGINE_SCOPE); - } - } - - public static List link(T... in) { - List list = new LinkedList<>(); - for (T i : in) { - list.add(i); - } - return list; - } - - public static T[] toArray(T... input) { - return input; - } - - public static Object toJSArray(T[] input) { - return INST.helper.toJSArray(input); - } - - public static Object toJSArray(Iterator i) { - return INST.helper.toJSArray(Lists.newArrayList(i).toArray()); - } - -} diff --git a/src/main/java/com/mengcraft/script/util/LazyValue.java b/src/main/java/com/mengcraft/script/util/LazyValue.java new file mode 100644 index 0000000..ec7e1c4 --- /dev/null +++ b/src/main/java/com/mengcraft/script/util/LazyValue.java @@ -0,0 +1,20 @@ +package com.mengcraft.script.util; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import java.util.Objects; +import java.util.function.Supplier; + +@RequiredArgsConstructor +public class LazyValue { + + @NonNull + private final Supplier factory; + private T obj; + + public T get() { + if (obj == null) obj = Objects.requireNonNull(factory.get(), "lazy load value"); + return obj; + } +} diff --git a/src/main/java/com/mengcraft/script/util/Utils.java b/src/main/java/com/mengcraft/script/util/Utils.java index c88a6de..ee8d999 100644 --- a/src/main/java/com/mengcraft/script/util/Utils.java +++ b/src/main/java/com/mengcraft/script/util/Utils.java @@ -1,16 +1,22 @@ package com.mengcraft.script.util; import com.mengcraft.script.ScriptBootstrap; +import lombok.SneakyThrows; +import lombok.experimental.var; import org.bukkit.entity.Player; import org.bukkit.event.EventPriority; import org.yaml.snakeyaml.Yaml; +import javax.script.Bindings; +import javax.script.Invocable; import java.math.BigDecimal; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; public class Utils { private static final Yaml YAML = new Yaml(); + private static Function java_from_invoker; public static Yaml getYaml() { return YAML; @@ -34,8 +40,18 @@ public static void sendBossBar(Player p, BossBarWrapper bar, int tick) { }); } + @SneakyThrows + public static Bindings fromJava(T obj) { + if (java_from_invoker == null) { + var js = ScriptBootstrap.jsEngine(); + var function = js.eval("(function a(a){return Java.from(a);})"); + java_from_invoker = ((Invocable) js).getInterface(function, Function.class); + } + return java_from_invoker.apply(obj); + } + public static T as(Obj obj, Class cls) { - return cls.cast(obj); + return (T) obj; } public static EventPriority getEventPriority(int priority) {