[Хук] Не работает, работая.

Версия Minecraft
1.11.2
5,018
47
783
Мне потребовалось вставить хук в рендер предмета, чтобы там рендерить текст на нем(на предмете)
Код:
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();
    }
Вот собственно, нужный мне метод(если я правильно понял, рисовка предмета от первого лица в руке происходит именно тут) в классе ItemRenderer. Я ноль в ASM, но слышал, что можно заюзать хуклибу, что я собственно и сделал. Установил все правильно, что подтверждается рабочими примерами GloomyFolken
Итак, я все установил, сделал, как написано в инструкции, метод с аннотацией @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!", но текста на предмете не появилось.(я так понял, должно на любом предмете появлятся)Что я делаю не так?
 
216
6
19
Рендер текста нужно вставлять не просто в абы-как в метод, а в определенное место.
Попробуй скопировать ванильный метод, в нем прописать код, вставить в хук и после кода написать return;

(Вроди глуми не добавлял возможности вставлять хук в определенное место (либо выход/либо вход в метод только))
 
5,018
47
783
Так как мне вставить в определенное место?(если например, даже это не предусмотрено)
 
216
6
19
Копируешь весь код метода из ванилы -> вставляешь его хуком в начало метода -> приписываешь туда нужный код -> после завершения работы вставленного тобою кода пишешь return;

P.S. Возможно, глуми меня бы сейчас пальками забил, но я вижу только такой выход..
 
5,018
47
783
Тут не прокатит так. Смотри, в этом методе есть много this, а они со статическим методом не дружат.(а может и дружат, но в данном случае нет)


В противном случае, если их поубирать... Много методов придется перетаскать себе.
 
5,018
47
783
Agravaine написал(а):
this у тебя в аргументе хука - ItemRenderer ir.

Я не могу их убрать. Мне придется тогда также копировать методы
Код:
rotateArroundXAndY(f1, f2);
setLightmap();
rotateArm(partialTicks);
prevEquippedProgressMainHand
equippedProgressMainHand
и еще штук 10. Зачем они мне все нужны? 
Либо я чего то не понимаю
 
216
6
19
Смотри, ты можешь, так скажем, "отрендерить текст по позиции предмета в пространстве", а потом вызвать сам рендер предмета. То бишь тебе нужно сейчас отфильтровать методы и код, которые отвечают за задание позиции/размера/поворота предмета в пространстве - оставить их и вызывать там рендер текста. А те, что отвечают за рендер самого предмета (а я как вижу на них в основном жалобы и идут), удалить и вызвать после своего кода.


Придется к себе перенести rotateArroundXAndY(), rotateArm() точно
 
5,018
47
783
Боюсь, я хз, куда тут в определенное место вставлять... P.S Все с ошибками удалять нафиг?
 
5,018
47
783
Ivasik написал(а):
Лол, без хуков можно же-_-

Ты не захотел рассказывать  :sleepy:


Чего, эмм, как? Не понял?
IItemRenderer нету же в 1.11.2


Включаю логику - я что то слышал про "слои" и рендер чего либо на сущности... С предметом есть такая фигня?
 
2,505
81
397
Onneros написал(а):
(Вроди глуми не добавлял возможности вставлять хук в определенное место (либо выход/либо вход в метод только))
Есть по номеру строки. Но это костыль, что-нибудь может пойти не так.


Onneros написал(а):
P.S. Возможно, глуми меня бы сейчас пальками забил, но я вижу только такой выход..
Не забьет. Это единственное нормально решение.


По теме. Да, хуки тут не нужны. Еще сломаешь что-нибудь...
 
5,018
47
783
Предложите, как без хуков, пожалуйста. Я рендерил всегда в своем любимом obj формате всю модель и делал с ней что хотел в IItemRenderer. Разрабы же, хотя сделать больше кастомизации игрокам,добавили неполноценный json и испортили всю малину :(
Наверно, тоже самое произошло в 1.12 с очивками и крафтами
 
5,018
47
783
Актуально. Как без хуков провернуть?


Кстати, вот с хуком. Но где предметы? :huh:



Код:
@Hook(returnCondition = ReturnCondition.ON_TRUE)
 public static boolean renderItem(RenderItem ir, ItemStack stack, IBakedModel model) {
 EntityPlayer player  = Minecraft.getMinecraft().player;
 ItemStack is = player.getHeldItem(EnumHand.MAIN_HAND);
 if(is != null && (is.getItem() == ItemsSA.geigercounter)){
     GL11.glPushMatrix();
     GL11.glEnable(GL11.GL_BLEND);
     GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
     GL11.glScalef(4F, 4F, 4F);
     GL11.glRotatef(-25, 1, 0, 0);
     GL11.glRotatef(-45, 0, 1, 0);
     GL11.glRotatef(3, 0, 0, 1);
     GL11.glTranslated(0.24D, 2.1D, 0.15D);
     GL11.glScalef(0.015F, -0.015F, -0.015F);
         FontRenderer fontrenderer = Minecraft.getMinecraft().fontRendererObj;
     fontrenderer.drawString("hook", 70, 16, 0xFFFFFF);
     GL11.glDisable(GL11.GL_BLEND);
     GL11.glPopMatrix();
        GlStateManager.enableRescaleNormal();

 return true;
    }
 return false;
 }
Делаю через получение того что в руке. Но у меня едиственная проблема - подменяется рендер всех предметов, а надо только одного(


В общем, нужно как то получить, какой конкретно предмет рендерится, и только тогда врубать хук. Как это сделать?
 
5,018
47
783
Пока не скажете,я буду мучать майн.:)
p.s пытаюсь вот заюзать метод из родного класса, не копипастя(this в статиках не живет)
Код:
       Class.class.getClass().getMethod("render",Class<RenderItem>).renderModel(model, stack);
Ток чет на угольную скобку ругается, я хз, вроде так можно делать.
А, параметр какой то нужен...


Короче, мне не нужно менять или заменять целиком ванильный метод, мне нужно просто текст добавить. Чего вы жадные такие, не хотите сказать как еще можно рендерить :)
 
7,099
324
1,509
Чтобы не заменять метод целиком нужно не делать returnCondition = ReturnCondition.ALWAYS
 
Сверху