Кастомная стрела рендерится как... Свинья!

Версия Minecraft
1.15.2
205
12
103
Всем привет. Сегодня я с довольно необычным вопросом. Сделал я свою энтить, которая должна призываться при клике определенным предметом (смотрел в сторону эндерперла и делал по аналогии), сделал, но чет... Вместо ожидаемой мною стрелы вызывается свинка. F3 показывает что это не просто модель свинки, а вполне реальный minecraft: pig, и активно спамит в консоль вот этой гадостью:
Java:
[15:38:11] [Render thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Client
java.lang.IllegalStateException: Invalid entity data item type for field 7 on entity PigEntity['Свинья'/603, l='MpServer', x=225.79, y=72.52, z=-238.49]: old=0(class java.lang.Byte), new=1 air(class net.minecraft.item.ItemStack)
    at net.minecraft.network.datasync.EntityDataManager.setEntryValue(EntityDataManager.java:246) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.network.datasync.EntityDataManager.setEntryValues(EntityDataManager.java:234) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.client.network.play.ClientPlayNetHandler.handleEntityMetadata(ClientPlayNetHandler.java:587) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.network.play.server.SEntityMetadataPacket.processPacket(SEntityMetadataPacket.java:50) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.network.play.server.SEntityMetadataPacket.processPacket(SEntityMetadataPacket.java:12) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:140) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:110) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:935) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.Minecraft.run(Minecraft.java:559) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.main.Main.main(Main.java:177) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_242] {}
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_242] {}
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242] {}
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242] {}
    at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {}

А вот и сама свинка:
1585918065671.png

Я ожидал чего-то вроде отсутствующей текстуры, раз уж на то пошло, но никак не свинку...

Итем:
Java:
public class ItemWoodenArrow extends Item {
    public ItemWoodenArrow(Item.Properties properties) {
        super(properties);
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
        ItemStack stack = playerIn.getHeldItem(handIn);
        worldIn.playSound(null, playerIn.getPosition(), SoundEvents.BLOCK_ANVIL_HIT, SoundCategory.PLAYERS, 1.0f, 1.0f);
        if (!worldIn.isRemote) {
            EntityWoodenArrow entityWoodenArrow = new EntityWoodenArrow(worldIn, playerIn);
            entityWoodenArrow.setItem(stack);
            entityWoodenArrow.shoot(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 0.5F);
            worldIn.addEntity(entityWoodenArrow);
        }
        return new ActionResult<ItemStack>(ActionResultType.SUCCESS, stack);
    }
}

Энтить:
Java:
public class EntityWoodenArrow extends ProjectileItemEntity {
    public static final EntityType<EntityWoodenArrow> WOODEN_ARROW = register();

    public EntityWoodenArrow(EntityType<? extends EntityWoodenArrow> entityIn, World worldIn) {
        super(entityIn, worldIn);
    }

    public EntityWoodenArrow(World worldIn, LivingEntity throwerIn) {
        super(WOODEN_ARROW, throwerIn, worldIn);
    }

    @Override
    public IPacket<?> createSpawnPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }

    @Override
    protected void onImpact(RayTraceResult result) {
        if (!this.world.isRemote) {
            this.remove();
        }
    }

    @Override
    protected Item getDefaultItem() {
        return FunctionalItems.Items.wooden_arrow;
    }

    @Override
    public void tick() {
        LivingEntity livingentity = this.getThrower();
        if (livingentity != null && livingentity instanceof PlayerEntity && !livingentity.isAlive()) {
            this.remove();
        } else {
            super.tick();
        }
    }

    @SubscribeEvent
    public static EntityType register() {
        return EntityType.Builder.<EntityWoodenArrow>create(EntityWoodenArrow::new, EntityClassification.MISC).size(0.8F, 0.8F).build("wooden_arrow").setRegistryName(Reference.MODID, "wooden_arrow");
    }
}

Её рендер, который я понятия не имею куда нужно засовывать:
Java:
@OnlyIn(Dist.CLIENT)
public class WoodenArrowRender extends EntityRenderer<EntityWoodenArrow> {
    private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.MODID, "textures/item/copper_ore"); //Текстурка меди тут просто так, нормальную еще не лепил.

    public WoodenArrowRender(EntityRendererManager renderManager) {
        super(renderManager);
        renderManager.getFontRenderer().drawStringWithShadow("Wooden Arrow", 0, 0.5f, 2);
    }

    @Override
    public void render(EntityWoodenArrow entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) {
        super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn);
    }

    @Override
    public ResourceLocation getEntityTexture(EntityWoodenArrow entity) {
        return TEXTURE;
    }
}


