- 5,024
- 47
- 784
Чет посидел и появилось настроение покодить. Короче, запилил что то такое - падающее дерево после срубки.
Чет никак не могу приложить ума, как бы мне чекать высоту ствола и спавнить рядом такой же длины?
Это работает вот так.
Чет никак не могу приложить ума, как бы мне чекать высоту ствола и спавнить рядом такой же длины?
Java:
boolean check;
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand)
{
if (!world.isRemote)
{
this.onBlockDestroyedByPlayer(world, pos, state);
}
}
int checker;
public int highTree;
private void checkBackBone(World world, BlockPos pos) {
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
for(int i = 0; i < 10; i++) {
checker++;
if(world.getBlockState(new BlockPos(x,y - i,z)) != RegBlocks.test_falling_log.getDefaultState()) {
break;
}
}
}
public void onBlockDestroyedByPlayer(World world, BlockPos pos, IBlockState state)
{
this.checkBackBone(world, pos);
this.checkFallableDown(world, pos);
this.checkFallableLogSouth1St(world, pos);
this.checkFallableLogSouth2St(world, pos);
}
private boolean checkFallableLogSouth1St(World world, BlockPos pos)
{
IBlockState state = world.getBlockState(pos);
if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
{
if(!world.isRemote) {
if(world.isAirBlock(pos.down())){
return false;
}
if(world.isAirBlock(pos.south())){
EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos.south()));
this.onStartFalling(efb);
world.spawnEntity(efb);
}
if( world.isAirBlock(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1))) {
world.setBlockState(new BlockPos(pos.getX(),pos.getY(),pos.getZ() + 1), state.withProperty(AXIS, EnumFacing.Axis.Z));
world.setBlockToAir(pos);
}
}
}
return check;
}
private void checkFallableDown(World world, BlockPos pos)
{
IBlockState state = world.getBlockState(pos);
if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
{
if(!world.isRemote) {
if(world.isAirBlock(pos.down())) {
EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(pos));
this.onStartFalling(efb);
world.spawnEntity(efb);
}
}
}
}
private void checkFallableLogSouth2St(World world, BlockPos pos)
{
if(!check) {
IBlockState state = world.getBlockState(pos);
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
if (world.isAreaLoaded(pos.add(-32, -32, -32), pos.add(32, 32, 32)))
{
if(!world.isRemote) {
if(world.isAirBlock(pos.down())){
return;
}
if(world.isAirBlock(pos.south())){
EntityFallingBlock efb = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 1)));
// EntityFallingBlock efb2 = new EntityFallingBlock(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, world.getBlockState(new BlockPos(x,y,z + 2)));
this.onStartFalling(efb);
world.spawnEntity(efb);
// world.spawnEntity(efb2);
}
if( world.getBlockState(new BlockPos(pos.getX(),pos.getY() - 1,pos.getZ() + 1)).getBlock() == RegBlocks.test_falling_log) {
world.setBlockState(new BlockPos(x,y,z + 2), state.withProperty(AXIS, EnumFacing.Axis.Z));
world.setBlockToAir(pos);
}
}
}
}
}