Biome carvers modifications

This commit is contained in:
paulevsGitch 2021-12-03 14:46:02 +03:00
parent 64c3d90458
commit dea05bce0d
9 changed files with 39 additions and 62 deletions

View file

@ -1,7 +1,6 @@
package ru.bclib.api.biomes; package ru.bclib.api.biomes;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.minecraft.core.Registry;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.BuiltinRegistries;
import net.minecraft.data.worldgen.BiomeDefaultFeatures; import net.minecraft.data.worldgen.BiomeDefaultFeatures;

View file

@ -16,7 +16,6 @@ import net.minecraft.core.Registry;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.random.WeightedRandomList; import net.minecraft.util.random.WeightedRandomList;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
@ -28,8 +27,10 @@ import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
import net.minecraft.world.level.levelgen.GenerationStep.Carving;
import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature;
@ -49,9 +50,7 @@ import ru.bclib.world.generator.BiomePicker;
import ru.bclib.world.structures.BCLStructureFeature; import ru.bclib.world.structures.BCLStructureFeature;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
@ -93,10 +92,9 @@ public class BiomeAPI {
/** /**
* Initialize registry for current server. * Initialize registry for current server.
* * @param biomeRegistry - {@link Registry} for {@link Biome}.
* @param server - {@link MinecraftServer}
*/ */
public static void initRegistry( Registry<Biome> biomeRegistry) { public static void initRegistry(Registry<Biome> biomeRegistry) {
BiomeAPI.biomeRegistry = biomeRegistry; BiomeAPI.biomeRegistry = biomeRegistry;
CLIENT.clear(); CLIENT.clear();
} }
@ -503,21 +501,16 @@ public class BiomeAPI {
* @param structure {@link ConfiguredStructureFeature} to add. * @param structure {@link ConfiguredStructureFeature} to add.
*/ */
public static void addBiomeStructure(ResourceKey biomeKey, ConfiguredStructureFeature structure) { public static void addBiomeStructure(ResourceKey biomeKey, ConfiguredStructureFeature structure) {
//BiomeStructureStartsImpl.addStart(registries, structure, getBiomeID(biome));
changeStructureStarts(structureMap -> { changeStructureStarts(structureMap -> {
Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create()); Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create());
configuredMap.put(structure, biomeKey); configuredMap.put(structure, biomeKey);
}); });
} }
public static void addBiomeStructure(Biome biome, ConfiguredStructureFeature structure) { public static void addBiomeStructure(Biome biome, ConfiguredStructureFeature structure) {
//BiomeStructureStartsImpl.addStart(registries, structure, getBiomeID(biome));
changeStructureStarts(structureMap -> { changeStructureStarts(structureMap -> {
Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create()); Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create());
var key = getBiomeKey(biome); var key = getBiomeKey(biome);
if (key!=null) { if (key!=null) {
configuredMap.put(structure, key); configuredMap.put(structure, key);
@ -525,11 +518,8 @@ public class BiomeAPI {
BCLib.LOGGER.error("Unable to find Biome " + getBiomeID(biome)); BCLib.LOGGER.error("Unable to find Biome " + getBiomeID(biome));
} }
}); });
} }
private static void changeStructureStarts(Consumer<Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>>> modifier) { private static void changeStructureStarts(Consumer<Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>>> modifier) {
Registry<NoiseGeneratorSettings> chunkGenSettingsRegistry = BuiltinRegistries.NOISE_GENERATOR_SETTINGS; Registry<NoiseGeneratorSettings> chunkGenSettingsRegistry = BuiltinRegistries.NOISE_GENERATOR_SETTINGS;
@ -539,11 +529,8 @@ public class BiomeAPI {
modifier.accept(structureMap); modifier.accept(structureMap);
setMutableStructureConfig(entry.getValue(), structureMap); setMutableStructureConfig(entry.getValue(), structureMap);
} }
} }
/** /**
* Adds new structure feature to existing biome. * Adds new structure feature to existing biome.
* @param biomeKey {@link ResourceKey} for the {@link Biome} to add structure feature in. * @param biomeKey {@link ResourceKey} for the {@link Biome} to add structure feature in.
@ -553,7 +540,6 @@ public class BiomeAPI {
addBiomeStructure(biomeKey, structure.getFeatureConfigured()); addBiomeStructure(biomeKey, structure.getFeatureConfigured());
} }
/** /**
* Adds new structure features to existing biome. * Adds new structure features to existing biome.
* @param biomeKey {@link ResourceKey} for the {@link Biome} to add structure features in. * @param biomeKey {@link ResourceKey} for the {@link Biome} to add structure features in.
@ -565,6 +551,21 @@ public class BiomeAPI {
} }
} }
/**
* Adds new carver into existing biome.
* @param biome {@link Biome} to add carver in.
* @param carver {@link ConfiguredWorldCarver} to add.
* @param stage {@link Carving} stage.
*/
public static void addBiomeCarver(Biome biome, ConfiguredWorldCarver carver, Carving stage) {
BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings();
Map<Carving, List<Supplier<ConfiguredWorldCarver<?>>>> carvers = CollectionsUtil.getMutable(accessor.bclib_getCarvers());
List<Supplier<ConfiguredWorldCarver<?>>> carverList = CollectionsUtil.getMutable(carvers.getOrDefault(stage, new ArrayList<>()));
carvers.put(stage, carverList);
carverList.add(() -> carver);
accessor.bclib_setCarvers(carvers);
}
/** /**
* Adds mob spawning to specified biome. * Adds mob spawning to specified biome.
* @param biome {@link Biome} to add mob spawning. * @param biome {@link Biome} to add mob spawning.
@ -576,8 +577,8 @@ public class BiomeAPI {
public static <M extends Mob> void addBiomeMobSpawn(Biome biome, EntityType<M> entityType, int weight, int minGroupCount, int maxGroupCount) { public static <M extends Mob> void addBiomeMobSpawn(Biome biome, EntityType<M> entityType, int weight, int minGroupCount, int maxGroupCount) {
final MobCategory category = entityType.getCategory(); final MobCategory category = entityType.getCategory();
MobSpawnSettingsAccessor accessor = (MobSpawnSettingsAccessor) biome.getMobSettings(); MobSpawnSettingsAccessor accessor = (MobSpawnSettingsAccessor) biome.getMobSettings();
Map<MobCategory, WeightedRandomList<SpawnerData>> spawners = getMutableMap(accessor.bcl_getSpawners()); Map<MobCategory, WeightedRandomList<SpawnerData>> spawners = CollectionsUtil.getMutable(accessor.bcl_getSpawners());
List<SpawnerData> mobs = spawners.containsKey(category) ? getMutableList(spawners.get(category).unwrap()) : Lists.newArrayList(); List<SpawnerData> mobs = spawners.containsKey(category) ? CollectionsUtil.getMutable(spawners.get(category).unwrap()) : Lists.newArrayList();
mobs.add(new SpawnerData(entityType, weight, minGroupCount, maxGroupCount)); mobs.add(new SpawnerData(entityType, weight, minGroupCount, maxGroupCount));
spawners.put(category, WeightedRandomList.create(mobs)); spawners.put(category, WeightedRandomList.create(mobs));
accessor.bcl_setSpawners(spawners); accessor.bcl_setSpawners(spawners);
@ -603,24 +604,11 @@ public class BiomeAPI {
lists.add(Lists.newArrayList()); lists.add(Lists.newArrayList());
} }
} }
List<Supplier<PlacedFeature>> list = getMutableList(lists.get(index)); List<Supplier<PlacedFeature>> list = CollectionsUtil.getMutable(lists.get(index));
lists.set(index, list); lists.set(index, list);
return list; return list;
} }
private static <T extends Object> List<T> getMutableList(List<T> input) {
if (input!=null) {
System.out.println("getMutableList: " + input.getClass().getName());
for (Class cl : input.getClass().getInterfaces()){
System.out.println(" - " + cl.getName());
}
}
if (/*input instanceof ImmutableList ||*/ !(input instanceof ArrayList || input instanceof LinkedList)) {
return Lists.newArrayList(input);
}
return input;
}
private static List<Supplier<PlacedFeature>> getFeaturesList(List<List<Supplier<PlacedFeature>>> features, Decoration step) { private static List<Supplier<PlacedFeature>> getFeaturesList(List<List<Supplier<PlacedFeature>>> features, Decoration step) {
int index = step.ordinal(); int index = step.ordinal();
while (features.size() <= index) { while (features.size() <= index) {
@ -631,13 +619,6 @@ public class BiomeAPI {
return mutable; return mutable;
} }
private static <K extends Object, V extends Object> Map<K, V> getMutableMap(Map<K, V> input) {
if (/*input instanceof ImmutableMap*/ !(input instanceof HashMap ||input instanceof EnumMap)) {
return Maps.newHashMap(input);
}
return input;
}
//inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl //inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl
private static Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>> getMutableStructureConfig(NoiseGeneratorSettings settings) { private static Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>> getMutableStructureConfig(NoiseGeneratorSettings settings) {
final StructureSettingsAccessor access = (StructureSettingsAccessor)settings.structureSettings(); final StructureSettingsAccessor access = (StructureSettingsAccessor)settings.structureSettings();
@ -653,11 +634,12 @@ public class BiomeAPI {
//inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl //inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl
private static void setMutableStructureConfig(NoiseGeneratorSettings settings, Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>> structureStarts) { private static void setMutableStructureConfig(NoiseGeneratorSettings settings, Map<StructureFeature<?>, Multimap<ConfiguredStructureFeature<?, ?>, ResourceKey<Biome>>> structureStarts) {
final StructureSettingsAccessor access = (StructureSettingsAccessor)settings.structureSettings(); final StructureSettingsAccessor access = (StructureSettingsAccessor) settings.structureSettings();
access.bcl_setStructureConfig(structureStarts.entrySet().stream() access.bcl_setStructureConfig(
.collect(ImmutableMap.toImmutableMap( structureStarts
Map.Entry::getKey, .entrySet()
e -> ImmutableMultimap.copyOf(e.getValue()) .stream()
))); .collect(ImmutableMap.toImmutableMap(Map.Entry::getKey, e -> ImmutableMultimap.copyOf(e.getValue())))
);
} }
} }

View file

@ -1,12 +1,16 @@
package ru.bclib.mixin.common; package ru.bclib.mixin.common;
import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.BiomeGenerationSettings;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.GenerationStep.Carving;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -24,4 +28,10 @@ public interface BiomeGenerationSettingsAccessor {
@Accessor("featureSet") @Accessor("featureSet")
void bclib_setFeatureSet(Set<PlacedFeature> features); void bclib_setFeatureSet(Set<PlacedFeature> features);
@Accessor("carvers")
Map<Carving, List<Supplier<ConfiguredWorldCarver<?>>>> bclib_getCarvers();
@Accessor("carvers")
void bclib_setCarvers(Map<GenerationStep.Carving, List<Supplier<ConfiguredWorldCarver<?>>>> features);
} }

View file

@ -1,7 +1,6 @@
package ru.bclib.mixin.common; package ru.bclib.mixin.common;
import net.minecraft.server.Main; import net.minecraft.server.Main;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;

View file

@ -21,7 +21,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.api.biomes.BiomeAPI;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.recipes.BCLRecipeManager; import ru.bclib.recipes.BCLRecipeManager;

View file

@ -9,13 +9,11 @@ import net.minecraft.world.level.CustomSpawner;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.storage.LevelStorageSource;
import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess;
import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.ServerLevelData;
import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.storage.WritableLevelData;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.bclib.api.LifeCycleAPI; import ru.bclib.api.LifeCycleAPI;

View file

@ -3,20 +3,14 @@ package ru.bclib.mixin.common;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.random.WeightedRandomList;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
import net.minecraft.world.level.levelgen.StructureSettings; import net.minecraft.world.level.levelgen.StructureSettings;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature;
import net.minecraft.world.level.levelgen.feature.configurations.StructureFeatureConfiguration;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(StructureSettings.class) @Mixin(StructureSettings.class)
public interface StructureSettingsAccessor { public interface StructureSettingsAccessor {
@Accessor("configuredStructures") @Accessor("configuredStructures")

View file

@ -8,11 +8,8 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import ru.bclib.api.biomes.BiomeAPI;
import ru.bclib.util.WeightedList; import ru.bclib.util.WeightedList;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;

View file

@ -27,7 +27,6 @@ import net.minecraft.world.level.levelgen.carver.CarverConfiguration;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import ru.bclib.api.biomes.BiomeAPI;
import ru.bclib.config.IdConfig; import ru.bclib.config.IdConfig;
import ru.bclib.config.PathConfig; import ru.bclib.config.PathConfig;
import ru.bclib.util.ColorUtil; import ru.bclib.util.ColorUtil;