/
MineralMix.java
132 lines (116 loc) · 3.48 KB
/
MineralMix.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
* BluSunrize
* Copyright (c) 2020
*
* This code is licensed under "Blu's License of Common Sense"
* Details can be found in the license file in the root folder of this project
*
*/
package blusunrize.immersiveengineering.api.excavator;
import blusunrize.immersiveengineering.api.Lib;
import blusunrize.immersiveengineering.api.crafting.*;
import blusunrize.immersiveengineering.api.crafting.cache.CachedRecipeList;
import com.google.common.collect.ImmutableSet;
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.registries.DeferredHolder;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.function.Predicate;
public class MineralMix extends IESerializableRecipe
{
public static DeferredHolder<RecipeSerializer<?>, IERecipeSerializer<MineralMix>> SERIALIZER;
public static final CachedRecipeList<MineralMix> RECIPES = new CachedRecipeList<>(IERecipeTypes.MINERAL_MIX);
public final List<StackWithChance> outputs;
public final List<StackWithChance> spoils;
public final int weight;
public final float failChance;
public final ImmutableSet<BiomeTagPredicate> biomeTagPredicates;
public final Block background;
public MineralMix(List<StackWithChance> outputs, List<StackWithChance> spoils, int weight,
float failChance, Collection<BiomeTagPredicate> biomeTagPredicates, Block background)
{
super(TagOutput.EMPTY, IERecipeTypes.MINERAL_MIX);
this.weight = weight;
this.failChance = failChance;
this.outputs = outputs;
this.spoils = spoils;
this.biomeTagPredicates = ImmutableSet.copyOf(biomeTagPredicates);
this.background = background;
}
@Override
protected IERecipeSerializer<MineralMix> getIESerializer()
{
return SERIALIZER.get();
}
@Override
public ItemStack getResultItem(RegistryAccess access)
{
return ItemStack.EMPTY;
}
public static String getPlainName(ResourceLocation id)
{
String path = id.getPath();
return path.substring(path.lastIndexOf("/")+1);
}
public static String getTranslationKey(ResourceLocation id)
{
return Lib.DESC_INFO+"mineral."+getPlainName(id);
}
public ItemStack getRandomOre(Random rand)
{
float r = rand.nextFloat();
for(StackWithChance o : outputs)
if(o.chance() >= 0)
{
r -= o.chance();
if(r < 0)
return o.stack().get();
}
return ItemStack.EMPTY;
}
public ItemStack getRandomSpoil(Random rand)
{
float r = rand.nextFloat();
for(StackWithChance o : spoils)
if(o.chance() >= 0)
{
r -= o.chance();
if(r < 0)
return o.stack().get();
}
return ItemStack.EMPTY;
}
public boolean validBiome(Holder<Biome> biome)
{
if(biomeTagPredicates.isEmpty())
return true;
return biomeTagPredicates.stream().allMatch(
predicate -> predicate.test(biome)
);
}
/**
* A predicate for checking a biome against multiple tags.
* Returns true if ANY of the tags match.
*/
public record BiomeTagPredicate(Set<TagKey<Biome>> tags) implements Predicate<Holder<Biome>>
{
public BiomeTagPredicate(TagKey<Biome> singular)
{
this(ImmutableSet.of(singular));
}
@Override
public boolean test(Holder<Biome> biomeHolder)
{
return this.tags().stream().anyMatch(biomeHolder::is);
}
}
}