Не рендерится модель энтити и не проигрывается звук подбирания

Версия Minecraft
1.16.5
Всем привет! Я учусь моддингу на forge 1.16.5 и хочу сделать топор Левиафан из игр God of War, но столкнулся с двумя проблемами:

1) Отсутствие рендера модели энтити в воздухе и на земле при броске
2) Отсутствие проигрывания звука подбирания предмета

Причем сама сущность при броске спавнится, т.е наносит урон, падает, создает звуки падения и удара других сущностей, но вот модели топора вообще не видать. Я регистрировал рендерер в методе doClientStuff в основном классе мода, но тем не менее, модель не рендерится.

Класс рендерера: LeviathanAxeRenderer - Pastebin.com
Класс модели: LeviathanAxeModel - Pastebin.com
Класс энтити: LeviathanAxeEntity - Pastebin.com
Класс предмета: LeviathanAxe - Pastebin.com

Надеюсь, этой информации достаточно для решения проблемы, если нет, я с радостью предоставлю больше.

Буду очень благодарен за помощь, уже день с этим мучаюсь и никак не могу понять, в чем проблема
 
Последнее редактирование:
Я думаю потому что каждый тик топору задается направление движения равное нормированному вектору топор-игрок помноженный на d0. Таким образом движение зависит от количества вызовов этого метода, но не привязано напрямую к "количеству" тиков во время полета обратно. Оно и работает, энтити падает там, где должно упасть, его можно подобрать (правда, без звука подбора) и оно возвращается к тебе с зачарованием верности. Только вот само энтити невидимое, в этом проблема
 
1. Я имею в виду, что когда я подбираю брошенный невидимый топор (просто бросаю вперед и иду, пока не возьмется в руки обратно), не проигрывается стандартный звук подбирания предмета в майнкрафте. Кстати, заметил, что еще не проигрывается звук броска тризубца в методе onPlayerStoppedUsing в классе LeviathanAxe:
Java:
worldIn.addEntity(leviathanAxeEntity);
worldIn.playMovingSound((PlayerEntity)null, leviathanAxeEntity, SoundEvents.ITEM_TRIDENT_THROW, SoundCategory.PLAYERS, 1.0F, 1.0F);
Хотя энтити в мир я добавляю.

2. Никакой ошибки нет, просто не рендерится энтити. Более того, когда я вызываю его командой summon в игре, слышу звук приземления.

Вот как я регаю сущность:
Java:
public static final RegistryObject<EntityType<LeviathanAxeEntity>> LEVIATHAN_AXE =
            ENTITY_TYPES.register("leviathan_axe",
                    () -> EntityType.Builder.<LeviathanAxeEntity>create(LeviathanAxeEntity::new,
                                    EntityClassification.MISC).size(0.5F, 0.5F)
                                    .build(new ResourceLocation(TutorialMod.MOD_ID, "leviathan_axe").toString()));

Регистрация рендерера в doClientStuff:
RenderingRegistry.registerEntityRenderingHandler(ModEntityTypes.LEVIATHAN_AXE.get(), LeviathanAxeRenderer::new);

ModEntityTypes тоже зарегал в конструкторе основного класса:
ModEntityTypes.register(modEventBus);
 
1. Вот тут вообще не понял. Почему тогда рендерер трезубца отображает трезубец на экране, даже если не реализует этот интерфейс?

2. Мой класс LeviathanAxe наследуется от TridentItem и работает также, как он. Метод onPlayerStoppedUsing вызывается, я проверял в дебагере. Я не прописывал логику самого топора, единственное что я переписал, это убрал условие наличия максимальной прочности предмета для его использования на правую кнопку в методе onItemRightClick и вместо TridentEntity вызвал LeviathanAxeEntity, поэтому логика предмета должна работать также, как и у трезубца.
 
Боже, что ж ты не понимаешь, что майнкрафт просто не знает о твоей новой сущности.
Майнкрафт как раз таки знает о моей сущности - я могу ее вызывать командой и подбирать из нее предмет.

