From aed979a19fb09353ea65171964e7792f01751f44 Mon Sep 17 00:00:00 2001 From: MysteriousAges Date: Tue, 26 Feb 2013 17:56:57 -0800 Subject: [PATCH] dev --- thaumicbees_res/changelog.txt | 2 +- .../gfx/thaumicbees/items/items.png | Bin 65907 -> 68602 bytes thaumicbees_res/lang/thaumicbees/en_US.xml | 1 + .../utils/GenericInventory.java | 199 ++++++++++++++++++ .../utils/GenericOwnedInventory.java | 71 +++++++ .../thaumicbees/block/BlockMagicApiary.java | 39 +++- .../thaumicbees/block/BlockPlanks.java | 7 +- .../thaumicbees/block/BlockWoodSlab.java | 7 +- .../LogicMagicApiary.java} | 181 ++++++++-------- .../block/TileEntityMagicApiary.java | 97 +++++++++ thaumicbees_src/thaumicbees/main/Config.java | 24 ++- .../thaumicbees/main/ThaumicBees.java | 1 + .../main/utils/CraftingManager.java | 61 ++++-- .../main/utils/compat/ForestryHelper.java | 42 ++++ 14 files changed, 600 insertions(+), 132 deletions(-) create mode 100644 thaumicbees_src/net/mysteriousages/utils/GenericInventory.java create mode 100644 thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java rename thaumicbees_src/thaumicbees/{tile/TileEntityMagicApiary.java => block/LogicMagicApiary.java} (52%) create mode 100644 thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java diff --git a/thaumicbees_res/changelog.txt b/thaumicbees_res/changelog.txt index 22e5f56..b4022ef 100644 --- a/thaumicbees_res/changelog.txt +++ b/thaumicbees_res/changelog.txt @@ -28,7 +28,7 @@ Fixed the issue with certain items appearing twice in Creative Mode tabs. 1.3.0a Some bug fixes, including uncommenting some mutation-related code, research tweaking. -Added the last bee for a long while, probably. Good luck getting it. Posted Image +Added the last bee for a long while, probably. Good luck getting it. Common TB crashes stemming from Forestry issues should now be reported a little better, especially the backpack registration & item texture file related things. Errors should appear in your log, so make sure you read the log before you report the error here. It could be something silly on your end that is causing the crash. diff --git a/thaumicbees_res/gfx/thaumicbees/items/items.png b/thaumicbees_res/gfx/thaumicbees/items/items.png index 9dda5305dbd7faf3572de0a4c30b037530e362ae..c27b57898312b32fe706966443f5ffb717284980 100644 GIT binary patch delta 34095 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 delta 31379 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

)dV#Ht$6VZ7hUb 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 Iho&F?AIb$65dZ)H diff --git a/thaumicbees_res/lang/thaumicbees/en_US.xml b/thaumicbees_res/lang/thaumicbees/en_US.xml index 74eb1b7..85f4f1a 100644 --- a/thaumicbees_res/lang/thaumicbees/en_US.xml +++ b/thaumicbees_res/lang/thaumicbees/en_US.xml @@ -9,6 +9,7 @@ Greatwood Slab Silverwood Planks Silverwood Slab + Magic Apiary Occult Comb diff --git a/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java b/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java new file mode 100644 index 0000000..0c0cb3d --- /dev/null +++ b/thaumicbees_src/net/mysteriousages/utils/GenericInventory.java @@ -0,0 +1,199 @@ +package net.mysteriousages.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +/** + * Provides some common functionality for Inventory clusters. Performs bounds-checking on slot args. + * + * @author MysteriousAges + * + */ +public class GenericInventory implements IInventory +{ + private ItemStack[] inventory; + private String name; + private int stackLimit; + + public GenericInventory(String inventoryName, int slotCount) + { + this(inventoryName, slotCount, 64); + } + + public GenericInventory(String inventoryName, int slotCount, int maxStackSize) + { + this.inventory = new ItemStack[slotCount]; + this.name = inventoryName; + this.stackLimit = maxStackSize; + } + + @Override + public int getSizeInventory() + { + return this.inventory.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + ItemStack result = null; + + if (this.slotNumberValid(slot)) + { + result = this.inventory[slot]; + } + + return result; + } + + @Override + public ItemStack decrStackSize(int slot, int count) + { + ItemStack result = null; + + if (this.slotNumberValid(slot)) + { + if (this.inventory[slot] != null) + { + result = this.inventory[slot].splitStack(Math.min(count, this.inventory[slot].stackSize)); + if (this.inventory[slot].stackSize <= 0) + { + this.inventory[slot] = null; + } + } + } + + return result; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + return this.getStackInSlot(slot); + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + if (this.slotNumberValid(slot)) + { + this.inventory[slot] = itemStack; + } + } + + @Override + public String getInvName() + { + return this.name; + } + + @Override + public int getInventoryStackLimit() + { + return this.stackLimit; + } + + public ItemStack[] getInventory() + { + return this.inventory; + } + + @Override + public void onInventoryChanged() { } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + /** + * Accepts an ItemStack and attempts to merge it with a similar item stack or an empty slot. + * @param stack + * @return Any leftover items, or null if the merge completed successfully. + */ + public ItemStack attemptStackMerge(ItemStack stack) + { + for (int i = 0; i < this.inventory.length; ++i) + { + if (this.inventory[i] == null) + { + this.inventory[i] = stack; + stack = null; + break; + } + else if (this.inventory[i].isItemEqual(stack)) + { + int freeSlots = stack.getItem().getItemStackLimit() - this.inventory[i].stackSize; + + this.inventory[i].stackSize += freeSlots; + stack.stackSize -= freeSlots; + } + + if (stack.stackSize <= 0) + { + stack = null; + break; + } + } + + return stack; + } + + public void writeToNBT(NBTTagCompound tag) + { + tag.setString("Name", this.name); + tag.setInteger("Size", this.inventory.length); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < this.inventory.length; ++i) + { + NBTTagCompound itemTag = new NBTTagCompound(); + itemTag.setByte("Slot", (byte)i); + this.inventory[i].writeToNBT(itemTag); + itemList.appendTag(itemTag); + } + + tag.setTag("Items", itemList); + } + + public void readFromNBT(NBTTagCompound tag) + { + this.name = tag.getString("Name"); + NBTTagList itemList = tag.getTagList("Items"); + int length = tag.getInteger("Size"); + this.inventory = new ItemStack[length]; + + for (int i = 0; i < itemList.tagCount(); ++i) + { + NBTTagCompound item = (NBTTagCompound)itemList.tagAt(i); + int slotId = item.getByte("Slot"); + if (slotId >= 0 && slotId < this.inventory.length) + { + this.inventory[slotId] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + /** + * Checks to see if the given slot number is valid with the inventory size + * @param slot + * @return True, if slot in [0, inventory size) + */ + protected boolean slotNumberValid(int slot) + { + return slot >= 0 && slot < this.inventory.length; + } + + @Override + public void openChest() { } + + @Override + public void closeChest() { } + + +} diff --git a/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java b/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java new file mode 100644 index 0000000..042d2f6 --- /dev/null +++ b/thaumicbees_src/net/mysteriousages/utils/GenericOwnedInventory.java @@ -0,0 +1,71 @@ +package net.mysteriousages.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Provides basic functionality for an owned inventory. + * @author MysteriousAges + * + */ +public class GenericOwnedInventory extends GenericInventory +{ + private String ownerName; + private boolean isPublic; + + public GenericOwnedInventory(EntityPlayer player, String inventoryName, int slotCount) + { + super(inventoryName, slotCount); + this.setInfo(player); + } + + public GenericOwnedInventory(EntityPlayer player, String inventoryName, int slotCount, int maxStackSize) + { + super(inventoryName, slotCount, maxStackSize); + this.setInfo(player); + } + + private void setInfo(EntityPlayer player) + { + this.ownerName = player.username; + } + + public void setPubliclyAccessible(boolean flag) + { + this.isPublic = flag; + } + + public String getOwnerName() + { + return this.ownerName; + } + + public boolean isPubliclyAccessible() + { + return this.isPublic; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return this.isPublic || this.ownerName.equalsIgnoreCase(player.username); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setString("Owner", this.ownerName); + tag.setBoolean("PublicFlag", this.isPublic); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + this.ownerName = tag.getString("Owner"); + this.isPublic = tag.getBoolean("PublicFlag"); + } + + +} diff --git a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java index f03677c..02a23ef 100644 --- a/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java +++ b/thaumicbees_src/thaumicbees/block/BlockMagicApiary.java @@ -3,9 +3,10 @@ package thaumicbees.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import thaumicbees.main.CommonProxy; -import thaumicbees.tile.TileEntityMagicApiary; -import net.minecraft.block.BlockContainer; +import thaumicbees.block.TileEntityMagicApiary; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLiving; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; @@ -16,41 +17,57 @@ import forestry.api.apiculture.IBeeHousing; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; -public class BlockMagicApiary extends BlockContainer +public class BlockMagicApiary extends Block { public BlockMagicApiary(int par1) { super(par1, Material.wood); this.setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); this.setBlockName("Magic Apiary"); - this.blockIndexInTexture = 48; + this.blockIndexInTexture = 50; + this.setHardness(2f); + this.setResistance(5f); } @Override @SideOnly(Side.CLIENT) public int getBlockTexture(IBlockAccess worldAccess, int x, int y, int z, int side) { - int texture = 48; - if (side == 0 || side == 1) + int texture = 50; + if (side == 0) { - texture = 50; + texture = 51; + } + else if (side == 1) + { + TileEntityMagicApiary tileInfo = (TileEntityMagicApiary)worldAccess.getBlockTileEntity(x, y, z); + if (tileInfo != null && tileInfo.isMaster()) + { + texture = 52; + } + else + { + texture = 51; + } } return texture; } public int getBlockTextureFromSideAndMetadata(int side, int meta) { - int texture = 48; + int texture = 50; if (side == 0 || side == 1) { - texture = 50; + texture = 51; } return texture; } @Override - public TileEntity createNewTileEntity(World var1) + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entity) { - return new TileEntityMagicApiary(); + super.onBlockPlacedBy(world, x, y, z, entity); + + // Validate block arrangement } } diff --git a/thaumicbees_src/thaumicbees/block/BlockPlanks.java b/thaumicbees_src/thaumicbees/block/BlockPlanks.java index 11371f6..a24feee 100644 --- a/thaumicbees_src/thaumicbees/block/BlockPlanks.java +++ b/thaumicbees_src/thaumicbees/block/BlockPlanks.java @@ -28,7 +28,12 @@ public class BlockPlanks extends Block @Override public int getBlockTextureFromSideAndMetadata(int side, int meta) { - return PlankType.getType(meta).textureIdx; + int tx = 256; + if (PlankType.getType(meta) != null) + { + tx = PlankType.getType(meta).textureIdx; + } + return tx; } @Override diff --git a/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java b/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java index d730bd8..85bfdd8 100644 --- a/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java +++ b/thaumicbees_src/thaumicbees/block/BlockWoodSlab.java @@ -32,7 +32,12 @@ public class BlockWoodSlab extends BlockHalfSlab @Override public int getBlockTextureFromSideAndMetadata(int side, int meta) { - return PlankType.getType(meta & 7).textureIdx; + int tx = 256; + if (PlankType.getType(meta & 7) != null) + { + tx = PlankType.getType(meta & 7).textureIdx; + } + return tx; } public int idDropped(int id, Random rand, int par3) diff --git a/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java b/thaumicbees_src/thaumicbees/block/LogicMagicApiary.java similarity index 52% rename from thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java rename to thaumicbees_src/thaumicbees/block/LogicMagicApiary.java index 0bed05e..f7fd94c 100644 --- a/thaumicbees_src/thaumicbees/tile/TileEntityMagicApiary.java +++ b/thaumicbees_src/thaumicbees/block/LogicMagicApiary.java @@ -1,140 +1,140 @@ -package thaumicbees.tile; +package thaumicbees.block; +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.mysteriousages.utils.GenericInventory; +import forestry.api.apiculture.BeeManager; import forestry.api.apiculture.IBee; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeekeepingLogic; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; +import thaumicbees.main.utils.compat.ForestryHelper; -public class TileEntityMagicApiary extends TileEntity implements IInventory, IBeeHousing +public class LogicMagicApiary implements IBeeHousing { - - @Override - public int getSizeInventory() + private TileEntityMagicApiary parent; + private String ownerName; + private BiomeGenBase biome; + private IBeekeepingLogic beeLogic; + private GenericInventory tileInventory; + private ArrayList inventoryOverflow; + + private static final int SLOT_ID_QUEEN = 0; + private static final int SLOT_ID_DRONE = 1; + private static final int SLOT_ID_FRAME = 2; + private static final int SLOT_LENGTH_FRAME = 2; + private static final int SLOT_ID_PRODUCE = 4; + private static final int SLOT_LENGTH_PRODUCE = 6; + + public LogicMagicApiary(TileEntityMagicApiary master) { - // TODO Auto-generated method stub - return 0; + this.parent = master; + this.beeLogic = BeeManager.breedingManager.createBeekeepingLogic(this); + this.tileInventory = new GenericInventory("MagicApiary", 11); } - - @Override - public ItemStack getStackInSlot(int var1) + + public TileEntityMagicApiary getParent() { - // TODO Auto-generated method stub - return null; + return parent; } - - @Override - public ItemStack decrStackSize(int var1, int var2) + + public void setOwner(EntityPlayer player) { - // TODO Auto-generated method stub - return null; + this.ownerName = player.username; } - - @Override - public ItemStack getStackInSlotOnClosing(int var1) + + public String getOwner() { - // TODO Auto-generated method stub - return null; + return this.ownerName; } - - @Override - public void setInventorySlotContents(int var1, ItemStack var2) + + public void writeToNBT(NBTTagCompound tag) + { + NBTTagCompound beeTag = new NBTTagCompound(); + this.beeLogic.writeToNBT(beeTag); + tag.setTag("BeeLogic", beeTag); + tag.setString("Owner", this.ownerName); + NBTTagCompound inventory = new NBTTagCompound(); + this.tileInventory.writeToNBT(inventory); + tag.setTag("Inventory", inventory); + + if (this.inventoryOverflow.size() > 0) + { + NBTTagList overflow = new NBTTagList(); + for (int i = 0; i < this.inventoryOverflow.size(); ++i) + { + NBTTagCompound itemTag = new NBTTagCompound(); + this.inventoryOverflow.get(i).writeToNBT(itemTag); + overflow.appendTag(itemTag); + } + } + + } + + public void readFromNBT(NBTTagCompound tag) { - // TODO Auto-generated method stub } - @Override - public String getInvName() - { - return "thaumicbees.magicApiary"; - } - - @Override - public int getInventoryStackLimit() - { - // TODO Auto-generated method stub - return 0; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer var1) - { - return true; - } - - @Override - public void openChest() { } - - @Override - public void closeChest() { } - @Override public float getTerritoryModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getMutationModifier(IBeeGenome genome, IBeeGenome mate) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public float getProductionModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 2f; } @Override public float getFloweringModifier(IBeeGenome genome) { - // TODO Auto-generated method stub - return 0; + return 1f; } @Override public boolean isSealed() { - // TODO Auto-generated method stub return false; } @Override public boolean isSelfLighted() { - // TODO Auto-generated method stub return false; } @Override public boolean isSunlightSimulated() { - // TODO Auto-generated method stub return false; } @Override public boolean isHellish() { - // TODO Auto-generated method stub return false; } @@ -142,49 +142,46 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe public void onQueenChange(ItemStack queen) { // TODO Auto-generated method stub - + } @Override public void wearOutEquipment(int amount) { // TODO Auto-generated method stub - + } @Override public void onQueenDeath(IBee queen) { // TODO Auto-generated method stub - + } @Override public void onPostQueenDeath(IBee queen) { // TODO Auto-generated method stub - + } @Override public int getXCoord() { - // TODO Auto-generated method stub - return 0; + return parent.xCoord; } @Override public int getYCoord() { - // TODO Auto-generated method stub - return 0; + return parent.yCoord; } @Override public int getZCoord() { - // TODO Auto-generated method stub - return 0; + return parent.zCoord; } @Override @@ -205,56 +202,51 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe public void setQueen(ItemStack itemstack) { // TODO Auto-generated method stub - + } @Override public void setDrone(ItemStack itemstack) { // TODO Auto-generated method stub - + } @Override public int getBiomeId() { - // TODO Auto-generated method stub - return 0; + return this.biome.biomeID; } @Override public EnumTemperature getTemperature() { - // TODO Auto-generated method stub - return null; + return ForestryHelper.getEnumTemperatureFromValue(this.biome.temperature); } @Override public EnumHumidity getHumidity() { - // TODO Auto-generated method stub - return null; + return ForestryHelper.getEnumHumidityFromValue(this.biome.rainfall); } @Override public World getWorld() { - // TODO Auto-generated method stub - return null; + return this.getWorld(); } @Override public String getOwnerName() { - // TODO Auto-generated method stub - return null; + return parent.getOwner(); } @Override public void setErrorState(int state) { // TODO Auto-generated method stub - + } @Override @@ -277,4 +269,5 @@ public class TileEntityMagicApiary extends TileEntity implements IInventory, IBe // TODO Auto-generated method stub return false; } + } diff --git a/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java b/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java new file mode 100644 index 0000000..73d1635 --- /dev/null +++ b/thaumicbees_src/thaumicbees/block/TileEntityMagicApiary.java @@ -0,0 +1,97 @@ +package thaumicbees.block; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; + +public class TileEntityMagicApiary extends TileEntity +{ + private String owner; + private LogicMagicApiary logic; + private int masterX; + private int masterY; + private int masterZ; + + public TileEntityMagicApiary(World w) + { + this.setWorldObj(w); + } + + public void setValid(TileEntityMagicApiary masterEntity) + { + this.logic = masterEntity.logic; + this.masterX = masterEntity.xCoord; + this.masterY = masterEntity.yCoord; + this.masterZ = masterEntity.zCoord; + } + + public String getOwner() + { + return this.owner; + } + + public boolean isValidStructure() + { + return false; + } + + public boolean isMaster() + { + boolean flag = false; + + if (this.logic != null) + { + flag = this.logic.getParent() == this; + } + + return flag; + } + + public LogicMagicApiary getLogic() + { + return this.logic; + } + + @Override + public void readFromNBT(NBTTagCompound tagRoot) + { + super.readFromNBT(tagRoot); + this.owner = tagRoot.getString("Owner"); + if (tagRoot.hasKey("Logic")) + { + this.logic = new LogicMagicApiary(this); + this.logic.readFromNBT(tagRoot.getCompoundTag("Logic")); + } + else + { + this.masterX = tagRoot.getInteger("MasterX"); + this.masterY = tagRoot.getInteger("MasterY"); + this.masterZ = tagRoot.getInteger("MasterZ"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagRoot) + { + super.writeToNBT(tagRoot); + tagRoot.setString("Owner", this.owner); + if (this.isMaster()) + { + NBTTagCompound logicTag = new NBTTagCompound(); + this.logic.writeToNBT(logicTag); + tagRoot.setTag("Logic", logicTag); + } + else + { + tagRoot.setInteger("MasterX", this.masterX); + tagRoot.setInteger("MasterY", this.masterY); + tagRoot.setInteger("MasterZ", this.masterZ); + } + } +} diff --git a/thaumicbees_src/thaumicbees/main/Config.java b/thaumicbees_src/thaumicbees/main/Config.java index 05faa44..79997fd 100644 --- a/thaumicbees_src/thaumicbees/main/Config.java +++ b/thaumicbees_src/thaumicbees/main/Config.java @@ -5,6 +5,7 @@ import java.io.File; import thaumicbees.block.BlockMagicApiary; import thaumicbees.block.BlockPlanks; import thaumicbees.block.BlockWoodSlab; +import thaumicbees.block.TileEntityMagicApiary; import thaumicbees.item.ItemCapsule; import thaumicbees.item.ItemComb; import thaumicbees.item.ItemDrop; @@ -17,6 +18,7 @@ import thaumicbees.item.ItemWax; import thaumicbees.item.types.CapsuleType; import thaumicbees.item.types.HiveFrameType; import thaumicbees.item.types.PlankType; +import thaumicbees.item.types.ResourceType; import thaumicbees.main.utils.CompatabilityManager; import thaumicbees.main.utils.LocalizationManager; import thaumicbees.main.utils.compat.ForestryHelper; @@ -26,6 +28,7 @@ import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; +import forestry.api.apiculture.BeeManager; import forestry.api.storage.BackpackManager; import forestry.api.storage.EnumBackpackType; import net.minecraft.block.Block; @@ -36,6 +39,7 @@ import net.minecraft.item.ItemMultiTextureTile; import net.minecraft.item.ItemSlab; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.Property; import net.minecraftforge.oredict.OreDictionary; @@ -144,19 +148,23 @@ public class Config slabWoodHalf = new BlockWoodSlab(tbConfig.getBlock("slabHalf", blockIdBase++).getInt(), false); item = new ItemSlab(slabWoodHalf.blockID - 256, slabWoodHalf, slabWoodFull, false) - .setItemName(slabWoodHalf.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + .setItemName(slabWoodHalf.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); Item.itemsList[slabWoodHalf.blockID] = item; item = new ItemSlab(slabWoodFull.blockID - 256, slabWoodHalf, slabWoodFull, true) - .setItemName(slabWoodFull.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); + .setItemName(slabWoodFull.getBlockName()).setTextureFile(CommonProxy.TCBEES_ITEMS_IMAGE); Item.itemsList[slabWoodFull.blockID] = item; OreDictionary.registerOre("slabWood", new ItemStack(slabWoodHalf, 1, -1)); - blockIdBase++; // Stair - - /*magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase).getInt()); - GameRegistry.registerBlock(magicApiary, "Magic Apiary");*/ + + magicApiary = new BlockMagicApiary(tbConfig.getBlock("magicApiary", blockIdBase++).getInt()); + GameRegistry.registerBlock(magicApiary, "tb.magicApiary"); + } + + public void registerTileEntities() + { + TileEntity.addMapping(TileEntityMagicApiary.class, "MagicApiary"); } public void setupItems() @@ -175,6 +183,10 @@ public class Config drops = new ItemDrop(tbConfig.getItem("drop", itemIDBase++).getInt()); miscResources = new ItemMiscResources(tbConfig.getItem("miscResources", itemIDBase++).getInt()); + + // Make Aromatic Lumps a swarmer inducer. Chance is /1000. + BeeManager.inducers.put(miscResources.getStackForType(ResourceType.AROMATIC_LUMP), 80); + try { // 0x8700C6 = purpleish. diff --git a/thaumicbees_src/thaumicbees/main/ThaumicBees.java b/thaumicbees_src/thaumicbees/main/ThaumicBees.java index 79573ab..3201716 100644 --- a/thaumicbees_src/thaumicbees/main/ThaumicBees.java +++ b/thaumicbees_src/thaumicbees/main/ThaumicBees.java @@ -70,6 +70,7 @@ public class ThaumicBees } this.modConfig.setupBlocks(); + this.modConfig.registerTileEntities(); this.modConfig.setupItems(); CompatabilityManager.setupBackpacks(); diff --git a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java index 235dd42..4a5a935 100644 --- a/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java +++ b/thaumicbees_src/thaumicbees/main/utils/CraftingManager.java @@ -37,6 +37,19 @@ import net.minecraftforge.liquids.LiquidStack; public class CraftingManager { public static void setupCrafting() + { + // Broken up into seperate sections to make things a bit easier to find. + setupVanillaCrafting(); + setupCentrifugeRecipes(); + setupSqueezerRecipes(); + setupCarpenterRecipes(); + setupThaumcraftInfusions(); + + registerLiquidContainer(Config.magicCapsule); + registerLiquidContainer(Config.voidCapsule); + } + + private static void setupVanillaCrafting() { ItemStack input; ItemStack output; @@ -134,7 +147,10 @@ public class CraftingManager }); } } - + } + + private static void setupCentrifugeRecipes() + { // 20 is the 'average' time to centrifuge a comb. RecipeManagers.centrifugeManager.addRecipe(20, Config.combs.getStackForType(CombType.OCCULT), new ItemStack[] {Config.wax.getStackForType(WaxType.MAGIC), ItemInterface.getItem("honeyDrop") }, @@ -188,7 +204,10 @@ public class CraftingManager RecipeManagers.centrifugeManager.addRecipe(8, Config.propolis.getStackForType(PropolisType.INFUSED), new ItemStack[] {new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal())}, new int[] { 10 }); - + } + + private static void setupSqueezerRecipes() + { // Squeezer recipes RecipeManagers.squeezerManager.addRecipe(20, new ItemStack[] {Config.propolis.getStackForType(PropolisType.FIRE) }, new LiquidStack(Block.lavaStill, 250), @@ -196,7 +215,13 @@ public class CraftingManager RecipeManagers.squeezerManager.addRecipe(20, new ItemStack[] {Config.propolis.getStackForType(PropolisType.WATER) }, new LiquidStack(Block.waterStill, 500), new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.WATER.ordinal()), 18); + } + private static void setupCarpenterRecipes() + { + ItemStack input; + ItemStack output; + // Carpenter recipes input = ItemInterface.getItem("craftingMaterial"); input.setItemDamage(3); // Set to Silk Mesh @@ -241,34 +266,37 @@ public class CraftingManager 'D', Config.drops.getStackForType(DropType.ENCHANTED) }); - output = new ItemStack(Config.planksWood, 6, 0); + output = new ItemStack(Config.planksWood, 4, 0); RecipeManagers.carpenterManager.addRecipe(8, new LiquidStack(Block.waterStill, 500), null, output, new Object[] { "B", 'B', new ItemStack(Config.tcLog, 1, 0) }); - output = new ItemStack(Config.planksWood, 8, 1); + output = new ItemStack(Config.planksWood, 6, 1); RecipeManagers.carpenterManager.addRecipe(8, new LiquidStack(Block.waterStill, 500), null, output, new Object[] { "B", 'B', new ItemStack(Config.tcLog, 1, 1) }); - - // Make Aromatic Lumps a swarmer inducer. Chance is /1000. - BeeManager.inducers.put(output, 80); + } + + private static void setupThaumcraftInfusions() + { + ItemStack input; + ItemStack output; output = Config.miscResources.getStackForType(ResourceType.EXTENDED_FERTILIZER); - ItemStack inputA = ItemInterface.getItem("apatite"); + input = ItemInterface.getItem("apatite"); ObjectTags tags = (new ObjectTags()).add(EnumTag.CROP, 12); output.stackSize = 2; ThaumcraftApi.addShapelessInfusionCraftingRecipe("FERTILIZER", "FERTILIZER", 5, tags, output, new Object[] { - inputA + input }); output = new ItemStack(Config.hiveFrameMagic); - inputA = ItemInterface.getItem("frameUntreated"); + input = ItemInterface.getItem("frameUntreated"); tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8); ThaumcraftApi.addShapelessInfusionCraftingRecipe("HIVEFRAME", "FRAMEMAGIC", 50, tags, output, new Object[] { - inputA + input }); output = new ItemStack(Config.hiveFrameResilient); @@ -283,7 +311,7 @@ public class CraftingManager tags = new ObjectTags().add(EnumTag.WOOD, 4).add(EnumTag.INSECT, 8).add(EnumTag.HEAL, 12); ThaumcraftApi.addInfusionCraftingRecipe("HIVEFRAMEGENTLE", "FRAMEGENTLE", 50, tags, output, new Object[] { "www", "wFw", "www", - 'F', inputA, + 'F', input, 'w', ItemInterface.getItem("beeswax") }); @@ -293,7 +321,7 @@ public class CraftingManager .add(EnumTag.EXCHANGE, 8); ThaumcraftApi.addShapelessInfusionCraftingRecipe("HIVEFRAMEMETA", "FRAMEMETABOLIC", 50, tags, output, new Object[] { Item.magmaCream, - inputA + input }); output = new ItemStack(Config.hiveFrameNecrotic); @@ -302,7 +330,7 @@ public class CraftingManager ThaumcraftApi.addInfusionCraftingRecipe("HIVEFRAMENECRO", "FRAMENECROTIC", 50, tags, output, new Object[] { " S ", "SxS", " S ", 'S', Item.rottenFlesh, - 'x', inputA + 'x', input }); output = new ItemStack(Config.hiveFrameTemporal); @@ -311,7 +339,7 @@ public class CraftingManager "tSt", "SFS", "tSt", 't', Item.stick, 'S', Block.sand, - 'F', inputA + 'F', input }); output = Config.voidCapsule.getCapsuleForLiquid(LiquidType.EMPTY); @@ -368,9 +396,6 @@ public class CraftingManager ShapelessBeeInfusionCraftingRecipe.createNewRecipe(researchKey, "BEEINFUSION0", BeeSpecies.INFUSED.getBeeItem(EnumBeeType.PRINCESS), new Object[] { princess, new ItemStack(Config.tcShard, 1, ThaumcraftHelper.ShardType.MAGIC.ordinal()) }, 100, tags, BeeSpecies.STARK, EnumBeeChromosome.SPECIES); - - registerLiquidContainer(Config.magicCapsule); - registerLiquidContainer(Config.voidCapsule); } private static void registerLiquidContainer(ItemCapsule baseCapsule) diff --git a/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java b/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java index ad885bd..94d3617 100644 --- a/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java +++ b/thaumicbees_src/thaumicbees/main/utils/compat/ForestryHelper.java @@ -1,6 +1,8 @@ package thaumicbees.main.utils.compat; import net.minecraft.item.Item; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; import forestry.api.core.ItemInterface; import thaumicbees.main.Config; @@ -92,4 +94,44 @@ public class ForestryHelper LAPIS, ; } + + public static EnumTemperature getEnumTemperatureFromValue(float rawTemp) + { + EnumTemperature value = EnumTemperature.ICY; + + if (rawTemp >= 2.0f) + { + value = EnumTemperature.HOT; + } + else if (rawTemp >= 1.2f) + { + value = EnumTemperature.WARM; + } + else if (rawTemp >= 0.2f) + { + value = EnumTemperature.NORMAL; + } + else if (rawTemp >= 0.05f) + { + value = EnumTemperature.COLD; + } + + return value; + } + + public static EnumHumidity getEnumHumidityFromValue(float rawHumidity) + { + EnumHumidity value = EnumHumidity.ARID; + + if (rawHumidity >= 0.9f) + { + value = EnumHumidity.DAMP; + } + else if (rawHumidity >= 0.3f) + { + value = EnumHumidity.NORMAL; + } + + return value; + } }