Добавление своих переменных в классы (трансформеры)

Добавление своих переменных в классы (трансформеры)

Нет прав для скачивания
Версия(и) Minecraft
1.6+
Вступление
Хочу представить вам небольшую утильку, которую я написал на днях интереса ради. Она является своеобразным расширением для хуклибы Глуми Фолкена и позволяет вставлять свои поля в классы майнкрафта или других модов. Конечно, вы можете использовать её саму по себе, однако большой пользы вам от этого не будет.

Итак, что это такое и с чем его едят?
Как вы, возможно, знаете, а может и нет, фордж предоставляет нам возможность менять загружаемые классы на стадии их загрузки, и называется это трансформеры. Более подробно об этом рассказано по ссылке выше, а также в этом туториале от JustAGod.
Зачем это может понадобится именно вам? Например, чтобы избавиться от странных и сложных аттрибутов/IEEP, упростить получение каких-то данных или обеспечить их хранение в нужном вам классе (игроке, блоке, т.д.), а не непонятно где.

Как это делается?
Да очень просто, особенно для тех, кто уже работал с хуклибой Фолкена.
Добавлять их будем в другой тестовый класс, в котором уже есть какое-то поле:
Java:
package asm.tutorial;
public class ASMTestClass {
    private int some;
}

Теперь создаём отдельный класс и пишем в него любые переменные с любыми модификаторами, именами и типами, которые только придут вам в голову...
Однако, в отличии от хуклибы, у поля нет параметра, в который можно было бы положить инструкцию в какой именно класс нужно засунуть наши поля. Для этого используется аннотация @HookField с единственным параметром - именем целевого класса. Запись проста - сначала идёт пакет, потом точка и название класса.

Для примера я сделал класс, которой будет добавлять два поля в наш тестовый класс:
Java:
package asm.tutorial;
public class ASMExample {
    @HookField(targetClassName = "asm.tutorial.ASMTestClass")
    public int test;
    @HookField(targetClassName = "asm.tutorial.ASMTestClass")
    public static Integer Itest;
}

Теперь откройте (или создайте) ваш класс-наследник IFMLLoadingPlugin'а (или HookLoader'а, если вы уже используете либу Глуми, что я крайне вам рекомендую). В ваш массив классов-трансформеров добавьте новый элемент ASJASM.class.getName(). ASJASM - это название главного класса утилиты. Можете разместить его в любом месте вашего проекта.

Теперь дело за малым - зарегистрировать ваш класс с хуками. Сделать это можно в методе injectData (или registerHooks в случае, если у вас есть хуклиба). В итоге класс будет выглядеть примерно примерно так:
Java:
class YourIFMLLoadingPlugin implemenst IFMLLoadingPlugin {
    public String[] getASMTransformerClass() {
        return new String[] { ASJASM.class.getName(), ... };
    }

    public void injectData(Map<String, Object> data) {
        ASJASM.registerFieldHookContainer("asm.tutorial.ASMExample");
    }

    // ...
}

// или, если у вас есть хуклиба:
class YourHookLoader extends HookLoader {
    public String[] getASMTransformerClass() {
        return new String[] {PrimaryClassTransformer.class.getName(), ASJASM.class.getName()};
    }

    public void registerHooks() {
        ASJASM.registerFieldHookContainer("asm.tutorial.ASMExample");
    }
}

Вот и всё. Теперь в рантайме в классе ASMTestClass вместо одного поля будет целых три. Достать их оттуда можно той же рефлексией:
Java:
  ReflectionHelper.findField(ASMTestClass.class, "Itest").set(new ASMTestClass(), new Integer(5));

Скачать
Скачать ASJASM и прилагающиеся к нему тестовые классы можно по ссылке в описании.
Автор
AlexSoсol
Скачивания
18
Просмотры
1,271
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя AlexSoсol

Сверху