增加一些动作/结构并且补注释:( 呜呜呜补注释好累头号疼

This commit is contained in:
Starrysky
2026-02-17 00:07:42 +08:00
parent 65f516a11f
commit 67e286981e
26 changed files with 572 additions and 34 deletions

View File

@@ -1,8 +1,10 @@
package top.sunsetlab.utils;
import com.google.gson.Gson;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import top.sunsetlab.PluginMain;
import top.sunsetlab.actions.IActionBase;
import java.io.BufferedReader;
@@ -14,11 +16,19 @@ import java.lang.reflect.InvocationTargetException;
class ActionData {
String id;
String classname;
boolean sync;
}
/**
* Json定义的动作
*/
public class JsonAction {
private final ActionData data;
/**
* 构造器
* @param location 资源文件(json)的位置
*/
public JsonAction(String location) {
InputStream is = JsonAction.class.getResourceAsStream("/" + location);
if (is == null) {
@@ -29,15 +39,32 @@ public class JsonAction {
data = gson.fromJson(br, ActionData.class);
}
/**
* 调用动作
* @param location 调用位置
* @param caller 执行者
* @return 动作是否成功运行sync动作始终为true
*/
public boolean run(Location location, Player caller) {
try {
// 通过反射加载动作类
Class<?> clazz = Class.forName(data.classname);
if (!IActionBase.class.isAssignableFrom(clazz)) {
throw new RuntimeException(data.classname + " is not a Action");
}
// 获取构造器
Constructor<?> constructor = clazz.getConstructor();
IActionBase action = (IActionBase) constructor.newInstance();
return action.call(location, caller);
if (data.sync) {
// 在Minecraft线程内执行一般用于世界交互
Bukkit.getScheduler().runTask(PluginMain.plugin, () -> {
action.call(location, caller);
});
return true;
}else {
// 异步执行
return action.call(location, caller);
}
}catch (ClassNotFoundException
| NoSuchMethodException
| SecurityException
@@ -51,6 +78,10 @@ public class JsonAction {
}
}
/**
* 获取动作id
* @return 动作id
*/
public String getId() {
return data.id;
}