IReorderingProcessor в String

Версия Minecraft
1.16.5
API
Forge
Как я могу преобразовать IReorderingProcessor в String объект или в текст-компонент?
Мне нужно заменить часть текста, которая находится в процессоре на свою. Как это сделать?
 
Как я могу преобразовать IReorderingProcessor в String объект или в текст-компонент?
Могу ошибаться, но не string не component получить только из IReorderingProcessor нельзя.

Мне нужно заменить часть текста, которая находится в процессоре на свою. Как это сделать?
Покажи код, уверен, это можно сделать по другому.
 
Как выше написал получить не получится, но, если это миксины то IReorderingProcessor можно поменять на свой(А в своем отфильтровать(хотя это либо не получится, либо получится, но не до конца)) с помощью @ModifyVariable.

Ещё можно взять тот же метод но с String.
 
@Mr.Toad,
Делаю через хуки, основная задача - менять запрещённый текст во всех элементах игры. Будь то это таблички или чат, или названия предметов. Но вот как раз для чата и табличек, вроде как, используется именно эта перегрузка drawShadow, поэтому другой метод не вариант. Есть ли другой способ реализации этой задачи?
 
Java:
@Mixin(FontRenderer.class)
public class FontRendererMixin {

    @Shadow
    public int drawShadow(MatrixStack p_238407_1_, IReorderingProcessor p_238407_2_, float p_238407_3_, float p_238407_4_, int p_238407_5_) {
        return 0;
    }

    @Overwrite
    public int drawShadow(MatrixStack p_238407_1_, IReorderingProcessor p_238407_2_, float p_238407_3_, float p_238407_4_, int p_238407_5_) {
        String originalText = p_238407_2_.getString();
        String modifiedText = originalText.replace("что меняем", "на что меняем");
        Component textComponent = new TextComponent(modifiedText);
        return this.drawInternal(textComponent, p_238407_3_, p_238407_4_, p_238407_5_, p_238407_1_.last().pose(), true);
    }
}

с миксинами
 
Можешь конечно похукать, но с миксинами чуть проще будет как мне кажется.


Java:
 @SubscribeEvent
 public void onLaunch(LaunchEvent event) {
        FMLModContainer modContainer = FMLLoader.getModContainer("модИД");
        ModLoader.getModList().getMod("модИД").getModContainer().getMod().getClass().getClassLoader();
        Class<?> fontRendererClass = Class.forName("net.minecraft.client.renderer.FontRenderer");
        Method drawShadowMethod = MethodUtils.getAccessibleMethod(fontRendererClass, "drawShadow", MatrixStack.class, IReorderingProcessor.class, float.class, float.class, int.class);
        Hook hook = new Hook(drawShadowMethod, new DrawShadowHook());
        hook.inject();
}

class DrawShadowHook {
    @Inject(method = "drawShadow", at = @At("HEAD"))
    public void drawShadowHook(MatrixStack matrixStack, IReorderingProcessor reorderingProcessor, float x, float y, int color, CallbackInfo info) {
        String originalText = reorderingProcessor.getString();
        String modifiedText = originalText.replace("что меняем", "на что меняем");
        Component textComponent = new TextComponent(modifiedText);
        info.setResult(FontRenderer.getInstance().drawInternal(textComponent, x, y, color, matrixStack.last().pose(), true));
    }
}
 
Java:
@Mixin(FontRenderer.class)
public class FontRendererMixin {

    @Shadow
    public int drawShadow(MatrixStack p_238407_1_, IReorderingProcessor p_238407_2_, float p_238407_3_, float p_238407_4_, int p_238407_5_) {
        return 0;
    }

    @Overwrite
    public int drawShadow(MatrixStack p_238407_1_, IReorderingProcessor p_238407_2_, float p_238407_3_, float p_238407_4_, int p_238407_5_) {
        String originalText = p_238407_2_.getString();
        String modifiedText = originalText.replace("что меняем", "на что меняем");
        Component textComponent = new TextComponent(modifiedText);
        return this.drawInternal(textComponent, p_238407_3_, p_238407_4_, p_238407_5_, p_238407_1_.last().pose(), true);
    }
}

с миксинами
в том как раз и проблема - у IReorderingProcessor нет метода getString()
 
Что мешает поставить условие if(reorderingProcessor instanceof TextComponent)?
Могу ошибаться, но IReorderingProcessor это функциональный интерфейс который не имплементируется.

менять запрещённый текст во всех элементах игры
Остается менять drawShadow(String...), а в других случаях(табличка) делать отдельные миксины(тут не захукаешься уж никак)
 
функциональный интерфейс который не имплементируется.
С каких это пор нельзя интерфейсы реализовывать? Всё можно.

Единственная загвоздка, которая может возникнуть - дерево наследования. А точнее, наследуется ли StringComponent (или TextComponent) от IReorderingProcessor. У меня под рукой нет среды с 1.16.5, тут только на ваши слова можно ориентироваться.
 
Что мешает поставить условие if(reorderingProcessor instanceof TextComponent)?
TextComponent не является реализацией IReorderingProcessor.
Насколько я знаю, можно только TextComponent перевести в IReorderingProcessor через #getVisualOrder, но обратно даже не представляю как вытащить строку из этой абстрактной помойки
 
Последнее редактирование:
в целом можно попробовать копнуть в класс TextProcessing, который собственно и работает с IReorderingProcessor, и итеративно посимвольно определять твой "запрещенный" текст. либо миксины прокинуть туда в каждый метод, где есть строчный параметр, и модифицировать каждую строку в начале метода🤡🤡
 
Назад
Сверху