Oresim update

This commit is contained in:
misterx
2023-11-17 22:02:08 +01:00
committed by Cloudburst
parent fb2be95eb5
commit 1446d6e636
7 changed files with 292 additions and 294 deletions

View File

@@ -0,0 +1,12 @@
package anticope.rejects.mixin;
import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.world.gen.placementmodifier.CountPlacementModifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(CountPlacementModifier.class)
public interface CountPlacementModifierAccessor {
@Accessor
IntProvider getCount();
}

View File

@@ -0,0 +1,22 @@
package anticope.rejects.mixin;
import net.minecraft.world.gen.HeightContext;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(HeightContext.class)
public abstract class HeightContextMixin {
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/chunk/ChunkGenerator;getMinimumY()I"))
private int onMinY(ChunkGenerator instance) {
return instance == null ? -9999999 : instance.getMinimumY();
}
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/chunk/ChunkGenerator;getWorldHeight()I"))
private int onHeight(ChunkGenerator instance) {
return instance == null ? 100000000 : instance.getWorldHeight();
}
}

View File

@@ -0,0 +1,13 @@
package anticope.rejects.mixin;
import net.minecraft.world.gen.heightprovider.HeightProvider;
import net.minecraft.world.gen.placementmodifier.HeightRangePlacementModifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(HeightRangePlacementModifier.class)
public interface HeightRangePlacementModifierAccessor {
@Accessor
HeightProvider getHeight();
}

View File

@@ -0,0 +1,11 @@
package anticope.rejects.mixin;
import net.minecraft.world.gen.placementmodifier.RarityFilterPlacementModifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(RarityFilterPlacementModifier.class)
public interface RarityFilterPlacementModifierAccessor {
@Accessor
int getChance();
}

View File

