[Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры)

7,099
324
1,510
Что значит "неявно трогать"?
У меня в коде встречаются обращения к полям объекта, все пашет нормально, правда, там нету обращений к полям полей.
Например, вот так:
Код:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static boolean acceptUraniumPulse(ItemReactorUranium item, IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, int pulseX, int pulseY, boolean heatrun){
        if (!heatrun) {
            if(item.numberOfCells==1){
                reactor.addOutput(2F);

            }
 
7,099
324
1,510
А, понятно, ну так ты его можешь рефлексией загрузить


Попробуй так:

Код:
static String classLoaded=null;

//в начале хук-метода
if(classLoaded==null)
classLoaded=Class.forName("...").getName()
 
2,505
81
397
Agravaine написал(а):
Ну блин, класс EntityPlayer еще не загрузился, а я его дергаю в переменной.
Т.е. NetHandlerPlayServer загрузился, а EntityPlayer, который находится непосредственно в нем - нет? Как-то странно.
 
476
9
39
Такой мега вопрос. Как юзать this. Очень часто можно встретить этот код, естественно JVM такой псевдо код пошлёт в пятую точку. Без какой-то реализации this. Или нужно каждый метод, как вариант за asm'ить и тогда он сможет у компилятора не будет вопросов то первого исполнения кода. Можно, конечно, как вариант юзануть reflectionapi, но я слышал с 9 версии джавы, там будет изменен подход к protected и private методам и переменным. Точно что там не знаю.
 
2,505
81
397
Первым параметром в хуке идет объект класса, в котором находится целевой метод. Это и есть this
 
476
9
39
Dahaka написал(а):
Первым параметром в хуке идет объект класса, в котором находится целевой метод. Это и есть this

Он не видит protected и private, что естественно.
 
2,505
81
397
Используй Access Transformers, чтобы сделать нужные поля и методы public
 
7,099
324
1,510
Запилишь по ним гайд?
 
2,505
81
397
Я уже где-то писал пару слов на форуме. Ну в новом учебнике может запилю.
 
3,005
192
592
7,099
324
1,510
Я видел, у меня не заработало
 
14
0
Тут такое дело, Нужно впатчить в метод выполнения метода с использованием не статических переменных
@Hook
public static void некийметод(Некийкласс класс, НеважноЧто н) {
Мойметод(this.Переменная из Некийкласс );
}
 
7,099
324
1,510
класс==this
 
7,099
324
1,510
Первый аргумент в хуке - это и есть this
 
7,099
324
1,510
hohserg написал(а):
Код:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static boolean acceptUraniumPulse(ItemReactorUranium item, IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY, int pulseX, int pulseY, boolean heatrun){
        if (!heatrun) {
            if(item.numberOfCells==1){
                reactor.addOutput(2F);

            }
Вот этот [font=Monaco, Consolas, Courier, monospace]item - это экземпляр класса [size=small][font=Monaco, Consolas, Courier, monospace]ItemReactorUranium.[/font][/font][/size]
 
14
0
Все понял, вопрос отпал.


Новый касяк, что делать, если переменный private?
 
808
3
124
alex0 написал(а):
Новый касяк, что делать, если переменный private?

Если 1.7+ (и нет сорцев майна в проекте) - кури Access Transformer'ы

Если 1.6 или ниже - можешь просто у себя в сорцах майна заменить private/protected на public и собрать мод. Фордж делает всё то же самое на запуске майна.
 
Сверху