Jump to content

[Solved][1.18] ThrownItemRenderer texture override


CrackedScreen

Recommended Posts

Is there a way to "override" an entity's texture to something else without creating a "dummy" item when using ThrownItemRenderer? I tried creating a Renderer that extends it with a ResourceLocation override but this does not change the entity's 2D texture. Any help would be appreciated.

Render class:

public class BulletEntityRenderer extends ThrownItemRenderer {

    private static final ResourceLocation TEXTURE = new ResourceLocation(ExampleMod.MOD_ID, "textures/entity/bullet.png");

    public BulletEntityRenderer(EntityRendererProvider.Context context) {
        super(context);
    }

    @Override
    public ResourceLocation getTextureLocation(Entity entity) {
        return TEXTURE;
    }
}

Render registry:

public class ModRender {

    public static void registerRender() {
        EntityRenderers.register(ExampleMod.BULLET, BulletEntityRenderer::new);
    }
}

Entity class:

public class BulletEntity extends ThrowableItemProjectile {

    private float damage = 12.0F;
    private int pierceLevel = 0;
    private int ticksAlive = 0;
    private final int lifespan = 60;

    public BulletEntity(EntityType<BulletEntity> type, Level world) {
        super(type, world);
    }

    public BulletEntity(Player player, Level world, float damage, int pierceLevel) {
        super(ExampleMod.BULLET, player, world);
        this.damage = damage;
        this.pierceLevel = pierceLevel;
        this.setNoGravity(true);
    }

    public DamageSource causeBulletDamage(BulletEntity bullet, Entity attacker) {
        return (new IndirectEntityDamageSource("bullet", bullet, attacker)).setProjectile();
    }

    public void tick() {
        super.tick();

        Vec3 vec3d = this.getDeltaMovement();
        double d1 = vec3d.x;
        double d2 = vec3d.y;
        double d0 = vec3d.z;

        if (this.isInWater()) {
            this.level.addParticle(ParticleTypes.BUBBLE, this.getX(), this.getY(), this.getZ(), -d1, -d2, -d0);
        } else {
            this.level.addParticle(ParticleTypes.SMOKE, this.getX(), this.getY(), this.getZ(), -d1, -d2, -d0);
        }

        if (ticksAlive > lifespan) {
            this.discard();
        }
        ticksAlive++;
    }

    @Override
    protected void onHitEntity(EntityHitResult hitResult) {
        LivingEntity target = (LivingEntity) hitResult.getEntity();
        Entity shooter = getOwner();
        double armor = target.getArmorValue() * (1 - (0.2 * pierceLevel));
        double toughness = target.getAttribute(Attributes.ARMOR_TOUGHNESS).getValue();
        float finalDamage = (float) (damage * (1 - (Math.min(20, Math.max((armor / 5), armor - ((4 * damage) / (toughness + 8))))) / 25));
        target.hurt(causeBulletDamage(this, shooter).bypassArmor(), finalDamage);
    }
    
    @Override
    public Item getDefaultItem() {
        return ModItems.BULLET;
    }
}
Edited by CrackedScreen
Marked as solved.
Link to comment
Share on other sites

6 hours ago, Luis_ST said:

which Entity? a vanilla Entity?

The entity I created uses the 2D item texture of itself when it spawns since it extends ThrowableItemProjectile, what I want to do is override/change this texture to something else in the renderer if this is possible.

6 hours ago, diesieben07 said:

Custom entities must override getAddEntityPacket and call NetworkHooks.getEntitySpawningPackets.

Entity renderers must be registered using EntityRenderersEvent.RegisterRenderers.

Did the following, but didn't have an effect on the texture (unless it isn't supposed to or I am still doing something incorrectly):

BulletEntity:

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

Main mod class:

@SubscribeEvent
public static void registerRenders(EntityRenderersEvent.RegisterRenderers event) {
	event.registerEntityRenderer(ExampleMod.BULLET, BulletEntityRenderer::new);
}

 

Link to comment
Share on other sites

Init:

public static EntityType<BulletEntity> BULLET = EntityType.Builder.<BulletEntity>of(BulletEntity::new, MobCategory.MISC)
            .sized(0.5F, 0.5F)
            .setTrackingRange(4)
            .setUpdateInterval(20)
            .setShouldReceiveVelocityUpdates(true)
            .build(MOD_ID + ":bullet");

