Posted July 13, 20196 yr 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 Spoiler //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, 20196 yr by Sciman101
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.