Mixin с ModifyArg. Изменение участка кода

Версия Minecraft
1.16.5
API
Forge
3
0
Мне нужно поменять "/tell" на "/hist" как работать c Inject я знаю, а что передавать в @At(target="..") и т.д абсолютно не понимаю. Буду очень благодарен.
Вот код самого addTellEvent + mixin target: > Lnet/minecraft/entity/player/PlayerEntity;addTellEvent(Lnet/minecraft/util/text/IFormattableTextComponent;)Lnet/minecraft/util/text/IFormattableTextComponent; <

Java:
private IFormattableTextComponent addTellEvent(IFormattableTextComponent p_208016_1_) {
      String s = this.getGameProfile().getName();
      return p_208016_1_.modifyStyle((p_234565_2_) -> {
         return p_234565_2_.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tell " + s + " ")).setHoverEvent(this.getHoverEvent()).setInsertion(s);
      });
   }
 
433
41
110
и т.д абсолютно не понимаю. Буду очень благодарен.
Java:
@Inject(method = "название-метода", at = @At("HEAD" /*или другая точка*/))
public void твой-метод(параметры-функции, CallbackInfo info){
    ....
}

Можешь полностью перезаписать метод с помощью @Overwrite, только будь готов к возможным ошибкам, если какой-то другой мод будет взаимодействовать с целевым методом

+ Есть очень хороший гайд по миксинам на этом форме, там все понятно
 
3
0
Функция возвращает параметр, поэтому не Inject. ModifyArg вот че мне надо, я не знаю как сделать это. Я уже 3 час сижу в дискорде фабрика, мне косвенно подсказывают, вместо того чтоб дать решение, код с нормальным объяснением.
 
1,371
112
241
+ Есть очень хороший гайд по миксинам на этом форме, там все понятно
У fabric на вики очень шикарный гайд по ним.

Функция возвращает параметр, поэтому не Inject.
На самом деле, и с Inject тоже можно.
Миксин в World.class:
@Inject(method = "hasRain", at = @At("HEAD"), cancellable = true)
    private void hasRain(BlockPos pos, CallbackInfoReturnable<Boolean> info) {
        if(world.getRegistryKey() == ARDUA && pos.getY() >= 507)
            info.setReturnValue(false);
    }
 
3
0
Спасибо. С setReturnValue и правда сработало. Не подскажите тогда еще как импортировать из другого класса какие-то переменные через Mixin? Мне нужно получить getGameProfile ( который есть в классе EntityPlayer ) и getHoverEvent, которого уже нет в 1702219266840.pngile1702219367093.png1702219453880.png
 
1,371
112
241
Сделай следующее поле и обращайся к нему (для паблик методов):
private final PlayerEntity INSTANCE = (PlayerEntity)(Object)this; - костыльный вариант.
UPD. @Shadow для этого используй.

Для приватных юзай Accesor'ы.
 
Последнее редактирование:
433
41
110
Сделай следующее поле и обращайся к нему (для паблик методов):
private final PlayerEntity INSTANCE = (PlayerEntity)(Object)this;
Зачем такой костыль? Достаточно унаследовать родительский класс, к public/protected методам которого хочешь обратится
 
1,371
112
241
не целевой клас а его родителя
Метод полурабочий.
Если нужен метод именно класса, в который ты инжектишься (и у родителя которого нет этого метода) - только так. Если есть иной рабочий способ - буду рад узнать.
 
433
41
110
в который ты инжектишься
А для этого есть аннотация @Shadow хоть приватные - главное чтобы были в целевом классе

Аксесс-трансформеры нужны (не всегда, миксины можно наследовать от других миксинов) только если ты хочешь использовать родительские приватные поля, в целевом классе-миксине
 
Сверху