Entity spawn:
 

    @Override
    public void createProjectile(Player player, Level level, ItemStack stack) {
        int pierceLevel = EnchantmentHelper.getItemEnchantmentLevel(ModEnchantments.FIREPOWER, stack);
        if (!level.isClientSide) {
            BulletEntity bullet = new BulletEntity(player, level, getDamage(), pierceLevel);
            bullet.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 1.5F, 1.0F);
            level.addFreshEntity(bullet);
        }
    }
Edited by CrackedScreen
Link to comment
Share on other sites

Swapped the entity to a RegistryObject, but now getting a constructor error in my Entity Class:
 

Cannot resolve constructor 'BulletEntity'

Registry:

public static final RegistryObject<EntityType<? extends BulletEntity>> BULLET = ENTITIES.register("bullet", () -> EntityType.Builder.of(BulletEntity::new, MobCategory.MISC)
            .sized(0.5F, 0.5F)
            .setShouldReceiveVelocityUpdates(true)
            .setTrackingRange(4)
            .setUpdateInterval(20)
            .build("bullet"));

Class constructors:

    public BulletEntity(EntityType<? extends BulletEntity> type, Level level) {
        super(type, level);
    }

    public BulletEntity(Level level, float damage, int pierceLevel) {
        super(ExampleMod.BULLET.get(), level);
        this.damage = damage;
        this.pierceLevel = pierceLevel;
        this.setNoGravity(true);
    }

The second constructor is used elsewhere to create the projectile in the world, yet the IDE will not stop throwing an error until it is removed or commented out.

I ask again if it is possible to change a 2D item texture from a projectile extending ThrowableProjectileEntity using a custom render (extending from ThrownItemRenderer), as that was my original question.

Link to comment
Share on other sites

Bumping topic again, as I have gotten the projectile to register properly and even print out the amount of ticks it is alive, yet doesn't "spawn" in the world when it should be.

Spawning code:

    @Override
    public void createProjectile(Player player, Level level, ItemStack stack) {
        int pierceLevel = EnchantmentHelper.getItemEnchantmentLevel(ModEnchantments.FIREPOWER, stack);
        if (!level.isClientSide) {
            BulletEntity bullet = new BulletEntity(level, getDamage(), pierceLevel);
            bullet.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 1.5F, 1.0F);
            level.addFreshEntity(bullet);
        }
    }

BulletEntity:
 

public class BulletEntity extends ThrowableItemProjectile {

    private float damage = 12.0F;
    private int pierceLevel = 0;
    private int ticksAlive = 0;
    private final int lifespan = 60;

    public BulletEntity(EntityType<? extends BulletEntity> type, Level level) {
        super(type, level);
    }

    public BulletEntity(Level level, float damage, int pierceLevel) {
        super(ExampleMod.BULLET.get(), level);
        this.damage = damage;
        this.pierceLevel = pierceLevel;
        this.setNoGravity(true);
    }

    public DamageSource causeBulletDamage(BulletEntity bullet, Entity attacker) {
        return (new IndirectEntityDamageSource("bullet", bullet, attacker)).setProjectile();
    }

    public void tick() {
        super.tick();

        Vec3 vec3d = this.getDeltaMovement();
        double d1 = vec3d.x;
        double d2 = vec3d.y;
        double d0 = vec3d.z;

        if (this.isInWater()) {
            this.level.addParticle(ParticleTypes.BUBBLE, this.getX(), this.getY(), this.getZ(), -d1, -d2, -d0);
        } else {
            this.level.addParticle(ParticleTypes.SMOKE, this.getX(), this.getY(), this.getZ(), -d1, -d2, -d0);
        }

        if (ticksAlive > lifespan) {
            this.discard();
        }
        ticksAlive++;
    }

