diff --git a/gradle.properties b/gradle.properties index baf5d0e6a..067f03e0c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Magic options for more perf -org.gradle.jvmargs=-Xmx2048M -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC +org.gradle.jvmargs=-Xmx3048M -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC org.gradle.vfs.watch=true kapt.use.worker.api=true kapt.include.compile.classpath=false diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 4020713db..1155a480e 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -36,7 +36,7 @@ dependencies { } loom { - accessWidenerPath.set(file("src/main/resources/terra.accesswidener")) + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra-fabric-refmap.json") } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java index fdaee4a21..7afb25668 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java @@ -1,23 +1,20 @@ package com.dfsek.terra.fabric.util; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; - -import com.dfsek.terra.mod.config.ProtoPlatformBiome; -import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; -import com.dfsek.terra.mod.util.MinecraftUtil; - 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.gen.feature.ConfiguredFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.fabric.FabricEntryPoint; +import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.mod.config.ProtoPlatformBiome; +import com.dfsek.terra.mod.util.MinecraftUtil; public final class BiomeUtil { diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener deleted file mode 100644 index 3fde5170f..000000000 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ /dev/null @@ -1 +0,0 @@ -accessWidener v1 named diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index b09a9a1b1..95cd6d82d 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -32,11 +32,13 @@ dependencies { } loom { + accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener")) mixin { defaultRefmapName.set("terra-forge-refmap.json") } forge { + convertAccessWideners.set(true) mixinConfig("terra.common.mixins.json") mixinConfig("terra.forge.mixins.json") } diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts index 33a503818..439419b70 100644 --- a/platforms/mixin-common/build.gradle.kts +++ b/platforms/mixin-common/build.gradle.kts @@ -7,6 +7,7 @@ loom { mixin { defaultRefmapName.set("terra-common-refmap.json") } + accessWidenerPath.set(file("src/main/resources/terra.accesswidener")) } dependencies { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java index 49cc681c1..7d70b727e 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -4,13 +4,10 @@ import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.terra.mod.config.BiomeAdditionsSoundTemplate; -import com.dfsek.terra.mod.config.BiomeMoodSoundTemplate; -import com.dfsek.terra.mod.config.BiomeParticleConfigTemplate; - -import com.dfsek.terra.mod.config.MusicSoundTemplate; -import com.dfsek.terra.mod.config.SoundEventTemplate; +import com.dfsek.terra.mod.config.SpawnSettingsTemplate; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnGroup; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; import net.minecraft.sound.BiomeMoodSound; @@ -22,6 +19,8 @@ import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; +import net.minecraft.world.biome.SpawnSettings; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.gen.WorldPreset; import java.util.List; @@ -31,7 +30,17 @@ import java.util.function.BiConsumer; import com.dfsek.terra.AbstractPlatform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.world.biome.PlatformBiome; +import com.dfsek.terra.mod.config.BiomeAdditionsSoundTemplate; +import com.dfsek.terra.mod.config.BiomeMoodSoundTemplate; +import com.dfsek.terra.mod.config.BiomeParticleConfigTemplate; +import com.dfsek.terra.mod.config.EntityTypeTemplate; +import com.dfsek.terra.mod.config.MusicSoundTemplate; import com.dfsek.terra.mod.config.ProtoPlatformBiome; +import com.dfsek.terra.mod.config.SoundEventTemplate; +import com.dfsek.terra.mod.config.SpawnCostConfig; +import com.dfsek.terra.mod.config.SpawnEntryTemplate; +import com.dfsek.terra.mod.config.SpawnGroupTemplate; +import com.dfsek.terra.mod.config.SpawnTypeConfig; import com.dfsek.terra.mod.util.PresetUtil; @@ -63,7 +72,13 @@ public abstract class ModPlatform extends AbstractPlatform { .registerLoader(SoundEvent.class, SoundEventTemplate::new) .registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new) .registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new) - .registerLoader(MusicSound.class, MusicSoundTemplate::new); + .registerLoader(MusicSound.class, MusicSoundTemplate::new) + .registerLoader(EntityType.class, EntityTypeTemplate::new) + .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) + .registerLoader(SpawnEntry.class, SpawnEntryTemplate::new) + .registerLoader(SpawnGroup.class, SpawnGroupTemplate::new) + .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) + .registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new); } private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java index f6bc69a5a..92e6dc7a7 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeAdditionsSoundTemplate.java @@ -12,7 +12,7 @@ public class BiomeAdditionsSoundTemplate implements ObjectTemplate> { + @Value("id") + @Default + private Identifier id = null; + + @Override + public EntityType get() { + return Registry.ENTITY_TYPE.get(id); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java index 4896a0cc5..674d47548 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/MusicSoundTemplate.java @@ -20,7 +20,7 @@ public class MusicSoundTemplate implements ObjectTemplate { @Default private Integer maxDelay = null; - @Value("-current-music") + @Value("replace-current-music") @Default private Boolean replaceCurrentMusic = null; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java index 7a69b1546..f2ae58993 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SoundEventTemplate.java @@ -12,7 +12,7 @@ public class SoundEventTemplate implements ObjectTemplate { @Default private Identifier id = null; - @Value("distanceToTravel") + @Value("distance-to-travel") @Default private Float distanceToTravel = null; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnCostConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnCostConfig.java new file mode 100644 index 000000000..3af1ff1b1 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnCostConfig.java @@ -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 net.minecraft.entity.EntityType; + + +public class SpawnCostConfig implements ObjectTemplate { + @Value("type") + @Default + private EntityType type = null; + + @Value("mass") + @Default + private Double mass = null; + + @Value("gravity") + @Default + private Double gravity = null; + + public EntityType getType() { + return type; + } + + public Double getMass() { + return mass; + } + + public Double getGravity() { + return gravity; + } + + @Override + public SpawnCostConfig get() { + return this; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.java new file mode 100644 index 000000000..7c203b62e --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnEntryTemplate.java @@ -0,0 +1,31 @@ +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 net.minecraft.entity.EntityType; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; + + +public class SpawnEntryTemplate implements ObjectTemplate { + @Value("type") + @Default + private EntityType type = null; + + @Value("weight") + @Default + private Integer weight = null; + + @Value("min-group-size") + @Default + private Integer minGroupSize = null; + + @Value("max-group-size") + @Default + private Integer maxGroupSize = null; + + @Override + public SpawnEntry get() { + return new SpawnEntry(type, weight, minGroupSize, maxGroupSize); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java new file mode 100644 index 000000000..e6a9143d1 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnGroupTemplate.java @@ -0,0 +1,18 @@ +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 net.minecraft.entity.SpawnGroup; + + +public class SpawnGroupTemplate implements ObjectTemplate { + @Value("group") + @Default + private String group = null; + + @Override + public SpawnGroup get() { + return SpawnGroup.valueOf(group); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java new file mode 100644 index 000000000..25fae1481 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnSettingsTemplate.java @@ -0,0 +1,39 @@ +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 net.minecraft.world.biome.SpawnSettings; + +import java.util.List; + + +public class SpawnSettingsTemplate implements ObjectTemplate { + @Value("spawns") + @Default + private List spawns = null; + + @Value("costs") + @Default + private List costs = null; + + @Value("probability") + @Default + private Float probability = null; + + @Override + public SpawnSettings get() { + SpawnSettings.Builder builder = new SpawnSettings.Builder(); + for (SpawnTypeConfig spawn : spawns) { + builder.spawn(spawn.getGroup(), spawn.getEntry()); + } + for (SpawnCostConfig cost: costs) { + builder.spawnCost(cost.getType(), cost.getMass(), cost.getGravity()); + } + if (probability != null) { + builder.creatureSpawnProbability(probability); + } + + return builder.build(); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java new file mode 100644 index 000000000..0f1eff6b5 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/SpawnTypeConfig.java @@ -0,0 +1,31 @@ +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 net.minecraft.entity.SpawnGroup; +import net.minecraft.world.biome.SpawnSettings.SpawnEntry; + + +public class SpawnTypeConfig implements ObjectTemplate { + @Value("group") + @Default + private SpawnGroup group = null; + + @Value("entry") + @Default + private SpawnEntry entry = null; + + public SpawnGroup getGroup() { + return group; + } + + public SpawnEntry getEntry() { + return entry; + } + + @Override + public SpawnTypeConfig get() { + return this; + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java index 0bec88566..e44e4b977 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VanillaBiomeProperties.java @@ -11,6 +11,7 @@ import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; +import net.minecraft.world.biome.SpawnSettings; import com.dfsek.terra.api.properties.Properties; @@ -42,7 +43,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Value("colors.modifier") @Default - private GrassColorModifier modifier = null; + private GrassColorModifier grassColorModifier = null; @Value("particles") @Default @@ -80,6 +81,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { @Default private MusicSound music = null; + @Value("spawning") + @Default + private SpawnSettings spawnSettings = null; + public Integer getGrassColor() { return grassColor; } @@ -105,7 +110,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { } public GrassColorModifier getGrassColorModifier() { - return modifier; + return grassColorModifier; } public BiomeParticleConfig getParticleConfig() { @@ -143,4 +148,8 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties { public MusicSound getMusic() { return music; } + + public SpawnSettings getSpawnSettings() { + return spawnSettings; + } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/BiomeAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/BiomeAccessor.java new file mode 100644 index 000000000..c51029682 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/BiomeAccessor.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.mod.mixin.access; + +import net.minecraft.world.biome.Biome; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + + +@Mixin(Biome.class) +public interface BiomeAccessor { + @Accessor("weather") + Biome.Weather getWeather(); +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java index fc2eb9def..1fa62bcae 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -30,6 +30,7 @@ import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.Sign; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.mod.config.VanillaBiomeProperties; +import com.dfsek.terra.mod.mixin.access.BiomeAccessor; import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; @@ -151,14 +152,13 @@ public final class MinecraftUtil { builder.temperature(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperature(), vanilla.getTemperature())); builder.downfall(Objects.requireNonNullElse(vanillaBiomeProperties.getDownfall(), vanilla.getDownfall())); - - if (vanillaBiomeProperties.getTemperatureModifier() != null) { - builder.temperatureModifier(vanillaBiomeProperties.getTemperatureModifier()); - } - + + builder.temperatureModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getTemperatureModifier(), ((BiomeAccessor)((Object)vanilla)).getWeather().temperatureModifier())); + + builder.spawnSettings(Objects.requireNonNullElse(vanillaBiomeProperties.getSpawnSettings(), vanilla.getSpawnSettings())); + return builder .effects(effects.build()) - .spawnSettings(vanilla.getSpawnSettings()) .generationSettings(generationSettings.build()) .build(); } diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener new file mode 100644 index 000000000..4f59bb962 --- /dev/null +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -0,0 +1,2 @@ +accessWidener v1 named +accessible class net/minecraft/world/biome/Biome$Weather \ No newline at end of file