@@ -7,29 +7,35 @@ import anticope.rejects.utils.Ore;
import anticope.rejects.utils.seeds.Seed; import anticope.rejects.utils.seeds.Seed;
import anticope.rejects.utils.seeds.Seeds; import anticope.rejects.utils.seeds.Seeds;
import baritone.api.BaritoneAPI; import baritone.api.BaritoneAPI;
import com.seedfinding.mccore.version.MCVersion;
import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent;
import meteordevelopment.meteorclient.events.world.ChunkDataEvent; import meteordevelopment.meteorclient.events.world.ChunkDataEvent;
import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.meteorclient.utils.player.PlayerUtils;
import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventHandler;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryKey;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.*; import net.minecraft.util.math.*;
import net.minecraft.util.math.random.ChunkRandom; import net.minecraft.util.math.random.ChunkRandom;
import net.minecraft.world.Heightmap; import net.minecraft.world.Heightmap;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkSection;
import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.chunk.ChunkStatus;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class OreSim extends Module { public class OreSim extends Module {
private final HashMap<Long, HashMap<Ore, HashSet<Vec3d>>> chunkRenderers = new HashMap<>(); private final Map<Long, Map<Ore, Set<Vec3d>>> chunkRenderers = new ConcurrentHashMap<>();
private Seed worldSeed = null; private Seed worldSeed = null;
private List<Ore> oreConfig; private Map<RegistryKey<Biome>, List<Ore>> oreConfig;
public ArrayList<BlockPos> oreGoals = new ArrayList<>(); public List<BlockPos> oreGoals = new ArrayList<>();
private ChunkPos prevOffset = new ChunkPos(0, 0); private ChunkPos prevOffset = new ChunkPos(0, 0);
public enum AirCheck { public enum AirCheck {
@@ -97,16 +103,15 @@ public class OreSim extends Module {
} }
private void renderChunk(int x, int z, Render3DEvent event) { private void renderChunk(int x, int z, Render3DEvent event) {
long chunkKey = (long) x + ((long) z << 32); long chunkKey = ChunkPos.toLong(x,z);
if (chunkRenderers.containsKey(chunkKey)) { if (chunkRenderers.containsKey(chunkKey)) {
for (Ore ore : oreConfig) { Map<Ore, Set<Vec3d>> chunk = chunkRenderers.get(chunkKey);
if (ore.enabled.get()) {
if (!chunkRenderers.get(chunkKey).containsKey(ore)) { for (Map.Entry<Ore, Set<Vec3d>> oreRenders : chunk.entrySet()) {
continue; if (oreRenders.getKey().active.get()) {
} for (Vec3d pos : oreRenders.getValue()) {
for (Vec3d pos : chunkRenderers.get(chunkKey).get(ore)) { event.renderer.boxLines(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1, oreRenders.getKey().color, 0);
event.renderer.boxLines(pos.x, pos.y, pos.z, pos.x + 1, pos.y + 1, pos.z + 1, ore.color, 0);
} }
} }
} }
@@ -118,8 +123,8 @@ public class OreSim extends Module {
if (mc.player == null || mc.world == null || oreConfig == null) return; if (mc.player == null || mc.world == null || oreConfig == null) return;
if (airCheck.get() == AirCheck.RECHECK) { if (airCheck.get() == AirCheck.RECHECK) {
long chunkX = mc.player.getChunkPos().x; int chunkX = mc.player.getChunkPos().x;
long chunkZ = mc.player.getChunkPos().z; int chunkZ = mc.player.getChunkPos().z;
ClientWorld world = mc.world; ClientWorld world = mc.world;
int renderdistance = mc.options.getViewDistance().getValue(); int renderdistance = mc.options.getViewDistance().getValue();
@@ -128,20 +133,27 @@ public class OreSim extends Module {
loop: loop:
while (true) { while (true) {
for (long offsetX = prevOffset.x; offsetX <= renderdistance; offsetX++) { for (int offsetX = prevOffset.x; offsetX <= renderdistance; offsetX++) {
for (long offsetZ = prevOffset.z; offsetZ <= renderdistance; offsetZ++) { for (int offsetZ = prevOffset.z; offsetZ <= renderdistance; offsetZ++) {
prevOffset = new ChunkPos((int) offsetX, (int) offsetZ); prevOffset = new ChunkPos(offsetX, offsetZ);
if (chunkCounter <= 0) { if (chunkCounter <= 0) {
break loop; break loop;
} }
long chunkKey = (chunkX + offsetX) + ((chunkZ + offsetZ) << 32); long chunkKey = ChunkPos.toLong(chunkX + offsetX, chunkZ + offsetZ);
if (chunkRenderers.containsKey(chunkKey)) { Chunk chunk = world.getChunk(chunkX + offsetX, chunkZ + offsetZ, ChunkStatus.FULL, false);
chunkRenderers.get(chunkKey).values().forEach(oreSet -> oreSet.removeIf(ore -> !world.getBlockState(new BlockPos((int) ore.x, (int) ore.y, (int) ore.z)).isOpaque())); if (chunk != null && chunkRenderers.containsKey(chunkKey)) {
chunkRenderers.get(chunkKey).values().forEach(oreSet ->
oreSet.removeIf(ore -> {
BlockState state = world.getBlockState(new BlockPos((int) ore.x, (int) ore.y, (int) ore.z));
return state.isOpaque() && !state.isOf(Blocks.VOID_AIR);
})
);
} }
chunkCounter--; chunkCounter--;
} }
prevOffset = new ChunkPos((int) offsetX, -renderdistance); prevOffset = new ChunkPos(offsetX, -renderdistance);
} }
prevOffset = new ChunkPos(-renderdistance, -renderdistance); prevOffset = new ChunkPos(-renderdistance, -renderdistance);
} }
@@ -164,18 +176,15 @@ public class OreSim extends Module {
private ArrayList<BlockPos> addToBaritone(int chunkX, int chunkZ) { private ArrayList<BlockPos> addToBaritone(int chunkX, int chunkZ) {
ArrayList<BlockPos> baritoneGoals = new ArrayList<>(); ArrayList<BlockPos> baritoneGoals = new ArrayList<>();
long chunkKey = (long) chunkX + ((long) chunkZ << 32); long chunkKey = ChunkPos.toLong(chunkX, chunkZ);
if (!this.chunkRenderers.containsKey(chunkKey)) { if (this.chunkRenderers.containsKey(chunkKey)) {
return baritoneGoals; this.chunkRenderers.get(chunkKey).entrySet().stream()
} else { .filter(entry -> entry.getKey().active.get())
this.oreConfig.stream().filter((config) -> config.enabled.get()).forEach((ore) -> chunkRenderers .flatMap(entry -> entry.getValue().stream())
.get(chunkKey)
.getOrDefault(ore, new HashSet<>())
.stream()
.map(BlockPos::ofFloored) .map(BlockPos::ofFloored)
.forEach(baritoneGoals::add)); .forEach(baritoneGoals::add);
return baritoneGoals;
} }
return baritoneGoals;
} }
@Override @Override
@@ -187,6 +196,12 @@ public class OreSim extends Module {
reload(); reload();
} }
@Override
public void onDeactivate() {
this.chunkRenderers.clear();
this.oreConfig.clear();
}
@EventHandler @EventHandler
private void onSeedChanged(SeedChangedEvent event) { private void onSeedChanged(SeedChangedEvent event) {
reload(); reload();
@@ -198,7 +213,7 @@ public class OreSim extends Module {
} }
private void loadVisibleChunks() { private void loadVisibleChunks() {
int renderdistance = mc.options.getViewDistance().getValue(); int renderdistance = mc.options.getViewDistance().getValue()+2;
if (mc.player == null) { if (mc.player == null) {
return; return;
@@ -217,12 +232,7 @@ public class OreSim extends Module {
Seed seed = Seeds.get().getSeed(); Seed seed = Seeds.get().getSeed();
if (seed == null) return; if (seed == null) return;
worldSeed = seed; worldSeed = seed;
oreConfig = Ore.getConfig(Seeds.get().getSeed().version); oreConfig = Ore.getRegistry(PlayerUtils.getDimension());
if (oreConfig == null) {
error("Ore Sim only works with seeds from version 1.14 or higher. (Current seed is from version " + Seeds.get().getSeed().version.toString() + ")");
this.toggle();
return;
}
chunkRenderers.clear(); chunkRenderers.clear();
if (mc.world != null && worldSeed != null) { if (mc.world != null && worldSeed != null) {
@@ -236,7 +246,8 @@ public class OreSim extends Module {
} }
private void doMathOnChunk(int chunkX, int chunkZ) { private void doMathOnChunk(int chunkX, int chunkZ) {
long chunkKey = (long) chunkX + ((long) chunkZ << 32); var chunkPos = new ChunkPos(chunkX, chunkZ);
long chunkKey = chunkPos.toLong();
ClientWorld world = mc.world; ClientWorld world = mc.world;
@@ -244,84 +255,59 @@ public class OreSim extends Module {
return; return;
} }
if (world.getChunkManager().getChunk(chunkX, chunkZ, ChunkStatus.FULL, false) == null) { Chunk chunk = world.getChunk(chunkX, chunkZ, ChunkStatus.FULL, false);
if (chunk == null) {
return; return;
} }
Set<RegistryKey<Biome>> biomes = new HashSet<>();
ChunkPos.stream(chunkPos, 1).forEach(chunkPosx -> {
Chunk chunkxx = world.getChunk(chunkPosx.x, chunkPosx.z, ChunkStatus.BIOMES, false);
if (chunkxx == null) return;
for(ChunkSection chunkSection : chunkxx.getSectionArray()) {
chunkSection.getBiomeContainer().forEachValue(entry -> biomes.add(entry.getKey().get()));
}
});
Set<Ore> oreSet = biomes.stream().flatMap(b -> getDefaultOres(b).stream()).collect(Collectors.toSet());
chunkX = chunkX << 4; chunkX = chunkX << 4;
chunkZ = chunkZ << 4; chunkZ = chunkZ << 4;
ChunkRandom random = new ChunkRandom(ChunkRandom.RandomProvider.XOROSHIRO.create(0));
ChunkRandom random = new ChunkRandom(ChunkRandom.RandomProvider.LEGACY.create(0));
if (worldSeed.version.isNewerOrEqualTo(MCVersion.v1_18)) { //1.18 and above
random = new ChunkRandom(ChunkRandom.RandomProvider.XOROSHIRO.create(0));
}
HashMap<Ore, HashSet<Vec3d>> h = new HashMap<>();
long populationSeed = random.setPopulationSeed(worldSeed.seed, chunkX, chunkZ); long populationSeed = random.setPopulationSeed(worldSeed.seed, chunkX, chunkZ);
HashMap<Ore, Set<Vec3d>> h = new HashMap<>();
var optional = world.getBiomeAccess().getBiomeForNoiseGen(new BlockPos(chunkX, 0, chunkZ)).getKeyOrValue(); for (Ore ore : oreSet) {
Identifier id = (optional.right().isPresent()) ? world.getRegistryManager().get(RegistryKeys.BIOME).getId(optional.right().get()) : optional.left().get().getValue();
if (id == null) {
error("Something went wrong, you may have some mods that mess with world generation");
toggle();
return;
}
String biomeName = id.getPath();
Identifier dimensionName = world.getDimension().effects();
for (Ore ore : oreConfig) {
if (!dimensionName.getPath().equals(ore.dimension.getPath())) {
continue;
}
HashSet<Vec3d> ores = new HashSet<>(); HashSet<Vec3d> ores = new HashSet<>();
int index; random.setDecoratorSeed(populationSeed, ore.index, ore.step);
if (ore.index.containsKey(biomeName)) {
index = ore.index.get(biomeName);
} else {
index = ore.index.get("default");
}
if (index < 0) {
continue;
}
random.setDecoratorSeed(populationSeed, index, ore.step);
int repeat = ore.count.get(random); int repeat = ore.count.get(random);
for (int i = 0; i < repeat; i++) { for (int i = 0; i < repeat; i++) {
if (ore.chance != 1F && random.nextFloat() >= ore.chance) { if (ore.rarity != 1F && random.nextFloat() >= ore.rarity) {
continue; continue;
} }
int x = random.nextInt(16) + chunkX; int x = random.nextInt(16) + chunkX;
int z; int z = random.nextInt(16) + chunkZ;
int y; int y = ore.heightProvider.get(random, ore.heightContext);
if (worldSeed.version.isBetween(MCVersion.v1_14, MCVersion.v1_14_4)) { BlockPos origin = new BlockPos(x,y,z);
y = ore.depthAverage ? random.nextInt(ore.maxY) + random.nextInt(ore.maxY) - ore.maxY : random.nextInt(ore.maxY - ore.minY);
z = random.nextInt(16) + chunkZ;
} else {
z = random.nextInt(16) + chunkZ;
y = ore.depthAverage ? random.nextInt(ore.maxY) + random.nextInt(ore.maxY) - ore.maxY : random.nextInt(ore.maxY - ore.minY);
}
y += ore.minY;
switch (ore.generator) { RegistryKey<Biome> biome = chunk.getBiomeForNoiseGen(x,y,z).getKey().get();
case DEFAULT ->
ores.addAll(generateNormal(world, random, new BlockPos(x, y, z), ore.size, ore.discardOnAir)); if (!getDefaultOres(biome).contains(ore)) {
case EMERALD -> { continue;
if (airCheck.get() == AirCheck.OFF || world.getBlockState(new BlockPos(x, y, z)).isOpaque()) {
ores.add(new Vec3d(x, y, z));
} }
}
case NO_SURFACE -> ores.addAll(generateHidden(world, random, new BlockPos(x, y, z), ore.size)); if (ore.scattered) {
default -> System.out.println(ore.type + " has some unknown generator. Fix it!"); ores.addAll(generateHidden(world, random, origin, ore.size));
} else {
ores.addAll(generateNormal(world, random, origin, ore.size, ore.discardOnAirChance));
} }
} }
if (!ores.isEmpty()) { if (!ores.isEmpty()) {
@@ -331,6 +317,14 @@ public class OreSim extends Module {
chunkRenderers.put(chunkKey, h); chunkRenderers.put(chunkKey, h);
} }
private List<Ore> getDefaultOres(RegistryKey<Biome> biomeRegistryKey) {
if (oreConfig.containsKey(biomeRegistryKey)) {
return oreConfig.get(biomeRegistryKey);
} else {
return this.oreConfig.values().stream().findAny().get();
}
}
// ==================================== // ====================================
// Mojang code // Mojang code
// ==================================== // ====================================

View File

@@ -1,16 +1,36 @@
package anticope.rejects.utils; 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.BoolSetting;
import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.Color;
import com.seedfinding.mccore.version.MCVersion; import meteordevelopment.meteorclient.utils.world.Dimension;
import net.minecraft.util.Identifier; 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.ConstantIntProvider;
import net.minecraft.util.math.intprovider.IntProvider; import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.util.math.intprovider.UniformIntProvider;
import net.minecraft.world.dimension.DimensionTypes; 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.*; import java.util.*;
public class Ore { public class Ore {
private static final Setting<Boolean> coal = new BoolSetting.Builder().name("Coal").build(); private static final Setting<Boolean> coal = new BoolSetting.Builder().name("Coal").build();
@@ -24,210 +44,132 @@ public class Ore {
private static final Setting<Boolean> quartz = new BoolSetting.Builder().name("Quartz").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(); 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 final List<Setting<Boolean>> oreSettings = new ArrayList<>(Arrays.asList(coal, iron, gold, redstone, diamond, lapis, copper, emerald, quartz, debris));
public final Type type;
public final Identifier dimension; public static Map<RegistryKey<Biome>, List<Ore>> getRegistry(Dimension dimension) {
public final Map<String, Integer> index;
public final boolean depthAverage; RegistryWrapper.WrapperLookup registry = BuiltinRegistries.createWrapperLookup();
public final Generator generator; RegistryWrapper.Impl<PlacedFeature> features = registry.getWrapperOrThrow(RegistryKeys.PLACED_FEATURE);
public final int size; var reg = registry.getWrapperOrThrow(RegistryKeys.WORLD_PRESET).getOrThrow(WorldPresets.DEFAULT).value().createDimensionsRegistryHolder().dimensions();
public final Setting<Boolean> enabled;
public final Color color; 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 step;
public IntProvider count; public int index;
public int minY; public Setting<Boolean> active;
public int maxY; public IntProvider count = ConstantIntProvider.create(1);
public float discardOnAir; public HeightProvider heightProvider;
public float chance; public HeightContext heightContext;
public float rarity = 1;
public float discardOnAirChance;
public int size;
public Color color;
public boolean scattered;
Ore(Type type, Identifier dimension, Map<String, Integer> index, int step, IntProvider count, float chance, boolean depthAverage, int minY, int maxY, Generator generator, int size, float discardOnAir, Setting<Boolean> enabled, Color color) { private Ore(PlacedFeature feature, int step, int index, Setting<Boolean> active, Color color) {
this.type = type;
this.dimension = dimension;
this.index = index;
this.step = step; this.step = step;
this.count = count; this.index = index;
this.depthAverage = depthAverage; this.active = active;
this.minY = minY;
this.maxY = maxY;
this.generator = generator;
this.size = size;
this.enabled = enabled;
this.color = color; this.color = color;
this.discardOnAir = discardOnAir; int bottom = MinecraftClient.getInstance().world.getBottomY();
this.chance = chance; 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();
}
} }
Ore(Type type, Identifier dimension, int index, int step, IntProvider count, float chance, boolean depthAverage, int minY, int maxY, Generator generator, int size, float discardOnAir, Setting<Boolean> enabled, Color color) { FeatureConfig featureConfig = feature.feature().value().config();
this(type, dimension, indexToMap(index), step, count, chance, depthAverage, minY, maxY, generator, size, discardOnAir, enabled, color);
}
Ore(Type type, Identifier dimension, int index, int step, IntProvider count, boolean depthAverage, int minY, int maxY, if (featureConfig instanceof OreFeatureConfig oreFeatureConfig) {
@SuppressWarnings("SameParameterValue") Generator generator, int size, Setting<Boolean> enabled, Color color) { this.discardOnAirChance = oreFeatureConfig.discardOnAirChance;
this(type, dimension, indexToMap(index), step, count, 1F, depthAverage, minY, maxY, generator, size, 0F, enabled, color); this.size = oreFeatureConfig.size;
}
Ore(Type type, Identifier dimension, Map<String, Integer> index, int step, IntProvider count, boolean depthAverage, int minY, int maxY,
@SuppressWarnings("SameParameterValue") Generator generator, int size, Setting<Boolean> enabled, Color color) {
this(type, dimension, index, step, count, 1F, depthAverage, minY, maxY, generator, size, 0F, enabled, color);
}
private static HashMap<String, Integer> indexToMap(int index) {
HashMap<String, Integer> map = new HashMap<>();
map.put("default", index);
return map;
}
private static List<Ore> V1_19() {
return V1_18();
}
private static List<Ore> V1_18() {
List<Ore> ores = new ArrayList<>();
HashMap<String, Integer> extraGoldIndex = new HashMap<>();
extraGoldIndex.put("default", -1);
String[] extraGoldBiomes = new String[]{"badlands", "eroded_badlands", "wooded_badlands"};
for (String extraGoldBiome : extraGoldBiomes) {
extraGoldIndex.put(extraGoldBiome, 27);
}
HashMap<String, Integer> emeraldIndex = new HashMap<>();
emeraldIndex.put("default", -1);
String[] emeraldBiomes = new String[]{"windswept_hills", "meadow", "grove", "jagged_peaks", "snowy_slopes", "frozen_peaks", "stony_peaks"};
for (String emeraldBiome : emeraldBiomes) {
emeraldIndex.put(emeraldBiome, 27);
}
ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 9, 6, ConstantIntProvider.create(30), false, 136, 320, Generator.DEFAULT, 17, coal, new Color(47, 44, 54)));
ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 10, 6, ConstantIntProvider.create(20), 1F, true, 97, 97, Generator.DEFAULT, 17, 0.5F, coal, new Color(47, 44, 54)));
ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 11, 6, ConstantIntProvider.create(90), true, 233, 153, Generator.DEFAULT, 9, iron, new Color(236, 173, 119)));
ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 12, 6, ConstantIntProvider.create(10), true, 17, 41, Generator.DEFAULT, 9, iron, new Color(236, 173, 119)));
ores.add(new Ore(Type.IRON, DimensionTypes.OVERWORLD_ID, 13, 6, ConstantIntProvider.create(10), false, -64, 73, Generator.DEFAULT, 4, iron, new Color(236, 173, 119)));
ores.add(new Ore(Type.GOLD_EXTRA, DimensionTypes.OVERWORLD_ID, extraGoldIndex, 6, ConstantIntProvider.create(50), false, 32, 257, Generator.DEFAULT, 9, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 14, 6, ConstantIntProvider.create(4), 1F, true, -15, 49, Generator.DEFAULT, 9, 0.5F, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 15, 6, UniformIntProvider.create(0, 1), 1F, false, -64, -47, Generator.DEFAULT, 9, 0.5F, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 16, 6, ConstantIntProvider.create(4), false, -64, 16, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23)));
ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 17, 6, ConstantIntProvider.create(8), true, -63, 33, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23)));
ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 18, 6, ConstantIntProvider.create(7), 1F, true, -63, 81, Generator.DEFAULT, 4, 0.5F, diamond, new Color(33, 244, 255)));
ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 19, 6, ConstantIntProvider.create(1), (1F / 9F), true, -63, 81, Generator.DEFAULT, 12, 0.7F, diamond, new Color(33, 244, 255)));
ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 20, 6, ConstantIntProvider.create(4), 1F, true, -63, 81, Generator.DEFAULT, 8, 1F, diamond, new Color(33, 244, 255)));
ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 21, 6, ConstantIntProvider.create(2), true, 1, 33, Generator.DEFAULT, 7, lapis, new Color(8, 26, 189)));
ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 22, 6, ConstantIntProvider.create(4), 1F, false, -64, 65, Generator.DEFAULT, 7, 1F, lapis, new Color(8, 26, 189)));
ores.add(new Ore(Type.EMERALD, DimensionTypes.OVERWORLD_ID, emeraldIndex, 6, ConstantIntProvider.create(100), true, 233, 249, Generator.DEFAULT, 3, emerald, new Color(27, 209, 45)));
//This only generates near dripstone caves. I'll need propper biome detection to get this right
//ores.add(new Ore(Type.COPPER, "overworld", 23, 6, ConstantIntProvider.create(16), true, 49, 65, Generator.DEFAULT, 20, copper, new Color(239, 151, 0)));
ores.add(new Ore(Type.COPPER, DimensionTypes.OVERWORLD_ID, 24, 6, ConstantIntProvider.create(16), true, 49, 65, Generator.DEFAULT, 10, copper, new Color(239, 151, 0)));
ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", 19, "basalt_deltas", -1), 7, ConstantIntProvider.create(10), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", 20, "basalt_deltas", -1), 7, ConstantIntProvider.create(16), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205)));
ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 13), 7, ConstantIntProvider.create(20), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 14), 7, ConstantIntProvider.create(32), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205)));
ores.add(new Ore(Type.LDEBRIS, DimensionTypes.THE_NETHER_ID, 21, 7, ConstantIntProvider.create(1), true, 17, 9, Generator.NO_SURFACE, 3, debris, new Color(209, 27, 245)));
ores.add(new Ore(Type.SDEBRIS, DimensionTypes.THE_NETHER_ID, 22, 7, ConstantIntProvider.create(1), false, 8, 120, Generator.NO_SURFACE, 2, debris, new Color(209, 27, 245)));
return ores;
}
private static List<Ore> baseConfig() {
List<Ore> ores = new ArrayList<>();
HashMap<String, Integer> emeraldIndexes = new HashMap<>();
emeraldIndexes.put("default", -1);
String[] emeraldBiomes = new String[]{"mountains", "mountain_edge", "wooded_mountains", "gravelly_mountains", "modified_gravelly_mountains", "paper"};
for (String emeraldBiome : emeraldBiomes) {
emeraldIndexes.put(emeraldBiome, 17);
}
HashMap<String, Integer> LDebrisIndexes = new HashMap<>();
LDebrisIndexes.put("default", 15);
LDebrisIndexes.put("crimson_forest", 12);
LDebrisIndexes.put("warped_forest", 13);
HashMap<String, Integer> SDebrisIndexes = new HashMap<>();
LDebrisIndexes.forEach((biome, index) -> SDebrisIndexes.put(biome, index + 1));
HashMap<String, Integer> extraGoldIndexes = new HashMap<>();
extraGoldIndexes.put("default", -1);
String[] extraGoldBiomes = new String[]{"badlands", "badlands_plateau", "modified_badlands_plateau", "wooded_badlands_plateau", "modified_wooded_badlands_plateau", "eroded_badlands", "paper"};
for (String extraGoldBiome : extraGoldBiomes) {
extraGoldIndexes.put(extraGoldBiome, 14);
}
ores.add(new Ore(Type.COAL, DimensionTypes.OVERWORLD_ID, 7, 6, ConstantIntProvider.create(20), false, 0, 128, Generator.DEFAULT, 20, coal, new Color(47, 44, 54)));
ores.add(new Ore(Type.IRON,DimensionTypes.OVERWORLD_ID, 8, 6, ConstantIntProvider.create(20), false, 0, 64, Generator.DEFAULT, 9, iron, new Color(236, 173, 119)));
ores.add(new Ore(Type.GOLD, DimensionTypes.OVERWORLD_ID, 9, 6, ConstantIntProvider.create(2), false, 0, 32, Generator.DEFAULT, 9, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.REDSTONE, DimensionTypes.OVERWORLD_ID, 10, 6, ConstantIntProvider.create(8), false, 0, 16, Generator.DEFAULT, 8, redstone, new Color(245, 7, 23)));
ores.add(new Ore(Type.DIAMOND, DimensionTypes.OVERWORLD_ID, 11, 6, ConstantIntProvider.create(1), false, 0, 16, Generator.DEFAULT, 8, diamond, new Color(33, 244, 255)));
ores.add(new Ore(Type.LAPIS, DimensionTypes.OVERWORLD_ID, 12, 6, ConstantIntProvider.create(1), true, 16, 16, Generator.DEFAULT, 7, lapis, new Color(8, 26, 189)));
ores.add(new Ore(Type.COPPER, DimensionTypes.OVERWORLD_ID, 13, 6, ConstantIntProvider.create(6), true, 49, 49, Generator.DEFAULT, 10, copper, new Color(239, 151, 0)));
ores.add(new Ore(Type.GOLD_EXTRA, DimensionTypes.OVERWORLD_ID, extraGoldIndexes, 6, ConstantIntProvider.create(20), false, 32, 80, Generator.DEFAULT, 9, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.EMERALD, DimensionTypes.OVERWORLD_ID, emeraldIndexes, 6, UniformIntProvider.create(6, 8), false, 4, 32, Generator.EMERALD, 1, emerald, new Color(27, 209, 45)));
ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", 13, "basalt_deltas", -1), 7, ConstantIntProvider.create(10), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", 14, "basalt_deltas", -1), 7, ConstantIntProvider.create(16), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205)));
ores.add(new Ore(Type.GOLD_NETHER, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 13), 7, ConstantIntProvider.create(20), false, 10, 118, Generator.DEFAULT, 10, gold, new Color(247, 229, 30)));
ores.add(new Ore(Type.QUARTZ, DimensionTypes.THE_NETHER_ID, Map.of("default", -1, "basalt_deltas", 14), 7, ConstantIntProvider.create(32), false, 10, 118, Generator.DEFAULT, 14, quartz, new Color(205, 205, 205)));
ores.add(new Ore(Type.LDEBRIS, DimensionTypes.THE_NETHER_ID, LDebrisIndexes, 7, ConstantIntProvider.create(1), true, 17, 9, Generator.NO_SURFACE, 3, debris, new Color(209, 27, 245)));
ores.add(new Ore(Type.SDEBRIS, DimensionTypes.THE_NETHER_ID, SDebrisIndexes, 7, ConstantIntProvider.create(1), false, 8, 120, Generator.NO_SURFACE, 2, debris, new Color(209, 27, 245)));
return ores;
}
private static List<Ore> V1_17_1() {
return baseConfig();
}
private static List<Ore> V1_17() {
List<Ore> ores = baseConfig();
for (Ore ore : ores) {
if (ore.type.equals(Type.DIAMOND)) {
ore.maxY = 17;
}
if (ore.type.equals(Type.EMERALD)) {
ore.count = UniformIntProvider.create(6, 24);
}
}
return ores;
}
private static List<Ore> V1_16() {
List<Ore> ores = baseConfig();
ores.removeIf(ore -> ore.type.equals(Type.COPPER));
for (Ore ore : ores) {
if (ore.type == Type.EMERALD || ore.type == Type.GOLD_EXTRA) {
ore.index.keySet().forEach(key -> ore.index.put(key, ore.index.get(key) - 3));
} else if (ore.dimension == DimensionTypes.OVERWORLD_ID) {
ore.index.keySet().forEach(key -> ore.index.put(key, ore.index.get(key) - 2));
} else if (ore.type == Type.LDEBRIS) {
ore.minY = 16;
ore.maxY = 8;
}
}
return ores;
}
private static List<Ore> V1_15() {
List<Ore> ores = V1_16();
ores.removeIf(ore -> ore.type == Type.SDEBRIS || ore.type == Type.LDEBRIS || ore.type == Type.GOLD_NETHER);
for (Ore ore : ores) {
ore.step -= 2;
}
return ores;
}
public static List<Ore> getConfig(MCVersion version) {
if (version.isNewerOrEqualTo(MCVersion.v1_19)) {
return V1_19();
} else if (version.isNewerOrEqualTo(MCVersion.v1_18)) {
return V1_18();
} else if (version.isNewerOrEqualTo(MCVersion.v1_17_1)) {
return V1_17_1();
} else if (version.isNewerOrEqualTo(MCVersion.v1_17)) {
return V1_17();
} else if (version.isNewerOrEqualTo(MCVersion.v1_16)) {
return V1_16();
} else if (version.isNewerOrEqualTo(MCVersion.v1_14)) {
return V1_15();
} else { } else {
return null; throw new IllegalStateException("config for " + feature + "is not OreFeatureConfig.class");
}
} }
public enum Type { if (feature.feature().value().feature() instanceof ScatteredOreFeature) {
DIAMOND, REDSTONE, GOLD, IRON, COAL, EMERALD, SDEBRIS, LDEBRIS, LAPIS, COPPER, QUARTZ, GOLD_NETHER, GOLD_EXTRA this.scattered = true;
} }
public enum Generator {
DEFAULT, EMERALD, NO_SURFACE
} }
} }

