Finalized the system for configurable decoration features. Do note that the current test case (Cactus) has not yet been implemented, only the code for configuring the values which will be used for it. This means that biome decoration can now be implemented properly.
This commit is contained in:
parent
ae72d29ec3
commit
19180562fc
9 changed files with 259 additions and 3 deletions
|
@ -0,0 +1,18 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.api.biome;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface IExtendedDecorator
|
||||||
|
{
|
||||||
|
public void addGenerator(String key, IGenerator<?> generator);
|
||||||
|
public void configureGenerators(Map<String, IGenerator<?>> generatorMap);
|
||||||
|
public Map<String, IGenerator<?>> getGeneratorMap();
|
||||||
|
}
|
17
src/main/java/biomesoplenty/api/biome/IGenerator.java
Normal file
17
src/main/java/biomesoplenty/api/biome/IGenerator.java
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.api.biome;
|
||||||
|
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
|
||||||
|
public interface IGenerator<T>
|
||||||
|
{
|
||||||
|
public JsonElement serialize(IGenerator<T> src);
|
||||||
|
public IGenerator<T> deserialize(JsonElement json);
|
||||||
|
}
|
|
@ -14,11 +14,15 @@ import java.util.HashMap;
|
||||||
import java.util.Map.Entry;
|
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 org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
import biomesoplenty.api.biome.BiomeOwner;
|
import biomesoplenty.api.biome.BiomeOwner;
|
||||||
import biomesoplenty.api.biome.IExtendedBiome;
|
import biomesoplenty.api.biome.IExtendedBiome;
|
||||||
|
import biomesoplenty.api.biome.IExtendedDecorator;
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
import biomesoplenty.common.decoration.extensions.IExtendedCactusGen;
|
||||||
import biomesoplenty.common.util.config.JsonBiome;
|
import biomesoplenty.common.util.config.JsonBiome;
|
||||||
import biomesoplenty.common.util.config.JsonEntitySpawn;
|
import biomesoplenty.common.util.config.JsonEntitySpawn;
|
||||||
|
|
||||||
|
@ -126,9 +130,18 @@ public class BiomeConfigurationHandler
|
||||||
private static void translateVanillaValues(BiomeGenBase biome)
|
private static void translateVanillaValues(BiomeGenBase biome)
|
||||||
{
|
{
|
||||||
IExtendedBiome extendedBiome = (IExtendedBiome)biome;
|
IExtendedBiome extendedBiome = (IExtendedBiome)biome;
|
||||||
|
IExtendedDecorator extendedDecorator = (IExtendedDecorator)biome.theBiomeDecorator;
|
||||||
|
|
||||||
if (extendedBiome.getBiomeOwner() == BiomeOwner.OTHER)
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,6 +159,8 @@ public class BiomeConfigurationHandler
|
||||||
biome.waterColorMultiplier = jsonBiome.waterColorMultiplier;
|
biome.waterColorMultiplier = jsonBiome.waterColorMultiplier;
|
||||||
JsonEntitySpawn.addBiomeEntitySpawns(biome, jsonBiome);
|
JsonEntitySpawn.addBiomeEntitySpawns(biome, jsonBiome);
|
||||||
|
|
||||||
IExtendedBiome extendedBiome = (IExtendedBiome)biome;
|
IExtendedDecorator extendedDecorator = (IExtendedDecorator)biome.theBiomeDecorator;
|
||||||
|
|
||||||
|
extendedDecorator.configureGenerators(jsonBiome.decoration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.decoration.extensions;
|
||||||
|
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenCactus;
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
|
||||||
|
public interface IExtendedCactusGen extends IGenerator<WorldGenCactus>
|
||||||
|
{
|
||||||
|
public void setCactiPerChunk(int amount);
|
||||||
|
public int getCactiPerChunk();
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.mixin.biome;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import net.minecraft.world.biome.BiomeDecorator;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import biomesoplenty.api.biome.IExtendedDecorator;
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
|
||||||
|
@Mixin(BiomeDecorator.class)
|
||||||
|
public class MixinBiomeDecorator implements IExtendedDecorator
|
||||||
|
{
|
||||||
|
private Map<String, IGenerator<?>> generatorMap;
|
||||||
|
|
||||||
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
|
private void onConstructed(CallbackInfo callbackInfo)
|
||||||
|
{
|
||||||
|
this.generatorMap = new HashMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addGenerator(String key, IGenerator<?> generator)
|
||||||
|
{
|
||||||
|
this.generatorMap.put(key, generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureGenerators(Map<String, IGenerator<?>> generatorMap)
|
||||||
|
{
|
||||||
|
this.generatorMap.putAll(generatorMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, IGenerator<?>> getGeneratorMap()
|
||||||
|
{
|
||||||
|
return Collections.unmodifiableMap(this.generatorMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.mixin.decoration;
|
||||||
|
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenCactus;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenerator;
|
||||||
|
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
import biomesoplenty.common.decoration.extensions.IExtendedCactusGen;
|
||||||
|
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
|
@Mixin(WorldGenCactus.class)
|
||||||
|
public abstract class MixinWorldGenCactus extends WorldGenerator implements IExtendedCactusGen
|
||||||
|
{
|
||||||
|
private int cactiPerChunk;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCactiPerChunk(int amount)
|
||||||
|
{
|
||||||
|
this.cactiPerChunk = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCactiPerChunk()
|
||||||
|
{
|
||||||
|
return this.cactiPerChunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonElement serialize(IGenerator<WorldGenCactus> src)
|
||||||
|
{
|
||||||
|
JsonObject jsonCactusGen = new JsonObject();
|
||||||
|
|
||||||
|
jsonCactusGen.addProperty("cacti_per_chunk", ((IExtendedCactusGen)src).getCactiPerChunk());
|
||||||
|
|
||||||
|
return jsonCactusGen;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IGenerator<WorldGenCactus> 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<WorldGenCactus>)new WorldGenCactus();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* 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.util.config;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
|
||||||
|
import com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonDeserializer;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.JsonSerializationContext;
|
||||||
|
import com.google.gson.JsonSerializer;
|
||||||
|
|
||||||
|
public class GeneratorTypeAdaptor implements JsonSerializer<IGenerator<?>>, JsonDeserializer<IGenerator<?>>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public JsonElement serialize(IGenerator<?> src, Type typeOfSrc, JsonSerializationContext context)
|
||||||
|
{
|
||||||
|
JsonObject jsonObject = src.serialize((IGenerator)src).getAsJsonObject();
|
||||||
|
|
||||||
|
jsonObject.addProperty("class", src.getClass().getCanonicalName());
|
||||||
|
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IGenerator<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
|
||||||
|
{
|
||||||
|
JsonObject jsonObject = json.getAsJsonObject();
|
||||||
|
|
||||||
|
if (jsonObject.has("class"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class generatorClass = Class.forName(jsonObject.get("class").getAsString());
|
||||||
|
|
||||||
|
if (IGenerator.class.isAssignableFrom(generatorClass))
|
||||||
|
{
|
||||||
|
IGenerator<?> generator = (IGenerator<?>)generatorClass.newInstance();
|
||||||
|
|
||||||
|
return generator.deserialize(json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,9 +9,12 @@
|
||||||
package biomesoplenty.common.util.config;
|
package biomesoplenty.common.util.config;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.world.biome.BiomeGenBase;
|
import net.minecraft.world.biome.BiomeGenBase;
|
||||||
|
import biomesoplenty.api.biome.IExtendedDecorator;
|
||||||
|
import biomesoplenty.api.biome.IGenerator;
|
||||||
|
|
||||||
import com.google.gson.FieldNamingPolicy;
|
import com.google.gson.FieldNamingPolicy;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
@ -21,7 +24,9 @@ public class JsonBiome
|
||||||
{
|
{
|
||||||
public static final Gson serializer = new GsonBuilder()
|
public static final Gson serializer = new GsonBuilder()
|
||||||
.setPrettyPrinting().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
.setPrettyPrinting().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
||||||
.registerTypeAdapter(IBlockState.class, new JsonBlockState()).create();
|
.registerTypeAdapter(IBlockState.class, new JsonBlockState())
|
||||||
|
.registerTypeAdapter(IGenerator.class, new GeneratorTypeAdaptor())
|
||||||
|
.create();
|
||||||
|
|
||||||
public String biomeName;
|
public String biomeName;
|
||||||
public int biomeId;
|
public int biomeId;
|
||||||
|
@ -34,8 +39,9 @@ public class JsonBiome
|
||||||
public int color;
|
public int color;
|
||||||
public int waterColorMultiplier;
|
public int waterColorMultiplier;
|
||||||
public ArrayList<JsonEntitySpawn> entities;
|
public ArrayList<JsonEntitySpawn> entities;
|
||||||
|
public Map<String, IGenerator<?>> decoration;
|
||||||
|
|
||||||
public static JsonBiome createFromBiomeGenBase(BiomeGenBase baseBiome)
|
public static JsonBiome createFromBiomeGenBase(BiomeGenBase baseBiome)
|
||||||
{
|
{
|
||||||
JsonBiome biome = new JsonBiome();
|
JsonBiome biome = new JsonBiome();
|
||||||
|
|
||||||
|
@ -51,6 +57,10 @@ public class JsonBiome
|
||||||
biome.waterColorMultiplier = baseBiome.waterColorMultiplier;
|
biome.waterColorMultiplier = baseBiome.waterColorMultiplier;
|
||||||
biome.entities = JsonEntitySpawn.getBiomeEntitySpawns(baseBiome);
|
biome.entities = JsonEntitySpawn.getBiomeEntitySpawns(baseBiome);
|
||||||
|
|
||||||
|
IExtendedDecorator extendedDecorator = (IExtendedDecorator)baseBiome.theBiomeDecorator;
|
||||||
|
|
||||||
|
biome.decoration = extendedDecorator.getGeneratorMap();
|
||||||
|
|
||||||
return biome;
|
return biome;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
{
|
{
|
||||||
"package": "biomesoplenty.common.mixin",
|
"package": "biomesoplenty.common.mixin",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
|
"biome.MixinBiomeDecorator",
|
||||||
"biome.MixinBiomeGenBase",
|
"biome.MixinBiomeGenBase",
|
||||||
|
"decoration.MixinWorldGenCactus",
|
||||||
"renderer.MixinBlockModelShapes"
|
"renderer.MixinBlockModelShapes"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue