From 266e3587db00bf8779cb0e4548afcc54d580ccee Mon Sep 17 00:00:00 2001 From: Lizbeth Rika Date: Wed, 28 Jan 2015 18:42:14 +0000 Subject: [PATCH] Added all the basic achievements. --- .../achievement/AchievementTriggerer.java | 40 ++++++++++++++++++ .../common/achievement/ICraftAchievement.java | 23 ++++++++++ .../achievement/IPickupAchievement.java | 22 ++++++++++ .../common/achievement/ModAchievements.java | 6 ++- .../botania/common/block/BlockAlfPortal.java | 6 ++- .../botania/common/block/BlockModFlower.java | 11 ++++- .../common/block/BlockSpecialFlower.java | 3 ++ .../common/block/decor/BlockTinyPotato.java | 2 + .../botania/common/block/mana/BlockPool.java | 10 ++++- .../common/entity/EntityDoppleganger.java | 10 +++++ .../botania/common/item/ItemLexicon.java | 3 ++ .../botania/common/item/ItemManaCookie.java | 9 ++++ .../botania/common/item/ItemManaGun.java | 2 + .../vazkii/botania/common/item/ItemSpark.java | 11 ++++- .../botania/common/item/ItemSpawnerMover.java | 2 + .../botania/common/item/ItemThornChakram.java | 11 ++++- .../common/item/block/ItemBlockElven.java | 2 - .../common/item/block/ItemBlockMod.java | 18 +++++++- .../item/block/ItemBlockSpecialFlower.java | 16 +++++++ .../block/ItemBlockWithMetadataAndName.java | 18 +++++++- .../item/equipment/bauble/ItemBauble.java | 4 ++ .../equipment/bauble/ItemFlightTiara.java | 12 +++++- .../item/equipment/tool/ItemTerraSword.java | 11 ++++- .../item/material/ItemManaResource.java | 11 ++++- .../common/item/material/ItemRune.java | 12 +++++- .../botania/common/item/rod/ItemDirtRod.java | 11 ++++- .../resources/assets/botania/lang/en_US.lang | 42 +++++++++++++++++++ 27 files changed, 313 insertions(+), 15 deletions(-) create mode 100644 src/main/java/vazkii/botania/common/achievement/AchievementTriggerer.java create mode 100644 src/main/java/vazkii/botania/common/achievement/ICraftAchievement.java create mode 100644 src/main/java/vazkii/botania/common/achievement/IPickupAchievement.java diff --git a/src/main/java/vazkii/botania/common/achievement/AchievementTriggerer.java b/src/main/java/vazkii/botania/common/achievement/AchievementTriggerer.java new file mode 100644 index 000000000..ca1680696 --- /dev/null +++ b/src/main/java/vazkii/botania/common/achievement/AchievementTriggerer.java @@ -0,0 +1,40 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jan 28, 2015, 5:57:07 PM (GMT)] + */ +package vazkii.botania.common.achievement; + +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; + +public final class AchievementTriggerer { + + @SubscribeEvent + public void onItemPickedUp(ItemPickupEvent event) { + ItemStack stack = event.pickedUp.getEntityItem(); + if(stack != null && stack.getItem() instanceof IPickupAchievement) { + Achievement achievement = ((IPickupAchievement) stack.getItem()).getAchievementOnPickup(stack, event.player, event.pickedUp); + if(achievement != null) + event.player.addStat(achievement, 1); + } + } + + @SubscribeEvent + public void onItemCrafted(ItemCraftedEvent event) { + if(event.crafting != null && event.crafting.getItem() instanceof ICraftAchievement) { + Achievement achievement = ((ICraftAchievement) event.crafting.getItem()).getAchievementOnCraft(event.crafting, event.player, event.craftMatrix); + if(achievement != null) + event.player.addStat(achievement, 1); + } + } + +} diff --git a/src/main/java/vazkii/botania/common/achievement/ICraftAchievement.java b/src/main/java/vazkii/botania/common/achievement/ICraftAchievement.java new file mode 100644 index 000000000..fc8183041 --- /dev/null +++ b/src/main/java/vazkii/botania/common/achievement/ICraftAchievement.java @@ -0,0 +1,23 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jan 28, 2015, 5:59:07 PM (GMT)] + */ +package vazkii.botania.common.achievement; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; + +public interface ICraftAchievement { + + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix); + +} diff --git a/src/main/java/vazkii/botania/common/achievement/IPickupAchievement.java b/src/main/java/vazkii/botania/common/achievement/IPickupAchievement.java new file mode 100644 index 000000000..8ceb64188 --- /dev/null +++ b/src/main/java/vazkii/botania/common/achievement/IPickupAchievement.java @@ -0,0 +1,22 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jan 28, 2015, 5:59:03 PM (GMT)] + */ +package vazkii.botania.common.achievement; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; + +public interface IPickupAchievement { + + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item); + +} diff --git a/src/main/java/vazkii/botania/common/achievement/ModAchievements.java b/src/main/java/vazkii/botania/common/achievement/ModAchievements.java index e9bd0c8e6..f8bf38635 100644 --- a/src/main/java/vazkii/botania/common/achievement/ModAchievements.java +++ b/src/main/java/vazkii/botania/common/achievement/ModAchievements.java @@ -10,9 +10,11 @@ */ package vazkii.botania.common.achievement; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.item.ItemStack; import net.minecraft.stats.Achievement; import net.minecraftforge.common.AchievementPage; +import net.minecraftforge.common.MinecraftForge; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.item.ModItems; import vazkii.botania.common.item.block.ItemBlockSpecialFlower; @@ -63,7 +65,7 @@ public final class ModAchievements { sparkCraft = new AchievementMod(LibAchievementNames.SPARK_CRAFT, 4, -5, ModItems.spark, manaPoolPickup); baubleWear = new AchievementMod(LibAchievementNames.BAUBLE_WEAR, 5, -3, ModItems.manaRing, manaPoolPickup); manaCookieEat = new AchievementMod(LibAchievementNames.MANA_COOKIE_EAT, 3, -7, ModItems.manaCookie, manaPoolPickup); - runePickup = new AchievementMod(LibAchievementNames.RUNE_PICKUP, 6, 0, ModBlocks.runeAltar, manaPoolPickup); + runePickup = new AchievementMod(LibAchievementNames.RUNE_PICKUP, 6, -1, ModBlocks.runeAltar, manaPoolPickup); dirtRodCraft = new AchievementMod(LibAchievementNames.DIRT_ROD_CRAFT, 8, 0, ModItems.dirtRod, runePickup); manaBlasterShoot = new AchievementMod(LibAchievementNames.MANA_BLASTER_SHOOT, 8, -2, ModItems.manaGun, runePickup); @@ -81,6 +83,8 @@ public final class ModAchievements { botaniaPage = new AchievementPage(LibMisc.MOD_NAME, AchievementMod.achievements.toArray(new Achievement[AchievementMod.achievements.size()])); AchievementPage.registerAchievementPage(botaniaPage); + + FMLCommonHandler.instance().bus().register(new AchievementTriggerer()); } } diff --git a/src/main/java/vazkii/botania/common/block/BlockAlfPortal.java b/src/main/java/vazkii/botania/common/block/BlockAlfPortal.java index 105807556..ae4c5e2b6 100644 --- a/src/main/java/vazkii/botania/common/block/BlockAlfPortal.java +++ b/src/main/java/vazkii/botania/common/block/BlockAlfPortal.java @@ -22,6 +22,7 @@ import vazkii.botania.api.lexicon.ILexiconable; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.wand.IWandable; import vazkii.botania.client.core.helper.IconHelper; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.tile.TileAlfPortal; import vazkii.botania.common.lexicon.LexiconData; import vazkii.botania.common.lib.LibBlockNames; @@ -62,7 +63,10 @@ public class BlockAlfPortal extends BlockModContainer implements IWandable, ILex @Override public boolean onUsedByWand(EntityPlayer player, ItemStack stack, World world, int x, int y, int z, int side) { - return ((TileAlfPortal) world.getTileEntity(x, y, z)).onWanded(); + boolean did = ((TileAlfPortal) world.getTileEntity(x, y, z)).onWanded(); + if(did) + player.addStat(ModAchievements.elfPortalOpen, 1); + return did; } @Override diff --git a/src/main/java/vazkii/botania/common/block/BlockModFlower.java b/src/main/java/vazkii/botania/common/block/BlockModFlower.java index 60fe748ec..c393e1361 100644 --- a/src/main/java/vazkii/botania/common/block/BlockModFlower.java +++ b/src/main/java/vazkii/botania/common/block/BlockModFlower.java @@ -17,10 +17,12 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockFlower; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.passive.EntitySheep; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.util.IIcon; import net.minecraft.world.World; import vazkii.botania.api.lexicon.ILexiconable; @@ -28,6 +30,8 @@ import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.client.lib.LibRenderIDs; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.IPickupAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.BotaniaCreativeTab; import vazkii.botania.common.core.handler.ConfigHandler; import vazkii.botania.common.item.block.ItemBlockWithMetadataAndName; @@ -37,7 +41,7 @@ import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockModFlower extends BlockFlower implements ILexiconable { +public class BlockModFlower extends BlockFlower implements ILexiconable, IPickupAchievement { public static IIcon[] icons; public static IIcon[] iconsAlt; @@ -122,4 +126,9 @@ public class BlockModFlower extends BlockFlower implements ILexiconable { public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) { return LexiconData.flowers; } + + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return ModAchievements.flowerPickup; + } } diff --git a/src/main/java/vazkii/botania/common/block/BlockSpecialFlower.java b/src/main/java/vazkii/botania/common/block/BlockSpecialFlower.java index 4325a8ccc..738b7a303 100644 --- a/src/main/java/vazkii/botania/common/block/BlockSpecialFlower.java +++ b/src/main/java/vazkii/botania/common/block/BlockSpecialFlower.java @@ -24,9 +24,11 @@ import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; @@ -39,6 +41,7 @@ import vazkii.botania.api.subtile.ISpecialFlower; import vazkii.botania.api.wand.IWandHUD; import vazkii.botania.api.wand.IWandable; import vazkii.botania.client.lib.LibRenderIDs; +import vazkii.botania.common.achievement.IPickupAchievement; import vazkii.botania.common.block.tile.TileSpecialFlower; import vazkii.botania.common.core.BotaniaCreativeTab; import vazkii.botania.common.item.block.ItemBlockSpecialFlower; diff --git a/src/main/java/vazkii/botania/common/block/decor/BlockTinyPotato.java b/src/main/java/vazkii/botania/common/block/decor/BlockTinyPotato.java index 9721e1c2e..30de16916 100644 --- a/src/main/java/vazkii/botania/common/block/decor/BlockTinyPotato.java +++ b/src/main/java/vazkii/botania/common/block/decor/BlockTinyPotato.java @@ -29,6 +29,7 @@ import net.minecraft.world.World; import vazkii.botania.api.lexicon.ILexiconable; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.client.lib.LibRenderIDs; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.BlockModContainer; import vazkii.botania.common.block.tile.TileTinyPotato; import vazkii.botania.common.item.block.ItemBlockMod; @@ -71,6 +72,7 @@ public class BlockTinyPotato extends BlockModContainer implements ILexiconable { TileEntity tile = par1World.getTileEntity(par2, par3, par4); if(tile instanceof TileTinyPotato) { ((TileTinyPotato) tile).jump(); + par5EntityPlayer.addStat(ModAchievements.tinyPotatoPet, 1); par1World.spawnParticle("heart", par2 + minX + Math.random() * (maxX - minX), par3 + maxY, par4 + minZ + Math.random() * (maxZ - minZ), 0, 0 ,0); } return true; diff --git a/src/main/java/vazkii/botania/common/block/mana/BlockPool.java b/src/main/java/vazkii/botania/common/block/mana/BlockPool.java index c63487408..224e7b792 100644 --- a/src/main/java/vazkii/botania/common/block/mana/BlockPool.java +++ b/src/main/java/vazkii/botania/common/block/mana/BlockPool.java @@ -24,6 +24,7 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; @@ -32,6 +33,8 @@ import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.wand.IWandHUD; import vazkii.botania.api.wand.IWandable; import vazkii.botania.client.lib.LibRenderIDs; +import vazkii.botania.common.achievement.IPickupAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.BlockModContainer; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.block.tile.mana.TilePool; @@ -40,7 +43,7 @@ import vazkii.botania.common.lexicon.LexiconData; import vazkii.botania.common.lib.LibBlockNames; import cpw.mods.fml.common.registry.GameRegistry; -public class BlockPool extends BlockModContainer implements IWandHUD, IWandable, ILexiconable { +public class BlockPool extends BlockModContainer implements IWandHUD, IWandable, ILexiconable, IPickupAchievement { boolean lastFragile = false; @@ -162,4 +165,9 @@ public class BlockPool extends BlockModContainer implements IWandHUD, IWandable, public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon) { return LexiconData.pool; } + + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return stack.getItemDamage() == 0 ? ModAchievements.manaPoolPickup : null; + } } diff --git a/src/main/java/vazkii/botania/common/entity/EntityDoppleganger.java b/src/main/java/vazkii/botania/common/entity/EntityDoppleganger.java index 0e8acf6e4..577ab7aa8 100644 --- a/src/main/java/vazkii/botania/common/entity/EntityDoppleganger.java +++ b/src/main/java/vazkii/botania/common/entity/EntityDoppleganger.java @@ -19,6 +19,7 @@ import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWatchClosest; @@ -51,6 +52,7 @@ import vazkii.botania.api.internal.ShaderCallback; import vazkii.botania.client.core.handler.BossBarHandler; import vazkii.botania.client.core.helper.ShaderHelper; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.core.helper.Vector3; import vazkii.botania.common.item.ModItems; @@ -251,6 +253,14 @@ public class EntityDoppleganger extends EntityCreature implements IBotaniaBossWi setAggroed(true); } } + + @Override + public void onDeath(DamageSource p_70645_1_) { + super.onDeath(p_70645_1_); + EntityLivingBase entitylivingbase = this.func_94060_bK(); + if(entitylivingbase instanceof EntityPlayer) + ((EntityPlayer) entitylivingbase).addStat(ModAchievements.gaiaGuardianKill, 1); + } @Override protected void applyEntityAttributes() { diff --git a/src/main/java/vazkii/botania/common/item/ItemLexicon.java b/src/main/java/vazkii/botania/common/item/ItemLexicon.java index 25e09ffdc..4b79cc2ea 100644 --- a/src/main/java/vazkii/botania/common/item/ItemLexicon.java +++ b/src/main/java/vazkii/botania/common/item/ItemLexicon.java @@ -35,6 +35,7 @@ import vazkii.botania.api.lexicon.KnowledgeType; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.recipe.IElvenItem; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.core.helper.MathHelper; import vazkii.botania.common.lib.LibGuiIDs; @@ -65,6 +66,7 @@ public class ItemLexicon extends ItemMod implements ILexicon, IElvenItem { if(entry != null && isKnowledgeUnlocked(par1ItemStack, entry.getKnowledgeType())) { Botania.proxy.setEntryToOpen(entry); par2EntityPlayer.openGui(Botania.instance, LibGuiIDs.LEXICON, par3World, 0, 0, 0); + par2EntityPlayer.addStat(ModAchievements.lexiconUse, 1); if(!par3World.isRemote) par3World.playSoundAtEntity(par2EntityPlayer, "botania:lexiconOpen", 0.5F, 1F); return true; @@ -134,6 +136,7 @@ public class ItemLexicon extends ItemMod implements ILexicon, IElvenItem { setForcedPage(par1ItemStack, ""); } + par3EntityPlayer.addStat(ModAchievements.lexiconUse, 1); par3EntityPlayer.openGui(Botania.instance, LibGuiIDs.LEXICON, par2World, 0, 0, 0); if(!par2World.isRemote && !skipSound) par2World.playSoundAtEntity(par3EntityPlayer, "botania:lexiconOpen", 0.5F, 1F); diff --git a/src/main/java/vazkii/botania/common/item/ItemManaCookie.java b/src/main/java/vazkii/botania/common/item/ItemManaCookie.java index de676bc12..48e69e863 100644 --- a/src/main/java/vazkii/botania/common/item/ItemManaCookie.java +++ b/src/main/java/vazkii/botania/common/item/ItemManaCookie.java @@ -11,12 +11,15 @@ package vazkii.botania.common.item; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; +import net.minecraft.world.World; import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.client.lib.LibResources; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.BotaniaCreativeTab; import vazkii.botania.common.lib.LibItemNames; import cpw.mods.fml.common.registry.GameRegistry; @@ -32,6 +35,12 @@ public class ItemManaCookie extends ItemFood { setUnlocalizedName(LibItemNames.MANA_COOKIE); } + @Override + protected void onFoodEaten(ItemStack p_77849_1_, World p_77849_2_, EntityPlayer p_77849_3_) { + super.onFoodEaten(p_77849_1_, p_77849_2_, p_77849_3_); + p_77849_3_.addStat(ModAchievements.manaCookieEat, 1); + } + @Override public Item setUnlocalizedName(String par1Str) { GameRegistry.registerItem(this, par1Str); diff --git a/src/main/java/vazkii/botania/common/item/ItemManaGun.java b/src/main/java/vazkii/botania/common/item/ItemManaGun.java index 3fb078be3..6eb4ccbd1 100644 --- a/src/main/java/vazkii/botania/common/item/ItemManaGun.java +++ b/src/main/java/vazkii/botania/common/item/ItemManaGun.java @@ -37,6 +37,7 @@ import vazkii.botania.client.core.handler.ClientTickHandler; import vazkii.botania.client.core.handler.ItemsRemainingRenderHandler; import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.crafting.recipe.ManaGunClipRecipe; import vazkii.botania.common.crafting.recipe.ManaGunLensRecipe; @@ -88,6 +89,7 @@ public class ItemManaGun extends ItemMod implements IManaUsingItem { if(burst != null && ManaItemHandler.requestManaExact(par1ItemStack, par3EntityPlayer, burst.getMana(), true)) { if(!par2World.isRemote) { par2World.playSoundAtEntity(par3EntityPlayer, "botania:manaBlaster", 0.6F, 1F); + par3EntityPlayer.addStat(ModAchievements.manaBlasterShoot, 1); par2World.spawnEntityInWorld(burst); } else { par3EntityPlayer.swingItem(); diff --git a/src/main/java/vazkii/botania/common/item/ItemSpark.java b/src/main/java/vazkii/botania/common/item/ItemSpark.java index a5561f66a..f0ad542fe 100644 --- a/src/main/java/vazkii/botania/common/item/ItemSpark.java +++ b/src/main/java/vazkii/botania/common/item/ItemSpark.java @@ -12,16 +12,20 @@ package vazkii.botania.common.item; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; import vazkii.botania.api.mana.spark.ISparkAttachable; import vazkii.botania.client.core.helper.IconHelper; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.entity.EntitySpark; import vazkii.botania.common.lib.LibItemNames; -public class ItemSpark extends ItemMod { +public class ItemSpark extends ItemMod implements ICraftAchievement { public static IIcon invIcon, worldIcon; @@ -60,4 +64,9 @@ public class ItemSpark extends ItemMod { return invIcon; } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return ModAchievements.sparkCraft; + } + } diff --git a/src/main/java/vazkii/botania/common/item/ItemSpawnerMover.java b/src/main/java/vazkii/botania/common/item/ItemSpawnerMover.java index 3078c34ee..c4fe41760 100644 --- a/src/main/java/vazkii/botania/common/item/ItemSpawnerMover.java +++ b/src/main/java/vazkii/botania/common/item/ItemSpawnerMover.java @@ -25,6 +25,7 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.lib.LibItemNames; public class ItemSpawnerMover extends ItemMod { @@ -168,6 +169,7 @@ public class ItemSpawnerMover extends ItemMod { if(placeBlockAt(itemstack, player, world, x, y, z, side, xOffset, yOffset, zOffset, meta)) { world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, block.stepSound.func_150496_b(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F); player.renderBrokenItemStack(itemstack); + player.addStat(ModAchievements.spawnerMoverUse, 1); for(int i = 0; i < 100; i++) Botania.proxy.sparkleFX(world, x + Math.random(), y + Math.random(), z + Math.random(), (float) Math.random(), (float) Math.random(), (float) Math.random(), 0.45F + 0.2F * (float) Math.random(), 6); diff --git a/src/main/java/vazkii/botania/common/item/ItemThornChakram.java b/src/main/java/vazkii/botania/common/item/ItemThornChakram.java index 69092055e..55fb74e1d 100644 --- a/src/main/java/vazkii/botania/common/item/ItemThornChakram.java +++ b/src/main/java/vazkii/botania/common/item/ItemThornChakram.java @@ -10,12 +10,16 @@ */ package vazkii.botania.common.item; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.world.World; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.entity.EntityThornChakram; import vazkii.botania.common.lib.LibItemNames; -public class ItemThornChakram extends ItemMod { +public class ItemThornChakram extends ItemMod implements ICraftAchievement { public ItemThornChakram() { setUnlocalizedName(LibItemNames.THORN_CHAKRAM); @@ -34,4 +38,9 @@ public class ItemThornChakram extends ItemMod { return p_77659_1_; } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return ModAchievements.terrasteelWeaponCraft; + } + } diff --git a/src/main/java/vazkii/botania/common/item/block/ItemBlockElven.java b/src/main/java/vazkii/botania/common/item/block/ItemBlockElven.java index cf1bed2e4..8fad997dd 100644 --- a/src/main/java/vazkii/botania/common/item/block/ItemBlockElven.java +++ b/src/main/java/vazkii/botania/common/item/block/ItemBlockElven.java @@ -25,6 +25,4 @@ public class ItemBlockElven extends ItemBlockMod implements IElvenItem { return ((IElvenItem) field_150939_a).isElvenItem(stack); } - - } diff --git a/src/main/java/vazkii/botania/common/item/block/ItemBlockMod.java b/src/main/java/vazkii/botania/common/item/block/ItemBlockMod.java index 19e5173b4..a3491afb0 100644 --- a/src/main/java/vazkii/botania/common/item/block/ItemBlockMod.java +++ b/src/main/java/vazkii/botania/common/item/block/ItemBlockMod.java @@ -11,11 +11,17 @@ package vazkii.botania.common.item.block; import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import vazkii.botania.client.lib.LibResources; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.IPickupAchievement; -public class ItemBlockMod extends ItemBlock { +public class ItemBlockMod extends ItemBlock implements IPickupAchievement, ICraftAchievement { public ItemBlockMod(Block block) { super(block); @@ -30,4 +36,14 @@ public class ItemBlockMod extends ItemBlock { return super.getUnlocalizedNameInefficiently(stack); } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return field_150939_a instanceof ICraftAchievement ? ((ICraftAchievement) field_150939_a).getAchievementOnCraft(stack, player, matrix) : null; + } + + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return field_150939_a instanceof IPickupAchievement ? ((IPickupAchievement) field_150939_a).getAchievementOnPickup(stack, player, item) : null; + } + } diff --git a/src/main/java/vazkii/botania/common/item/block/ItemBlockSpecialFlower.java b/src/main/java/vazkii/botania/common/item/block/ItemBlockSpecialFlower.java index 5b11d7d2d..ca0948e09 100644 --- a/src/main/java/vazkii/botania/common/item/block/ItemBlockSpecialFlower.java +++ b/src/main/java/vazkii/botania/common/item/block/ItemBlockSpecialFlower.java @@ -13,8 +13,10 @@ package vazkii.botania.common.item.block; import java.util.List; import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; @@ -23,10 +25,12 @@ import net.minecraft.world.World; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.IRecipeKeyProvider; import vazkii.botania.api.subtile.SubTileEntity; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.ModBlocks; import vazkii.botania.common.block.tile.TileSpecialFlower; import vazkii.botania.common.core.handler.ConfigHandler; import vazkii.botania.common.core.helper.ItemNBTHelper; +import vazkii.botania.common.lib.LibBlockNames; public class ItemBlockSpecialFlower extends ItemBlockMod implements IRecipeKeyProvider { @@ -101,4 +105,16 @@ public class ItemBlockSpecialFlower extends ItemBlockMod implements IRecipeKeyPr return getType(stack); } + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + switch(getType(stack)) { + case LibBlockNames.SUBTILE_DAYBLOOM : return ModAchievements.daybloomPickup; + case LibBlockNames.SUBTILE_ENDOFLAME : return ModAchievements.endoflamePickup; + case LibBlockNames.SUBTILE_KEKIMURUS : return ModAchievements.kekimurusPickup; + case LibBlockNames.SUBTILE_HEISEI_DREAM : return ModAchievements.heiseiDreamPickup; + default : return null; + } + } + } + diff --git a/src/main/java/vazkii/botania/common/item/block/ItemBlockWithMetadataAndName.java b/src/main/java/vazkii/botania/common/item/block/ItemBlockWithMetadataAndName.java index fe233e254..1cf5c90eb 100644 --- a/src/main/java/vazkii/botania/common/item/block/ItemBlockWithMetadataAndName.java +++ b/src/main/java/vazkii/botania/common/item/block/ItemBlockWithMetadataAndName.java @@ -11,11 +11,17 @@ package vazkii.botania.common.item.block; import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlockWithMetadata; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import vazkii.botania.client.lib.LibResources; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.IPickupAchievement; -public class ItemBlockWithMetadataAndName extends ItemBlockWithMetadata { +public class ItemBlockWithMetadataAndName extends ItemBlockWithMetadata implements IPickupAchievement, ICraftAchievement { public ItemBlockWithMetadataAndName(Block par2Block) { super(par2Block, par2Block); @@ -31,4 +37,14 @@ public class ItemBlockWithMetadataAndName extends ItemBlockWithMetadata { return super.getUnlocalizedName(par1ItemStack) + par1ItemStack.getItemDamage(); } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return field_150939_a instanceof ICraftAchievement ? ((ICraftAchievement) field_150939_a).getAchievementOnCraft(stack, player, matrix) : null; + } + + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return field_150939_a instanceof IPickupAchievement ? ((IPickupAchievement) field_150939_a).getAchievementOnPickup(stack, player, item) : null; + } + } diff --git a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemBauble.java b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemBauble.java index fbd102979..0ec396b26 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemBauble.java +++ b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemBauble.java @@ -18,6 +18,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.item.ItemMod; import baubles.api.BaubleType; @@ -109,6 +110,9 @@ public abstract class ItemBauble extends ItemMod implements IBauble { if(!player.worldObj.isRemote) player.worldObj.playSoundAtEntity(player, "botania:equipBauble", 0.1F, 1.3F); + if(player instanceof EntityPlayer) + ((EntityPlayer) player).addStat(ModAchievements.baubleWear, 1); + onEquippedOrLoadedIntoWorld(stack, player); setLastPlayerHashcode(stack, player.hashCode()); } diff --git a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java index 0f3dd78d3..569d3842c 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java +++ b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java @@ -21,8 +21,10 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; @@ -39,16 +41,19 @@ import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.client.core.helper.ShaderHelper; import vazkii.botania.client.lib.LibResources; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.lib.LibItemNames; import baubles.api.BaubleType; import baubles.common.lib.PlayerHandler; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.discovery.ModCandidate; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaubleRender { +public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaubleRender, ICraftAchievement { private static ResourceLocation textureHalo = new ResourceLocation(LibResources.MISC_HALO); @@ -325,5 +330,10 @@ public class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaub GL11.glShadeModel(GL11.GL_FLAT); } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return stack.getItemDamage() == 1 ? ModAchievements.tiaraWings : null; + } + } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/ItemTerraSword.java b/src/main/java/vazkii/botania/common/item/equipment/tool/ItemTerraSword.java index a5feae03a..2d82f826e 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/ItemTerraSword.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/ItemTerraSword.java @@ -16,10 +16,12 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.server.MinecraftServer; +import net.minecraft.stats.Achievement; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MovingObjectPosition; @@ -28,13 +30,15 @@ import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.internal.IManaBurst; import vazkii.botania.api.mana.BurstProperties; import vazkii.botania.api.mana.ILensEffect; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.entity.EntityManaBurst; import vazkii.botania.common.item.ModItems; import vazkii.botania.common.item.equipment.tool.manasteel.ItemManasteelSword; import vazkii.botania.common.lib.LibItemNames; -public class ItemTerraSword extends ItemManasteelSword implements ILensEffect { +public class ItemTerraSword extends ItemManasteelSword implements ILensEffect, ICraftAchievement { private static final String TAG_ATTACKER_USERNAME = "attackerUsername"; @@ -125,4 +129,9 @@ public class ItemTerraSword extends ItemManasteelSword implements ILensEffect { return par2ItemStack.getItem() == ModItems.manaResource && par2ItemStack.getItemDamage() == 4 ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return ModAchievements.terrasteelWeaponCraft; + } + } diff --git a/src/main/java/vazkii/botania/common/item/material/ItemManaResource.java b/src/main/java/vazkii/botania/common/item/material/ItemManaResource.java index 0891622a7..fd1a61ed8 100644 --- a/src/main/java/vazkii/botania/common/item/material/ItemManaResource.java +++ b/src/main/java/vazkii/botania/common/item/material/ItemManaResource.java @@ -15,21 +15,25 @@ import java.util.List; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.util.IIcon; import net.minecraft.world.World; import vazkii.botania.api.recipe.IElvenItem; import vazkii.botania.api.recipe.IFlowerComponent; import vazkii.botania.client.core.helper.IconHelper; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.IPickupAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.entity.EntityDoppleganger; import vazkii.botania.common.item.ItemMod; import vazkii.botania.common.lib.LibItemNames; -public class ItemManaResource extends ItemMod implements IFlowerComponent, IElvenItem { +public class ItemManaResource extends ItemMod implements IFlowerComponent, IElvenItem, IPickupAchievement { final int types = 14; IIcon[] icons; @@ -101,4 +105,9 @@ public class ItemManaResource extends ItemMod implements IFlowerComponent, IElve public ItemStack getContainerItem(ItemStack itemStack) { return itemStack.getItemDamage() == 11 ? itemStack.copy() : null; } + + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return stack.getItemDamage() == 4 ? ModAchievements.terrasteelPickup : null; + } } diff --git a/src/main/java/vazkii/botania/common/item/material/ItemRune.java b/src/main/java/vazkii/botania/common/item/material/ItemRune.java index 206ef6fc9..e678f3676 100644 --- a/src/main/java/vazkii/botania/common/item/material/ItemRune.java +++ b/src/main/java/vazkii/botania/common/item/material/ItemRune.java @@ -14,16 +14,21 @@ import java.util.List; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.util.IIcon; import vazkii.botania.api.recipe.IFlowerComponent; import vazkii.botania.client.core.helper.IconHelper; +import vazkii.botania.common.achievement.IPickupAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.item.ItemMod; import vazkii.botania.common.lib.LibItemNames; -public class ItemRune extends ItemMod implements IFlowerComponent { +public class ItemRune extends ItemMod implements IFlowerComponent, IPickupAchievement { IIcon[] icons; @@ -70,4 +75,9 @@ public class ItemRune extends ItemMod implements IFlowerComponent { return 0xA8A8A8; } + @Override + public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item) { + return ModAchievements.runePickup; + } + } diff --git a/src/main/java/vazkii/botania/common/item/rod/ItemDirtRod.java b/src/main/java/vazkii/botania/common/item/rod/ItemDirtRod.java index d3a718340..e69ab76e7 100644 --- a/src/main/java/vazkii/botania/common/item/rod/ItemDirtRod.java +++ b/src/main/java/vazkii/botania/common/item/rod/ItemDirtRod.java @@ -14,17 +14,21 @@ import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import vazkii.botania.api.mana.IManaUsingItem; import vazkii.botania.api.mana.ManaItemHandler; import vazkii.botania.common.Botania; +import vazkii.botania.common.achievement.ICraftAchievement; +import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.item.ItemMod; import vazkii.botania.common.lib.LibItemNames; -public class ItemDirtRod extends ItemMod implements IManaUsingItem { +public class ItemDirtRod extends ItemMod implements IManaUsingItem, ICraftAchievement { static final int COST = 75; @@ -73,4 +77,9 @@ public class ItemDirtRod extends ItemMod implements IManaUsingItem { return true; } + @Override + public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix) { + return ModAchievements.dirtRodCraft; + } + } \ No newline at end of file diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index a5002e2c6..8327ba0ef 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -274,6 +274,48 @@ entity.Botania.botania:thrownItem.name=Thrown Item entity.Botania.botania:magicMissile.name=Magic Missile entity.Botania.botania:thornChakram.name=Thorn Chakram +# ACHIEVEMENT NAMES + DESC +achievement.botania:flowerPickup=Sky of Beginning +achievement.botania:flowerPickup.desc=Pick up a Mystical Flower from the world +achievement.botania:lexiconUse=Outer Science +achievement.botania:lexiconUse.desc=Open a Lexica Botania and have a look through the index +achievement.botania:daybloomPickup=Daybreak Arrival +achievement.botania:daybloomPickup.desc=Make a Daybloom in a Petal Apothecary +achievement.botania:manaPoolPickup=Vivid Wave +achievement.botania:manaPoolPickup.desc=Upgrade a Diluted Mana Pool to a normal one +achievement.botania:endoflamePickup=Meltdown +achievement.botania:endoflamePickup.desc=Create an Endoflame to boost Mana production +achievement.botania:tinyPotatoPet=Just Be Friends +achievement.botania:tinyPotatoPet.desc=Make a Tiny Potato and pet it +achievement.botania:sparkCraft=Live Drive +achievement.botania:sparkCraft.desc=Make a Spark to help transfer Mana around +achievement.botania:baubleWear=Inner Arts +achievement.botania:baubleWear.desc=Craft any variety of Bauble and wear it +achievement.botania:manaCookieEat=Rotten Heresy and Chocolate +achievement.botania:manaCookieEat.desc=Infuse and eat a delicions Mana Cookie +achievement.botania:runePickup=Lilium Dolls +achievement.botania:runePickup.desc=Use a Runic Altar to create a Rune +achievement.botania:manaBlasterShoot=M'aider Stranded Girl +achievement.botania:manaBlasterShoot.desc=Craft and fire a Mana Blaster +achievement.botania:tiaraWings=Heart Shooter +achievement.botania:tiaraWings.desc=Craft and addorn a Flügel Tiara with Flügel Wings +achievement.botania:terrasteelPickup=Dancer in the Dark +achievement.botania:terrasteelPickup.desc=Conjure a Terrasteel Ingot using a Terrestrial Agglomeration Plate +achievement.botania:elfPortalOpen=World Calling +achievement.botania:elfPortalOpen.desc=Open a portal to the realm of Alfheim +achievement.botania:gaiaGuardianKill=Dead and Seek +achievement.botania:gaiaGuardianKill.desc=Summon and slay a Gaia Guardian for a Ritual of Gaia +achievement.botania:terrasteelWeaponCraft=Remote Paranoia +achievement.botania:terrasteelWeaponCraft.desc=Arm yourself with a weapon made of Terrasteel +achievement.botania:kekimurusPickup=After-School Stride +achievement.botania:kekimurusPickup.desc=Create a Kekimurus to help produce large quantities of Mana +achievement.botania:heiseiDreamPickup=Heisei Cataclysm +achievement.botania:heiseiDreamPickup.desc=Create a Heisei Dream to cause havoc on mobs +achievement.botania:dirtRodCraft=Rockbell +achievement.botania:dirtRodCraft.desc=Craft a dirty sti- er... Rod of the Lands +achievement.botania:spawnerMoverUse=I can take off my (redacted) +achievement.botania:spawnerMoverUse.desc=Use a Life Aggregator to transport a Monster Spawner + # BLOCK NAMES tile.botania:flower0.name=Mystical White Flower tile.botania:flower1.name=Mystical Orange Flower