- Версия(и) Minecraft
- 1.6+
Вступление
Хочу представить вам небольшую утильку, которую я написал на днях интереса ради. Она является своеобразным расширением для хуклибы Глуми Фолкена и позволяет вставлять свои поля в классы майнкрафта или других модов. Конечно, вы можете использовать её саму по себе, однако большой пользы вам от этого не будет.Итак, что это такое и с чем его едят?
Как вы, возможно, знаете, а может и нет, фордж предоставляет нам возможность менять загружаемые классы на стадии их загрузки, и называется это трансформеры. Более подробно об этом рассказано по ссылке выше, а также в этом туториале от JustAGod.Зачем это может понадобится именно вам? Например, чтобы избавиться от
Как это делается?
Да очень просто, особенно для тех, кто уже работал с хуклибой Фолкена.Добавлять их будем в другой тестовый класс, в котором уже есть какое-то поле:
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 и прилагающиеся к нему тестовые классы можно по ссылке в описании.