diff --git a/src/main/java/biomesoplenty/api/biome/BiomeOwner.java b/src/main/java/biomesoplenty/api/biome/BiomeOwner.java new file mode 100644 index 000000000..0ece3fb7e --- /dev/null +++ b/src/main/java/biomesoplenty/api/biome/BiomeOwner.java @@ -0,0 +1,15 @@ +/******************************************************************************* + * 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; + +public enum BiomeOwner +{ + BIOMESOPLENTY, + OTHER; +} diff --git a/src/main/java/biomesoplenty/api/biome/BiomeProperty.java b/src/main/java/biomesoplenty/api/biome/BiomeProperty.java new file mode 100644 index 000000000..f46e4a995 --- /dev/null +++ b/src/main/java/biomesoplenty/api/biome/BiomeProperty.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * 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; + +public enum BiomeProperty +{ + GRASS_PER_CHUNK(1), + FLOWERS_PER_CHUNK(2); + + private Object defaultValue; + + private BiomeProperty() {} + + private BiomeProperty(Object defaultValue) + { + this.defaultValue = defaultValue; + } + + public String getName() + { + return this.name().toLowerCase(); + } + + public Object getDefaultValue() + { + return this.defaultValue; + } +} diff --git a/src/main/java/biomesoplenty/api/biome/IExtendedBiome.java b/src/main/java/biomesoplenty/api/biome/IExtendedBiome.java new file mode 100644 index 000000000..9bb4d20dd --- /dev/null +++ b/src/main/java/biomesoplenty/api/biome/IExtendedBiome.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * 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 IExtendedBiome +{ + public BiomeOwner getBiomeOwner(); + public void setProperty(BiomeProperty property, Object value); + public Object getProperty(BiomeProperty property); + public Map getPropertyMap(); +} diff --git a/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java b/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java index dc46a22d5..3b1fca5f9 100644 --- a/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java +++ b/src/main/java/biomesoplenty/common/config/BiomeConfigurationHandler.java @@ -13,13 +13,17 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map.Entry; +import net.minecraft.world.biome.BiomeGenBase; + import org.apache.commons.io.FileUtils; -import com.google.gson.JsonSyntaxException; - +import biomesoplenty.api.biome.BiomeOwner; +import biomesoplenty.api.biome.BiomeProperty; +import biomesoplenty.api.biome.IExtendedBiome; import biomesoplenty.common.util.config.JsonBiome; import biomesoplenty.common.util.config.JsonEntitySpawn; -import net.minecraft.world.biome.BiomeGenBase; + +import com.google.gson.JsonSyntaxException; public class BiomeConfigurationHandler { @@ -36,43 +40,43 @@ public class BiomeConfigurationHandler registerConfigurableBiome(BiomeGenBase.ocean, "ocean"); registerConfigurableBiome(BiomeGenBase.plains, "plains"); registerConfigurableBiome(BiomeGenBase.desert, "desert"); - registerConfigurableBiome(BiomeGenBase.extremeHills, "extremeHills"); + registerConfigurableBiome(BiomeGenBase.extremeHills, "extreme_hills"); registerConfigurableBiome(BiomeGenBase.forest, "forest"); registerConfigurableBiome(BiomeGenBase.taiga, "taiga"); registerConfigurableBiome(BiomeGenBase.swampland, "swampland"); registerConfigurableBiome(BiomeGenBase.river, "river"); registerConfigurableBiome(BiomeGenBase.hell, "hell"); registerConfigurableBiome(BiomeGenBase.sky, "sky"); - registerConfigurableBiome(BiomeGenBase.frozenOcean, "frozenOcean"); - registerConfigurableBiome(BiomeGenBase.frozenRiver, "frozenRiver"); - registerConfigurableBiome(BiomeGenBase.icePlains, "icePlains"); - registerConfigurableBiome(BiomeGenBase.iceMountains, "iceMountains"); - registerConfigurableBiome(BiomeGenBase.mushroomIsland, "mushroomIsland"); - registerConfigurableBiome(BiomeGenBase.mushroomIslandShore, "mushroomIslandShore"); + registerConfigurableBiome(BiomeGenBase.frozenOcean, "frozen_ocean"); + registerConfigurableBiome(BiomeGenBase.frozenRiver, "frozen_river"); + registerConfigurableBiome(BiomeGenBase.icePlains, "ice_plains"); + registerConfigurableBiome(BiomeGenBase.iceMountains, "ice_mountains"); + registerConfigurableBiome(BiomeGenBase.mushroomIsland, "mushroom_island"); + registerConfigurableBiome(BiomeGenBase.mushroomIslandShore, "mushroom_island_shore"); registerConfigurableBiome(BiomeGenBase.beach, "beach"); - registerConfigurableBiome(BiomeGenBase.desertHills, "beachHills"); - registerConfigurableBiome(BiomeGenBase.forestHills, "forestHills"); - registerConfigurableBiome(BiomeGenBase.taigaHills, "taigaHills"); - registerConfigurableBiome(BiomeGenBase.extremeHillsEdge, "extremeHillsEdge"); + registerConfigurableBiome(BiomeGenBase.desertHills, "beach_hills"); + registerConfigurableBiome(BiomeGenBase.forestHills, "forest_hills"); + registerConfigurableBiome(BiomeGenBase.taigaHills, "taiga_hills"); + registerConfigurableBiome(BiomeGenBase.extremeHillsEdge, "extreme_hills_edge"); registerConfigurableBiome(BiomeGenBase.jungle, "jungle"); - registerConfigurableBiome(BiomeGenBase.jungleHills, "jungleHills"); - registerConfigurableBiome(BiomeGenBase.jungleEdge, "jungleEdge"); - registerConfigurableBiome(BiomeGenBase.deepOcean, "deepOcean"); - registerConfigurableBiome(BiomeGenBase.stoneBeach, "stoneBeach"); - registerConfigurableBiome(BiomeGenBase.coldBeach, "coldBeach"); - registerConfigurableBiome(BiomeGenBase.birchForest, "birchForest"); - registerConfigurableBiome(BiomeGenBase.birchForestHills, "birchForestHills"); - registerConfigurableBiome(BiomeGenBase.roofedForest, "roofedForest"); - registerConfigurableBiome(BiomeGenBase.coldTaiga, "coldTaiga"); - registerConfigurableBiome(BiomeGenBase.coldTaigaHills, "coldTaigaHills"); - registerConfigurableBiome(BiomeGenBase.megaTaiga, "megaTaiga"); - registerConfigurableBiome(BiomeGenBase.megaTaigaHills, "megaTaigaHills"); - registerConfigurableBiome(BiomeGenBase.extremeHillsPlus, "extremeHillsPlus"); + registerConfigurableBiome(BiomeGenBase.jungleHills, "jungle_hills"); + registerConfigurableBiome(BiomeGenBase.jungleEdge, "jungle_edge"); + registerConfigurableBiome(BiomeGenBase.deepOcean, "deep_ocean"); + registerConfigurableBiome(BiomeGenBase.stoneBeach, "stone_beach"); + registerConfigurableBiome(BiomeGenBase.coldBeach, "cold_beach"); + registerConfigurableBiome(BiomeGenBase.birchForest, "birch_forest"); + registerConfigurableBiome(BiomeGenBase.birchForestHills, "birch_forest_hills"); + registerConfigurableBiome(BiomeGenBase.roofedForest, "roofed_forest"); + registerConfigurableBiome(BiomeGenBase.coldTaiga, "cold_taiga"); + registerConfigurableBiome(BiomeGenBase.coldTaigaHills, "cold_taiga_hills"); + registerConfigurableBiome(BiomeGenBase.megaTaiga, "mega_taiga"); + registerConfigurableBiome(BiomeGenBase.megaTaigaHills, "mega_taiga_hills"); + registerConfigurableBiome(BiomeGenBase.extremeHillsPlus, "extreme_hills_plus"); registerConfigurableBiome(BiomeGenBase.savanna, "savanna"); - registerConfigurableBiome(BiomeGenBase.savannaPlateau, "savannaPlateau"); + registerConfigurableBiome(BiomeGenBase.savannaPlateau, "savanna_plateau"); registerConfigurableBiome(BiomeGenBase.mesa, "mesa"); - registerConfigurableBiome(BiomeGenBase.mesaPlateau_F, "mesaPlatea_F"); - registerConfigurableBiome(BiomeGenBase.mesaPlateau, "mesaPlateau"); + registerConfigurableBiome(BiomeGenBase.mesaPlateau_F, "mesa_plateau_f"); + registerConfigurableBiome(BiomeGenBase.mesaPlateau, "mesa_plateau"); } private static void load(File configDirectory) @@ -116,9 +120,24 @@ public class BiomeConfigurationHandler public static void registerConfigurableBiome(BiomeGenBase biome, String configFileName) { + translateVanillaValues(biome); configFileMap.put(biome, configFileName); } + private static void translateVanillaValues(BiomeGenBase biome) + { + IExtendedBiome extendedBiome = (IExtendedBiome)biome; + + if (extendedBiome.getBiomeOwner() == BiomeOwner.OTHER) + { + extendedBiome.setProperty(BiomeProperty.GRASS_PER_CHUNK, biome.theBiomeDecorator.grassPerChunk); + //TODO: Create our own implementations + //biome.theBiomeDecorator.grassPerChunk = 0; + extendedBiome.setProperty(BiomeProperty.FLOWERS_PER_CHUNK, biome.theBiomeDecorator.flowersPerChunk); + //biome.theBiomeDecorator.flowersPerChunk = 0; + } + } + private static void configureBiomeWithJson(BiomeGenBase biome, JsonBiome jsonBiome) { //TODO: Reflect and modify biome id biome.biomeId = jsonBiome.biomeID; @@ -132,5 +151,21 @@ public class BiomeConfigurationHandler biome.color = jsonBiome.color; biome.waterColorMultiplier = jsonBiome.waterColorMultiplier; JsonEntitySpawn.addBiomeEntitySpawns(biome, jsonBiome); + + IExtendedBiome extendedBiome = (IExtendedBiome)biome; + + if (!jsonBiome.decorationProperties.isEmpty()) + { + for (Entry entry : jsonBiome.decorationProperties.entrySet()) + { + BiomeProperty property = entry.getKey(); + Object value = entry.getValue(); + + if (property != null) + { + extendedBiome.setProperty(property, value); + } + } + } } } diff --git a/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java new file mode 100644 index 000000000..567de02d1 --- /dev/null +++ b/src/main/java/biomesoplenty/common/mixin/biome/MixinBiomeGenBase.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * 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.HashMap; +import java.util.Map; + +import net.minecraft.world.biome.BiomeGenBase; + +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.BiomeOwner; +import biomesoplenty.api.biome.BiomeProperty; +import biomesoplenty.api.biome.IExtendedBiome; + +@Mixin(BiomeGenBase.class) +public abstract class MixinBiomeGenBase implements IExtendedBiome +{ + private BiomeOwner biomeOwner; + private HashMap properties; + + @Inject(method = "(IZ)V", at = @At("RETURN")) + private void onConstructed(int biomeId, boolean register, CallbackInfo callbackInfo) + { + this.biomeOwner = BiomeOwner.OTHER; + this.properties = new HashMap(); + } + + @Override + public BiomeOwner getBiomeOwner() + { + return biomeOwner; + } + + @Override + public void setProperty(BiomeProperty property, Object value) + { + if (property.getDefaultValue() != value) + this.properties.put(property, value); + } + + @Override + public Object getProperty(BiomeProperty property) + { + return this.properties.get(property); + } + + @Override + public Map getPropertyMap() + { + return properties; + } +} diff --git a/src/main/java/biomesoplenty/common/util/config/JsonBiome.java b/src/main/java/biomesoplenty/common/util/config/JsonBiome.java index d15782774..ae479624f 100644 --- a/src/main/java/biomesoplenty/common/util/config/JsonBiome.java +++ b/src/main/java/biomesoplenty/common/util/config/JsonBiome.java @@ -9,16 +9,22 @@ package biomesoplenty.common.util.config; import java.util.ArrayList; +import java.util.Map; import net.minecraft.block.state.IBlockState; import net.minecraft.world.biome.BiomeGenBase; +import biomesoplenty.api.biome.BiomeProperty; +import biomesoplenty.api.biome.IExtendedBiome; +import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class JsonBiome { - public static final Gson serializer = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(IBlockState.class, new JsonBlockState()).create(); + public static final Gson serializer = new GsonBuilder() + .setPrettyPrinting().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .registerTypeAdapter(IBlockState.class, new JsonBlockState()).create(); public String biomeName; public int biomeId; @@ -31,6 +37,7 @@ public class JsonBiome public int color; public int waterColorMultiplier; public ArrayList entities; + public Map decorationProperties; public static JsonBiome createFromBiomeGenBase(BiomeGenBase baseBiome) { @@ -47,6 +54,7 @@ public class JsonBiome biome.color = baseBiome.color; biome.waterColorMultiplier = baseBiome.waterColorMultiplier; biome.entities = JsonEntitySpawn.getBiomeEntitySpawns(baseBiome); + biome.decorationProperties = ((IExtendedBiome)baseBiome).getPropertyMap(); return biome; } diff --git a/src/main/resources/mixins.biomesoplenty.json b/src/main/resources/mixins.biomesoplenty.json index 54c15f2b4..8d12b96bb 100644 --- a/src/main/resources/mixins.biomesoplenty.json +++ b/src/main/resources/mixins.biomesoplenty.json @@ -1,6 +1,7 @@ { "package": "biomesoplenty.common.mixin", "mixins": [ + "biome.MixinBiomeGenBase", "renderer.MixinBlockModelShapes" ] }