Перезапись метода с помощью Mixin

Версия Minecraft
1.12.2
API
Forge
Привет, я в моддинге относительно недавно и вот возникла задача - отменить сброс погоды после сна игрока. Свои попытки разделю на три варианта.

Я взял MCP от 1.12, впихнул MCP-SRG и маппинги как у Forge. Нашёл нужный класс, сделал правки, получил пару обфусцированных классов. Вставил их в Jar, игра запускается (благо о нужных аргументах для отключения проверок знаем) но краш при входе в мир. Правка - вырезать к чертям кусок кода (проверка и выполнение метода сброса погоды):
Java:
protected void wakeAllPlayers()
    {
        this.allPlayersSleeping = false;

        for (EntityPlayer entityplayer : this.playerEntities.stream().filter(EntityPlayer::isPlayerSleeping).collect(Collectors.toList()))
        {
            entityplayer.wakeUpPlayer(false, false, true);
        }

        if (this.getGameRules().getBoolean("doWeatherCycle"))
        {
            this.resetRainAndThunder();
        }
   
    //Вырезать кусок кода вверху
   
    }

Взять и через @overwrite перезаписать сам метод сброса погоды (resetRainAndThunder) сделав мод с миксином. Формально, такой костыль работает, но не работает команда /weather clean.

Сделать то же, что и в первом варианте, но в моде и через Mixin с перезаписью метода на свой с вырезанным участком сброса погоды. Тогда вопрос, как написать свой вариант метода? В ванили он вызывает другие методы через this и если оставить просто копию метода то среда естественно жалуется:
Screenshot_1.png

Screenshot_2.png

Весь день курю эту вроде бы небольшую манипуляцию с ванильным кодом.
 

will0376

Токсичная личность
2,078
55
585
быстро пробежав по теме отмечу:
1. могут ломаться маппинги. их остаётся или чинить или ручками в method указывать ДВА имени метода(нормальное и обф)
2. для каста к таргету используй Object. т.е. -> ((Target)(Object) this)
3. можно сделать Overwrite, но инжектом.
указываешь at = @AT("HEAD"),
пилишь инжект и при любом выходе из твоего метода - CallbackInfo#cancel()
 
Последнее редактирование:
Object. т.е. -> ((Target)(Object) this)
То-есть, можно оставить
Java:
@Overwrite
    protected void wakeAllPlayers() {
        
        this.allPlayersSleeping = false;

        for (EntityPlayer entityplayer : this.playerEntities.stream().filter(EntityPlayer::isPlayerSleeping).collect(Collectors.toList())) {
            
            entityplayer.wakeUpPlayer(false, false, true);
            
        }
и вне метода связать его this с тем, к которому привязан ванильный метод?

PS: задача лёгкая, но мои познания в Mixin начались только сегодня.
 

will0376

Токсичная личность
2,078
55
585
и вне метода связать его this
?????
Логика миксинов проста. он подмешивает код, который ты пишешь в своём миксин-классе в таргет. изменяя его с учётом аннотаций и т.п.
т.е. (Target)(Object)this будет валидным в момент исполнения кода(и среда его схавает). Но при этом сам миксин класс будет выгружен из памяти после его (бес)успешного микширования
 
?????
Логика миксинов проста. он подмешивает код, который ты пишешь в своём миксин-классе в таргет. изменяя его с учётом аннотаций и т.п.
т.е. (Target)(Object)this будет валидным в момент исполнения кода. Но при этом сам миксин класс будет выгружен из памяти после его (бес)успешного микширования
Уже это не важно, я уже понял как это использовать и это уже работает. Осталось отключить возможность спать при дожде/грозе, вот курю ищу нужные методы/классы. Никак не могу найти связь грозы и возможности спать при ней... Перерыл пару десятков классов...
 
Последнее редактирование:
UP: отключить сброс погоды при сне удалось, осталось понять как запретить спать при грозе а то получаеться... Дюп для пропуска кучи дней?

Неясно где это реализовано, разрешение на сон встречается в десятке классов и сотне методов, может кто знает где копать?
 
88
4
6
Вырезать две инструкции - это тривиальная задача для ASM, а вы в свои миксины лезете... Легкие пути не для вас.
Mixin проще для изучения и быстрее получается вырезать что-нибудь Inject'ом, нежели ASM, который фиг выучишь... И если вы кроме 1.7.10 нечего не видели, то сочувствую.
 
Последнее редактирование:
88
4
6
Сверху