use of net.minecraft.block.material.EnumPushReaction in project Solar by ArekkuusuJerii.
the class TileDilaton method pushExtension.
public void pushExtension(boolean powered) {
if (!world.isRemote && !(!isActiveLazy() && !powered)) {
ProfilerHelper.flagSection("[Dilaton] Redstone signal received");
BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(getPos());
EnumFacing facing = getFacingLazy();
int range = powered ? getRedstonePower() + 1 : 16;
int pointer = 0;
if (isActiveLazy()) {
ProfilerHelper.flagSection("[Dilaton] Locate nearest extension");
boolean found = false;
for (; pointer < range; pointer++) {
if (!isPosValid(pos.move(facing)) || pointer >= range)
return;
IBlockState state = world.getBlockState(pos);
if (state.getBlock() == ModBlocks.DILATON_EXTENSION) {
world.setBlockToAir(pos);
found = true;
break;
}
}
if (!found)
return;
if (!powered)
pointer = 0;
}
ProfilerHelper.begin("[Dilaton] Gathering pushed blocks");
if (!powered)
facing = facing.getOpposite();
List<Triple<IBlockState, NBTTagCompound, BlockPos>> pushed = Lists.newArrayList();
List<BlockPos> removed = Lists.newArrayList();
loop: for (; pointer < range; pointer++) {
if (pos.move(facing).equals(getPos()) || !isPosValid(pos))
break;
IBlockState next = world.getBlockState(pos);
if (next.getBlock() == Blocks.AIR)
continue;
float hardness = next.getBlockHardness(world, pos);
if (hardness > 2000F || hardness < 0F)
break;
EnumPushReaction reaction;
if (next.getMaterial() == Material.WATER)
reaction = EnumPushReaction.IGNORE;
else
reaction = next.getMobilityFlag();
switch(reaction) {
case PUSH_ONLY:
case NORMAL:
if (pushed.add(getStateTile(next, pos.toImmutable())) && pushed.size() > 15)
break loop;
else
++range;
continue loop;
case DESTROY:
removed.add(pos.toImmutable());
continue loop;
case BLOCK:
break loop;
case IGNORE:
}
}
ProfilerHelper.interrupt("[Dilaton] Relocating pushed blocks");
Set<BlockPos> deleted = Sets.newHashSet();
if (pushed.size() <= 15) {
pos.move(facing.getOpposite());
}
for (int i = 0, size = pushed.size(); i < size; i++) {
if (isPosReplaceable(pos)) {
for (int index = pushed.size() - 1; index >= 0; index--) {
Triple<IBlockState, NBTTagCompound, BlockPos> triplet = pushed.get(index);
if (setStateTile(triplet.getLeft(), triplet.getMiddle(), pos.toImmutable()))
removed.add(pos.toImmutable());
BlockPos oldPos = triplet.getRight();
if (deleted.add(oldPos))
deleted.removeIf(a -> a.equals(pos));
pos.move(facing.getOpposite());
}
deleted.forEach(delete -> {
if (world.getTileEntity(delete) != null)
world.removeTileEntity(delete);
world.setBlockToAir(delete);
});
break;
} else if (!pushed.isEmpty())
pushed.remove(pushed.size() - 1);
pos.move(facing.getOpposite());
}
ProfilerHelper.flagSection("[Dilaton] Block drops");
removed.forEach(p -> {
IBlockState state = world.getBlockState(p);
float chance = state.getBlock() instanceof BlockSnow ? -1.0F : 1.0F;
state.getBlock().dropBlockAsItemWithChance(world, p, state, chance, 0);
world.setBlockToAir(p);
});
ProfilerHelper.end();
ProfilerHelper.flagSection("[Dilaton] Place extension");
if (pos.equals(getPos().offset(facing.getOpposite()))) {
if (isActiveLazy())
world.setBlockState(getPos(), world.getBlockState(getPos()).withProperty(State.ACTIVE, false));
} else if (!pos.equals(getPos())) {
if (!isActiveLazy())
world.setBlockState(getPos(), world.getBlockState(getPos()).withProperty(State.ACTIVE, true));
IBlockState extension = ModBlocks.DILATON_EXTENSION.getDefaultState().withProperty(BlockDirectional.FACING, facing);
world.setBlockState(pos, extension);
}
}
}
Aggregations