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}