tcr/common/src/common/block/BlockTallGrass.java
2025-05-13 17:02:57 +02:00

246 lines
7.3 KiB
Java
Executable file

package common.block;
import java.util.List;
import common.color.Colorizer;
import common.entity.npc.EntityNPC;
import common.init.Blocks;
import common.init.Config;
import common.init.Items;
import common.item.CheatTab;
import common.item.Item;
import common.item.ItemShears;
import common.item.ItemStack;
import common.material.Material;
import common.model.Model;
import common.model.ModelProvider;
import common.properties.IProperty;
import common.properties.PropertyEnum;
import common.rng.Random;
import common.tileentity.TileEntity;
import common.util.BlockPos;
import common.util.Identifyable;
import common.world.IWorldAccess;
import common.world.State;
import common.world.World;
import common.world.AWorldServer;
public class BlockTallGrass extends BlockBush implements IGrowable
{
public static final PropertyEnum<BlockTallGrass.EnumType> TYPE = PropertyEnum.<BlockTallGrass.EnumType>create("type", BlockTallGrass.EnumType.class);
public BlockTallGrass()
{
super(Material.vine);
this.setDefaultState(this.getBaseState().withProperty(TYPE, BlockTallGrass.EnumType.DEAD_BUSH));
float f = 0.4F;
this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.8F, 0.5F + f);
// this.setTickRandomly();
}
public void updateTick(AWorldServer worldIn, BlockPos pos, State state, Random rand)
{
if(Config.tallgrassDry && worldIn.getTemperatureC(pos) >= 50.0f && state.getValue(TYPE) != EnumType.DEAD_BUSH)
{
worldIn.setState(pos, state.getValue(TYPE) == EnumType.GRASS || worldIn.rand.chance(20) ? Blocks.air.getState() :
this.getState().withProperty(TYPE, EnumType.DEAD_BUSH));
return;
}
super.updateTick(worldIn, pos, state, rand);
}
// public int getBlockColor()
// {
// return ColorizerFoliage.getGrassColor(0.5D, 1.0D);
// }
public boolean canBlockStay(World worldIn, BlockPos pos, State state)
{
return this.canPlaceBlockOn(worldIn.getState(pos.down()).getBlock());
}
/**
* Whether this Block can be replaced directly by other blocks (true for e.g. tall grass)
*/
public boolean isReplaceable(World worldIn, BlockPos pos)
{
return true;
}
public int getRenderColor(State state)
{
if (state.getBlock() != this)
{
return super.getRenderColor(state);
}
else
{
BlockTallGrass.EnumType blocktallgrass$enumtype = (BlockTallGrass.EnumType)state.getValue(TYPE);
return blocktallgrass$enumtype == BlockTallGrass.EnumType.DEAD_BUSH ? 16777215 : Colorizer.getGrassColor(0.5D, 1.0D);
}
}
public int colorMultiplier(IWorldAccess worldIn, BlockPos pos, int renderPass)
{
return worldIn.getBiomeGenForCoords(pos).getGrassColorAtPos(pos);
}
/**
* Get the Item that this Block should drop when harvested.
*/
public Item getItemDropped(State state, Random rand, int fortune)
{
return rand.chance(8) ? Items.wheat : null;
}
/**
* Get the quantity dropped based on the given fortune level
*/
public int quantityDroppedWithBonus(int fortune, Random random)
{
return random.roll(fortune * 2 + 1);
}
public void harvestBlock(World worldIn, EntityNPC player, BlockPos pos, State state, TileEntity te)
{
if (!worldIn.client && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemShears)
{
// player.triggerAchievement(StatRegistry.mineBlockStatArray[BlockRegistry.getIdFromBlock(this)]);
spawnAsEntity(worldIn, pos, new ItemStack(Blocks.tallgrass, 1, ((BlockTallGrass.EnumType)state.getValue(TYPE)).getMeta()));
}
else
{
super.harvestBlock(worldIn, player, pos, state, te);
}
}
/**
* Gets the meta to use for the Pick Block ItemStack result
*/
public int getDamageValue(World worldIn, BlockPos pos)
{
State iblockstate = worldIn.getState(pos);
return iblockstate.getBlock().getMetaFromState(iblockstate);
}
/**
* returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
*/
public void getSubBlocks(Item itemIn, CheatTab tab, List<ItemStack> list)
{
for (int i = 0; i < 3; ++i) // FIX (dead)bush!
{
list.add(new ItemStack(itemIn, 1, i));
}
}
/**
* Whether this IGrowable can grow
*/
public boolean canGrow(World worldIn, BlockPos pos, State state, boolean isClient)
{
return state.getValue(TYPE) != BlockTallGrass.EnumType.DEAD_BUSH;
}
public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos, State state)
{
return true;
}
public void grow(AWorldServer worldIn, Random rand, BlockPos pos, State state)
{
BlockDoublePlant.EnumPlantType blockdoubleplant$enumplanttype = BlockDoublePlant.EnumPlantType.GRASS;
if (state.getValue(TYPE) == BlockTallGrass.EnumType.FERN)
{
blockdoubleplant$enumplanttype = BlockDoublePlant.EnumPlantType.FERN;
}
if (Blocks.double_plant.canPlaceBlockAt(worldIn, pos))
{
Blocks.double_plant.placeAt(worldIn, pos, blockdoubleplant$enumplanttype, 2);
}
}
/**
* Convert the given metadata into a BlockState for this Block
*/
public State getStateFromMeta(int meta)
{
return this.getState().withProperty(TYPE, BlockTallGrass.EnumType.byMetadata(meta));
}
/**
* Convert the BlockState into the correct metadata value
*/
public int getMetaFromState(State state)
{
return ((BlockTallGrass.EnumType)state.getValue(TYPE)).getMeta();
}
protected IProperty[] getProperties()
{
return new IProperty[] {TYPE};
}
// public EnumOffsetType getOffsetType()
// {
// return EnumOffsetType.XYZ;
// }
public Model getModel(ModelProvider provider, String name, State state) {
if(state.getValue(TYPE) != EnumType.DEAD_BUSH)
return provider.getModel(state.getValue(TYPE).getName()).crossTint();
else
return provider.getModel("deadbush").cross();
}
public static enum EnumType implements Identifyable
{
DEAD_BUSH(0, "dead_bush"),
GRASS(1, "tall_grass"),
FERN(2, "fern");
private static final BlockTallGrass.EnumType[] META_LOOKUP = new BlockTallGrass.EnumType[values().length];
private final int meta;
private final String name;
private EnumType(int meta, String name)
{
this.meta = meta;
this.name = name;
}
public int getMeta()
{
return this.meta;
}
public String toString()
{
return this.name;
}
public static BlockTallGrass.EnumType byMetadata(int meta)
{
if (meta < 0 || meta >= META_LOOKUP.length)
{
meta = 0;
}
return META_LOOKUP[meta];
}
public String getName()
{
return this.name;
}
static {
for (BlockTallGrass.EnumType blocktallgrass$enumtype : values())
{
META_LOOKUP[blocktallgrass$enumtype.getMeta()] = blocktallgrass$enumtype;
}
}
}
}