From edcb8188420fbe37e641834ebfd77490c993c596 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 22 May 2021 18:03:34 -0700 Subject: [PATCH] basic compatibility stuff on Forge --- .../java/com/dfsek/terra/forge/ForgeUtil.java | 60 ++++++++++++++++--- .../dfsek/terra/forge/TerraForgePlugin.java | 56 +++++++++++++++-- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeUtil.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeUtil.java index 8e112259b..633d98379 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeUtil.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/ForgeUtil.java @@ -1,19 +1,26 @@ package com.dfsek.terra.forge; +import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; -import net.minecraft.block.Blocks; +import com.dfsek.terra.forge.config.PostLoadCompatibilityOptions; +import com.dfsek.terra.forge.config.PreLoadCompatibilityOptions; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.WorldGenRegistries; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeAmbience; import net.minecraft.world.biome.BiomeGenerationSettings; import net.minecraft.world.gen.GenerationStage; -import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; -import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.StructureFeature; import java.util.ArrayList; +import java.util.Collections; import java.util.Locale; import java.util.Map; +import java.util.function.Supplier; public final class ForgeUtil { public static String createBiomeID(ConfigPack pack, String biomeID) { @@ -21,16 +28,52 @@ public final class ForgeUtil { } @SuppressWarnings("ConstantConditions") - public static Biome createBiome(BiomeBuilder biome) { + public static Biome createBiome(BiomeBuilder biome, ConfigPack pack, TerraForgePlugin.ForgeAddon forgeAddon) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); - Biome vanilla = (Biome) ((Object) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)); + Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); - generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. + + generationSettings.surfaceBuilder(vanilla.getGenerationSettings().getSurfaceBuilder()); // It needs a surfacebuilder, even though we dont use it. + generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, TerraForgePlugin.POPULATOR_CONFIGURED_FEATURE); + if(pack.getTemplate().vanillaCaves()) { + for(GenerationStage.Carving carver : GenerationStage.Carving.values()) { + for(Supplier> configuredCarverSupplier : vanilla.getGenerationSettings().getCarvers(carver)) { + generationSettings.addCarver(carver, configuredCarverSupplier.get()); + } + } + } + + Pair pair = forgeAddon.getTemplates().get(pack); + PreLoadCompatibilityOptions compatibilityOptions = pair.getLeft(); + PostLoadCompatibilityOptions postLoadCompatibilityOptions = pair.getRight(); + + TerraForgePlugin.getInstance().getDebugLogger().info("Injecting Vanilla structures and features into Terra biome " + biome.getTemplate().getID()); + + for(Supplier> structureFeature : vanilla.getGenerationSettings().structures()) { + ResourceLocation key = WorldGenRegistries.CONFIGURED_STRUCTURE_FEATURE.getKey(structureFeature.get()); + if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { + generationSettings.addStructureStart(structureFeature.get()); + TerraForgePlugin.getInstance().getDebugLogger().info("Injected structure " + key); + } + } + + if(compatibilityOptions.doBiomeInjection()) { + for(int step = 0; step < vanilla.getGenerationSettings().features().size(); step++) { + for(Supplier> featureSupplier : vanilla.getGenerationSettings().features().get(step)) { + ResourceLocation key = WorldGenRegistries.CONFIGURED_FEATURE.getKey(featureSupplier.get()); + if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { + generationSettings.addFeature(step, featureSupplier); + TerraForgePlugin.getInstance().getDebugLogger().info("Injected feature " + key + " at stage " + step); + } + } + } + } + BiomeAmbience vanillaEffects = vanilla.getSpecialEffects(); BiomeAmbience.Builder effects = new BiomeAmbience.Builder() .waterColor(colors.getOrDefault("water", vanillaEffects.getWaterColor())) @@ -44,7 +87,7 @@ public final class ForgeUtil { } else { vanillaEffects.getGrassColorOverride().ifPresent(effects::grassColorOverride); } - vanillaEffects.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); + if(colors.containsKey("foliage")) { effects.foliageColorOverride(colors.get("foliage")); } else { @@ -61,6 +104,7 @@ public final class ForgeUtil { .specialEffects(effects.build()) .mobSpawnSettings(vanilla.getMobSettings()) .generationSettings(generationSettings.build()) - .build().setRegistryName("terra", createBiomeID(template.getPack(), template.getID())); + .build() + .setRegistryName("terra", createBiomeID(template.getPack(), template.getID())); } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index c0870422c..dde742ca1 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -1,5 +1,6 @@ package com.dfsek.terra.forge; +import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addons.TerraAddon; @@ -14,6 +15,7 @@ import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.event.TerraEventManager; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; +import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.handle.ItemHandle; @@ -25,6 +27,7 @@ import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.transform.Validator; import com.dfsek.terra.api.util.JarUtil; +import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; @@ -32,6 +35,8 @@ import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.config.PostLoadCompatibilityOptions; +import com.dfsek.terra.forge.config.PreLoadCompatibilityOptions; import com.dfsek.terra.forge.generation.ForgeChunkGeneratorWrapper; import com.dfsek.terra.forge.generation.PopulatorFeature; import com.dfsek.terra.forge.generation.TerraBiomeSource; @@ -45,6 +50,7 @@ import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.WorldGenRegistries; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.Features; @@ -54,7 +60,6 @@ import net.minecraft.world.gen.placement.DecoratedPlacement; import net.minecraft.world.gen.placement.NoPlacementConfig; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistry; @@ -111,7 +116,10 @@ public class TerraForgePlugin implements TerraPlugin { private final WorldHandle worldHandle = new ForgeWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); - private final AddonRegistry addonRegistry = new AddonRegistry(new ForgeAddon(this), this); + + private final ForgeAddon addon = new ForgeAddon(this); + + private final AddonRegistry addonRegistry = new AddonRegistry(addon, this); private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); private final PluginConfig config = new PluginConfig(); private final Transformer biomeFixer = new Transformer.Builder() @@ -125,6 +133,7 @@ public class TerraForgePlugin implements TerraPlugin { this.dataFolder = Paths.get("config", "Terra").toFile(); saveDefaultConfig(); config.load(this); + debugLogger.setDebug(config.isDebug()); LangUtil.load(config.getLanguage(), this); try { CommandUtil.registerAll(manager); @@ -157,7 +166,7 @@ public class TerraForgePlugin implements TerraPlugin { logger.info("Loaded packs."); ((ForgeRegistry) ForgeRegistries.BIOMES).unfreeze(); // Evil - getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> ForgeRegistries.BIOMES.register(ForgeUtil.createBiome(biome)))); // Register all Terra biomes. + getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> ForgeRegistries.BIOMES.register(ForgeUtil.createBiome(biome, pack, addon)))); // Register all Terra biomes. ((ForgeRegistry) ForgeRegistries.BIOMES).freeze(); } @@ -304,7 +313,9 @@ public class TerraForgePlugin implements TerraPlugin { @Addon("Terra-Forge") @Author("Terra") @Version("1.0.0") - private static final class ForgeAddon extends TerraAddon implements EventListener { + public static final class ForgeAddon extends TerraAddon implements EventListener { + + private final Map> templates = new HashMap<>(); private final TerraPlugin main; @@ -340,6 +351,39 @@ public class TerraForgePlugin implements TerraPlugin { injectTree(treeRegistry, "MEGA_SPRUCE", Features.MEGA_SPRUCE); injectTree(treeRegistry, "CRIMSON_FUNGUS", Features.CRIMSON_FUNGI); injectTree(treeRegistry, "WARPED_FUNGUS", Features.WARPED_FUNGI); + PreLoadCompatibilityOptions template = new PreLoadCompatibilityOptions(); + try { + event.loadTemplate(template); + } catch(ConfigException e) { + e.printStackTrace(); + } + + if(template.doRegistryInjection()) { + WorldGenRegistries.CONFIGURED_FEATURE.entrySet().forEach(entry -> { + if(!template.getExcludedRegistryFeatures().contains(entry.getKey().getRegistryName())) { + try { + event.getPack().getTreeRegistry().add(entry.getKey().getRegistryName().toString(), (Tree) entry.getValue()); + main.getDebugLogger().info("Injected ConfiguredFeature " + entry.getKey().getRegistryName() + " as Tree: " + entry.getValue()); + } catch(DuplicateEntryException ignored) { + } + } + }); + } + templates.put(event.getPack(), Pair.of(template, null)); + } + + @Priority(Priority.HIGHEST) + @Global + public void createInjectionOptions(ConfigPackPostLoadEvent event) { + PostLoadCompatibilityOptions template = new PostLoadCompatibilityOptions(); + + try { + event.loadTemplate(template); + } catch(ConfigException e) { + e.printStackTrace(); + } + + templates.get(event.getPack()).setRight(template); } @@ -349,5 +393,9 @@ public class TerraForgePlugin implements TerraPlugin { } catch(DuplicateEntryException ignore) { } } + + public Map> getTemplates() { + return templates; + } } }