From 016049ef67dcc64cfdfc071856113767d325e83c Mon Sep 17 00:00:00 2001 From: Arkandos Date: Fri, 16 Jan 2015 22:06:02 +0100 Subject: [PATCH] Merge my branch into the main one, initial work on the thaumic apiary Might have messed something up. Not quite sure --- .../magicbees/block/BlockThaumicApiary.java | 119 ++++++++++++---- .../magicbees/client/gui/ContainerMB.java | 30 ++++ .../client/gui/ContainerThaumicApiary.java | 128 ++++++++++++++++++ .../java/magicbees/client/gui/GUIHandler.java | 21 ++- .../client/gui/GuiThaumicApiary.java | 36 +++++ .../java/magicbees/client/gui/SlotFrame.java | 29 ++++ src/main/java/magicbees/reference/Names.java | 13 ++ .../textures/blocks/thaumicapiary.0.png | Bin 0 -> 15549 bytes .../textures/blocks/thaumicapiary.1.png | Bin 0 -> 15282 bytes .../textures/blocks/thaumicapiary.2.png | Bin 0 -> 16347 bytes .../textures/blocks/thaumicapiary.4.png | Bin 0 -> 16145 bytes .../assets/magicbees/textures/gui/apiary.png | Bin 0 -> 3391 bytes 12 files changed, 339 insertions(+), 37 deletions(-) create mode 100644 src/main/java/magicbees/client/gui/ContainerMB.java create mode 100644 src/main/java/magicbees/client/gui/ContainerThaumicApiary.java create mode 100644 src/main/java/magicbees/client/gui/GuiThaumicApiary.java create mode 100644 src/main/java/magicbees/client/gui/SlotFrame.java create mode 100644 src/main/java/magicbees/reference/Names.java create mode 100644 src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.0.png create mode 100644 src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.1.png create mode 100644 src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.2.png create mode 100644 src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.4.png create mode 100644 src/main/resources/assets/magicbees/textures/gui/apiary.png diff --git a/src/main/java/magicbees/block/BlockThaumicApiary.java b/src/main/java/magicbees/block/BlockThaumicApiary.java index e9bed11..437e364 100644 --- a/src/main/java/magicbees/block/BlockThaumicApiary.java +++ b/src/main/java/magicbees/block/BlockThaumicApiary.java @@ -3,53 +3,112 @@ package magicbees.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import magicbees.client.gui.UIScreens; +import magicbees.main.CommonProxy; import magicbees.main.MagicBees; import magicbees.main.utils.TabMagicBees; import magicbees.tileentity.TileEntityThaumicApiary; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.World; +import javax.swing.*; + public class BlockThaumicApiary extends BlockContainer { - public BlockThaumicApiary() - { - super(Material.wood); - this.setCreativeTab(TabMagicBees.tabMagicBees); - this.setBlockName("thaumicApiary"); - this.setHardness(1f); - this.setResistance(1.5f); - this.setHarvestLevel("axe", 0); - } + @SideOnly(Side.CLIENT) + private IIcon[] icons; - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) - { - boolean activate = false; + public BlockThaumicApiary() + { + super(Material.wood); + this.setCreativeTab(TabMagicBees.tabMagicBees); + this.setBlockName("thaumicApiary"); + this.setHardness(1f); + this.setResistance(1.5f); + this.setHarvestLevel("axe", 0); + } - if (!player.isSneaking()) - { - player.openGui(MagicBees.object, UIScreens.THAUMIC_APIARY.ordinal(), world, x, y, z); - activate = true; - } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9 ) + { + boolean activate = false; - return activate; - } + if (!player.isSneaking()) + { + player.openGui(MagicBees.object, UIScreens.THAUMIC_APIARY.ordinal(), world, x, y, z); + activate = true; + } - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister register) - { + return activate; + } - } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta){ - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) - { - return new TileEntityThaumicApiary(); - } + if (side == 0){ + return icons[0]; + }else if (side == 1){ + return icons[1]; + }else if (side == 2 || side == 3){ + return icons[2]; + }else{ + return icons[4]; + } + } + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) + { + icons = new IIcon[5]; + + icons[0] = register.registerIcon(CommonProxy.DOMAIN + ":thaumicapiary.0"); + icons[1] = register.registerIcon(CommonProxy.DOMAIN + ":thaumicapiary.1"); + icons[2] = register.registerIcon(CommonProxy.DOMAIN + ":thaumicapiary.2"); + icons[4] = register.registerIcon(CommonProxy.DOMAIN + ":thaumicapiary.4"); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityThaumicApiary(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta){ + TileEntity te = world.getTileEntity(x, y, z); + if (te != null && te instanceof IInventory){ + IInventory inventory = (IInventory)te; + + for (int i = 0; i < inventory.getSizeInventory(); i++){ + ItemStack itemStack = inventory.getStackInSlotOnClosing(i); + + if (itemStack != null){ + float spawnX = x + world.rand.nextFloat(); + float spawnY = y + world.rand.nextFloat(); + float spawnZ = z + world.rand.nextFloat(); + + EntityItem droppedItem = new EntityItem(world, spawnX, spawnY, spawnZ, itemStack); + + float mult = 0.05F; + + droppedItem.motionX = (-0.5F + world.rand.nextFloat()) * mult; + droppedItem.motionY = (4 + world.rand.nextFloat()) * mult; + droppedItem.motionZ = (-0.5F + world.rand.nextFloat()) * mult; + + world.spawnEntityInWorld(droppedItem); + } + } + } + + super.breakBlock(world, x, y, z, block, meta); + } } diff --git a/src/main/java/magicbees/client/gui/ContainerMB.java b/src/main/java/magicbees/client/gui/ContainerMB.java new file mode 100644 index 0000000..e3f7e5e --- /dev/null +++ b/src/main/java/magicbees/client/gui/ContainerMB.java @@ -0,0 +1,30 @@ +package magicbees.client.gui; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; + +public class ContainerMB extends Container +{ + protected final int PLAYER_INVENTORY_ROWS = 3; + protected final int PLAYER_INVENTORY_COLUMNS = 9; + + public void addPlayerInventory(InventoryPlayer inventoryPlayer, int xStart, int yStart) + { + for (int x = 0; x < PLAYER_INVENTORY_COLUMNS; x++){ + addSlotToContainer(new Slot(inventoryPlayer, x, 8 + 18 * x, yStart + 4 + PLAYER_INVENTORY_ROWS * 18)); + } + + for (int y = 0; y < PLAYER_INVENTORY_ROWS; y++){ + for (int x = 0; x < PLAYER_INVENTORY_COLUMNS; x++){ + addSlotToContainer(new Slot(inventoryPlayer, x + y * 9 + 9, 8 + 18 * x, yStart + y * 18)); + } + } + } + + @Override + public boolean canInteractWith(EntityPlayer entityPlayer) { + return true; + } +} diff --git a/src/main/java/magicbees/client/gui/ContainerThaumicApiary.java b/src/main/java/magicbees/client/gui/ContainerThaumicApiary.java new file mode 100644 index 0000000..f6b7577 --- /dev/null +++ b/src/main/java/magicbees/client/gui/ContainerThaumicApiary.java @@ -0,0 +1,128 @@ +package magicbees.client.gui; + +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IHiveFrame; +import forestry.api.apiculture.hives.IHive; +import forestry.plugins.PluginApiculture; +import magicbees.main.utils.ItemInterface; +import magicbees.main.utils.LogHelper; +import magicbees.tileentity.TileEntityThaumicApiary; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerThaumicApiary extends ContainerMB { + + private TileEntityThaumicApiary thaumicApiary; + public int maxSlot = 0; + + // Constants + private static final int SLOT_QUEEN = 0; + private static final int SLOT_DRONE = 1; + private static final int SLOT_FRAME_START = 2; + private static final int SLOT_INVENTORY_START = 5; + private static final int SLOT_FRAME_COUNT = 3; + private static final int SLOT_INVENTORY_COUNT = 7; + + public ContainerThaumicApiary(InventoryPlayer inventoryPlayer, TileEntityThaumicApiary thaumicApiary){ + this.thaumicApiary = thaumicApiary; + + // Queen/Princess slot + addSlotToContainer(new SlotCustomItems(this.thaumicApiary, 0, 29, 39, ItemInterface.getItemStack("Forestry", "beeQueenGE", 1), ItemInterface.getItemStack("Forestry", "beePrincessGE", 1))); + // Drone slot + addSlotToContainer(new SlotCustomItems(this.thaumicApiary, 1, 29, 65, ItemInterface.getItemStack("Forestry", "beeDroneGE", 64))); + + int currentSlot = 1; + + // Frame slots + for (int x = 0; x < 3; x++){ + currentSlot++; + addSlotToContainer(new SlotFrame(thaumicApiary, currentSlot, 66, 23 + x * 29)); + //LogHelper.info("[1] CURRENTSLOT: " + currentSlot); + } + + for (int x = 0; x < 3; x++){ + currentSlot++; + addSlotToContainer(new Slot(thaumicApiary, currentSlot, 116, 26 + x * 26)); + //LogHelper.info("[2] CURRENTSLOT: " + currentSlot); + } + + int j = 0; + for (int y = 0; y < 2; y++){ + for (int x = 0; x < 2; x++){ + currentSlot++; + addSlotToContainer(new Slot(thaumicApiary, currentSlot, 95 + x * 42, 39 + j * 26)); + //LogHelper.info("[3] CURRENTSLOT: " + currentSlot); + } + j++; + } + + addPlayerInventory(inventoryPlayer, 0, 108); + + maxSlot = currentSlot; + + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex){ + Slot itemSlot = this.getSlot(slotIndex); + boolean clearSlot = false; + + if (itemSlot != null && itemSlot.getHasStack()) { + ItemStack srcStack = itemSlot.getStack(); + + if (slotIndex <= maxSlot && srcStack != null){ + clearSlot = this.mergeItemStack(srcStack, maxSlot + 1, maxSlot + 36, false); + }else{ + if (slotIndex > maxSlot && srcStack != null){ + if (PluginApiculture.beeInterface.isMember(srcStack)){ + if (!PluginApiculture.beeInterface.isDrone(srcStack)){ + if (this.getSlot(SLOT_QUEEN).getHasStack() == false) { + clearSlot = this.mergeItemStack(srcStack, SLOT_QUEEN, SLOT_QUEEN, false); + } + }else{ + if (this.getSlot(SLOT_DRONE).isItemValid(srcStack)){ + clearSlot = this.mergeItemStack(srcStack, SLOT_DRONE, SLOT_DRONE, false); + } + } + }else if(srcStack.getItem() instanceof IHiveFrame){ + clearSlot = this.mergeItemStack(srcStack, SLOT_FRAME_START, SLOT_FRAME_START + SLOT_FRAME_COUNT, false); + } + } + } + + + } + + if (clearSlot){ + itemSlot.putStack(null); + } + + itemSlot.onSlotChanged(); + player.inventory.markDirty(); + + return null; + } + + @Override + public boolean canInteractWith(EntityPlayer entityPlayer) { + return thaumicApiary.isUseableByPlayer(entityPlayer); + } + + + @Override + public void updateProgressBar(int i, int j) { + thaumicApiary.getGUINetworkData(i, j); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for (Object crafter : crafters) { + thaumicApiary.sendGUINetworkData(this, (ICrafting) crafter); + } + } +} diff --git a/src/main/java/magicbees/client/gui/GUIHandler.java b/src/main/java/magicbees/client/gui/GUIHandler.java index e4f8917..47a3496 100644 --- a/src/main/java/magicbees/client/gui/GUIHandler.java +++ b/src/main/java/magicbees/client/gui/GUIHandler.java @@ -1,9 +1,11 @@ package magicbees.client.gui; -import cpw.mods.fml.common.network.IGuiHandler; import magicbees.tileentity.TileEntityEffectJar; +import magicbees.tileentity.TileEntityThaumicApiary; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import cpw.mods.fml.common.network.IGuiHandler; public class GUIHandler implements IGuiHandler { @@ -12,15 +14,16 @@ public class GUIHandler implements IGuiHandler public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { Object value = null; - + if (ID == UIScreens.EFFECT_JAR.ordinal()) { value = new ContainerEffectJar((TileEntityEffectJar)world.getTileEntity(x, y, z), player); } - else if (ID == UIScreens.THAUMIC_APIARY.ordinal()) - { - //value = new Container((TileEntityThaumicApiary)world.getTileEntity(x, y, z), player); - } + else if (ID == UIScreens.THAUMIC_APIARY.ordinal()) + { + TileEntityThaumicApiary tileEntityThaumicApiary = (TileEntityThaumicApiary) world.getTileEntity(x, y, z); + value = new ContainerThaumicApiary(player.inventory, tileEntityThaumicApiary); + } return value; } @@ -33,7 +36,11 @@ public class GUIHandler implements IGuiHandler if (ID == UIScreens.EFFECT_JAR.ordinal()) { value = new GUIEffectJar((TileEntityEffectJar)world.getTileEntity(x, y, z), player); - } + }else if (ID == UIScreens.THAUMIC_APIARY.ordinal()) + { + TileEntityThaumicApiary tileEntityThaumicApiary = (TileEntityThaumicApiary) world.getTileEntity(x, y, z); + value = new GuiThaumicApiary(player.inventory, tileEntityThaumicApiary); + } return value; } diff --git a/src/main/java/magicbees/client/gui/GuiThaumicApiary.java b/src/main/java/magicbees/client/gui/GuiThaumicApiary.java new file mode 100644 index 0000000..01a647b --- /dev/null +++ b/src/main/java/magicbees/client/gui/GuiThaumicApiary.java @@ -0,0 +1,36 @@ +package magicbees.client.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import magicbees.main.CommonProxy; +import magicbees.tileentity.TileEntityThaumicApiary; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiThaumicApiary extends GuiContainer +{ + public static final ResourceLocation BACKGROUND_LOCATION = new ResourceLocation(CommonProxy.DOMAIN, CommonProxy.GUI_TEXTURE + "apiary.png"); + + private static final int WIDTH = 176; + private static final int HEIGHT = 190; + + public GuiThaumicApiary(InventoryPlayer inventoryPlayer, TileEntityThaumicApiary thaumicApiary) { + super(new ContainerThaumicApiary(inventoryPlayer, thaumicApiary)); + + this.xSize = WIDTH; + this.ySize = HEIGHT; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float opacity, int x, int y) { + GL11.glColor4f(1, 1, 1, 1); + this.mc.getTextureManager().bindTexture(BACKGROUND_LOCATION); + + this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + } +} diff --git a/src/main/java/magicbees/client/gui/SlotFrame.java b/src/main/java/magicbees/client/gui/SlotFrame.java new file mode 100644 index 0000000..53ad099 --- /dev/null +++ b/src/main/java/magicbees/client/gui/SlotFrame.java @@ -0,0 +1,29 @@ +package magicbees.client.gui; + +import forestry.api.apiculture.IHiveFrame; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class SlotFrame extends SlotCustomItems { + public SlotFrame(IInventory inventory, int slotIndex, int xPos, int yPos) { + super(inventory, slotIndex, xPos, yPos); + } + + @Override + public boolean isItemValid(ItemStack itemStack){ + if (itemStack == null){ + return false; + } + if (!inventory.isItemValidForSlot(getSlotIndex(), itemStack)){ + return false; + } + + boolean flag = false; + + if(itemStack.getItem() instanceof IHiveFrame){ + flag = true; + } + + return flag; + } +} diff --git a/src/main/java/magicbees/reference/Names.java b/src/main/java/magicbees/reference/Names.java new file mode 100644 index 0000000..19b1a74 --- /dev/null +++ b/src/main/java/magicbees/reference/Names.java @@ -0,0 +1,13 @@ +package magicbees.reference; + +public class Names { + public static final class Blocks + { + public static final String THAUMIC_APIARY = "thaumicApiary"; + } + + public static final class Containers + { + public static final String THAUMIC_APIARY = "container.mb." + Blocks.THAUMIC_APIARY; + } +} diff --git a/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.0.png b/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.0.png new file mode 100644 index 0000000000000000000000000000000000000000..de9066b7d4e8d96d14e44a0eb91829649f583775 GIT binary patch literal 15549 zcmeI3eQ?v}9mfStcuC1Fp=^Py5aX0|_TGp~u0M((=+BgHRS=g8|(g*KIA=4z^oEHwu)N8}Az>OS?id7?;v31Iixx^}%rv z*Xy71o#S7g=llKr9(|q{=^w4Bt(ljdm7j$mNOpCVqaOU`DBlU=z~6%5dkpxQ7^qq# zA;_bTDc>>3mfoodLiGu*M!C`XG|h^>Vulmld~w(p0BQuW&J70`wvCr{ZoWnEm+G&- zb6BqvxKjN>lM{Ca?0l@tslH4psB3iA>g-~W*O`hm8M`a^SyGeXA@7XbcO5Ld79tu^4Q@2#TUG+<+MjC{UnMr(b5m zs9!3KCW+^9@Ddvo0KF20J zf%c#`0-9qn-pl(y9SJZX(gFyyin1uRildZFbVnejD=Z71Q2;7EquTheFp5p-iP|D- zDmv9x0LAH~p9uUJ$hIrjRqe2Wj$%&WXu@srm?+YMG87NiCr&b`#blvShBKC! z%x=PLG7?s7)HKOe6)Tmd1ZgI514)&G{oo*o3X;Oh%;hDxqomAGZY;MLk9~-#m>^%)0(P4%dXK1$9~nBkJ#tUb6)hC}oEVa3$FtsV8$CVS%J^G& z&W6Q}@rG236;tNTE8IVA(boHCGrlxN&c3p-X?u`oz^ZVGqW57gC)JW1S27##U}Qc8 zGhw7jbDVS{NmQAV!zprtr!!5CCPiT7`=#DVo4 z2gxh?juXS_v?4GK)mX!&iU<~HxL_Kpv4%?(5iHPf!8BB34VNk+SfJs8X{g2;E>%RZ zK*I&oP>nTQs)%5Lh6|>l8f&;z5y1it7feGn)^MpJf(05bn1*Vs;Zj8e3p89X4b@n~ zrHTj^Xt-b+s2yT&jp*frbmF zp&DzrR1v`f4Hry9HP&#cB7y}PE|`XDtl?5c1Pe4=Fb&mM!=;J{7HGI&8mh5|OBE3; z&~U*tRAUX7Dk4~*;eu(X#t+1mm3;4#_k))$L*T7S=X?3fz#Ex5wyNHVAYHQ%q$libNaX4VY#Oz+OgtYSLr`B>LAvuL54r0|_F#D79-*@40B*Kge#d#LOA zi;JCKfBD3X3+G<^_lNn17gxUi!fDGpLthX4Yein(`g3nx>LY%cKbC*`ZS%X-%nWx< zPu8$7Z%Wz94f_sUcyfN*rluPwFCVX4zq+&Vz3w?D*H+iM3J>P@_txj{&~4i>VW4Kl z9~vK%rD5~+e;)eP-;a`&`A0jZ62|6?w%2kpy4Pf_HeS)c)Ia&pA2q#v#k;C-mn$$n zG-ko`CPzkY%Vhn4PCvA9>EVMrKkMn(ID6ULmSf{43#VHrl$B-D*<{{Vvp3HF%cS2m z>|NPv&)a8WPq-dwtFeFXAfzKrMV`UtO9eL;f8uO><5|);aQT1s9TR4DFM3263jTVq za(MNgB}MFf?opR9xYSj6`|c0W-`DRqaO|F%{Iv%x;|8y8YMS;`X70Nyrjajxv2USF z?0Bg^Yt3|4n6z{K8+BV>J#rL(cE4$hed%t?rt?$ld1^a*a0k(`q%!~I=4}VauXg74 zeB4}gy6QJ|Z`RGN{huCAzY{I+~a&;J3ZK1q-O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.1.png b/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.1.png new file mode 100644 index 0000000000000000000000000000000000000000..c56ba96632001f2d9f3d29c90a34e32d36b18650 GIT binary patch literal 15282 zcmeI3OKcoP8pkV^4~`QMI4kiAqB9vQSW3IQXQt=Tj3=6SV(eAM7~2qALBu`XHFhi0 z-IMONJr3;RWKXjoaGX6L2-*Wdgn&Q-92Rm2(z0vi62t}Agoq^^3>Hxiu$!P9pn9I= zd891Fu|^ut=c@nruc}|Y`qKHK!G~{azqcI#aN9tCVi^72;eOj%(BFk)Q$h5zG21_G z1F&g}``rLuI&n7uk<;4fm@}5#D=DVlEvse^fGlnhYdOQVR3B_(P z=V1yG=U|T~?l#DbC5M<^(}IlHEwT#l6PQq>TM)%i$hVX6@j`&(1y1m@LPQD#B%WtV zA5W|uMNvylOT&r2Qgi6P9?z8HWF?N9ot^ET^>>@rBqu~75svq9J|Bw|tUYHqa*j3Z z?M0KaPXgMCrDYw>G#J-cPMOnAkH_OSRQZ&~rDv1LN>heiqK7zgIXTM--8`r3T%%0e z8HUwPHq5j~=dzF+hPF9vDG<%bZ*$x=CBO3}V z^;|B-OS*BjtFj?8M zp}Tl{Jmu9}*>M?-vl&aFnY{ul5Nw z5G_`#zjdza(yQ)e9N3WS7fZipJEk>Y#5^cCx@tPPapBhYWZ{b>C9^9uHsySQA=ilSePa<#>^8ADnQX2ud4y3K6& z5D|iL`1lN;=*YVV~UH22p3RXI1OSar$LMHIq^Lhm!yt?gU`|F97`f3;O*YfN36p)d>Kk7Xi4-Ts-iv zJ^(fx9Z1ASa~F3G$DjX0eDiy+oWA_o&bC7Qkx!PdUjFyjpDthLu18j{|NY#7YoQ%0OYdiZci+pc^WUzv z4*aoYVc!wvi16m)XSXmX+wRCcc~{G&jXx~h{hHUiygE2>-^5Yy>Z-o^*z!{F^;6!# z6H`AfdcXN3xX^P?=R+G#JaHLZ{QT6#SGHK&H-3EPe$YDq)}POh9m-XY^{(+g5ujlg2cW36E z%zib0^@q;I<)yy-R~LNe-#zddSolu8(9w11@rd@+-@F&^d2O-p(tCYczGY|>fR$DK zrw?CZzz(l?`pl!(Y%q34?^s@1-1>#|_W#0<8iKD*)S-itO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.2.png b/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.2.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c514e7ad2f5725f6bfaa8cc64f78d8c010e823 GIT binary patch literal 16347 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.4.png b/src/main/resources/assets/magicbees/textures/blocks/thaumicapiary.4.png new file mode 100644 index 0000000000000000000000000000000000000000..f810e60e48c560f1729e51053a91ee3fbd333226 GIT binary patch literal 16145 zcmeI3eNYo;9>-VV5Wy;QzCiIUgsbT3X0yqLBzqwUBnWDh0UYsa)y?h(R+4N;77{?K z)zj0vQ7d9kv8SgM^T3if^q`^=j>b-fmtqxd^h7=44j7oN;E!?;mQB z%NQz4K3!u`T3mT_1yfMxrc3Ikl#+Foq@I#z8xssZoHuaL93k^L>`o8v%aZ$jasIbZ zjL2pFDqLljJV$6yR%R)Z<*{yBrcr2MQmH~^TD=0*XtY|@IGIX`Vu%t&P&JI|aSX$i zN?GtDHzx4E3~tJX7n|~f&GAu|yn^FgID&Y+UWHe!VBO^is@Llgr3z80V7>_WUk?R7kt_mFf!NBPA;kyKW5@a(b}iT zt{hjj+wKQVkqB+49eg_;o&g#afUAP#SWgApLz7*yA7ZqIImXrlKtbs-jrK7;qzOtO z%|E9CLv7%pSSyGO-5c&Pz;5mR-H|w$8<2Er}_D*#0XfY(dl7= zQfF$kR#dA|qXwi$oA9g(HWj4_%$$Sf<(YN-dN84=8Ou@W^7HcYl~@j{!ps_V$UY*q zn{A=f!x2uB4)&bkd#*=mOr=Myu$olsVXYQZ!a5Aqz-k+T>NILvt5ar%tRvF9S(|7# zQ$thvZr0&nFfPLFp@qqtB@fNst`!!f>Yx5N6QxgD(n`~q4bG%V8*I~K7_8IjNf@Ik ztCG~}bsCg3Al=f#ec~H11Z3*J9jk8XVfPS@h)3=|Sqc~r$GU4H1ff&HR#HM&Jzp9U z?92<2>*B|+dYmAIP0HvYc=`gAh_Y~(0~ta?feKNeYi)Xpq$xG5R@pEZ(_vazfDKzo zG?SlUDwNRLLjDoyJ-6Ylpq)lx*M?CPR_aPo6j$kSR0k_H{N5e1^4IFw#KYP+FX5(h z%J~In3>*_hpTqKuq|A36R1(Z~hH^ZBJ1TG!o|uCOcPd2X8Emvkx1+FxWMf+=C# zVK>@Da5S(+P&Ljkz2F+@G6~cKJS;55*lMGAJU3c`M?_7~gTIMU1V_A(OJv;$ABx0n ztlL3wM#e#u(}>GiZa~6?5jDF`bUcr>vu?gyw2?o#q7_GE31_)*`tn-<;ot1|v$R_o zSiej-cI?&u`dXEe{~)OFKbRURgQ+vbQzK-%0El=f;S%Qq zs1hy!h-%0El=f;S%Qqs1hy!h-%0El=f;S%Qqs1hy!h-%0El=f;S%Qqs1hy!h-%0El=f;S%Qqs1hy!hsTOvkkM4xw1GpgU@jzn(!xfHVB z;O71dQ(OO*JLW;dww&u}*GHZE>HNiyJMlATT7Q2&>r#Ej*s=BR?K|M>Y#v1)QvCT` zQtz2li9`K!^DVwT^^J4)jn5+o9&@MenVCEBxAmSqrb-gaz&~)= z7JV4AxF9`c%e&r%k3Pna*_+z%?+s|IJ7WEnvh;s*YmZDYroA?6yM2iM+p}%g)s>@f{Q73C;<(X}^M2EIYOt=O^>`^f zw5|G0Xg~Ag1k-`i{4c@Wj`rTEZ_P0Oy?5-q@q-7HC(h9iSzR%F`|)gZ ze9ioLdXg!A^jg(NiRAqe89QE%#fDEm=sR(wX55wfmOf{`S(mb4*_ZgmohxoP zp53~#_*clstK`K4*d0$QlM7c4v)=58?R=+C+3Zg;W z(zY%oQgka9_ltW6`|z_m9J?(7rWeOSacG-G^rS(Gd6w}V!Ig9=SH4zYF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/magicbees/textures/gui/apiary.png b/src/main/resources/assets/magicbees/textures/gui/apiary.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb72d7385bceaf28fc454e65b158193f93dea95 GIT binary patch literal 3391 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 literal 0 HcmV?d00001