Sciman101 Posted July 13, 2019 Posted July 13, 2019 (edited) I'm trying to make a projectile with several varieties, and instead of making 3 separate entites with largely the same code, I'm using an enum to distinguish between them. The only issue is, I want the different entity types to create different particle effects, but I can only access the 'type' enum on the server side. How would I go about making sure the client also has access to the enum? Here's my projectile class so far Reveal hidden contents //Imports removed public class EntityThrownBrick extends EntityThrowable { public enum BrickType { NORMAL, NETHER, ALCHEMICAL } private BrickType type; public EntityThrownBrick(World worldIn) { super(worldIn); } public EntityThrownBrick(World worldIn, double x, double y, double z) { super(worldIn, x, y, z); } public EntityThrownBrick(World worldIn, EntityLivingBase throwerIn) { super(worldIn, throwerIn); } public static void registerFixesBrick(DataFixer fixer) { EntityThrowable.registerFixesThrowable(fixer,"Brick"); } /** * Set what type of brick this is * @param type The type of brick */ public void setBrickType(BrickType type) { this.type = type; } /** * Get the brick type of this thrown brick * @return The type of brick */ public BrickType getBrickType() { return this.type; } @Override public void onEntityUpdate() { super.onEntityUpdate(); //Particles! Currently does not work if (!world.isRemote && this.getBrickType() == BrickType.NETHER) { for (int i = 0; i < 2; ++i) { this.world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width, this.posY + this.rand.nextDouble() * (double) this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width, 0.0D, 0.0D, 0.0D); } } } /** * Called when this EntityThrowable hits a block or entity. * * @param result */ @Override protected void onImpact(RayTraceResult result) { //If we hit an entity if (result.entityHit != null) { //Calculate damage int dmg = 3; //Do more to skeletons if (result.entityHit instanceof EntitySkeleton || result.entityHit instanceof EntityWitherSkeleton) { dmg = 6; } //Deal damage result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this,this.getThrower()),(float)dmg); if (!this.world.isRemote) { //Additional effects switch (type) { //Normal brick does nothing case NORMAL: break; case NETHER: //Nether brick lights enemies on fire result.entityHit.setFire(2); break; case ALCHEMICAL: //Alchemical brick summons a lightning bolt if (rand.nextDouble() < .1) { world.addWeatherEffect(new EntityLightningBolt(world, posX, posY, posZ, false)); } } } //Handle block hits }else if (result.typeOfHit == RayTraceResult.Type.BLOCK) { IBlockState state = this.world.getBlockState(result.getBlockPos()); //Check for glass //TODO make this break less things if (state.getMaterial() == Material.GLASS) { this.world.destroyBlock(result.getBlockPos(),true); //Check for additional effects }else if (!this.world.isRemote) { if (type == BrickType.NETHER && state.getBlock() == Blocks.SAND) { //'Smelt' glass this.world.setBlockState(result.getBlockPos(), Blocks.GLASS.getDefaultState()); //Add sound effect world.playSound(posX, posY, posZ, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 1.0f, 1.0f,false); //Alchemical bricks convert things based on a table }else if (type == BrickType.ALCHEMICAL) { //Unrelated code removed } } } //Kill entity if (!this.world.isRemote) { //Particle effects, does not currently work due to client/server issues switch (type) { case NETHER: for (int i = 0; i < 8; i++) { this.world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, posX + (rand.nextDouble() * 2) - 1, posY + (rand.nextDouble() * 2) - 1, posZ + (rand.nextDouble() * 2) - 1, 0.0D, 0.0D, 0.0D); } break; case ALCHEMICAL: for (int i = 0; i < 8; i++) { this.world.spawnParticle(EnumParticleTypes.FLAME, posX + (rand.nextDouble() * 2) - 1, posY + (rand.nextDouble() * 2) - 1, posZ + (rand.nextDouble() * 2) - 1, 0.0D, 0.0D, 0.0D); } break; } //Kill entity this.world.setEntityState(this, (byte)3); this.setDead(); } } } Edited July 13, 2019 by Sciman101 Quote
PhilipChonacky Posted July 15, 2019 Posted July 15, 2019 https://mcforge.readthedocs.io/en/1.13.x/networking/entities/#entities Quote
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.