Biome modification API
This commit is contained in:
parent
60574d5b75
commit
cc33a9138b
5 changed files with 80 additions and 2 deletions
|
@ -11,7 +11,7 @@ loader_version= 0.12.4
|
||||||
fabric_version = 0.41.3+1.17
|
fabric_version = 0.41.3+1.17
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 0.5.0
|
mod_version = 0.5.1
|
||||||
maven_group = ru.bclib
|
maven_group = ru.bclib
|
||||||
archives_base_name = bclib
|
archives_base_name = bclib
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package ru.bclib.api;
|
package ru.bclib.api;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.Environment;
|
import net.fabricmc.api.Environment;
|
||||||
import net.fabricmc.fabric.impl.biome.InternalBiomeData;
|
import net.fabricmc.fabric.impl.biome.InternalBiomeData;
|
||||||
|
@ -10,8 +12,11 @@ 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.MinecraftServer;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
import net.minecraft.world.level.biome.Biome.ClimateParameters;
|
import net.minecraft.world.level.biome.Biome.ClimateParameters;
|
||||||
|
import net.minecraft.world.level.biome.BiomeSource;
|
||||||
import net.minecraft.world.level.biome.Biomes;
|
import net.minecraft.world.level.biome.Biomes;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import ru.bclib.util.MHelper;
|
import ru.bclib.util.MHelper;
|
||||||
|
@ -19,8 +24,11 @@ import ru.bclib.world.biomes.BCLBiome;
|
||||||
import ru.bclib.world.biomes.FabricBiomesData;
|
import ru.bclib.world.biomes.FabricBiomesData;
|
||||||
import ru.bclib.world.generator.BiomePicker;
|
import ru.bclib.world.generator.BiomePicker;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
public class BiomeAPI {
|
public class BiomeAPI {
|
||||||
/**
|
/**
|
||||||
|
@ -37,6 +45,9 @@ public class BiomeAPI {
|
||||||
private static final Map<Biome, BCLBiome> CLIENT = Maps.newHashMap();
|
private static final Map<Biome, BCLBiome> CLIENT = Maps.newHashMap();
|
||||||
private static Registry<Biome> biomeRegistry;
|
private static Registry<Biome> biomeRegistry;
|
||||||
|
|
||||||
|
private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Biome>>> MODIFICATIONS = Maps.newHashMap();
|
||||||
|
private static final Set<ResourceLocation> MODIFIED_BIOMES = Sets.newHashSet();
|
||||||
|
|
||||||
public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES));
|
public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES));
|
||||||
public static final BCLBiome CRIMSON_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.CRIMSON_FOREST));
|
public static final BCLBiome CRIMSON_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.CRIMSON_FOREST));
|
||||||
public static final BCLBiome WARPED_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.WARPED_FOREST));
|
public static final BCLBiome WARPED_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.WARPED_FOREST));
|
||||||
|
@ -320,4 +331,69 @@ public class BiomeAPI {
|
||||||
private static boolean pickerHasBiome(BiomePicker picker, ResourceLocation key) {
|
private static boolean pickerHasBiome(BiomePicker picker, ResourceLocation key) {
|
||||||
return picker.getBiomes().stream().filter(biome -> biome.getID().equals(key)).findFirst().isPresent();
|
return picker.getBiomes().stream().filter(biome -> biome.getID().equals(key)).findFirst().isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers new biome modification for specified dimension. Will work both for mod and datapack biomes.
|
||||||
|
* @param dimensionID {@link ResourceLocation} dimension ID, example: Level.OVERWORLD or "minecraft:overworld".
|
||||||
|
* @param modification {@link BiConsumer} with {@link ResourceKey} biome ID and {@link Biome} parameters.
|
||||||
|
*/
|
||||||
|
public static void registerBiomeModification(ResourceKey dimensionID, BiConsumer<ResourceLocation, Biome> modification) {
|
||||||
|
List<BiConsumer<ResourceLocation, Biome>> modifications = MODIFICATIONS.get(dimensionID);
|
||||||
|
if (modifications == null) {
|
||||||
|
modifications = Lists.newArrayList();
|
||||||
|
MODIFICATIONS.put(dimensionID, modifications);
|
||||||
|
}
|
||||||
|
modifications.add(modification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers new biome modification for the Overworld. Will work both for mod and datapack biomes.
|
||||||
|
* @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters.
|
||||||
|
*/
|
||||||
|
public static void registerOverworldBiomeModification(BiConsumer<ResourceLocation, Biome> modification) {
|
||||||
|
registerBiomeModification(Level.OVERWORLD, modification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers new biome modification for the Nether. Will work both for mod and datapack biomes.
|
||||||
|
* @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters.
|
||||||
|
*/
|
||||||
|
public static void registerNetherBiomeModification(BiConsumer<ResourceLocation, Biome> modification) {
|
||||||
|
registerBiomeModification(Level.NETHER, modification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers new biome modification for the End. Will work both for mod and datapack biomes.
|
||||||
|
* @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters.
|
||||||
|
*/
|
||||||
|
public static void registerEndBiomeModification(BiConsumer<ResourceLocation, Biome> modification) {
|
||||||
|
registerBiomeModification(Level.END, modification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will apply biome modifications to world, internal usage only.
|
||||||
|
* @param level
|
||||||
|
*/
|
||||||
|
public static void applyModifications(ServerLevel level) {
|
||||||
|
List<BiConsumer<ResourceLocation, Biome>> modifications = MODIFICATIONS.get(level.dimension());
|
||||||
|
if (modifications == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BiomeSource source = level.getChunkSource().getGenerator().getBiomeSource();
|
||||||
|
List<Biome> biomes = source.possibleBiomes();
|
||||||
|
|
||||||
|
biomes.forEach(biome -> {
|
||||||
|
ResourceLocation biomeID = getBiomeID(biome);
|
||||||
|
boolean modify = isDatapackBiome(biomeID);
|
||||||
|
if (!modify && !MODIFIED_BIOMES.contains(biomeID)) {
|
||||||
|
MODIFIED_BIOMES.add(biomeID);
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
if (modify) {
|
||||||
|
modifications.forEach(consumer -> {
|
||||||
|
consumer.accept(biomeID, biome);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@ import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.Environment;
|
import net.fabricmc.api.Environment;
|
||||||
import net.minecraft.client.gui.components.AbstractWidget;
|
import net.minecraft.client.gui.components.AbstractWidget;
|
||||||
import ru.bclib.gui.gridlayout.GridLayout.GridValueType;
|
import ru.bclib.gui.gridlayout.GridLayout.GridValueType;
|
||||||
import ru.bclib.util.Pair;
|
|
||||||
import ru.bclib.interfaces.TriConsumer;
|
import ru.bclib.interfaces.TriConsumer;
|
||||||
|
import ru.bclib.util.Pair;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -33,6 +33,7 @@ public abstract class ServerLevelMixin extends Level {
|
||||||
@Inject(method = "<init>*", at = @At("TAIL"))
|
@Inject(method = "<init>*", at = @At("TAIL"))
|
||||||
private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List<CustomSpawner> list, boolean bl, CallbackInfo info) {
|
private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey<Level> registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List<CustomSpawner> list, boolean bl, CallbackInfo info) {
|
||||||
BiomeAPI.initRegistry(server);
|
BiomeAPI.initRegistry(server);
|
||||||
|
BiomeAPI.applyModifications(ServerLevel.class.cast(this));
|
||||||
|
|
||||||
if (bclib_lastWorld != null && bclib_lastWorld.equals(session.getLevelId())) {
|
if (bclib_lastWorld != null && bclib_lastWorld.equals(session.getLevelId())) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -28,6 +28,7 @@ public class BCLibNetherBiomeSource extends BiomeSource {
|
||||||
private BiomeMap biomeMap;
|
private BiomeMap biomeMap;
|
||||||
private final long seed;
|
private final long seed;
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public static final List<Consumer<BCLibNetherBiomeSource>> onInit = new LinkedList<>();
|
public static final List<Consumer<BCLibNetherBiomeSource>> onInit = new LinkedList<>();
|
||||||
|
|
||||||
public BCLibNetherBiomeSource(Registry<Biome> biomeRegistry, long seed) {
|
public BCLibNetherBiomeSource(Registry<Biome> biomeRegistry, long seed) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue