All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.nukkit.utils.functional.BlockPositionConsumer Maven / Gradle / Ivy

There is a newer version: 1.20.40-r1
Show newest version
package cn.nukkit.utils.functional;

import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.math.IntIncrementSupplier;
import cn.nukkit.math.NukkitMath;
import com.google.common.base.Preconditions;

import java.util.stream.IntStream;

@PowerNukkitOnly
@Since("1.4.0.0-PN")
@FunctionalInterface
public interface BlockPositionConsumer {
    @PowerNukkitOnly
    @Since("1.4.0.0-PN")
    void accept(int x, int y, int z);

    @PowerNukkitOnly
    @Since("1.4.0.0-PN")
    static void validate(int fromX, int fromY, int fromZ, int toX, int toY, int toZ, int xInc, int yInc, int zInc) {
        if (fromX <= toX) {
            Preconditions.checkArgument(xInc > 0, "Invalid xInc");
        } else {
            Preconditions.checkArgument(xInc < 0, "Invalid xInc");
        }

        if (fromY <= toY) {
            Preconditions.checkArgument(yInc > 0, "Invalid yInc");
        } else {
            Preconditions.checkArgument(yInc < 0, "Invalid yInc");
        }

        if (fromZ <= toZ) {
            Preconditions.checkArgument(zInc > 0, "Invalid zInc");
        } else {
            Preconditions.checkArgument(zInc < 0, "Invalid zInc");
        }
    }

    @PowerNukkitOnly
    @Since("1.4.0.0-PN")
    static void xzy(int fromX, int fromY, int fromZ, int toX, int toY, int toZ, int xInc, int yInc, int zInc, BlockPositionConsumer iterator) {
        validate(fromX, fromY, fromZ, toX, toY, toZ, xInc, yInc, zInc);

        IntStream xStream = new IntIncrementSupplier(fromX, xInc).stream().limit(NukkitMath.floorFloat((toX - fromX) / (float) xInc));
        IntStream yStream = new IntIncrementSupplier(fromY, yInc).stream().limit(NukkitMath.floorFloat((toY - fromY) / (float) yInc));
        IntStream zStream = new IntIncrementSupplier(fromZ, zInc).stream().limit(NukkitMath.floorFloat((toZ - fromZ) / (float) zInc));

        xStream.forEachOrdered(x ->
                zStream.forEachOrdered(z ->
                        yStream.forEachOrdered(y ->
                                iterator.accept(x, y, z)
                        )));
    }

    @PowerNukkitOnly
    @Since("1.4.0.0-PN")
    static void xzy(int fromX, int fromY, int fromZ, int toX, int toY, int toZ, BlockPositionConsumer iterator) {
        xzy(fromX, fromY, fromZ, toX, toY, toZ, fromX <= toX ? 1 : -1, fromY <= toY ? 1 : -1, fromZ <= toZ ? 1 : -1, iterator);
    }

    @PowerNukkitOnly
    @Since("1.4.0.0-PN")
    static void xzy(int toX, int toY, int toZ, BlockPositionConsumer iterator) {
        xzy(0, 0, 0, toX, toY, toZ, iterator);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy