Иконка ресурса

Лоадер валидного джава-кода

Версия(и) Minecraft
1.4.7-1.16.2
Привет. На моём пути часто встречались задачи, в которых мне нужна сложная скриптовидная реализация чего-либо, но использовать хардкод не хотелось. В результате написал для себя загрузчик джава-кода и груви скриптов, использующий библиотеку Apache Groovy.

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>

Обратите внимание, что библиотека обязательно должна быть вкомпилирована в ваш проект.
  • Like
Реакции: hohserg
Автор
DimasikBC
Просмотры
1,032
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху