Я новичок в миксинах и моддинге, помогите пожалуйста!

Версия Minecraft
1.17+
API
Fabric
10
0
Я хочу изменить наковальню таким образом чтобы при комбинировании 2 книг с максимальным зачарованием обходить ограничение максимального зачарования и все равно получать книгу на 1 уровень больше.

Пример:
Защита4 + Защита4 = Защита4 Защита5

Я нашел код который мне нужно изменить, вот он, выделен красным:

1720213750061.png

То есть нужно изменить конкретное if в классе AnvilScreenHandler, в методе updateResult, насколько я понял вот так:
Это:
Java:
if (r > enchantment.getMaxLevel())
{
r = enchantment.getMaxLevel();     
}
На это:
Код:
if (r > enchantment.getMaxLevel())
{
r = r + (enchantment.getMaxLevel() - r);     
}

Как это сделать?

Максимум до чего мой тормознутый мозг дошел это:
Код:
@Mixin(AnvilScreenHandler.class)
public abstract class CombiningBooks {

    @Inject(method = "updateResult", at = @At("RETURN"))
    protected void Injected(CallbackInfo ci)
    {
        int r = 0;
        Enchantment enchantment = null;
        if (r > enchantment.getMaxLevel()) {
            r = enchantment.getMaxLevel();
        }
    }
}

И я даже логикой понимаю что в выделенных мною строках нет никакой логики, и тут ничего работать не будет и не должно, но как мне это сделать? Подскажите пожалуйста, альтернатив как это сделать я вообще не нахожу.
Как достать переменную r из этого кода чтобы ее потом изменить если она обьявлена как int r; внутри метода? Что тут стоит сделать?
 
Как достать переменную r из этого кода чтобы ее потом изменить если она обьявлена как int r; внутри метода? Что тут стоит сделать?
Неправильно инжектишься
нужно @At(value="INVOKE", target="правильная_сигнатура_getMaxLevel") и оно будет перед 9 строкой

Скорее всего тебе лучше подойдет редирект чем инжект
Правильную сигнатуру можешь написать по ОФ. java докам

+ можешь наговнакодить и полностью перезаписать метод через @Overwrite, но оно может поломать что-либо
 
Сделал как ты сказал, у меня есть еще немного кода который позволяет обойти ограничение наковальни в 40 лвлов(Сообщение "Слишком дорого!"), и вот эта часть кода работает прекрасно, наковальня открывается и все работает до тех пор пока я не ставлю 2 книги на защиту 4. Когда их ставлю игра вылетает))).

Код:

Код:
public abstract class CombiningBooks {

    @Inject(method = "updateResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/enchantment/Enchantment;getMaxLevel()I"))
    protected void Injected(CallbackInfo ci)
    {
        int r = 0;
        Enchantment enchantment = null;
        if (r > enchantment.getMaxLevel()) {
            r = enchantment.getMaxLevel();
        }
    }
}

Пока что буду думать сам, но если кто нибудь может помочь буду очень благодарен.

В любом случае спасибо, теперь хоть понимаю что писать в поле target и игра хотябы запускается при моем говнокоде, понимаю куда мне дальше копать.
 
Миксины для такой задачи не очень подходят, метод слишком большой. Только на ASM получится аккуратненько вырезать блок if, не затрагивая метод целиком.
Незаметил сообщение как-то. Тогда попробую поговнить с @overwrite.

Я видел плагин называется EnhancedEnchants, но это плагин, не мод и без исходного кода. Тут человек сделал тоже самое и у него получилось. Слышал что в плагинах в основном можно использовать только миксины поэтому может быть
Миксины для такой задачи не очень подходят, метод слишком большой. Только на ASM получится аккуратненько вырезать блок if, не затрагивая метод целиком.
И кстати. Даже если mixins не подходят, то как это сделать на asm? Есть ли какие либо туториалы?
 
Я думаю что гораздо проще вырезать и найти один блок if чем переписывать целый блок тк:
1. Куча ошибок других модов.
2. Мега тяжело это все переписать
3. Куча ошибок самого майна, плюсом непонятно как добавить и использовать многие другие значения и методы(если знаете как их использовать в своем коде то подскажите)
 
Прочитал какую-то статью про ASM. Это мега сложно и я лучше сделаю как то по другому, и у меня есть еще обходной вариант. Такой мод уже существовал и называется max enchant x. Есть еще пару аналогов но я их не помню. Так вот. Этот мод действительно выполнял свою функцию но изза него жители продавали защиту 15, прочность 9 и тп. Он с исходным кодом и по сути тупо менял json файл майна. И на этот файл ссылалась и наковальня и жители. Если только можно как-то сделать чтобы жители ссылались на мой json файл, а наковальня на json файл minecraft, только измененный. Сейчас буду этим заниматся
 
Я знаю
Я уже решил свою проблему, хоть и костыльно, но лучше чем это сделал любой другой мод для меня. Я выложил его на modrinth, и он с исходным кодом, так что любой желающий может просто посмотреть мой код, и вынести для себя чтото полезное, понять как это работает. Как только админы modrinth его одобрят я скину ссылку сюда.
 
Назад
Сверху