diff --git a/src/main/java/vazkii/botania/common/block/ModBlocks.java b/src/main/java/vazkii/botania/common/block/ModBlocks.java index 62624b9ec..c236db9ba 100644 --- a/src/main/java/vazkii/botania/common/block/ModBlocks.java +++ b/src/main/java/vazkii/botania/common/block/ModBlocks.java @@ -464,10 +464,12 @@ public final class ModBlocks { BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_MANASTAR, SubTileManastar.class); registerSubTileWithDecor(LibBlockNames.SUBTILE_DAYBLOOM, SubTileDaybloom.class, SubTileDecor.Daybloom.class); + BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_DAYBLOOM_PRIME, SubTileDaybloom.Prime.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_ENDOFLAME, SubTileEndoflame.class); registerSubTileWithDecor(LibBlockNames.SUBTILE_HYDROANGEAS, SubTileHydroangeas.class, SubTileDecor.Hydroangeas.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_THERMALILY, SubTileThermalily.class); registerSubTileWithDecor(LibBlockNames.SUBTILE_NIGHTSHADE, SubTileNightshade.class, SubTileDecor.Nightshade.class); + BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_NIGHTSHADE_PRIME, SubTileNightshade.Prime.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_ARCANE_ROSE, SubTileArcaneRose.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_MUNCHDEW, SubTileMunchdew.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_ENTROPINNYUM, SubTileEntropinnyum.class); diff --git a/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileDaybloom.java b/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileDaybloom.java index 642f8dd55..bd162979f 100644 --- a/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileDaybloom.java +++ b/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileDaybloom.java @@ -11,22 +11,58 @@ package vazkii.botania.common.block.subtile.generating; import java.awt.Color; +import java.util.ArrayList; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.subtile.ISubTileContainer; +import vazkii.botania.api.subtile.SubTileEntity; import vazkii.botania.common.Botania; import vazkii.botania.common.lexicon.LexiconData; import vazkii.botania.common.lib.LibMisc; public class SubTileDaybloom extends SubTilePassiveGenerating { - + + private static final String TAG_PRIME_POSITION_X = "primePositionX"; + private static final String TAG_PRIME_POSITION_Y = "primePositionY"; + private static final String TAG_PRIME_POSITION_Z = "primePositionZ"; + private static final String TAG_SAVED_POSITION = "savedPosition"; + + int primePositionX, primePositionY, primePositionZ; + boolean savedPosition; + @Override public int getColor() { return 0xFFFF00; } + @Override + public void onUpdate() { + super.onUpdate(); + + if(isPrime() && (!savedPosition || primePositionX != supertile.xCoord || primePositionY != supertile.yCoord || primePositionZ != supertile.zCoord)) + supertile.getWorldObj().setBlockToAir(supertile.xCoord, supertile.yCoord, supertile.zCoord); + } + + public void setPrimusPosition() { + primePositionX = supertile.xCoord; + primePositionY = supertile.yCoord; + primePositionZ = supertile.zCoord; + + savedPosition = true; + } + + @Override + public ArrayList getDrops(ArrayList list) { + if(isPrime()) + list.clear(); + + return super.getDrops(list); + } + @Override public boolean canGeneratePassively() { boolean rain = supertile.getWorldObj().getWorldChunkManager().getBiomeGenAt(supertile.xCoord, supertile.zCoord).getIntRainfall() > 0 && (supertile.getWorldObj().isRaining() || supertile.getWorldObj().isThundering()); @@ -35,7 +71,7 @@ public class SubTileDaybloom extends SubTilePassiveGenerating { @Override public int getDelayBetweenPassiveGeneration() { - return 25 + (int) (getSurroundingFlowers() * 7.5); + return isPrime() ? 22 : (25 + (int) (getSurroundingFlowers() * 7.5)); } public int getSurroundingFlowers() { @@ -61,15 +97,62 @@ public class SubTileDaybloom extends SubTilePassiveGenerating { return flowers; } + + @Override + public void writeToPacketNBT(NBTTagCompound cmp) { + super.writeToPacketNBT(cmp); + + if(isPrime()) { + cmp.setInteger(TAG_PRIME_POSITION_X, primePositionX); + cmp.setInteger(TAG_PRIME_POSITION_Y, primePositionY); + cmp.setInteger(TAG_PRIME_POSITION_Z, primePositionZ); + cmp.setBoolean(TAG_SAVED_POSITION, savedPosition); + } + } + + @Override + public void readFromPacketNBT(NBTTagCompound cmp) { + super.readFromPacketNBT(cmp); + + if(isPrime()) { + primePositionX = cmp.getInteger(TAG_PRIME_POSITION_X); + primePositionY = cmp.getInteger(TAG_PRIME_POSITION_Y); + primePositionZ = cmp.getInteger(TAG_PRIME_POSITION_Z); + savedPosition = cmp.getBoolean(TAG_SAVED_POSITION); + } + } @Override public boolean shouldSyncPassiveGeneration() { return true; } + + @Override + public boolean isPassiveFlower() { + return !isPrime(); + } @Override public LexiconEntry getEntry() { return LexiconData.daybloom; } + + public boolean isPrime() { + return false; + } + + public static class Prime extends SubTileDaybloom { + + @Override + public boolean isPrime() { + return true; + } + + @Override + public LexiconEntry getEntry() { + return LexiconData.primusLoci; + } + + } } diff --git a/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileNightshade.java b/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileNightshade.java index 94a65572a..607a3e7d0 100644 --- a/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileNightshade.java +++ b/src/main/java/vazkii/botania/common/block/subtile/generating/SubTileNightshade.java @@ -34,5 +34,19 @@ public class SubTileNightshade extends SubTileDaybloom { public LexiconEntry getEntry() { return LexiconData.nightshade; } + + public static class Prime extends SubTileNightshade { + + @Override + public boolean isPrime() { + return true; + } + + @Override + public LexiconEntry getEntry() { + return LexiconData.primusLoci; + } + + } } diff --git a/src/main/java/vazkii/botania/common/core/handler/BiomeDecorationHandler.java b/src/main/java/vazkii/botania/common/core/handler/BiomeDecorationHandler.java index 08878ac78..5f00d2d6a 100644 --- a/src/main/java/vazkii/botania/common/core/handler/BiomeDecorationHandler.java +++ b/src/main/java/vazkii/botania/common/core/handler/BiomeDecorationHandler.java @@ -16,6 +16,9 @@ import vazkii.botania.api.item.IFlowerlessBiome; import vazkii.botania.api.item.IFlowerlessWorld; import vazkii.botania.common.block.BlockModFlower; import vazkii.botania.common.block.ModBlocks; +import vazkii.botania.common.block.subtile.generating.SubTileDaybloom; +import vazkii.botania.common.block.tile.TileSpecialFlower; +import vazkii.botania.common.lib.LibBlockNames; import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -42,15 +45,25 @@ public class BiomeDecorationHandler { int y = event.world.getTopSolidOrLiquidBlock(x, z); int color = event.rand.nextInt(16); + boolean primus = event.rand.nextInt(500) == 0; + for(int j = 0; j < ConfigHandler.flowerDensity * ConfigHandler.flowerPatchChance; j++) { int x1 = x + event.rand.nextInt(dist * 2) - dist; int y1 = y + event.rand.nextInt(4) - event.rand.nextInt(4); int z1 = z + event.rand.nextInt(dist * 2) - dist; if(event.world.isAirBlock(x1, y1, z1) && (!event.world.provider.hasNoSky || y1 < 127) && ModBlocks.flower.canBlockStay(event.world, x1, y1, z1)) { - event.world.setBlock(x1, y1, z1, ModBlocks.flower, color, 2); - if(event.rand.nextDouble() < ConfigHandler.flowerTallChance && ((BlockModFlower) ModBlocks.flower).func_149851_a(event.world, x1, y1, z1, false)) - BlockModFlower.placeDoubleFlower(event.world, x1, y1, z1, color, 0); + if(primus) { + event.world.setBlock(x1, y1, z1, ModBlocks.specialFlower, 0, 2); + TileSpecialFlower flower = (TileSpecialFlower) event.world.getTileEntity(x1, y1, z1); + flower.setSubTile(event.rand.nextBoolean() ? LibBlockNames.SUBTILE_NIGHTSHADE_PRIME : LibBlockNames.SUBTILE_DAYBLOOM_PRIME); + SubTileDaybloom subtile = (SubTileDaybloom) flower.getSubTile(); + subtile.setPrimusPosition(); + } else { + event.world.setBlock(x1, y1, z1, ModBlocks.flower, color, 2); + if(event.rand.nextDouble() < ConfigHandler.flowerTallChance && ((BlockModFlower) ModBlocks.flower).func_149851_a(event.world, x1, y1, z1, false)) + BlockModFlower.placeDoubleFlower(event.world, x1, y1, z1, color, 0); + } } } } diff --git a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java index 925884496..d446a0938 100644 --- a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java +++ b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java @@ -123,6 +123,7 @@ public final class LexiconData { public static LexiconEntry generatingIntro; public static LexiconEntry passiveGen; + public static LexiconEntry primusLoci; public static LexiconEntry daybloom; public static LexiconEntry nightshade; public static LexiconEntry endoflame; @@ -531,6 +532,10 @@ public final class LexiconData { passiveGen = new BLexiconEntry(LibLexicon.GFLOWER_PASSIVE_GENERATION, categoryGenerationFlowers); passiveGen.setPriority().setLexiconPages(new PageText("0"), new PageText("1")).setIcon(new ItemStack(Blocks.deadbush)); + primusLoci = new BLexiconEntry(LibLexicon.GFLOWER_PRIMUS_LOCI, categoryGenerationFlowers); + primusLoci.setPriority().setLexiconPages(new PageText("0"), new PageText("1")); + primusLoci.setIcon(ItemBlockSpecialFlower.ofType(LibBlockNames.SUBTILE_DAYBLOOM_PRIME)); + daybloom = new BLexiconEntry(LibLexicon.GFLOWER_DAYBLOOM, categoryGenerationFlowers); daybloom.setPriority().setLexiconPages(new PageText("0"), new PageText(ConfigHandler.hardcorePassiveGeneration > 0 ? "1a" : "1"), new PageImage("3", LibResources.ENTRY_DIMINISHING_RETURNS), new PagePetalRecipe("2", ModPetalRecipes.daybloomRecipe), new PageText("4"), new PageText("5")); diff --git a/src/main/java/vazkii/botania/common/lib/LibBlockNames.java b/src/main/java/vazkii/botania/common/lib/LibBlockNames.java index 8b38b1843..8513c8005 100644 --- a/src/main/java/vazkii/botania/common/lib/LibBlockNames.java +++ b/src/main/java/vazkii/botania/common/lib/LibBlockNames.java @@ -109,10 +109,12 @@ public final class LibBlockNames { public static final String SUBTILE_MANASTAR = "manastar"; public static final String SUBTILE_DAYBLOOM = "daybloom"; + public static final String SUBTILE_DAYBLOOM_PRIME = "daybloomPrime"; public static final String SUBTILE_ENDOFLAME = "endoflame"; public static final String SUBTILE_HYDROANGEAS = "hydroangeas"; public static final String SUBTILE_THERMALILY = "thermalily"; public static final String SUBTILE_NIGHTSHADE = "nightshade"; + public static final String SUBTILE_NIGHTSHADE_PRIME = "nightshadePrime"; public static final String SUBTILE_ARCANE_ROSE = "arcanerose"; public static final String SUBTILE_MUNCHDEW = "munchdew"; public static final String SUBTILE_ENTROPINNYUM = "entropinnyum"; diff --git a/src/main/java/vazkii/botania/common/lib/LibLexicon.java b/src/main/java/vazkii/botania/common/lib/LibLexicon.java index a3512b403..b9ad31213 100644 --- a/src/main/java/vazkii/botania/common/lib/LibLexicon.java +++ b/src/main/java/vazkii/botania/common/lib/LibLexicon.java @@ -93,6 +93,7 @@ public final class LibLexicon { public static final String GFLOWER_INTRO = "gIntro"; public static final String GFLOWER_PASSIVE_GENERATION = "passiveGen"; + public static final String GFLOWER_PRIMUS_LOCI = "primusLoci"; public static final String GFLOWER_DAYBLOOM = "daybloom"; public static final String GFLOWER_NIGHTSHADE = "nightshade"; public static final String GFLOWER_ENDOFLAME = "endoflame"; diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index 1429cc8fc..bcb495d77 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -1167,6 +1167,8 @@ tile.botania:flower.daybloom.name=Daybloom tile.botania:flower.daybloom.reference=A Sting of light tile.botania:flower.daybloomDecor.name=Daybloom Motif tile.botania:flower.daybloomDecor.reference=A Sting of light +tile.botania:flower.daybloomPrime.name=Daybloom Primus +tile.botania:flower.daybloomPrime.reference=You should not have this on you tile.botania:flower.endoflame.name=Endoflame tile.botania:flower.endoflame.reference=Squirting Lag tile.botania:flower.hydroangeas.name=Hydroangeas @@ -1177,6 +1179,8 @@ tile.botania:flower.thermalily.name=Thermalily tile.botania:flower.thermalily.reference=A Scarlet Rose indeed tile.botania:flower.nightshade.name=Nightshade tile.botania:flower.nightshade.reference=Ghastly signature +tile.botania:flower.nightshadePrime.name=Nightshade Primus +tile.botania:flower.nightshadePrime.reference=You should not have this on you tile.botania:flower.nightshadeDecor.name=Nightshade Motif tile.botania:flower.nightshadeDecor.reference=Ghastly signature tile.botania:flower.arcanerose.name=Rosa Arcana @@ -2430,6 +2434,12 @@ botania.tagline.passiveGen=It's free or it's good, pick one botania.page.passiveGen0=The spectrum of &4Generating Flowers&0 can be arranged in two groups, &4Passive&0 and &4Active&0.
&4Passive Flowers&0 are those that simply create &4Mana&0 using a completely free resource, such as the sun, or water. &4Active Flowers&0 require some sort of resource to transform into &4Mana&0, be it renewable or not. botania.page.passiveGen1=At the start of a botanist's career, only very basic and rudimentary &4Passive Flowers&0 are available, such as the &1Daybloom&0 or &1Nightshade&0.
These flowers are required to advance on to more potent and effective &4Active Flowers&0, but they should not be relied upon aside from being a stepping stone, as all &4Passive Flowers&0 will decay into a &1Dead Bush&0 after three days of work. +# -- PRIMUS LOCI +botania.entry.primusLoci=Primus Loci +botania.tagline.primusLoci=Rare flower patches with non-decaying flowers +botania.page.primusLoci0=Among one's travels, one might come across an unusual flower patch, with flowers resembling &1Dayblooms&0 and &1Nightshades&0.
This is called a &4Primus Locus&0, a rare occurence in the world, where two special generating flora, the &1Daybloom Primus&0 and &1Nightshade Primus&0 can appear. +botania.page.primusLoci1=These flowers act as normal &1Dayblooms&0 or &1Nightshades&0, however, they produce mana a little bit faster and do not decay, making them a great find for a fledgling botanist to set up camp around.
Primus flowers are incredibly fickle, and as such, attempting to move them off their natural resting place will kill them. + # -- DAYBLOOM botania.entry.daybloom=Daybloom botania.tagline.daybloom=Mana from the sky diff --git a/src/main/resources/assets/botania/textures/blocks/alt/daybloomPrime.png b/src/main/resources/assets/botania/textures/blocks/alt/daybloomPrime.png new file mode 100644 index 000000000..f77d6cd64 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/alt/daybloomPrime.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/alt/nightshadePrime.png b/src/main/resources/assets/botania/textures/blocks/alt/nightshadePrime.png new file mode 100644 index 000000000..9e0163f78 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/alt/nightshadePrime.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/daybloomPrime.png b/src/main/resources/assets/botania/textures/blocks/daybloomPrime.png new file mode 100644 index 000000000..421b3825a Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/daybloomPrime.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/nightshadePrime.png b/src/main/resources/assets/botania/textures/blocks/nightshadePrime.png new file mode 100644 index 000000000..e55f82462 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/nightshadePrime.png differ