From 1bee56adf3438627049de0b5acc7e0956378f7b2 Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Mon, 4 Mar 2013 13:03:15 -0800 Subject: [PATCH 1/4] Die, build.number. You don't need to be tracked. --- thaumicbees_res/build.number | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 thaumicbees_res/build.number diff --git a/thaumicbees_res/build.number b/thaumicbees_res/build.number deleted file mode 100644 index 39900b6..0000000 --- a/thaumicbees_res/build.number +++ /dev/null @@ -1,3 +0,0 @@ -#Build Number for ANT. Do not edit! -#Sat Feb 09 14:11:48 PST 2013 -build.number=114 From e92d9c131e1890e241a2cf2439ac0b6869dd8420 Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Mon, 4 Mar 2013 13:04:21 -0800 Subject: [PATCH 2/4] Merge from master. --- thaumicbees_res/build.xml | 2 +- thaumicbees_res/changelog.txt | 52 +++++ .../gfx/thaumicbees/items/items.png | Bin 62011 -> 65999 bytes .../gfx/thaumicbees/items/liquids.png | Bin 2537 -> 54061 bytes .../lang/thaumicbees/en_US.properties | 1 - thaumicbees_res/lang/thaumicbees/en_US.xml | 192 +++++++++++++++++ .../research/thaumicbees/research.xml | 32 ++- .../utils/GenericInventory.java | 199 ++++++++++++++++++ .../utils/GenericOwnedInventory.java | 71 +++++++ thaumicbees_src/thaumicbees/bees/Allele.java | 18 +- .../thaumicbees/bees/AlleleEffect.java | 9 +- .../bees/AlleleEffectAuraNodeGrow.java | 16 +- .../thaumicbees/bees/AlleleEffectCure.java | 2 +- .../thaumicbees/bees/AlleleEffectPotion.java | 4 +- .../bees/AlleleEffectSpawnMob.java | 4 +- .../bees/AlleleEffectSpawnWisp.java | 6 +- .../thaumicbees/bees/BeeClassification.java | 34 +-- .../thaumicbees/bees/BeeSpecies.java | 94 +++++---- .../bees/FlowerProviderAuraNode.java | 4 +- .../bees/FlowerProviderAuraNodeFlux.java | 6 +- .../bees/FlowerProviderAuraNodePurify.java | 10 +- .../bees/FlowerProviderBookshelf.java | 4 +- .../bees/FlowerProviderThaumcraftFlower.java | 21 +- .../thaumicbees/block/BlockMagicApiary.java | 39 +++- .../thaumicbees/block/BlockPlanks.java | 54 +++++ .../thaumicbees/block/BlockWoodSlab.java | 68 ++++++ .../LogicMagicApiary.java} | 181 ++++++++-------- .../block/TileEntityMagicApiary.java | 97 +++++++++ .../thaumicbees/item/ItemCapsule.java | 5 +- .../thaumicbees/item/ItemComb.java | 8 +- .../thaumicbees/item/ItemDrop.java | 10 +- .../thaumicbees/item/ItemMagicHiveFrame.java | 46 +++- .../thaumicbees/item/ItemMiscResources.java | 8 +- .../thaumicbees/item/ItemPollen.java | 10 +- .../thaumicbees/item/ItemPropolis.java | 8 +- .../thaumicbees/item/ItemSolidFlux.java | 5 +- .../thaumicbees/item/ItemThaumiumGrafter.java | 89 ++++++++ .../thaumicbees/item/ItemThaumiumScoop.java | 81 +++++++ thaumicbees_src/thaumicbees/item/ItemWax.java | 8 +- .../thaumicbees/item/types/CapsuleType.java | 13 +- .../thaumicbees/item/types/CombType.java | 32 +-- .../thaumicbees/item/types/DropType.java | 14 +- .../thaumicbees/item/types/HiveFrameType.java | 29 ++- .../thaumicbees/item/types/LiquidType.java | 49 +++-- .../thaumicbees/item/types/PlankType.java | 45 ++++ .../thaumicbees/item/types/PollenType.java | 13 +- .../thaumicbees/item/types/PropolisType.java | 22 +- .../thaumicbees/item/types/ResourceType.java | 17 +- .../thaumicbees/item/types/WaxType.java | 12 +- .../thaumicbees/main/CommonProxy.java | 1 + thaumicbees_src/thaumicbees/main/Config.java | 86 ++++++-- .../thaumicbees/main/ThaumicBees.java | 7 +- .../utils}/CompatabilityManager.java | 71 +++++-- .../main/utils/CraftingManager.java | 135 +++++++++--- .../main/utils/LocalizationManager.java | 38 ++++ .../thaumicbees/main/utils/MoonPhase.java | 28 ++- .../utils}/compat/ForestryHelper.java | 44 +++- .../ShapelessBeeInfusionCraftingRecipe.java | 2 +- .../utils}/compat/ThaumcraftHelper.java | 11 +- 59 files changed, 1756 insertions(+), 411 deletions(-) delete mode 100644 thaumicbees_res/lang/thaumicbees/en_US.properties create mode 100644 thaumicbees_res/lang/thaumicbees/en_US.xml create mode 100644 thaumicbees_src/net/mysteriousages/utils/GenericInventory.java create mode 100644 thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java create mode 100644 thaumicbees_src/thaumicbees/block/BlockPlanks.java create mode 100644 thaumicbees_src/thaumicbees/block/BlockWoodSlab.java rename thaumicbees_src/thaumicbees/{tile/TileEntityMagicApiary.java => block/LogicMagicApiary.java} (52%) create mode 100644 thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java create mode 100644 thaumicbees_src/thaumicbees/item/ItemThaumiumGrafter.java create mode 100644 thaumicbees_src/thaumicbees/item/ItemThaumiumScoop.java create mode 100644 thaumicbees_src/thaumicbees/item/types/PlankType.java rename thaumicbees_src/thaumicbees/{compat => main/utils}/CompatabilityManager.java (89%) create mode 100644 thaumicbees_src/thaumicbees/main/utils/LocalizationManager.java rename thaumicbees_src/thaumicbees/{ => main/utils}/compat/ForestryHelper.java (59%) rename thaumicbees_src/thaumicbees/{ => main/utils}/compat/ShapelessBeeInfusionCraftingRecipe.java (99%) rename thaumicbees_src/thaumicbees/{ => main/utils}/compat/ThaumcraftHelper.java (95%) diff --git a/thaumicbees_res/build.xml b/thaumicbees_res/build.xml index 81b1627..2689bc4 100644 --- a/thaumicbees_res/build.xml +++ b/thaumicbees_res/build.xml @@ -17,7 +17,7 @@ - + diff --git a/thaumicbees_res/changelog.txt b/thaumicbees_res/changelog.txt index 983ff4c..b4022ef 100644 --- a/thaumicbees_res/changelog.txt +++ b/thaumicbees_res/changelog.txt @@ -1,3 +1,55 @@ +1.4.2 +Added Void Capsules - hold up to 8 buckets of liquid with one! It's a waterproof bag of holding! +Fix: Added Greatwood & Silverwood slabs to the ore dictionary so they should work as normal. + +1.4.1 +Added Greatwood and Silverwood planks. Since Greatwood and Silverwood are tougher than other trees, you'll need some extra machinery. To obtain these, jam a log of the appropriate tree into a Forestry carpenter and provide a half bucket of water. +Added slabs for the new planks also. + +1.4.0a +Fixed some issues with the Node bee's effect. + +1.4.0 +New branch of bees containing 3 new species. A new type of frame! +Thaumaturge's Backpack now require Amber rather than Gold Nuggets. +Due to popular complaint, the Bees & Magic node now requires Unified Thaumic Field Theory to unlock. +Moving all kinds of string contstants out of code into Localization files. +Also fixed crazy aspects showing up on things that shouldn't have those aspects. + +1.3.0d +Fixed an issue with mutations requiring a non-specific type of node to fail. + +1.3.0c +Discovered a function call that will crash dedicated servers. If you are running ThuamicBees on a server, please update to this revision. + +1.3.0b +Fixed a problem with capsules not being registered with the Forge Liquid Dictionary. You should be able to use them just about everywhere, now. +Fixed the issue with certain items appearing twice in Creative Mode tabs. + +1.3.0a +Some bug fixes, including uncommenting some mutation-related code, research tweaking. +Added the last bee for a long while, probably. Good luck getting it. + +Common TB crashes stemming from Forestry issues should now be reported a little better, especially the backpack registration & item texture file related things. Errors should appear in your log, so make sure you read the log before you report the error here. It could be something silly on your end that is causing the crash. + +1.3.0 +3 new species of bee: Vis, Pure, and Flux! Each requires an aura node nearby, and may have some side-effects... +New Thaumcraft research! Open up your Thaumanomicon to see it. +New Apiary Frames! They run off magic, confers bees with bonuses, and may have an impact outside of your apiary... + +1.2.705B - Replaced 1.2.705 +Fixed issue with bad Mutation class, allowing pure bees to turn into any bee that involves them in a mutation. +Also ACTUALLY fixed issue with Extra Bees loading after ThaumicBees on *nix-based systems. + +1.2.705 +*Stealth update: Fixed an issue with TB loading before Extra Bees, resulting in some Null Pointers getting passed and choked on. If you get this issue, please re-download 1.2.705. No other changes were made in this version. + +*8 new species of bees, including "Praecantatio", which, like the other Elemental bees, may contain Vis shards in its propolis. Some of the new species may also have extra evil involved, so be ready for anything. +*Extra integration with Extra Bees! Mutations for some of the new bees. If Extra Bees is present, their mutations will require EB species rather than the base Forestry species. +*Changed the "Charmed" mutation to avoid conflicting with Extra Bees. (Binnie already had one there, so mine got moved.) +*New bee branch, similar to Extra Bees's mob spawning bees. +*One new bee from a new branch, the rest of which will come once Azanor releases the Thaumcraft API. + 1.1.702-67 - Replaced 1.1.702-62 Additional Magic Capsules, featuring ExtraBees liquids, and RailCraft Creosote & Steam. (Yes, steam capsules. It's magic. That's how. :P) Tagged additional Forestry items with Thaumcraft aspects. diff --git a/thaumicbees_res/gfx/thaumicbees/items/items.png b/thaumicbees_res/gfx/thaumicbees/items/items.png index c9916a379d82f003bae78301bfba986310429db9..796cd17513b0108b5677074fa28238fd9e2a17c9 100644 GIT binary patch delta 33642 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�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 SNM;cI?~cC7%?dro7ylP4-zD<^ delta 29738 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�!-ZjT26 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 diff --git a/thaumicbees_res/lang/thaumicbees/en_US.properties b/thaumicbees_res/lang/thaumicbees/en_US.properties deleted file mode 100644 index bd14f84..0000000 --- a/thaumicbees_res/lang/thaumicbees/en_US.properties +++ /dev/null @@ -1 +0,0 @@ -storage.backpack.Thaumaturge=Thaumaturge's Backpack \ No newline at end of file diff --git a/thaumicbees_res/lang/thaumicbees/en_US.xml b/thaumicbees_res/lang/thaumicbees/en_US.xml new file mode 100644 index 0000000..8287645 --- /dev/null +++ b/thaumicbees_res/lang/thaumicbees/en_US.xml @@ -0,0 +1,192 @@ + + + + + Handful of Jelly Babies + Thaumium Scoop + Thaumium Grafter + + + Greatwood Planks + Greatwood Slab + Silverwood Planks + Silverwood Slab + Magic Apiary + + + Occult Comb + Otherworldy Comb + Papery Comb + Stark Comb + Airy Comb + Firey Comb + Watery Comb + Earthy Comb + Infused Comb + Memory Comb + Furtive Comb + + + Magic Wax + + + Enchanting Drop + Intellect Drop + + + Unusual Pollen + Phased Pollen + + + Dull Propolis + Breezey Propolis + Burning Propolis + Flowing Propolis + Stony Propolis + Infused Propolis + + + Lore Fragment + Aromatic Lump + Concentrated Compound + Crystalized %s Aspect + + + Magic Frame + Resilient Frame + Gentle Frame + Metabolic Frame + Necrotic Frame + Temporal Frame + + + Magic Capsule + Void Capsule + + + Empty + Water + Lava + Biomass + Empty + Oil + Fuel + Seed Oil + Honey + Juice + Ice + Milk + Acid + Poison + Liquid Nitrogen + Liquid DNA + Creosote Oil + Steam + + + Full Moon + Waning Gibbous + Waxing Gibbous + Waning Half + Waxing Half + Waning Crescent + Waxing Crescent + New Moon + + + Thaumaturge's Backpack + + + Esoteric + An unusual crossbreed which seems to have magical properties.|Apinomicon + Mysterious + These bees have been to the end of the world and back, and their power has grown.|Apinomicon + Arcane + "Their produce is charged with magic."|Azanor, Master Thaumaturge + Charmed + Your first experiments in Thaumaturgical Apiculture have yielded fruit. Buzzing fruit.|Apinomicon + Enchanted + Successive generations of Charmed bees have reinforced their connection to the unknown.|Apinomicon + Supernatural + These bees walk the line between this world and the unseen.|Apinomicon + Pupil + "What does that bee want with my paper?!|Yorae, Librarian + Scholarly + "I can't be sure, but I think they might be smarter than me..."|Yorae, Librarian + Savant + lim(x^(i / pi)/ log(e * 7 - ln(32/x^-pi))). Solve for honey.|Note found on Yorae's desk + Stark + "These are unusually attracted to shards. This warrents further investigation."|Azanor, Master Thaumaturge + Aura + "They work so fast it's breathtaking."|Sengir, Mad Apiarist + Ignis + Caution: Contents of hive extremely hot.|Warning label on Azanor's apiary + Aqua + "I tried to breed them once, but that was a wash."|MysteriousAges, Apprentice Thaumaturge + Solum + "You're really gonna dig these bees, but watch out - they bore quite easily."|MysteriousAges, Apprentice Comedian + Praecantatio + Beekeeping is magic!|Apinomicon, Preface + Aware + "They can see into your soul!"|Florastar, Expert Beekeeper + Vis + "They can feel changes in the aura, but are not yet able to affect it."|Azanor, research notes + Pure + "It's like a bee janitor!"|MysteriousAges, Thaumaturge + Flux + "I thought they would help clean up, but it only makes things worse!"|Kreicus, Apprentice Thaumaturge + Node + Having undergone a freak mutation, these bees now attract magic to them.|Apinomicon + Skulking + These bees have become xenophobic and bad-tempered. Use caution.|Apinomicon + Brainy + Their combs may be fetid and foul-smelling, but their intelligence is well-developed.|Apinomicon + Gossamer + As they work, they seem to fade out from light for brief moments.|Apinomicon + Wispy + Their language is garbled and unintelligible. It is probable they are speaking to unnatural beings.|Apinomicon + Batty + They tend to attract bats to their hives through means unknown.|Apinomicon + Ghastly + "*sigh*... Really, Myst?"|Taveria + Timely + "An apiarist is never late. He arrives precicely when he means to!"|Sengir, Mad Apiarist + Lordly + They live in peace, within the sight of the Eye of Harmony|Tattered Remains of ancient Apinomicon + Doctoral + "Would you like a Jelly Baby?"|Passing stranger with a great scarf and a blue box + + + Cleansing + Mining + Swiftness + Time Warp + Aura Attract + Brainy + Batty + Wispy + Ghastly + Books + Magic Flowers + Node + Purify Node + Fluxify Node + + + Arcane + + Supernatural + + Scholarly + + Thaumic + + Skulking + + Vis + + Time + + + + \ No newline at end of file diff --git a/thaumicbees_res/research/thaumicbees/research.xml b/thaumicbees_res/research/thaumicbees/research.xml index d3692ca..6f58a9c 100644 --- a/thaumicbees_res/research/thaumicbees/research.xml +++ b/thaumicbees_res/research/thaumicbees/research.xml @@ -99,8 +99,38 @@ Like the Magic Frame, this frame consumes aura to maintain its enchantments. Thi You have been seeking a way to significantly extend bee life. It should be possible by adding a frame enchanted with the essence of time to the hive. Keeping bees has been frustrating, as the insects' short lives requires you to manually intervene far too often. -A new variation of your frame design, this version involving some Time magic, should help extend their lives significantly. +A new variation of your frame design, this version involving some Time magic, should help extend their lives significantly. Like the Magic frame, this one too requires aura to run, and will produce flux now and again. FRAMETIME + +Void Capsule +Another Dimension of Liquid Storage +It seems reasonable that if you can shift blocks and other matter into an alternate dimension temporarily, you should be able to do something similar with liquids. +These new capsules can hold the equivalent of 8 buckets' worth of liquid by syphoning off a large quantity into a pocket dimension temporarily. + +Like other capsules, they are fragile and are typically single-use. They have proven popular for long-term storage. +VOIDCAPSULE + + + +Thaumium Scoop +Stronger, Faster, Bee-ter +It is possible to improve the durability of the scoop by creating them out of sterner materials. While you're at it, it may be helpful to enable them to be enchanted with restorative magics. +This improved scoop is more durable than the plain one your non-magical beekeeping friends are liable to use. It is good for three times as long as the average scoop at the cost of using some thaumium instead. + +Because the thaumium present in its construction, it is possible to enchant the scoop with a Repairing spell in the usual manner. +THAUMIUMSCOOP + + + +Thaumium Grafter +The Treesnipper +This improved grafter is more durable than the plain one your non-magical arborist acquaintances tend to use in their exploits. It should be possible to allow them to be enchanted with repairing magic to make them last indefinitely. +Adding Thaumium to your grafter design has increased its durability significantly - up to two times longer than regular grafters. + +It is also possible to enchant them with the Repair enchant, given sufficient experience. +THAUMIUMGRAFTER + + \ No newline at end of file diff --git a/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java b/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java new file mode 100644 index 0000000..0c0cb3d --- /dev/null +++ b/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java @@ -0,0 +1,199 @@ +package net.mysteriousages.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +/** + * Provides some common functionality for Inventory clusters. Performs bounds-checking on slot args. + * + * @author MysteriousAges + * + */ +public class GenericInventory implements IInventory +{ + private ItemStack[] inventory; + private String name; + private int stackLimit; + + public GenericInventory(String inventoryName, int slotCount) + { + this(inventoryName, slotCount, 64); + } + + public GenericInventory(String inventoryName, int slotCount, int maxStackSize) + { + this.inventory = new ItemStack[slotCount]; + this.name = inventoryName; + this.stackLimit = maxStackSize; + } + + @Override + public int getSizeInventory() + { + return this.inventory.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + ItemStack result = null; + + if (this.slotNumberValid(slot)) + { + result = this.inventory[slot]; + } + + return result; + } + + @Override + public ItemStack decrStackSize(int slot, int count) + { + ItemStack result = null; + + if (this.slotNumberValid(slot)) + { + if (this.inventory[slot] != null) + { + result = this.inventory[slot].splitStack(Math.min(count, this.inventory[slot].stackSize)); + if (this.inventory[slot].stackSize <= 0) + { + this.inventory[slot] = null; + } + } + } + + return result; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + return this.getStackInSlot(slot); + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + if (this.slotNumberValid(slot)) + { + this.inventory[slot] = itemStack; + } + } + + @Override + public String getInvName() + { + return this.name; + } + + @Override + public int getInventoryStackLimit() + { + return this.stackLimit; + } + + public ItemStack[] getInventory() + { + return this.inventory; + } + + @Override + public void onInventoryChanged() { } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + /** + * Accepts an ItemStack and attempts to merge it with a similar item stack or an empty slot. + * @param stack + * @return Any leftover items, or null if the merge completed successfully. + */ + public ItemStack attemptStackMerge(ItemStack stack) + { + for (int i = 0; i < this.inventory.length; ++i) + { + if (this.inventory[i] == null) + { + this.inventory[i] = stack; + stack = null; + break; + } + else if (this.inventory[i].isItemEqual(stack)) + { + int freeSlots = stack.getItem().getItemStackLimit() - this.inventory[i].stackSize; + + this.inventory[i].stackSize += freeSlots; + stack.stackSize -= freeSlots; + } + + if (stack.stackSize <= 0) + { + stack = null; + break; + } + } + + return stack; + } + + public void writeToNBT(NBTTagCompound tag) + { + tag.setString("Name", this.name); + tag.setInteger("Size", this.inventory.length); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < this.inventory.length; ++i) + { + NBTTagCompound itemTag = new NBTTagCompound(); + itemTag.setByte("Slot", (byte)i); + this.inventory[i].writeToNBT(itemTag); + itemList.appendTag(itemTag); + } + + tag.setTag("Items", itemList); + } + + public void readFromNBT(NBTTagCompound tag) + { + this.name = tag.getString("Name"); + NBTTagList itemList = tag.getTagList("Items"); + int length = tag.getInteger("Size"); + this.inventory = new ItemStack[length]; + + for (int i = 0; i < itemList.tagCount(); ++i) + { + NBTTagCompound item = (NBTTagCompound)itemList.tagAt(i); + int slotId = item.getByte("Slot"); + if (slotId >= 0 && slotId < this.inventory.length) + { + this.inventory[slotId] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + /** + * Checks to see if the given slot number is valid with the inventory size + * @param slot + * @return True, if slot in [0, inventory size) + */ + protected boolean slotNumberValid(int slot) + { + return slot >= 0 && slot < this.inventory.length; + } + + @Override + public void openChest() { } + + @Override + public void closeChest() { } + + +} diff --git a/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java b/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java new file mode 100644 index 0000000..042d2f6 --- /dev/null +++ b/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java @@ -0,0 +1,71 @@ +package net.mysteriousages.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Provides basic functionality for an owned inventory. + * @author MysteriousAges + * + */ +public class GenericOwnedInventory extends GenericInventory +{ + private String ownerName; + private boolean isPublic; + + public GenericOwnedInventory(EntityPlayer player, String inventoryName, int slotCount) + { + super(inventoryName, slotCount); + this.setInfo(player); + } + + public GenericOwnedInventory(EntityPlayer player, String inventoryName, int slotCount, int maxStackSize) + { + super(inventoryName, slotCount, maxStackSize); + this.setInfo(player); + } + + private void setInfo(EntityPlayer player) + { + this.ownerName = player.username; + } + + public void setPubliclyAccessible(boolean flag) + { + this.isPublic = flag; + } + + public String getOwnerName() + { + return this.ownerName; + } + + public boolean isPubliclyAccessible() + { + return this.isPublic; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return this.isPublic || this.ownerName.equalsIgnoreCase(player.username); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setString("Owner", this.ownerName); + tag.setBoolean("PublicFlag", this.isPublic); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.ownerName = tag.getString("Owner"); + this.isPublic = tag.getBoolean("PublicFlag"); + } + + +} diff --git a/thaumicbees_src/thaumicbees/bees/Allele.java b/thaumicbees_src/thaumicbees/bees/Allele.java index 4f98c65..61fb3f5 100644 --- a/thaumicbees_src/thaumicbees/bees/Allele.java +++ b/thaumicbees_src/thaumicbees/bees/Allele.java @@ -1,7 +1,7 @@ package thaumicbees.bees; import net.minecraft.potion.Potion; -import thaumicbees.compat.ThaumcraftHelper; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import forestry.api.apiculture.IAlleleBeeSpecies; import forestry.api.genetics.AlleleManager; import forestry.api.genetics.IAllele; @@ -37,22 +37,22 @@ public class Allele implements IAllele Allele.flowerNodeFluxify = new AlleleFlower("flowerAuraNodeFlux", new FlowerProviderAuraNodeFlux(), false); Allele.cleansingEffect = new AlleleEffectCure("effectCurative", false); - Allele.digSpeed = new AlleleEffectPotion("effectDigSpeed", "Mining", Potion.digSpeed, 7, false); - Allele.moveSpeed = new AlleleEffectPotion("effectMoveSpeed", "Swiftness", Potion.moveSpeed, 5, false); - Allele.slowSpeed = new AlleleEffectPotion("effectSlowSpeed", "Time Warp", Potion.moveSlowdown, 3, false); + Allele.digSpeed = new AlleleEffectPotion("effectDigSpeed", Potion.digSpeed, 7, false); + Allele.moveSpeed = new AlleleEffectPotion("effectMoveSpeed", Potion.moveSpeed, 5, false); + Allele.slowSpeed = new AlleleEffectPotion("effectSlowSpeed", Potion.moveSlowdown, 3, false); - Allele.nodeGen = new AlleleEffectAuraNodeGrow("effectNodeGeneration", "Nodeify", false, 400); + Allele.nodeGen = new AlleleEffectAuraNodeGrow("effectNodeGeneration", false, 400); - Allele.spawnBrainyZombie = new AlleleEffectSpawnMob("effectBrainy", false, "Brainy", ThaumcraftHelper.Entity.BRAINY_ZOMBIE.entityID); + Allele.spawnBrainyZombie = new AlleleEffectSpawnMob("effectBrainy", false, ThaumcraftHelper.Entity.BRAINY_ZOMBIE.entityID); Allele.spawnBrainyZombie.setAggrosPlayerOnSpawn().setThrottle(800).setSpawnsOnPlayerNear(null).setMaxMobsInSpawnZone(2); - Allele.spawnBats = new AlleleEffectSpawnMob("effectBatty", false, "Batty", ThaumcraftHelper.Entity.FIREBAT.entityID); + Allele.spawnBats = new AlleleEffectSpawnMob("effectBatty", false, ThaumcraftHelper.Entity.FIREBAT.entityID); Allele.spawnBats.setThrottle(300).setSpawnsOnPlayerNear("Bat"); - Allele.spawnWisp = new AlleleEffectSpawnWisp("effectWispy", false, "Wispy", ThaumcraftHelper.Entity.WISP.entityID); + Allele.spawnWisp = new AlleleEffectSpawnWisp("effectWispy", false, ThaumcraftHelper.Entity.WISP.entityID); Allele.spawnWisp.setThrottle(1800); - Allele.spawnGhast = new AlleleEffectSpawnMob("Ghast", false, "Ghastly", "Ghast"); + Allele.spawnGhast = new AlleleEffectSpawnMob("Ghast", false, "Ghast"); Allele.spawnGhast.setThrottle(2000).setChanceToSpawn(20).setMaxMobsInSpawnZone(1); } diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffect.java b/thaumicbees_src/thaumicbees/bees/AlleleEffect.java index 79fc660..1ae6634 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffect.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffect.java @@ -2,11 +2,14 @@ package thaumicbees.bees; import java.util.List; +import cpw.mods.fml.common.registry.LanguageRegistry; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import thaumicbees.main.ThaumicBees; +import thaumicbees.main.utils.LocalizationManager; import forestry.api.apiculture.IAlleleBeeEffect; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; @@ -14,12 +17,10 @@ import forestry.api.genetics.IEffectData; public abstract class AlleleEffect extends Allele implements IAlleleBeeEffect { - protected String readableName; - public AlleleEffect(String id, boolean isDominant, String identifier) + public AlleleEffect(String id, boolean isDominant) { super(id, isDominant); - this.readableName = identifier; } @Override @@ -34,7 +35,7 @@ public abstract class AlleleEffect extends Allele implements IAlleleBeeEffect @Override public String getIdentifier() { - return this.readableName; + return LocalizationManager.getLocalizedString(getUID()); } @Override diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java index dcf3b0e..ef6af74 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java @@ -16,9 +16,9 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect private int throttle; - public AlleleEffectAuraNodeGrow(String id, String identifier, boolean isDominant, int timeout) + public AlleleEffectAuraNodeGrow(String id, boolean isDominant, int timeout) { - super(id, isDominant, identifier); + super(id, isDominant); this.throttle = timeout; } @@ -39,7 +39,7 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect if (value >= throttle) { World w = housing.getWorld(); - if (w.rand.nextInt(15) < 1) + if (w.rand.nextInt(10) < 1) { float x = housing.getXCoord(); float y = housing.getYCoord(); @@ -48,7 +48,7 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect if (nodeId != -1) { AuraNode node = ThaumcraftApi.getNodeCopy(nodeId); - if (node.level >= node.baseLevel * 3 / 4) + if (node.level >= node.baseLevel * 4 / 5) { x = (float)(x - node.xPos); y = (float)(y - node.yPos); @@ -59,11 +59,11 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect y = y / distance; z = z / distance; - x *= 0.0125f; - y *= 0.0125f; - z *= 0.0125f; + x *= 0.05f; + y *= 0.05f; + z *= 0.05f; - ThaumcraftApi.queueNodeChanges(nodeId, node.baseLevel * -3 / 10, w.rand.nextInt(1), false, null, x, y, z); + ThaumcraftApi.queueNodeChanges(nodeId, node.baseLevel * -1 / 13, w.rand.nextInt(2), false, null, x, y, z); } } } diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java index f7a160e..eceb67a 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java @@ -21,7 +21,7 @@ public class AlleleEffectCure extends AlleleEffect public AlleleEffectCure(String id, boolean isDominant) { - super(id, isDominant, "Cleansing"); + super(id, isDominant); } @Override diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java index cdf9f54..a6c9b81 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java @@ -18,9 +18,9 @@ public class AlleleEffectPotion extends AlleleEffect private int potionId; private int duration; - public AlleleEffectPotion(String name, String readableName, Potion potionApplied, int effectDuration, boolean isDominant) + public AlleleEffectPotion(String name, Potion potionApplied, int effectDuration, boolean isDominant) { - super("effect" + name, isDominant, readableName); + super("effect" + name, isDominant); this.potionId = potionApplied.id; this.duration = 20 * effectDuration; } diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java index c0799c1..3a574a0 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java @@ -25,9 +25,9 @@ public class AlleleEffectSpawnMob extends AlleleEffect protected int chanceToSpawn; protected int maxMobsInArea; - public AlleleEffectSpawnMob(String id, boolean isDominant, String identifier, String mobToSpawn) + public AlleleEffectSpawnMob(String id, boolean isDominant, String mobToSpawn) { - super(id, isDominant, identifier); + super(id, isDominant); this.aggosOnPlayer = false; this.mobName = mobToSpawn; this.throttle = 200; diff --git a/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java index 41689cd..bc8efb0 100644 --- a/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java @@ -3,8 +3,8 @@ package thaumicbees.bees; import java.lang.reflect.Field; import cpw.mods.fml.common.FMLLog; -import thaumicbees.compat.ThaumcraftHelper; import thaumicbees.item.ItemArmorApiarist; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; import net.minecraft.entity.EntityList; @@ -18,9 +18,9 @@ public class AlleleEffectSpawnWisp extends AlleleEffectSpawnMob private byte[] wispTypes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 }; - public AlleleEffectSpawnWisp(String id, boolean isDominant, String identifier, String mobToSpawn) + public AlleleEffectSpawnWisp(String id, boolean isDominant, String mobToSpawn) { - super(id, isDominant, identifier, mobToSpawn); + super(id, isDominant, mobToSpawn); } @Override diff --git a/thaumicbees_src/thaumicbees/bees/BeeClassification.java b/thaumicbees_src/thaumicbees/bees/BeeClassification.java index 23b093e..f8af328 100644 --- a/thaumicbees_src/thaumicbees/bees/BeeClassification.java +++ b/thaumicbees_src/thaumicbees/bees/BeeClassification.java @@ -2,36 +2,36 @@ package thaumicbees.bees; import java.util.ArrayList; +import thaumicbees.main.utils.LocalizationManager; + +import cpw.mods.fml.common.registry.LanguageRegistry; + import forestry.api.genetics.AlleleManager; import forestry.api.genetics.IAlleleSpecies; import forestry.api.genetics.IClassification; public enum BeeClassification implements IClassification { - ARCANE("Arcane", "Arcanus", ""), - SUPERNATURAL("Supernatural", "Coeleste", ""), - SCHOLARLY("Scholarly", "Docto", ""), - THAUMIC("Thaumic", "Thaumis", ""), - SKULKING("Skulking", "Malevolens", ""), - VIS("Vis", "Patabilis", ""), - TIME("Time", "Sempiternus", ""), + ARCANE("Arcane", "Arcanus"), + SUPERNATURAL("Supernatural", ""), + SCHOLARLY("Scholarly", ""), + THAUMIC("Thaumic", ""), + SKULKING("Skulking", ""), + VIS("Vis", ""), + TIME("Time", ""), ; private String uID; - private String name; - private String scientific; - private String description; + private String latin; private ArrayList species; private IClassification parent; private EnumClassLevel level; - private BeeClassification(String name, String latin, String desc) + private BeeClassification(String name, String scientific) { this.uID = "classification." + name.toLowerCase(); - this.name = name; - this.scientific = latin; + this.latin = scientific; this.level = EnumClassLevel.GENUS; - this.description = desc; this.species = new ArrayList(); this.parent = AlleleManager.alleleRegistry.getClassification("family.apidae"); AlleleManager.alleleRegistry.registerClassification(this); @@ -52,19 +52,19 @@ public enum BeeClassification implements IClassification @Override public String getName() { - return this.name; + return LocalizationManager.getLocalizedString(getUID()); } @Override public String getScientific() { - return this.scientific; + return this.latin; } @Override public String getDescription() { - return this.description; + return LocalizationManager.getLocalizedString(getUID() + ".description"); } @Override diff --git a/thaumicbees_src/thaumicbees/bees/BeeSpecies.java b/thaumicbees_src/thaumicbees/bees/BeeSpecies.java index 972d6d6..7b71522 100644 --- a/thaumicbees_src/thaumicbees/bees/BeeSpecies.java +++ b/thaumicbees_src/thaumicbees/bees/BeeSpecies.java @@ -9,13 +9,16 @@ import forestry.api.genetics.IClassification.EnumClassLevel; import java.util.HashMap; -import thaumicbees.compat.ForestryHelper; -import thaumicbees.compat.ThaumcraftHelper; +import cpw.mods.fml.common.registry.LanguageRegistry; + import thaumicbees.item.types.CombType; import thaumicbees.item.types.DropType; import thaumicbees.item.types.PollenType; import thaumicbees.item.types.ResourceType; import thaumicbees.main.Config; +import thaumicbees.main.utils.LocalizationManager; +import thaumicbees.main.utils.compat.ForestryHelper; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -25,63 +28,63 @@ import net.minecraft.world.World; public enum BeeSpecies implements IAlleleBeeSpecies { - ESOTERIC("Esoteric", "An unusual crossbreed which seems to have magical properties.|Apinomicon", "secretiore", + ESOTERIC("Esoteric", "secretiore", BeeClassification.ARCANE, 0x001099, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - MYSTERIOUS("Mysterious", "These bees have been to the end of the world and back, and their power has grown.|Apinomicon", "mysticus", + MYSTERIOUS("Mysterious", "mysticus", BeeClassification.ARCANE, 0x762bc2, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - ARCANE("Arcane", "\"Their produce is charged with magic.\"|Azanor, Master Thaumaturge", "arcanus", + ARCANE("Arcane", "arcanus", BeeClassification.ARCANE, 0xd242df, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), - CHARMED("Charmed", "Your first experiments in Thaumaturgical Apiculture have yielded fruit. Buzzing fruit.|Apinomicon", "larvatus", + CHARMED("Charmed", "larvatus", BeeClassification.SUPERNATURAL, 0x48EEEC, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - ENCHANTED("Enchanted", "Successive generations of Charmed bees have reinforced their connection to the unknown.|Apinomicon", "cantatus", + ENCHANTED("Enchanted", "cantatus", BeeClassification.SUPERNATURAL, 0x18e726, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - SUPERNATURAL("Supernatural", "These bees walk the line between this world and the unseen.|Apinomicon", "coeleste", + SUPERNATURAL("Supernatural", "coeleste", BeeClassification.SUPERNATURAL, 0x005614, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), - PUPIL("Pupil", "\"What does that bee want with my paper?!|Yorae, Librarian", "disciplina", + PUPIL("Pupil", "disciplina", BeeClassification.SCHOLARLY, 0xFFFF00, EnumTemperature.NORMAL, EnumHumidity.ARID, false, true), - SCHOLARLY("Scholarly", "\"I can't be sure, but I think they might be smarter than me...\"|Yorae, Librarian", "studiosis", + SCHOLARLY("Scholarly", "studiosis", BeeClassification.SCHOLARLY, 0x6E0000, EnumTemperature.NORMAL, EnumHumidity.ARID, false, false), - SAVANT("Savant", "lim(x^(i / pi)/ log(e * 7 - ln(32/x^-pi))). Solve for honey.|Note found on Yorae's desk", "philologus", + SAVANT("Savant", "philologus", BeeClassification.SCHOLARLY, 0x6E1C6D, EnumTemperature.NORMAL, EnumHumidity.ARID, true, false), - STARK("Stark", "\"These are unusually attracted to shards. This warrents further investigation.\"|Azanor, Master Thaumaturge", "torridae", + STARK("Stark", "torridae", BeeClassification.THAUMIC, 0xCCCCCC, 0x999999, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), - AIR("Aura", "\"They work so fast it's breathtaking.\"|Sengir, Mad Apiarist", "ventosa", + AIR("Aura", "ventosa", BeeClassification.THAUMIC, 0xD9D636, 0xA19E10, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), - FIRE("Ignis", "Caution: Contents of hive extremely hot.|Warning label on Azanor's apiary", "praefervidus", + FIRE("Ignis", "praefervidus", BeeClassification.THAUMIC, 0xE50B0B, 0x95132F, EnumTemperature.HOT, EnumHumidity.ARID, true, true), - WATER("Aqua", "\"I tried to breed them once, but that was a wash.\"|MysteriousAges, Apprentice Thaumaturge", "umidus", + WATER("Aqua", "umidus", BeeClassification.THAUMIC, 0x36CFD9, 0x1054A1, EnumTemperature.NORMAL, EnumHumidity.DAMP, true, true), - EARTH("Solum", "\"You're really gonna dig these bees, but watch out - they bore quite easily.\"|MysteriousAges, Apprentice Comedian", "sordida", + EARTH("Solum", "sordida", BeeClassification.THAUMIC, 0x005100, 0x00a000, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), - INFUSED("Praecantatio", "Beekeeping is magic!|Apinomicon, Preface", "azanorius", + INFUSED("Praecantatio", "azanorius", BeeClassification.THAUMIC, 0xaa32fc, 0x7A489E, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), - AWARE("Aware", "\"They can see into your soul!\"|Florastar, Expert Beekeeper", "sensibilis", + AWARE("Aware", "sensibilis", BeeClassification.VIS, 0xb0092e9, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), - VIS("Vis", "\"They can feel changes in the aura, but are not yet able to affect it.\"|Azanor, research notes", "arcanus saecula", + VIS("Vis", "arcanus saecula", BeeClassification.VIS, 0x004c99, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), - PURE("Pure", "\"It's like a bee janitor!\"|MysteriousAges, Thaumaturge", "arcanus puritatem", + PURE("Pure", "arcanus puritatem", BeeClassification.VIS, 0xb0092e9, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), - FLUX("Flux", "\"I thought they would help clean up, but it only makes things worse!\"|Kreicus, Apprentice Thaumaturge", "arcanus labe", + FLUX("Flux", "arcanus labe", BeeClassification.VIS, 0x004c99, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), - NODE("Node", "Having undergone a freak mutation, these bees now attract magic to them.|Apinomicon", "conficiens", + NODE("Node", "conficiens", BeeClassification.VIS, 0xFFF266, 0xFF8CE9, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), - SKULKING("Skulking", "These bees have become xenophobic and bad-tempered. Use caution.|Apinomicon", "malevolens", + SKULKING("Skulking", "malevolens", BeeClassification.SKULKING, 0x524827, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - BRAINY("Brainy", "Their combs may be fetid and foul-smelling, but their intelligence is well-developed.|Apinomicon", "cerebrum", + BRAINY("Brainy", "cerebrum", BeeClassification.SKULKING, 0x83FF70, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - GOSSAMER("Gossamer", "As they work, they seem to fade out from light for brief moments.|Apinomicon", "perlucidus", + GOSSAMER("Gossamer", "perlucidus", BeeClassification.SKULKING, 0x183f66, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - WISPY("Wispy", "Their language is garbled and unintelligible. It is probable they are speaking to unnatural beings.|Apinomicon", "umbrabilis", + WISPY("Wispy", "umbrabilis", BeeClassification.SKULKING, 0x9cb8d5, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), - BATTY("Batty", "They tend to attract bats to their hives through means unknown.|Apinomicon", "chiroptera", + BATTY("Batty", "chiroptera", BeeClassification.SKULKING, 0x27350d, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false,true), - GHASTLY("Ghastly", "\"*sigh*... Really, Myst?\"|Taveria", "pallens", + GHASTLY("Ghastly", "pallens", BeeClassification.SKULKING, 0xccccee, 0xbf877c, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), - TIMELY("Timely", "\"An apiarist is never late. He arrives precicely when he means to!\"|Sengir, Mad Apiarist", "gallifreis", + TIMELY("Timely", "gallifreis", BeeClassification.TIME, 0xC6AF86, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), - LORDLY("Lordly", "", "rassilonis", + LORDLY("Lordly", "rassilonis", BeeClassification.TIME, 0xC6AF86, 0x8E0213, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), - DOCTORAL("Doctoral", "\"Would you like a Jelly Baby?\"", "medicus qui", + DOCTORAL("Doctoral", "medicus qui", BeeClassification.TIME, 0xDDE5FC, 0x4B6E8C, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), ; @@ -180,19 +183,22 @@ public enum BeeSpecies implements IAlleleBeeSpecies .setGenome(BeeGenomeManager.getTemplateGhastly()) .register(); TIMELY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.DRIPPING.ordinal()), 25) + .addProduct(Config.pollen.getStackForType(PollenType.PHASED), 10) .setGenome(BeeGenomeManager.getTemplateTimely()) .register(); - LORDLY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 30) + LORDLY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 5) + .addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.DRIPPING.ordinal()), 25) + .addProduct(Config.pollen.getStackForType(PollenType.PHASED), 15) .setGenome(BeeGenomeManager.getTemplateLordly()) .register(); - DOCTORAL.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 35) - .addSpecialty(new ItemStack(Config.jellyBaby), 5) + DOCTORAL.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 10) + .addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.DRIPPING.ordinal()), 25) + .addProduct(Config.pollen.getStackForType(PollenType.PHASED), 19) + .addSpecialty(new ItemStack(Config.jellyBaby), 7) .setGenome(BeeGenomeManager.getTemplateDoctoral()) .register(); } - private String name; - private String descripton; private String binomial; private String authority; private int bodyType; @@ -210,23 +216,21 @@ public enum BeeSpecies implements IAlleleBeeSpecies private String uid; private boolean dominant; - private BeeSpecies(String speciesName, String speciesDescription, String genusName, IClassification classification, int firstColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesDominant) + private BeeSpecies(String speciesName, String genusName, IClassification classification, int firstColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesDominant) { - this(speciesName, speciesDescription, genusName, classification, 0, firstColour, 0xFF6E0D, preferredTemp, preferredHumidity, hasGlowEffect, true, true, isSpeciesDominant); + this(speciesName, genusName, classification, 0, firstColour, 0xFF6E0D, preferredTemp, preferredHumidity, hasGlowEffect, true, true, isSpeciesDominant); } - private BeeSpecies(String speciesName, String speciesDescription, String genusName, IClassification classification, int firstColour, int secondColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesDominant) + private BeeSpecies(String speciesName, String genusName, IClassification classification, int firstColour, int secondColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesDominant) { - this(speciesName, speciesDescription, genusName, classification, 0, firstColour, secondColour, preferredTemp, preferredHumidity, hasGlowEffect, true, true, isSpeciesDominant); + this(speciesName, genusName, classification, 0, firstColour, secondColour, preferredTemp, preferredHumidity, hasGlowEffect, true, true, isSpeciesDominant); } - private BeeSpecies(String speciesName, String speciesDescription, String genusName, IClassification classification, int body, int firstColour, int secondColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesSecret, boolean isSpeciesCounted, boolean isSpeciesDominant) + private BeeSpecies(String speciesName, String genusName, IClassification classification, int body, int firstColour, int secondColour, EnumTemperature preferredTemp, EnumHumidity preferredHumidity, boolean hasGlowEffect, boolean isSpeciesSecret, boolean isSpeciesCounted, boolean isSpeciesDominant) { this.uid = "thaumicbees.species" + speciesName; this.dominant = isSpeciesDominant; AlleleManager.alleleRegistry.registerAllele(this); - name = speciesName; - descripton = speciesDescription; binomial = genusName; authority = "MysteriousAges"; bodyType = body; @@ -273,12 +277,12 @@ public enum BeeSpecies implements IAlleleBeeSpecies public String getName() { - return name; + return LocalizationManager.getLocalizedString(getUID()); } public String getDescription() { - return descripton; + return LocalizationManager.getLocalizedString(getUID() + ".description"); } public int getBodyType() diff --git a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java index b2530fc..58b51ae 100644 --- a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java @@ -1,8 +1,10 @@ package thaumicbees.bees; +import cpw.mods.fml.common.registry.LanguageRegistry; import thaumcraft.api.AuraNode; import thaumcraft.api.ThaumcraftApi; import thaumicbees.main.Config; +import thaumicbees.main.utils.LocalizationManager; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -44,7 +46,7 @@ public class FlowerProviderAuraNode implements IFlowerProvider @Override public String getDescription() { - return "Node"; + return LocalizationManager.getLocalizedString("tb.bees.flower.node"); } @Override diff --git a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java index cc4c106..cf7acfe 100644 --- a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java @@ -1,8 +1,10 @@ package thaumicbees.bees; +import cpw.mods.fml.common.registry.LanguageRegistry; import thaumcraft.api.EnumTag; import thaumcraft.api.ObjectTags; import thaumcraft.api.ThaumcraftApi; +import thaumicbees.main.utils.LocalizationManager; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import forestry.api.apiculture.IBeeGenome; @@ -14,7 +16,7 @@ public class FlowerProviderAuraNodeFlux extends FlowerProviderAuraNode @Override public ItemStack[] affectProducts(World world, IBeeGenome genome, int x, int y, int z, ItemStack[] products) { - if (world.rand.nextInt(10) < 1) + if (world.rand.nextInt(20) < 1) { EnumTag tag; do @@ -37,6 +39,6 @@ public class FlowerProviderAuraNodeFlux extends FlowerProviderAuraNode @Override public String getDescription() { - return "Node Flux"; + return LocalizationManager.getLocalizedString("tb.bees.flower.nodeFlux"); } } diff --git a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java index 64027fd..a27d901 100644 --- a/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java @@ -1,5 +1,6 @@ package thaumicbees.bees; +import cpw.mods.fml.common.registry.LanguageRegistry; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -8,6 +9,7 @@ import thaumcraft.api.EnumTag; import thaumcraft.api.ObjectTags; import thaumcraft.api.ThaumcraftApi; import thaumicbees.main.Config; +import thaumicbees.main.utils.LocalizationManager; import forestry.api.apiculture.IBeeGenome; public class FlowerProviderAuraNodePurify extends FlowerProviderAuraNode @@ -21,16 +23,16 @@ public class FlowerProviderAuraNodePurify extends FlowerProviderAuraNode @Override public String getDescription() { - return "Node Purify"; + return LocalizationManager.getLocalizedString("tb.bees.flower.nodePure"); } @Override public ItemStack[] affectProducts(World world, IBeeGenome genome, int x, int y, int z, ItemStack[] products) { - if (world.rand.nextInt(10) < 1) + if (world.rand.nextInt(25) < 1) { AuraNode node = this.getNodeWithinRange(world, x, y, z); - if (node != null) + if (node != null && (1.0 * node.level) / node.baseLevel > 0.75) { int aspectCount = node.flux.tags.size(); if (aspectCount > 0) @@ -39,7 +41,7 @@ public class FlowerProviderAuraNodePurify extends FlowerProviderAuraNode if (selectedTag != null) { node.flux.remove(selectedTag, 1); - ThaumcraftApi.queueNodeChanges(node.key, 0, 0, false, new ObjectTags().add(selectedTag, -1), 0, 0, 0); + ThaumcraftApi.queueNodeChanges(node.key, node.baseLevel / -16, 0, false, new ObjectTags().add(selectedTag, -1), 0, 0, 0); products = addItemToProducts(products, new ItemStack(Config.solidFlux, 1, selectedTag.id)); } } diff --git a/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java index 3734104..594c676 100644 --- a/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java @@ -1,5 +1,7 @@ package thaumicbees.bees; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -46,6 +48,6 @@ public class FlowerProviderBookshelf implements IFlowerProvider public String getDescription() { - return "Books"; + return LocalizationManager.getLocalizedString("tb.bees.flower.book"); } } diff --git a/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java index 9e3789b..65e7dc9 100644 --- a/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java @@ -1,6 +1,9 @@ package thaumicbees.bees; +import cpw.mods.fml.common.registry.LanguageRegistry; import thaumicbees.main.Config; +import thaumicbees.main.utils.LocalizationManager; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -32,12 +35,18 @@ public class FlowerProviderThaumcraftFlower implements IFlowerProvider { boolean flag = false; int blockDown = world.getBlockId(x, y - 1, z); - if (world.isAirBlock(x, y, z) && (blockDown == Block.dirt.blockID || blockDown == Block.grass.blockID)) + if (world.isAirBlock(x, y, z)) { - int rand = world.rand.nextInt(10); - world.setBlockAndMetadataWithNotify(x, y, z, Config.tcPlant.blockID, (rand >= 5) ? 2 : 3); - System.out.println(x + ", " + y + ", " + ", " + z + " set to flower."); - flag = true; + if (blockDown == Block.dirt.blockID || blockDown == Block.grass.blockID) + { + world.setBlockAndMetadataWithNotify(x, y, z, Config.tcPlant.blockID, ThaumcraftHelper.BlockPlant.SHIMMERLEAF.ordinal()); + flag = true; + } + else if (blockDown == Block.sand.blockID) + { + world.setBlockAndMetadataWithNotify(x, y, z, Config.tcPlant.blockID, ThaumcraftHelper.BlockPlant.CINDERPEARL.ordinal()); + flag = true; + } } return flag; } @@ -45,7 +54,7 @@ public class FlowerProviderThaumcraftFlower implements IFlowerProvider @Override public String getDescription() { - return "Magic Flowers"; + return LocalizationManager.getLocalizedString("tb.bees.flower.magic"); } @Override diff --git a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java index f03677c..02a23ef 100644 --- a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java +++ b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java @@ -3,9 +3,10 @@ package thaumicbees.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import thaumicbees.main.CommonProxy; -import thaumicbees.tile.TileEntityMagicApiary; -import net.minecraft.block.BlockContainer; +import thaumicbees.block.TileEntityMagicApiary; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLiving; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; @@ -16,41 +17,57 @@ import forestry.api.apiculture.IBeeHousing; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; -public class BlockMagicApiary extends BlockContainer +public class BlockMagicApiary extends Block { public BlockMagicApiary(int par1) { super(par1, Material.wood); this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); this.setBlockName("Magic Apiary"); - this.blockIndexInTexture = 48; + this.blockIndexInTexture = 50; + this.setHardness(2f); + this.setResistance(5f); } @Override @SideOnly(Side.CLIENT) public int getBlockTexture(IBlockAccess worldAccess, int x, int y, int z, int side) { - int texture = 48; - if (side == 0 || side == 1) + int texture = 50; + if (side == 0) { - texture = 50; + texture = 51; + } + else if (side == 1) + { + TileEntityMagicApiary tileInfo = (TileEntityMagicApiary)worldAccess.getBlockTileEntity(x, y, z); + if (tileInfo != null && tileInfo.isMaster()) + { + texture = 52; + } + else + { + texture = 51; + } } return texture; } public int getBlockTextureFromSideAndMetadata(int side, int meta) { - int texture = 48; + int texture = 50; if (side == 0 || side == 1) { - texture = 50; + texture = 51; } return texture; } @Override - public TileEntity createNewTileEntity(World var1) + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entity) { - return new TileEntityMagicApiary(); + super.onBlockPlacedBy(world, x, y, z, entity); + + // Validate block arrangement } } diff --git a/thaumicbees_src/thaumicbees/block/BlockPlanks.java b/thaumicbees_src/thaumicbees/block/BlockPlanks.java new file mode 100644 index 0000000..a24feee --- /dev/null +++ b/thaumicbees_src/thaumicbees/block/BlockPlanks.java @@ -0,0 +1,54 @@ +package thaumicbees.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import thaumicbees.item.types.PlankType; +import thaumicbees.main.CommonProxy; +import net.minecraft.block.Block; +import net.minecraft.block.BlockWood; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; + +public class BlockPlanks extends Block +{ + public BlockPlanks(int id) + { + super(id, Material.wood); + this.setHardness(2.5f); + this.setResistance(6.0f); + this.setBlockName("tb.planks"); + this.setCreativeTab(CreativeTabs.tabBlock); + this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + Block.setBurnProperties(id, 5, 20); + } + + @Override + public int getBlockTextureFromSideAndMetadata(int side, int meta) + { + int tx = 256; + if (PlankType.getType(meta) != null) + { + tx = PlankType.getType(meta).textureIdx; + } + return tx; + } + + @Override + public int damageDropped(int meta) + { + return meta; + } + + @SideOnly(Side.CLIENT) + @Override + public void getSubBlocks(int id, CreativeTabs tab, List itemsList) + { + for (PlankType type : PlankType.values()) + { + itemsList.add(new ItemStack(this, 1, type.ordinal())); + } + } +} diff --git a/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java b/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java new file mode 100644 index 0000000..85bfdd8 --- /dev/null +++ b/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java @@ -0,0 +1,68 @@ +package thaumicbees.block; + +import java.util.List; +import java.util.Random; + +import thaumicbees.item.types.PlankType; +import thaumicbees.main.CommonProxy; +import thaumicbees.main.Config; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockHalfSlab; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; + +public class BlockWoodSlab extends BlockHalfSlab +{ + + public BlockWoodSlab(int id, boolean doubleSlab) + { + super(id, doubleSlab, Material.wood); + this.setHardness(2.5f); + this.setResistance(6.0f); + this.setBlockName("tb.slab.wood"); + this.setCreativeTab(CreativeTabs.tabBlock); + this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + this.setLightOpacity(doubleSlab ? 255 : 0); + Block.setBurnProperties(id, 5, 20); + } + + @Override + public int getBlockTextureFromSideAndMetadata(int side, int meta) + { + int tx = 256; + if (PlankType.getType(meta & 7) != null) + { + tx = PlankType.getType(meta & 7).textureIdx; + } + return tx; + } + + public int idDropped(int id, Random rand, int par3) + { + return Config.slabWoodHalf.blockID; + } + + protected ItemStack createStackedBlock(int meta) + { + return new ItemStack(Config.slabWoodHalf.blockID, 2, meta & 7); + } + + @Override + public String getFullSlabName(int meta) + { + return this.getBlockName() + "." + PlankType.getType(meta).name; + } + + @SideOnly(Side.CLIENT) + @Override + public void getSubBlocks(int id, CreativeTabs tab, List itemsList) + { + for (PlankType type : PlankType.values()) + { + itemsList.add(new ItemStack(this, 1, type.ordinal())); + } + } +} diff --git a/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java b/thaumicbees_src/thaumicbees/block/LogicMagicApiary.java similarity index 52% rename from thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java rename to thaumicbees_src/thaumicbees/block/LogicMagicApiary.java index 0bed05e..f7fd94c 100644 --- a/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java +++ b/thaumicbees_src/thaumicbees/block/LogicMagicApiary.java @@ -1,140 +1,140 @@ -package thaumicbees.tile; +package thaumicbees.block; +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.mysteriousages.utils.GenericInventory; +import forestry.api.apiculture.BeeManager; import forestry.api.apiculture.IBee; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeekeepingLogic; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; +import thaumicbees.main.utils.compat.ForestryHelper; -public class TileEntityMagicApiary extends TileEntity implements IInventory, IBeeHousing +public class LogicMagicApiary implements IBeeHousing { - - @Override - public int getSizeInventory() + private TileEntityMagicApiary parent; + private String ownerName; + private BiomeGenBase biome; + private IBeekeepingLogic beeLogic; + private GenericInventory tileInventory; + private ArrayList inventoryOverflow; + + private static final int SLOT_ID_QUEEN = 0; + private static final int SLOT_ID_DRONE = 1; + private static final int SLOT_ID_FRAME = 2; + private static final int SLOT_LENGTH_FRAME = 2; + private static final int SLOT_ID_PRODUCE = 4; + private static final int SLOT_LENGTH_PRODUCE = 6; + + public LogicMagicApiary(TileEntityMagicApiary master) { - // TODO Auto-generated method stub - return 0; + this.parent = master; + this.beeLogic = BeeManager.breedingManager.createBeekeepingLogic(this); + this.tileInventory = new GenericInventory("MagicApiary", 11); } - - @Override - public ItemStack getStackInSlot(int var1) + + public TileEntityMagicApiary getParent() { - // TODO Auto-generated method stub - return null; + return parent; } - - @Override - public ItemStack decrStackSize(int var1, int var2) + + public void setOwner(EntityPlayer player) { - // TODO Auto-generated method stub - return null; + this.ownerName = player.username; } - - @Override - public ItemStack getStackInSlotOnClosing(int var1) + + public String getOwner() { - // TODO Auto-generated method stub - return null; + return this.ownerName; } - - @Override - public void setInventorySlotContents(int var1, ItemStack var2) + + public void writeToNBT(NBTTagCompound tag) + { + NBTTagCompound beeTag = new NBTTagCompound(); + this.beeLogic.writeToNBT(beeTag); + tag.setTag("BeeLogic", beeTag); + tag.setString("Owner", this.ownerName); + NBTTagCompound inventory = new NBTTagCompound(); + this.tileInventory.writeToNBT(inventory); + tag.setTag("Inventory", inventory); + + if (this.inventoryOverflow.size() > 0) + { + NBTTagList overflow = new NBTTagList(); + for (int i = 0; i < this.inventoryOverflow.size(); ++i) + { + NBTTagCompound itemTag = new NBTTagCompound(); + this.inventoryOverflow.get(i).writeToNBT(itemTag); + overflow.appendTag(itemTag); + } + } + + } + + public void readFromNBT(NBTTagCompound tag) { - // TODO Auto-generated method stub } - @Override - public String getInvName() - { - return "thaumicbees.magicApiary"; - } - - @Override - public int getInventoryStackLimit() - { - // TODO Auto-generated method stub - return 0; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer var1) - { - return true; - } - - @Override - public void openChest() { } - - @Override - public void closeChest() { } - @Override public float getTerritoryModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getMutationModifier(IBeeGenome genome, IBeeGenome mate) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getProductionModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 2f; } @Override public float getFloweringModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public boolean isSealed() { - // TODO Auto-generated method stub return false; } @Override public boolean isSelfLighted() { - // TODO Auto-generated method stub return false; } @Override public boolean isSunlightSimulated() { - // TODO Auto-generated method stub return false; } @Override public boolean isHellish() { - // TODO Auto-generated method stub return false; } @@ -142,49 +142,46 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe public void onQueenChange(ItemStack queen) { // TODO Auto-generated method stub - + } @Override public void wearOutEquipment(int amount) { // TODO Auto-generated method stub - + } @Override public void onQueenDeath(IBee queen) { // TODO Auto-generated method stub - + } @Override public void onPostQueenDeath(IBee queen) { // TODO Auto-generated method stub - + } @Override public int getXCoord() { - // TODO Auto-generated method stub - return 0; + return parent.xCoord; } @Override public int getYCoord() { - // TODO Auto-generated method stub - return 0; + return parent.yCoord; } @Override public int getZCoord() { - // TODO Auto-generated method stub - return 0; + return parent.zCoord; } @Override @@ -205,56 +202,51 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe public void setQueen(ItemStack itemstack) { // TODO Auto-generated method stub - + } @Override public void setDrone(ItemStack itemstack) { // TODO Auto-generated method stub - + } @Override public int getBiomeId() { - // TODO Auto-generated method stub - return 0; + return this.biome.biomeID; } @Override public EnumTemperature getTemperature() { - // TODO Auto-generated method stub - return null; + return ForestryHelper.getEnumTemperatureFromValue(this.biome.temperature); } @Override public EnumHumidity getHumidity() { - // TODO Auto-generated method stub - return null; + return ForestryHelper.getEnumHumidityFromValue(this.biome.rainfall); } @Override public World getWorld() { - // TODO Auto-generated method stub - return null; + return this.getWorld(); } @Override public String getOwnerName() { - // TODO Auto-generated method stub - return null; + return parent.getOwner(); } @Override public void setErrorState(int state) { // TODO Auto-generated method stub - + } @Override @@ -277,4 +269,5 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe // TODO Auto-generated method stub return false; } + } diff --git a/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java b/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java new file mode 100644 index 0000000..73d1635 --- /dev/null +++ b/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java @@ -0,0 +1,97 @@ +package thaumicbees.block; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; + +public class TileEntityMagicApiary extends TileEntity +{ + private String owner; + private LogicMagicApiary logic; + private int masterX; + private int masterY; + private int masterZ; + + public TileEntityMagicApiary(World w) + { + this.setWorldObj(w); + } + + public void setValid(TileEntityMagicApiary masterEntity) + { + this.logic = masterEntity.logic; + this.masterX = masterEntity.xCoord; + this.masterY = masterEntity.yCoord; + this.masterZ = masterEntity.zCoord; + } + + public String getOwner() + { + return this.owner; + } + + public boolean isValidStructure() + { + return false; + } + + public boolean isMaster() + { + boolean flag = false; + + if (this.logic != null) + { + flag = this.logic.getParent() == this; + } + + return flag; + } + + public LogicMagicApiary getLogic() + { + return this.logic; + } + + @Override + public void readFromNBT(NBTTagCompound tagRoot) + { + super.readFromNBT(tagRoot); + this.owner = tagRoot.getString("Owner"); + if (tagRoot.hasKey("Logic")) + { + this.logic = new LogicMagicApiary(this); + this.logic.readFromNBT(tagRoot.getCompoundTag("Logic")); + } + else + { + this.masterX = tagRoot.getInteger("MasterX"); + this.masterY = tagRoot.getInteger("MasterY"); + this.masterZ = tagRoot.getInteger("MasterZ"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagRoot) + { + super.writeToNBT(tagRoot); + tagRoot.setString("Owner", this.owner); + if (this.isMaster()) + { + NBTTagCompound logicTag = new NBTTagCompound(); + this.logic.writeToNBT(logicTag); + tagRoot.setTag("Logic", logicTag); + } + else + { + tagRoot.setInteger("MasterX", this.masterX); + tagRoot.setInteger("MasterY", this.masterY); + tagRoot.setInteger("MasterZ", this.masterZ); + } + } +} diff --git a/thaumicbees_src/thaumicbees/item/ItemCapsule.java b/thaumicbees_src/thaumicbees/item/ItemCapsule.java index e78dcc8..66bc725 100644 --- a/thaumicbees_src/thaumicbees/item/ItemCapsule.java +++ b/thaumicbees_src/thaumicbees/item/ItemCapsule.java @@ -26,13 +26,14 @@ public class ItemCapsule extends Item { private CapsuleType capsuleType; - public ItemCapsule(CapsuleType type, int itemId) + public ItemCapsule(CapsuleType type, int itemId, int maxStackSize) { super(itemId); this.capsuleType = type; this.setTextureFile(CommonProxy.TCBEES_LIQUIDS_IMAGE); this.setCreativeTab(Tabs.tabApiculture); this.setHasSubtypes(true); + this.setMaxStackSize(maxStackSize); } public CapsuleType getType() @@ -43,7 +44,7 @@ public class ItemCapsule extends Item @Override public String getItemDisplayName(ItemStack itemStack) { - return LiquidType.values()[itemStack.getItemDamage()].displayName + " " + this.capsuleType.name; + return LiquidType.values()[itemStack.getItemDamage()].getDisplayName() + " " + this.capsuleType.getName(); } public ItemStack getCapsuleForLiquid(LiquidType l) diff --git a/thaumicbees_src/thaumicbees/item/ItemComb.java b/thaumicbees_src/thaumicbees/item/ItemComb.java index f82f60e..ceeaaff 100644 --- a/thaumicbees_src/thaumicbees/item/ItemComb.java +++ b/thaumicbees_src/thaumicbees/item/ItemComb.java @@ -89,13 +89,7 @@ public class ItemComb extends Item @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < CombType.values().length) - { - result = CombType.values()[meta].name; - } - return result; + return CombType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/ItemDrop.java b/thaumicbees_src/thaumicbees/item/ItemDrop.java index 6eadf05..e641f2f 100644 --- a/thaumicbees_src/thaumicbees/item/ItemDrop.java +++ b/thaumicbees_src/thaumicbees/item/ItemDrop.java @@ -3,8 +3,10 @@ package thaumicbees.item; import java.util.List; import thaumicbees.item.types.DropType; +import thaumicbees.item.types.PropolisType; import thaumicbees.main.CommonProxy; import thaumicbees.main.ThaumicBees; +import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import forestry.api.core.Tabs; @@ -85,13 +87,7 @@ public class ItemDrop extends Item @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < DropType.values().length) - { - result = DropType.values()[meta].name; - } - return result; + return DropType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/ItemMagicHiveFrame.java b/thaumicbees_src/thaumicbees/item/ItemMagicHiveFrame.java index 70cd2e3..83c2971 100644 --- a/thaumicbees_src/thaumicbees/item/ItemMagicHiveFrame.java +++ b/thaumicbees_src/thaumicbees/item/ItemMagicHiveFrame.java @@ -12,6 +12,7 @@ import thaumicbees.main.CommonProxy; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import forestry.api.apiculture.IBee; import forestry.api.apiculture.IBeeGenome; @@ -35,7 +36,7 @@ public class ItemMagicHiveFrame extends Item implements IHiveFrame @Override public String getItemDisplayName(ItemStack itemStack) { - return this.type.frameName; + return this.type.getName(); } // --------- IHiveFrame functions ----------------------------------------- @@ -43,10 +44,7 @@ public class ItemMagicHiveFrame extends Item implements IHiveFrame @Override public ItemStack frameUsed(IBeeHousing housing, ItemStack frame, IBee queen, int wear) { - this.doFluxEffect(housing.getWorld(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord()); - frame = this.doWear(housing.getWorld(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord(), frame, wear); - - return frame; + return this.doWear(housing.getWorld(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord(), frame, wear); } private void doFluxEffect(World w, int x, int y, int z) @@ -60,22 +58,50 @@ public class ItemMagicHiveFrame extends Item implements IHiveFrame private ItemStack doWear(World w, int x, int y, int z, ItemStack frame, int wear) { int damage = wear; + int fluxMod = 1; + // This throttles back the amount of aura consumed by the frame by storing a smidge of data on the item stack. if (this.type.auraPerUse > 0) { - // Attempt to use aura for the frame. - if (!ThaumcraftApi.decreaseClosestAura(w, x, y, z, this.type.auraPerUse, true)) + NBTTagCompound tag; + if (frame.hasTagCompound()) { - // Insufficient aura, or no nearby node. - damage = wear + this.type.auraPerUse; + tag = frame.getTagCompound(); } + else + { + tag = new NBTTagCompound(); + tag.setByte("wearTicks", (byte)0); + frame.setTagCompound(tag); + } + + int wearTicks = tag.getByte("wearTicks") + 1; + + if (wearTicks == this.type.wearTicksPerAura) + { + // Attempt to use aura for the frame. + if (!ThaumcraftApi.decreaseClosestAura(w, x, y, z, this.type.auraPerUse, true)) + { + // Insufficient aura, or no nearby node. + damage = wear + this.type.auraPerUse * this.type.wearTicksPerAura; + fluxMod = 1 + w.rand.nextInt(this.type.wearTicksPerAura); + } + wearTicks = 0; + } + + tag.setByte("wearTicks", (byte)wearTicks); } frame.setItemDamage(frame.getItemDamage() + damage); + for (int i = 0; i < fluxMod; ++i) + { + this.doFluxEffect(w, x, y, z); + } + if (frame.getItemDamage() >= frame.getMaxDamage()) { - // Break! + // Break the frame. frame = null; } diff --git a/thaumicbees_src/thaumicbees/item/ItemMiscResources.java b/thaumicbees_src/thaumicbees/item/ItemMiscResources.java index c541803..545c07c 100644 --- a/thaumicbees_src/thaumicbees/item/ItemMiscResources.java +++ b/thaumicbees_src/thaumicbees/item/ItemMiscResources.java @@ -59,13 +59,7 @@ public class ItemMiscResources extends Item @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < ResourceType.values().length) - { - result = ResourceType.values()[meta].name; - } - return result; + return ResourceType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/ItemPollen.java b/thaumicbees_src/thaumicbees/item/ItemPollen.java index 014df48..dccd127 100644 --- a/thaumicbees_src/thaumicbees/item/ItemPollen.java +++ b/thaumicbees_src/thaumicbees/item/ItemPollen.java @@ -80,17 +80,11 @@ public class ItemPollen extends Item return colour; } - + @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < PollenType.values().length) - { - result = PollenType.values()[meta].name; - } - return result; + return PollenType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/ItemPropolis.java b/thaumicbees_src/thaumicbees/item/ItemPropolis.java index 576aa19..d39251a 100644 --- a/thaumicbees_src/thaumicbees/item/ItemPropolis.java +++ b/thaumicbees_src/thaumicbees/item/ItemPropolis.java @@ -57,13 +57,7 @@ public class ItemPropolis extends Item @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < PropolisType.values().length) - { - result = PropolisType.values()[meta].name; - } - return result; + return PropolisType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/ItemSolidFlux.java b/thaumicbees_src/thaumicbees/item/ItemSolidFlux.java index 4756731..63024bd 100644 --- a/thaumicbees_src/thaumicbees/item/ItemSolidFlux.java +++ b/thaumicbees_src/thaumicbees/item/ItemSolidFlux.java @@ -2,11 +2,13 @@ package thaumicbees.item; import java.util.List; +import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import forestry.api.core.Tabs; import thaumcraft.api.EnumTag; import thaumicbees.main.CommonProxy; +import thaumicbees.main.utils.LocalizationManager; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -32,7 +34,6 @@ public class ItemSolidFlux extends Item { continue; } - list.add(new ItemStack(this.itemID, 1, tag.id)); } } @@ -40,7 +41,7 @@ public class ItemSolidFlux extends Item @Override public String getItemDisplayName(ItemStack stack) { - return "Crystalized " + EnumTag.get(stack.getItemDamage()).name + " Aspect"; + return String.format(LocalizationManager.getLocalizedString("tb.resource.crystalFlux"), EnumTag.get(stack.getItemDamage()).name); } @Override diff --git a/thaumicbees_src/thaumicbees/item/ItemThaumiumGrafter.java b/thaumicbees_src/thaumicbees/item/ItemThaumiumGrafter.java new file mode 100644 index 0000000..5da5ebb --- /dev/null +++ b/thaumicbees_src/thaumicbees/item/ItemThaumiumGrafter.java @@ -0,0 +1,89 @@ +package thaumicbees.item; + +import thaumcraft.api.IVisRepairable; +import thaumcraft.api.ThaumcraftApi; +import thaumicbees.main.CommonProxy; +import thaumicbees.main.Config; +import thaumicbees.main.utils.compat.ThaumcraftHelper; +import forestry.api.arboriculture.IToolGrafter; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; + +public class ItemThaumiumGrafter extends Item implements IVisRepairable, IToolGrafter +{ + + public ItemThaumiumGrafter(int id) + { + super(id); + this.setCreativeTab(forestry.api.core.Tabs.tabArboriculture); + this.setMaxDamage(25); + this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + this.setIconIndex(21); + this.setItemName("tb.thaumiumGrafter"); + } + + @Override + public float getSaplingModifier(ItemStack stack, World world, int x, int y, int z) + { + return 100f; + } + + @Override + public float getStrVsBlock(ItemStack itemStack, Block block) + { + return 1f; + } + + @Override + public float getStrVsBlock(ItemStack itemStack, Block block, int metadata) + { + return ForgeHooks.isToolEffective(itemStack, block, metadata) ? 4.8f : getStrVsBlock(itemStack, block); + } + + @Override + public boolean onBlockDestroyed(ItemStack itemstack, World world, int id, int x, int y, int z, EntityLiving entityliving) { + itemstack.damageItem(1, entityliving); + return true; + } + + /** + * Return the enchantability factor of the item, most of the time is based on material. + */ + public int getItemEnchantability() + { + return ThaumcraftApi.toolMatThaumium.getEnchantability(); + } + + /** + * Return the name for this tool's material. + */ + public String getToolMaterialName() + { + return ThaumcraftApi.toolMatThaumium.toString(); + } + + /** + * Return whether this item is repairable in an anvil. + */ + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return ThaumcraftApi.toolMatThaumium.getToolCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); + } + + @Override + public void doRepair(ItemStack stack, Entity e) + { + if (stack.getItemDamage() > 0) + { + if (ThaumcraftApi.decreaseClosestAura(e.worldObj, e.posX, e.posY, e.posZ, 1, true)) + { + stack.damageItem(-1, (EntityLiving)e); + } + } + } +} diff --git a/thaumicbees_src/thaumicbees/item/ItemThaumiumScoop.java b/thaumicbees_src/thaumicbees/item/ItemThaumiumScoop.java new file mode 100644 index 0000000..b4e278c --- /dev/null +++ b/thaumicbees_src/thaumicbees/item/ItemThaumiumScoop.java @@ -0,0 +1,81 @@ +package thaumicbees.item; + +import thaumcraft.api.IVisRepairable; +import thaumcraft.api.ThaumcraftApi; +import thaumicbees.main.CommonProxy; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; + +public class ItemThaumiumScoop extends Item implements IVisRepairable +{ + public ItemThaumiumScoop(int itemID) + { + super(itemID); + this.setMaxStackSize(1); + this.setMaxDamage(30); + this.setIconIndex(20); + this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + this.setItemName("tb.thaumiumScoop"); + this.setCreativeTab(forestry.api.core.Tabs.tabApiculture); + } + + @Override + public float getStrVsBlock(ItemStack itemStack, Block block) + { + return 1f; + } + + @Override + public float getStrVsBlock(ItemStack itemStack, Block block, int metadata) + { + return ForgeHooks.isToolEffective(itemStack, block, metadata) ? 4.8f : getStrVsBlock(itemStack, block); + } + + @Override + public boolean onBlockDestroyed(ItemStack itemstack, World world, int i, int j, int k, int l, EntityLiving entityliving) { + itemstack.damageItem(1, entityliving); + return true; + } + + /** + * Return the enchantability factor of the item, most of the time is based on material. + */ + public int getItemEnchantability() + { + return ThaumcraftApi.toolMatThaumium.getEnchantability(); + } + + /** + * Return the name for this tool's material. + */ + public String getToolMaterialName() + { + return ThaumcraftApi.toolMatThaumium.toString(); + } + + /** + * Return whether this item is repairable in an anvil. + */ + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return ThaumcraftApi.toolMatThaumium.getToolCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); + } + + @Override + public void doRepair(ItemStack stack, Entity e) + { + if (stack.getItemDamage() > 0) + { + if (ThaumcraftApi.decreaseClosestAura(e.worldObj, e.posX, e.posY, e.posZ, 1, true)) + { + stack.damageItem(-1, (EntityLiving)e); + } + } + } +} diff --git a/thaumicbees_src/thaumicbees/item/ItemWax.java b/thaumicbees_src/thaumicbees/item/ItemWax.java index 6d7e075..4964d4c 100644 --- a/thaumicbees_src/thaumicbees/item/ItemWax.java +++ b/thaumicbees_src/thaumicbees/item/ItemWax.java @@ -70,12 +70,6 @@ public class ItemWax extends Item @Override public String getItemDisplayName(ItemStack stack) { - String result = ""; - int meta = stack.getItemDamage(); - if (meta >= 0 && meta < WaxType.values().length) - { - result = WaxType.values()[meta].name; - } - return result; + return WaxType.values()[stack.getItemDamage()].getName(); } } diff --git a/thaumicbees_src/thaumicbees/item/types/CapsuleType.java b/thaumicbees_src/thaumicbees/item/types/CapsuleType.java index c86a327..de73441 100644 --- a/thaumicbees_src/thaumicbees/item/types/CapsuleType.java +++ b/thaumicbees_src/thaumicbees/item/types/CapsuleType.java @@ -1,10 +1,14 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum CapsuleType { - MAGIC("Magic Capsule", 2000, 0), + MAGIC("magic", 2000, 0), + VOID("void", 8000, 1), ; - public String name; + private String name; public int capacity; public int iconIdx; @@ -14,4 +18,9 @@ public enum CapsuleType this.capacity = c; this.iconIdx = idx; } + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.capsule." + name); + } } \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/item/types/CombType.java b/thaumicbees_src/thaumicbees/item/types/CombType.java index 73948f0..7d154bb 100644 --- a/thaumicbees_src/thaumicbees/item/types/CombType.java +++ b/thaumicbees_src/thaumicbees/item/types/CombType.java @@ -1,18 +1,21 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum CombType { - OCCULT("Occult Comb", 0x6e1c6d, 0xff8fff, true), - OTHERWORLDLY("Otherworldy Comb", 0x000056, 0x765cc1, true), - PAPERY("Papery Comb", 0x503900, 0xbd9a30, true), - STARK("Stark Comb", 0xB0B0BC, 0x6e6e79, false), - AIRY("Airy Comb", 0xffff7e, 0x717600, false), - FIREY("Firey Comb", 0xff3C01, 0x740002, false), - WATERY("Watery Comb", 0x0090ff, 0x00308c, false), - EARTHY("Earthy Comb", 0x00a000, 0x005100, false), - INFUSED("Infused Comb", 0xaa32fc, 0x7A489E, false), - INTELLECT("Memory Comb", 0x618fff, 0xb0092e9, false), - SKULKING("Furtive Comb", 0x545454, 0xcda6cd, true), + OCCULT("occult", 0x6e1c6d, 0xff8fff, true), + OTHERWORLDLY("otherworldly", 0x000056, 0x765cc1, true), + PAPERY("paper", 0x503900, 0xbd9a30, true), + STARK("stark", 0xB0B0BC, 0x6e6e79, false), + AIRY("air", 0xffff7e, 0x717600, false), + FIREY("fire", 0xff3C01, 0x740002, false), + WATERY("water", 0x0090ff, 0x00308c, false), + EARTHY("earth", 0x00a000, 0x005100, false), + INFUSED("magic", 0xaa32fc, 0x7A489E, false), + INTELLECT("aware", 0x618fff, 0xb0092e9, false), + SKULKING("furtive", 0x545454, 0xcda6cd, true), ; private CombType(String pName, int colourA, int colourB, boolean show) @@ -25,7 +28,12 @@ public enum CombType this.showInList = show; } - public final String name; + private String name; public int[] combColour; public boolean showInList; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.comb." + this.name); + } } \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/item/types/DropType.java b/thaumicbees_src/thaumicbees/item/types/DropType.java index 2424119..08a3f7b 100644 --- a/thaumicbees_src/thaumicbees/item/types/DropType.java +++ b/thaumicbees_src/thaumicbees/item/types/DropType.java @@ -1,9 +1,12 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum DropType { - ENCHANTED("Enchanting Drop", 0x6e1c6d, 0xff8fff), - INTELLECT("Intellect Drop", 0x25914D, 0x18E072), + ENCHANTED("enchanting", 0x6e1c6d, 0xff8fff), + INTELLECT("intellect", 0x25914D, 0x18E072), ; private DropType(String pName, int colourA, int colourB) @@ -13,6 +16,11 @@ public enum DropType this.combColour[1] = colourB; } - public final String name; + private final String name; public int[] combColour = new int[2]; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.drop." + this.name); + } } \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java b/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java index 6f8628a..be1a3d6 100644 --- a/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java +++ b/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java @@ -1,35 +1,37 @@ package thaumicbees.item.types; +import cpw.mods.fml.common.registry.LanguageRegistry; import thaumcraft.api.EnumTag; import thaumcraft.api.ObjectTags; +import thaumicbees.main.utils.LocalizationManager; public enum HiveFrameType { - MAGIC("Magic Frame", 32, 240, 1f, 1f, 1f, 2f, 2, + MAGIC("magic", 32, 240, 1f, 1f, 1f, 2f, 2, 5, null), - RESILIENT("Resilient Frame", 33, 840, 1f, 1f, 1f, 2f, 2, + RESILIENT("resillient", 33, 840, 1f, 1f, 1f, 2f, 2, 5, new ObjectTags().add(EnumTag.ARMOR, 1)), - GENTLE("Gentle Frame", 34, 200, 1f, 0.7f, 1.5f, 1.4f, 1, + GENTLE("gentle", 34, 200, 1f, 0.7f, 1.5f, 1.4f, 1, 5, new ObjectTags().add(EnumTag.HEAL, 1).add(EnumTag.LIFE, 1)), - METABOLIC("Metabolic Frame", 35, 120, 1f, 1.8f, 1f, 1.2f, 5, + METABOLIC("metabolic", 35, 120, 1f, 1.8f, 1f, 1.2f, 5, 5, new ObjectTags().add(EnumTag.EXCHANGE, 1).add(EnumTag.MOTION, 1)), - NECROTIC("Necrotic Frame", 36, 290, 1f, 1f, 0.3f, 0.75f, 1, + NECROTIC("necrotic", 36, 290, 1f, 1f, 0.3f, 0.75f, 1, 5, new ObjectTags().add(EnumTag.DEATH, 3).add(EnumTag.POISON, 2)), - TEMPORAL("Temporal Frame", 37, 300, 1f, 1f, 2.5f, 1f, 1, + TEMPORAL("temporal", 37, 300, 1f, 1f, 2.5f, 1f, 1, 5, new ObjectTags().add(EnumTag.TIME, 5)), ; private HiveFrameType(String name, int icon, int damage, float territory, float mutation, float lifespan, float production, - int auraUse, ObjectTags fluxTags) + int auraUse, int wearTicks, ObjectTags fluxTags) { - this(name, icon, damage, territory, mutation, lifespan, production, 1f, false, false, false, false, auraUse, fluxTags); + this(name, icon, damage, territory, mutation, lifespan, production, 1f, false, false, false, false, auraUse, wearTicks, fluxTags); } private HiveFrameType(String name, int icon, int damage, float territory, float mutation, float lifespan, float production, float flowering, boolean sealed, boolean lit, boolean sunlit, boolean hellish, - int auraUse, ObjectTags fluxTags) + int auraUse, int wearTicks, ObjectTags fluxTags) { this.frameName = name; this.iconIdx = icon; @@ -47,9 +49,10 @@ public enum HiveFrameType this.auraPerUse = auraUse; this.flux = fluxTags; + this.wearTicksPerAura = wearTicks; } - public String frameName; + private String frameName; public int iconIdx; public int maxDamage; @@ -65,4 +68,10 @@ public enum HiveFrameType public ObjectTags flux; public int auraPerUse; + public int wearTicksPerAura; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.frame." + this.frameName); + } } diff --git a/thaumicbees_src/thaumicbees/item/types/LiquidType.java b/thaumicbees_src/thaumicbees/item/types/LiquidType.java index f8165c2..76d2fce 100644 --- a/thaumicbees_src/thaumicbees/item/types/LiquidType.java +++ b/thaumicbees_src/thaumicbees/item/types/LiquidType.java @@ -1,50 +1,57 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; +import net.minecraftforge.liquids.LiquidDictionary; + public enum LiquidType { // Incidentally, Item meta is the liquid ID. // Args are: forgeLiquidID, Display Name, Icon idx - EMPTY("", "Empty", 16), + EMPTY("", 16), // Vanilla - WATER("water", "Water", 17), - LAVA("lava", "Lava", 18), + WATER("water", 17), + LAVA("lava", 18), // Forestry - BIOMASS("biomass", "Biomass", 19), - BIOFUEL("biofuel", "Biofuel", 20), + BIOMASS("biomass", 19), + BIOFUEL("biofuel", 20), // Buildcraft - OIL("Oil", "Oil", 21), - FUEL("Fuel", "Fuel", 22), + OIL("Oil", 21), + FUEL("Fuel", 22), // More Forestry - SEEDOIL("seedoil", "Seed Oil", 23), - HONEY("honey", "Honey", 24), - JUICE("juice", "Juice", 25), - CRUSHEDICE("ice", "Crushed Ice", 26), - MILK("milk", "Milk", 27), + SEEDOIL("seedoil", 23), + HONEY("honey", 24), + JUICE("juice", 25), + CRUSHEDICE("ice", 26), + MILK("milk", 27), // ExtraBees liquids - ACID("acid", "Acid", 28), - POISON("poison", "Poison", 29), - LIQUIDNITROGEN("liquidNitrogen", "Liquid Nitrogen", 30), - DNA("liquidDNA", "Liquid DNA", 31), + ACID("acid", 28), + POISON("poison", 29), + LIQUIDNITROGEN("liquidNitrogen", 30), + DNA("liquidDNA", 31), // Railcraft - CREOSOTEOIL("Creosote Oil", "Creosote Oil", 32), - STEAM("Steam", "Steam", 33), + CREOSOTEOIL("Creosote Oil", 32), + STEAM("Steam", 33), ; public String liquidID; - public String displayName; public int iconIdx; public boolean available = false; - private LiquidType(String l, String display, int idx) + private LiquidType(String l, int idx) { this.liquidID = l; - this.displayName = display; this.iconIdx = idx; } + + public String getDisplayName() + { + return LocalizationManager.getLocalizedString("tb.liquid." + liquidID); + } } diff --git a/thaumicbees_src/thaumicbees/item/types/PlankType.java b/thaumicbees_src/thaumicbees/item/types/PlankType.java new file mode 100644 index 0000000..3a99904 --- /dev/null +++ b/thaumicbees_src/thaumicbees/item/types/PlankType.java @@ -0,0 +1,45 @@ +package thaumicbees.item.types; + +public enum PlankType +{ + GREATWOOD("greatwood", 48), + SILVERWOOD("silverwood", 49), + ; + + public String name; + public int textureIdx; + private static String[] nameList; + + private PlankType(String n, int idx) + { + this.name = n; + this.textureIdx = idx; + } + + public static PlankType getType(int meta) + { + PlankType type = null; + + if (meta >= 0 && meta <= values().length) + { + type = values()[meta]; + } + + return type; + } + + public static String[] getAllNames() + { + return (nameList == null) ? nameList = generateNames() : nameList; + } + + private static String[] generateNames() + { + String[] names = new String[values().length]; + for (int i = 0; i < names.length; ++i) + { + names[i] = values()[i].name; + } + return names; + } +} diff --git a/thaumicbees_src/thaumicbees/item/types/PollenType.java b/thaumicbees_src/thaumicbees/item/types/PollenType.java index 389f83a..453b8a4 100644 --- a/thaumicbees_src/thaumicbees/item/types/PollenType.java +++ b/thaumicbees_src/thaumicbees/item/types/PollenType.java @@ -1,8 +1,12 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum PollenType { - UNUSUAL("Unusual Pollen", 0xA03059, 0xD8417B), + UNUSUAL("unusual", 0xA03059, 0xD8417B), + PHASED("phased", 0x456BA5, 0x4974B4), ; private PollenType(String pName, int colourA, int colourB) @@ -12,6 +16,11 @@ public enum PollenType this.combColour[1] = colourB; } - public final String name; + private String name; public int[] combColour = new int[2]; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.pollen." + this.name); + } } \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/item/types/PropolisType.java b/thaumicbees_src/thaumicbees/item/types/PropolisType.java index ba06717..fefa0c5 100644 --- a/thaumicbees_src/thaumicbees/item/types/PropolisType.java +++ b/thaumicbees_src/thaumicbees/item/types/PropolisType.java @@ -1,13 +1,16 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum PropolisType { - STARK("Dull Propolis", 0xBBBBBB), - AIR("Air Propolis", 0xA19E10), - FIRE("Firey Propolis", 0x95132F), - WATER("Watery Propolis", 0x1054A1), - EARTH("Earthen Propolis", 0x00a000), - INFUSED("Infused Propolis", 0xaa32fc), + STARK("dull", 0xBBBBBB), + AIR("air", 0xA19E10), + FIRE("fire", 0x95132F), + WATER("water", 0x1054A1), + EARTH("earth", 0x00a000), + INFUSED("magic", 0xaa32fc), ; private PropolisType(String pName, int overlayColour) @@ -16,6 +19,11 @@ public enum PropolisType this.colour = overlayColour; } - public String name; + private String name; public int colour; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.propolis." + this.name); + } } diff --git a/thaumicbees_src/thaumicbees/item/types/ResourceType.java b/thaumicbees_src/thaumicbees/item/types/ResourceType.java index 7d41862..5a53ce1 100644 --- a/thaumicbees_src/thaumicbees/item/types/ResourceType.java +++ b/thaumicbees_src/thaumicbees/item/types/ResourceType.java @@ -1,12 +1,16 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum ResourceType { - LORE_FRAGMENT("Lore Fragment", 2, true), - AROMATIC_LUMP("Aromatic Lump", 3, true), - EXTENDED_FERTILIZER("Concentrated Compound", 4, true), + LORE_FRAGMENT("fragment", 2, true), + AROMATIC_LUMP("lump", 3, true), + EXTENDED_FERTILIZER("fertilizer", 4, true), // Dummy items for Thaumanomicon research icons. + // These won't ever actually exist in-game, and so RESEARCH_StartNode("Start Node", 241, false), RESEARCH_BeeInfusion("Bee Infusion", 240, false), ; @@ -17,7 +21,12 @@ public enum ResourceType this.iconIdx = i; this.showInList = show; } - public String name; + private String name; public int iconIdx; public boolean showInList; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.resource." + this.name); + } } diff --git a/thaumicbees_src/thaumicbees/item/types/WaxType.java b/thaumicbees_src/thaumicbees/item/types/WaxType.java index fea3a89..8120948 100644 --- a/thaumicbees_src/thaumicbees/item/types/WaxType.java +++ b/thaumicbees_src/thaumicbees/item/types/WaxType.java @@ -1,8 +1,11 @@ package thaumicbees.item.types; +import thaumicbees.main.utils.LocalizationManager; +import cpw.mods.fml.common.registry.LanguageRegistry; + public enum WaxType { - MAGIC("Magic Wax", false, 0xd242df), + MAGIC("magic", false, 0xd242df), ; private WaxType(String n, boolean sp, int c) @@ -12,7 +15,12 @@ public enum WaxType this.colour = c; } - public String name; + private String name; public boolean sparkly; public int colour; + + public String getName() + { + return LocalizationManager.getLocalizedString("tb.wax." + this.name); + } } \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/main/CommonProxy.java b/thaumicbees_src/thaumicbees/main/CommonProxy.java index ea8a418..f1df93f 100644 --- a/thaumicbees_src/thaumicbees/main/CommonProxy.java +++ b/thaumicbees_src/thaumicbees/main/CommonProxy.java @@ -8,6 +8,7 @@ public class CommonProxy { public static final String TCBEES_GFX = "/gfx/thaumicbees/"; public static final String TCBEES_RESEARCH = "/research/thaumicbees/"; + public static final String TCBEES_LOCDIR = "/lang/thaumicbees/"; public static final String TCBEES_ITEM_GFX = TCBEES_GFX + "items/"; public static String FORESTRY_GFX_ITEMS; diff --git a/thaumicbees_src/thaumicbees/main/Config.java b/thaumicbees_src/thaumicbees/main/Config.java index d7bd7ef..489c7bc 100644 --- a/thaumicbees_src/thaumicbees/main/Config.java +++ b/thaumicbees_src/thaumicbees/main/Config.java @@ -3,9 +3,9 @@ package thaumicbees.main; import java.io.File; import thaumicbees.block.BlockMagicApiary; -import thaumicbees.compat.CompatabilityManager; -import thaumicbees.compat.ForestryHelper; -import thaumicbees.compat.ThaumcraftHelper; +import thaumicbees.block.BlockPlanks; +import thaumicbees.block.BlockWoodSlab; +import thaumicbees.block.TileEntityMagicApiary; import thaumicbees.item.ItemCapsule; import thaumicbees.item.ItemComb; import thaumicbees.item.ItemDrop; @@ -13,23 +13,37 @@ import thaumicbees.item.ItemMagicHiveFrame; import thaumicbees.item.ItemMiscResources; import thaumicbees.item.ItemPollen; import thaumicbees.item.ItemPropolis; +import thaumicbees.item.ItemThaumiumGrafter; +import thaumicbees.item.ItemThaumiumScoop; import thaumicbees.item.ItemSolidFlux; import thaumicbees.item.ItemWax; import thaumicbees.item.types.CapsuleType; import thaumicbees.item.types.HiveFrameType; +import thaumicbees.item.types.PlankType; +import thaumicbees.item.types.ResourceType; +import thaumicbees.main.utils.CompatabilityManager; +import thaumicbees.main.utils.LocalizationManager; +import thaumicbees.main.utils.compat.ForestryHelper; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import thaumicbees.storage.BackpackDefinition; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; +import forestry.api.apiculture.BeeManager; import forestry.api.storage.BackpackManager; import forestry.api.storage.EnumBackpackType; import net.minecraft.block.Block; +import net.minecraft.block.BlockLog; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemMultiTextureTile; +import net.minecraft.item.ItemSlab; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.Configuration; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.Property; import net.minecraftforge.oredict.OreDictionary; @@ -45,8 +59,11 @@ public class Config public boolean ExtraBeesInstalled; public boolean AddThaumcraftItemsToBackpacks; public String ThaumaturgeExtraItems; + public int capsuleStackSizeMax; - + public static BlockPlanks planksWood; + public static BlockWoodSlab slabWoodHalf; + public static BlockWoodSlab slabWoodFull; public static BlockMagicApiary magicApiary; public static ItemComb combs; @@ -57,9 +74,12 @@ public class Config public static ItemSolidFlux solidFlux; public static ItemMiscResources miscResources; public static ItemFood jellyBaby; + public static ItemThaumiumScoop thaumiumScoop; + public static ItemThaumiumGrafter thaumiumGrafter; //----- Liquid Capsules -------------------- public static ItemCapsule magicCapsule; + public static ItemCapsule voidCapsule; //----- Apiary Frames ---------------------- public static ItemMagicHiveFrame hiveFrameMagic; @@ -121,8 +141,35 @@ public class Config int blockIdBase = 1750; - magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase).getInt()); - GameRegistry.registerBlock(magicApiary, "Magic Apiary"); + planksWood = new BlockPlanks(tbConfig.getBlock("planksTC", blockIdBase++).getInt()); + + Item item = new ItemMultiTextureTile(planksWood.blockID - 256, planksWood, PlankType.getAllNames()) + .setItemName(planksWood.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + Item.itemsList[planksWood.blockID] = item; + + OreDictionary.registerOre("plankWood", new ItemStack(planksWood, 1, -1)); + + slabWoodFull = new BlockWoodSlab(tbConfig.getBlock("slabFull", blockIdBase++).getInt(), true); + slabWoodHalf = new BlockWoodSlab(tbConfig.getBlock("slabHalf", blockIdBase++).getInt(), false); + + item = new ItemSlab(slabWoodHalf.blockID - 256, slabWoodHalf, slabWoodFull, false) + .setItemName(slabWoodHalf.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + Item.itemsList[slabWoodHalf.blockID] = item; + item = new ItemSlab(slabWoodFull.blockID - 256, slabWoodHalf, slabWoodFull, true) + .setItemName(slabWoodFull.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + Item.itemsList[slabWoodFull.blockID] = item; + + OreDictionary.registerOre("slabWood", new ItemStack(slabWoodHalf, 1, -1)); + + blockIdBase++; // Stair + + /*magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase++).getInt()); + GameRegistry.registerBlock(magicApiary, "tb.magicApiary");*/ + } + + public void registerTileEntities() + { + TileEntity.addMapping(TileEntityMagicApiary.class, "MagicApiary"); } public void setupItems() @@ -141,10 +188,15 @@ public class Config drops = new ItemDrop(tbConfig.getItem("drop", itemIDBase++).getInt()); miscResources = new ItemMiscResources(tbConfig.getItem("miscResources", itemIDBase++).getInt()); + + // Make Aromatic Lumps a swarmer inducer. Chance is /1000. + BeeManager.inducers.put(miscResources.getStackForType(ResourceType.AROMATIC_LUMP), 80); + try { // 0x8700C6 = purpleish. - BackpackDefinition def = new BackpackDefinition("thaumaturge", "Thaumaturge's Backpack", 0x8700C6); + String backpackName = LocalizationManager.getLocalizedString("tb.backpack.thaumaturge"); + BackpackDefinition def = new BackpackDefinition("thaumaturge", backpackName, 0x8700C6); thaumaturgeBackpackT1 = BackpackManager.backpackInterface.addBackpack(tbConfig.getItem("thaumaturgePack1", itemIDBase++).getInt(), def, EnumBackpackType.T1); @@ -165,7 +217,7 @@ public class Config } - magicCapsule = new ItemCapsule(CapsuleType.MAGIC, tbConfig.getItem("magicCapsule", itemIDBase++).getInt()); + magicCapsule = new ItemCapsule(CapsuleType.MAGIC, tbConfig.getItem("magicCapsule", itemIDBase++).getInt(), this.capsuleStackSizeMax); pollen = new ItemPollen(tbConfig.getItem("pollen", itemIDBase++).getInt()); solidFlux = new ItemSolidFlux(tbConfig.getItem("fluxCrystal", itemIDBase++).getInt()); @@ -187,12 +239,17 @@ public class Config itemIDBase++; itemIDBase++; - // New items here. - jellyBaby = new ItemFood(tbConfig.getItem("sugarSnack", itemIDBase++).getInt(), 1, false).setAlwaysEdible() + // Jelly babies for Dr. Whoniversary. + jellyBaby = new ItemFood(tbConfig.getItem("jellyBabies", itemIDBase++).getInt(), 1, false).setAlwaysEdible() .setPotionEffect(Potion.moveSpeed.id, 5, 1, 1f); - jellyBaby.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE).setIconIndex(19).setItemName("sugarSnack"); - LanguageRegistry.addName(jellyBaby, "Jelly Baby"); + jellyBaby.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE).setIconIndex(19).setItemName("jellyBabies"); + voidCapsule = new ItemCapsule(CapsuleType.VOID, tbConfig.getItem("voidCapsule", itemIDBase++).getInt(), this.capsuleStackSizeMax); + + thaumiumScoop = new ItemThaumiumScoop(tbConfig.getItem("thaumiumScoop", itemIDBase++).getInt()); + MinecraftForge.setToolClass(thaumiumScoop, "scoop", 3); + + thaumiumGrafter = new ItemThaumiumGrafter(tbConfig.getItem("thaumiumGrafter", itemIDBase++).getInt()); } private void doMiscConfig() @@ -208,6 +265,11 @@ public class Config p.comment = "Set to true if you want ThaumicBees to add several Thaumcraft blocks & items to Forestry backpacks." + "\n Set to false to disable."; this.AddThaumcraftItemsToBackpacks = p.getBoolean(true); + + p = tbConfig.get("general", "capsuleStackSize", 64); + p.comment = "Allows you to edit the stack size of the capsules in ThaumicBees if using GregTech, \n" + + "or the reduced capsule size in Forestry & Railcraft. Default: 64"; + this.capsuleStackSizeMax = p.getInt(); } } diff --git a/thaumicbees_src/thaumicbees/main/ThaumicBees.java b/thaumicbees_src/thaumicbees/main/ThaumicBees.java index 415d868..3201716 100644 --- a/thaumicbees_src/thaumicbees/main/ThaumicBees.java +++ b/thaumicbees_src/thaumicbees/main/ThaumicBees.java @@ -3,8 +3,9 @@ package thaumicbees.main; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeSubscribe; -import thaumicbees.compat.CompatabilityManager; +import thaumicbees.main.utils.CompatabilityManager; import thaumicbees.main.utils.CraftingManager; +import thaumicbees.main.utils.LocalizationManager; import thaumicbees.main.utils.VersionInfo; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Mod; @@ -41,6 +42,8 @@ public class ThaumicBees @Mod.PreInit public void preInit(FMLPreInitializationEvent event) { + LocalizationManager.setupLocalizationInfo(); + this.configsPath = event.getModConfigurationDirectory().getAbsolutePath(); this.modConfig = new Config(event.getSuggestedConfigurationFile()); @@ -67,6 +70,7 @@ public class ThaumicBees } this.modConfig.setupBlocks(); + this.modConfig.registerTileEntities(); this.modConfig.setupItems(); CompatabilityManager.setupBackpacks(); @@ -86,7 +90,6 @@ public class ThaumicBees // Forestry has init'd by this point. MinecraftForge.EVENT_BUS.register(this); - CompatabilityManager.setupResearch(); } diff --git a/thaumicbees_src/thaumicbees/compat/CompatabilityManager.java b/thaumicbees_src/thaumicbees/main/utils/CompatabilityManager.java similarity index 89% rename from thaumicbees_src/thaumicbees/compat/CompatabilityManager.java rename to thaumicbees_src/thaumicbees/main/utils/CompatabilityManager.java index c8171d8..1188f5d 100644 --- a/thaumicbees_src/thaumicbees/compat/CompatabilityManager.java +++ b/thaumicbees_src/thaumicbees/main/utils/CompatabilityManager.java @@ -1,4 +1,4 @@ -package thaumicbees.compat; +package thaumicbees.main.utils; import java.io.File; import java.lang.reflect.Field; @@ -24,8 +24,18 @@ import thaumicbees.item.types.WaxType; import thaumicbees.main.CommonProxy; import thaumicbees.main.Config; import thaumicbees.main.ThaumicBees; +import thaumicbees.main.utils.compat.ForestryHelper; +import thaumicbees.main.utils.compat.ThaumcraftHelper; +import thaumicbees.main.utils.compat.ForestryHelper.CircuitBoard; +import thaumicbees.main.utils.compat.ForestryHelper.Comb; +import thaumicbees.main.utils.compat.ForestryHelper.CraftingMaterial; +import thaumicbees.main.utils.compat.ForestryHelper.Pollen; +import thaumicbees.main.utils.compat.ForestryHelper.Propolis; +import thaumicbees.main.utils.compat.ForestryHelper.Tube; +import thaumicbees.main.utils.compat.ThaumcraftHelper.MiscResource; import thaumicbees.storage.BackpackDefinition; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.registry.GameRegistry; import forestry.api.apiculture.EnumBeeChromosome; @@ -55,10 +65,7 @@ public class CompatabilityManager Item i = (Item) f.get(null); value = new ItemStack(i); } - catch (Exception e) - { - - } + catch (Exception e) { } return value; } @@ -115,6 +122,9 @@ public class CompatabilityManager ObjectTags tags; ItemStack itemStack; + tags = new ObjectTags().add(EnumTag.WOOD, 2); + ThaumcraftApi.registerObjectTag(Config.planksWood.blockID, -1, tags); + tags = new ObjectTags().add(EnumTag.MAGIC, 2); ThaumcraftApi.registerObjectTag(Config.wax.itemID, WaxType.MAGIC.ordinal(), tags); @@ -123,8 +133,10 @@ public class CompatabilityManager tags = new ObjectTags().add(EnumTag.KNOWLEDGE, 1); ThaumcraftApi.registerObjectTag(Config.drops.itemID, DropType.INTELLECT.ordinal(), tags); - tags = new ObjectTags().add(EnumTag.ELDRITCH, 1); + tags = new ObjectTags().add(EnumTag.ELDRITCH, 2); ThaumcraftApi.registerObjectTag(Config.pollen.itemID, PollenType.UNUSUAL.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.TIME, 2); + ThaumcraftApi.registerObjectTag(Config.pollen.itemID, PollenType.PHASED.ordinal(), tags); tags = new ObjectTags().add(EnumTag.CONTROL, 1); ThaumcraftApi.registerObjectTag(Config.propolis.itemID, -1, tags); @@ -221,12 +233,12 @@ public class CompatabilityManager itemStack = ItemInterface.getItem("beealyzer"); tags = new ObjectTags().add(EnumTag.VALUABLE, 3).add(EnumTag.MECHANISM, 3).add(EnumTag.METAL, 19) - .add(EnumTag.POWER, 8).add(EnumTag.CRYSTAL, 18); + .add(EnumTag.POWER, 8).add(EnumTag.TOOL, 18); ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); itemStack = ItemInterface.getItem("treealyzer"); tags = new ObjectTags().add(EnumTag.POWER, 3).add(EnumTag.PURE, 3).add(EnumTag.LIFE, 6) - .add(EnumTag.CRYSTAL, 12).add(EnumTag.METAL, 19); + .add(EnumTag.TOOL, 12).add(EnumTag.METAL, 19); ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); itemStack = ItemInterface.getItem("apatite"); @@ -234,11 +246,11 @@ public class CompatabilityManager ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); itemStack = ItemInterface.getItem("impregnatedCasing"); - tags = new ObjectTags().add(EnumTag.WOOD, 58).add(EnumTag.PLANT, 8); + tags = new ObjectTags().add(EnumTag.WOOD, 56).add(EnumTag.EXCHANGE, 8); ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); itemStack = ItemInterface.getItem("stickImpregnated"); - tags = new ObjectTags().add(EnumTag.WOOD, 8).add(EnumTag.PLANT, 2); + tags = new ObjectTags().add(EnumTag.WOOD, 6).add(EnumTag.EXCHANGE, 2); ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); itemStack = ItemInterface.getItem("peat"); @@ -362,11 +374,11 @@ public class CompatabilityManager itemStack = ItemInterface.getItem("tubes"); tags = new ObjectTags(ItemInterface.getItem("ingotCopper").itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); - ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.COPPER.ordinal(), tags); + //ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.COPPER.ordinal(), tags); tags = new ObjectTags(ItemInterface.getItem("ingotTin").itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); - ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.TIN.ordinal(), tags); + //ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.TIN.ordinal(), tags); tags = new ObjectTags(ItemInterface.getItem("ingotBronze").itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); - ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.BRONZE.ordinal(), tags); + //ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.BRONZE.ordinal(), tags); tags = new ObjectTags(Item.ingotIron.itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.IRON.ordinal(), tags); tags = new ObjectTags(Item.ingotGold.itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); @@ -391,20 +403,20 @@ public class CompatabilityManager { ItemStack itemStack; ObjectTags tags; + } + + private static void setupItemAspectsOreDict() + { - if ((itemStack = getExtraBeeItem("comb")) != null) - { - tags = new ObjectTags().add(EnumTag.INSECT, 2).add(EnumTag.TRAP, 2); - ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); - } } public static void setupResearch() { ObjectTags tags; - ResearchItem startNode = new ResearchItem("TBSTARTNODE", null, 10, 0, Config.miscResources.getStackForType(ResourceType.RESEARCH_StartNode)) - .setAutoUnlock() + tags = new ObjectTags().add(EnumTag.WOOD, 10).add(EnumTag.PLANT, 10).add(EnumTag.INSECT, 10); + ResearchItem startNode = new ResearchItem("TBSTARTNODE", tags, 10, 1, Config.miscResources.getStackForType(ResourceType.RESEARCH_StartNode)) + .setParents(ResearchList.getResearch("UTFT")) .registerResearchItem(); tags = new ObjectTags().add(EnumTag.INSECT, 9).add(EnumTag.MAGIC, 4).add(EnumTag.FLUX, 4); @@ -415,7 +427,7 @@ public class CompatabilityManager tags = new ObjectTags().add(EnumTag.INSECT, 15).add(EnumTag.MAGIC, 5).add(EnumTag.WATER, 5).add(EnumTag.EARTH, 5) .add(EnumTag.WIND, 5).add(EnumTag.FIRE, 5); ResearchItem beeInfusion = new ResearchItem("BEEINFUSION", tags, 5, 3, Config.miscResources.getStackForType(ResourceType.RESEARCH_BeeInfusion)) - .setParents(starkHint, ResearchList.getResearch("UTFT")).setHidden() + .setParents(starkHint).setHidden() .registerResearchItem(); tags = new ObjectTags().add(EnumTag.CROP, 20).add(EnumTag.EARTH, 20).add(EnumTag.WATER, 5); @@ -423,7 +435,7 @@ public class CompatabilityManager .setParents(startNode) .registerResearchItem(); - tags = new ObjectTags().add(EnumTag.WOOD, 10).add(EnumTag.TOOL, 6).add(EnumTag.INSECT, 15).add(EnumTag.BEAST, 2) + tags = new ObjectTags().add(EnumTag.TOOL, 6).add(EnumTag.INSECT, 15).add(EnumTag.BEAST, 2) .add(EnumTag.MAGIC, 5); ResearchItem magicFrame = new ResearchItem("HIVEFRAME", tags, 10, -2, Config.hiveFrameMagic) .setParents(startNode) @@ -457,6 +469,21 @@ public class CompatabilityManager ResearchItem temporalFrame = new ResearchItem("HIVEFRAMETIME", tags, 9, -5, Config.hiveFrameTemporal) .setParents(magicFrame).setHidden() .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.VOID, 15).add(EnumTag.CRYSTAL, 8).add(EnumTag.ELDRITCH, 8).add(EnumTag.EXCHANGE, 15); + ResearchItem voidCapsule = new ResearchItem("VOIDCAPSULE", tags, 10, 9, Config.voidCapsule) + .setParents(startNode, ResearchList.getResearch("PORTABLEHOLE")).setHidden() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.WOOD, 8).add(EnumTag.INSECT, 10).add(EnumTag.TOOL, 6).add(EnumTag.MAGIC, 6); + ResearchItem scoop = new ResearchItem("THAUMIUMSCOOP", tags, 0, -3, Config.thaumiumScoop) + .setParents(ResearchList.getResearch("THAUMIUM")) + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.WOOD, 16).add(EnumTag.PLANT, 20).add(EnumTag.TOOL, 6).add(EnumTag.MAGIC, 6); + ResearchItem grafter = new ResearchItem("THAUMIUMGRAFTER", tags, 0, -4, Config.thaumiumGrafter) + .setParents(scoop) + .registerResearchItem(); } public static void registerResearch() diff --git a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java index 67489b8..c1d11b7 100644 --- a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java +++ b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java @@ -6,17 +6,18 @@ import thaumcraft.api.ThaumcraftApi; import thaumicbees.bees.Allele; import thaumicbees.bees.BeeGenomeManager; import thaumicbees.bees.BeeSpecies; -import thaumicbees.compat.ShapelessBeeInfusionCraftingRecipe; -import thaumicbees.compat.ThaumcraftHelper; import thaumicbees.item.ItemCapsule; import thaumicbees.item.types.CombType; import thaumicbees.item.types.DropType; import thaumicbees.item.types.HiveFrameType; import thaumicbees.item.types.LiquidType; +import thaumicbees.item.types.PlankType; import thaumicbees.item.types.PropolisType; import thaumicbees.item.types.ResourceType; import thaumicbees.item.types.WaxType; import thaumicbees.main.Config; +import thaumicbees.main.utils.compat.ShapelessBeeInfusionCraftingRecipe; +import thaumicbees.main.utils.compat.ThaumcraftHelper; import cpw.mods.fml.common.registry.GameRegistry; import forestry.api.apiculture.BeeManager; import forestry.api.apiculture.EnumBeeChromosome; @@ -37,10 +38,35 @@ public class CraftingManager { public static void setupCrafting() { - ItemStack inputStack; // Variable to hold forestry items + // Broken up into seperate sections to make things a bit easier to find. + setupVanillaCrafting(); + setupCentrifugeRecipes(); + setupSqueezerRecipes(); + setupCarpenterRecipes(); + setupThaumcraftCrafting(); + + registerLiquidContainer(Config.magicCapsule); + registerLiquidContainer(Config.voidCapsule); + } + + private static void setupVanillaCrafting() + { + ItemStack input; + ItemStack output; + + // Slabs + for (int i = 0; i < PlankType.values().length; ++i) + { + input = new ItemStack(Config.planksWood, 1, i); + output = new ItemStack(Config.slabWoodHalf, 6, i); + GameRegistry.addRecipe(output, new Object[] { + "PPP", + 'P', input + }); + } // Essentia bottles - ItemStack output = new ItemStack(Config.tcEssentiaBottle); + output = new ItemStack(Config.tcEssentiaBottle); output.stackSize = 8; GameRegistry.addRecipe(output, new Object[] { " C ", "GPG", "PGP", @@ -79,17 +105,17 @@ public class CraftingManager }); // Concentrated Fertilizer -> Forestry fertilizer - inputStack = Config.miscResources.getStackForType(ResourceType.EXTENDED_FERTILIZER); + input = Config.miscResources.getStackForType(ResourceType.EXTENDED_FERTILIZER); output = ItemInterface.getItem("fertilizerCompound"); output.stackSize = 6; GameRegistry.addRecipe(output, new Object[] { " S ", " F ", " S ", - 'F', inputStack, + 'F', input, 'S', Block.sand }); GameRegistry.addRecipe(output, new Object[] { " ", "SFS", " ", - 'F', inputStack, + 'F', input, 'S', Block.sand }); @@ -97,7 +123,7 @@ public class CraftingManager output.stackSize = 12; GameRegistry.addRecipe(output, new Object[] { "aaa", "aFa", "aaa", - 'F', inputStack, + 'F', input, 'a', ItemInterface.getItem("ash") }); @@ -121,7 +147,10 @@ public class CraftingManager }); } } - + } + + private static void setupCentrifugeRecipes() + { // 20 is the 'average' time to centrifuge a comb. RecipeManagers.centrifugeManager.addRecipe(20, Config.combs.getStackForType(CombType.OCCULT), new ItemStack[] {Config.wax.getStackForType(WaxType.MAGIC), ItemInterface.getItem("honeyDrop") }, @@ -152,7 +181,7 @@ public class CraftingManager new int[] { 100, 50, 65 }); RecipeManagers.centrifugeManager.addRecipe(20, Config.combs.getStackForType(CombType.INTELLECT), new ItemStack[] { Config.wax.getStackForType(WaxType.MAGIC), ItemInterface.getItem("honeydew"), Config.drops.getStackForType(DropType.INTELLECT) }, - new int[] { 90, 40, 2 }); + new int[] { 90, 40, 10 }); RecipeManagers.centrifugeManager.addRecipe(20, Config.combs.getStackForType(CombType.SKULKING), new ItemStack[] {ItemInterface.getItem("beeswax"), ItemInterface.getItem("propolis"), ItemInterface.getItem("honeydew") }, new int[] { 90, 20, 35 }); @@ -175,7 +204,10 @@ public class CraftingManager RecipeManagers.centrifugeManager.addRecipe(8, Config.propolis.getStackForType(PropolisType.INFUSED), new ItemStack[] {new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal())}, new int[] { 10 }); - + } + + private static void setupSqueezerRecipes() + { // Squeezer recipes RecipeManagers.squeezerManager.addRecipe(20, new ItemStack[] {Config.propolis.getStackForType(PropolisType.FIRE) }, new LiquidStack(Block.lavaStill, 250), @@ -183,15 +215,21 @@ public class CraftingManager RecipeManagers.squeezerManager.addRecipe(20, new ItemStack[] {Config.propolis.getStackForType(PropolisType.WATER) }, new LiquidStack(Block.waterStill, 500), new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.WATER.ordinal()), 18); + } + private static void setupCarpenterRecipes() + { + ItemStack input; + ItemStack output; + // Carpenter recipes - inputStack = ItemInterface.getItem("craftingMaterial"); - inputStack.setItemDamage(3); // Set to Silk Mesh + input = ItemInterface.getItem("craftingMaterial"); + input.setItemDamage(3); // Set to Silk Mesh output = new ItemStack(Config.thaumaturgeBackpackT2); RecipeManagers.carpenterManager.addRecipe(200, new LiquidStack(Block.waterStill.blockID, 1000), null, output, new Object[] { "WXW", "WTW", "WWW", 'X', Item.diamond, - 'W', inputStack, + 'W', input, 'T', new ItemStack(Config.thaumaturgeBackpackT1) }); @@ -205,12 +243,12 @@ public class CraftingManager output = BlockInterface.getBlock("candle"); output.stackSize = 6; - inputStack = ItemInterface.getItem("craftingMaterial"); - inputStack.setItemDamage(2); // Set to Silk Wisp + input = ItemInterface.getItem("craftingMaterial"); + input.setItemDamage(2); // Set to Silk Wisp RecipeManagers.carpenterManager.addRecipe(30, new LiquidStack(Block.waterStill, 600), null, output, new Object[] { "WSW", 'W', Config.wax, - 'S', inputStack + 'S', input }); output = Config.miscResources.getStackForType(ResourceType.AROMATIC_LUMP, 2); @@ -227,22 +265,51 @@ public class CraftingManager 'J', ItemInterface.getItem("royalJelly"), 'D', Config.drops.getStackForType(DropType.ENCHANTED) }); - // Make Aromatic Lumps a swarmer inducer. Chance is /1000. - BeeManager.inducers.put(output, 80); + + output = new ItemStack(Config.planksWood, 4, 0); + RecipeManagers.carpenterManager.addRecipe(8, new LiquidStack(Block.waterStill, 500), null, output, new Object[] { + "B", + 'B', new ItemStack(Config.tcLog, 1, 0) + }); + + output = new ItemStack(Config.planksWood, 6, 1); + RecipeManagers.carpenterManager.addRecipe(8, new LiquidStack(Block.waterStill, 500), null, output, new Object[] { + "B", + 'B', new ItemStack(Config.tcLog, 1, 1) + }); + } + + private static void setupThaumcraftCrafting() + { + ItemStack input; + ItemStack output; + + ThaumcraftApi.addArcaneCraftingRecipe("THAUMIUMSCOOP", "THAUMIUMSCOOP", 45, new ItemStack(Config.thaumiumScoop), new Object[] { + "sWs", "sTs", " T ", + 's', Item.stick, + 'W', Block.cloth, + 'T', new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.THAUMIUM.ordinal()) + }); + + ThaumcraftApi.addArcaneCraftingRecipe("THAUMIUMGRAFTER", "THAUMIUMGRAFTER", 160, new ItemStack(Config.thaumiumGrafter), new Object[] { + " T", " T ", "s ", + 's', Item.stick, + 'T', new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.THAUMIUM.ordinal()) + }); output = Config.miscResources.getStackForType(ResourceType.EXTENDED_FERTILIZER); - ItemStack inputA = ItemInterface.getItem("apatite"); + input = ItemInterface.getItem("apatite"); ObjectTags tags = (new ObjectTags()).add(EnumTag.CROP, 12); output.stackSize = 2; ThaumcraftApi.addShapelessInfusionCraftingRecipe("FERTILIZER", "FERTILIZER", 5, tags, output, new Object[] { - inputA + input }); output = new ItemStack(Config.hiveFrameMagic); - inputA = ItemInterface.getItem("frameUntreated"); + input = ItemInterface.getItem("frameUntreated"); tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8); ThaumcraftApi.addShapelessInfusionCraftingRecipe("HIVEFRAME", "FRAMEMAGIC", 50, tags, output, new Object[] { - inputA + input }); output = new ItemStack(Config.hiveFrameResilient); @@ -257,7 +324,7 @@ public class CraftingManager tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8).add(EnumTag.HEAL, 12); ThaumcraftApi.addInfusionCraftingRecipe("HIVEFRAMEGENTLE", "FRAMEGENTLE", 50, tags, output, new Object[] { "www", "wFw", "www", - 'F', inputA, + 'F', input, 'w', ItemInterface.getItem("beeswax") }); @@ -267,16 +334,16 @@ public class CraftingManager .add(EnumTag.EXCHANGE, 8); ThaumcraftApi.addShapelessInfusionCraftingRecipe("HIVEFRAMEMETA", "FRAMEMETABOLIC", 50, tags, output, new Object[] { Item.magmaCream, - inputA + input }); output = new ItemStack(Config.hiveFrameNecrotic); tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8).add(EnumTag.EXCHANGE, 12).add(EnumTag.DEATH, 16) - .add(EnumTag.POISON, 4); + .add(EnumTag.POISON, 1); ThaumcraftApi.addInfusionCraftingRecipe("HIVEFRAMENECRO", "FRAMENECROTIC", 50, tags, output, new Object[] { " S ", "SxS", " S ", 'S', Item.rottenFlesh, - 'x', inputA + 'x', input }); output = new ItemStack(Config.hiveFrameTemporal); @@ -285,7 +352,17 @@ public class CraftingManager "tSt", "SFS", "tSt", 't', Item.stick, 'S', Block.sand, - 'F', inputA + 'F', input + }); + + output = Config.voidCapsule.getCapsuleForLiquid(LiquidType.EMPTY); + output.stackSize = 4; + tags = new ObjectTags().add(EnumTag.VOID, 16).add(EnumTag.ELDRITCH, 4).add(EnumTag.EXCHANGE, 8); + ThaumcraftApi.addInfusionCraftingRecipe("VOIDCAPSULE", "VOIDCAPSULE", 10, tags, output, new Object[] { + " G ", "GPG", "TGT", + 'G', Block.thinGlass, + 'P', Item.enderPearl, + 'T', Item.ingotIron }); ItemStack drone = BeeGenomeManager.getBeeNBTForSpecies(BeeSpecies.STARK, EnumBeeType.DRONE); @@ -332,8 +409,6 @@ public class CraftingManager ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION0", BeeSpecies.INFUSED.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal()) }, 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); - - registerLiquidContainer(Config.magicCapsule); } private static void registerLiquidContainer(ItemCapsule baseCapsule) diff --git a/thaumicbees_src/thaumicbees/main/utils/LocalizationManager.java b/thaumicbees_src/thaumicbees/main/utils/LocalizationManager.java new file mode 100644 index 0000000..b8d7c41 --- /dev/null +++ b/thaumicbees_src/thaumicbees/main/utils/LocalizationManager.java @@ -0,0 +1,38 @@ +package thaumicbees.main.utils; + +import net.minecraft.util.StringTranslate; +import thaumicbees.main.CommonProxy; +import cpw.mods.fml.common.registry.LanguageRegistry; + +public class LocalizationManager +{ + private enum Locale + { + en_US("en_US"), + ; + public String locale; + + private Locale(String loc) + { + this.locale = loc; + } + } + + public static void setupLocalizationInfo() + { + for (Locale l : Locale.values()) + { + LanguageRegistry.instance().loadLocalization(CommonProxy.TCBEES_LOCDIR + l.locale + ".xml", l.locale, true); + } + } + + public static String getLocalizedString(String key) + { + String result = LanguageRegistry.instance().getStringLocalization(key); + if (result.isEmpty()) + { + result = LanguageRegistry.instance().getStringLocalization(key, "en_US"); + } + return result; + } +} diff --git a/thaumicbees_src/thaumicbees/main/utils/MoonPhase.java b/thaumicbees_src/thaumicbees/main/utils/MoonPhase.java index 5bd7411..e7237bf 100644 --- a/thaumicbees_src/thaumicbees/main/utils/MoonPhase.java +++ b/thaumicbees_src/thaumicbees/main/utils/MoonPhase.java @@ -1,5 +1,6 @@ package thaumicbees.main.utils; +import cpw.mods.fml.common.registry.LanguageRegistry; import net.minecraft.world.World; /** @@ -7,14 +8,20 @@ import net.minecraft.world.World; */ public enum MoonPhase { - FULL, - WANING_GIBBOUS, - WANING_HALF, - WANING_CRESCENT, - NEW, - WAXING_CRESCENT, - WAXING_HALF, - WAXING_GIBBOUS; + FULL("full"), + WANING_GIBBOUS("gibbousWaning"), + WANING_HALF("halfWaning"), + WANING_CRESCENT("crescentWaning"), + NEW("new"), + WAXING_CRESCENT("crecentWaxing"), + WAXING_HALF("halfWaxing"), + WAXING_GIBBOUS("gibbousWaxing"); + + private String phaseName; + private MoonPhase(String name) + { + this.phaseName = name; + } public boolean isBetween(MoonPhase first, MoonPhase second) { @@ -35,6 +42,11 @@ public enum MoonPhase return flag; } + public String getName() + { + return LocalizationManager.getLocalizedString("tb.moon." + this.phaseName); + } + public static MoonPhase getMoonPhase(World w) { return MoonPhase.values()[(int)((w.getWorldTime() - 0) / 24000L) % 8]; diff --git a/thaumicbees_src/thaumicbees/compat/ForestryHelper.java b/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java similarity index 59% rename from thaumicbees_src/thaumicbees/compat/ForestryHelper.java rename to thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java index 16003f0..94d3617 100644 --- a/thaumicbees_src/thaumicbees/compat/ForestryHelper.java +++ b/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java @@ -1,6 +1,8 @@ -package thaumicbees.compat; +package thaumicbees.main.utils.compat; import net.minecraft.item.Item; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; import forestry.api.core.ItemInterface; import thaumicbees.main.Config; @@ -92,4 +94,44 @@ public class ForestryHelper LAPIS, ; } + + public static EnumTemperature getEnumTemperatureFromValue(float rawTemp) + { + EnumTemperature value = EnumTemperature.ICY; + + if (rawTemp >= 2.0f) + { + value = EnumTemperature.HOT; + } + else if (rawTemp >= 1.2f) + { + value = EnumTemperature.WARM; + } + else if (rawTemp >= 0.2f) + { + value = EnumTemperature.NORMAL; + } + else if (rawTemp >= 0.05f) + { + value = EnumTemperature.COLD; + } + + return value; + } + + public static EnumHumidity getEnumHumidityFromValue(float rawHumidity) + { + EnumHumidity value = EnumHumidity.ARID; + + if (rawHumidity >= 0.9f) + { + value = EnumHumidity.DAMP; + } + else if (rawHumidity >= 0.3f) + { + value = EnumHumidity.NORMAL; + } + + return value; + } } diff --git a/thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java b/thaumicbees_src/thaumicbees/main/utils/compat/ShapelessBeeInfusionCraftingRecipe.java similarity index 99% rename from thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java rename to thaumicbees_src/thaumicbees/main/utils/compat/ShapelessBeeInfusionCraftingRecipe.java index b5c98b9..dd484aa 100644 --- a/thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java +++ b/thaumicbees_src/thaumicbees/main/utils/compat/ShapelessBeeInfusionCraftingRecipe.java @@ -1,4 +1,4 @@ -package thaumicbees.compat; +package thaumicbees.main.utils.compat; import java.util.ArrayList; import java.util.Arrays; diff --git a/thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java b/thaumicbees_src/thaumicbees/main/utils/compat/ThaumcraftHelper.java similarity index 95% rename from thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java rename to thaumicbees_src/thaumicbees/main/utils/compat/ThaumcraftHelper.java index f95564e..f0c6da9 100644 --- a/thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java +++ b/thaumicbees_src/thaumicbees/main/utils/compat/ThaumcraftHelper.java @@ -1,4 +1,4 @@ -package thaumicbees.compat; +package thaumicbees.main.utils.compat; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -104,7 +104,14 @@ public class ThaumcraftHelper { GREATWOOD_SAPLING, SILVERWOOD_SAPLING, - SILVERLEAF, + SHIMMERLEAF, CINDERPEARL; } + + public enum TreeType + { + GREATWOOD, + SILVERWOOD, + ; + } } From d3e93188c01d344f11ba60be3867046044e83cba Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Mon, 4 Mar 2013 13:09:50 -0800 Subject: [PATCH 3/4] Edits to build.xml & mod info. --- thaumicbees_res/build.xml | 13 ++++++------- thaumicbees_res/mcmod.info | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/thaumicbees_res/build.xml b/thaumicbees_res/build.xml index 2689bc4..cec0927 100644 --- a/thaumicbees_res/build.xml +++ b/thaumicbees_res/build.xml @@ -74,15 +74,19 @@ + - + + + + @@ -120,6 +124,7 @@ + @@ -134,12 +139,6 @@ - - diff --git a/thaumicbees_res/mcmod.info b/thaumicbees_res/mcmod.info index c7f4d96..c22ecf5 100644 --- a/thaumicbees_res/mcmod.info +++ b/thaumicbees_res/mcmod.info @@ -1,6 +1,7 @@ [ { "modid": "ThaumicBees", + "version": @MODVERSION@ "name": "ThaumicBees", "url": "http://bit.ly/XFDvLY", "description": "Crossover mod for Forestry and Thaumcraft. Magic bees & more.", From f21bd467c24ec069ea77718c531ad6b6b1002eb0 Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Mon, 4 Mar 2013 13:10:21 -0800 Subject: [PATCH 4/4] Uncommenting blocks in Config. --- thaumicbees_src/thaumicbees/main/Config.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thaumicbees_src/thaumicbees/main/Config.java b/thaumicbees_src/thaumicbees/main/Config.java index 489c7bc..d6e786a 100644 --- a/thaumicbees_src/thaumicbees/main/Config.java +++ b/thaumicbees_src/thaumicbees/main/Config.java @@ -163,8 +163,8 @@ public class Config blockIdBase++; // Stair - /*magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase++).getInt()); - GameRegistry.registerBlock(magicApiary, "tb.magicApiary");*/ + magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase++).getInt()); + GameRegistry.registerBlock(magicApiary, "tb.magicApiary"); } public void registerTileEntities()