From ed8cc961bd9faed9fb7f72b6ebc3bf6cc36a0f76 Mon Sep 17 00:00:00 2001 From: Cheeserolls Date: Thu, 26 Mar 2015 02:06:08 +0000 Subject: [PATCH] Add smoldering grass and spectral moss --- .../biomesoplenty/api/block/BOPBlocks.java | 1 + .../common/block/BlockBOPGrass.java | 284 ++++++++++++++++++ .../biomesoplenty/common/init/ModBlocks.java | 2 + .../assets/biomesoplenty/lang/en_US.lang | 4 +- .../models/block/smoldering_grass_block.json | 8 +- 5 files changed, 293 insertions(+), 6 deletions(-) create mode 100644 src/main/java/biomesoplenty/common/block/BlockBOPGrass.java diff --git a/src/main/java/biomesoplenty/api/block/BOPBlocks.java b/src/main/java/biomesoplenty/api/block/BOPBlocks.java index eb3f675f3..eb87edbc2 100644 --- a/src/main/java/biomesoplenty/api/block/BOPBlocks.java +++ b/src/main/java/biomesoplenty/api/block/BOPBlocks.java @@ -31,4 +31,5 @@ public class BOPBlocks public static Block mud; public static Block turnip_block; public static Block flesh; + public static Block grass; } diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java b/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java new file mode 100644 index 000000000..c46a5017c --- /dev/null +++ b/src/main/java/biomesoplenty/common/block/BlockBOPGrass.java @@ -0,0 +1,284 @@ +/******************************************************************************* + * Copyright 2014, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package biomesoplenty.common.block; + +import java.util.Random; + +import biomesoplenty.api.block.BOPBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirt; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.IStringSerializable; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class BlockBOPGrass extends BOPBlock +{ + public static final PropertyEnum VARIANT_PROP = PropertyEnum.create("variant", BOPGrassType.class); + + public BlockBOPGrass() + { + super(Material.grass); + this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT_PROP, BOPGrassType.SPECTRALMOSS)); + this.setHardness(0.6F); + this.setHarvestLevel("shovel", 0); // TODO: this means that ONLY a shovel can harvest this block... correct? + this.setStepSound(Block.soundTypeGrass); + this.setTickRandomly(true); + } + + @Override + public IBlockState getStateFromMeta(int meta) + { + // only one property to worry about, the variant, so just map [0 => SPECTRALMOSS, 1 => SMOLDERINGGRASS] + return this.getDefaultState().withProperty(VARIANT_PROP, BOPGrassType.values()[meta]); + } + + @Override + public int getMetaFromState(IBlockState state) + { + // only one property to worry about, the variant, so just map [0 => SPECTRALMOSS, 1 => SMOLDERINGGRASS] + return ((BOPGrassType) state.getValue(VARIANT_PROP)).ordinal(); + } + + @Override + protected BlockState createBlockState() + { + return new BlockState(this, new IProperty[] { VARIANT_PROP }); + } + + @Override + public IProperty[] getPresetProperties() + { + return new IProperty[] { VARIANT_PROP }; + } + + @Override + public String getStateName(IBlockState state, boolean fullName) + { + return ((BOPGrassType) state.getValue(VARIANT_PROP)).getName(); + } + + @Override + public boolean isFireSource(World world, BlockPos pos, EnumFacing side) + { + IBlockState state = world.getBlockState(pos); + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + // spectralmoss burns from below in the end + // TODO: 1.7 code had dimension=-1 here - check -1 corresponds to end + case SPECTRALMOSS: + if ((world.provider instanceof net.minecraft.world.WorldProviderEnd) && side == EnumFacing.UP) {return true;} + break; + + // smolderinggrass always burns + case SMOLDERINGGRASS: + return false; + } + return super.isFireSource(world, pos, side); + } + + @Override + public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + { + IBlockState state = this.getStateFromMeta(meta); + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + // spectralmoss makes a hideous noise and throws a big fuss of particles around when placed in the nether + case SPECTRALMOSS: + if (world.provider instanceof net.minecraft.world.WorldProviderHell) + { + world.playSound(pos.getX(), pos.getY(), pos.getZ(), "mob.ghast.death", 20.0F, (float)Math.random() * 0.1F, true); + for (int l = 0; l < 8; ++l) + { + world.spawnParticle(EnumParticleTypes.FLAME, (double)pos.getX() + Math.random(), (double)pos.getY() + Math.random(), (double)pos.getZ() + Math.random(), 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, (double)pos.getX() + Math.random(), (double)pos.getY() + Math.random(), (double)pos.getZ() + Math.random(), 0.0D, 0.0D, 0.0D); + } + } + break; + + case SMOLDERINGGRASS: + break; + } + return state; + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + case SPECTRALMOSS: + break; + + // smolderinggrass throws up random flame and smoke particles + case SMOLDERINGGRASS: + if (rand.nextInt(4)==0) + { + worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, (double)((float)pos.getX() + rand.nextFloat()), (double)((float)pos.getY() + 1.1F), (double)((float)pos.getZ() + rand.nextFloat()), 0.0D, 0.0D, 0.0D); + } + if (rand.nextInt(6)==0) + { + worldIn.spawnParticle(EnumParticleTypes.FLAME, (double)((float)pos.getX() + rand.nextFloat()), (double)((float)pos.getY() + 1.1F), (double)((float)pos.getZ() + rand.nextFloat()), 0.0D, 0.0D, 0.0D); + } + break; + } + super.randomDisplayTick(worldIn, pos, state, rand); + } + + @Override + @SideOnly(Side.CLIENT) + public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) { + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + case SPECTRALMOSS: + // spectral moss in the nether catches on fire and turns to smoldering grass + // elsewhere it should behave like grass spreading to nearby end_stone blocks + if (world.provider instanceof net.minecraft.world.WorldProviderHell) + { + world.setBlockState(pos.up(), Blocks.fire.getDefaultState()); // might need to set fire AGE value... not sure + world.setBlockState(pos, this.getDefaultState().withProperty(VARIANT_PROP, BOPGrassType.SMOLDERINGGRASS)); + } + else + { + // if this block is covered, then turn it back to end_stone (IE kill the moss) + if (world.getLightFromNeighbors(pos.up()) < 4 && world.getBlockState(pos.up()).getBlock().getLightOpacity(world, pos.up()) > 2) + { + world.setBlockState(pos, Blocks.end_stone.getDefaultState()); + } + else + { + // if there's enough light from above, spread the moss randomly to nearby end_stone blocks + if (world.getLightFromNeighbors(pos.up()) >= 9) + { + for (int i = 0; i < 4; ++i) // try 4 times + { + // pick a random nearby position + BlockPos pos1 = pos.add(rand.nextInt(3) - 1, rand.nextInt(5) - 3, rand.nextInt(3) - 1); + Block blockAbove = world.getBlockState(pos1.up()).getBlock(); + IBlockState iblockstate1 = world.getBlockState(pos1); + // if there's enough light and it isn't covered, turn it to moss + if (iblockstate1.getBlock() == Blocks.end_stone && world.getLightFromNeighbors(pos1.up()) >= 4 && blockAbove.getLightOpacity(world, pos1.up()) <= 2) + { + world.setBlockState(pos1, this.getDefaultState().withProperty(VARIANT_PROP, BOPGrassType.SPECTRALMOSS) ); + } + } + } + } + } + break; + + case SMOLDERINGGRASS: + break; + } + } + + @Override + public AxisAlignedBB getCollisionBoundingBox(World world, BlockPos pos, IBlockState state) + { + float heightOffset = 0.0F; + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + case SPECTRALMOSS: + break; + + // smoldering grass is a tiny bit lower than usual + case SMOLDERINGGRASS: + heightOffset = 0.02F; + break; + } + return new AxisAlignedBB((double) pos.getX(), (double) pos.getY(), (double) pos.getZ(), (double) (pos.getX() + 1), (double) ((float) (pos.getY() + 1) - heightOffset), (double) (pos.getZ() + 1)); + } + + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) + { + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + case SPECTRALMOSS: + break; + + // smoldering grass sets you on fire for 2 seconds + case SMOLDERINGGRASS: + entity.setFire(2); + break; + } + } + + // you need a silk touch tool to pick up grass-like blocks - by default they drop the corresponding 'dirt' type + @Override + public Item getItemDropped(IBlockState state, Random rand, int fortune) + { + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + case SPECTRALMOSS: + return Item.getItemFromBlock(Blocks.end_stone); + + case SMOLDERINGGRASS: + return Item.getItemFromBlock(Blocks.dirt); + } + return super.getItemDropped(state, rand, fortune); + } + + // goes hand in hand with getItemDropped() above to determine precisely what is dropped + @Override + public int damageDropped(IBlockState state) + { + switch ((BOPGrassType) state.getValue(VARIANT_PROP)) + { + // end stone doesn't have any variants + case SPECTRALMOSS: + return 0; + + // make sure dirt item dropped is plain dirt (not any other variant) + case SMOLDERINGGRASS: + return BlockDirt.DirtType.DIRT.getMetadata(); + } + return super.damageDropped(state); + } + + + // enum representing the 2 variants of grass + public static enum BOPGrassType implements IStringSerializable + { + SPECTRALMOSS, SMOLDERINGGRASS; + + @Override + public String getName() + { + switch(this) + { + case SPECTRALMOSS: + return "spectral_moss"; + case SMOLDERINGGRASS: + return "smoldering_grass_block"; + } + return this.name().toLowerCase(); + } + + @Override + public String toString() + { + return getName(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/biomesoplenty/common/init/ModBlocks.java b/src/main/java/biomesoplenty/common/init/ModBlocks.java index a6c8b2184..6146d7ae6 100644 --- a/src/main/java/biomesoplenty/common/init/ModBlocks.java +++ b/src/main/java/biomesoplenty/common/init/ModBlocks.java @@ -21,6 +21,7 @@ import biomesoplenty.api.block.BOPBlock; import biomesoplenty.common.block.BlockAsh; import biomesoplenty.common.block.BlockBOPFlower; import biomesoplenty.common.block.BlockBOPFlower2; +import biomesoplenty.common.block.BlockBOPGrass; import biomesoplenty.common.block.BlockBOPLog; import biomesoplenty.common.block.BlockBOPLog2; import biomesoplenty.common.block.BlockBOPLog3; @@ -65,6 +66,7 @@ public class ModBlocks mud = registerBlock(new BlockMud(), "mud"); turnip_block = registerBlock(new BlockTurnip(), "turnip_block"); flesh = registerBlock(new BlockFlesh(), "flesh"); + grass = registerBlock(new BlockBOPGrass(), "grass"); } private static Block registerBlock(BOPBlock block, String name) diff --git a/src/main/resources/assets/biomesoplenty/lang/en_US.lang b/src/main/resources/assets/biomesoplenty/lang/en_US.lang index a4e2a4217..beeb396ff 100644 --- a/src/main/resources/assets/biomesoplenty/lang/en_US.lang +++ b/src/main/resources/assets/biomesoplenty/lang/en_US.lang @@ -11,8 +11,8 @@ tile.bone_segment.small.name=Small Bone Segment tile.bone_segment.medium.name=Medium Bone Segment tile.bone_segment.large.name=Large Bone Segment -tile.bopGrass.spectral_moss.name=Spectral Moss -tile.bopGrass.smoldering_grass_block.name=Smoldering Grass Block +tile.grass.spectral_moss.name=Spectral Moss +tile.grass.smoldering_grass_block.name=Smoldering Grass Block tile.coral.pink.name=Pink Coral tile.coral.orange.name=Orange Coral diff --git a/src/main/resources/assets/biomesoplenty/models/block/smoldering_grass_block.json b/src/main/resources/assets/biomesoplenty/models/block/smoldering_grass_block.json index 2cc49526b..1df595704 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/smoldering_grass_block.json +++ b/src/main/resources/assets/biomesoplenty/models/block/smoldering_grass_block.json @@ -1,9 +1,9 @@ { "parent": "block/cube_bottom_top", "textures": { - "particle": "biomesoplenty:blocks/smoldering_grass_block_bottom", - "bottom": "biomesoplenty:blocks/smoldering_grass_block_bottom", - "top": "biomesoplenty:blocks/smoldering_grass_block_top", - "side": "biomesoplenty:blocks/smoldering_grass_block_side" + "particle": "biomesoplenty:blocks/smoldering_grass_bottom", + "bottom": "biomesoplenty:blocks/smoldering_grass_bottom", + "top": "biomesoplenty:blocks/smoldering_grass_top", + "side": "biomesoplenty:blocks/smoldering_grass_side" } } \ No newline at end of file