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

    • Hello There! The finale is FINALLY here of this really wholesome video series! In this one we switch some things up and we surprise my one friend with a MINECRAFT ACCOUNT! Then we get back to the usual stuff where we surprise the ones who have Java Minecraft with their statues and everything! Sadly this little series was cut short because of the server shutting down but it was fun nonetheless! If you are looking for a wholesome/good vibe video series this is the one for you! I hope you all enjoy this video and if you did don't forget to like and sub for more!  
    • My forge 1.12.2 shows up in launcher and the tap shows up when I launches at the bottom of my screen. The game itself doesn't pop up on my screen. When launching forge again, it will just say that a game is already there. Can someone please help me solve this problem? I have already tried searching for multiple instances of minecraft using task manager, finding nothing. 
    • After looking through a ton of functions, I found the issue was that my entity was extending MonsterEntity, which extends MobEntity, which creates a GroundPathNavigator, which has a rules for canUpdatePath that include "this.mob.isOnGround()". My entity is a flying entity. Whoops. Solution was to simply override the createNavigation function, where I simply "return new FlyingPathNavigator(this, world);". Everything works fine now.
    • do you already have a custom recipe implemented? if not, you'll a class that'l hold the recipe and check for matches, the recipe inventory and the recipe serializer   then it's up to you to write the logic in your container. you can use of the world's recipe manager to see if a recipe inventory matches any recipe
    • I'm trying to write an AI Goal for an entity to move towards its target on each tick (with quite a few restrictions on when, which is why I need a new goal). It seemed to be working when I also added a WaterAvoidingRandomWalkingGoal, but I don't want the entity to move around randomly anymore, so I removed that. My code overrides the canUse function to determine whether or not it should start moving towards the target, and that ends with creating a path to the target, which always returns NULL, so nothing happens. Here's the relevant functions: public FloatingEyesGoal(EntityFloatingEyes e, double speed) { this.entity = e; this.random = e.getRandom(); this.speed = speed; this.setFlags(EnumSet.of(Flag.LOOK, Flag.MOVE, Flag.TARGET)); this.entity.getNavigation().setCanFloat(true); } @Override public boolean canUse() { LivingEntity target = this.entity.getTarget(); if (target == null || !target.isAlive() || !isFacingTargetBack()) return false; setTargetPos(target); this.path = this.entity.getNavigation().createPath(target, 0); // Logging this.path == null prints "true", and this.entity.getNavigation() == null prints "false" return this.path != null || isInRange(target); } @Override public boolean canContinueToUse() { LivingEntity target = this.entity.getTarget(); if (target == null || !target.isAlive() || !isFacingTargetBack()) return false; return !this.entity.getNavigation().isDone(); } @Override public void start() { this.entity.getNavigation().moveTo(this.path, this.speed); this.entity.setAggressive(true); this.ticksToMove = 0; } @Override public void stop() { LivingEntity target = this.entity.getTarget(); if (!EntityPredicates.NO_CREATIVE_OR_SPECTATOR.test(target)) { this.entity.setTarget(null); } this.entity.setAggressive(false); this.entity.getNavigation().stop(); this.targetPosX = 0.0D; this.targetPosY = 0.0D; this.targetPosZ = 0.0D; } @Override public void tick() { // Look at target LivingEntity target = this.entity.getTarget(); this.entity.getLookControl().setLookAt(target, 32.0F, 32.0F); setTargetPos(target); final double distance = this.entity.distanceToSqr(this.targetPosX, this.targetPosY, this.targetPosZ); this.ticksToMove--; LilSpooks.LOGGER.info(this.ticksToMove); if (this.ticksToMove <= 0 && this.entity.getSensing().canSee(target) && target.distanceToSqr(this.targetPosX, this.targetPosY, this.targetPosZ) >= 1.0D) { this.ticksToMove = 5 + this.random.nextInt(8); // Add extra time if eyes can't move to hopefully wait enough to try again (1 second). this.path = this.entity.getNavigation().createPath(new BlockPos(this.targetPosX, this.targetPosY, this.targetPosZ), 0); // Logging this.path == null returns "true" here as well if (!this.entity.getNavigation().moveTo(this.path, this.speed)) { this.ticksToMove += 20; } } this.attackTick = Math.max(this.attackTick - 1, 0); this.attemptAttack(target, distance); } protected void setTargetPos(LivingEntity target) { this.targetPosX = target.getX(); this.targetPosY = target.getBoundingBox().minY; this.targetPosZ = target.getZ(); } I have tried multiple ways of invoking createPath, I tried setting the moveControl of the entity with the goal to a new FlyingMovementController, and I've looked at how the createPath function works (though I can't figure out how to do a live debugging session, so I couldn't set a breakpoint at that code which would tell me exactly what causes it to be null). I tried my best to work through this for a few hours but I can't seem to figure it out. Any help is appreciated.
  • Topics

  • Who's Online (See full list)

  • Create New...

Important Information

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