From c2ec7df86dbeec4c5ba83b0da619348ecf5bd859 Mon Sep 17 00:00:00 2001 From: Adubbz Date: Sun, 1 Feb 2015 10:47:40 +1100 Subject: [PATCH] Completed configurable cactus gen --- Mixin | 2 +- .../api/biome/IExtendedDecorator.java | 4 ++ .../biomesoplenty/api/biome/IGenerator.java | 7 ++++ .../config/BiomeConfigurationHandler.java | 10 +++-- .../decoration/DecorateBiomeEventHandler.java | 42 +++++++++++++++++++ .../common/init/ModHandlers.java | 4 +- .../mixin/biome/MixinBiomeDecorator.java | 24 +++++++---- .../common/mixin/biome/MixinBiomeGenBase.java | 12 ++++-- .../mixin/decoration/MixinWorldGenCactus.java | 39 +++++++++++------ 9 files changed, 116 insertions(+), 28 deletions(-) create mode 100644 src/main/java/biomesoplenty/common/handler/decoration/DecorateBiomeEventHandler.java diff --git a/Mixin b/Mixin index 116ecb045..9defcd624 160000 --- a/Mixin +++ b/Mixin @@ -1 +1 @@ -Subproject commit 116ecb0458d31c055c43d10db2670f513b59b27c +Subproject commit 9defcd6245c783d3a685c7bc8530b59a31fc928f diff --git a/src/main/java/biomesoplenty/api/biome/IExtendedDecorator.java b/src/main/java/biomesoplenty/api/biome/IExtendedDecorator.java index 79a82ec0e..6ed2b5bd3 100644 --- a/src/main/java/biomesoplenty/api/biome/IExtendedDecorator.java +++ b/src/main/java/biomesoplenty/api/biome/IExtendedDecorator.java @@ -10,11 +10,15 @@ package biomesoplenty.api.biome; import java.util.Map; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate; + public interface IExtendedDecorator { + public void addGenerator(String key, IGenerator generator, Decorate.EventType nextFeature); public void addGenerator(String key, IGenerator generator); public void configureGenerators(Map> generatorMap); public Map> getGeneratorMap(); + public Decorate.EventType getGeneratorStage(String key); } diff --git a/src/main/java/biomesoplenty/api/biome/IGenerator.java b/src/main/java/biomesoplenty/api/biome/IGenerator.java index 18f127374..3c95906c4 100644 --- a/src/main/java/biomesoplenty/api/biome/IGenerator.java +++ b/src/main/java/biomesoplenty/api/biome/IGenerator.java @@ -8,10 +8,17 @@ package biomesoplenty.api.biome; +import java.util.Random; + +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; + import com.google.gson.JsonElement; public interface IGenerator { + public void generate(World world, Random random, BlockPos pos); + public JsonElement serialize(IGenerator src); public IGenerator deserialize(JsonElement json); diff --git a/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java b/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java index 7895a8526..55a6f2e88 100644 --- a/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java +++ b/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java @@ -15,6 +15,7 @@ import java.util.Map.Entry; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.gen.feature.WorldGenCactus; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate; import org.apache.commons.io.FileUtils; @@ -131,16 +132,17 @@ public class BiomeConfigurationHandler { IExtendedBiome extendedBiome = (IExtendedBiome) biome; IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator; - + if (extendedBiome.getBiomeOwner() == BiomeOwner.OTHER) { if (biome.theBiomeDecorator.cactiPerChunk > 0) { WorldGenCactus cactusGen = new WorldGenCactus(); IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen; - + extendedCactusGen.setCactiPerChunk(biome.theBiomeDecorator.cactiPerChunk); - extendedDecorator.addGenerator("cactus", extendedCactusGen); + extendedDecorator.addGenerator("cactus", extendedCactusGen, Decorate.EventType.CACTUS); + biome.theBiomeDecorator.cactiPerChunk = 0; } } } @@ -160,7 +162,7 @@ public class BiomeConfigurationHandler JsonEntitySpawn.addBiomeEntitySpawns(biome, jsonBiome); IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator; - + extendedDecorator.configureGenerators(jsonBiome.decoration); } } diff --git a/src/main/java/biomesoplenty/common/handler/decoration/DecorateBiomeEventHandler.java b/src/main/java/biomesoplenty/common/handler/decoration/DecorateBiomeEventHandler.java new file mode 100644 index 000000000..25a46d8e9 --- /dev/null +++ b/src/main/java/biomesoplenty/common/handler/decoration/DecorateBiomeEventHandler.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright 2014-2015, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package biomesoplenty.common.handler.decoration; + +import java.util.Map.Entry; + +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import biomesoplenty.api.biome.IExtendedDecorator; +import biomesoplenty.api.biome.IGenerator; + +public class DecorateBiomeEventHandler +{ + @SubscribeEvent + public void onBiomeDecorate(DecorateBiomeEvent.Decorate event) + { + World world = event.world; + BlockPos pos = event.pos.add(16, 0, 16); + BiomeGenBase biome = world.getBiomeGenForCoords(pos); + IExtendedDecorator extendedDecorator = (IExtendedDecorator)biome.theBiomeDecorator; + + for (Entry> entry : extendedDecorator.getGeneratorMap().entrySet()) + { + String key = entry.getKey(); + IGenerator generator = entry.getValue(); + + if (extendedDecorator.getGeneratorStage(key) == event.type) + { + generator.generate(world, event.rand, event.pos); + } + } + } +} diff --git a/src/main/java/biomesoplenty/common/init/ModHandlers.java b/src/main/java/biomesoplenty/common/init/ModHandlers.java index 006d589a4..02167d299 100644 --- a/src/main/java/biomesoplenty/common/init/ModHandlers.java +++ b/src/main/java/biomesoplenty/common/init/ModHandlers.java @@ -8,14 +8,16 @@ package biomesoplenty.common.init; +import net.minecraftforge.common.MinecraftForge; import biomesoplenty.common.handler.BlockModelRegisterEventHandler; import biomesoplenty.common.handler.DrawScreenEventHandler; -import net.minecraftforge.common.MinecraftForge; +import biomesoplenty.common.handler.decoration.DecorateBiomeEventHandler; public class ModHandlers { public static void init() { + MinecraftForge.TERRAIN_GEN_BUS.register(new DecorateBiomeEventHandler()); MinecraftForge.EVENT_BUS.register(new BlockModelRegisterEventHandler()); MinecraftForge.EVENT_BUS.register(new DrawScreenEventHandler()); } diff --git a/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeDecorator.java b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeDecorator.java index 329515190..b81696ba1 100644 --- a/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeDecorator.java +++ b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeDecorator.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.Map; import net.minecraft.world.biome.BiomeDecorator; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -25,18 +26,21 @@ import biomesoplenty.api.biome.IGenerator; @Mixin(BiomeDecorator.class) public class MixinBiomeDecorator implements IExtendedDecorator { - private Map> generatorMap; - - @Inject(method = "", at = @At("RETURN")) - private void onConstructed(CallbackInfo callbackInfo) + private Map> generatorMap = new HashMap(); + //TODO: Come up with a better sequencing system + private Map generatorSequenceMap = new HashMap(); + + @Override + public void addGenerator(String key, IGenerator generator, Decorate.EventType nextFeature) { - this.generatorMap = new HashMap(); + this.generatorMap.put(key, generator); + this.generatorSequenceMap.put(key, nextFeature); } - + @Override public void addGenerator(String key, IGenerator generator) { - this.generatorMap.put(key, generator); + this.addGenerator(key, generator, Decorate.EventType.CUSTOM); } @Override @@ -50,4 +54,10 @@ public class MixinBiomeDecorator implements IExtendedDecorator { return Collections.unmodifiableMap(this.generatorMap); } + + @Override + public Decorate.EventType getGeneratorStage(String key) + { + return generatorSequenceMap.get(key); + } } diff --git a/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java index 077b4c1a5..b5e2af591 100644 --- a/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java +++ b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java @@ -8,9 +8,11 @@ package biomesoplenty.common.mixin.biome; +import net.minecraft.world.biome.BiomeDecorator; import net.minecraft.world.biome.BiomeGenBase; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -21,14 +23,18 @@ import biomesoplenty.api.biome.IExtendedBiome; @Mixin(BiomeGenBase.class) public abstract class MixinBiomeGenBase implements IExtendedBiome { - private BiomeOwner biomeOwner; + @Shadow + public BiomeDecorator theBiomeDecorator; + + private BiomeOwner biomeOwner = BiomeOwner.OTHER; @Inject(method = "(IZ)V", at = @At("RETURN")) private void onConstructed(int biomeId, boolean register, CallbackInfo callbackInfo) { - this.biomeOwner = BiomeOwner.OTHER; + //Prevents Forge from wiping all of our added data + this.theBiomeDecorator = new BiomeDecorator(); } - + @Override public BiomeOwner getBiomeOwner() { diff --git a/src/main/java/biomesoplenty/common/mixin/decoration/MixinWorldGenCactus.java b/src/main/java/biomesoplenty/common/mixin/decoration/MixinWorldGenCactus.java index afe5a0c8c..4dcb60378 100644 --- a/src/main/java/biomesoplenty/common/mixin/decoration/MixinWorldGenCactus.java +++ b/src/main/java/biomesoplenty/common/mixin/decoration/MixinWorldGenCactus.java @@ -8,9 +8,15 @@ package biomesoplenty.common.mixin.decoration; +import java.util.Random; + +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenCactus; import net.minecraft.world.gen.feature.WorldGenerator; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; import biomesoplenty.api.biome.IGenerator; @@ -20,24 +26,34 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; @Mixin(WorldGenCactus.class) -public abstract class MixinWorldGenCactus extends WorldGenerator implements IExtendedCactusGen +@Implements(@Interface(iface = IExtendedCactusGen.class, prefix = "extendedCactus$")) +public abstract class MixinWorldGenCactus extends WorldGenerator //implements IExtendedCactusGen { private int cactiPerChunk; - - @Override - public void setCactiPerChunk(int amount) + + public void extendedCactus$generate(World world, Random random, BlockPos pos) + { + for (int i = 0; i < cactiPerChunk; i++) + { + int x = random.nextInt(16) + 8; + int z = random.nextInt(16) + 8; + int y = random.nextInt(world.getHorizon(pos.add(x, 0, z)).getY() * 2); + + this.generate(world, random, pos.add(x, y, z)); + } + } + + public void extendedCactus$setCactiPerChunk(int amount) { this.cactiPerChunk = amount; } - @Override - public int getCactiPerChunk() + public int extendedCactus$getCactiPerChunk() { return this.cactiPerChunk; } - @Override - public JsonElement serialize(IGenerator src) + public JsonElement extendedCactus$serialize(IGenerator src) { JsonObject jsonCactusGen = new JsonObject(); @@ -46,15 +62,14 @@ public abstract class MixinWorldGenCactus extends WorldGenerator implements IExt return jsonCactusGen; } - @Override - public IGenerator deserialize(JsonElement json) + public IGenerator extendedCactus$deserialize(JsonElement json) { JsonObject jsonCactusGen = json.getAsJsonObject(); WorldGenCactus cactusGen = new WorldGenCactus(); IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen; - + extendedCactusGen.setCactiPerChunk(jsonCactusGen.get("cacti_per_chunk").getAsInt()); - return (IGenerator) new WorldGenCactus(); + return extendedCactusGen; } }