- 5,018
- 47
- 783
Мне потребовалось вставить хук в рендер предмета, чтобы там рендерить текст на нем(на предмете)
Вот собственно, нужный мне метод(если я правильно понял, рисовка предмета от первого лица в руке происходит именно тут) в классе ItemRenderer. Я ноль в ASM, но слышал, что можно заюзать хуклибу, что я собственно и сделал. Установил все правильно, что подтверждается рабочими примерами GloomyFolken
Итак, я все установил, сделал, как написано в инструкции, метод с аннотацией @Hook, закинул туда простейший рендер текста
Первым аргументов прописал целевой класс. В итоге, в консоли дикий флуд от клиента "hook!", но текста на предмете не появилось.(я так понял, должно на любом предмете появлятся)Что я делаю не так?
Код:
public void renderItemInFirstPerson(float partialTicks)
{
AbstractClientPlayer abstractclientplayer = this.mc.player;
float f = abstractclientplayer.getSwingProgress(partialTicks);
EnumHand enumhand = (EnumHand)Objects.firstNonNull(abstractclientplayer.swingingHand, EnumHand.MAIN_HAND);
float f1 = abstractclientplayer.prevRotationPitch + (abstractclientplayer.rotationPitch - abstractclientplayer.prevRotationPitch) * partialTicks;
float f2 = abstractclientplayer.prevRotationYaw + (abstractclientplayer.rotationYaw - abstractclientplayer.prevRotationYaw) * partialTicks;
boolean flag = true;
boolean flag1 = true;
if (abstractclientplayer.isHandActive())
{
ItemStack itemstack = abstractclientplayer.getActiveItemStack();
if (itemstack != null && itemstack.getItem() == Items.BOW) //Forge: Data watcher can desync and cause this to NPE...
{
EnumHand enumhand1 = abstractclientplayer.getActiveHand();
flag = enumhand1 == EnumHand.MAIN_HAND;
flag1 = !flag;
}
}
this.rotateArroundXAndY(f1, f2);
this.setLightmap();
this.rotateArm(partialTicks);
GlStateManager.enableRescaleNormal();
if (flag)
{
float f3 = enumhand == EnumHand.MAIN_HAND ? f : 0.0F;
float f5 = 1.0F - (this.prevEquippedProgressMainHand + (this.equippedProgressMainHand - this.prevEquippedProgressMainHand) * partialTicks);
if(!net.minecraftforge.client.ForgeHooksClient.renderSpecificFirstPersonHand(EnumHand.MAIN_HAND, partialTicks, f1, f3, f5, this.itemStackMainHand))
this.renderItemInFirstPerson(abstractclientplayer, partialTicks, f1, EnumHand.MAIN_HAND, f3, this.itemStackMainHand, f5);
}
if (flag1)
{
float f4 = enumhand == EnumHand.OFF_HAND ? f : 0.0F;
float f6 = 1.0F - (this.prevEquippedProgressOffHand + (this.equippedProgressOffHand - this.prevEquippedProgressOffHand) * partialTicks);
if(!net.minecraftforge.client.ForgeHooksClient.renderSpecificFirstPersonHand(EnumHand.OFF_HAND, partialTicks, f1, f4, f6, this.itemStackOffHand))
this.renderItemInFirstPerson(abstractclientplayer, partialTicks, f1, EnumHand.OFF_HAND, f4, this.itemStackOffHand, f6);
}
GlStateManager.disableRescaleNormal();
RenderHelper.disableStandardItemLighting();
}
Итак, я все установил, сделал, как написано в инструкции, метод с аннотацией @Hook, закинул туда простейший рендер текста
Код:
@Hook
public static void renderItemInFirstPerson(ItemRenderer ir,float partialTicks){
GL11.glPushMatrix();
GL11.glEnable(GL11.GL_BLEND);
System.out.println("hook!");
FontRenderer fontrenderer = Minecraft.getMinecraft().fontRendererObj;
fontrenderer.drawString("Hello World!", 17, 5, 0xFFFFFF);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
}
Первым аргументов прописал целевой класс. В итоге, в консоли дикий флуд от клиента "hook!", но текста на предмете не появилось.(я так понял, должно на любом предмете появлятся)Что я делаю не так?