Собственно, да... Я в край сломался после увиденной свиньи и теперь окончательно ничего не понимаю.
 
@SubscribeEvent public static EntityType register() { return EntityType.Builder.<EntityWoodenArrow>create(EntityWoodenArrow::new, EntityClassification.MISC).size(0.8F, 0.8F).build("wooden_arrow").setRegistryName(Reference.MODID, "wooden_arrow"); }
А что это? Так и должно быть? У тебя не зарегана твоя стрела.
 
У тебя не зарегана твоя стрела
Ага. Был косяк с регистрацией. Я переносил местный рег в отдельный класс, а куски старого забыл убрать. Теперь призывается не просто свинка, а крашащее нечто. Вот что получаю при вызове:

Java:
Description: Unexpected error

java.lang.NullPointerException: Unexpected error
    at net.minecraft.client.renderer.entity.EntityRendererManager.shouldRender(EntityRendererManager.java:233) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.WorldRenderer.updateCameraAndRender(WorldRenderer.java:947) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:612) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.renderer.GameRenderer.updateCameraAndRender(GameRenderer.java:434) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:962) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.Minecraft.run(Minecraft.java:559) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}
    at net.minecraft.client.main.Main.main(Main.java:177) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_242] {}
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_242] {}
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_242] {}
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_242] {}
    at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.Launcher.run(Launcher.java:81) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.Launcher.main(Launcher.java:65) [modlauncher-5.0.0-milestone.4.jar:?] {}
    at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:102) [forge-1.15.2-31.1.30_mapped_snapshot_20200229-1.15.1-recomp.jar:?] {}


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Render thread
Stacktrace:
    at net.minecraft.client.renderer.entity.EntityRendererManager.shouldRender(EntityRendererManager.java:233)
    at net.minecraft.client.renderer.WorldRenderer.updateCameraAndRender(WorldRenderer.java:947)
    at net.minecraft.client.renderer.GameRenderer.renderWorld(GameRenderer.java:612)

Обновлённый код энтити:

Java:
public class EntityWoodenArrow extends ProjectileItemEntity {
    public EntityWoodenArrow(EntityType<? extends EntityWoodenArrow> entityEntityType, World world) {
        super(entityEntityType, world);
    }

    public EntityWoodenArrow(World worldIn, LivingEntity throwerIn) {
        super(ProjectileEntities.Entities.wooden_arrow, throwerIn, worldIn);
    }

    public EntityWoodenArrow(World world) {
        super(ProjectileEntities.Entities.wooden_arrow, world);
    }

    @Override
    public IPacket<?> createSpawnPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }

    @Override
    protected void onImpact(RayTraceResult result) {
        if (!this.world.isRemote) {
            this.remove();
        }
    }

    @Override
    protected Item getDefaultItem() {
        return FunctionalItems.Items.wooden_arrow;
    }

    @Override
    public void tick() {
        LivingEntity livingentity = this.getThrower();
        if (livingentity != null && livingentity instanceof PlayerEntity && !livingentity.isAlive()) {
            this.remove();
        } else {
            super.tick();
        }
    }
}
(количество созданных конструкторов начинает пугать)

Регистрация:

