tcr/common/src/main/java/common/block/foliage/BlockDoublePlant.java
2025-07-22 21:20:06 +02:00

334 lines
11 KiB
Java
Executable file

package common.block.foliage;
import common.block.Block;
import common.block.Material;
import common.block.SoundType;
import common.entity.npc.EntityNPC;
import common.entity.types.EntityLiving;
import common.init.Blocks;
import common.init.Items;
import common.item.Item;
import common.item.ItemStack;
import common.item.StackSize;
import common.item.tool.ItemShears;
import common.model.Model;
import common.model.ModelProvider;
import common.model.GuiPosition;
import common.properties.Property;
import common.properties.PropertyEnum;
import common.rng.Random;
import common.tileentity.TileEntity;
import common.util.BlockPos;
import common.util.Identifyable;
import common.util.Facing.Axis;
import common.vars.Vars;
import common.world.IWorldAccess;
import common.world.State;
import common.world.World;
import common.world.AWorldServer;
public class BlockDoublePlant extends BlockBush implements IGrowable
{
public static final PropertyEnum<BlockDoublePlant.EnumBlockHalf> HALF = PropertyEnum.<BlockDoublePlant.EnumBlockHalf>create("half", BlockDoublePlant.EnumBlockHalf.class);
public static final BlockDoublePlant[] PLANTS = new BlockDoublePlant[EnumPlantType.values().length];
private final EnumPlantType type;
public static BlockDoublePlant getByType(EnumPlantType type) {
return PLANTS[type.ordinal()];
}
public BlockDoublePlant(EnumPlantType type)
{
super(Material.BUSH);
this.type = type;
this.setDefaultState(this.getBaseState().withProperty(HALF, BlockDoublePlant.EnumBlockHalf.LOWER));
this.setHardness(0.0F);
this.setSound(SoundType.GRASS);
this.setFlammable(60, 100);
PLANTS[type.ordinal()] = this;
}
public EnumPlantType getType() {
return this.type;
}
public void tick(AWorldServer worldIn, BlockPos pos, State state, Random rand)
{
if(Vars.plantDry && worldIn.getTemperatureC(pos) >= 50.0f)
{
boolean upper = state.getValue(HALF) == EnumBlockHalf.UPPER;
if(!upper)
pos = pos.up();
if(upper || worldIn.getState(pos).getBlock() == this)
worldIn.setState(pos, Blocks.air.getState());
pos = pos.down();
if(!upper || worldIn.getState(pos).getBlock() == this)
worldIn.setState(pos, this.type == EnumPlantType.GRASS || worldIn.rand.chance(20) ? Blocks.air.getState() :
Blocks.dead_bush.getState());
return;
}
super.tick(worldIn, pos, state, rand);
}
public void setBlockBounds(IWorldAccess worldIn, BlockPos pos)
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
public boolean canPlace(World worldIn, BlockPos pos)
{
return super.canPlace(worldIn, pos) && worldIn.isAirBlock(pos.up());
}
/**
* Whether this Block can be replaced directly by other blocks (true for e.g. tall grass)
*/
public boolean canReplace(World worldIn, BlockPos pos)
{
State iblockstate = worldIn.getState(pos);
if (iblockstate.getBlock() != this)
{
return true;
}
else
{
return this.type == BlockDoublePlant.EnumPlantType.FERN || this.type == BlockDoublePlant.EnumPlantType.GRASS;
}
}
protected void checkAndDropBlock(World worldIn, BlockPos pos, State state)
{
if (!this.canBlockStay(worldIn, pos, state))
{
boolean flag = state.getValue(HALF) == BlockDoublePlant.EnumBlockHalf.UPPER;
BlockPos blockpos = flag ? pos : pos.up();
BlockPos blockpos1 = flag ? pos.down() : pos;
Block block = (Block)(flag ? this : worldIn.getState(blockpos).getBlock());
Block block1 = (Block)(flag ? worldIn.getState(blockpos1).getBlock() : this);
if (block == this)
{
worldIn.setState(blockpos, Blocks.air.getState(), 2);
}
if (block1 == this)
{
worldIn.setState(blockpos1, Blocks.air.getState(), 3);
if (!flag)
{
this.drop(worldIn, blockpos1, state, 0);
}
}
}
}
public boolean canBlockStay(World worldIn, BlockPos pos, State state)
{
if (state.getValue(HALF) == BlockDoublePlant.EnumBlockHalf.UPPER)
{
return worldIn.getState(pos.down()).getBlock() == this;
}
else
{
State iblockstate = worldIn.getState(pos.up());
return iblockstate.getBlock() == this && super.canBlockStay(worldIn, pos, iblockstate);
}
}
/**
* Get the Item that this Block should drop when harvested.
*/
public Item getDrop(State state, Random rand, int fortune)
{
if (state.getValue(HALF) == BlockDoublePlant.EnumBlockHalf.UPPER)
{
return null;
}
else
{
return this.type == BlockDoublePlant.EnumPlantType.FERN ? null : (this.type == BlockDoublePlant.EnumPlantType.GRASS ? (rand.chance(8) ? Items.wheat_seed : null) : super.getDrop(state, rand, fortune));
}
}
public void placeAt(World worldIn, BlockPos lowerPos, int flags)
{
worldIn.setState(lowerPos, this.getState().withProperty(HALF, BlockDoublePlant.EnumBlockHalf.LOWER), flags);
worldIn.setState(lowerPos.up(), this.getState().withProperty(HALF, BlockDoublePlant.EnumBlockHalf.UPPER), flags);
}
/**
* Called by ItemBlocks after a block is set in the world, to allow post-place logic
*/
public void onPlace(World worldIn, BlockPos pos, State state, EntityLiving placer)
{
worldIn.setState(pos.up(), this.getState().withProperty(HALF, BlockDoublePlant.EnumBlockHalf.UPPER), 2);
}
public void postBroken(World worldIn, EntityNPC player, BlockPos pos, State state, TileEntity te)
{
if (worldIn.client || player.getCurrentEquippedItem() == null || !(player.getCurrentEquippedItem().getItem() instanceof ItemShears) || state.getValue(HALF) != BlockDoublePlant.EnumBlockHalf.LOWER || !this.onHarvest(worldIn, pos, state, player))
{
super.postBroken(worldIn, player, pos, state, te);
}
}
public void preBroken(World worldIn, BlockPos pos, State state, EntityNPC player)
{
if (state.getValue(HALF) == BlockDoublePlant.EnumBlockHalf.UPPER)
{
if (worldIn.getState(pos.down()).getBlock() == this)
{
// if (!player.creative)
// {
State iblockstate = worldIn.getState(pos.down());
if (this.type != BlockDoublePlant.EnumPlantType.FERN && this.type != BlockDoublePlant.EnumPlantType.GRASS)
{
worldIn.destroyBlock(pos.down(), true);
}
else if (!worldIn.client)
{
if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemShears)
{
this.onHarvest(worldIn, pos, iblockstate, player);
worldIn.setBlockToAir(pos.down());
}
else
{
worldIn.destroyBlock(pos.down(), true);
}
}
else
{
worldIn.setBlockToAir(pos.down());
}
// }
// else
// {
// worldIn.setBlockToAir(pos.down());
// }
}
}
// else if (player.creative && worldIn.getState(pos.up()).getBlock() == this)
// {
// worldIn.setState(pos.up(), Blocks.air.getState(), 2);
// }
super.preBroken(worldIn, pos, state, player);
}
private boolean onHarvest(World worldIn, BlockPos pos, State state, EntityNPC player)
{
if (this.type != BlockDoublePlant.EnumPlantType.FERN && this.type != BlockDoublePlant.EnumPlantType.GRASS)
{
return false;
}
else
{
dropItem(worldIn, pos, new ItemStack(this.type == BlockDoublePlant.EnumPlantType.GRASS ? Items.tallgrass : Items.fern, 2));
return true;
}
}
/**
* Whether this IGrowable can grow
*/
public boolean canGrow(World worldIn, BlockPos pos, State state, boolean isClient)
{
return this.type != BlockDoublePlant.EnumPlantType.GRASS && this.type != BlockDoublePlant.EnumPlantType.FERN;
}
public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos, State state)
{
return true;
}
public void grow(AWorldServer worldIn, Random rand, BlockPos pos, State state)
{
dropItem(worldIn, pos, new ItemStack(this.getItem()));
}
protected Property[] getProperties()
{
return new Property[] {HALF};
}
public Model getModel(ModelProvider provider, String name, State state) {
if(this.type == EnumPlantType.SUNFLOWER && state.getValue(HALF) == EnumBlockHalf.UPPER)
return provider.getModel("sunflower_front")
.add(0.8f, 0f, 8f, 15.2f, 8f, 8f).noShade().rotate(8, 8, 8, Axis.Y, 45, true).ns("sunflower_top")
.uv(0, 8, 16, 16).noCull()
.add(8f, 0f, 0.8f, 8f, 8f, 15.2f).noShade().rotate(8, 8, 8, Axis.Y, 45, true).we("sunflower_top")
.uv(0, 8, 16, 16).noCull()
.add(9.6f, -1f, 1f, 9.6f, 15f, 15f).noShade().rotate(8, 8, 8, Axis.Z, 22.5f, true).w("sunflower_back")
.uv(0, 0, 16, 16).noCull().e().uv(0, 0, 16, 16).noCull();
else
return provider.getModel(this.type.getName() + "_" + (state.getValue(HALF) == EnumBlockHalf.UPPER
? "top" : "bottom")).cross();
}
public GuiPosition getItemPosition() {
return GuiPosition.CROSS;
}
public State getItemState() {
return this.getState().withProperty(HALF, EnumBlockHalf.UPPER);
}
public StackSize getMaxAmount() {
return StackSize.S;
}
public static enum EnumBlockHalf implements Identifyable
{
UPPER,
LOWER;
public String toString()
{
return this.getName();
}
public String getName()
{
return this == UPPER ? "upper" : "lower";
}
}
public static enum EnumPlantType implements Identifyable
{
SUNFLOWER("sunflower", "Sonnenblume"),
SYRINGA("syringa", "Flieder"),
GRASS("large_tallgrass", "Hohes Gras"),
FERN("large_fern", "Großer Farn"),
ROSE("rose_bush", "Rosenstrauch"),
PAEONIA("paeonia", "Pfingstrose");
private final String name;
private final String display;
private EnumPlantType(String name, String display)
{
this.name = name;
this.display = display;
}
public String toString()
{
return this.name;
}
public String getName()
{
return this.name;
}
public String getDisplay()
{
return this.display;
}
}
}