/
BlockPredicate.java
61 lines (51 loc) · 2.34 KB
/
BlockPredicate.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package slimeknights.mantle.data.predicate.block;
import net.minecraft.world.level.block.state.BlockBehaviour.BlockStateBase;
import net.minecraft.world.level.block.state.BlockState;
import slimeknights.mantle.data.predicate.AndJsonPredicate;
import slimeknights.mantle.data.predicate.IJsonPredicate;
import slimeknights.mantle.data.predicate.InvertedJsonPredicate;
import slimeknights.mantle.data.predicate.NestedJsonPredicateLoader;
import slimeknights.mantle.data.predicate.OrJsonPredicate;
import slimeknights.mantle.data.registry.GenericLoaderRegistry;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IGenericLoader;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.SingletonLoader;
import java.util.function.Predicate;
/**
* Simple serializable block predicate
*/
public interface BlockPredicate extends IJsonPredicate<BlockState> {
/** Predicate that matches any block */
BlockPredicate ANY = simple(state -> true);
/** Loader for block state predicates */
GenericLoaderRegistry<IJsonPredicate<BlockState>> LOADER = new GenericLoaderRegistry<>(ANY, true);
/** Loader for inverted conditions */
InvertedJsonPredicate.Loader<BlockState> INVERTED = new InvertedJsonPredicate.Loader<>(LOADER);
/** Loader for and conditions */
NestedJsonPredicateLoader<BlockState,AndJsonPredicate<BlockState>> AND = AndJsonPredicate.createLoader(LOADER, INVERTED);
/** Loader for or conditions */
NestedJsonPredicateLoader<BlockState,OrJsonPredicate<BlockState>> OR = OrJsonPredicate.createLoader(LOADER, INVERTED);
/** Gets an inverted condition */
@Override
default IJsonPredicate<BlockState> inverted() {
return INVERTED.create(this);
}
// override to tighten bounds on generics
@Override
IGenericLoader<? extends BlockPredicate> getLoader();
/* Singleton */
/** Predicate that matches blocks with no harvest tool */
BlockPredicate REQUIRES_TOOL = simple(BlockStateBase::requiresCorrectToolForDrops);
/** Creates a new simple predicate */
static BlockPredicate simple(Predicate<BlockState> predicate) {
return SingletonLoader.singleton(loader -> new BlockPredicate() {
@Override
public boolean matches(BlockState state) {
return predicate.test(state);
}
@Override
public IGenericLoader<? extends BlockPredicate> getLoader() {
return loader;
}
});
}
}