Completed configurable cactus gen

This commit is contained in:
Adubbz 2015-02-01 10:47:40 +11:00
parent 8a5ef81dcd
commit c2ec7df86d
9 changed files with 116 additions and 28 deletions

2
Mixin

@ -1 +1 @@
Subproject commit 116ecb0458d31c055c43d10db2670f513b59b27c Subproject commit 9defcd6245c783d3a685c7bc8530b59a31fc928f

View File

@ -10,11 +10,15 @@ package biomesoplenty.api.biome;
import java.util.Map; import java.util.Map;
import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate;
public interface IExtendedDecorator public interface IExtendedDecorator
{ {
public void addGenerator(String key, IGenerator<?> generator, Decorate.EventType nextFeature);
public void addGenerator(String key, IGenerator<?> generator); public void addGenerator(String key, IGenerator<?> generator);
public void configureGenerators(Map<String, IGenerator<?>> generatorMap); public void configureGenerators(Map<String, IGenerator<?>> generatorMap);
public Map<String, IGenerator<?>> getGeneratorMap(); public Map<String, IGenerator<?>> getGeneratorMap();
public Decorate.EventType getGeneratorStage(String key);
} }

View File

@ -8,10 +8,17 @@
package biomesoplenty.api.biome; package biomesoplenty.api.biome;
import java.util.Random;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
public interface IGenerator<T> public interface IGenerator<T>
{ {
public void generate(World world, Random random, BlockPos pos);
public JsonElement serialize(IGenerator<T> src); public JsonElement serialize(IGenerator<T> src);
public IGenerator<T> deserialize(JsonElement json); public IGenerator<T> deserialize(JsonElement json);

View File

@ -15,6 +15,7 @@ import java.util.Map.Entry;
import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.gen.feature.WorldGenCactus; import net.minecraft.world.gen.feature.WorldGenCactus;
import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -131,16 +132,17 @@ public class BiomeConfigurationHandler
{ {
IExtendedBiome extendedBiome = (IExtendedBiome) biome; IExtendedBiome extendedBiome = (IExtendedBiome) biome;
IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator; IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator;
if (extendedBiome.getBiomeOwner() == BiomeOwner.OTHER) if (extendedBiome.getBiomeOwner() == BiomeOwner.OTHER)
{ {
if (biome.theBiomeDecorator.cactiPerChunk > 0) if (biome.theBiomeDecorator.cactiPerChunk > 0)
{ {
WorldGenCactus cactusGen = new WorldGenCactus(); WorldGenCactus cactusGen = new WorldGenCactus();
IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen; IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen;
extendedCactusGen.setCactiPerChunk(biome.theBiomeDecorator.cactiPerChunk); 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); JsonEntitySpawn.addBiomeEntitySpawns(biome, jsonBiome);
IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator; IExtendedDecorator extendedDecorator = (IExtendedDecorator) biome.theBiomeDecorator;
extendedDecorator.configureGenerators(jsonBiome.decoration); extendedDecorator.configureGenerators(jsonBiome.decoration);
} }
} }

View File

@ -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<String, IGenerator<?>> 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);
}
}
}
}

View File

