Получение protected-полей родителя (Mixins)

Версия Minecraft
1.16.2
83
4
23
Кто-нибудь знает как получить нужное поле, используя Миксины?
Суть в том, что мне нужно получить TradersOfferList из MerchantScreen. В классе MerchantScreen его получают таким образом:
TraderOfferList traderOfferList = ((MerchantScreenHandler)this.handler).getRecipes();. Проблема в том, что handler является полем класса-наследника HandledScreen<MerchantScreenHandler>. В дисорде SpongePowered мне сказали "смешать" в целевой класс MerchantScreen несколько акцессоров для переменных, затем расширить этот миксин и тогда я смогу вызвать эти акцессоры.
Я вообще сделал так:
Java:
@Mixin(MerchantScreen.class)
public abstract class MixinMerchantScreen extends HandledScreen {
    public MixinMerchantScreen(ScreenHandler handler, PlayerInventory inventory, Text title) {
        super(handler, inventory, title);
    }
    
    public MerchantScreenHandler getHandler() {
        return ((MerchantScreenHandler)this.handler);
    }
}
Но мне сказали что это неверно и что нужно "Mix in to HandledScreen to expose what you want"

Сейчас я сижу с этим, и не знаю куда мне двигаться дальше:

Java:
@Mixin(MerchantScreenHandler.class)
public class MixinMerchantScreenHandler {
    @Shadow
    @Final
    private Trader trader;

    public Trader getTrader() {
        return this.trader;
    }
    
    public TraderOfferList getOffers() { return this.trader.getOffers(); }
}
 
Решение
Java:
@Mixin(HandledScreen.class)
public class MixinHandledScreen implements IMixinHandledScreen {
    @Shadow
    public TradersOfferList traders;
  
    @Override
    public TradersOfferList getTraders() {
        return traders;
    }
}

// Где-то вне папки mixin
public interface IMixinHandledScreen {
    public TradersOfferList getTraders();
}

Затем где ты хочешь берёшь свой handle и кастишь не MixinHandledScreen, а IMixinHandledScreen с получением уже не traders, а getTraders() и вуаля!

Либо ты можешь без интерфейса такое же сделать, только наследоваться тебе придётся от MixinHandledScreen в MixinMerchantScreenHandler

Второй вариант кстати как раз то, что тебе нужно

Вот второй вариант
Java:
@Mixin(HandledScreen.class)
public class...

Icosider

Kotliner
Администратор
3,601
99
664
Java:
@Mixin(HandledScreen.class)
public class MixinHandledScreen implements IMixinHandledScreen {
    @Shadow
    public TradersOfferList traders;
  
    @Override
    public TradersOfferList getTraders() {
        return traders;
    }
}

// Где-то вне папки mixin
public interface IMixinHandledScreen {
    public TradersOfferList getTraders();
}

Затем где ты хочешь берёшь свой handle и кастишь не MixinHandledScreen, а IMixinHandledScreen с получением уже не traders, а getTraders() и вуаля!

Либо ты можешь без интерфейса такое же сделать, только наследоваться тебе придётся от MixinHandledScreen в MixinMerchantScreenHandler

Второй вариант кстати как раз то, что тебе нужно

Вот второй вариант
Java:
@Mixin(HandledScreen.class)
public class MixinHandledScreen {
    @Shadow
    public TradersOfferList traders;
}

@Mixin(MerchantScreen.class)
public class MixinMerchantScreen extends MixinHandledScreen {
    public void someMethod() {
        traders.doSomething();
    }
}

Отличия двух примеров в том, что:
Первый вариант необходим для внешних каких-либо взаимодействий со смешанным классом
Второй вариант необходим для получения из родителей каких-либо полей, методов и т.п. вещей
 
Последнее редактирование:
Сверху