This commit is contained in:
Zoë
2022-07-18 20:44:07 -07:00
parent 6cd91bcc1d
commit 2d97c776fc
13 changed files with 378 additions and 18 deletions

View File

@@ -19,6 +19,13 @@ package com.dfsek.terra.mod;
import ca.solostudios.strata.Versions;
import ca.solostudios.strata.version.Version;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.mod.config.VanillaWorldProperties;
import com.dfsek.terra.mod.util.MinecraftUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,6 +51,15 @@ public abstract class MinecraftAddon implements BaseAddon {
@Override
public void initialize() {
modPlatform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigurationLoadEvent.class)
.then(event -> {
if(event.is(ConfigPack.class)) {
event.getLoadedObject(ConfigPack.class).getContext().put(event.load(new VanillaWorldProperties()));
}
})
.global();
modPlatform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, ConfigPackPreLoadEvent.class)

View File

@@ -3,14 +3,11 @@ package com.dfsek.terra.mod.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.api.structure.Structure;
import net.minecraft.util.Identifier;
import java.util.Map;
import com.dfsek.terra.api.structure.configured.ConfiguredStructure;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
@@ -27,9 +24,9 @@ public class FertilizableConfig implements ObjectTemplate<FertilizableConfig> {
@Default
private Structure canGrow = null;
@Value("villager-fertilizable")
@Value("villager-farmable")
@Default
private Boolean villagerFertilizable = null;
private Boolean villagerFarmable = null;
public ProbabilityCollection<Structure> getStructures() {
return structures;
@@ -43,8 +40,8 @@ public class FertilizableConfig implements ObjectTemplate<FertilizableConfig> {
return canGrow;
}
public Boolean isVillagerFertilizable() {
return villagerFertilizable;
public Boolean isVillagerFarmable() {
return villagerFarmable;
}
@Override

View File

@@ -0,0 +1,38 @@
package com.dfsek.terra.mod.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.api.util.ConstantRange;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.mod.implmentation.TerraIntProvider;
import net.minecraft.world.dimension.DimensionType.MonsterSettings;
public class MonsterSettingsTemplate implements ObjectTemplate<MonsterSettings> {
@Value("piglin-safe")
@Default
private Boolean piglinSafe = false;
@Value("has-raids")
@Default
private Boolean hasRaids = false;
@Value("monster-spawn-light")
@Default
private Range monsterSpawnLight = new ConstantRange(0, 1);
@Value("monster-spawn-block-light-limit")
@Default
private int monsterSpawnBlockLightLimit = 0;
@Override
public MonsterSettings get() {
return new MonsterSettings(piglinSafe, hasRaids, new TerraIntProvider(monsterSpawnLight), monsterSpawnBlockLightLimit);
}
}

View File

@@ -0,0 +1,141 @@
package com.dfsek.terra.mod.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.mod.implmentation.TerraIntProvider;
import net.minecraft.client.gl.Uniform;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.util.math.intprovider.IntProviderType;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.dimension.DimensionType.MonsterSettings;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.util.ConstantRange;
import com.dfsek.terra.api.util.Range;
public class VanillaWorldProperties implements ConfigTemplate, Properties {
@Value("minecraft.fixed-time")
@Default
private Long fixedTime = null;
@Value("minecraft.has-sky-light")
@Default
private Boolean hasSkyLight = false;
@Value("minecraft.has-ceiling")
@Default
private Boolean hasCeiling = false;
@Value("minecraft.ultra-warm")
@Default
private Boolean ultraWarm = false;
@Value("minecraft.natural")
@Default
private Boolean natural = false;
@Value("minecraft.coordinate-scale")
@Default
private Double coordinateScale = 1.0E-5d;
@Value("minecraft.bed-works")
@Default
private Boolean bedWorks = false;
@Value("minecraft.respawn-anchor-works")
@Default
private Boolean respawnAnchorWorks = false;
@Value("minecraft.height")
@Default
private Range height = new ConstantRange(0, 16);
@Value("minecraft.height.logical")
@Default
private Integer logicalHeight = 0;
@Value("minecraft.infiniburn")
@Default
private Identifier infiniburn = new Identifier("");
@Value("minecraft.effects")
@Default
private Identifier effects = new Identifier("");
@Value("minecraft.ambient-light")
@Default
private Float ambientLight = Float.MAX_VALUE;
@Value("minecraft.monster-settings")
@Default
private MonsterSettings monsterSettings = new MonsterSettings(false, false, new TerraIntProvider(new ConstantRange(0, 1)), 0);
@Value("minecraft.sealevel")
@Default
private Integer sealevel = 0;
public Long getFixedTime() {
return fixedTime;
}
public Boolean getHasSkyLight() {
return hasSkyLight;
}
public Boolean getHasCeiling() {
return hasCeiling;
}
public Boolean getUltraWarm() {
return ultraWarm;
}
public Boolean getNatural() {
return natural;
}
public Double getCoordinateScale() {
return coordinateScale;
}
public Boolean getBedWorks() {
return bedWorks;
}
public Boolean getRespawnAnchorWorks() {
return respawnAnchorWorks;
}
public Range getHeight() {
return height;
}
public Integer getLogicalHeight() {
return logicalHeight;
}
public Identifier getInfiniburn() {
return infiniburn;
}
public Identifier getEffects() {
return effects;
}
public Float getAmbientLight() {
return ambientLight;
}
public MonsterSettings getMonsterSettings() {
return monsterSettings;
}
public Integer getSealevel() {
return sealevel;
}
}

View File

@@ -1,5 +1,10 @@
package com.dfsek.terra.mod.data;
import com.dfsek.terra.api.util.ConstantRange;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.mod.implmentation.TerraIntProvider;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.util.dynamic.RegistryOps;
@@ -62,4 +67,9 @@ public final class Codecs {
.forGetter(MinecraftChunkGeneratorWrapper::getSettings)
).apply(instance, instance.stable(MinecraftChunkGeneratorWrapper::new))
);
public static final Codec<TerraIntProvider> TERRA_CONSTANT_RANGE_INT_PROVIDER_TYPE = RecordCodecBuilder.create(range -> range.group(
Codec.INT.fieldOf("min").stable().forGetter(TerraIntProvider::getMin),
Codec.INT.fieldOf("max").stable().forGetter(TerraIntProvider::getMax)).apply(range, range.stable((min, max) -> new TerraIntProvider(new ConstantRange(
min, max)))));
}

View File

@@ -17,6 +17,9 @@
package com.dfsek.terra.mod.generation;
import com.dfsek.terra.mod.config.VanillaBiomeProperties;
import com.dfsek.terra.mod.config.VanillaWorldProperties;
import com.mojang.serialization.Codec;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@@ -76,6 +79,8 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
private ChunkGenerator delegate;
private ConfigPack pack;
private VanillaWorldProperties vanillaWorldProperties;
public MinecraftChunkGeneratorWrapper(Registry<StructureSet> noiseRegistry, TerraBiomeSource biomeSource, ConfigPack configPack,
RegistryEntry<ChunkGeneratorSettings> settingsSupplier) {
super(noiseRegistry, Optional.empty(), biomeSource);
@@ -86,6 +91,11 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
this.delegate = pack.getGeneratorProvider().newInstance(pack);
logger.info("Loading world with config pack {}", pack.getID());
this.biomeSource = biomeSource;
if (pack.getContext().has(VanillaBiomeProperties.class)) {
vanillaWorldProperties = pack.getContext().get(VanillaWorldProperties.class);
} else {
vanillaWorldProperties = new VanillaWorldProperties();
}
}
public Registry<StructureSet> getNoiseRegistry() {
@@ -115,7 +125,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
@Override
public int getWorldHeight() {
return settings.value().generationShapeConfig().height();
return vanillaWorldProperties.getHeight().getMax();
}
@@ -174,12 +184,12 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
@Override
public int getSeaLevel() {
return settings.value().seaLevel();
return vanillaWorldProperties.getSealevel();
}
@Override
public int getMinimumY() {
return settings.value().generationShapeConfig().minimumY();
return vanillaWorldProperties.getHeight().getMin();
}
@@ -209,7 +219,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
@Override
public void getDebugHudText(List<String> text, NoiseConfig noiseConfig, BlockPos pos) {
// no op
}
public ConfigPack getPack() {
@@ -220,6 +230,12 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
this.pack = pack;
this.delegate = pack.getGeneratorProvider().newInstance(pack);
biomeSource.setPack(pack);
if (pack.getContext().has(VanillaBiomeProperties.class)) {
vanillaWorldProperties = pack.getContext().get(VanillaWorldProperties.class);
} else {
vanillaWorldProperties = new VanillaWorldProperties();
}
logger.debug("Loading world with config pack {}", pack.getID());
}

View File

@@ -0,0 +1,43 @@
package com.dfsek.terra.mod.implmentation;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.mod.util.MinecraftAdapter;
import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.util.math.intprovider.IntProviderType;
import net.minecraft.util.math.random.Random;
import java.util.HashMap;
import java.util.Map;
public class TerraIntProvider extends IntProvider {
public static final Map<Class, IntProviderType> TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE = new HashMap<>();
public Range delegate;
public TerraIntProvider(Range delegate) {
this.delegate = delegate;
}
@Override
public int get(Random random) {
return delegate.get(MinecraftAdapter.adapt(random));
}
@Override
public int getMin() {
return delegate.getMin();
}
@Override
public int getMax() {
return delegate.getMax();
}
@Override
public IntProviderType<?> getType() {
return TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE.get(delegate.getClass());
}
}

View File

@@ -1,8 +1,6 @@
package com.dfsek.terra.mod.mixin.gameplay;
import com.dfsek.terra.mod.util.MinecraftAdapter;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.ai.brain.task.BoneMealTask;
@@ -24,6 +22,7 @@ import com.dfsek.terra.api.util.vector.Vector3Int;
import com.dfsek.terra.api.world.WritableWorld;
import com.dfsek.terra.mod.config.FertilizableConfig;
import com.dfsek.terra.mod.util.BiomeUtil;
import com.dfsek.terra.mod.util.MinecraftAdapter;
@Mixin(BoneMealTask.class)
@@ -37,9 +36,9 @@ public class BoneMealTaskMixin {
Block block = blockState.getBlock();
FertilizableConfig config = map.get(Registry.BLOCK.getId(block));
if(config != null) {
Boolean villagerFertilizable = config.isVillagerFertilizable();
if(villagerFertilizable != null) {
if(villagerFertilizable) {
Boolean villagerFarmable = config.isVillagerFarmable();
if(villagerFarmable != null) {
if(villagerFarmable) {
Structure canGrow = config.getCanGrow();
if(canGrow != null) {
RandomGenerator random = MinecraftAdapter.adapt(world.getRandom());

View File

@@ -1,5 +1,7 @@
package com.dfsek.terra.mod.mixin.lifecycle;
import com.dfsek.terra.mod.util.MinecraftUtil;
import net.minecraft.server.DataPackContents;
import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.Registry;

View File

@@ -0,0 +1,62 @@
package com.dfsek.terra.mod.util;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.mod.config.VanillaBiomeProperties;
import com.dfsek.terra.mod.config.VanillaWorldProperties;
import net.minecraft.tag.TagKey;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.dimension.DimensionType;
import java.util.OptionalLong;
public class DimensionUtil {
protected static RegistryKey<DimensionType> registerDimension(Identifier identifier,
DimensionType dimension) {
BuiltinRegistries.add(BuiltinRegistries.DIMENSION_TYPE,
registerKey(identifier)
.getValue(),
dimension);
return getDimensionKey(identifier);
}
public static RegistryKey<DimensionOptions> registerKey(Identifier identifier) {
return RegistryKey.of(Registry.DIMENSION_KEY, identifier);
}
public static RegistryKey<DimensionType> getDimensionKey(Identifier identifier) {
return BuiltinRegistries.DIMENSION_TYPE.getKey(BuiltinRegistries.DIMENSION_TYPE.get(identifier)).orElseThrow();
}
protected static RegistryKey<DimensionType> registerDimension(ConfigPack pack) {
VanillaWorldProperties vanillaWorldProperties;
if (pack.getContext().has(VanillaBiomeProperties.class)) {
vanillaWorldProperties = pack.getContext().get(VanillaWorldProperties.class);
} else {
vanillaWorldProperties = new VanillaWorldProperties();
}
DimensionType overworldDimensionType = new DimensionType(
vanillaWorldProperties.getFixedTime() == null ? OptionalLong.empty() : OptionalLong.of(vanillaWorldProperties.getFixedTime()),
vanillaWorldProperties.getHasSkyLight(),
vanillaWorldProperties.getHasCeiling(),
vanillaWorldProperties.getUltraWarm(),
vanillaWorldProperties.getNatural(),
vanillaWorldProperties.getCoordinateScale(),
vanillaWorldProperties.getBedWorks(),
vanillaWorldProperties.getRespawnAnchorWorks(),
vanillaWorldProperties.getHeight().getMin(),
vanillaWorldProperties.getHeight().getMax(),
vanillaWorldProperties.getLogicalHeight(),
TagKey.of(Registry.BLOCK_KEY, vanillaWorldProperties.getInfiniburn()),
vanillaWorldProperties.getEffects(),
vanillaWorldProperties.getAmbientLight(),
vanillaWorldProperties.getMonsterSettings());
return registerDimension(new Identifier("terra", pack.getID().toLowerCase()), overworldDimensionType);
}
}

View File

@@ -1,10 +1,17 @@
package com.dfsek.terra.mod.util;
import com.dfsek.terra.api.util.ConstantRange;
import com.dfsek.terra.mod.data.Codecs;
import com.dfsek.terra.mod.implmentation.TerraIntProvider;
import net.minecraft.block.entity.LootableContainerBlockEntity;
import net.minecraft.block.entity.MobSpawnerBlockEntity;
import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.intprovider.ConstantIntProvider;
import net.minecraft.util.math.intprovider.IntProviderType;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryEntry;
import net.minecraft.util.registry.RegistryKey;
@@ -12,6 +19,7 @@ import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biome.Builder;
import net.minecraft.world.biome.BiomeEffects;
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
import net.minecraft.world.biome.GenerationSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -54,6 +62,13 @@ public final class MinecraftUtil {
return null;
}
public static void registerIntProviderTypes() {
IntProviderType<TerraIntProvider> CONSTANT = IntProviderType.register("terra:constant_range",
Codecs.TERRA_CONSTANT_RANGE_INT_PROVIDER_TYPE);
TerraIntProvider.TERRA_RANGE_TYPE_TO_INT_PROVIDER_TYPE.put(ConstantRange.class, CONSTANT);
}
public static RegistryKey<Biome> registerKey(Identifier identifier) {
return RegistryKey.of(Registry.BIOME_KEY, identifier);
}

View File

@@ -1,11 +1,16 @@
package com.dfsek.terra.mod.util;
import net.minecraft.client.gui.screen.CustomizeBuffetLevelScreen;
import net.minecraft.client.gui.screen.CustomizeFlatLevelScreen;
import net.minecraft.client.gui.screen.world.LevelScreenProvider;
import net.minecraft.structure.StructureSet;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.noise.DoublePerlinNoiseSampler.NoiseParameters;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryEntry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.MultiNoiseBiomeSource;
import net.minecraft.world.biome.source.TheEndBiomeSource;
@@ -13,8 +18,11 @@ import net.minecraft.world.dimension.DimensionOptions;
import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.dimension.DimensionTypes;
import net.minecraft.world.gen.WorldPreset;
import net.minecraft.world.gen.WorldPresets;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.FlatChunkGenerator;
import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig;
import net.minecraft.world.gen.chunk.NoiseChunkGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,6 +31,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.util.generic.pair.Pair;
@@ -34,6 +43,15 @@ public class PresetUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class);
private static final List<Identifier> PRESETS = new ArrayList<>();
public static RegistryKey<WorldPreset> getPresetKey(Identifier identifier) {
return RegistryKey.of(Registry.WORLD_PRESET_KEY, identifier);
}
// public static void addPreset() {
// LevelScreenProvider
// LevelScreenProvider.WORLD_PRESET_TO_SCREEN_PROVIDER.put(Optional.ofNullable(getPresetKey(new Identifier("terra", "terra"))), new TerraPresetScreen());
// }
public static Pair<Identifier, WorldPreset> createDefault(ConfigPack pack) {
Registry<DimensionType> dimensionTypeRegistry = BuiltinRegistries.DIMENSION_TYPE;
Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry = BuiltinRegistries.CHUNK_GENERATOR_SETTINGS;
@@ -58,7 +76,7 @@ public class PresetUtil {
new TheEndBiomeSource(biomeRegistry),
endChunkGeneratorSettings));
RegistryEntry<DimensionType> overworldDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionTypes.OVERWORLD);
RegistryEntry<DimensionType> overworldDimensionType = dimensionTypeRegistry.getOrCreateEntry(DimensionUtil.registerDimension(pack));
RegistryEntry<ChunkGeneratorSettings> overworld = chunkGeneratorSettingsRegistry.getOrCreateEntry(ChunkGeneratorSettings.OVERWORLD);

View File

@@ -1,5 +1,7 @@
package com.dfsek.terra.lifecycle.util;
import com.dfsek.terra.mod.util.MinecraftUtil;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
@@ -12,6 +14,7 @@ public final class RegistryUtil {
}
public static void register() {
MinecraftUtil.registerIntProviderTypes();
Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), Codecs.MINECRAFT_CHUNK_GENERATOR_WRAPPER);
Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), Codecs.TERRA_BIOME_SOURCE);
}