Skip to content

Commit

Permalink
Refactor biome generation + Fix #521 (#520)
Browse files Browse the repository at this point in the history
* Refactor and fix some templates

Refactored mixins, deleted unused yaml properties, fixed item registry bugs

* remove terrablender, add accesswidener, add mixin, add biome surface rules and climate parameters

* Update biomes.java.ftl

* Delete region.java.ftl

* Fix a few things + changelog

---------

Co-authored-by: Goldorion <38427877+Goldorion@users.noreply.github.com>
  • Loading branch information
NerdyPuzzle and Goldorion committed Mar 25, 2024
1 parent f663e7c commit a834c2e
Show file tree
Hide file tree
Showing 14 changed files with 198 additions and 171 deletions.
6 changes: 6 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelogs:

## 1.10
(Thank you NerdyPuzzle)
* [#520] Removed support for TerraBlender API (biome generation is now done similarly to Forge generators)
* [#417, #520] Add support for cave biomes
* [#521, #520] Custom items caused a build error in several cases

## 1.9.14
* [Bugfix] Items could not be registered and could cause a build error

Expand Down
12 changes: 0 additions & 12 deletions src/apis/terrablender.yaml

This file was deleted.

16 changes: 6 additions & 10 deletions src/fabric-1.20.1/biome.definition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,6 @@ templates:
condition: hasTrees()
name: "@MODDATAROOT/worldgen/placed_feature/@registryname_tree.json"

# TerraBlender
- template: biome/region.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/world/biome/regions/@NAMERegion.java"
condition_any:
- spawnBiome
- spawnInCaves
- spawnBiomeNether

global_templates:
- template: elementinits/biomes.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameBiomes.java"
Expand Down Expand Up @@ -210,12 +202,16 @@ global_templates:
name: "@RESROOT/data/minecraft/tags/worldgen/biome/has_structure/ruined_portal_nether.json"
hidden: true

# TerraBlender
# Surface rules
- template: elementinits/surfacerules.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameSurfaceRules.java"

# Mixins
- template: mixins/surfaceruleaccessormixin.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/mixins/NoiseGeneratorSettingsAccess.java"

localizationkeys:
- key: biome.@modid.@registryname
mapto: name

field_exclusions: [ spawnInCaves, treeVines, treeFruits ]
field_exclusions: [ treeVines, treeFruits ]
15 changes: 7 additions & 8 deletions src/fabric-1.20.1/generator.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Minecraft Fabric for @minecraft - @buildfileversion
status: experimental
buildfileversion: 0.83.1
subversion: 24
subversion: 25

import:
- datapack-1.20.1
Expand Down Expand Up @@ -72,16 +72,15 @@ base_templates:
- template: elementinits/sounds.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/init/@JavaModNameSounds.java"
condition: hasSounds()
- template: modbase/terrablender.java.ftl
name: "@SRCROOT/@BASEPACKAGEPATH/TerraBlenderInit.java"
canLock: true
condition: ${settings.getMCreatorDependenciesRaw()?seq_contains("terrablender")}
deleteWhenConditionFalse: true
- template: modbase/.accesswidener.ftl
writer: file
name: "@RESROOT/@modid.accesswidener"
- template: modbase/mixins.json.ftl
writer: file
name: "@RESROOT/@modid.mixins.json"
condition: ${w.hasElementsOfBaseType("item")}
deleteWhenConditionFalse: true
condition_any:
- ${w.hasElementsOfBaseType("item")}
- ${w.hasElementsOfType("biome")}

sources_setup_tasks:
- task: copy_models
Expand Down
75 changes: 0 additions & 75 deletions src/fabric-1.20.1/templates/biome/region.java.ftl

This file was deleted.

144 changes: 128 additions & 16 deletions src/fabric-1.20.1/templates/elementinits/biomes.java.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,24 @@
<#include "../mcitems.ftl">

<#assign spawn_overworld = []>
<#assign spawn_overworld_caves = []>
<#assign spawn_nether = []>

<#list biomes as biome>
<#if biome.spawnBiome>
<#assign spawn_overworld += [biome]>
</#if>
<#if biome.spawnInCaves>
<#assign spawn_overworld_caves += [biome]>
</#if>
<#if biome.spawnBiomeNether>
<#assign spawn_nether += [biome]>
</#if>
</#list>

package ${package}.init;

import terrablender.api.Regions;
import terrablender.api.SurfaceRuleManager;
import com.mojang.datafixers.util.Pair;

public class ${JavaModName}Biomes {

Expand All @@ -48,7 +51,7 @@ public class ${JavaModName}Biomes {
new ResourceLocation(${JavaModName}.MODID, "${biome.getModElement().getRegistryName()}"));
</#list>

public static void load() {
public static void loadEndBiomes() {
<#list biomes as me>
<#assign biome = me.getModElement().getGeneratableElement()>
<#list generator.sortByMappings(biome.defaultFeatures, "defaultfeatures") as defaultFeature>
Expand All @@ -61,20 +64,129 @@ public class ${JavaModName}Biomes {
</#list>
}

public static void loadTerraBlenderAPI() {
<#list biomes as biome>
<#if biome.spawnBiome || biome.spawnBiomeNether>
Regions.register(new ${biome.getModElement().getName()}Region(new ResourceLocation(${JavaModName}.MODID, "${biome.getModElement().getRegistryName()}")));
public static void load(MinecraftServer server) {
Registry<DimensionType> dimensionTypeRegistry = server.registryAccess().registryOrThrow(Registries.DIMENSION_TYPE);
Registry<LevelStem> levelStemTypeRegistry = server.registryAccess().registryOrThrow(Registries.LEVEL_STEM);
Registry<Biome> biomeRegistry = server.registryAccess().registryOrThrow(Registries.BIOME);

for (LevelStem levelStem : levelStemTypeRegistry.stream().toList()) {
DimensionType dimensionType = levelStem.type().value();

<#if spawn_overworld?has_content || spawn_overworld_caves?has_content>
if(dimensionType == dimensionTypeRegistry.getOrThrow(BuiltinDimensionTypes.OVERWORLD)) {
ChunkGenerator chunkGenerator = levelStem.generator();

// Inject biomes to biome source
if(chunkGenerator.getBiomeSource() instanceof MultiNoiseBiomeSource noiseSource) {
List<Pair<Climate.ParameterPoint, Holder<Biome>>> parameters = new ArrayList<>(noiseSource.parameters().values());

<#list spawn_overworld as biome>
parameters.add(new Pair<>(
new Climate.ParameterPoint(
Climate.Parameter.span(${biome.genTemperature.min}f, ${biome.genTemperature.max}f),
Climate.Parameter.span(${biome.genHumidity.min}f, ${biome.genHumidity.max}f),
Climate.Parameter.span(${biome.genContinentalness.min}f, ${biome.genContinentalness.max}f),
Climate.Parameter.span(${biome.genErosion.min}f, ${biome.genErosion.max}f),
Climate.Parameter.point(0.0f),
Climate.Parameter.span(${biome.genWeirdness.min}f, ${biome.genWeirdness.max}f),
0 <#-- offset -->
),
biomeRegistry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, new ResourceLocation("${modid}", "${biome.getModElement().getRegistryName()}")))
));
parameters.add(new Pair<>(
new Climate.ParameterPoint(
Climate.Parameter.span(${biome.genTemperature.min}f, ${biome.genTemperature.max}f),
Climate.Parameter.span(${biome.genHumidity.min}f, ${biome.genHumidity.max}f),
Climate.Parameter.span(${biome.genContinentalness.min}f, ${biome.genContinentalness.max}f),
Climate.Parameter.span(${biome.genErosion.min}f, ${biome.genErosion.max}f),
Climate.Parameter.point(1.0f),
Climate.Parameter.span(${biome.genWeirdness.min}f, ${biome.genWeirdness.max}f),
0 <#-- offset -->
),
biomeRegistry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, new ResourceLocation("${modid}", "${biome.getModElement().getRegistryName()}")))
));
</#list>

<#list spawn_overworld_caves as biome>
parameters.add(new Pair<>(
new Climate.ParameterPoint(
Climate.Parameter.span(${biome.genTemperature.min}f, ${biome.genTemperature.max}f),
Climate.Parameter.span(${biome.genHumidity.min}f, ${biome.genHumidity.max}f),
Climate.Parameter.span(${biome.genContinentalness.min}f, ${biome.genContinentalness.max}f),
Climate.Parameter.span(${biome.genErosion.min}f, ${biome.genErosion.max}f),
Climate.Parameter.span(0.2f, 0.9f),
Climate.Parameter.span(${biome.genWeirdness.min}f, ${biome.genWeirdness.max}f),
0 <#-- offset -->
),
biomeRegistry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, new ResourceLocation("${modid}", "${biome.getModElement().getRegistryName()}")))
));
</#list>

chunkGenerator.biomeSource = MultiNoiseBiomeSource.createFromList(new Climate.ParameterList<>(parameters));
chunkGenerator.featuresPerStep = Suppliers.memoize(() ->
FeatureSorter.buildFeaturesPerStep(List.copyOf(chunkGenerator.biomeSource.possibleBiomes()), biome ->
chunkGenerator.generationSettingsGetter.apply(biome).features(), true));
}

// Inject surface rules
if(chunkGenerator instanceof NoiseBasedChunkGenerator noiseGenerator) {
NoiseGeneratorSettings noiseGeneratorSettings = noiseGenerator.settings.value();
((NoiseGeneratorSettingsAccess)(Object)noiseGeneratorSettings).addSurfaceRules(SurfaceRules.sequence(
${JavaModName}SurfaceRules.makeOverworldRules(), noiseGeneratorSettings.surfaceRule()));
}
}
</#if>
</#list>

<#if spawn_overworld?has_content>
SurfaceRuleManager.addSurfaceRules(SurfaceRuleManager.RuleCategory.OVERWORLD, ${JavaModName}.MODID, ${JavaModName}SurfaceRules.makeOverworldRules());
</#if>

<#if spawn_nether?has_content>
SurfaceRuleManager.addSurfaceRules(SurfaceRuleManager.RuleCategory.NETHER, ${JavaModName}.MODID, ${JavaModName}SurfaceRules.makeNetherRules());
</#if>

<#if spawn_nether?has_content>
if(dimensionType == dimensionTypeRegistry.getOrThrow(BuiltinDimensionTypes.NETHER)) {
ChunkGenerator chunkGenerator = levelStem.generator();

// Inject biomes to biome source
if(chunkGenerator.getBiomeSource() instanceof MultiNoiseBiomeSource noiseSource) {
List<Pair<Climate.ParameterPoint, Holder<Biome>>> parameters = new ArrayList<>(noiseSource.parameters().values());

<#list spawn_nether as biome>
parameters.add(new Pair<>(
new Climate.ParameterPoint(
Climate.Parameter.span(${biome.genTemperature.min}f, ${biome.genTemperature.max}f),
Climate.Parameter.span(${biome.genHumidity.min}f, ${biome.genHumidity.max}f),
Climate.Parameter.span(${biome.genContinentalness.min}f, ${biome.genContinentalness.max}f),
Climate.Parameter.span(${biome.genErosion.min}f, ${biome.genErosion.max}f),
Climate.Parameter.point(0.0f),
Climate.Parameter.span(${biome.genWeirdness.min}f, ${biome.genWeirdness.max}f),
0 <#-- offset -->
),
biomeRegistry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, new ResourceLocation("${modid}", "${biome.getModElement().getRegistryName()}")))
));
parameters.add(new Pair<>(
new Climate.ParameterPoint(
Climate.Parameter.span(${biome.genTemperature.min}f, ${biome.genTemperature.max}f),
Climate.Parameter.span(${biome.genHumidity.min}f, ${biome.genHumidity.max}f),
Climate.Parameter.span(${biome.genContinentalness.min}f, ${biome.genContinentalness.max}f),
Climate.Parameter.span(${biome.genErosion.min}f, ${biome.genErosion.max}f),
Climate.Parameter.point(1.0f),
Climate.Parameter.span(${biome.genWeirdness.min}f, ${biome.genWeirdness.max}f),
0 <#-- offset -->
),
biomeRegistry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, new ResourceLocation("${modid}", "${biome.getModElement().getRegistryName()}")))
));
</#list>

chunkGenerator.biomeSource = MultiNoiseBiomeSource.createFromList(new Climate.ParameterList<>(parameters));
chunkGenerator.featuresPerStep = Suppliers.memoize(() ->
FeatureSorter.buildFeaturesPerStep(List.copyOf(chunkGenerator.biomeSource.possibleBiomes()), biome ->
chunkGenerator.generationSettingsGetter.apply(biome).features(), true));
}

