Как сделать мод, меняющий ванильные файлы, не трогая исходники? 1.6.4

Добрый день!

Я перерыл весь форум и решенные вопросы, но так и не смог найти ответ на свой вопрос...
Прошу меня извинить, если повторяюсь :с

У меня почти нет навыков в Джаве, но есть опыт создания модов для МодЛодера на 1.4.7.
Сегодня я первый раз установил Фордж на 1.6.4 и пытаюсь создать собственный мод.

Я уже разобрался, как создавать свой блок\предмет и добавлять его в игру.
Но я хочу научиться создавать еще и моды, способные изменять исходные ванильные файлы.

Для примера я взял файл FoodStats, отвечающий за еду.
В нем я убрал строчки кода, отвечающие за то, что здоровье начинает восстанавливаться, если шкала еды заполнена на 18 и более. Чтобы здоровье восстанавливалось только зельями\золотыми яблоками\аптечками из модов и играть было сложнее.

Потом я сделал рекомпиляцию и запустил клиент. Игра запустилась нормально и здоровье реально перестало восстанавливаться вне зависимости от шкалы голода. Точно то же  самое я делал ранее на 1.4.7.

А вот тут начались сложности:
На 1.4.7 было достаточно сделать реобфускацию и закинуть измененный файл в minecraft.jar своего Майнкрафта.
Но на 1.6.4, как я понял, исходный код трогать нельзя и любые изменения должны быть сделаны в виде мода, запакованы в Zip и отправлены в папку Mods.

А вот как правильно указать эти изменения так, чтобы Фордж "видел" их - я не знаю.

Подскажите пожалуйста, каким образом это делается. В интернете тоже почти ничего не нашел. Возможно просто не то ищу :\

Заранее спасибо!
 
Agravaine написал(а):
Сразу скажу, что возиться с байт кодом сложно.
Вот уроки, можешь посмотреть: https://www.youtube.com/watch?v=FgaxnpD-DC4
Рекомендую javassist.

Спасибо! Сейчас посмотрю.

А разве нет в Фордже какой-либо команды, которая позволяет "показать" ему файл в папке с модом, который необходимо прочитать вместо файла с аналогичным названием в самом Майнкрафте?
 
Agravaine написал(а):
Совместимость ломается. А если два мода заменят один и тот же файл? Все сломается к чертям.

Хм...
А почему тогда раньше, до версий 1.6.х можно было легко менять исходные файлы?
 
Agravaine написал(а):
Сразу скажу, что возиться с байт кодом сложно.
Вот уроки, можешь посмотреть: https://www.youtube.com/watch?v=FgaxnpD-DC4
Рекомендую javassist.
На русском такое есть?
Через такое и делаются читы?
 
Тебе может понадобится это 
http://asm.ow2.org/jdiff223to31/ASM 2.2.3/constant-values.html#org.objectweb.asm.Opcodes.ARETURN
http://www.0zd.ru/programmirovanie_kompyutery_i/assembler_dlya_platformy_java.html
Еще есть отличная либа от глуми как раз под эти цели http://forum.mcmodding.ru/viewtopic.php?id=2629
И дракон когда то писал как удалить метод
Код:
public class Transformer implements IClassTransformer {
    @Override
    public byte[] transform(String s, String s2, byte[] bytes) {
        //Если класс наш - делаем с ним все что надо, а если нет - нафиг его.
        //Type.getInternalName дает нам путь к классу, в скомпилированной среде. То есть в эклипсе прокатит net.minecraft.item.ItemSword, а в скомпилированном только net/minecraft/item/ItemSword.
        if (s.equals(Type.getInternalName(ItemSword.class)) || s2.equals(Type.getInternalName(ItemSword.class)) || s.equals("net.minecraft.item.ItemSword") || s2.equals("net.minecraft.item.ItemSword")) {
            //Создаем считыватель классов из байтов.
            ClassReader reader = new ClassReader(bytes);
            //Создаем, так сказать 'класс'.
            ClassNode clazz = new ClassNode();
            //Реадер передает этому классу инфу у том что он считал. То есть сейчас clazz это класс net.minecraft.item.ItemSword
            reader.accept(clazz, 0);

            //Тут мы и будем мутить то что нам надо.
            //Перебераем методы из класса.
            for(MethodNode method : clazz.methods) {
                //Если имя метода addInformation, то делаем то что нам надо.
                //Тут еще должно быть егюалс на обфуцированное имя метода, но мне лень искать обфуцированное имя метода addInformation
                if(method.name.equals("addInformation")) {
                    //Удалем метод из класса.
                    clazz.methods.remove(method);
                }
            }

            //Создаем того кто пишет наш класс обратно в байты и не даем ему никаких флагов.
            ClassWriter writer = new ClassWriter(0);
            //Говорим ему трансформировать наш класс назад в байты.
            clazz.accept(writer);
            //Возвращаем наши байты.
            return writer.toByteArray();
            
        } else {
            return bytes;
        }
    }
}

И еще тебе маппинги понадобятся (это обф. имена методов/классов)
[font=Verdana, Helvetica, Arial, sans-serif]Маппинги на 1.6.4[/font]
[font=Verdana, Helvetica, Arial, sans-serif]Маппинги на 1.7.10[/font]
[font=Verdana, Helvetica, Arial, sans-serif]Маппинги на 1.8[/font]

Еще я тебе в личку кинул свои наброски в которых я учил asm и попутно разбирал код
 
Назад
Сверху