Сделать чек на приват WorldGuard в Forge моде

Версия Minecraft
1.16.5
API
Forge
4
0
Привет форумчане, сегодня задался вопросом можно ли как то сделать чек на приват WorldGuard'a который на букките в Forge моде? Читал форум, находил старые темы с 1.7.10 про рефлексии, но код про древнюю версию майнкрафта + я не очень разбираюсь в рефлексии, но в принципе понимаю о чем она, пытался реализовать но увидел тему о том, насколько она медленная. Так вот, стоит ли делать это через рефлексию, или есть более современные способы?
 
21
2
Если нужно получить конкретно информацию о возможности строить, взаимодействовать с сущностями можешь использовать EventHelper.

Если нужно получить больше информации можешь передать информацию как в ответе выше или использовать также инжект самостоятельно.

Пример инжекта Essentials для получения баланса игрока, там думаю додумаешься как переделать под WorldGuard:

Java:
package com.github.gunirs.optimumcore.bukkit;

import com.earth2me.essentials.api.Economy;
import net.fuix.library.util.InjectionUtils;

public class EssentialsAdapter {
    private static IInjection injection;
    private static boolean loading = false;
    private static boolean inject = false;

    public static void init() throws IllegalAccessException, InstantiationException {
        Class<?> clazz = InjectionUtils.injectClass("Essentials", EssentialsAdapter.class);
        injection = (IInjection) clazz.newInstance();
    }

    public static boolean autoInject() throws InstantiationException, IllegalAccessException {
        if(inject)
            return true;

        if(injection == null && !loading) {
            loading = true;
            EssentialsAdapter.init();
            inject = true;
            return true;
        } else if (injection == null) {
            return true;
        }
        loading = false;
        return false;
    }

    public static int getEssBalance(String playerName) throws Exception {
        checkInject();

        return injection.getEssBalance(playerName);
    }

    public static void setEssBalance(String playerName, int money) throws Exception {
        checkInject();

        injection.setEssBalance(playerName, money);
    }

    private static boolean checkInject() throws InstantiationException, IllegalAccessException {
        autoInject();
        return inject;
    }

    public static final class Inj implements IInjection {
        @Override
        public int getEssBalance(String playerName) throws Exception {
            return (int) Economy.getMoney(playerName);
        }

        @Override
        public void setEssBalance(String playerName, int money) throws Exception {
            Economy.setMoney(playerName, money);
        }
    }
}
Java:
package com.github.gunirs.optimumcore.bukkit;

public interface IInjection {
    int getEssBalance(String playerName) throws Exception;
    void setEssBalance(String playerName, int money) throws Exception;
}
Java:
package com.github.gunirs.bukkit;

import com.google.common.io.ByteStreams;
import java.io.InputStream;
import java.lang.reflect.Method;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;

public final class InjectionUtils {
    private static final Method defineClass;

    public InjectionUtils() {
    }

    public static Class<?> injectClass(String pluginName, Class<?> clazz) {
        Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName);
        if (plugin == null) {
            return null;
        } else {
            try {
                InputStream in = clazz.getClassLoader().getResourceAsStream(clazz.getName().replace('.', '/') + "$Inj.class");
                Throwable var4 = null;

                Class var6;
                try {
                    byte[] bytes = ByteStreams.toByteArray(in);
                    var6 = (Class)defineClass.invoke(plugin.getClass().getClassLoader(), null, bytes, 0, bytes.length);
                } catch (Throwable var16) {
                    var4 = var16;
                    throw var16;
                } finally {
                    if (in != null) {
                        if (var4 != null) {
                            try {
                                in.close();
                            } catch (Throwable var15) {
                                var4.addSuppressed(var15);
                            }
                        } else {
                            in.close();
                        }
                    }

                }

                return var6;
            } catch (Throwable var18) {
                var18.printStackTrace();
                return null;
            }
        }
    }

    static {
        try {
            defineClass = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE);
            defineClass.setAccessible(true);
        } catch (Throwable var1) {
            throw new RuntimeException("Failed hooking ClassLoader.defineClass(String, byte[], int, int) method!", var1);
        }
    }
}
 
