Отменить рендер EntityItem

Версия Minecraft
1.12.2
API
Forge
17
3
1
Как отменить рендер определенных EntityItem'ов, тоесть сделать предметы, валяющиеся на земле невидимыми? Так как предмет на земле по сути тоже энтити, пытался использовать событие RenderLivingEvent.Pre, но к моему удивлению, оно не связано с рендерингом EntityItem. Мод у меня фулл клиентский, тоесть доступа к серверу у меня нет.
 
Решение
События для рендера EntityItem к сожалению нету. На англ. форуме предлагают создать класс новый рендера, унаследованного от RenderEntityItem, и подменить им обычный рендер предмета (рассматриваем предмет как сущность, Entity). Добавив условие в doRender() можно не рендерить предмет.
Не сильно красивое решение конечно, но похоже единственное доступное без миксинов и хуков.
Ну хоть как-то.
Как создать класс, унаследованный от RenderEntityItem мне понятно, но как подменить дефолтный рендер моим для меня загадка. Было бы событие, я бы его отменил, и выполнил ту же логику в моем классе внеся свои коррективы. Но что делать в это ситуации, подскажи пожалуйста.

VeniVidiVici

Санта Барбарис
327
15
198
Насколько я помню, EntityItem рендерится исходя из данных .json, раздела entity или world (я не помню как он правильно называется, тот что отвечает за рендер "на земле"). По идее можно же его просто затереть изнутри, чтобы он был, но пустой. И модельки не будет.
---------
Но это я точечное решение предположил, для всех предметов сразу само собой этой иррационально
 
17
3
1
Насколько я помню, EntityItem рендерится исходя из данных .json, раздела entity или world (я не помню как он правильно называется, тот что отвечает за рендер "на земле"). По идее можно же его просто затереть изнутри, чтобы он был, но пустой. И модельки не будет.
Это слишком радикальный способ. Мне нужно программно сделать конкретные(не все) предметы на земле, и чтобы это скрытие можно было в любой момент отключить.

Вот как бы я это сделал, если бы событие RenderLivingEvent.Pre отвечало за рендер EntityItem:

Java:
@SubscribeEvent
public static void onRenderLiving(RenderLivingEvent.Pre e) {
    Entity entity = e.getEntity();
    if (entity instanceof EntityItem) {
        if (entity.getName().matches(".*Плющ.*")) {
            e.setCanceled(true);
        }
    }
}

Есть ли вообще событие рендера EntityItem? Или нужно как-то по другому изгаляться?
 

VeniVidiVici

Санта Барбарис
327
15
198
Есть ли вообще событие рендера EntityItem? Или нужно как-то по другому изгаляться?
Вообще, всегда стоит гуглить по Eng источникам, если нет ответа тут. Например:
1623217665486.png
Но у меня почему-то не открывается сейчас сайт, ошибки кидает:
1623217701476.png
Но судя по названию, там есть решение твоей проблемы, вот ссылка на всякий случай: https://forums.minecraftforge.net/topic/58226-1112-solved-cancel-render-of-entityitems/
 
17
3
1
Вообще, всегда стоит гуглить по Eng источникам, если нет ответа тут.
Обычно, я так и делаю. Но у меня обратная ситуация. Сначала гуглю самостоятельно, и если не нахожу решения, обращаюсь за помощью к мододелам.

Например:
1623217665486.png

Но судя по названию, там есть решение твоей проблемы, вот ссылка на всякий случай: https://forums.minecraftforge.net/topic/58226-1112-solved-cancel-render-of-entityitems/
Видел эту тему. Там что-то говорилось о регистрации рендера, что я не совсем понял. Вот подумал, если это единственный способ, может мне тут о нем подробнее расскажут, чтобы я въехал. А то понимать инглиш даже с переводчиком тяжко.
 
154
17
96
Есть ли вообще событие рендера EntityItem? Или нужно как-то по другому изгаляться?
События для рендера EntityItem к сожалению нету. На англ. форуме предлагают создать класс новый рендера, унаследованного от RenderEntityItem, и подменить им обычный рендер предмета (рассматриваем предмет как сущность, Entity). Добавив условие в doRender() можно не рендерить предмет.
Не сильно красивое решение конечно, но похоже единственное доступное без миксинов и хуков.
 
17
3
1
События для рендера EntityItem к сожалению нету. На англ. форуме предлагают создать класс новый рендера, унаследованного от RenderEntityItem, и подменить им обычный рендер предмета (рассматриваем предмет как сущность, Entity). Добавив условие в doRender() можно не рендерить предмет.
Не сильно красивое решение конечно, но похоже единственное доступное без миксинов и хуков.
Ну хоть как-то.
Как создать класс, унаследованный от RenderEntityItem мне понятно, но как подменить дефолтный рендер моим для меня загадка. Было бы событие, я бы его отменил, и выполнил ту же логику в моем классе внеся свои коррективы. Но что делать в это ситуации, подскажи пожалуйста.
 
17
3
1
Так лучше не делать - ломаешь совместимость. Хуки или миксины в помощь.
Я в этом деле ещё зеленый. Можешь показать на примере, как хуками/миксинами отменить рендер определенных предметов?
 
154
17
96
Вмешательство в исходный код - дело для продвинутых моддеров. Часто чтобы просто начать пользоваться хуками приходится часами ковыряться, настраивать среду, тыкаться наугад. Ну и главное - понимание того, что ты делаешь и каким путем ты этого добиваешься.
Вот пара статеек с сайта о том, с чего начать в этом деле:
Миксины для Чайников
Хуклиба от Глуми
Трансформеры без использования сторонних библиотек
 
Сверху