Перерегистрируй свою сущность, убедись, что она имеет ID для РЕНДЕРИНГА на стороне клиента.
Напиши конкретно, что ты имеешь в виду. Как мне перерегистрировать сущность и задать ей ID для РЕНДЕРИНГА (!!1) на стороне клиента?

1. Стандартный класс TridentItemRenderer не реализует ни один интерфейс. Метод render(Entity entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) в моем рендерере тоже есть.

2. Метод onPlayerStoppedUsing - стандартный метод класса Item. Интерфейса IUseItem в Forge 1.16.5 вообще не существует. Клавиша E в майнкрафте всегда открывает инвентарь.

Чувак, я и сам могу и много раз пробовал обращаться с проблемой к gpt. Если тебе действительно есть чем помочь, я был бы очень рад почитать. Но просто отвечать ради ответа, придумывать несуществующие вещи и копипастить ответы ИИ, криво меняя обращения с "вы" на "ты", пожалуйста, не надо
 
javaboss>.< удалило все свои ответы. Но не парься, память у меня хорошая.
Для всех, кто читает этот тред, вот, на что я отвечал:
1.
привет.

я немного подумал, придумал решение, писать бесплатно его не буду , так что вот тебе советы.




1. Убедись, что аудио вообще работает и вообще загружена ли она? и самое смешное, (у меня такое было) , я просто неправильно подвел код к звуку, то есть неправильный путь к звуку и код его просто не видит. >.<

public void playEatSound(Level worldIn) {
Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(this.getEatSound(), 1.0F));
}


2. Скинь мне ошибку, если у тебя есть логи, если пишет, что модели нет попробуй-ка просто изменить название модели json и ввести путь вручную. кекич >.<


@Override
public Renderer makeEntityRenderFactory(Model modelBase, float shadowSize) {
return new LeviathanAxeRenderer(this);
}
иначе могу подсказать, что проблема может быть вообще в том, как ты регаешь энтити в целом, т.е если его нет, то чему отображаться?
bye

2.
1. Чтобы сущность отображалась на экране, убедитесь в том, что ваш рендерер реализует интерфейс IRenderTypeBuffer, и использует метод RenderManager#renderEntityStatic для отображения сущности.

2. твойкласс LeviathanAxe наследуется от Item, а не ItemTool. Поэтому метод onPlayerStoppedUsing() не вызывается, когда бросаешь топор. Вместо этого должен вызываться onItemUseFinish(), но это обычно используется для действий после использования предмета в руке. Чтобы исправить эту ситуацию, те необходимо добавить LeviathanAxe к реестру записей и активировать его приемник клиентского рендеринга. >.<


// В классе LeviathanAxe
@Override
public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) {
// Вызываем метод базового класса ItemTool для броска тризубца (почти все делает майнкрафт)
return super.onItemRightClick(worldIn, playerIn, hand);
}

3.
Боже, что ж ты не понимаешь, что майнкрафт просто не знает о твоей новой сущности. Перерегистрируй свою сущность, убедись, что она имеет ID для РЕНДЕРИНГА на стороне клиента.

  1. Для трезубца в майнкрафте используется метод render(Entity entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) из стандартного класса TridentItemRenderer, который реализует интерфейс IRenderTypeBuffer. Этот метод не требует явного вызова в вашем коде. Он вызывается автоматически из метода renderEntityStatic класса RenderManager.
  2. Метод onPlayerStoppedUsing вызывается только для предметов, которые реализуют интерфейс IUseItem. Этот метод также используется в TridentItem и вызывается при использовании трезубца, когда чувакнажимает клавишу E.

4.
xD, как же мне смешно с тебя

Сохраняю для того, чтобы у других людей было понимание, на что я отвечал
 
