Как поставить текстуру DamagingProjectileEntity

Версия Minecraft
1.16.5
API
Forge
В общем, захотел я сделать новый класс, наследованный от DamagingProjectileEntity, я сделал шарик, который летит и накладывает яд, также есть предмет, стреляющий этим шариком:

Java:
//класс шарика
package com.painwizzard.magical.entities;

import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.projectile.DamagingProjectileEntity;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.world.World;

public class PoisonBall extends DamagingProjectileEntity {
    public static int poisonDuration = 200;
    public PoisonBall(EntityType entityType, double x, double y, double z, double pOffsetX, double pOffsetY, double pOffsetZ, World pLevel) {
        super(entityType, x, y, z, pOffsetX, pOffsetY, pOffsetZ, pLevel);
    }
    public PoisonBall(EntityType entityType, World world) {
        super(entityType, world);
    }


    @Override
    protected void onHitEntity(EntityRayTraceResult result) {
        LivingEntity target = (LivingEntity) result.getEntity();
        target.addEffect(new EffectInstance(Effects.POISON, poisonDuration));
        this.remove();
    }
}
а это создание шарика
PoisonBall poisonBall = new PoisonBall(EntityType.FIREBALL , pPlayer.getX(), pPlayer.getEyeY(), pPlayer.getZ(), 0, 0, 0, pLevel);

как вы можете заметить, в EntityType указан фаербол, поэтому и летит текстура фаербола, но с моей логикой, а я хочу, чтобы летел мой шарик(моя текстурка)
вот и не могу разобраться
 
Решение
1. Создать свой EntityType (как я понял, это ванилльный fireball).
2. Создать свой рендерер для энтити.
3. В рендерере рисовать текстурку.
4. Привязать рендерер к EntityType.

Ничего сложного. Пример рендерера можешь также взять с fireball.
1,373
113
241
1. Создать свой EntityType (как я понял, это ванилльный fireball).
2. Создать свой рендерер для энтити.
3. В рендерере рисовать текстурку.
4. Привязать рендерер к EntityType.

Ничего сложного. Пример рендерера можешь также взять с fireball.
 
1,373
113
241
Тут несколько классов.
Для регистрации EntityType есть куча гайдов. Привязка рендерера к типу энтити тоже в них включается, как правило.
Наиболее распространённый гайд - от Kaupenjoe. Чисто глянуть что да как - сойдёт.

Рендер текстурки можно взять у драконовского файерболла. Он там без всего лишнего.
Код взял из 1.20.2, парочка вещей может отличаться, просто подправь.
Ванилльный класс, маппинги тоже:
@OnlyIn(Dist.CLIENT)
public class DragonFireballRenderer extends EntityRenderer<DragonFireball> {
   private static final ResourceLocation TEXTURE_LOCATION = new ResourceLocation("textures/entity/enderdragon/dragon_fireball.png");
   private static final RenderType RENDER_TYPE = RenderType.entityCutoutNoCull(TEXTURE_LOCATION);

   public DragonFireballRenderer(EntityRendererProvider.Context p_173962_) {
      super(p_173962_);
   }

   protected int getBlockLightLevel(DragonFireball p_114087_, BlockPos p_114088_) {
      return 15;
   }

   public void render(DragonFireball p_114080_, float p_114081_, float p_114082_, PoseStack p_114083_, MultiBufferSource p_114084_, int p_114085_) {
      p_114083_.pushPose();
      p_114083_.scale(2.0F, 2.0F, 2.0F);
      p_114083_.mulPose(this.entityRenderDispatcher.cameraOrientation());
      p_114083_.mulPose(Axis.YP.rotationDegrees(180.0F));
      PoseStack.Pose posestack$pose = p_114083_.last();
      Matrix4f matrix4f = posestack$pose.pose();
      Matrix3f matrix3f = posestack$pose.normal();
      VertexConsumer vertexconsumer = p_114084_.getBuffer(RENDER_TYPE);
      vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 0, 0, 1);
      vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 0, 1, 1);
      vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 1.0F, 1, 1, 0);
      vertex(vertexconsumer, matrix4f, matrix3f, p_114085_, 0.0F, 1, 0, 0);
      p_114083_.popPose();
      super.render(p_114080_, p_114081_, p_114082_, p_114083_, p_114084_, p_114085_);
   }

   private static void vertex(VertexConsumer p_254095_, Matrix4f p_254477_, Matrix3f p_253948_, int p_253829_, float p_253995_, int p_254031_, int p_253641_, int p_254243_) {
      p_254095_.vertex(p_254477_, p_253995_ - 0.5F, (float)p_254031_ - 0.25F, 0.0F).color(255, 255, 255, 255).uv((float)p_253641_, (float)p_254243_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_253829_).normal(p_253948_, 0.0F, 1.0F, 0.0F).endVertex();
   }

   public ResourceLocation getTextureLocation(DragonFireball p_114078_) {
      return TEXTURE_LOCATION;
   }
}
 
Сверху