// Inject surface rules
if(chunkGenerator instanceof NoiseBasedChunkGenerator noiseGenerator) {
NoiseGeneratorSettings noiseGeneratorSettings = noiseGenerator.settings.value();
((NoiseGeneratorSettingsAccess)(Object)noiseGeneratorSettings).addSurfaceRules(SurfaceRules.sequence(
${JavaModName}SurfaceRules.makeNetherRules(), noiseGeneratorSettings.surfaceRule()));
}
}
</#if>
}
}

}
Expand Down
2 changes: 1 addition & 1 deletion src/fabric-1.20.1/templates/elementinits/items.java.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public class ${JavaModName}Items {
}

private static void registerBlockingProperty(Item item) {
ItemProperties.register(item, new ResourceLocation("blocking"), ItemProperties.getProperty(Items.SHIELD, new ResourceLocation("blocking")));
ItemProperties.register(item, new ResourceLocation("blocking"), (ClampedItemPropertyFunction) ItemProperties.getProperty(Items.SHIELD, new ResourceLocation("blocking")));
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public class ${JavaModName}SurfaceRules {
}
</#if>

<#if spawn_nether?has_content || spawn_overworld_caves?has_content>
<#if spawn_nether?has_content || spawn_caves?has_content>
private static SurfaceRules.RuleSource anySurfaceRule(ResourceKey<Biome> biomeKey, BlockState groundBlock, BlockState undergroundBlock, BlockState underwaterBlock) {
return SurfaceRules.ifTrue(SurfaceRules.isBiome(biomeKey),
SurfaceRules.sequence(
Expand Down
Loading

0 comments on commit a834c2e

Please sign in to comment.