001/*
002 * This file is part of Baritone.
003 *
004 * Baritone is free software: you can redistribute it and/or modify
005 * it under the terms of the GNU Lesser General Public License as published by
006 * the Free Software Foundation, either version 3 of the License, or
007 * (at your option) any later version.
008 *
009 * Baritone is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012 * GNU Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public License
015 * along with Baritone.  If not, see <https://www.gnu.org/licenses/>.
016 */
017
018package baritone.api.schematic.mask;
019
020import baritone.api.schematic.mask.operator.BinaryOperatorMask;
021import baritone.api.schematic.mask.operator.NotMask;
022import baritone.api.utils.BooleanBinaryOperators;
023import net.minecraft.world.level.block.state.BlockState;
024
025/**
026 * A mask that is context-free. In other words, it doesn't require the current block state to determine if a relative
027 * position is a part of the mask.
028 *
029 * @author Brady
030 */
031public interface StaticMask extends Mask {
032
033    /**
034     * Determines if a given relative coordinate is included in this mask, without the need for the current block state.
035     *
036     * @param x The relative x position of the block
037     * @param y The relative y position of the block
038     * @param z The relative z position of the block
039     * @return Whether the given position is included in this mask
040     */
041    boolean partOfMask(int x, int y, int z);
042
043    /**
044     * Implements the parent {@link Mask#partOfMask partOfMask function} by calling the static function
045     * provided in this functional interface without needing the {@link BlockState} argument. This {@code default}
046     * implementation should <b><u>NOT</u></b> be overriden.
047     *
048     * @param x            The relative x position of the block
049     * @param y            The relative y position of the block
050     * @param z            The relative z position of the block
051     * @param currentState The current state of that block in the world, may be {@code null}
052     * @return Whether the given position is included in this mask
053     */
054    @Override
055    default boolean partOfMask(int x, int y, int z, BlockState currentState) {
056        return this.partOfMask(x, y, z);
057    }
058
059    @Override
060    default StaticMask not() {
061        return new NotMask.Static(this);
062    }
063
064    default StaticMask union(StaticMask other) {
065        return new BinaryOperatorMask.Static(this, other, BooleanBinaryOperators.OR);
066    }
067
068    default StaticMask intersection(StaticMask other) {
069        return new BinaryOperatorMask.Static(this, other, BooleanBinaryOperators.AND);
070    }
071
072    default StaticMask xor(StaticMask other) {
073        return new BinaryOperatorMask.Static(this, other, BooleanBinaryOperators.XOR);
074    }
075
076    /**
077     * Returns a pre-computed mask using {@code this} function, with the specified size parameters.
078     */
079    default StaticMask compute() {
080        return new PreComputedMask(this);
081    }
082}