From 5a2f360e50a2fdbce4655ed713c151eb6de01aae Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Sat, 9 Feb 2013 14:12:43 -0800 Subject: [PATCH] Another FC build. *Heavily refactored bee code. Much cleaner now I think. *Temporal bee branch complete, now with more Doctor Who! --- thaumicbees_res/build.number | 4 +- .../gfx/thaumicbees/gui/apiary.png | Bin 0 -> 53862 bytes .../gfx/thaumicbees/items/items.png | Bin 60455 -> 62011 bytes thaumicbees_res/mcmod.info | 2 +- .../research/thaumicbees/research.xml | 10 + thaumicbees_src/thaumicbees/bees/Allele.java | 96 ++++ .../bees/{genetics => }/AlleleEffect.java | 2 +- .../AlleleEffectAuraNodeGrow.java | 6 +- .../bees/{genetics => }/AlleleEffectCure.java | 2 +- .../{genetics => }/AlleleEffectPotion.java | 2 +- .../{genetics => }/AlleleEffectSpawnMob.java | 2 +- .../{genetics => }/AlleleEffectSpawnWisp.java | 2 +- .../bees/{genetics => }/AlleleFlower.java | 2 +- .../bees/{genetics => }/AlleleInteger.java | 2 +- .../thaumicbees/bees/BeeClassification.java | 109 ++++ .../thaumicbees/bees/BeeGenomeManager.java | 108 ++-- .../bees/{genetics => }/BeeMutation.java | 86 +++- .../thaumicbees/bees/BeeSpecies.java | 380 ++++++++++++++ .../bees/{genetics => }/EffectData.java | 2 +- .../FlowerProviderAuraNode.java | 2 +- .../FlowerProviderAuraNodeFlux.java | 2 +- .../FlowerProviderAuraNodePurify.java | 2 +- .../FlowerProviderBookshelf.java | 2 +- .../FlowerProviderThaumcraftFlower.java | 2 +- .../thaumicbees/bees/TBBeeManager.java | 426 ---------------- .../thaumicbees/bees/genetics/Allele.java | 95 ---- .../thaumicbees/bees/genetics/BeeSpecies.java | 180 ------- .../thaumicbees/block/BlockMagicApiary.java | 31 +- .../compat/CompatabilityManager.java | 466 ++++++++++++++++++ .../thaumicbees/compat/ForestryHelper.java | 94 ++++ .../ShapelessBeeInfusionCraftingRecipe.java | 158 ++++++ .../thaumicbees/compat/ThaumcraftHelper.java | 110 +++++ .../thaumicbees/item/types/HiveFrameType.java | 4 +- .../thaumicbees/main/ClientProxy.java | 16 + thaumicbees_src/thaumicbees/main/Config.java | 18 + .../thaumicbees/main/ThaumicBees.java | 15 +- .../main/utils/CraftingManager.java | 89 ++-- .../thaumicbees/main/utils/VersionInfo.java | 2 +- .../tile/TileEntityMagicApiary.java | 280 +++++++++++ 39 files changed, 2000 insertions(+), 811 deletions(-) create mode 100644 thaumicbees_res/gfx/thaumicbees/gui/apiary.png create mode 100644 thaumicbees_src/thaumicbees/bees/Allele.java rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffect.java (98%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffectAuraNodeGrow.java (90%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffectCure.java (97%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffectPotion.java (97%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffectSpawnMob.java (99%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleEffectSpawnWisp.java (98%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleFlower.java (94%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/AlleleInteger.java (90%) create mode 100644 thaumicbees_src/thaumicbees/bees/BeeClassification.java rename thaumicbees_src/thaumicbees/bees/{genetics => }/BeeMutation.java (50%) create mode 100644 thaumicbees_src/thaumicbees/bees/BeeSpecies.java rename thaumicbees_src/thaumicbees/bees/{genetics => }/EffectData.java (97%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/FlowerProviderAuraNode.java (98%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/FlowerProviderAuraNodeFlux.java (96%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/FlowerProviderAuraNodePurify.java (97%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/FlowerProviderBookshelf.java (97%) rename thaumicbees_src/thaumicbees/bees/{genetics => }/FlowerProviderThaumcraftFlower.java (98%) delete mode 100644 thaumicbees_src/thaumicbees/bees/TBBeeManager.java delete mode 100644 thaumicbees_src/thaumicbees/bees/genetics/Allele.java delete mode 100644 thaumicbees_src/thaumicbees/bees/genetics/BeeSpecies.java create mode 100644 thaumicbees_src/thaumicbees/compat/CompatabilityManager.java create mode 100644 thaumicbees_src/thaumicbees/compat/ForestryHelper.java create mode 100644 thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java create mode 100644 thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java create mode 100644 thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java diff --git a/thaumicbees_res/build.number b/thaumicbees_res/build.number index 17aca7a..39900b6 100644 --- a/thaumicbees_res/build.number +++ b/thaumicbees_res/build.number @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Sun Feb 03 17:05:53 PST 2013 -build.number=104 +#Sat Feb 09 14:11:48 PST 2013 +build.number=114 diff --git a/thaumicbees_res/gfx/thaumicbees/gui/apiary.png b/thaumicbees_res/gfx/thaumicbees/gui/apiary.png new file mode 100644 index 0000000000000000000000000000000000000000..01aa54ce1fc2006706aa53b13292c2dcebdae022 GIT binary patch literal 53862 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 literal 0 HcmV?d00001 diff --git a/thaumicbees_res/gfx/thaumicbees/items/items.png b/thaumicbees_res/gfx/thaumicbees/items/items.png index 538a993c2a2be47d6f8013d3fc98ef3a1154a08d..c9916a379d82f003bae78301bfba986310429db9 100644 GIT binary patch delta 28578 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 UE3Sw1w`l=GT~nQMZHFiS3%(fwD*ylh delta 27007 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 + +Temporal Frame +Why isn't it blue and boxy? +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. +FRAMETIME + + \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/bees/Allele.java b/thaumicbees_src/thaumicbees/bees/Allele.java new file mode 100644 index 0000000..4f98c65 --- /dev/null +++ b/thaumicbees_src/thaumicbees/bees/Allele.java @@ -0,0 +1,96 @@ +package thaumicbees.bees; + +import net.minecraft.potion.Potion; +import thaumicbees.compat.ThaumcraftHelper; +import forestry.api.apiculture.IAlleleBeeSpecies; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IAllele; + +public class Allele implements IAllele +{ + public static AlleleInteger fertilityHighDominant; + + public static AlleleFlower flowerBookshelf; + public static AlleleFlower flowerThaumcraft; + public static AlleleFlower flowerAuraNode; + public static AlleleFlower flowerNodePurify; + public static AlleleFlower flowerNodeFluxify; + + public static AlleleEffectCure cleansingEffect; + public static AlleleEffectPotion digSpeed; + public static AlleleEffectPotion moveSpeed; + public static AlleleEffectPotion slowSpeed; + public static AlleleEffectSpawnMob spawnBrainyZombie; + public static AlleleEffectSpawnMob spawnWisp; + public static AlleleEffectSpawnMob spawnBats; + public static AlleleEffectSpawnMob spawnGhast; + public static AlleleEffectAuraNodeGrow nodeGen; + + public static void setupAdditionalAlleles() + { + Allele.fertilityHighDominant = new AlleleInteger("fertilityHighDominant", 3, true); + + Allele.flowerBookshelf = new AlleleFlower("flowerBookshelf", new FlowerProviderBookshelf(), true); + Allele.flowerThaumcraft = new AlleleFlower("flowerThaumcraftPlant", new FlowerProviderThaumcraftFlower(), false); + Allele.flowerAuraNode = new AlleleFlower("flowerAuraNode", new FlowerProviderAuraNode(), true); + Allele.flowerNodePurify = new AlleleFlower("flowerAuraNodePurify", new FlowerProviderAuraNodePurify(), false); + 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.nodeGen = new AlleleEffectAuraNodeGrow("effectNodeGeneration", "Nodeify", false, 400); + + Allele.spawnBrainyZombie = new AlleleEffectSpawnMob("effectBrainy", false, "Brainy", 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.setThrottle(300).setSpawnsOnPlayerNear("Bat"); + + Allele.spawnWisp = new AlleleEffectSpawnWisp("effectWispy", false, "Wispy", ThaumcraftHelper.Entity.WISP.entityID); + Allele.spawnWisp.setThrottle(1800); + + Allele.spawnGhast = new AlleleEffectSpawnMob("Ghast", false, "Ghastly", "Ghast"); + Allele.spawnGhast.setThrottle(2000).setChanceToSpawn(20).setMaxMobsInSpawnZone(1); + } + + private String uid; + private boolean dominant; + + public static IAlleleBeeSpecies getBaseSpecies(String name) + { + return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele((new StringBuilder()).append("forestry.species").append(name).toString()); + } + + public static IAlleleBeeSpecies getExtraSpecies(String name) + { + return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele((new StringBuilder()).append("extrabees.species.").append(name).toString()); + } + + public static IAllele getBaseAllele(String name) + { + return AlleleManager.alleleRegistry.getAllele("forestry." + name); + } + + public Allele(String id, boolean isDominant) + { + this.uid = "thaumicbees." + id; + this.dominant = isDominant; + AlleleManager.alleleRegistry.registerAllele(this); + } + + @Override + public String getUID() + { + return this.uid; + } + + @Override + public boolean isDominant() + { + return this.dominant; + } + +} diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffect.java b/thaumicbees_src/thaumicbees/bees/AlleleEffect.java similarity index 98% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffect.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffect.java index 307be2c..79fc660 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffect.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffect.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.util.List; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectAuraNodeGrow.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java similarity index 90% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectAuraNodeGrow.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java index 9945d40..dcf3b0e 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectAuraNodeGrow.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectAuraNodeGrow.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.lang.reflect.Method; @@ -39,7 +39,7 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect if (value >= throttle) { World w = housing.getWorld(); - if (w.rand.nextInt(20) < 1) + if (w.rand.nextInt(15) < 1) { float x = housing.getXCoord(); float y = housing.getYCoord(); @@ -63,7 +63,7 @@ public class AlleleEffectAuraNodeGrow extends AlleleEffect y *= 0.0125f; z *= 0.0125f; - ThaumcraftApi.queueNodeChanges(nodeId, node.level * -3 / 8, w.rand.nextInt(1), false, null, x, y, z); + ThaumcraftApi.queueNodeChanges(nodeId, node.baseLevel * -3 / 10, w.rand.nextInt(1), false, null, x, y, z); } } } diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectCure.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java similarity index 97% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectCure.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java index 2ebebe9..f7a160e 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectCure.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectCure.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.util.List; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectPotion.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java similarity index 97% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectPotion.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java index 0bf2d48..cdf9f54 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectPotion.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectPotion.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.util.List; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnMob.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java similarity index 99% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnMob.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java index 249a2ac..c0799c1 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnMob.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnMob.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.util.List; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnWisp.java b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java similarity index 98% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnWisp.java rename to thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java index 918f328..41689cd 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleEffectSpawnWisp.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleEffectSpawnWisp.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import java.lang.reflect.Field; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleFlower.java b/thaumicbees_src/thaumicbees/bees/AlleleFlower.java similarity index 94% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleFlower.java rename to thaumicbees_src/thaumicbees/bees/AlleleFlower.java index 302ff39..bcef7be 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleFlower.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleFlower.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import forestry.api.apiculture.IAlleleFlowers; import forestry.api.apiculture.IFlowerProvider; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/AlleleInteger.java b/thaumicbees_src/thaumicbees/bees/AlleleInteger.java similarity index 90% rename from thaumicbees_src/thaumicbees/bees/genetics/AlleleInteger.java rename to thaumicbees_src/thaumicbees/bees/AlleleInteger.java index 04d8e20..ac5abb3 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/AlleleInteger.java +++ b/thaumicbees_src/thaumicbees/bees/AlleleInteger.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import forestry.api.genetics.IAlleleInteger; diff --git a/thaumicbees_src/thaumicbees/bees/BeeClassification.java b/thaumicbees_src/thaumicbees/bees/BeeClassification.java new file mode 100644 index 0000000..23b093e --- /dev/null +++ b/thaumicbees_src/thaumicbees/bees/BeeClassification.java @@ -0,0 +1,109 @@ +package thaumicbees.bees; + +import java.util.ArrayList; + +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", ""), + ; + + private String uID; + private String name; + private String scientific; + private String description; + private ArrayList species; + private IClassification parent; + private EnumClassLevel level; + + private BeeClassification(String name, String latin, String desc) + { + this.uID = "classification." + name.toLowerCase(); + this.name = name; + this.scientific = latin; + this.level = EnumClassLevel.GENUS; + this.description = desc; + this.species = new ArrayList(); + this.parent = AlleleManager.alleleRegistry.getClassification("family.apidae"); + AlleleManager.alleleRegistry.registerClassification(this); + } + + @Override + public EnumClassLevel getLevel() + { + return this.level; + } + + @Override + public String getUID() + { + return this.uID; + } + + @Override + public String getName() + { + return this.name; + } + + @Override + public String getScientific() + { + return this.scientific; + } + + @Override + public String getDescription() + { + return this.description; + } + + @Override + public IClassification[] getMemberGroups() + { + return null; + } + + @Override + public void addMemberGroup(IClassification group) + { + + } + + @Override + public IAlleleSpecies[] getMemberSpecies() + { + return this.species.toArray(new IAlleleSpecies[this.species.size()]); + } + + @Override + public void addMemberSpecies(IAlleleSpecies species) + { + if (!this.species.contains(species)) + { + this.species.add(species); + } + } + + @Override + public IClassification getParent() + { + return this.parent; + } + + @Override + public void setParent(IClassification parent) + { + this.parent = parent; + } + +} diff --git a/thaumicbees_src/thaumicbees/bees/BeeGenomeManager.java b/thaumicbees_src/thaumicbees/bees/BeeGenomeManager.java index 5e2abd5..eb1155a 100644 --- a/thaumicbees_src/thaumicbees/bees/BeeGenomeManager.java +++ b/thaumicbees_src/thaumicbees/bees/BeeGenomeManager.java @@ -1,8 +1,5 @@ package thaumicbees.bees; -import thaumicbees.bees.genetics.Allele; -import thaumicbees.bees.genetics.AlleleFlower; -import thaumicbees.bees.genetics.BeeSpecies; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -25,7 +22,7 @@ public class BeeGenomeManager { IAllele[] genome = new IAllele[EnumBeeChromosome.values().length]; - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Esoteric; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.ESOTERIC; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedSlowest"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanShorter"); genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); @@ -59,7 +56,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseArcane(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Esoteric; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.ESOTERIC; return genome; } @@ -68,7 +65,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseArcane(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Mysterious; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.MYSTERIOUS; genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth2"); return genome; @@ -78,7 +75,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseArcane(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Arcane; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.ARCANE; genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth2"); genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); genome[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.getBaseAllele("floweringAverage"); @@ -101,7 +98,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseSupernatural(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Charmed; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.CHARMED; return genome; } @@ -110,7 +107,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseSupernatural(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Enchanted; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.ENCHANTED; genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth1"); return genome; @@ -120,7 +117,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseSupernatural(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Supernatural; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.SUPERNATURAL; genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth2"); genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth1"); @@ -145,7 +142,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseScholarly(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Pupil; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.PUPIL; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedSlower"); return genome; @@ -155,7 +152,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseScholarly(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Scholarly; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.SCHOLARLY; genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityLow"); return genome; @@ -165,7 +162,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseScholarly(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Savant; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.SAVANT; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedNorm"); genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityLow"); @@ -186,7 +183,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Stark; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.STARK; genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); return genome; @@ -196,7 +193,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Air; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.AIR; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedFastest"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanShortened"); genome[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.getBaseAllele("territoryLargest"); @@ -211,7 +208,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Fire; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.FIRE; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedFaster"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanNormal"); genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceDown3"); @@ -226,7 +223,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Water; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.WATER; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedFast"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanLong"); genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceDown2"); @@ -241,7 +238,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Earth; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.EARTH; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedSlow"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanLonger"); genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceDown1"); @@ -257,7 +254,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseElemental(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Infused; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.INFUSED; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedNorm"); genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanNormal"); @@ -279,7 +276,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseVis(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Aware; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.AWARE; genome[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowerThaumcraft; return genome; @@ -289,7 +286,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseVis(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Vis; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.VIS; genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedSlow"); genome[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.getBaseAllele("floweringSlower"); genome[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowerAuraNode; @@ -301,7 +298,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseVis(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Pure; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.PURE; genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceNone"); genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceNone"); genome[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.getBaseAllele("floweringAverage"); @@ -314,7 +311,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseVis(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Flux; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.FLUX; genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceNone"); genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceNone"); genome[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowerNodeFluxify; @@ -326,7 +323,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseVis(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Node; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.NODE; genome[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.getBaseAllele("floweringSlowest"); genome[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowerAuraNode; genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.nodeGen; @@ -350,7 +347,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Skulking; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.SKULKING; genome[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.getBaseAllele("boolTrue"); genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); @@ -361,7 +358,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Brainy; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.BRAINY; genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.spawnBrainyZombie; genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityLow"); @@ -372,7 +369,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Gossamer; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.GOSSAMER; genome[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.getBaseAllele("boolTrue"); genome[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowerThaumcraft; @@ -383,7 +380,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Wispy; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.WISPY; genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.spawnWisp; genome[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.getBaseAllele("boolTrue"); genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityLow"); @@ -396,7 +393,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Batty; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.BATTY; genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.spawnBats; genome[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.getBaseAllele("territoryLarge"); @@ -407,7 +404,7 @@ public class BeeGenomeManager { IAllele[] genome = getTemplateBaseMalevolent(); - genome[EnumBeeChromosome.SPECIES.ordinal()] = Allele.Ghastly; + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.GHASTLY; genome[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.getBaseAllele("boolTrue"); genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth1"); genome[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.getBaseAllele("boolTrue"); @@ -417,6 +414,57 @@ public class BeeGenomeManager return genome; } + + private static IAllele[] getTemplateBaseTemporal() + { + IAllele[] genome = getTemplateBaseThaumic(); + + genome[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth1"); + genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); + genome[EnumBeeChromosome.SPEED.ordinal()] = Allele.getBaseAllele("speedNorm"); + genome[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.getBaseAllele("boolTrue"); + + return genome; + } + + public static IAllele[] getTemplateTimely() + { + IAllele[] genome = getTemplateBaseTemporal(); + + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.TIMELY; + genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.slowSpeed; + genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanElongated"); + + return genome; + } + + public static IAllele[] getTemplateLordly() + { + IAllele[] genome = getTemplateBaseTemporal(); + + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.LORDLY; + genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.slowSpeed; + genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanLong"); + genome[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.getBaseAllele("boolTrue"); + genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.getBaseAllele("effectDrunkard"); + + return genome; + } + + public static IAllele[] getTemplateDoctoral() + { + IAllele[] genome = getTemplateBaseTemporal(); + + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.DOCTORAL; + genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.slowSpeed; + genome[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.getBaseAllele("toleranceBoth3"); + genome[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.getBaseAllele("territoryLarge"); + genome[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.getBaseAllele("boolTrue"); + genome[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.getBaseAllele("lifespanLongest"); + genome[EnumBeeChromosome.EFFECT.ordinal()] = Allele.getBaseAllele("effectHeroic"); + + return genome; + } public static ItemStack getBeeNBTForSpecies(BeeSpecies species, EnumBeeType beeType) { diff --git a/thaumicbees_src/thaumicbees/bees/genetics/BeeMutation.java b/thaumicbees_src/thaumicbees/bees/BeeMutation.java similarity index 50% rename from thaumicbees_src/thaumicbees/bees/genetics/BeeMutation.java rename to thaumicbees_src/thaumicbees/bees/BeeMutation.java index eb7569b..b9b5f9c 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/BeeMutation.java +++ b/thaumicbees_src/thaumicbees/bees/BeeMutation.java @@ -1,18 +1,20 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import forestry.api.apiculture.*; import forestry.api.genetics.IAllele; import forestry.api.genetics.IGenome; import java.util.ArrayList; +import cpw.mods.fml.common.FMLLog; + import thaumcraft.api.AuraNode; import thaumcraft.api.EnumNodeType; import thaumcraft.api.ThaumcraftApi; +import thaumicbees.main.ThaumicBees; import thaumicbees.main.utils.MoonPhase; public class BeeMutation implements IBeeMutation { - public static BeeMutation Esoteric; public static BeeMutation Esoteric1; public static BeeMutation Mysterious; @@ -38,13 +40,91 @@ public class BeeMutation implements IBeeMutation public static BeeMutation Wispy; public static BeeMutation Batty; public static BeeMutation Ghastly; + public static BeeMutation Timely; + public static BeeMutation Lordly; + public static BeeMutation Doctoral; + + public static void setupMutations() + { + BeeMutation.Esoteric = new BeeMutation(Allele.getBaseSpecies("Imperial"), Allele.getBaseSpecies("Demonic"), BeeSpecies.ESOTERIC, 10); + BeeMutation.Esoteric1 = new BeeMutation(Allele.getBaseSpecies("Heroic"), Allele.getBaseSpecies("Demonic"), BeeSpecies.ESOTERIC, 25); + BeeMutation.Mysterious = new BeeMutation(BeeSpecies.ESOTERIC, Allele.getBaseSpecies("Ended"), BeeSpecies.MYSTERIOUS, 10); + BeeMutation.Arcane = new BeeMutation(BeeSpecies.ESOTERIC, BeeSpecies.MYSTERIOUS, BeeSpecies.ARCANE, 8) + .setMoonPhaseBonus(MoonPhase.WANING_CRESCENT, MoonPhase.WAXING_CRESCENT, 1.5f); + BeeMutation.Charmed = new BeeMutation(Allele.getBaseSpecies("Diligent"), Allele.getBaseSpecies("Valiant"), BeeSpecies.CHARMED, 20); + BeeMutation.Enchanted = new BeeMutation(BeeSpecies.CHARMED, Allele.getBaseSpecies("Valiant"), BeeSpecies.ENCHANTED, 8); + BeeMutation.Supernatural = new BeeMutation(BeeSpecies.CHARMED, BeeSpecies.ENCHANTED, BeeSpecies.SUPERNATURAL, 10) + .setMoonPhaseBonus(MoonPhase.WAXING_GIBBOUS, MoonPhase.WANING_GIBBOUS, 1.5f); + BeeMutation.Pupil = new BeeMutation(BeeSpecies.ARCANE, BeeSpecies.ENCHANTED, BeeSpecies.PUPIL, 10); + BeeMutation.Scholarly = new BeeMutation(BeeSpecies.PUPIL, BeeSpecies.ARCANE, BeeSpecies.SCHOLARLY, 8); + BeeMutation.Savant = new BeeMutation(BeeSpecies.PUPIL, BeeSpecies.SCHOLARLY, BeeSpecies.SAVANT, 6); + BeeMutation.Stark = new BeeMutation(BeeSpecies.ARCANE, BeeSpecies.SUPERNATURAL, BeeSpecies.STARK, 8); + + BeeMutation.Aware = new BeeMutation(Allele.getBaseSpecies("Demonic"), Allele.getBaseSpecies("Edenic"), BeeSpecies.AWARE, 12); + BeeMutation.Vis = new BeeMutation(BeeSpecies.AWARE, BeeSpecies.ARCANE, BeeSpecies.VIS, 9) + .setAuraNodeRequired(40); + BeeMutation.Vis1 = new BeeMutation(BeeSpecies.AWARE, BeeSpecies.STARK, BeeSpecies.VIS, 12) + .setAuraNodeRequired(80); + + BeeMutation.Pure = new BeeMutation(BeeSpecies.VIS, Allele.getBaseSpecies("Edenic"), BeeSpecies.PURE, 7) + .setAuraNodeTypeRequired(5, EnumNodeType.PURE).setMoonPhaseBonus(MoonPhase.NEW, MoonPhase.NEW, 1.6f); + BeeMutation.Flux = new BeeMutation(BeeSpecies.VIS, Allele.getBaseSpecies("Edenic"), BeeSpecies.FLUX, 7) + .setAuraNodeTypeRequired(30, EnumNodeType.UNSTABLE).setMoonPhaseBonus(MoonPhase.FULL, MoonPhase.FULL, 1.6f); + + BeeMutation.Node = new BeeMutation(BeeSpecies.VIS, BeeSpecies.VIS, BeeSpecies.NODE, 2) + .setAuraNodeRequired(4).setMoonPhaseRestricted(MoonPhase.WANING_HALF, MoonPhase.WANING_HALF); + BeeMutation.Node1 = new BeeMutation(BeeSpecies.VIS, BeeSpecies.VIS, BeeSpecies.NODE, 2) + .setAuraNodeRequired(4).setMoonPhaseRestricted(MoonPhase.WAXING_HALF, MoonPhase.WAXING_HALF); + + // Now we get into a little bit of branching... + if (ThaumicBees.getConfig().ExtraBeesInstalled) + { + setupMutationsExtraBeesBase(); + } + else + { + setupMutationsForestryBase(); + } + BeeMutation.Gossamer.setMoonPhaseRestricted(MoonPhase.FULL, MoonPhase.WANING_CRESCENT); + BeeMutation.Wispy = new BeeMutation(BeeSpecies.GOSSAMER, Allele.getBaseSpecies("Cultivated"), BeeSpecies.WISPY, 8); + + BeeMutation.Timely = new BeeMutation(Allele.getBaseSpecies("Industrious"), BeeSpecies.ENCHANTED, BeeSpecies.TIMELY, 10); + BeeMutation.Lordly = new BeeMutation(BeeSpecies.TIMELY, Allele.getBaseSpecies("Imperial"), BeeSpecies.LORDLY, 9); + BeeMutation.Doctoral = new BeeMutation(BeeSpecies.TIMELY, BeeSpecies.LORDLY, BeeSpecies.DOCTORAL, 7); + } + + private static void setupMutationsExtraBeesBase() + { + try + { + BeeMutation.Skulking = new BeeMutation(BeeSpecies.MYSTERIOUS, Allele.getExtraSpecies("desolate"), BeeSpecies.SKULKING, 10); + BeeMutation.Brainy = new BeeMutation(BeeSpecies.SKULKING, Allele.getExtraSpecies("rotten"), BeeSpecies.BRAINY, 12); + BeeMutation.Gossamer = new BeeMutation(BeeSpecies.SKULKING, Allele.getExtraSpecies("ancient"), BeeSpecies.GOSSAMER, 10); + BeeMutation.Batty = new BeeMutation(BeeSpecies.SKULKING, Allele.getExtraSpecies("rock"), BeeSpecies.BATTY, 14); + BeeMutation.Ghastly = new BeeMutation(BeeSpecies.SKULKING, Allele.getExtraSpecies("creeper"), BeeSpecies.GHASTLY, 13); + } + catch (Exception e) + { + FMLLog.warning("ThaumicBees encountered an error attempting to register mutations using Extra Bees species! Ensure Extra Bees was able to initialize correctly!"); + FMLLog.info("Could not use Extra Bees species for mutations. Falling back to Forestry defaults."); + setupMutationsForestryBase(); + } + } + + private static void setupMutationsForestryBase() + { + BeeMutation.Skulking = new BeeMutation(BeeSpecies.MYSTERIOUS, Allele.getBaseSpecies("Modest"), BeeSpecies.SKULKING, 10); + BeeMutation.Brainy = new BeeMutation(BeeSpecies.SKULKING, Allele.getBaseSpecies("Sinister"), BeeSpecies.BRAINY, 10); + BeeMutation.Gossamer = new BeeMutation(BeeSpecies.SKULKING, BeeSpecies.SUPERNATURAL, BeeSpecies.GOSSAMER, 10); + BeeMutation.Batty = new BeeMutation(BeeSpecies.SKULKING, Allele.getBaseSpecies("Frugal"), BeeSpecies.BATTY, 11); + BeeMutation.Ghastly = new BeeMutation(BeeSpecies.SKULKING, Allele.getBaseSpecies("Austere"), BeeSpecies.GHASTLY, 13); + } private IAllele parent1; private IAllele parent2; private IAllele mutationTemplate[]; private int baseChance; private boolean isSecret; - private boolean isMoonRestricted; private MoonPhase moonPhaseStart; private MoonPhase moonPhaseEnd; diff --git a/thaumicbees_src/thaumicbees/bees/BeeSpecies.java b/thaumicbees_src/thaumicbees/bees/BeeSpecies.java new file mode 100644 index 0000000..2d20d93 --- /dev/null +++ b/thaumicbees_src/thaumicbees/bees/BeeSpecies.java @@ -0,0 +1,380 @@ +package thaumicbees.bees; + +import forestry.api.apiculture.*; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; +import forestry.api.core.ItemInterface; +import forestry.api.genetics.*; +import forestry.api.genetics.IClassification.EnumClassLevel; + +import java.util.HashMap; + +import thaumicbees.compat.ForestryHelper; +import thaumicbees.compat.ThaumcraftHelper; +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 net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; +import net.minecraft.world.World; + +public enum BeeSpecies implements IAlleleBeeSpecies +{ + ESOTERIC("Esoteric", "An unusual crossbreed which seems to have magical properties.|Apinomicon", "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", + BeeClassification.ARCANE, 0x762bc2, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), + ARCANE("Arcane", "\"Their produce is charged with magic.\"|Azanor, Master Thaumaturge", "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", + 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", + BeeClassification.SUPERNATURAL, 0x18e726, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), + SUPERNATURAL("Supernatural", "These bees walk the line between this world and the unseen.|Apinomicon", "coeleste", + BeeClassification.SUPERNATURAL, 0x005614, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), + PUPIL("Pupil", "\"What does that bee want with my paper?!|Yorae, Librarian", "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", + 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", + 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", + BeeClassification.THAUMIC, 0xCCCCCC, 0x999999, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), + AIR("Aura", "\"They work so fast it's breathtaking.\"|Sengir, Mad Apiarist", "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", + 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", + 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", + BeeClassification.THAUMIC, 0x005100, 0x00a000, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), + INFUSED("Praecantatio", "Beekeeping is magic!|Apinomicon, Preface", "azanorius", + BeeClassification.THAUMIC, 0xaa32fc, 0x7A489E, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), + AWARE("Aware", "\"They can see into your soul!\"|Florastar, Expert Beekeeper", "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", + BeeClassification.VIS, 0x004c99, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), + PURE("Pure", "\"It's like a bee janitor!\"|MysteriousAges, Thaumaturge", "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", + 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", + BeeClassification.VIS, 0xFFF266, 0xFF8CE9, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), + SKULKING("Skulking", "These bees have become xenophobic and bad-tempered. Use caution.|Apinomicon", "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", + 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", + 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", + 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", + BeeClassification.SKULKING, 0x27350d, 0xe15236, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false,true), + GHASTLY("Ghastly", "\"*sigh*... Really, Myst?\"|Taveria", "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", + BeeClassification.TIME, 0xC6AF86, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, true), + LORDLY("Lordly", "", "rassilonis", + BeeClassification.TIME, 0xC6AF86, 0x8E0213, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), + DOCTORAL("Doctoral", "\"Would you like a Jelly Baby?\"", "medicus qui", + BeeClassification.TIME, 0xDDE5FC, 0x4B6E8C, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), + ; + + public static void setupBeeSpecies() + { + ESOTERIC.addProduct(Config.combs.getStackForType(CombType.OCCULT), 20) + .setGenome(BeeGenomeManager.getTemplateEsoteric()) + .register(); + MYSTERIOUS.addProduct(Config.combs.getStackForType(CombType.OCCULT), 25) + .setGenome(BeeGenomeManager.getTemplateMysterious()) + .register(); + ARCANE.addProduct(Config.combs.getStackForType(CombType.OCCULT), 30) + .addSpecialty(Config.drops.getStackForType(DropType.ENCHANTED, 1), 9) + .setGenome(BeeGenomeManager.getTemplateArcane()) + .register(); + CHARMED.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 20) + .setGenome(BeeGenomeManager.getTemplateCharmed()) + .register(); + ENCHANTED.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 30) + .setGenome(BeeGenomeManager.getTemplateEnchanted()) + .register(); + SUPERNATURAL.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 40) + .addSpecialty(Config.pollen.getStackForType(PollenType.UNUSUAL), 8) + .setGenome(BeeGenomeManager.getTemplateSupernatural()) + .register(); + PUPIL.addProduct(Config.combs.getStackForType(CombType.PAPERY), 20) + .setGenome(BeeGenomeManager.getTemplatePupil()) + .register(); + SCHOLARLY.addProduct(Config.combs.getStackForType(CombType.PAPERY), 25) + .addSpecialty(Config.miscResources.getStackForType(ResourceType.LORE_FRAGMENT), 2) + .setGenome(BeeGenomeManager.getTemplateScholarly()) + .register(); + SAVANT.addProduct(Config.combs.getStackForType(CombType.PAPERY), 40) + .addSpecialty(Config.miscResources.getStackForType(ResourceType.LORE_FRAGMENT), 5) + .setGenome(BeeGenomeManager.getTemplateSavant()) + .register(); + STARK.addProduct(Config.combs.getStackForType(CombType.STARK), 10) + .setGenome(BeeGenomeManager.getTemplateStark()) + .register(); + AIR.addProduct(Config.combs.getStackForType(CombType.AIRY), 9) + .addSpecialty(new ItemStack(Config.tcNuggets, 1, ThaumcraftHelper.NuggetType.QUICKSILVER.ordinal()), 8) + .setGenome(BeeGenomeManager.getTemplateAir()) + .register(); + FIRE.addProduct(Config.combs.getStackForType(CombType.FIREY), 15) + .addSpecialty(new ItemStack(Item.blazePowder), 8) + .setGenome(BeeGenomeManager.getTemplateFire()) + .register(); + WATER.addProduct(Config.combs.getStackForType(CombType.WATERY), 20) + .addSpecialty(new ItemStack(Block.ice), 1) + .addSpecialty(new ItemStack(Config.fPollen, 1, ForestryHelper.Pollen.CRYSTALLINE.ordinal()), 5) + .setGenome(BeeGenomeManager.getTemplateWater()) + .register(); + EARTH.addProduct(Config.combs.getStackForType(CombType.EARTHY), 30) + .addSpecialty(new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.AMBER.ordinal()), 6) + .setGenome(BeeGenomeManager.getTemplateEarth()) + .register(); + INFUSED.addProduct(Config.combs.getStackForType(CombType.INFUSED), 20) + .setGenome(BeeGenomeManager.getTemplateInfused()) + .register(); + AWARE.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 18) + .setGenome(BeeGenomeManager.getTemplateAware()) + .register(); + VIS.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 25) + .setGenome(BeeGenomeManager.getTemplateVis()) + .register(); + PURE.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20) + .setGenome(BeeGenomeManager.getTemplatePure()) + .register(); + FLUX.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20) + .setGenome(BeeGenomeManager.getTemplateFlux()) + .register(); + NODE.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20) + .setGenome(BeeGenomeManager.getTemplateNode()) + .register(); + SKULKING.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10) + .setGenome(BeeGenomeManager.getTemplateSkulking()) + .register(); + BRAINY.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10) + .addProduct(new ItemStack(Item.rottenFlesh), 6) + .addSpecialty(new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.ZOMBIE_BRAIN.ordinal()), 2) + .setGenome(BeeGenomeManager.getTemplateBrainy()) + .register(); + GOSSAMER.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.SILKY.ordinal()), 15) + .setGenome(BeeGenomeManager.getTemplateGossamer()) + .register(); + WISPY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.SILKY.ordinal()), 22) + .addSpecialty(new ItemStack(Config.fCraftingResource, 1, ForestryHelper.CraftingMaterial.SILK_WISP.ordinal()), 4) + .setGenome(BeeGenomeManager.getTemplateWispy()) + .register(); + BATTY.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10) + .addSpecialty(new ItemStack(Item.gunpowder), 4) + .setGenome(BeeGenomeManager.getTemplateBatty()) + .register(); + GHASTLY.addProduct(Config.combs.getStackForType(CombType.SKULKING), 8) + .addSpecialty(new ItemStack(Item.ghastTear), 2) + .setGenome(BeeGenomeManager.getTemplateGhastly()) + .register(); + TIMELY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.DRIPPING.ordinal()), 25) + .setGenome(BeeGenomeManager.getTemplateTimely()) + .register(); + LORDLY.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 30) + .setGenome(BeeGenomeManager.getTemplateLordly()) + .register(); + DOCTORAL.addProduct(new ItemStack(Config.fBeeComb, 1, ForestryHelper.Comb.MYSTERIOUS.ordinal()), 35) + .addSpecialty(new ItemStack(Config.jellyBaby), 5) + .setGenome(BeeGenomeManager.getTemplateDoctoral()) + .register(); + } + + private String name; + private String descripton; + private String binomial; + private String authority; + private int bodyType; + private int primaryColour; + private int secondaryColour; + private EnumTemperature temperature; + private EnumHumidity humidity; + private boolean hasEffect; + private boolean isSecret; + private boolean isCounted; + private IClassification branch; + private HashMap products; + private HashMap specialty; + private IAllele genomeTemplate[]; + 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) + { + this(speciesName, speciesDescription, 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) + { + this(speciesName, speciesDescription, 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) + { + this.uid = "thaumicbees.species" + speciesName; + this.dominant = isSpeciesDominant; + AlleleManager.alleleRegistry.registerAllele(this); + name = speciesName; + descripton = speciesDescription; + binomial = genusName; + authority = "MysteriousAges"; + bodyType = body; + primaryColour = firstColour; + secondaryColour = secondColour; + temperature = preferredTemp; + humidity = preferredHumidity; + hasEffect = hasGlowEffect; + isSecret = isSpeciesSecret; + isCounted = isSpeciesCounted; + products = new HashMap(); + specialty = new HashMap(); + this.branch = classification; + this.branch.addMemberSpecies(this); + } + + public BeeSpecies setGenome(IAllele genome[]) + { + genomeTemplate = genome; + return this; + } + + public IAllele[] getGenome() + { + return genomeTemplate; + } + + public BeeSpecies addProduct(ItemStack produce, int percentChance) + { + products.put(produce, Integer.valueOf(percentChance)); + return this; + } + + public BeeSpecies addSpecialty(ItemStack produce, int percentChance) + { + specialty.put(produce, Integer.valueOf(percentChance)); + return this; + } + + public ItemStack getBeeItem(EnumBeeType beeType) + { + return BeeManager.beeInterface.getBeeStack(BeeManager.beeInterface.getBee(null, BeeManager.beeInterface.templateAsGenome(genomeTemplate)), beeType); + } + + public String getName() + { + return name; + } + + public String getDescription() + { + return descripton; + } + + public int getBodyType() + { + return bodyType; + } + + public int getPrimaryColor() + { + return primaryColour; + } + + public int getSecondaryColor() + { + return secondaryColour; + } + + public EnumTemperature getTemperature() + { + return temperature; + } + + public EnumHumidity getHumidity() + { + return humidity; + } + + public boolean hasEffect() + { + return hasEffect; + } + + public boolean isSecret() + { + return isSecret; + } + + public boolean isCounted() + { + return isCounted; + } + + public String getBinomial() + { + return binomial; + } + + public String getAuthority() + { + return authority; + } + + public IClassification getBranch() + { + return this.branch; + } + + public HashMap getProducts() + { + return products; + } + + public HashMap getSpecialty() + { + return specialty; + } + + @Override + public String getUID() + { + return this.uid; + } + + @Override + public boolean isDominant() + { + return this.dominant; + } + + public boolean isJubilant(World world, int biomeid, int x, int i, int j) + { + return true; + } + + private BeeSpecies register() + { + BeeManager.breedingManager.registerBeeTemplate(this.getGenome()); + return this; + } + + /** + * @deprecated Method getAchievement is deprecated + */ + + public Achievement getAchievement() + { + return null; + } +} diff --git a/thaumicbees_src/thaumicbees/bees/genetics/EffectData.java b/thaumicbees_src/thaumicbees/bees/EffectData.java similarity index 97% rename from thaumicbees_src/thaumicbees/bees/genetics/EffectData.java rename to thaumicbees_src/thaumicbees/bees/EffectData.java index 8a81b40..16480d1 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/EffectData.java +++ b/thaumicbees_src/thaumicbees/bees/EffectData.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import net.minecraft.nbt.NBTTagCompound; import forestry.api.genetics.IEffectData; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNode.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java similarity index 98% rename from thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNode.java rename to thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java index d822b1f..b2530fc 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNode.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNode.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import thaumcraft.api.AuraNode; import thaumcraft.api.ThaumcraftApi; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodeFlux.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java similarity index 96% rename from thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodeFlux.java rename to thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java index 9a3fe7f..cc4c106 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodeFlux.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodeFlux.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import thaumcraft.api.EnumTag; import thaumcraft.api.ObjectTags; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodePurify.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java similarity index 97% rename from thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodePurify.java rename to thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java index ccbe115..64027fd 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderAuraNodePurify.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderAuraNodePurify.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderBookshelf.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java similarity index 97% rename from thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderBookshelf.java rename to thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java index e5875a6..3734104 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderBookshelf.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderBookshelf.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; diff --git a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderThaumcraftFlower.java b/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java similarity index 98% rename from thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderThaumcraftFlower.java rename to thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java index b42e885..9e3789b 100644 --- a/thaumicbees_src/thaumicbees/bees/genetics/FlowerProviderThaumcraftFlower.java +++ b/thaumicbees_src/thaumicbees/bees/FlowerProviderThaumcraftFlower.java @@ -1,4 +1,4 @@ -package thaumicbees.bees.genetics; +package thaumicbees.bees; import thaumicbees.main.Config; import net.minecraft.block.Block; diff --git a/thaumicbees_src/thaumicbees/bees/TBBeeManager.java b/thaumicbees_src/thaumicbees/bees/TBBeeManager.java deleted file mode 100644 index 50dbec0..0000000 --- a/thaumicbees_src/thaumicbees/bees/TBBeeManager.java +++ /dev/null @@ -1,426 +0,0 @@ -package thaumicbees.bees; - -import cpw.mods.fml.common.network.IGuiHandler; -import forestry.api.apiculture.*; -import forestry.api.core.*; -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IClassification; -import forestry.api.genetics.IClassification.EnumClassLevel; - -import java.lang.reflect.Field; -import java.util.Random; - -import thaumcraft.api.EnumNodeType; -import thaumcraft.api.EnumTag; -import thaumcraft.api.ObjectTags; -import thaumcraft.api.ThaumcraftApi; -import thaumicbees.bees.genetics.Allele; -import thaumicbees.bees.genetics.AlleleEffectAuraNodeGrow; -import thaumicbees.bees.genetics.AlleleEffectCure; -import thaumicbees.bees.genetics.AlleleEffectPotion; -import thaumicbees.bees.genetics.AlleleEffectSpawnMob; -import thaumicbees.bees.genetics.AlleleEffectSpawnWisp; -import thaumicbees.bees.genetics.AlleleFlower; -import thaumicbees.bees.genetics.AlleleInteger; -import thaumicbees.bees.genetics.BeeMutation; -import thaumicbees.bees.genetics.BeeSpecies; -import thaumicbees.bees.genetics.FlowerProviderAuraNode; -import thaumicbees.bees.genetics.FlowerProviderAuraNodeFlux; -import thaumicbees.bees.genetics.FlowerProviderAuraNodePurify; -import thaumicbees.bees.genetics.FlowerProviderBookshelf; -import thaumicbees.bees.genetics.FlowerProviderThaumcraftFlower; -import thaumicbees.compat.CompatabilityManager; -import thaumicbees.compat.ThaumcraftHelper; -import thaumicbees.item.ItemComb; -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.ThaumicBees; -import thaumicbees.main.utils.MoonPhase; - -import net.minecraft.block.Block; -import net.minecraft.command.ICommand; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.world.World; - -public class TBBeeManager -{ - private static int defaultBodyColour = 0xFF6E0D; - private static int malevolentBodyColour = 0xe15236; - private static boolean hideSpecies = true; - - public void doInit() - { - try - { - Field f = Class.forName("forestry.core.config.Config").getField("enableParticleFX"); - ThaumicBees.getConfig().DrawParticleEffects = f.getBoolean(null); - - f = Class.forName("forestry.core.config.Defaults").getField("TEXTURE_PARTICLES_BEE"); - thaumicbees.main.CommonProxy.FORESTRY_GFX_BEEEFFECTS = (String)f.get(null); - } - catch (Exception e) - { - // Could not get Forestry config value. - } - } - - public void postInit() - { - setupAdditionalAlleles(); - setupBeeSpecies(); - setupBeeMutations(); - } - - private void setupAdditionalAlleles() - { - Allele.fertilityHighDominant = new AlleleInteger("fertilityHighDominant", 3, true); - - Allele.flowerBookshelf = new AlleleFlower("flowerBookshelf", new FlowerProviderBookshelf(), true); - Allele.flowerThaumcraft = new AlleleFlower("flowerThaumcraftPlant", new FlowerProviderThaumcraftFlower(), false); - Allele.flowerAuraNode = new AlleleFlower("flowerAuraNode", new FlowerProviderAuraNode(), true); - Allele.flowerNodePurify = new AlleleFlower("flowerAuraNodePurify", new FlowerProviderAuraNodePurify(), false); - 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.nodeGen = new AlleleEffectAuraNodeGrow("effectNodeGeneration", "Nodeify", false, 800); - - Allele.spawnBrainyZombie = new AlleleEffectSpawnMob("effectBrainy", false, "Brainy", 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.setThrottle(300).setSpawnsOnPlayerNear("Bat"); - - Allele.spawnWisp = new AlleleEffectSpawnWisp("effectWispy", false, "Wispy", ThaumcraftHelper.Entity.WISP.entityID); - Allele.spawnWisp.setThrottle(1800); - - Allele.spawnGhast = new AlleleEffectSpawnMob("Ghast", false, "Ghastly", "Ghast"); - Allele.spawnGhast.setThrottle(2000).setChanceToSpawn(20).setMaxMobsInSpawnZone(1); - } - - private void setupBeeSpecies() - { - IBreedingManager breedingMgr = BeeManager.breedingManager; - ItemStack forestryItem; - - IClassification familyBee = AlleleManager.alleleRegistry.getClassification("family.apidae"); - IClassification occult = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "occult", "Arcanus"); - occult.setParent(familyBee); - - Allele.Esoteric = new BeeSpecies("Esoteric", "An unusual crossbreed which seems to have magical properties.|Apinomicon", - "secretiore", occult, 0, - 0x001099, 0xcc763c, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Esoteric.addProduct(Config.combs.getStackForType(CombType.OCCULT), 20); - Allele.Esoteric.setGenome(BeeGenomeManager.getTemplateEsoteric()); - occult.addMemberSpecies(Allele.Esoteric); - breedingMgr.registerBeeTemplate(Allele.Esoteric.getGenome()); - - Allele.Mysterious = new BeeSpecies("Mysterious", "These bees have been to the end of the world and back, and their power has grown.|Apinomicon", - "mysticus", occult, 0, - 0x762bc2, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Mysterious.addProduct(Config.combs.getStackForType(CombType.OCCULT), 25); - Allele.Mysterious.setGenome(BeeGenomeManager.getTemplateMysterious()); - occult.addMemberSpecies(Allele.Mysterious); - breedingMgr.registerBeeTemplate(Allele.Mysterious.getGenome()); - - Allele.Arcane = new BeeSpecies("Arcane", "\"Their produce is charged with magic.\"|Azanor, Master Thaumaturge", - "arcanus", occult, 0, - 0xd242df, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, true); - Allele.Arcane.addProduct(Config.combs.getStackForType(CombType.OCCULT), 30); - Allele.Arcane.addSpecialty(Config.drops.getStackForType(DropType.ENCHANTED, 1), 9); - Allele.Arcane.setGenome(BeeGenomeManager.getTemplateArcane()); - occult.addMemberSpecies(Allele.Arcane); - breedingMgr.registerBeeTemplate(Allele.Arcane.getGenome()); - - IClassification otherworldly = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "coeleste", "Coeleste"); - otherworldly.setParent(familyBee); - - Allele.Charmed = new BeeSpecies("Charmed", "Your first experiments in Thaumaturgical Apiculture have yielded fruit. Buzzing fruit.|Apinomicon", - "larvatus", otherworldly, 0, - 0x48EEEC, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Charmed.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 20); - Allele.Charmed.setGenome(BeeGenomeManager.getTemplateCharmed()); - otherworldly.addMemberSpecies(Allele.Charmed); - breedingMgr.registerBeeTemplate(Allele.Charmed.getGenome()); - - Allele.Enchanted = new BeeSpecies("Enchanted", "Successive generations of Charmed bees have reinforced their connection to the unknown.|Apinomicon", - "cantatus", otherworldly, 0, - 0x18e726, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Enchanted.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 30); - Allele.Enchanted.setGenome(BeeGenomeManager.getTemplateEnchanted()); - otherworldly.addMemberSpecies(Allele.Enchanted); - breedingMgr.registerBeeTemplate(Allele.Enchanted.getGenome()); - - Allele.Supernatural = new BeeSpecies("Supernatural", "These bees walk the line between this world and the unseen.|Apinomicon", - "coeleste", otherworldly, 0, - 0x005614, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, true); - Allele.Supernatural.addProduct(Config.combs.getStackForType(CombType.OTHERWORLDLY), 40); - Allele.Supernatural.addSpecialty(Config.pollen.getStackForType(PollenType.UNUSUAL), 8); - Allele.Supernatural.setGenome(BeeGenomeManager.getTemplateSupernatural()); - otherworldly.addMemberSpecies(Allele.Supernatural); - breedingMgr.registerBeeTemplate(Allele.Supernatural.getGenome()); - - IClassification learned = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "docto", "Docto"); - learned.setParent(familyBee); - - Allele.Pupil = new BeeSpecies("Pupil", "\"What does that bee want with my paper?!|Yorae, Librarian", - "disciplina", learned, 0, - 0xFFFF00, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.ARID, - false, hideSpecies, true, true); - Allele.Pupil.addProduct(Config.combs.getStackForType(CombType.PAPERY), 20); - Allele.Pupil.setGenome(BeeGenomeManager.getTemplatePupil()); - learned.addMemberSpecies(Allele.Pupil); - breedingMgr.registerBeeTemplate(Allele.Pupil.getGenome()); - - Allele.Scholarly = new BeeSpecies("Scholarly", "\"I can't be sure, but I think they might be smarter than me...\"|Yorae, Librarian", - "studiosis", learned, 0, - 0x6E0000, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.ARID, - false, hideSpecies, true, false); - Allele.Scholarly.addProduct(Config.combs.getStackForType(CombType.PAPERY), 25); - Allele.Scholarly.addSpecialty(Config.miscResources.getStackForType(ResourceType.LORE_FRAGMENT), 2); - Allele.Scholarly.setGenome(BeeGenomeManager.getTemplateScholarly()); - learned.addMemberSpecies(Allele.Scholarly); - breedingMgr.registerBeeTemplate(Allele.Scholarly.getGenome()); - - Allele.Savant = new BeeSpecies("Savant", "lim(x^(i / pi)/ log(e * 7 - ln(32/x^-pi))). Solve for honey.|Note found on Yorae's desk", - "philologus", learned, 0, - 0x6E1C6D, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.ARID, - true, hideSpecies, true, false); - Allele.Savant.addProduct(Config.combs.getStackForType(CombType.PAPERY), 40); - Allele.Savant.addSpecialty(Config.miscResources.getStackForType(ResourceType.LORE_FRAGMENT), 5); - Allele.Savant.setGenome(BeeGenomeManager.getTemplateSavant()); - learned.addMemberSpecies(Allele.Savant); - breedingMgr.registerBeeTemplate(Allele.Savant.getGenome()); - - IClassification magical = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "thaumis", "Thaumis"); - magical.setParent(familyBee); - - Allele.Stark = new BeeSpecies("Stark", "\"These are unusually attracted to shards. This warrents further investigation.\"|Azanor, Master Thaumaturge", - "torridae", magical, 0, - 0xCCCCCC, 0x999999, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, false); - Allele.Stark.addProduct(Config.combs.getStackForType(CombType.STARK), 10); - Allele.Stark.setGenome(BeeGenomeManager.getTemplateStark()); - breedingMgr.registerBeeTemplate(Allele.Stark.getGenome()); - - - Allele.Air = new BeeSpecies("Aura", "\"They work so fast it's breathtaking.\"|Sengir, Mad Apiarist", - "ventosa", magical, 0, - 0xD9D636, 0xA19E10, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, true); - Allele.Air.addProduct(Config.combs.getStackForType(CombType.AIRY), 9); - Allele.Air.addSpecialty(new ItemStack(Config.tcNuggets, 1, ThaumcraftHelper.NuggetType.QUICKSILVER.ordinal()), 8); - Allele.Air.setGenome(BeeGenomeManager.getTemplateAir()); - breedingMgr.registerBeeTemplate(Allele.Air.getGenome()); - - Allele.Fire = new BeeSpecies("Ignis", "Caution: Contents of hive extremely hot.|Warning label on Azanor's apiary", - "praefervidus", magical, 0, - 0xE50B0B, 0x95132F, EnumTemperature.HOT, EnumHumidity.ARID, - true, hideSpecies, true, true); - Allele.Fire.addProduct(Config.combs.getStackForType(CombType.FIREY), 15); - Allele.Fire.addSpecialty(new ItemStack(Item.blazePowder), 8); - Allele.Fire.setGenome(BeeGenomeManager.getTemplateFire()); - breedingMgr.registerBeeTemplate(Allele.Fire.getGenome()); - - // Grab the Crystalline Pollen - (forestryItem = ItemInterface.getItem("pollen")).setItemDamage(1); - - Allele.Water = new BeeSpecies("Aqua", "\"I tried to breed them once, but that was a wash.\"|MysteriousAges, Apprentice Thaumaturge", - "umidus", magical, 0, - 0x36CFD9, 0x1054A1, EnumTemperature.NORMAL, EnumHumidity.DAMP, - true, hideSpecies, true, true); - Allele.Water.addProduct(Config.combs.getStackForType(CombType.WATERY), 20); - Allele.Water.addSpecialty(new ItemStack(Block.ice), 1).addSpecialty(forestryItem, 5); - Allele.Water.setGenome(BeeGenomeManager.getTemplateWater()); - breedingMgr.registerBeeTemplate(Allele.Water.getGenome()); - - Allele.Earth = new BeeSpecies("Solum", "\"You're really gonna dig these bees, but watch out - they bore quite easily.\"|MysteriousAges, Apprentice Comedian", - "sordida", magical, 0, - 0x005100, 0x00a000, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, true); - Allele.Earth.addProduct(Config.combs.getStackForType(CombType.EARTHY), 30); - Allele.Earth.addSpecialty(new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.AMBER.ordinal()), 6); - Allele.Earth.setGenome(BeeGenomeManager.getTemplateEarth()); - breedingMgr.registerBeeTemplate(Allele.Earth.getGenome()); - - Allele.Infused = new BeeSpecies("Praecantatio", "Beekeeping is magic!|Apinomicon, Preface", - "azanorius", magical, 0, - 0xaa32fc, 0x7A489E, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, true); - Allele.Infused.addProduct(Config.combs.getStackForType(CombType.INFUSED), 20); - Allele.Infused.setGenome(BeeGenomeManager.getTemplateInfused()); - breedingMgr.registerBeeTemplate(Allele.Infused.getGenome()); - - IClassification aware = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "patibilis", "Patibilis"); - aware.setParent(familyBee); - - Allele.Aware = new BeeSpecies("Aware", "\"They can see into your soul!\"|Florastar, Expert Beekeeper", - "sensibilis", aware, 0, - 0xb0092e9, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, false); - Allele.Aware.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 18); - Allele.Aware.setGenome(BeeGenomeManager.getTemplateAware()); - breedingMgr.registerBeeTemplate(Allele.Aware.getGenome()); - - Allele.Vis = new BeeSpecies("Vis", "\"They can feel changes in the aura, but are not yet able to affect it.\"|Azanor, research notes", - "arcanus saecula", aware, 0, - 0x004c99, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, false); - Allele.Vis.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 25); - Allele.Vis.setGenome(BeeGenomeManager.getTemplateVis()); - breedingMgr.registerBeeTemplate(Allele.Vis.getGenome()); - - Allele.Pure = new BeeSpecies("Pure", "\"It's like a bee janitor!\"|MysteriousAges, Thaumaturge", - "arcanus puritatem", aware, 0, - 0xb0092e9, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, false); - Allele.Pure.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20); - Allele.Pure.setGenome(BeeGenomeManager.getTemplatePure()); - breedingMgr.registerBeeTemplate(Allele.Pure.getGenome()); - - Allele.Flux = new BeeSpecies("Flux", "\"I thought they would help clean up, but it only makes things worse!\"|Kreicus, Apprentice Thaumaturge", - "arcanus labe", aware, 0, - 0x004c99, defaultBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, false); - Allele.Flux.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20); - Allele.Flux.setGenome(BeeGenomeManager.getTemplateFlux()); - breedingMgr.registerBeeTemplate(Allele.Flux.getGenome()); - - Allele.Node = new BeeSpecies("Node", "Having undergone a freak mutation, these bees now attract magic to them.|Apinomicon", - "conficiens", aware, 0, - 0xFFF266, 0xFF8CE9, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - true, hideSpecies, true, false); - Allele.Node.addProduct(Config.combs.getStackForType(CombType.INTELLECT), 20); - Allele.Node.setGenome(BeeGenomeManager.getTemplateNode()); - breedingMgr.registerBeeTemplate(Allele.Node.getGenome()); - - IClassification malevolent = AlleleManager.alleleRegistry.createAndRegisterClassification(EnumClassLevel.GENUS, "malevolens", "Malevolens"); - malevolent.setParent(familyBee); - - Allele.Skulking = new BeeSpecies("Skulking", "These bees have become xenophobic and bad-tempered. Use caution.|Apinomicon", - "malevolens", malevolent, 0, - 0x524827, malevolentBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Skulking.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10); - Allele.Skulking.setGenome(BeeGenomeManager.getTemplateSkulking()); - breedingMgr.registerBeeTemplate(Allele.Skulking.getGenome()); - - Allele.Brainy = new BeeSpecies("Brainy", "Their combs may be fetid and foul-smelling, but their intelligence is well-developed.|Apinomicon", - "cerebrum", malevolent, 0, - 0x83FF70, malevolentBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Brainy.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10).addProduct(new ItemStack(Item.rottenFlesh), 6); - Allele.Brainy.addSpecialty(new ItemStack(Config.tcMiscResource, 1, ThaumcraftHelper.MiscResource.ZOMBIE_BRAIN.ordinal()), 2); - Allele.Brainy.setGenome(BeeGenomeManager.getTemplateBrainy()); - breedingMgr.registerBeeTemplate(Allele.Brainy.getGenome()); - - // Grab the Silky Comb. - (forestryItem = ItemInterface.getItem("beeComb")).setItemDamage(6); - - Allele.Gossamer = new BeeSpecies("Gossamer", "As they work, they seem to fade out from light for brief moments.|Apinomicon", - "perlucidus", malevolent, 0, - 0x183f66, malevolentBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Gossamer.addProduct(forestryItem, 15); - Allele.Gossamer.setGenome(BeeGenomeManager.getTemplateGossamer()); - breedingMgr.registerBeeTemplate(Allele.Gossamer.getGenome()); - - Allele.Wispy = new BeeSpecies("Wispy", "Their language is garbled and unintelligible. It is probable they are speaking to unnatural beings.|Apinomicon", - "umbrabilis", malevolent, 0, - 0x9cb8d5, malevolentBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, false); - Allele.Wispy.addProduct(forestryItem, 22); - // Get silk wisp - (forestryItem = ItemInterface.getItem("craftingMaterial")).setItemDamage(2); - Allele.Wispy.addSpecialty(forestryItem, 4); - Allele.Wispy.setGenome(BeeGenomeManager.getTemplateWispy()); - breedingMgr.registerBeeTemplate(Allele.Wispy.getGenome()); - - Allele.Batty = new BeeSpecies("Batty", "They tend to attract bats to their hives through means unknown.|Apinomicon", - "chiroptera", malevolent, 0, - 0x27350d, malevolentBodyColour, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, true); - Allele.Batty.addProduct(Config.combs.getStackForType(CombType.SKULKING), 10); - Allele.Batty.addSpecialty(new ItemStack(Item.gunpowder), 4); - Allele.Batty.setGenome(BeeGenomeManager.getTemplateBatty()); - breedingMgr.registerBeeTemplate(Allele.Batty.getGenome()); - - Allele.Ghastly = new BeeSpecies("Ghastly", "\"*sigh*... Really, Myst?\"|Taveria", - "pallens", malevolent, 0, - 0xccccee, 0xbf877c, EnumTemperature.NORMAL, EnumHumidity.NORMAL, - false, hideSpecies, true, false); - Allele.Ghastly.addProduct(Config.combs.getStackForType(CombType.SKULKING), 8); - Allele.Ghastly.addSpecialty(new ItemStack(Item.ghastTear), 2); - Allele.Ghastly.setGenome(BeeGenomeManager.getTemplateGhastly()); - breedingMgr.registerBeeTemplate(Allele.Ghastly.getGenome()); - } - - private void setupBeeMutations() - { - // Mutations are registered with the BreedingManager in their constructor. - - BeeMutation.Esoteric = new BeeMutation(Allele.getBaseSpecies("Imperial"), Allele.getBaseSpecies("Demonic"), Allele.Esoteric, 10); - BeeMutation.Esoteric1 = new BeeMutation(Allele.getBaseSpecies("Heroic"), Allele.getBaseSpecies("Demonic"), Allele.Esoteric, 25); - BeeMutation.Mysterious = new BeeMutation(Allele.Esoteric, Allele.getBaseSpecies("Ended"), Allele.Mysterious, 10); - BeeMutation.Arcane = new BeeMutation(Allele.Esoteric, Allele.Mysterious, Allele.Arcane, 8) - .setMoonPhaseBonus(MoonPhase.WANING_CRESCENT, MoonPhase.WAXING_CRESCENT, 1.5f); - BeeMutation.Charmed = new BeeMutation(Allele.getBaseSpecies("Diligent"), Allele.getBaseSpecies("Valiant"), Allele.Charmed, 20); - BeeMutation.Enchanted = new BeeMutation(Allele.Charmed, Allele.getBaseSpecies("Valiant"), Allele.Enchanted, 8); - BeeMutation.Supernatural = new BeeMutation(Allele.Charmed, Allele.Enchanted, Allele.Supernatural, 10) - .setMoonPhaseBonus(MoonPhase.WAXING_GIBBOUS, MoonPhase.WANING_GIBBOUS, 1.5f); - BeeMutation.Pupil = new BeeMutation(Allele.Arcane, Allele.Enchanted, Allele.Pupil, 10); - BeeMutation.Scholarly = new BeeMutation(Allele.Pupil, Allele.Arcane, Allele.Scholarly, 8); - BeeMutation.Savant = new BeeMutation(Allele.Pupil, Allele.Scholarly, Allele.Savant, 6); - BeeMutation.Stark = new BeeMutation(Allele.Arcane, Allele.Supernatural, Allele.Stark, 8); - - BeeMutation.Aware = new BeeMutation(Allele.getBaseSpecies("Demonic"), Allele.getBaseSpecies("Edenic"), Allele.Aware, 12); - BeeMutation.Vis = new BeeMutation(Allele.Aware, Allele.Arcane, Allele.Vis, 9) - .setAuraNodeRequired(40); - BeeMutation.Vis1 = new BeeMutation(Allele.Aware, Allele.Stark, Allele.Vis, 12) - .setAuraNodeRequired(80); - - BeeMutation.Pure = new BeeMutation(Allele.Vis, Allele.getBaseSpecies("Edenic"), Allele.Pure, 7) - .setAuraNodeTypeRequired(5, EnumNodeType.PURE).setMoonPhaseBonus(MoonPhase.NEW, MoonPhase.NEW, 1.6f); - BeeMutation.Flux = new BeeMutation(Allele.Vis, Allele.getBaseSpecies("Edenic"), Allele.Flux, 7) - .setAuraNodeTypeRequired(30, EnumNodeType.UNSTABLE).setMoonPhaseBonus(MoonPhase.FULL, MoonPhase.FULL, 1.6f); - - BeeMutation.Node = new BeeMutation(Allele.Vis, Allele.Vis, Allele.Node, 2) - .setAuraNodeRequired(4).setMoonPhaseRestricted(MoonPhase.WANING_HALF, MoonPhase.WANING_HALF); - BeeMutation.Node1 = new BeeMutation(Allele.Vis, Allele.Vis, Allele.Node, 2) - .setAuraNodeRequired(4).setMoonPhaseRestricted(MoonPhase.WAXING_HALF, MoonPhase.WAXING_HALF); - - // Now we get into a little bit of branching... - if (ThaumicBees.getConfig().ExtraBeesInstalled) - { - BeeMutation.Skulking = new BeeMutation(Allele.Mysterious, Allele.getExtraSpecies("desolate"), Allele.Skulking, 10); - BeeMutation.Brainy = new BeeMutation(Allele.Skulking, Allele.getExtraSpecies("rotten"), Allele.Brainy, 12); - BeeMutation.Gossamer = new BeeMutation(Allele.Skulking, Allele.getExtraSpecies("ancient"), Allele.Gossamer, 10); - BeeMutation.Batty = new BeeMutation(Allele.Skulking, Allele.getExtraSpecies("rock"), Allele.Batty, 14); - BeeMutation.Ghastly = new BeeMutation(Allele.Skulking, Allele.getExtraSpecies("creeper"), Allele.Ghastly, 13); - } - else - { - BeeMutation.Skulking = new BeeMutation(Allele.Mysterious, Allele.getBaseSpecies("Modest"), Allele.Skulking, 10); - BeeMutation.Brainy = new BeeMutation(Allele.Skulking, Allele.getBaseSpecies("Sinister"), Allele.Brainy, 10); - BeeMutation.Gossamer = new BeeMutation(Allele.Skulking, Allele.Supernatural, Allele.Gossamer, 10); - BeeMutation.Batty = new BeeMutation(Allele.Skulking, Allele.getBaseSpecies("Frugal"), Allele.Batty, 11); - BeeMutation.Ghastly = new BeeMutation(Allele.Skulking, Allele.getBaseSpecies("Austere"), Allele.Ghastly, 13); - } - BeeMutation.Gossamer.setMoonPhaseRestricted(MoonPhase.FULL, MoonPhase.WANING_CRESCENT); - BeeMutation.Wispy = new BeeMutation(Allele.Gossamer, Allele.getBaseSpecies("Cultivated"), Allele.Wispy, 8); - - } -} diff --git a/thaumicbees_src/thaumicbees/bees/genetics/Allele.java b/thaumicbees_src/thaumicbees/bees/genetics/Allele.java deleted file mode 100644 index dcac294..0000000 --- a/thaumicbees_src/thaumicbees/bees/genetics/Allele.java +++ /dev/null @@ -1,95 +0,0 @@ -package thaumicbees.bees.genetics; - -import forestry.api.apiculture.IAlleleBeeSpecies; -import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IAllele; - -public class Allele implements IAllele -{ - public static BeeSpecies Esoteric; - public static BeeSpecies Mysterious; - public static BeeSpecies Arcane; - - public static BeeSpecies Charmed; - public static BeeSpecies Enchanted; - public static BeeSpecies Supernatural; - - public static BeeSpecies Pupil; - public static BeeSpecies Scholarly; - public static BeeSpecies Savant; - - public static BeeSpecies Stark; - public static BeeSpecies Air; - public static BeeSpecies Water; - public static BeeSpecies Earth; - public static BeeSpecies Fire; - public static BeeSpecies Infused; - - public static BeeSpecies Aware; - public static BeeSpecies Vis; - public static BeeSpecies Pure; - public static BeeSpecies Flux; - public static BeeSpecies Node; - - public static BeeSpecies Skulking; - public static BeeSpecies Brainy; - public static BeeSpecies Gossamer; - public static BeeSpecies Wispy; - public static BeeSpecies Batty; - public static BeeSpecies Ghastly; - - public static AlleleInteger fertilityHighDominant; - - public static AlleleFlower flowerBookshelf; - public static AlleleFlower flowerThaumcraft; - public static AlleleFlower flowerAuraNode; - public static AlleleFlower flowerNodePurify; - public static AlleleFlower flowerNodeFluxify; - - public static AlleleEffectCure cleansingEffect; - public static AlleleEffectPotion digSpeed; - public static AlleleEffectPotion moveSpeed; - public static AlleleEffectSpawnMob spawnBrainyZombie; - public static AlleleEffectSpawnMob spawnWisp; - public static AlleleEffectSpawnMob spawnBats; - public static AlleleEffectSpawnMob spawnGhast; - public static AlleleEffectAuraNodeGrow nodeGen; - - private String uid; - private boolean dominant; - - public static IAlleleBeeSpecies getBaseSpecies(String name) - { - return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele((new StringBuilder()).append("forestry.species").append(name).toString()); - } - - public static IAlleleBeeSpecies getExtraSpecies(String name) - { - return (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele((new StringBuilder()).append("extrabees.species.").append(name).toString()); - } - - public static IAllele getBaseAllele(String name) - { - return AlleleManager.getAllele(name); - } - - public Allele(String id, boolean isDominant) - { - this.uid = "thaumicbees." + id; - this.dominant = isDominant; - AlleleManager.alleleRegistry.registerAllele(this); - } - - @Override - public String getUID() - { - return this.uid; - } - - @Override - public boolean isDominant() - { - return this.dominant; - } - -} diff --git a/thaumicbees_src/thaumicbees/bees/genetics/BeeSpecies.java b/thaumicbees_src/thaumicbees/bees/genetics/BeeSpecies.java deleted file mode 100644 index 6171c7b..0000000 --- a/thaumicbees_src/thaumicbees/bees/genetics/BeeSpecies.java +++ /dev/null @@ -1,180 +0,0 @@ -package thaumicbees.bees.genetics; - -import forestry.api.apiculture.*; -import forestry.api.core.EnumHumidity; -import forestry.api.core.EnumTemperature; -import forestry.api.genetics.*; -import java.util.HashMap; - -import net.minecraft.item.ItemStack; -import net.minecraft.stats.Achievement; -import net.minecraft.world.World; - -public class BeeSpecies extends Allele implements IAlleleBeeSpecies -{ - private String name; - private String descripton; - private String binomial; - private String authority; - private int bodyType; - private int primaryColour; - private int secondaryColour; - private EnumTemperature temperature; - private EnumHumidity humidity; - private boolean hasEffect; - private boolean isSecret; - private boolean isCounted; - private IClassification branch; - private HashMap products; - private HashMap specialty; - private IAllele genomeTemplate[]; - - public BeeSpecies(String speciesName, String speciesDescription, 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); - } - - public 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) - { - super("species" + speciesName, isSpeciesDominant); - name = speciesName; - descripton = speciesDescription; - binomial = genusName; - authority = "MysteriousAges"; - bodyType = body; - primaryColour = firstColour; - secondaryColour = secondColour; - temperature = preferredTemp; - humidity = preferredHumidity; - hasEffect = hasGlowEffect; - isSecret = isSpeciesSecret; - isCounted = isSpeciesCounted; - products = new HashMap(); - specialty = new HashMap(); - this.branch = classification; - this.genomeTemplate = new IAllele[EnumBeeChromosome.values().length]; - } - - public BeeSpecies setGene(EnumBeeChromosome chromosome, IAllele allele) - { - genomeTemplate[chromosome.ordinal()] = allele; - return this; - } - - public BeeSpecies setGenome(IAllele genome[]) - { - genomeTemplate = genome; - return this; - } - - public IAllele[] getGenome() - { - return genomeTemplate; - } - - public BeeSpecies addProduct(ItemStack produce, int percentChance) - { - products.put(produce, Integer.valueOf(percentChance)); - return this; - } - - public BeeSpecies addSpecialty(ItemStack produce, int percentChance) - { - specialty.put(produce, Integer.valueOf(percentChance)); - return this; - } - - public ItemStack getBeeItem(EnumBeeType beeType) - { - return BeeManager.beeInterface.getBeeStack(BeeManager.beeInterface.getBee(null, BeeManager.beeInterface.templateAsGenome(genomeTemplate)), beeType); - } - - public String getName() - { - return name; - } - - public String getDescription() - { - return descripton; - } - - public int getBodyType() - { - return bodyType; - } - - public int getPrimaryColor() - { - return primaryColour; - } - - public int getSecondaryColor() - { - return secondaryColour; - } - - public EnumTemperature getTemperature() - { - return temperature; - } - - public EnumHumidity getHumidity() - { - return humidity; - } - - public boolean hasEffect() - { - return hasEffect; - } - - public boolean isSecret() - { - return isSecret; - } - - public boolean isCounted() - { - return isCounted; - } - - public String getBinomial() - { - return binomial; - } - - public String getAuthority() - { - return authority; - } - - public IClassification getBranch() - { - return this.branch; - } - - public HashMap getProducts() - { - return products; - } - - public HashMap getSpecialty() - { - return specialty; - } - - public boolean isJubilant(World world, int biomeid, int x, int i, int j) - { - return true; - } - - /** - * @deprecated Method getAchievement is deprecated - */ - - public Achievement getAchievement() - { - return null; - } -} diff --git a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java index c9bc239..f03677c 100644 --- a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java +++ b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java @@ -3,9 +3,11 @@ package thaumicbees.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import thaumicbees.main.CommonProxy; -import net.minecraft.block.Block; +import thaumicbees.tile.TileEntityMagicApiary; +import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import forestry.api.apiculture.IBee; @@ -14,7 +16,7 @@ import forestry.api.apiculture.IBeeHousing; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; -public class BlockMagicApiary extends Block +public class BlockMagicApiary extends BlockContainer { public BlockMagicApiary(int par1) { @@ -26,8 +28,29 @@ public class BlockMagicApiary extends Block @Override @SideOnly(Side.CLIENT) - public int getBlockTexture(IBlockAccess par1iBlockAccess, int par2, int par3, int par4, int par5) + public int getBlockTexture(IBlockAccess worldAccess, int x, int y, int z, int side) { - return super.getBlockTexture(par1iBlockAccess, par2, par3, par4, par5); + int texture = 48; + if (side == 0 || side == 1) + { + texture = 50; + } + return texture; + } + + public int getBlockTextureFromSideAndMetadata(int side, int meta) + { + int texture = 48; + if (side == 0 || side == 1) + { + texture = 50; + } + return texture; + } + + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileEntityMagicApiary(); } } diff --git a/thaumicbees_src/thaumicbees/compat/CompatabilityManager.java b/thaumicbees_src/thaumicbees/compat/CompatabilityManager.java new file mode 100644 index 0000000..c8171d8 --- /dev/null +++ b/thaumicbees_src/thaumicbees/compat/CompatabilityManager.java @@ -0,0 +1,466 @@ +package thaumicbees.compat; + +import java.io.File; +import java.lang.reflect.Field; +import java.util.ArrayList; + +import thaumcraft.api.EnumTag; +import thaumcraft.api.ItemApi; +import thaumcraft.api.ObjectTags; +import thaumcraft.api.ThaumcraftApi; +import thaumcraft.api.research.ResearchItem; +import thaumcraft.api.research.ResearchList; +import thaumicbees.bees.Allele; +import thaumicbees.bees.BeeGenomeManager; +import thaumicbees.item.ItemComb; +import thaumicbees.item.ItemMiscResources; +import thaumicbees.item.types.CombType; +import thaumicbees.item.types.DropType; +import thaumicbees.item.types.LiquidType; +import thaumicbees.item.types.PollenType; +import thaumicbees.item.types.PropolisType; +import thaumicbees.item.types.ResourceType; +import thaumicbees.item.types.WaxType; +import thaumicbees.main.CommonProxy; +import thaumicbees.main.Config; +import thaumicbees.main.ThaumicBees; +import thaumicbees.storage.BackpackDefinition; + +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.registry.GameRegistry; +import forestry.api.apiculture.EnumBeeChromosome; +import forestry.api.apiculture.EnumBeeType; +import forestry.api.core.BlockInterface; +import forestry.api.core.ItemInterface; +import forestry.api.storage.BackpackManager; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.Property; +import net.minecraftforge.common.Configuration; + +public class CompatabilityManager +{ + public static ItemStack getExtraBeeItem(String field) + { + ItemStack value = null; + try + { + Class src = Class.forName("binnie.extrabees.core.ExtraBeeItem"); + Field f = src.getDeclaredField(field); + + Item i = (Item) f.get(null); + value = new ItemStack(i); + } + catch (Exception e) + { + + } + return value; + } + + public static void setupBackpacks() + { + if (ThaumicBees.getConfig().AddThaumcraftItemsToBackpacks) + { + // Add all shards and Thaumium to miner's backpack + String ids = Config.tcShard.itemID + ":" + -1 + ";" + + Config.tcMiscResource.itemID + ":" + ThaumcraftHelper.MiscResource.THAUMIUM.ordinal(); + FMLInterModComms.sendMessage("Forestry", "add-backpack-items", "miner@" + ids); + + // All resources go into Thaumaturge's backpack + ids = Config.tcMiscResource.itemID + ":" + -1 + ";" + + Config.tcShard.itemID + ":" + -1 + ";" + + Config.tcFilledJar.itemID + ":" + -1 + ";" + + Config.tcCrystal.blockID + ":" + -1 + ";" + + Config.tcJar.blockID + ":" + -1 + ";" + + Config.tcGolem.itemID + ":" + -1 + ";" + + Config.solidFlux.itemID + ":" + -1; + FMLInterModComms.sendMessage("Forestry", "add-backpack-items", "thaumaturge@" + ids); + + // Add some plants & saplings to Forester's + ids = Config.tcPlant.blockID + ":" + "-1" + ";" + + Config.tcLeaf.blockID + ":" + -1 + ";" + + Config.tcLog.blockID + ":" + "-1"; + FMLInterModComms.sendMessage("Forestry", "add-backpack-items", "forester@" + ids); + + // Add Wisp & brains to Hunter's + ids = Config.tcWispEssence.itemID + ":" + -1 + ";" + + Config.tcMiscResource.itemID + ":" + ThaumcraftHelper.MiscResource.ZOMBIE_BRAIN.ordinal(); + FMLInterModComms.sendMessage("Forestry", "add-backpack-items", "hunter@" + ids); + + // Add Marker, warded stone, candle to builder + ids = Config.tcCandle.blockID + ":" + -1 + ";" + + Config.tcMarker.blockID + ":" + -1 + ";" + + Config.tcWarded.blockID + ":" + -1; + FMLInterModComms.sendMessage("Forestry", "add-backpack-items", "builder@" + ids); + } + } + + public static void setupItemAspects() + { + setupItemAspectsThaumicBees(); + setupItemAspectsForestry(); + if (ThaumicBees.getConfig().ExtraBeesInstalled) + { + setupItemAspectsExtraBees(); + } + } + + private static void setupItemAspectsThaumicBees() + { + ObjectTags tags; + ItemStack itemStack; + + tags = new ObjectTags().add(EnumTag.MAGIC, 2); + ThaumcraftApi.registerObjectTag(Config.wax.itemID, WaxType.MAGIC.ordinal(), tags); + + tags = new ObjectTags().add(EnumTag.MAGIC, 1); + ThaumcraftApi.registerObjectTag(Config.drops.itemID, DropType.ENCHANTED.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.KNOWLEDGE, 1); + ThaumcraftApi.registerObjectTag(Config.drops.itemID, DropType.INTELLECT.ordinal(), tags); + + tags = new ObjectTags().add(EnumTag.ELDRITCH, 1); + ThaumcraftApi.registerObjectTag(Config.pollen.itemID, PollenType.UNUSUAL.ordinal(), tags); + + tags = new ObjectTags().add(EnumTag.CONTROL, 1); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, -1, tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 1); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.STARK.ordinal(), tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 1).add(EnumTag.WIND, 3); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.AIR.ordinal(), tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 1).add(EnumTag.FIRE, 3); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.FIRE.ordinal(), tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 1).add(EnumTag.WATER, 3); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.WATER.ordinal(), tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 1).add(EnumTag.EARTH, 3); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.EARTH.ordinal(), tags); + tags = new ObjectTags(Config.propolis.itemID, -1).add(EnumTag.MAGIC, 4); + ThaumcraftApi.registerObjectTag(Config.propolis.itemID, PropolisType.INFUSED.ordinal(), tags); + + tags = new ObjectTags().add(EnumTag.KNOWLEDGE, 3); + ThaumcraftApi.registerObjectTag(Config.miscResources.itemID, ResourceType.LORE_FRAGMENT.ordinal(), tags); + + tags = new ObjectTags().add(EnumTag.INSECT, 2).add(EnumTag.TRAP, 2); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, -1, tags); + + itemStack = Config.combs.getStackForType(CombType.OCCULT); + tags = new ObjectTags().add(EnumTag.INSECT, 2).add(EnumTag.TRAP, 2).add(EnumTag.MAGIC, 2); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.OCCULT.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.OTHERWORLDLY.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.STARK.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.AIRY.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.FIREY.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.WATERY.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.EARTHY.ordinal(), tags); + ThaumcraftApi.registerObjectTag(Config.combs.itemID, CombType.INFUSED.ordinal(), tags); + + // Tagging capsules. + tags = new ObjectTags().add(EnumTag.VOID, 2).add(EnumTag.MAGIC, 2); + ThaumcraftApi.registerComplexObjectTag(Config.magicCapsule.itemID, LiquidType.EMPTY.ordinal(), tags); + + tags = new ObjectTags(Config.magicCapsule.itemID, LiquidType.EMPTY.ordinal()) + .add(EnumTag.WATER, 8); + ThaumcraftApi.registerObjectTag(Config.magicCapsule.itemID, LiquidType.WATER.ordinal(), tags); + tags = new ObjectTags(Config.magicCapsule.itemID, LiquidType.EMPTY.ordinal()) + .add(EnumTag.FIRE, 12).add(EnumTag.ROCK, 4); + ThaumcraftApi.registerObjectTag(Config.magicCapsule.itemID, LiquidType.LAVA.ordinal(), tags); + + for (EnumTag tag : EnumTag.values()) + { + if (tag == EnumTag.UNKNOWN) + { + continue; + } + tags = new ObjectTags().add(tag, 1); + ThaumcraftApi.registerObjectTag(Config.solidFlux.itemID, tag.id, tags); + } + } + + private static void setupItemAspectsForestry() + { + ObjectTags tags; + ItemStack itemStack; + + itemStack = BlockInterface.getBlock("candle"); + tags = new ObjectTags().add(EnumTag.LIGHT, 1).add(EnumTag.CONTROL, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = BlockInterface.getBlock("glass"); + tags = new ObjectTags(Block.glass.blockID, 0); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + + // Pulsating propolis + itemStack = ItemInterface.getItem("propolis"); + tags = new ObjectTags().add(EnumTag.CONTROL, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.ELDRITCH, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Propolis.PULSATING.ordinal(), tags); + + itemStack = ItemInterface.getItem("pollen"); + tags = new ObjectTags().add(EnumTag.FLOWER, 1).add(EnumTag.PLANT, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Pollen.NORMAL.ordinal(), tags); + tags = new ObjectTags(itemStack.itemID, ForestryHelper.Pollen.NORMAL.ordinal()).add(EnumTag.COLD, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Pollen.CRYSTALLINE.ordinal(), tags); + + itemStack = ItemInterface.getItem("craftingMaterial"); + tags = new ObjectTags().add(EnumTag.ELDRITCH, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CraftingMaterial.PULSATING_MESH.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.INSECT, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CraftingMaterial.SILK_WISP.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.INSECT, 4).add(EnumTag.CLOTH, 5); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CraftingMaterial.WOVEN_SILK.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.COLD, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CraftingMaterial.ICE_SHARD.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.VALUABLE, 1).add(EnumTag.PLANT, 1).add(EnumTag.INSECT, 2) + .add(EnumTag.CONTROL, 2).add(EnumTag.WOOD, 5); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CraftingMaterial.SCENTED_PANELING.ordinal(), tags); + + 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); + 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); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("apatite"); + tags = new ObjectTags().add(EnumTag.CRYSTAL, 2).add(EnumTag.POWER, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("impregnatedCasing"); + tags = new ObjectTags().add(EnumTag.WOOD, 58).add(EnumTag.PLANT, 8); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("stickImpregnated"); + tags = new ObjectTags().add(EnumTag.WOOD, 8).add(EnumTag.PLANT, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("peat"); + tags = new ObjectTags().add(EnumTag.POWER, 2).add(EnumTag.PLANT, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("ash"); + tags = new ObjectTags().add(EnumTag.DESTRUCTION, 1).add(EnumTag.EXCHANGE, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("honeyDrop"); + tags = new ObjectTags().add(EnumTag.EXCHANGE, 2).add(EnumTag.LIFE, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("honeydew"); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("royalJelly"); + tags = new ObjectTags().add(EnumTag.INSECT, 2).add(EnumTag.POWER, 1).add(EnumTag.VALUABLE, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("honeyPot"); + tags = new ObjectTags().add(EnumTag.LIFE, 2); + ThaumcraftApi.registerComplexObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("ambrosia"); + tags = new ObjectTags().add(EnumTag.HEAL, 4); + ThaumcraftApi.registerComplexObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("beeswax"); + tags = new ObjectTags().add(EnumTag.CONTROL, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("refractoryWax"); + tags = new ObjectTags().add(EnumTag.FIRE, 3); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("phosphor"); + tags = new ObjectTags().add(EnumTag.FIRE, 2).add(EnumTag.DESTRUCTION, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("waxCapsule"); + tags = new ObjectTags().add(EnumTag.CONTROL, 1).add(EnumTag.VOID, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("waxCapsuleWater"); + tags = new ObjectTags().add(EnumTag.CONTROL, 1).add(EnumTag.VOID, 1).add(EnumTag.WATER, 4); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("refractoryEmpty"); + tags = new ObjectTags().add(EnumTag.FIRE, 1).add(EnumTag.CONTROL, 1).add(EnumTag.VOID, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("refractoryWater"); + tags = new ObjectTags().add(EnumTag.FIRE, 1).add(EnumTag.VOID, 1).add(EnumTag.WATER, 4); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("refractoryLava"); + tags = new ObjectTags().add(EnumTag.VOID, 1).add(EnumTag.FIRE, 7).add(EnumTag.WATER, 1).add(EnumTag.ROCK, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("canEmpty"); + tags = new ObjectTags().add(EnumTag.METAL, 1).add(EnumTag.VOID, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("canWater"); + tags = new ObjectTags().add(EnumTag.METAL, 1).add(EnumTag.VOID, 1).add(EnumTag.WATER, 4); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + itemStack = ItemInterface.getItem("canLava"); + tags = new ObjectTags().add(EnumTag.METAL, 1).add(EnumTag.VOID, 1).add(EnumTag.FIRE, 6).add(EnumTag.WATER, 1).add(EnumTag.ROCK, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, itemStack.getItemDamage(), tags); + + itemStack = ItemInterface.getItem("beeComb"); + tags = new ObjectTags().add(EnumTag.INSECT, 2).add(EnumTag.TRAP, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.FIRE, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Comb.SIMMERING.ordinal(), tags); + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.COLD, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Comb.FROZEN.ordinal(), tags); + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.CROP, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Comb.WHEATEN.ordinal(), tags); + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.FUNGUS, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Comb.MOSSY.ordinal(), tags); + + itemStack = ItemInterface.getItem("ambrosia"); + tags = new ObjectTags().add(EnumTag.LIFE, 2).add(EnumTag.HEAL, 4); + + // Forestry's wood + itemStack = BlockInterface.getBlock("log1"); + tags = new ObjectTags().add(EnumTag.WOOD, 8); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + itemStack = BlockInterface.getBlock("log2"); // Same tags + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + itemStack = BlockInterface.getBlock("log3"); // Same tags. + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + itemStack = BlockInterface.getBlock("log4"); // Still same tags. + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + + itemStack = ItemInterface.getItem("sapling"); + tags = new ObjectTags().add(EnumTag.PLANT, 4).add(EnumTag.WOOD, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); + + // BEES! + itemStack = ItemInterface.getItem("beeDroneGE"); + tags = new ObjectTags().add(EnumTag.INSECT, 1).add(EnumTag.FLIGHT, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); // All drones + + tags = new ObjectTags(itemStack.itemID, -1).add(EnumTag.VALUABLE, 4); // Get drone tags & add valuable + itemStack = ItemInterface.getItem("beePrincessGE"); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); // All princesses. + + tags = new ObjectTags().add(EnumTag.VALUABLE, 8).add(EnumTag.INSECT, 2).add(EnumTag.FLIGHT, 4); + itemStack = ItemInterface.getItem("beeQueenGE"); + ThaumcraftApi.registerObjectTag(itemStack.itemID, -1, tags); //All queens. + + itemStack = ItemInterface.getItem("circuitboards"); + tags = new ObjectTags().add(EnumTag.CRYSTAL, 2).add(EnumTag.METAL, 5).add(EnumTag.MECHANISM, 10) + .add(EnumTag.POWER, 10); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CircuitBoard.BASIC.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.MECHANISM, 10).add(EnumTag.POWER, 10).add(EnumTag.METAL, 14) + .add(EnumTag.CONTROL, 2).add(EnumTag.EXCHANGE, 2); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CircuitBoard.ENHANCED.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.MECHANISM, 10).add(EnumTag.POWER, 10).add(EnumTag.METAL, 14); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CircuitBoard.REFINED.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.MECHANISM, 10).add(EnumTag.POWER, 10).add(EnumTag.METAL, 19) + .add(EnumTag.VALUABLE, 10); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.CircuitBoard.INTRICATE.ordinal(), tags); + + 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); + 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); + 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); + 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); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.GOLD.ordinal(), tags); + tags = new ObjectTags(Item.diamond.itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.DIAMOND.ordinal(), tags); + tags = new ObjectTags(Block.obsidian.blockID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.OBSIDIAN.ordinal(), tags); + tags = new ObjectTags(Item.blazePowder.itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.BLAZE.ordinal(), tags); + tags = new ObjectTags().add(EnumTag.MOTION, 2).add(EnumTag.CONTROL, 2).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.RUBBER.ordinal(), tags); + tags = new ObjectTags(Item.emerald.itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.EMERALD.ordinal(), tags); + tags = new ObjectTags(ItemInterface.getItem("apatite").itemID, 0).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.APATITE.ordinal(), tags); + tags = new ObjectTags(Item.dyePowder.itemID, 4).add(EnumTag.MECHANISM, 1).add(EnumTag.POWER, 1); + ThaumcraftApi.registerObjectTag(itemStack.itemID, ForestryHelper.Tube.LAPIS.ordinal(), tags); + } + + private static void setupItemAspectsExtraBees() + { + ItemStack itemStack; + ObjectTags tags; + + 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() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.INSECT, 9).add(EnumTag.MAGIC, 4).add(EnumTag.FLUX, 4); + ResearchItem starkHint = new ResearchItem("STARKHINT", tags, 5, 2, ItemInterface.getItem("beeQueenGE")) + .setParents(startNode) + .registerResearchItem(); + + 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() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.CROP, 20).add(EnumTag.EARTH, 20).add(EnumTag.WATER, 5); + ResearchItem fertilizer = new ResearchItem("FERTILIZER", tags, 16, 0, ItemInterface.getItem("apatite")) + .setParents(startNode) + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.WOOD, 10).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) + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.TOOL, 5).add(EnumTag.INSECT, 10).add(EnumTag.ARMOR, 5).add(EnumTag.EXCHANGE, 6) + .add(EnumTag.MAGIC, 8); + ResearchItem magicFrame2 = new ResearchItem("HIVEFRAME2", tags, 8, -2, Config.hiveFrameResilient) + .setParents(magicFrame).setHidden() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.TOOL, 4).add(EnumTag.INSECT, 10).add(EnumTag.LIFE, 5).add(EnumTag.EXCHANGE, 6) + .add(EnumTag.HEAL, 2).add(EnumTag.FLOWER, 6); + ResearchItem gentleFrame = new ResearchItem("HIVEFRAMEGENTLE", tags, 12, -2, Config.hiveFrameGentle) + .setParents(magicFrame).setHidden() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.TOOL, 4).add(EnumTag.INSECT, 10).add(EnumTag.LIFE, 6).add(EnumTag.EXCHANGE, 8) + .add(EnumTag.MAGIC, 8).add(EnumTag.MOTION, 4).add(EnumTag.FLESH, 4); + ResearchItem metabolicFrame = new ResearchItem("HIVEFRAMEMETA", tags, 9, -3, Config.hiveFrameMetabolic) + .setParents(magicFrame).setHidden() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.TOOL, 5).add(EnumTag.INSECT, 10).add(EnumTag.DEATH, 15).add(EnumTag.EXCHANGE, 6) + .add(EnumTag.MAGIC, 8).add(EnumTag.POISON, 6); + ResearchItem necroticFrame = new ResearchItem("HIVEFRAMENECRO", tags, 11, -3, Config.hiveFrameNecrotic) + .setParents(magicFrame).setHidden() + .registerResearchItem(); + + tags = new ObjectTags().add(EnumTag.TOOL, 5).add(EnumTag.INSECT, 10).add(EnumTag.TIME, 4); + ResearchItem temporalFrame = new ResearchItem("HIVEFRAMETIME", tags, 9, -5, Config.hiveFrameTemporal) + .setParents(magicFrame).setHidden() + .registerResearchItem(); + } + + public static void registerResearch() + { + ThaumcraftApi.registerResearchXML(CommonProxy.TCBEES_RESEARCH + "research.xml"); + } +} diff --git a/thaumicbees_src/thaumicbees/compat/ForestryHelper.java b/thaumicbees_src/thaumicbees/compat/ForestryHelper.java new file mode 100644 index 0000000..81bd6a8 --- /dev/null +++ b/thaumicbees_src/thaumicbees/compat/ForestryHelper.java @@ -0,0 +1,94 @@ +package thaumicbees.compat; + +import net.minecraft.item.Item; +import forestry.api.core.ItemInterface; +import thaumicbees.main.Config; + +public class ForestryHelper +{ + public static void getForestryBlocks() + { + + } + + public static void getForestryItems() + { + Config.fBeeComb = Item.itemsList[ItemInterface.getItem("beeComb").itemID]; + Config.fPollen = Item.itemsList[ItemInterface.getItem("pollen").itemID]; + Config.fCraftingResource = Item.itemsList[ItemInterface.getItem("craftingMaterial").itemID]; + } + + public enum CraftingMaterial + { + PULSATING_DUST, // unused + PULSATING_MESH, + SILK_WISP, + WOVEN_SILK, + DISSIPATION_CHARGE, + ICE_SHARD, + SCENTED_PANELING, + ; + } + + public enum Comb + { + HONEY, + COCOA, + SIMMERING, + STRINGY, + FROZEN, + DRIPPING, + SILKY, + PARCHED, + MYSTERIOUS, + IRRADIATED, + POWDERY, + REDDENED, + DARKENED, + OMEGA, + WHEATEN, + MOSSY, + ; + } + + public enum Propolis + { + NORMAL, + STICKY, // Unused. + PULSATING, + SILKY, + ; + } + + public enum Pollen + { + NORMAL, + CRYSTALLINE, + ; + } + + public enum CircuitBoard + { + BASIC, + ENHANCED, + REFINED, + INTRICATE, + ; + } + + public enum Tube + { + COPPER, + TIN, + BRONZE, + IRON, + GOLD, + DIAMOND, + OBSIDIAN, + BLAZE, + RUBBER, + EMERALD, + APATITE, + LAPIS + } +} diff --git a/thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java b/thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java new file mode 100644 index 0000000..b5c98b9 --- /dev/null +++ b/thaumicbees_src/thaumicbees/compat/ShapelessBeeInfusionCraftingRecipe.java @@ -0,0 +1,158 @@ +package thaumicbees.compat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import forestry.api.apiculture.EnumBeeChromosome; +import forestry.api.genetics.IAllele; + +import net.minecraft.block.Block; +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.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import thaumcraft.api.ObjectTags; +import thaumcraft.api.ThaumcraftApi; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.crafting.ShapelessInfusionCraftingRecipes; +import thaumcraft.api.research.ResearchList; + +public class ShapelessBeeInfusionCraftingRecipe extends ShapelessInfusionCraftingRecipes +{ + private String alleleId; + private byte alleleSlot; + + /** + * Creates & adds a Crafting recipe to Thaumcraft for our Stark bee infusions. + */ + public static void createNewRecipe(String key, String researchKey, ItemStack output, Object[] input, + int auraCost, ObjectTags tags, IAllele allele, EnumBeeChromosome slot) + { + ArrayList inputList = new ArrayList(input.length); + for (Object item : input) + { + if (item instanceof ItemStack) + { + inputList.add(((ItemStack) item).copy()); + } + else if (item instanceof Item) + { + inputList.add(new ItemStack((Item)item)); + } + else if (item instanceof Block) + { + inputList.add(new ItemStack((Block)item)); + } + else + { + throw new RuntimeException("Invalid shapeless crafting recipe!"); + } + } + ThaumcraftApi.getCraftingRecipes().add( + new ShapelessBeeInfusionCraftingRecipe(key, output, inputList, auraCost, tags, allele, slot) + ); + ResearchList.craftingRecipesForResearch.put(researchKey, Arrays.asList(ThaumcraftApi.getCraftingRecipes().size()-1)); + } + + private ShapelessBeeInfusionCraftingRecipe(String key, ItemStack output, List itemList, int cost, ObjectTags tags, + IAllele allele, EnumBeeChromosome slot) + { + super(key, output, itemList, cost, tags); + + this.alleleId = allele.getUID(); + this.alleleSlot = (byte)slot.ordinal(); + } + + @Override + public boolean matches(IInventory craftingInventory, EntityPlayer player) + { + // We'll remove items from the list as they are found. + ArrayList recipeItemsList = new ArrayList(this.recipeItems); + + boolean invalidItemFound = false; + + if (key.length() == 0 || (key.length() > 0 && ThaumcraftApiHelper.isResearchComplete(player.username, key))) + { + + for (int i = 0; i < 3 && !invalidItemFound; ++i) + { + for (int j = 0; j < 3 && !invalidItemFound; ++j) + { + ItemStack itemStack = ThaumcraftApiHelper.getStackInRowAndColumn(craftingInventory, j, i); + + if (itemStack != null) + { + Iterator itr = recipeItemsList.iterator(); + boolean currentItemInRecipe = false; + + while (itr.hasNext()) + { + ItemStack recipeItem = itr.next(); + + if (itemStack.itemID == recipeItem.itemID && (recipeItem.getItemDamage() == -1 || itemStack.getItemDamage() == recipeItem.getItemDamage())) + { + if (recipeItem.hasTagCompound()) + { + currentItemInRecipe = this.hasMatchingChromosome(itemStack); + } + else + { + currentItemInRecipe = true; + } + } + + if (currentItemInRecipe) + { + itr.remove(); + break; + } + } + + if (!currentItemInRecipe) + { + invalidItemFound = true; + } + } + } + } + } + + return recipeItemsList.isEmpty() && !invalidItemFound; + } + + private boolean hasMatchingChromosome(ItemStack itemStack) + { + boolean genesMatch = false; + + NBTTagCompound compoundRoot = itemStack.getTagCompound(); + if (compoundRoot.hasKey("Genome")) + { + NBTTagCompound genome = compoundRoot.getCompoundTag("Genome"); + if (genome.hasKey("Chromosomes")) + { + NBTTagList chromosomes = genome.getTagList("Chromosomes"); + + for (int i = 0; i < chromosomes.tagCount() && !genesMatch; ++i) + { + NBTTagCompound genes = (NBTTagCompound)chromosomes.tagAt(i); + if (genes.hasKey("Slot") && genes.getByte("Slot") == this.alleleSlot) + { + if (genes.getString("UID0").equals(this.alleleId) && genes.getString("UID1").equals(this.alleleId)) + { + genesMatch = true; + } + + } + } + } + } + + return genesMatch; + } + +} diff --git a/thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java b/thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java new file mode 100644 index 0000000..892f0cd --- /dev/null +++ b/thaumicbees_src/thaumicbees/compat/ThaumcraftHelper.java @@ -0,0 +1,110 @@ +package thaumicbees.compat; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import thaumcraft.api.ItemApi; +import thaumicbees.main.Config; +import cpw.mods.fml.common.registry.LanguageRegistry; + +public class ThaumcraftHelper +{ + public static void getThaumcraftBlocks() + { + Config.tcPlant = Block.blocksList[ItemApi.getItem("blockCustomPlant", 0).itemID]; + Config.tcCandle = Block.blocksList[ItemApi.getItem("blockCandle", 0).itemID]; + Config.tcCrystal = Block.blocksList[ItemApi.getItem("blockCrystal", 0).itemID]; + Config.tcMarker = Block.blocksList[ItemApi.getItem("blockMarker", 0).itemID]; + Config.tcJar = Block.blocksList[ItemApi.getItem("blockJar", 0).itemID]; + Config.tcLog = Block.blocksList[ItemApi.getItem("blockMagicalLog", 0).itemID]; + Config.tcLeaf = Block.blocksList[ItemApi.getItem("blockMagicalLeaves", 0).itemID]; + Config.tcWarded = Block.blocksList[ItemApi.getItem("blockWarded", 0).itemID]; + } + + public static void getThaumcraftItems() + { + Config.tcFilledJar = Item.itemsList[ItemApi.getItem("itemJarFilled", 0).itemID]; + Config.tcMiscResource = Item.itemsList[ItemApi.getItem("itemResource", 0).itemID]; + Config.tcEssentiaBottle = Item.itemsList[ItemApi.getItem("itemEssence", 0).itemID]; + Config.tcShard = Item.itemsList[ItemApi.getItem("itemShard", 0).itemID]; + Config.tcGolem = Item.itemsList[ItemApi.getItem("itemGolemPlacer", 0).itemID]; + Config.tcWispEssence = Item.itemsList[ItemApi.getItem("itemWispEssence", 0).itemID]; + Config.tcNuggets = Item.itemsList[ItemApi.getItem("itemNugget", 0).itemID]; + } + + public enum MiscResource + { + ALUMENTUM, + NITOR, + THAUMIUM, + QUICKSILVER, + MAGIC_TALLOW, + ZOMBIE_BRAIN, + AMBER, + ENCHANTED_FABRIC, + FLUX_FILTER, + KNOWLEDGE_FRAGMENT, + MIRRORED_GLASS, + ; + } + + public enum NuggetType + { + IRON, + COPPER, + TIN, + SILVER, + LEAD, + QUICKSILVER, _6, _7, _8,_9,_10,_11,_12,_13,_14,_15, + NATIVE_IRON, + NATIVE_COPPER, + NATIVE_TIN, + NATIVE_SILVER, + NATIVE_LEAD, _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, + NATIVE_GOLD, + ; + } + + public enum ShardType + { + AIR, + FIRE, + WATER, + EARTH, + MAGIC, + DULL, + ; + } + + public enum Entity + { + BRAINY_ZOMBIE("entBrainyZombie", "EntityBrainyZombie"), + GIANT_BRAINY_ZOMBIE("entGiantBrainyZombie", "EntityGiantBrainyZombie"), + WISP("entWisp", "EntityWisp"), + FIREBAT("entFirebat", "EntityFireBat"), + ; + + private static String packageName = "thaumcraft.common.entities.monster."; + + public String entityID; + private String className; + + private Entity(String id, String clazz) + { + this.entityID = id; + this.className = clazz; + } + + public String getClassName() + { + return packageName + this.className; + } + } + + public enum BlockPlant + { + GREATWOOD_SAPLING, + SILVERWOOD_SAPLING, + SILVERLEAF, + CINDERPEARL; + } +} diff --git a/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java b/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java index 71aa5d1..6f8628a 100644 --- a/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java +++ b/thaumicbees_src/thaumicbees/item/types/HiveFrameType.java @@ -13,8 +13,10 @@ public enum HiveFrameType new ObjectTags().add(EnumTag.HEAL, 1).add(EnumTag.LIFE, 1)), METABOLIC("Metabolic Frame", 35, 120, 1f, 1.8f, 1f, 1.2f, 5, new ObjectTags().add(EnumTag.EXCHANGE, 1).add(EnumTag.MOTION, 1)), - NECROTIC("Necrotic Frame", 36, 270, 1f, 1f, 0.4f, 0.75f, 1, + NECROTIC("Necrotic Frame", 36, 290, 1f, 1f, 0.3f, 0.75f, 1, new ObjectTags().add(EnumTag.DEATH, 3).add(EnumTag.POISON, 2)), + TEMPORAL("Temporal Frame", 37, 300, 1f, 1f, 2.5f, 1f, 1, + new ObjectTags().add(EnumTag.TIME, 5)), ; private HiveFrameType(String name, int icon, int damage, diff --git a/thaumicbees_src/thaumicbees/main/ClientProxy.java b/thaumicbees_src/thaumicbees/main/ClientProxy.java index 71daaa4..9ffeb70 100644 --- a/thaumicbees_src/thaumicbees/main/ClientProxy.java +++ b/thaumicbees_src/thaumicbees/main/ClientProxy.java @@ -1,5 +1,7 @@ package thaumicbees.main; +import java.lang.reflect.Field; + import thaumicbees.main.render.BeeRenderEffect; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; @@ -18,6 +20,20 @@ public class ClientProxy extends CommonProxy // Preload the TCBees items file MinecraftForgeClient.preloadTexture(TCBEES_ITEMS_IMAGE); MinecraftForgeClient.preloadTexture(TCBEES_LIQUIDS_IMAGE); + + Field f; + try + { + f = Class.forName("forestry.core.config.Config").getField("enableParticleFX"); + ThaumicBees.getConfig().DrawParticleEffects = f.getBoolean(null); + + f = Class.forName("forestry.core.config.Defaults").getField("TEXTURE_PARTICLES_BEE"); + thaumicbees.main.CommonProxy.FORESTRY_GFX_BEEEFFECTS = (String)f.get(null); + } + catch (Exception e) + { + e.printStackTrace(); + } } @Override diff --git a/thaumicbees_src/thaumicbees/main/Config.java b/thaumicbees_src/thaumicbees/main/Config.java index 4a395dc..d7bd7ef 100644 --- a/thaumicbees_src/thaumicbees/main/Config.java +++ b/thaumicbees_src/thaumicbees/main/Config.java @@ -4,6 +4,7 @@ import java.io.File; import thaumicbees.block.BlockMagicApiary; import thaumicbees.compat.CompatabilityManager; +import thaumicbees.compat.ForestryHelper; import thaumicbees.compat.ThaumcraftHelper; import thaumicbees.item.ItemCapsule; import thaumicbees.item.ItemComb; @@ -20,11 +21,14 @@ 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.storage.BackpackManager; import forestry.api.storage.EnumBackpackType; import net.minecraft.block.Block; import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.Property; import net.minecraftforge.oredict.OreDictionary; @@ -52,6 +56,7 @@ public class Config public static ItemPollen pollen; public static ItemSolidFlux solidFlux; public static ItemMiscResources miscResources; + public static ItemFood jellyBaby; //----- Liquid Capsules -------------------- public static ItemCapsule magicCapsule; @@ -62,12 +67,18 @@ public class Config public static ItemMagicHiveFrame hiveFrameGentle; public static ItemMagicHiveFrame hiveFrameMetabolic; public static ItemMagicHiveFrame hiveFrameNecrotic; + public static ItemMagicHiveFrame hiveFrameTemporal; //----- Backpacks ------------------------------------------ public static Item thaumaturgeBackpackT1; public static Item thaumaturgeBackpackT2; public static BackpackDefinition thaumaturgeBackpackDef; + //----- Forestry Blocks ------------------------------------ + //----- Forestry Items ------------------------------------- + public static Item fBeeComb; + public static Item fPollen; + public static Item fCraftingResource; //----- Thaumcraft Blocks ---------------------------------- public static Block tcPlant; public static Block tcCandle; @@ -106,6 +117,7 @@ public class Config public void setupBlocks() { ThaumcraftHelper.getThaumcraftBlocks(); + ForestryHelper.getForestryBlocks(); int blockIdBase = 1750; @@ -116,6 +128,7 @@ public class Config public void setupItems() { ThaumcraftHelper.getThaumcraftItems(); + ForestryHelper.getForestryItems(); int itemIDBase = 26090; @@ -162,6 +175,7 @@ public class Config hiveFrameGentle = new ItemMagicHiveFrame(tbConfig.getItem("frameGentle", itemIDBase++).getInt(), HiveFrameType.GENTLE); hiveFrameMetabolic = new ItemMagicHiveFrame(tbConfig.getItem("frameMetabolic", itemIDBase++).getInt(), HiveFrameType.METABOLIC); hiveFrameNecrotic = new ItemMagicHiveFrame(tbConfig.getItem("frameNecrotic", itemIDBase++).getInt(), HiveFrameType.NECROTIC); + hiveFrameTemporal = new ItemMagicHiveFrame(tbConfig.getItem("frameTemporal", itemIDBase++).getInt(), HiveFrameType.TEMPORAL); // Future frames, so they all are clumped together. itemIDBase++; itemIDBase++; @@ -174,6 +188,10 @@ public class Config itemIDBase++; // New items here. + jellyBaby = new ItemFood(tbConfig.getItem("sugarSnack", 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"); } diff --git a/thaumicbees_src/thaumicbees/main/ThaumicBees.java b/thaumicbees_src/thaumicbees/main/ThaumicBees.java index 8ae4e63..415d868 100644 --- a/thaumicbees_src/thaumicbees/main/ThaumicBees.java +++ b/thaumicbees_src/thaumicbees/main/ThaumicBees.java @@ -3,7 +3,6 @@ package thaumicbees.main; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeSubscribe; -import thaumicbees.bees.TBBeeManager; import thaumicbees.compat.CompatabilityManager; import thaumicbees.main.utils.CraftingManager; import thaumicbees.main.utils.VersionInfo; @@ -17,6 +16,7 @@ import forestry.api.core.ItemInterface; @Mod( modid="ThaumicBees", + name="Thaumic Bees", useMetadata=true, acceptedMinecraftVersions=VersionInfo.MCVersion, version=VersionInfo.Version, @@ -33,11 +33,9 @@ public class ThaumicBees private String configsPath; private Config modConfig; - private TBBeeManager plugin; public ThaumicBees() { - this.plugin = new TBBeeManager(); } @Mod.PreInit @@ -72,14 +70,12 @@ public class ThaumicBees this.modConfig.setupItems(); CompatabilityManager.setupBackpacks(); - - plugin.doInit(); } @Mod.PostInit public void postInit(FMLPostInitializationEvent event) { - plugin.postInit(); + this.setupBees(); this.modConfig.saveConfigs(); CompatabilityManager.setupItemAspects(); @@ -98,4 +94,11 @@ public class ThaumicBees { return object.modConfig; } + + private void setupBees() + { + thaumicbees.bees.Allele.setupAdditionalAlleles(); + thaumicbees.bees.BeeSpecies.setupBeeSpecies(); + thaumicbees.bees.BeeMutation.setupMutations(); + } } diff --git a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java index b19026b..67489b8 100644 --- a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java +++ b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java @@ -3,13 +3,15 @@ package thaumicbees.main.utils; import thaumcraft.api.EnumTag; import thaumcraft.api.ObjectTags; import thaumcraft.api.ThaumcraftApi; +import thaumicbees.bees.Allele; import thaumicbees.bees.BeeGenomeManager; -import thaumicbees.bees.genetics.Allele; +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.PropolisType; import thaumicbees.item.types.ResourceType; @@ -40,13 +42,12 @@ public class CraftingManager // Essentia bottles ItemStack output = new ItemStack(Config.tcEssentiaBottle); output.stackSize = 8; - GameRegistry.addRecipe(output, new Object[] - { + GameRegistry.addRecipe(output, new Object[] { " C ", "GPG", "PGP", 'G', Config.wax, 'C', Item.clay, 'P', Block.thinGlass - }); + }); output = new ItemStack(Config.tcEssentiaBottle); output.stackSize = 4; @@ -73,7 +74,7 @@ public class CraftingManager "SWS", "NCN", "SWS", 'S', Item.silk, 'W', Block.cloth, - 'N', Item.goldNugget, + 'N', new ItemStack(Config.tcMiscResource.itemID, 1, ThaumcraftHelper.MiscResource.AMBER.ordinal()), 'C', Block.chest }); @@ -228,7 +229,6 @@ public class CraftingManager }); // Make Aromatic Lumps a swarmer inducer. Chance is /1000. BeeManager.inducers.put(output, 80); - output = Config.miscResources.getStackForType(ResourceType.EXTENDED_FERTILIZER); ItemStack inputA = ItemInterface.getItem("apatite"); @@ -278,63 +278,60 @@ public class CraftingManager 'S', Item.rottenFlesh, 'x', inputA }); + + output = new ItemStack(Config.hiveFrameTemporal); + tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8).add(EnumTag.TIME, 2); + ThaumcraftApi.addInfusionCraftingRecipe("HIVEFRAMETIME", "FRAMETIME", 50, tags, output, new Object[] { + "tSt", "SFS", "tSt", + 't', Item.stick, + 'S', Block.sand, + 'F', inputA + }); - ItemStack drone = BeeGenomeManager.getBeeNBTForSpecies(Allele.Stark, EnumBeeType.DRONE); - ItemStack princess = BeeGenomeManager.getBeeNBTForSpecies(Allele.Stark, EnumBeeType.PRINCESS); - ItemStack airDrone = Allele.Air.getBeeItem(EnumBeeType.DRONE); - ItemStack airPrincess = Allele.Air.getBeeItem(EnumBeeType.PRINCESS); - ItemStack waterDrone = Allele.Water.getBeeItem(EnumBeeType.DRONE); - ItemStack waterPrincess = Allele.Water.getBeeItem(EnumBeeType.PRINCESS); - ItemStack earthDrone = Allele.Earth.getBeeItem(EnumBeeType.DRONE); - ItemStack earthPrincess = Allele.Earth.getBeeItem(EnumBeeType.PRINCESS); - ItemStack fireDrone = Allele.Fire.getBeeItem(EnumBeeType.DRONE); - ItemStack firePrincess = Allele.Fire.getBeeItem(EnumBeeType.PRINCESS); - ItemStack magicDrone = Allele.Infused.getBeeItem(EnumBeeType.DRONE); - ItemStack magicPrincess = Allele.Infused.getBeeItem(EnumBeeType.PRINCESS); + ItemStack drone = BeeGenomeManager.getBeeNBTForSpecies(BeeSpecies.STARK, EnumBeeType.DRONE); + ItemStack princess = BeeGenomeManager.getBeeNBTForSpecies(BeeSpecies.STARK, EnumBeeType.PRINCESS); String researchKey = "BEEINFUSION"; tags = (new ObjectTags()).add(EnumTag.WIND, 40).add(EnumTag.MOTION, 24); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION1", airDrone, + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION1", BeeSpecies.AIR.getBeeItem(EnumBeeType.DRONE), new ItemStack[] { drone, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.AIR.ordinal())}, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION2", airPrincess, + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION2", BeeSpecies.AIR.getBeeItem(EnumBeeType.PRINCESS), new ItemStack[] { princess , new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.AIR.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); tags = (new ObjectTags()).add(EnumTag.FIRE, 40).add( EnumTag.POWER, 24); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION3", fireDrone, new Object[] + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION3", BeeSpecies.FIRE.getBeeItem(EnumBeeType.DRONE), new Object[] { drone, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.FIRE.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION4", firePrincess, new Object[] + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION4", BeeSpecies.FIRE.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.FIRE.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); tags = (new ObjectTags()).add(EnumTag.WATER, 40).add( EnumTag.COLD, 24); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION5", waterDrone, new Object[] + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION5", BeeSpecies.WATER.getBeeItem(EnumBeeType.DRONE), new Object[] { drone, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.WATER.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION6", waterPrincess, new Object[] + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION6", BeeSpecies.WATER.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.WATER.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); tags = (new ObjectTags()).add(EnumTag.EARTH, 40).add( EnumTag.ROCK, 24); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION7", earthDrone, new Object[] + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION7", BeeSpecies.EARTH.getBeeItem(EnumBeeType.DRONE), new Object[] { drone, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.EARTH.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION8", earthPrincess, new Object[] + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION8", BeeSpecies.EARTH.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.EARTH.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); tags = new ObjectTags().add(EnumTag.MAGIC, 40).add(EnumTag.FLUX, 24); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION9", magicDrone, new Object[] + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION9", BeeSpecies.INFUSED.getBeeItem(EnumBeeType.DRONE), new Object[] { drone, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION0", magicPrincess, new Object[] + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); + ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION0", BeeSpecies.INFUSED.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal()) }, - 100, tags, Allele.Stark, EnumBeeChromosome.SPECIES); - - + 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); registerLiquidContainer(Config.magicCapsule); } @@ -345,9 +342,9 @@ public class CraftingManager ItemStack filled; LiquidStack liquid = null; - for (LiquidType l : LiquidType.values()) + for (LiquidType liquidType : LiquidType.values()) { - switch (l) + switch (liquidType) { case EMPTY: liquid = null; @@ -359,23 +356,23 @@ public class CraftingManager liquid = new LiquidStack(Block.lavaStill, baseCapsule.getType().capacity); break; default: - liquid = LiquidDictionary.getLiquid(l.liquidID, baseCapsule.getType().capacity); + liquid = LiquidDictionary.getLiquid(liquidType.liquidID, baseCapsule.getType().capacity); break; } if (liquid != null) { - filled = new ItemStack(baseCapsule, 1, l.ordinal()); + filled = new ItemStack(baseCapsule, 1, liquidType.ordinal()); LiquidContainerRegistry.registerLiquid(new LiquidContainerData(liquid, filled, empty)); // Register with Squeezer/Bottler RecipeManagers.bottlerManager.addRecipe(5, liquid, empty, filled); RecipeManagers.squeezerManager.addRecipe(10, new ItemStack[] {filled} , liquid, Config.wax.getStackForType(WaxType.MAGIC), 20); - l.available = true; + liquidType.available = true; } } // Empty will be set to unavailable. Obviously, it always is. LiquidType.EMPTY.available = true; } -} +} \ No newline at end of file diff --git a/thaumicbees_src/thaumicbees/main/utils/VersionInfo.java b/thaumicbees_src/thaumicbees/main/utils/VersionInfo.java index d8ee5eb..a62062b 100644 --- a/thaumicbees_src/thaumicbees/main/utils/VersionInfo.java +++ b/thaumicbees_src/thaumicbees/main/utils/VersionInfo.java @@ -9,6 +9,6 @@ public class VersionInfo public static final String Logo = "/gfx/thaumicbees/logo.png"; - public static final String Depends = "required-after:Forestry;required-after:Thaumcraft@[3.0.2b,);after:ExtraBees"; + public static final String Depends = "required-after:Forestry;required-after:Thaumcraft@[3.0.3,);after:ExtraBees"; } diff --git a/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java b/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java new file mode 100644 index 0000000..0bed05e --- /dev/null +++ b/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java @@ -0,0 +1,280 @@ +package thaumicbees.tile; + +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; +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; + +public class TileEntityMagicApiary extends TileEntity implements IInventory, IBeeHousing +{ + + @Override + public int getSizeInventory() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public ItemStack getStackInSlot(int var1) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public ItemStack decrStackSize(int var1, int var2) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setInventorySlotContents(int var1, ItemStack var2) + { + // 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; + } + + @Override + public float getMutationModifier(IBeeGenome genome, IBeeGenome mate) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public float getProductionModifier(IBeeGenome genome) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public float getFloweringModifier(IBeeGenome genome) + { + // TODO Auto-generated method stub + return 0; + } + + @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; + } + + @Override + 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; + } + + @Override + public int getYCoord() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getZCoord() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public ItemStack getQueen() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public ItemStack getDrone() + { + // TODO Auto-generated method stub + return null; + } + + @Override + 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; + } + + @Override + public EnumTemperature getTemperature() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public EnumHumidity getHumidity() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public World getWorld() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getOwnerName() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setErrorState(int state) + { + // TODO Auto-generated method stub + + } + + @Override + public int getErrorOrdinal() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public boolean canBreed() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addProduct(ItemStack product, boolean all) + { + // TODO Auto-generated method stub + return false; + } +}