Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / VoxelShapeBitSet.java
package net.minecraft.server;

import java.util.BitSet;

public final class VoxelShapeBitSet extends VoxelShapeDiscrete {

    private final BitSet d;
    private int e;
    private int f;
    private int g;
    private int h;
    private int i;
    private int j;

    public VoxelShapeBitSet(int i, int j, int k) {
        this(i, j, k, i, j, k, 0, 0, 0);
    }

    public VoxelShapeBitSet(int i, int j, int k, int l, int i1, int j1, int k1, int l1, int i2) {
        super(i, j, k);
        this.d = new BitSet(i * j * k);
        this.e = l;
        this.f = i1;
        this.g = j1;
        this.h = k1;
        this.i = l1;
        this.j = i2;
    }

    public VoxelShapeBitSet(VoxelShapeDiscrete voxelshapediscrete) {
        super(voxelshapediscrete.a, voxelshapediscrete.b, voxelshapediscrete.c);
        if (voxelshapediscrete instanceof VoxelShapeBitSet) {
            this.d = (BitSet) ((VoxelShapeBitSet) voxelshapediscrete).d.clone();
        } else {
            this.d = new BitSet(this.a * this.b * this.c);

            for (int i = 0; i < this.a; ++i) {
                for (int j = 0; j < this.b; ++j) {
                    for (int k = 0; k < this.c; ++k) {
                        if (voxelshapediscrete.b(i, j, k)) {
                            this.d.set(this.a(i, j, k));
                        }
                    }
                }
            }
        }

        this.e = voxelshapediscrete.a(EnumDirection.EnumAxis.X);
        this.f = voxelshapediscrete.a(EnumDirection.EnumAxis.Y);
        this.g = voxelshapediscrete.a(EnumDirection.EnumAxis.Z);
        this.h = voxelshapediscrete.b(EnumDirection.EnumAxis.X);
        this.i = voxelshapediscrete.b(EnumDirection.EnumAxis.Y);
        this.j = voxelshapediscrete.b(EnumDirection.EnumAxis.Z);
    }

    protected int a(int i, int j, int k) {
        return (i * this.b + j) * this.c + k;
    }

    @Override
    public boolean b(int i, int j, int k) {
        return this.d.get(this.a(i, j, k));
    }

    @Override
    public void a(int i, int j, int k, boolean flag, boolean flag1) {
        this.d.set(this.a(i, j, k), flag1);
        if (flag && flag1) {
            this.e = Math.min(this.e, i);
            this.f = Math.min(this.f, j);
            this.g = Math.min(this.g, k);
            this.h = Math.max(this.h, i + 1);
            this.i = Math.max(this.i, j + 1);
            this.j = Math.max(this.j, k + 1);
        }

    }

    @Override
    public boolean a() {
        return this.d.isEmpty();
    }

    @Override
    public int a(EnumDirection.EnumAxis enumdirection_enumaxis) {
        return enumdirection_enumaxis.a(this.e, this.f, this.g);
    }

    @Override
    public int b(EnumDirection.EnumAxis enumdirection_enumaxis) {
        return enumdirection_enumaxis.a(this.h, this.i, this.j);
    }

    @Override
    protected boolean a(int i, int j, int k, int l) {
        return k >= 0 && l >= 0 && i >= 0 ? (k < this.a && l < this.b && j <= this.c ? this.d.nextClearBit(this.a(k, l, i)) >= this.a(k, l, j) : false) : false;
    }

    @Override
    protected void a(int i, int j, int k, int l, boolean flag) {
        this.d.set(this.a(k, l, i), this.a(k, l, j), flag);
    }

    static VoxelShapeBitSet a(VoxelShapeDiscrete voxelshapediscrete, VoxelShapeDiscrete voxelshapediscrete1, VoxelShapeMerger voxelshapemerger, VoxelShapeMerger voxelshapemerger1, VoxelShapeMerger voxelshapemerger2, OperatorBoolean operatorboolean) {
        VoxelShapeBitSet voxelshapebitset = new VoxelShapeBitSet(voxelshapemerger.a().size() - 1, voxelshapemerger1.a().size() - 1, voxelshapemerger2.a().size() - 1);
        int[] aint = new int[]{Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE};

        voxelshapemerger.a((i, j, k) -> {
            boolean[] aboolean = new boolean[]{false};
            boolean flag = voxelshapemerger1.a((l, i1, j1) -> {
                boolean[] aboolean1 = new boolean[]{false};
                boolean flag1 = voxelshapemerger2.a((k1, l1, i2) -> {
                    boolean flag2 = operatorboolean.apply(voxelshapediscrete.c(i, l, k1), voxelshapediscrete1.c(j, i1, l1));

                    if (flag2) {
                        voxelshapebitset.d.set(voxelshapebitset.a(k, j1, i2));
                        aint[2] = Math.min(aint[2], i2);
                        aint[5] = Math.max(aint[5], i2);
                        aboolean1[0] = true;
                    }

                    return true;
                });

                if (aboolean1[0]) {
                    aint[1] = Math.min(aint[1], j1);
                    aint[4] = Math.max(aint[4], j1);
                    aboolean[0] = true;
                }

                return flag1;
            });

            if (aboolean[0]) {
                aint[0] = Math.min(aint[0], k);
                aint[3] = Math.max(aint[3], k);
            }

            return flag;
        });
        voxelshapebitset.e = aint[0];
        voxelshapebitset.f = aint[1];
        voxelshapebitset.g = aint[2];
        voxelshapebitset.h = aint[3] + 1;
        voxelshapebitset.i = aint[4] + 1;
        voxelshapebitset.j = aint[5] + 1;
        return voxelshapebitset;
    }
}