    @Override
    protected void onHitEntity(EntityHitResult hitResult) {
        LivingEntity target = (LivingEntity) hitResult.getEntity();
        Entity shooter = getOwner();
        double armor = target.getArmorValue() * (1 - (0.2 * pierceLevel));
        double toughness = target.getAttribute(Attributes.ARMOR_TOUGHNESS).getValue();
        float finalDamage = (float) (damage * (1 - (Math.min(20, Math.max((armor / 5), armor - ((4 * damage) / (toughness + 8))))) / 25));
        target.hurt(causeBulletDamage(this, shooter).bypassArmor(), finalDamage);
    }

    @Override
    public Item getDefaultItem() {
        return ModItems.BULLET;
    }

    public Packet<?> getAddEntityPacket() {
        return NetworkHooks.getEntitySpawningPacket(this);
    }
}

Registry:

public static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITIES, MOD_ID);

public static final RegistryObject<EntityType<BulletEntity>> BULLET = ENTITIES.register("bullet", () -> EntityType.Builder.<BulletEntity>of(BulletEntity::new, MobCategory.MISC)
            .sized(0.5F, 0.5F)
            .setShouldReceiveVelocityUpdates(true)
            .setTrackingRange(4)
            .setUpdateInterval(20)
            .build("bullet"));
  
public ExampleMod() {
	ENTITIES.register(FMLJavaModLoadingContext.get().getModEventBus());
	MinecraftForge.EVENT_BUS.register(this);
}

 

Link to comment
Share on other sites

  • CrackedScreen changed the title to [Solved][1.18] ThrownItemRenderer texture override

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Sonic77 adalah pilihan tepat bagi Anda yang menginginkan pengalaman bermain slot yang unggul dengan akun pro Swiss terbaik. Berikut adalah beberapa alasan mengapa Anda harus memilih Sonic77: Slot Gacor Terbaik Kami menyajikan koleksi slot gacor terbaik dari provider terkemuka. Dengan fitur-fitur unggulan dan peluang kemenangan yang tinggi, Anda akan merasakan pengalaman bermain yang tak terlupakan. Akun Pro Swiss Berkualitas Kami menawarkan akun pro Swiss yang berkualitas dan terpercaya. Dengan akun ini, Anda dapat menikmati berbagai keuntungan eksklusif dan fasilitas premium yang tidak tersedia untuk akun reguler.
    • SV388 SITUS RESMI SABUNG AYAM 2024   Temukan situs resmi untuk sabung ayam terpercaya di tahun 2024 dengan SV388! Dengan layanan terbaik dan pengalaman bertaruh yang tak tertandingi, SV388 adalah tempat terbaik untuk pecinta sabung ayam. Daftar sekarang untuk mengakses arena sabung ayam yang menarik dan nikmati kesempatan besar untuk meraih kemenangan. Jelajahi sensasi taruhan yang tak terlupakan di tahun ini dengan SV388! [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]   JURAGANSLOT88 SITUS JUDI SLOT ONLINE TERPERCAYA 2024 Jelajahi pengalaman judi slot online terpercaya di tahun 2024 dengan JuraganSlot88! Sebagai salah satu situs terkemuka, JuraganSlot88 menawarkan berbagai pilihan permainan slot yang menarik dengan layanan terbaik dan keamanan yang terjamin. Daftar sekarang untuk mengakses sensasi taruhan yang tak terlupakan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan JuraganSlot88 [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
    • Slot Bank MEGA atau Daftar slot Bank MEGA bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.
    • ladangtoto situs resmi ladangtoto situs terpercaya 2024   Temukan situs resmi dan terpercaya untuk tahun 2024 di LadangToto! Dengan layanan terbaik dan keamanan yang terjamin, LadangToto adalah pilihan utama untuk penggemar judi online. Daftar sekarang untuk mengakses berbagai jenis permainan taruhan, termasuk togel, kasino, dan banyak lagi. Jelajahi sensasi taruhan yang tak terlupakan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan LadangToto!" [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
    • WINNING303 DAFTAR SITUS JUDI SLOT RESMI TERPERCAYA 2024 Temukan situs judi slot resmi dan terpercaya untuk tahun 2024 di Winning303! Daftar sekarang untuk mengakses pengalaman berjudi slot yang aman dan terjamin. Dengan layanan terbaik dan reputasi yang kokoh, Winning303 adalah pilihan terbaik bagi para penggemar judi slot. Jelajahi berbagai pilihan permainan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan Winning303 [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.