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

Цитату из гайда плез.
В упор не вижу, где такое написано.
 
Может я неправильно интрпретировал, но вот же


Странно кстати, после компиляции тот же код уже не пашет...
Может для хуклибы нужно что то добавить в билд-градле?
 
хм, у меня вопрос - как вставлять хуки в конструкторы? Он требует превращения конструктора в void
 
Maxik001 написал(а):
хм, у меня вопрос - как вставлять хуки в конструкторы? Он требует превращения конструктора в void
Открою страшный секрет: конструктор на самом деле - обычный метод, который называется <init> и возвращает void. Как в них вставлять хуки - был пример тут.
 
Можно еще вопрос? Я так не нашел конкретного описания 
ALWAYS - очевидно, заменяет все содержимое метода на содержимое хук-метода. 
А остальные  returnCondition = ReturnCondition.?
Что означает NEVER?
Что означает ON_TRUE?
Что означает ON_NOT_NULL?
Что означает ON_NOT?


GloomyFolken написал(а):
Maxik001 написал(а):
хм, у меня вопрос - как вставлять хуки в конструкторы? Он требует превращения конструктора в void
Открою страшный секрет: конструктор на самом деле - обычный метод, который называется <init> и возвращает void. Как в них вставлять хуки - был пример тут.

Я слепой, сорян)
 
Код:
/**
 * В зависимости от этого значения после вызова хук-метода может быть вызван return.
 */

public enum ReturnCondition {

    /**
     * return не вызывается никогда.
     */
    NEVER(false),

    /**
     * return вызывается всегда.
     */
    ALWAYS(false),

    /**
     * return вызывается, если хук-метод вернул true.
     * Нельзя применить, если хук-метод не возвращает тип boolean.
     */
    ON_TRUE(true),

    /**
     * return вызывается, если хук-метод вернул null.
     * Нельзя применить, если хук-метод возвращает void или примитив.
     */
    ON_NULL(true),

    /**
     * return вызывается, если хук-метод вернул не null.
     * Нельзя применить, если хук-метод возвращает void или примитив.
     */
    ON_NOT_NULL(true);

    public final boolean requiresCondition;

    ReturnCondition(boolean requiresCondition) {
        this.requiresCondition = requiresCondition;
    }

}
 
Maxik001 написал(а):
ALWAYS - очевидно, заменяет все содержимое метода на содержимое хук-метода. 
Результат зависит также от места вставки
 
Я криворукий человек
Написано вот. Как мне его сгенерировать? Думал, javac DictionaryGenerator.java,но так нельзя. Как это сгенерировать?
"А в идеале - сгенерируйте methods.bin для нужной вам версии MCP самостоятельно. Для этого в сорцах лежит скриптик DictionaryGenerator. Без этого могут возникнуть внезапные ошибки уровня "can not find target method of hook" из-за того, что я генерировал для другой версии MCP."
 
Просто запусти с этого класса. И притяни нужные методы. Где-то в user/.gradle валяются, не помню уже.
 
Dahaka написал(а):
Просто запусти с этого класса. И притяни нужные методы. Где-то в user/.gradle валяются, не помню уже.

Run As -> и дальше запуск? А что значит "притяни нужные методы"? Какие?
Я вообще не представляю, что нужно делать :) Много вопросов у меня будет скорее всего.
 
DictionaryGenerator - это отдельное java-приложение. Создай для него отдельный проект ,скопируй туда этот класс.
 
Уже все сделал. Давно. Сообщение удалить забыл прост
 
И еще, внимание всем кто собирается юзать либу.

Вполне возможно, что чтобы сгенерировать файл methods.bin, вам понадобится прописать полный (от диска тобишь)путь к файлу
methods.csv. Потому что у меня не работало,если класть рядом в папку и запускать.
 
Весьма полезно :)
 
Либо я что то делаю не так, либо время без сна сделало свое дело надо моей сообразительностью. Но вопрос такой: сделать так, что бы метод void вообще не случился? Я хочу не дать майнкрафту дополнить список вещей в креативе зачарованными книжками.
Делаю так, надеясь выйти из метода в самом начале:
Код:
@Hook
 public static void addEnchantmentBooksToList(CreativeTabs ct, List list, EnumEnchantmentType... p_92116_2_)
 {
 return;
 }
Но работать не хочет.
 
Код:
@Hook(returnCondition = ReturnCondition.ALWAYS)
 
Случайно заметил. Версия 1.11.2 или 1.12 другие не пробовал. Код 
Код:
@Hook(createMethod = true, returnCondition = ALWAYS)
public static int idDropped(BlockDirt blockDirt, int meta, Random rng, int fortune) {
   return 2;
}
Не работает. То есть новый метод не создается, я так полагаю. Аналогично не не работает нигде. Устарело или я рукожоп?
 
Maxik001 написал(а):
Случайно заметил. Версия 1.11.2 или 1.12 другие не пробовал. Код 
Код:
@Hook(createMethod = true, returnCondition = ALWAYS)
public static int idDropped(BlockDirt blockDirt, int meta, Random rng, int fortune) {
   return 2;
}
Не работает. То есть новый метод не создается, я так полагаю. Аналогично не не работает нигде. Устарело или я рукожоп?

Остальное работает на твоей версии майна? Глянь сорцы класса Block, небось там просто больше нет этого метода в таком виде (и при этом всё создается, просто не оказывает никакого эффекта - это можно проверить, сдампав классы через -Dlegacy.debugClassLoading=true -Dlegacy.debugClassLoadingSave=true)
 
Остальное работает. Ну даже хорошо, фиг с ним, с дропом. Не работает даже то, что есть в 1.12

Код:
    @Hook(createMethod = true, returnCondition = ReturnCondition.ALWAYS)
   // @Nullable
    public AxisAlignedBB getCollisionBoundingBox(BlockLeaves bl,IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
     System.out.print("COOl");
        return NULL_AABB;
    }

Вот вставляю метод в BlockLeaves, хочу чтобы через листву можно было ходить. Однако не работает. Этого метода нету в BlockLeaves, но есть в Block-е. Аналогично не работает.
 
Назад
Сверху