4
0
Если нужно получить конкретно информацию о возможности строить, взаимодействовать с сущностями можешь использовать EventHelper.
В топике указана версия 1.16.5, но за ответ ниже благодарен.
 
7,099
324
1,510
Какие-то костыли. Достаточно отправить форжевское событие изменения блока игроком. Если событие завершилось - значит, вносить изменения нельзя. Также есть другие события для определенных кейсов, например, для пкм предметом. Чекни таблицу событий в учебнике.
Плюсы этого подхода:
  • простота кода
  • отсутствии зависимостей от WG
  • поддержка любого плагина и мода приват
 
1,074
72
372
Всё же общаться с плагинами универсально и проще при помощи ивентов. Там не нужны никакие инжекты в дочерний classloader.
А вообще, с Bukkit завязывайте. За его поддержку будете расплачиваться написанием кучи костылей.
 
21
3
1
Всё же общаться с плагинами универсально и проще при помощи ивентов. Там не нужны никакие инжекты в дочерний classloader.
А вообще, с Bukkit завязывайте. За его поддержку будете расплачиваться написанием кучи костылей.
Зависит от прямых рук. Если руки прямые, то независимо Bukkit сервер или другие площадки, сделать можно многое...
Не все можно сделать ивентами. Инжект позволяет сделать прямое общение с плагином, что куда проще пакетной системы. Достаточно сделать заготовки и вперед.
 
1,074
72
372
Зависит от прямых рук. Если руки прямые, то независимо Bukkit сервер или другие площадки, сделать можно многое...
Не все можно сделать ивентами. Инжект позволяет сделать прямое общение с плагином, что куда проще пакетной системы. Достаточно сделать заготовки и вперед.
Прямота рук никак не исправит ущербность API, изначально не имеющего поддержки модов.
Через ивент общение тоже будет прямым. Ивенты существуют не только для того чтобы их менять, есть ещё возможность менять их свойства.
p.s. Сообщение по пакетную систему здесь вообще не к месту было. Это уже совсем другое, про взаимодействие клиента с сервером.
 
21
2
Всё же общаться с плагинами универсально и проще при помощи ивентов
Не очень понимаю, как ты собираешься посредством событий Forge получить такие данные как баланс игрока (vault), флаги региона?
 
1,074
72
372
Не очень понимаю, как ты собираешься посредством событий Forge получить такие данные как баланс игрока (vault), флаги региона?
А никак. Нужно bukkit-события отправлять, писать связующий плагин, что их будет обрабатывать.
С получением баланса игрока был приведён простенький пример. А если нужно возвращать или передавать объектный тип, например, список регионов? Его тоже придётся оборачивать в интерфейс и так с каждым классом плагина.

Я лишь высказал своё мнение по поводу присутствия Bukkit. Если нравится сидеть на китайский «франкештейнах» – пожалуйста, сидите. Как человек, исправивший много ошибок в ядре, я прекрасно знаю, чего стоит поддержка Bukkit.
 
21
2
А никак. Нужно bukkit-события отправлять, писать связующий плагин, что их будет обрабатывать.
Тоже как вариант конечно, но думаю вариант с инжектом ТС и другим людям покажется проще и понятнее.


Я лишь высказал своё мнение по поводу присутствия Bukkit. Если нравится сидеть на китайский «франкештейнах» – пожалуйста, сидите. Как человек, исправивший много ошибок в ядре, я прекрасно знаю, чего стоит поддержка Bukkit.
Отказаться от него тоже не так просто бывает, особенно когда сервер стоит на этой связке уже не один год.
 
7,099
324
1,510
баланс игрока (vault)
Щито поделать, нужно будет обращаться к его апи
А если поменять плагин на другой, у которого флаги другие или их ваще нет? Поэтому хорошей идеей будет вообще не опираться на флаги
 
21
2
Щито поделать, нужно будет обращаться к его апи
Расскажешь как обратиться к плагину из мода без инжекта? Мне бы это упростило жизнь в будущем.

А если поменять плагин на другой, у которого флаги другие или их ваще нет? Поэтому хорошей идеей будет вообще не опираться на флаги
Инжектишь классы другого плагина и используешь в нем то, что тебе необходимо. Там нет строгой привязки же к конкретным плагинам.
 
Сверху