Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Могу ошибаться, но не string не component получить только из IReorderingProcessor нельзя.Как я могу преобразовать IReorderingProcessor в String объект или в текст-компонент?
Покажи код, уверен, это можно сделать по другому.Мне нужно заменить часть текста, которая находится в процессоре на свою. Как это сделать?
@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);
}
}
@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));
}
}
в том как раз и проблема - у IReorderingProcessor нет метода getString()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); } }
с миксинами
if(reorderingProcessor instanceof TextComponent)
?Могу ошибаться, но IReorderingProcessor это функциональный интерфейс который не имплементируется.Что мешает поставить условиеif(reorderingProcessor instanceof TextComponent)
?
Остается менять drawShadow(String...), а в других случаях(табличка) делать отдельные миксины(тут не захукаешься уж никак)менять запрещённый текст во всех элементах игры
С каких это пор нельзя интерфейсы реализовывать? Всё можно.функциональный интерфейс который не имплементируется.
TextComponent не является реализацией IReorderingProcessor.Что мешает поставить условиеif(reorderingProcessor instanceof TextComponent)
?