Files
Meteor-Rejects/src/main/java/anticope/rejects/utils/Ore.java
2023-11-19 23:47:24 +01:00

176 lines
9.9 KiB
Java
Executable File

package anticope.rejects.utils;
import anticope.rejects.mixin.CountPlacementModifierAccessor;
import anticope.rejects.mixin.HeightRangePlacementModifierAccessor;
import anticope.rejects.mixin.RarityFilterPlacementModifierAccessor;
import meteordevelopment.meteorclient.settings.BoolSetting;
import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.utils.render.color.Color;
import meteordevelopment.meteorclient.utils.world.Dimension;
import net.minecraft.client.MinecraftClient;
import net.minecraft.registry.*;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.registry.entry.RegistryEntryList;
import net.minecraft.util.math.intprovider.ConstantIntProvider;
import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.world.HeightLimitView;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.gen.HeightContext;
import net.minecraft.world.gen.WorldPresets;
import net.minecraft.world.gen.feature.*;
import net.minecraft.world.gen.feature.util.PlacedFeatureIndexer;
import net.minecraft.world.gen.heightprovider.HeightProvider;
import net.minecraft.world.gen.placementmodifier.CountPlacementModifier;
import net.minecraft.world.gen.placementmodifier.HeightRangePlacementModifier;
import net.minecraft.world.gen.placementmodifier.PlacementModifier;
import net.minecraft.world.gen.placementmodifier.RarityFilterPlacementModifier;
import java.util.*;
public class Ore {
private static final Setting<Boolean> coal = new BoolSetting.Builder().name("Coal").build();
private static final Setting<Boolean> iron = new BoolSetting.Builder().name("Iron").build();
private static final Setting<Boolean> gold = new BoolSetting.Builder().name("Gold").build();
private static final Setting<Boolean> redstone = new BoolSetting.Builder().name("Redstone").build();
private static final Setting<Boolean> diamond = new BoolSetting.Builder().name("Diamond").build();
private static final Setting<Boolean> lapis = new BoolSetting.Builder().name("Lapis").build();
private static final Setting<Boolean> copper = new BoolSetting.Builder().name("Kappa").build();
private static final Setting<Boolean> emerald = new BoolSetting.Builder().name("Emerald").build();
private static final Setting<Boolean> quartz = new BoolSetting.Builder().name("Quartz").build();
private static final Setting<Boolean> debris = new BoolSetting.Builder().name("Ancient Debris").build();
public static final List<Setting<Boolean>> oreSettings = new ArrayList<>(Arrays.asList(coal, iron, gold, redstone, diamond, lapis, copper, emerald, quartz, debris));
public static Map<RegistryKey<Biome>, List<Ore>> getRegistry(Dimension dimension) {
RegistryWrapper.WrapperLookup registry = BuiltinRegistries.createWrapperLookup();
RegistryWrapper.Impl<PlacedFeature> features = registry.getWrapperOrThrow(RegistryKeys.PLACED_FEATURE);
var reg = registry.getWrapperOrThrow(RegistryKeys.WORLD_PRESET).getOrThrow(WorldPresets.DEFAULT).value().createDimensionsRegistryHolder().dimensions();
var dim = switch (dimension) {
case Overworld -> reg.get(DimensionOptions.OVERWORLD);
case Nether -> reg.get(DimensionOptions.NETHER);
case End -> reg.get(DimensionOptions.END);
};
var biomes = dim.chunkGenerator().getBiomeSource().getBiomes();
var biomes1 = biomes.stream().toList();
List<PlacedFeatureIndexer.IndexedFeatures> indexer = PlacedFeatureIndexer.collectIndexedFeatures(
biomes1, biomeEntry -> biomeEntry.value().getGenerationSettings().getFeatures(), true
);
Map<PlacedFeature, Ore> featureToOre = new HashMap<>();
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COAL_LOWER, 6, coal, new Color(47, 44, 54));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COAL_UPPER, 6, coal, new Color(47, 44, 54));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_MIDDLE, 6, iron, new Color(236, 173, 119));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_SMALL, 6, iron, new Color(236, 173, 119));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_IRON_UPPER, 6, iron, new Color(236, 173, 119));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD, 6, gold, new Color(247, 229, 30));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_LOWER, 6, gold, new Color(247, 229, 30));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_EXTRA, 6, gold, new Color(247, 229, 30));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_NETHER, 7, gold, new Color(247, 229, 30));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_GOLD_DELTAS, 7, gold, new Color(247, 229, 30));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_REDSTONE, 6, redstone, new Color(245, 7, 23));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_REDSTONE_LOWER, 6, redstone, new Color(245, 7, 23));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND, 6, diamond, new Color(33, 244, 255));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_BURIED, 6, diamond, new Color(33, 244, 255));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_LARGE, 6, diamond, new Color(33, 244, 255));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DIAMOND_MEDIUM, 6, diamond, new Color(33, 244, 255));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_LAPIS, 6, lapis, new Color(8, 26, 189));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_LAPIS_BURIED, 6, lapis, new Color(8, 26, 189));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COPPER, 6, copper, new Color(239, 151, 0));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_COPPER_LARGE, 6, copper, new Color(239, 151, 0));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_EMERALD, 6, emerald, new Color(27, 209, 45));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_QUARTZ_NETHER, 7, quartz, new Color(205, 205, 205));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_QUARTZ_DELTAS, 7, quartz, new Color(205, 205, 205));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_DEBRIS_SMALL, 7, debris, new Color(209, 27, 245));
registerOre(featureToOre, indexer, features, OrePlacedFeatures.ORE_ANCIENT_DEBRIS_LARGE, 7, debris, new Color(209, 27, 245));
Map<RegistryKey<Biome>, List<Ore>> biomeOreMap = new HashMap<>();
biomes1.forEach(biome -> {
biomeOreMap.put(biome.getKey().get(), new ArrayList<>());
biome.value().getGenerationSettings().getFeatures().stream()
.flatMap(RegistryEntryList::stream)
.map(RegistryEntry::value)
.filter(featureToOre::containsKey)
.forEach(feature -> {
biomeOreMap.get(biome.getKey().get()).add(featureToOre.get(feature));
});
});
return biomeOreMap;
}
private static void registerOre(
Map<PlacedFeature, Ore> map,
List<PlacedFeatureIndexer.IndexedFeatures> indexer,
RegistryWrapper.Impl<PlacedFeature> oreRegistry,
RegistryKey<PlacedFeature> oreKey,
int genStep,
Setting<Boolean> active,
Color color
) {
var orePlacement = oreRegistry.getOrThrow(oreKey).value();
int index = indexer.get(genStep).indexMapping().applyAsInt(orePlacement);
Ore ore = new Ore(orePlacement, genStep, index, active, color);
map.put(orePlacement, ore);
}
public int step;
public int index;
public Setting<Boolean> active;
public IntProvider count = ConstantIntProvider.create(1);
public HeightProvider heightProvider;
public HeightContext heightContext;
public float rarity = 1;
public float discardOnAirChance;
public int size;
public Color color;
public boolean scattered;
private Ore(PlacedFeature feature, int step, int index, Setting<Boolean> active, Color color) {
this.step = step;
this.index = index;
this.active = active;
this.color = color;
int bottom = MinecraftClient.getInstance().world.getBottomY();
int height = MinecraftClient.getInstance().world.getDimension().logicalHeight();
this.heightContext = new HeightContext(null, HeightLimitView.create(bottom, height));
for (PlacementModifier modifier : feature.placementModifiers()) {
if (modifier instanceof CountPlacementModifier) {
this.count = ((CountPlacementModifierAccessor) modifier).getCount();
} else if (modifier instanceof HeightRangePlacementModifier) {
this.heightProvider = ((HeightRangePlacementModifierAccessor) modifier).getHeight();
} else if (modifier instanceof RarityFilterPlacementModifier) {
this.rarity = ((RarityFilterPlacementModifierAccessor) modifier).getChance();
}
}
FeatureConfig featureConfig = feature.feature().value().config();
if (featureConfig instanceof OreFeatureConfig oreFeatureConfig) {
this.discardOnAirChance = oreFeatureConfig.discardOnAirChance;
this.size = oreFeatureConfig.size;
} else {
throw new IllegalStateException("config for " + feature + "is not OreFeatureConfig.class");
}
if (feature.feature().value().feature() instanceof ScatteredOreFeature) {
this.scattered = true;
}
}
}