- Версия(и) Minecraft
- 1.4.7-1.16.2
Привет. На моём пути часто встречались задачи, в которых мне нужна сложная скриптовидная реализация чего-либо, но использовать хардкод не хотелось. В результате написал для себя загрузчик джава-кода и груви скриптов, использующий библиотеку Apache Groovy.
Это и есть загрузчик ваших скриптов. Как должен выглядеть сам скрипт:
Это скрипт, выдающий награду (100 монет) игроку, который захватывал контрольную точку.
Зависимости:
Обратите внимание, что библиотека обязательно должна быть вкомпилирована в ваш проект.
Java:
package me.dimasik.api.util;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import lombok.experimental.UtilityClass;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
@UtilityClass
public class ScriptLoader {
private static final GroovyClassLoader CLASS_LOADER
= new GroovyClassLoader(ScriptLoader.class.getClassLoader());
@SuppressWarnings("unchecked")
public <T extends Script<T>> T loadScriptAndCreateObject(String fileName, Object... args) {
try {
Class<?> clazz = CLASS_LOADER.parseClass(new File(fileName));
if (args.length <= 0)
return (T) ((GroovyObject) clazz.newInstance())
.invokeMethod("self", new Object[0]);
else {
Class[] classes = new Class[args.length];
for (int i = 0; i < classes.length; i++) {
classes[i] = args[i].getClass();
}
return (T) ((GroovyObject) clazz.getConstructor(classes).newInstance(args))
.invokeMethod("self", new Object[0]);
}
} catch (IOException | InstantiationException | IllegalAccessException |
NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public interface Script<SELF extends Script<SELF>> {
SELF getSelf();
}
}
Это и есть загрузчик ваших скриптов. Как должен выглядеть сам скрипт:
Java:
package script;
import me.dimasik.api.util.ScriptLoader;
import me.dimasik.cosmoprison.player.CosmoPlayer;
import me.dimasik.cosmoprison.point.CosmoCapturePointAward;
public class GroovyAwardMoney implements CosmoCapturePointAward, ScriptLoader.Script<GroovyAwardMoney> {
@Override
public void giveAward(List<CosmoPlayer> players) {
for (CosmoPlayer player : players) {
player.setBalance(player.getBalance() + 100);
}
}
@Override
public GroovyAwardMoney getSelf() {
return this;
}
}
Это скрипт, выдающий награду (100 монет) игроку, который захватывал контрольную точку.
Зависимости:
Gradle (Groovy):
implementation group: 'org.codehaus.groovy', name: 'groovy-jsr223', version: '3.0.7'
XML:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<version>3.0.7</version>
</dependency>
Обратите внимание, что библиотека обязательно должна быть вкомпилирована в ваш проект.