Java:
@Mod.EventBusSubscriber(modid = Reference.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ProjectileEntities {
    public static class Entities {
        public static EntityType wooden_arrow;
    }

    @SubscribeEvent
    public static void onEntityRegistry(RegistryEvent.Register<EntityType<?>> event) {
        Entities.wooden_arrow = Utils.registerEntity(EntityType.Builder
                .<EntityWoodenArrow>create(EntityWoodenArrow::new, EntityClassification.MISC)
                .size(0.8F, 0.8F)
                .setCustomClientFactory((spawnEntity, world) -> new EntityWoodenArrow(world))
                .build("wooden_arrow")
                .setRegistryName(Reference.MODID, "wooden_arrow"));
    }
}

Java:
    public static EntityType registerEntity(EntityType entityType) {

        ForgeRegistries.ENTITIES.register(entityType);

        return entityType;
    }
 
Последнее редактирование:
Так. Теперь это не свинтус и не самокраш, но текстурки у него все еще нет и F3 его теперь ВООБЩЕ не видит.
1585927711491.png
Энтить:
public class EntityWoodenArrow extends ProjectileItemEntity {
    public EntityWoodenArrow(EntityType<? extends EntityWoodenArrow> entityEntityType, World world) {
        super(entityEntityType, world);
    }

    public EntityWoodenArrow(World worldIn, LivingEntity throwerIn) {
        super(ProjectileEntities.Entities.wooden_arrow, throwerIn, worldIn);
    }

    public EntityWoodenArrow(World world) {
        super(ProjectileEntities.Entities.wooden_arrow, world);
    }

    @Override
    public IPacket<?> createSpawnPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }

    @Override
    protected void onImpact(RayTraceResult result) {
        if (!this.world.isRemote) {
            this.remove();
        }
    }

    @Override
    protected Item getDefaultItem() {
        return FunctionalItems.Items.wooden_arrow;
    }

    @Override
    public void tick() {
        LivingEntity livingentity = this.getThrower();
        if (livingentity != null && livingentity instanceof PlayerEntity && !livingentity.isAlive()) {
            this.remove();
        } else {
            super.tick();
        }
    }
}

Рендер:
@OnlyIn(Dist.CLIENT)
public class WoodenArrowRender extends EntityRenderer<EntityWoodenArrow> {
    private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.MODID, "textures/item/copper_ore");

    public WoodenArrowRender(EntityRendererManager renderManager) {
        super(renderManager);
        renderManager.getFontRenderer().drawStringWithShadow("Wooden Arrow", 0, 0.5f, 2);
    }

    @Override
    public void render(EntityWoodenArrow entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) {
        super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn);
    }

    @Override
    public ResourceLocation getEntityTexture(EntityWoodenArrow entity) {
        return TEXTURE;
    }
}

Регистрация рендера и энтити (разные классы):
    public TerraCraft() {
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setupClient);

        MinecraftForge.EVENT_BUS.register(this);
    }


    private void setupClient(final FMLClientSetupEvent event) {
        RenderingRegistry.registerEntityRenderingHandler(ProjectileEntities.Entities.wooden_arrow, WoodenArrowRender::new);
    }

@Mod.EventBusSubscriber(modid = Reference.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ProjectileEntities {
    public static class Entities {
        public static EntityType<EntityWoodenArrow> wooden_arrow;
    }

    @SubscribeEvent
    public static void onEntityRegistry(RegistryEvent.Register<EntityType<?>> event) {
        Entities.wooden_arrow = Utils.registerEntity(EntityType.Builder
                .<EntityWoodenArrow>create(EntityWoodenArrow::new, EntityClassification.MISC)
                .size(0.8F, 0.8F)
                .setCustomClientFactory((spawnEntity, world) -> new EntityWoodenArrow(world))
                .build("wooden_arrow")
                .setRegistryName(Reference.MODID, "wooden_arrow"));
    }
}

UPD: Вот что нашел в логе:
Java:
[03апр2020 18:25:54.516] [Render thread/WARN] [net.minecraft.entity.EntityType/]: No data fixer registered for entity wooden_arrow
 
Последнее редактирование:
Как адекватно сделать рендер своей энтити я так и не нашел. Могу воткнуть туда 2Д объект через...
Java:
    @Override
    public void render(EntityWoodenArrow entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) {
matrixStackIn.push();
matrixStackIn.rotate(Vector3f.YP.rotationDegrees(MathHelper.lerp(partialTicks, entityIn.prevRotationYaw, entityIn.rotationYaw) - 90.0F));
matrixStackIn.rotate(Vector3f.ZP.rotationDegrees(MathHelper.lerp(partialTicks, entityIn.prevRotationPitch, entityIn.rotationPitch)));
matrixStackIn.rotate(Vector3f.ZP.rotationDegrees(90.0F));

matrixStackIn.scale(0.5F,0.5F, 0.5F);
RenderSystem.enableBlend();
Minecraft.getInstance().getItemRenderer().renderItem(new ItemStack(FunctionalItems.Items.wooden_arrow), ItemCameraTransforms.TransformType.FIXED, packedLightIn, OverlayTexture.NO_OVERLAY, matrixStackIn, bufferIn);

matrixStackIn.pop();
    }

Но не уверен, что это правильное решение. Хотя понаблюдав за тем, как сделана обычная стрела, я уже сомневаюсь.
 
Последнее редактирование:
Назад
Сверху