1,371
112
241
Отсутствие рендера модели энтити в воздухе и на земле при броске
На лицо ошибка в модели (в чём я сильно сомневаюсь) или рендерере. Причин некорректной рабоыт может быть несколько:
1) Подключил ли ты свою привязку рендерера к сущности (точнее эвент)? В том плане, типикал ошибка, когда забыл static прописать соотв. эвенту.
2) Вопрос к модели: ты используешь EntityModel, в то время как к ванилле используется просто Model. В зависимости от модели меняется и способы рендера. (хоть и не сильно, конечно). Попробуй сменить суперкласс.
2) Отсутствие проигрывания звука подбирания предмета
Для звука в мире есть несколько методов. Попробуй использовать другой (да и, если честно, впервые вижу playMovingSound). Пример.
 
1. Ты имеешь в виду поле protected static final LeviathanAxeModel leviathanAxeModel = new LeviathanAxeModel(); в LeviathanAxeRenderer? Если да, то да) Если нет, прошу объяснить что имеется в виду, ибо в рендеринге в майне плохо разбираюсь (не нашел нормальных гайдов)
2. Модель я сделал тестовую в BlockBench версии Forge 1.15-1.16 MCP и просто экспортнул в проект. Если меняю супер с EntityModel на Model, надо менять конструктор и давать ему аргумент Function<ResourceLocation, RenderType> renderTypeIn, и тут я теряюсь.
Для звука в мире есть несколько методов. Попробуй использовать другой (да и, если честно, впервые вижу playMovingSound).
А как быть со звуком подбирания? playMovingSound используется для звука броска, и это в принципе не большая проблема, я это отметил, потому что интересно то, что в качестве одного из аргументов он берет энтити, и как раз таки с моим чудом этот звук не воспроизводится))

Еще в игре на F3+B (режим чтобы были видны все хитбоксы) нету хитбоксов у моего энтити. Так и должно быть, если оно не рендерится, или может быть проблема еще и в самом энтити?

Также, насколько я понял через дебагер, метод render в рендерере вообще не вызывается.
 
1,371
112
241
1. Ты имеешь в виду поле protected static final LeviathanAxeModel leviathanAxeModel = new LeviathanAxeModel(); в LeviathanAxeRenderer? Если да, то да) Если нет, прошу объяснить что имеется в виду, ибо в рендеринге в майне плохо разбираюсь (не нашел нормальных гайдов)
2. Модель я сделал тестовую в BlockBench версии Forge 1.15-1.16 MCP и просто экспортнул в проект. Если меняю супер с EntityModel на Model, надо менять конструктор и давать ему аргумент Function<ResourceLocation, RenderType> renderTypeIn, и тут я теряюсь.
У меня есть пример на версию повыше, однако для понимания работы всего этого прикола, думаю, будет в самый раз.
А как быть со звуком подбирания? playMovingSound используется для звука броска, и это в принципе не большая проблема, я это отметил, потому что интересно то, что в качестве одного из аргументов он берет энтити, и как раз таки с моим чудом этот звук не воспроизводится))
У меня под рукой нет IDE под эту версию, поэтому точно сказать не могу. Звук ты можешь воспроизводить как хочешь, другой вопрос - какой.
Вообще, меня условие в твоём Entity. Судя по всему, из-за него этот звук и не воспроизводится, ибо returningTicks ВСЕГДА больше 0.
Еще в игре на F3+B (режим чтобы были видны все хитбоксы) нету хитбоксов у моего энтити. Так и должно быть, если оно не рендерится, или может быть проблема еще и в самом энтити?
А вот здесь можно сделать вывод, что проблема точно в Entity. (Точно сказать не могу, нужно более подробно дебажить) Наверное, когда ты выпускаешь свой Entity он тут же сталкивается с игроком или что-то в этом роде.
Крч, проставляй кучу sout и смотри что там происходит (дебагер, в таком случае, будет использовать не очень удобно, по моему опыту).

Ну и скажу сразу ну будущее: не всегда "тупая" копирка с ваниллы даст необходимый результат. Может не работать куча вещей из-за того, что ты делаешь мод на Forge/Fabric, а не модифицируешь ваниллу. Поэтому в ванилльный код стоит лезть (всегда), но быть осторожным при его копировании.
 
Сверху