View File

@@ -7,16 +7,20 @@
"ClientPlayerInteractionManagerMixin", "ClientPlayerInteractionManagerMixin",
"ClientPlayNetworkHandlerMixin", "ClientPlayNetworkHandlerMixin",
"CommandSuggestorMixin", "CommandSuggestorMixin",
"CountPlacementModifierAccessor",
"Deadmau5FeatureRendererMixin", "Deadmau5FeatureRendererMixin",
"EntityAccessor", "EntityAccessor",
"GameRendererMixin", "GameRendererMixin",
"HandshakeC2SPacketAccessor", "HandshakeC2SPacketAccessor",
"HeightContextMixin",
"HeightRangePlacementModifierAccessor",
"LivingEntityMixin", "LivingEntityMixin",
"LivingEntityRendererMixin", "LivingEntityRendererMixin",
"MultiplayerScreenAccessor", "MultiplayerScreenAccessor",
"MultiplayerScreenMixin", "MultiplayerScreenMixin",
"PlayerEntityMixin", "PlayerEntityMixin",
"PlayerMoveC2SPacketAccessor", "PlayerMoveC2SPacketAccessor",
"RarityFilterPlacementModifierAccessor",
"ServerListAccessor", "ServerListAccessor",
"StructureVoidBlockMixin", "StructureVoidBlockMixin",
"TexturedRenderLayersMixin", "TexturedRenderLayersMixin",