CrackedScreen Posted December 9, 2021 Share Posted December 9, 2021 (edited) 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 December 11, 2021 by CrackedScreen Marked as solved. Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted December 9, 2021 Share Posted December 9, 2021 which Entity? a vanilla Entity? Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 9, 2021 Share Posted December 9, 2021 Custom entities must override getAddEntityPacket and call NetworkHooks.getEntitySpawningPackets. Entity renderers must be registered using EntityRenderersEvent.RegisterRenderers. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 9, 2021 Author Share Posted December 9, 2021 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); } Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 9, 2021 Share Posted December 9, 2021 28 minutes ago, CrackedScreen said: ExampleMod.BULLET Show where you initialize this / create your EntityType. Is your event handler called? Show where you spawn the entity. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 9, 2021 Author Share Posted December 9, 2021 (edited) 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 December 9, 2021 by CrackedScreen Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 9, 2021 Share Posted December 9, 2021 1 minute ago, CrackedScreen said: 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"); Refer to the documentation on registries for how to properly register things. This is incorrect. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 9, 2021 Author Share Posted December 9, 2021 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. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 10, 2021 Author Share Posted December 10, 2021 Bump Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 10, 2021 Author Share Posted December 10, 2021 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); } Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 10, 2021 Share Posted December 10, 2021 Is your entity ticking on both sides? Post a Git repo of your mod so I can use the debugger. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 10, 2021 Author Share Posted December 10, 2021 1 hour ago, diesieben07 said: Is your entity ticking on both sides? Post a Git repo of your mod so I can use the debugger. I remember prints indicating which thread they come from previously but not anymore, that might have something to do with it. Uploaded code here: https://github.com/CrackedScreen/Mod_1.18 Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 11, 2021 Share Posted December 11, 2021 You never set the position for the bullet, hence it spawns at 0, 0, 0 and is never visible. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 11, 2021 Author Share Posted December 11, 2021 Fixed the spawn location problem, though the Item texture override I specified in my BulletRenderer isn't being used. Is it possible to override entity textures when extending from ThrownItemRenderer, or will I have to create an entirely new renderer from scratch? Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted December 11, 2021 Share Posted December 11, 2021 The renderer always uses the item texture as far as I know. You can override it but you might as well make your own renderer then. Quote Link to comment Share on other sites More sharing options...
CrackedScreen Posted December 11, 2021 Author Share Posted December 11, 2021 Thanks for helping. Marking this thread as solved. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.