@ -8,14 +8,16 @@
package biomesoplenty.common.init; package biomesoplenty.common.init;
import net.minecraftforge.common.MinecraftForge;
import biomesoplenty.common.handler.BlockModelRegisterEventHandler; import biomesoplenty.common.handler.BlockModelRegisterEventHandler;
import biomesoplenty.common.handler.DrawScreenEventHandler; import biomesoplenty.common.handler.DrawScreenEventHandler;
import net.minecraftforge.common.MinecraftForge; import biomesoplenty.common.handler.decoration.DecorateBiomeEventHandler;
public class ModHandlers public class ModHandlers
{ {
public static void init() public static void init()
{ {
MinecraftForge.TERRAIN_GEN_BUS.register(new DecorateBiomeEventHandler());
MinecraftForge.EVENT_BUS.register(new BlockModelRegisterEventHandler()); MinecraftForge.EVENT_BUS.register(new BlockModelRegisterEventHandler());
MinecraftForge.EVENT_BUS.register(new DrawScreenEventHandler()); MinecraftForge.EVENT_BUS.register(new DrawScreenEventHandler());
} }

View File

@ -13,6 +13,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.minecraft.world.biome.BiomeDecorator; import net.minecraft.world.biome.BiomeDecorator;
import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -25,18 +26,21 @@ import biomesoplenty.api.biome.IGenerator;
@Mixin(BiomeDecorator.class) @Mixin(BiomeDecorator.class)
public class MixinBiomeDecorator implements IExtendedDecorator public class MixinBiomeDecorator implements IExtendedDecorator
{ {
private Map<String, IGenerator<?>> generatorMap; private Map<String, IGenerator<?>> generatorMap = new HashMap();
//TODO: Come up with a better sequencing system
@Inject(method = "<init>", at = @At("RETURN")) private Map<String, Decorate.EventType> generatorSequenceMap = new HashMap();
private void onConstructed(CallbackInfo callbackInfo)
@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 @Override
public void addGenerator(String key, IGenerator<?> generator) public void addGenerator(String key, IGenerator<?> generator)
{ {
this.generatorMap.put(key, generator); this.addGenerator(key, generator, Decorate.EventType.CUSTOM);
} }
@Override @Override
@ -50,4 +54,10 @@ public class MixinBiomeDecorator implements IExtendedDecorator
{ {
return Collections.unmodifiableMap(this.generatorMap); return Collections.unmodifiableMap(this.generatorMap);
} }
@Override
public Decorate.EventType getGeneratorStage(String key)
{
return generatorSequenceMap.get(key);
}
} }

View File

@ -8,9 +8,11 @@
package biomesoplenty.common.mixin.biome; package biomesoplenty.common.mixin.biome;
import net.minecraft.world.biome.BiomeDecorator;
import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.BiomeGenBase;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@ -21,14 +23,18 @@ import biomesoplenty.api.biome.IExtendedBiome;
@Mixin(BiomeGenBase.class) @Mixin(BiomeGenBase.class)
public abstract class MixinBiomeGenBase implements IExtendedBiome public abstract class MixinBiomeGenBase implements IExtendedBiome
{ {
private BiomeOwner biomeOwner; @Shadow
public BiomeDecorator theBiomeDecorator;
private BiomeOwner biomeOwner = BiomeOwner.OTHER;
@Inject(method = "<init>(IZ)V", at = @At("RETURN")) @Inject(method = "<init>(IZ)V", at = @At("RETURN"))
private void onConstructed(int biomeId, boolean register, CallbackInfo callbackInfo) 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 @Override
public BiomeOwner getBiomeOwner() public BiomeOwner getBiomeOwner()
{ {

View File

@ -8,9 +8,15 @@
package biomesoplenty.common.mixin.decoration; 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.WorldGenCactus;
import net.minecraft.world.gen.feature.WorldGenerator; 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 org.spongepowered.asm.mixin.Mixin;
import biomesoplenty.api.biome.IGenerator; import biomesoplenty.api.biome.IGenerator;
@ -20,24 +26,34 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@Mixin(WorldGenCactus.class) @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; private int cactiPerChunk;
@Override public void extendedCactus$generate(World world, Random random, BlockPos pos)
public void setCactiPerChunk(int amount) {
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; this.cactiPerChunk = amount;
} }
@Override public int extendedCactus$getCactiPerChunk()
public int getCactiPerChunk()
{ {
return this.cactiPerChunk; return this.cactiPerChunk;
} }
@Override public JsonElement extendedCactus$serialize(IGenerator<WorldGenCactus> src)
public JsonElement serialize(IGenerator<WorldGenCactus> src)
{ {
JsonObject jsonCactusGen = new JsonObject(); JsonObject jsonCactusGen = new JsonObject();
@ -46,15 +62,14 @@ public abstract class MixinWorldGenCactus extends WorldGenerator implements IExt
return jsonCactusGen; return jsonCactusGen;
} }
@Override public IGenerator<WorldGenCactus> extendedCactus$deserialize(JsonElement json)
public IGenerator<WorldGenCactus> deserialize(JsonElement json)
{ {
JsonObject jsonCactusGen = json.getAsJsonObject(); JsonObject jsonCactusGen = json.getAsJsonObject();
WorldGenCactus cactusGen = new WorldGenCactus(); WorldGenCactus cactusGen = new WorldGenCactus();
IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen; IExtendedCactusGen extendedCactusGen = (IExtendedCactusGen) cactusGen;
extendedCactusGen.setCactiPerChunk(jsonCactusGen.get("cacti_per_chunk").getAsInt()); extendedCactusGen.setCactiPerChunk(jsonCactusGen.get("cacti_per_chunk").getAsInt());
return (IGenerator<WorldGenCactus>) new WorldGenCactus(); return extendedCactusGen;
} }
} }