Search in sources :

Example 1 with PosDistanceSorter

use of icbm.classic.lib.transform.PosDistanceSorter in project ICBM-Classic by BuiltBrokenModding.

the class BlastAntiGravitational method doExplode.

@Override
public // TODO rewrite entire method
boolean doExplode(// TODO rewrite entire method
int callCount) {
    int r = this.callCount;
    if (world() != null && !this.world().isRemote) {
        try {
            if (// TODO replace thread check with callback triggered by thread and delayed into main thread
            this.thread != null) {
                if (this.thread.isComplete) {
                    // Copy as concurrent list is not fast to sort
                    List<BlockPos> results = new ArrayList();
                    results.addAll(getThreadResults());
                    if (r == 0) {
                        Collections.sort(results, new PosDistanceSorter(location, true));
                    }
                    int blocksToTake = 20;
                    for (BlockPos targetPosition : results) {
                        final IBlockState blockState = world.getBlockState(targetPosition);
                        if (// don't pick up air
                        !blockState.getBlock().isAir(blockState, world, targetPosition) && // don't pick up replacable blocks like fire, grass, or snow (this does not include crops)
                        !blockState.getBlock().isReplaceable(world, targetPosition) && !(blockState.getBlock() instanceof IFluidBlock) && // don't pick up liquids
                        !(blockState.getBlock() instanceof BlockLiquid)) {
                            float hardness = blockState.getBlockHardness(world, targetPosition);
                            if (hardness >= 0 && hardness < 1000) {
                                if (world().rand.nextInt(3) > 0) {
                                    // Remove block
                                    world.setBlockToAir(targetPosition);
                                    // Mark blocks taken
                                    blocksToTake--;
                                    if (blocksToTake <= 0) {
                                        break;
                                    }
                                    // Create flying block
                                    EntityFlyingBlock entity = new EntityFlyingBlock(world(), targetPosition, blockState, 0);
                                    entity.yawChange = 50 * world().rand.nextFloat();
                                    entity.pitchChange = 100 * world().rand.nextFloat();
                                    entity.motionY += Math.max(0.15 * world().rand.nextFloat(), 0.1);
                                    entity.noClip = true;
                                    world().spawnEntity(entity);
                                    // Track flying block
                                    flyingBlocks.add(entity);
                                }
                            }
                        }
                    }
                }
            } else {
                String msg = String.format("BlastAntiGravitational#doPostExplode() -> Failed to run due to null thread" + "\nWorld = %s " + "\nThread = %s" + "\nSize = %s" + "\nPos = ", world, thread, size, location);
                ICBMClassic.logger().error(msg);
            }
        } catch (Exception e) {
            String msg = String.format("BlastAntiGravitational#doPostExplode() ->  Unexpected error while running post detonation code " + "\nWorld = %s " + "\nThread = %s" + "\nSize = %s" + "\nPos = ", world, thread, size, location);
            ICBMClassic.logger().error(msg, e);
        }
    }
    int radius = (int) this.getBlastRadius();
    AxisAlignedBB bounds = new AxisAlignedBB(location.x() - radius, location.y() - radius, location.z() - radius, location.y() + radius, 100, location.z() + radius);
    List<Entity> allEntities = world().getEntitiesWithinAABB(Entity.class, bounds);
    for (Entity entity : allEntities) {
        if (!(entity instanceof EntityFlyingBlock) && entity.posY < 100 + location.y()) {
            if (entity.motionY < 0.4) {
                entity.motionY += 0.15;
            }
        }
    }
    return this.callCount > 20 * 120;
}
Also used : PosDistanceSorter(icbm.classic.lib.transform.PosDistanceSorter) AxisAlignedBB(net.minecraft.util.math.AxisAlignedBB) Entity(net.minecraft.entity.Entity) IBlockState(net.minecraft.block.state.IBlockState) ArrayList(java.util.ArrayList) BlockLiquid(net.minecraft.block.BlockLiquid) EntityFlyingBlock(icbm.classic.content.entity.EntityFlyingBlock) IFluidBlock(net.minecraftforge.fluids.IFluidBlock) BlockPos(net.minecraft.util.math.BlockPos)

Aggregations

EntityFlyingBlock (icbm.classic.content.entity.EntityFlyingBlock)1 PosDistanceSorter (icbm.classic.lib.transform.PosDistanceSorter)1 ArrayList (java.util.ArrayList)1 BlockLiquid (net.minecraft.block.BlockLiquid)1 IBlockState (net.minecraft.block.state.IBlockState)1 Entity (net.minecraft.entity.Entity)1 AxisAlignedBB (net.minecraft.util.math.AxisAlignedBB)1 BlockPos (net.minecraft.util.math.BlockPos)1 IFluidBlock (net.minecraftforge.fluids.IFluidBlock)1