Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[Solved] Rendering Projectiles

Recommended Posts

So I have created this class for rendering a projectile that extends SpriteRenderer, but when I try to override getEntityTexture I get this error:

'getEntityTexture(Entity)' in 'com.aylias.minecraft.mods.modbase.client.renders.CorruptPearlRenderer' clashes with 'getEntityTexture(T)' in 'net.minecraft.client.renderer.entity.EntityRenderer'; both methods have same erasure, yet neither overrides the other

How do I override it without getting this error? I have tried googling the error, even as just "both methods have same erasure, yet neither overrides the other" but found nothing that can help. Here is the class:

package com.aylias.minecraft.mods.modbase.client.renders;

import com.aylias.minecraft.mods.modbase.ModBase;
import com.aylias.minecraft.mods.modbase.entities.CorruptPearlEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.SpriteRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.client.registry.IRenderFactory;

public class CorruptPearlRenderer extends SpriteRenderer<CorruptPearlEntity> {
    public CorruptPearlRenderer(EntityRendererManager renderManagerIn, ItemRenderer itemRendererIn) {
        super(renderManagerIn, itemRendererIn);

    public ResourceLocation getEntityTexture(Entity entity) {
        return new ResourceLocation(ModBase.MODID, "textures/item/corrupt_pearl.png");

    public static class RenderFactory implements IRenderFactory<CorruptPearlEntity> {

        public EntityRenderer<? super CorruptPearlEntity> createRenderFor(EntityRendererManager manager) {
            return new CorruptPearlRenderer(manager, Minecraft.getInstance().getItemRenderer());


Edited by NullDev
It was solved!
Link to post
Share on other sites
21 minutes ago, Beethoven92 said:

Just override getDefaultItem in your CorruptPearlEntity class and return the corresponding item

I have already done that, but it just assumes the texture of the normal ender pearl not the one attached to the corrupt pearl item, even if I don't register the CorruptPearlRenderer it still just looks like an ender pearl.

protected Item getDefaultItem() {
	return RegistryHandler.CORRUPT_PEARL.get();


Link to post
Share on other sites
1 minute ago, Beethoven92 said:

Show your whole code please

Corrupt Pearl Entity

package com.aylias.minecraft.mods.modbase.entities;

import com.aylias.minecraft.mods.modbase.util.CorruptPearlReboundEvents;
import com.aylias.minecraft.mods.modbase.util.EntityRegisters;
import com.aylias.minecraft.mods.modbase.util.RegistryHandler;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.entity.ArrowRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.model.EntityModel;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.entity.monster.EndermiteEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;

public class CorruptPearlEntity extends EnderPearlEntity {

    CorruptPearlReboundEvents.Rebounder toActivate;

    public CorruptPearlEntity(World worldIn, LivingEntity throwerIn) {
        super(worldIn, throwerIn);
        toActivate = CorruptPearlReboundEvents.toRebound.get(CorruptPearlReboundEvents.toRebound.size() - 1);

    public CorruptPearlEntity(World worldIn, double x, double y, double z) {
        super(worldIn, x, y, z);

    public CorruptPearlEntity(EntityType<? extends EnderPearlEntity> p_i50153_1_, World p_i50153_2_) {
        super(p_i50153_1_, p_i50153_2_);

    protected void onImpact(RayTraceResult result) {

    protected Item getDefaultItem() {
        return RegistryHandler.CORRUPT_PEARL.get();




Link to post
Share on other sites

Your entity is in fact bound to an EntityType<EnderPearlEntity>, instead of your custom pearl entity type, see that in your entity constructors your are not passing in any entity type because the super class(EnderPearlEntity) already provides its own, which is not what you want..i suggest you just extend the projectile item entity class and replicate the Ender pearl behavior where needed

Edited by Beethoven92

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Link to post
Share on other sites
1 hour ago, Beethoven92 said:

i suggest you just extend the projectile item entity class and replicate the Ender pearl behavior where needed

I have done that, but now the entity is just invisible... I uploaded the new code to the repository.

Link to post
Share on other sites
26 minutes ago, Beethoven92 said:

You need to override createSpawnPacket in your entity, and return NetworkHooks.getEntitySpawningPacket

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

That crashed the game when I threw it.

Link to post
Share on other sites
  • NullDev changed the title to [Solved] Rendering Projectiles

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Spawning particles is a client-side operation.
    • Looks like minecraft uses Blaze3D for rendering, but I have no idea what to do with these MatrixStacks, RenderTypeBuffers, etc, and I cant find any documentation about it. Vanilla examples are not helpful at all, because all the variables lost their original names and its impossible to understand whats going on. Any suggestions where to start?
    • Hi! I was trying to create a smoke projectile, that when hits the ground spawn some particles for a certain duration. The problem is that, when the entity hits the ground, it don't spawn the particles at all. Here is my projectile: @OnlyIn(value = Dist.CLIENT, _interface = IRendersAsItem.class) public class SmokeBulletEntity extends DamagingProjectileEntity implements IRendersAsItem { private static final ItemStack STACK = new ItemStack(ModItems.BULLET.get()); private boolean activated; private int duration; public SmokeBulletEntity(World world) { super(ModEntities.SMOKE_BULLET.get(), world); this.activated = false; } @Override public ItemStack getItem() { return STACK; } @Override protected void onHitBlock(BlockRayTraceResult rayTraceResult) { if (this.activated) return; if (!this.level.isClientSide) { this.activate(); } super.onHitBlock(rayTraceResult); } @Override protected void onHitEntity(EntityRayTraceResult entityRayTraceResult) { //Must be Empty } private void activate() { this.activated = true; this.duration = 200; this.setDeltaMovement(0, 0, 0); this.xPower = 0; this.yPower = 0; this.zPower = 0; System.out.println("Active Smoke Projectile"); } @Override public void tick() { if (this.activated && !this.level.isClientSide) { //System.out.println(String.format("%f, %f, %f", this.getX(), this.getY(), this.getZ())); for (int i = 0; i < 100; i++) { this.level.addParticle(ParticleTypes.FLAME, this.getX(), this.getY() + i, this.getZ(), 0, 0, 0); } this.duration--; if (this.duration <= 0) { this.remove(); } } else { super.tick(); } } @Override public void addAdditionalSaveData(CompoundNBT nbt) { super.addAdditionalSaveData(nbt); nbt.putBoolean("activated", this.activated); nbt.putInt("duration", this.duration); } @Override public void readAdditionalSaveData(CompoundNBT nbt) { super.readAdditionalSaveData(nbt); if (nbt.contains("activated")) { this.activated = nbt.getBoolean("activated"); } if (nbt.contains("duration")) { this.duration = nbt.getInt("duration"); } } @Override public IPacket<?> getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } } Can somebody explain me why? Thanks!
  • Topics

  • Who's Online (See full list)

  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.