From 66663ca50274de156217b85f002279b731f35bf3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 4 Jun 2022 21:24:17 +0200 Subject: [PATCH] inserter crane --- .../api/hbm/conveyor/IEnterableBlock.java | 10 ++ src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../java/com/hbm/blocks/bomb/DetMiner.java | 16 +-- .../com/hbm/blocks/network/BlockConveyor.java | 20 +++- .../hbm/blocks/network/BlockCraneBase.java | 39 ++++++- .../hbm/blocks/network/CraneExtractor.java | 11 +- .../com/hbm/blocks/network/CraneInserter.java | 96 +++++++++++++++++- .../com/hbm/entity/item/EntityMovingItem.java | 14 ++- src/main/java/com/hbm/handler/GUIHandler.java | 30 ++++++ .../container/ContainerCraneInserter.java | 68 +++++++++++++ .../hbm/inventory/gui/GUICraneInserter.java | 40 ++++++++ .../com/hbm/render/block/RenderConveyor.java | 66 ++++++++++-- .../render/entity/item/RenderMovingItem.java | 18 ++-- .../java/com/hbm/tileentity/IGUIProvider.java | 15 +++ .../network/TileEntityCraneExtractor.java | 20 ++++ .../network/TileEntityCraneInserter.java | 41 ++++++++ .../java/com/hbm/world/feature/OreCave.java | 13 ++- .../textures/blocks/crane_in_side_down.png | Bin 0 -> 259 bytes .../hbm/textures/blocks/crane_in_side_up.png | Bin 0 -> 259 bytes .../textures/blocks/crane_out_side_down.png | Bin 0 -> 253 bytes .../hbm/textures/blocks/crane_out_side_up.png | Bin 0 -> 254 bytes .../gui/storage/gui_crane_ejector.png | Bin 2399 -> 2698 bytes .../gui/storage/gui_crane_inserter.png | Bin 0 -> 1232 bytes .../hbm/textures/items/piston_hydraulic.png | Bin 0 -> 380 bytes .../hbm/textures/items/piston_pneumatic.png | Bin 0 -> 375 bytes .../hbm/textures/models/turrets/arty.png | Bin 0 -> 3441 bytes 26 files changed, 454 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerCraneInserter.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUICraneInserter.java create mode 100644 src/main/java/com/hbm/tileentity/IGUIProvider.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_in_side_down.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_in_side_up.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_out_side_down.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_out_side_up.png create mode 100644 src/main/resources/assets/hbm/textures/gui/storage/gui_crane_inserter.png create mode 100644 src/main/resources/assets/hbm/textures/items/piston_hydraulic.png create mode 100644 src/main/resources/assets/hbm/textures/items/piston_pneumatic.png create mode 100644 src/main/resources/assets/hbm/textures/models/turrets/arty.png diff --git a/src/main/java/api/hbm/conveyor/IEnterableBlock.java b/src/main/java/api/hbm/conveyor/IEnterableBlock.java index a5f4abbf8..a97e55191 100644 --- a/src/main/java/api/hbm/conveyor/IEnterableBlock.java +++ b/src/main/java/api/hbm/conveyor/IEnterableBlock.java @@ -5,6 +5,16 @@ import net.minecraftforge.common.util.ForgeDirection; public interface IEnterableBlock { + /** + * Returns true of the moving item can enter from the given side. When this happens, the IConveyorItem will call onEnter and despawn + * @param world + * @param x + * @param y + * @param z + * @param dir + * @param entity + * @return + */ public boolean canEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity); public void onEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity); } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 86d8a7b0e..1900be645 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1899,7 +1899,7 @@ public class ModBlocks { conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(0.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); crane_extractor = new CraneExtractor().setBlockName("crane_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - crane_inserter = new CraneInserter().setBlockName("crane_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + crane_inserter = new CraneInserter().setBlockName("crane_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); diff --git a/src/main/java/com/hbm/blocks/bomb/DetMiner.java b/src/main/java/com/hbm/blocks/bomb/DetMiner.java index 1a006a7dd..baa130baa 100644 --- a/src/main/java/com/hbm/blocks/bomb/DetMiner.java +++ b/src/main/java/com/hbm/blocks/bomb/DetMiner.java @@ -8,16 +8,13 @@ import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.interfaces.IBomb; -import api.hbm.conveyor.IConveyorItem; -import api.hbm.conveyor.IEnterableBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.Explosion; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class DetMiner extends BlockPillar implements IBomb, IEnterableBlock { +public class DetMiner extends BlockPillar implements IBomb { public DetMiner(Material mat, String top) { super(mat, top); @@ -57,15 +54,4 @@ public class DetMiner extends BlockPillar implements IBomb, IEnterableBlock { this.explode(world, x, y, z); } } - - @Override - public boolean canEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { - return true; - } - - @Override - public void onEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { - this.explode(world, x, y, z); - } - } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyor.java b/src/main/java/com/hbm/blocks/network/BlockConveyor.java index 70ca3a8c4..988fb696c 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyor.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyor.java @@ -57,7 +57,6 @@ public class BlockConveyor extends Block implements IConveyorBelt { ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); return Vec3.createVectorHelper(snap.xCoord + dir.offsetX * speed, snap.yCoord, snap.zCoord + dir.offsetZ * speed);*/ - Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); /*double dist = snap.distanceTo(itemPos); if(dist > speed) { @@ -71,9 +70,24 @@ public class BlockConveyor extends Block implements IConveyorBelt { ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); return Vec3.createVectorHelper(snap.xCoord + dir.offsetX * speed, snap.yCoord, snap.zCoord + dir.offsetZ * speed); }*/ + + /// ATTEMT 2 /// + /*Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + return Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord, snap.zCoord - dir.offsetZ * speed);*/ + /// /// ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - return Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord, snap.zCoord - dir.offsetZ * speed); + //snapping point + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + //snapping point + speed + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord, snap.zCoord - dir.offsetZ * speed); + //delta to get to that point + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + //the effective destination towards "dest" after taking speed into consideration + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; } @Override @@ -105,7 +119,7 @@ public class BlockConveyor extends Block implements IConveyorBelt { if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { EntityMovingItem item = new EntityMovingItem(world); - item.setItemStack(((EntityItem) entity).getEntityItem()); + item.setItemStack(((EntityItem) entity).getEntityItem().copy()); item.setPositionAndRotation(x + 0.5, y + 0.25, z + 0.5, 0, 0); world.spawnEntityInWorld(item); diff --git a/src/main/java/com/hbm/blocks/network/BlockCraneBase.java b/src/main/java/com/hbm/blocks/network/BlockCraneBase.java index a979bdb18..b0ae95010 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCraneBase.java +++ b/src/main/java/com/hbm/blocks/network/BlockCraneBase.java @@ -12,6 +12,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public abstract class BlockCraneBase extends BlockContainer { @@ -20,7 +21,10 @@ public abstract class BlockCraneBase extends BlockContainer { @SideOnly(Side.CLIENT) protected IIcon iconSideIn; @SideOnly(Side.CLIENT) protected IIcon iconOut; @SideOnly(Side.CLIENT) protected IIcon iconSideOut; + @SideOnly(Side.CLIENT) protected IIcon iconDirectional; + @SideOnly(Side.CLIENT) protected IIcon iconDirectionalUp; + @SideOnly(Side.CLIENT) protected IIcon iconDirectionalDown; public BlockCraneBase(Material mat) { super(mat); @@ -37,12 +41,39 @@ public abstract class BlockCraneBase extends BlockContainer { this.iconSideOut = iconRegister.registerIcon(RefStrings.MODID + ":crane_side_out"); } - @Override - @SideOnly(Side.CLIENT) - public abstract IIcon getIcon(int side, int metadata); - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int l = BlockPistonBase.determineOrientation(world, x, y, z, player); world.setBlockMetadataWithNotify(x, y, z, l, 2); } + + @Override + public IIcon getIcon(int side, int metadata) { + + if(side == 0 || side == 1) { + if(side == metadata) { + return this.iconOut; + } + if(side == ForgeDirection.getOrientation(metadata).getOpposite().ordinal()) { + return this.iconIn; + } + + return side == 1 ? this.iconDirectional : this.blockIcon; + } + + if(side == metadata) { + return this.iconSideOut; + } + if(side == ForgeDirection.getOrientation(metadata).getOpposite().ordinal()) { + return this.iconSideIn; + } + + if(metadata == 0) { + return this.iconDirectionalUp; + } + if(metadata == 1) { + return this.iconDirectionalDown; + } + + return this.iconSide; + } } diff --git a/src/main/java/com/hbm/blocks/network/CraneExtractor.java b/src/main/java/com/hbm/blocks/network/CraneExtractor.java index 53bdff754..e5c7b08ee 100644 --- a/src/main/java/com/hbm/blocks/network/CraneExtractor.java +++ b/src/main/java/com/hbm/blocks/network/CraneExtractor.java @@ -1,13 +1,13 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityCraneExtractor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; import net.minecraft.world.World; public class CraneExtractor extends BlockCraneBase { @@ -18,7 +18,7 @@ public class CraneExtractor extends BlockCraneBase { @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityCraneExtractor(); } @Override @@ -26,10 +26,7 @@ public class CraneExtractor extends BlockCraneBase { public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.iconDirectional = iconRegister.registerIcon(RefStrings.MODID + ":crane_out_top"); - } - - @Override - public IIcon getIcon(int side, int metadata) { - return null; + this.iconDirectionalUp = iconRegister.registerIcon(RefStrings.MODID + ":crane_out_side_up"); + this.iconDirectionalDown = iconRegister.registerIcon(RefStrings.MODID + ":crane_out_side_down"); } } diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index f1fd9276b..bf214709c 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -1,16 +1,25 @@ package com.hbm.blocks.network; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.network.TileEntityCraneInserter; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IEnterableBlock; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class CraneInserter extends BlockCraneBase{ +public class CraneInserter extends BlockCraneBase implements IEnterableBlock { public CraneInserter() { super(Material.iron); @@ -18,7 +27,7 @@ public class CraneInserter extends BlockCraneBase{ @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityCraneInserter(); } @Override @@ -26,10 +35,87 @@ public class CraneInserter extends BlockCraneBase{ public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.iconDirectional = iconRegister.registerIcon(RefStrings.MODID + ":crane_in_top"); + this.iconDirectionalUp = iconRegister.registerIcon(RefStrings.MODID + ":crane_in_side_up"); + this.iconDirectionalDown = iconRegister.registerIcon(RefStrings.MODID + ":crane_in_side_down"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } else { + return false; + } } @Override - public IIcon getIcon(int side, int metadata) { - return null; + public boolean canEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + ForgeDirection orientation = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + return orientation == dir; + } + + @Override + public void onEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + TileEntity te = world.getTileEntity(x - dir.offsetX, y - dir.offsetY, z - dir.offsetZ); + + if(entity == null || entity.getItemStack() == null || entity.getItemStack().stackSize <= 0) { + return; + } + + ItemStack toAdd = entity.getItemStack().copy(); + + int[] access = null; + + if(te instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) te; + access = sided.getAccessibleSlotsFromSide(dir.ordinal()); + } + + if(te instanceof IInventory) { + IInventory inv = (IInventory) te; + int limit = inv.getInventoryStackLimit(); + + int size = access == null ? inv.getSizeInventory() : access.length; + + for(int i = 0; i < size; i++) { + int index = access == null ? i : access[i]; + ItemStack stack = inv.getStackInSlot(index); + + if(stack != null && toAdd.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(toAdd, stack) && stack.stackSize < Math.min(stack.getMaxStackSize(), limit)) { + + int stackLimit = Math.min(stack.getMaxStackSize(), limit); + int amount = Math.min(toAdd.stackSize, stackLimit - stack.stackSize); + + stack.stackSize += amount; + toAdd.stackSize -= amount; + + if(toAdd.stackSize == 0) { + return; + } + } + } + + for(int i = 0; i < size; i++) { + int index = access == null ? i : access[i]; + ItemStack stack = inv.getStackInSlot(index); + + if(stack == null && inv.isItemValidForSlot(index, stack)) { + + int amount = Math.min(toAdd.stackSize, limit); + + ItemStack newStack = toAdd.copy(); + newStack.stackSize = amount; + inv.setInventorySlotContents(index, newStack); + toAdd.stackSize -= amount; + + if(toAdd.stackSize == 0) { + return; + } + } + } + } } } diff --git a/src/main/java/com/hbm/entity/item/EntityMovingItem.java b/src/main/java/com/hbm/entity/item/EntityMovingItem.java index 100ed0d60..7f3bba107 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingItem.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingItem.java @@ -1,6 +1,6 @@ package com.hbm.entity.item; -import com.hbm.blocks.ModBlocks; +import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.conveyor.IConveyorBelt; @@ -40,7 +40,6 @@ public class EntityMovingItem extends Entity implements IConveyorItem { } public void setItemStack(ItemStack stack) { - this.getDataWatcher().updateObject(10, stack); this.getDataWatcher().setObjectWatched(10); } @@ -170,9 +169,18 @@ public class EntityMovingItem extends Entity implements IConveyorItem { if(newBlock instanceof IEnterableBlock) { ForgeDirection dir = ForgeDirection.UNKNOWN; + + if(lastPos.getX() > newPos.getX() && lastPos.getY() == newPos.getY() && lastPos.getZ() == newPos.getZ()) dir = Library.POS_X; + else if(lastPos.getX() < newPos.getX() && lastPos.getY() == newPos.getY() && lastPos.getZ() == newPos.getZ()) dir = Library.NEG_X; + else if(lastPos.getX() == newPos.getX() && lastPos.getY() > newPos.getY() && lastPos.getZ() == newPos.getZ()) dir = Library.POS_Y; + else if(lastPos.getX() == newPos.getX() && lastPos.getY() < newPos.getY() && lastPos.getZ() == newPos.getZ()) dir = Library.NEG_Y; + else if(lastPos.getX() == newPos.getX() && lastPos.getY() == newPos.getY() && lastPos.getZ() > newPos.getZ()) dir = Library.POS_Z; + else if(lastPos.getX() == newPos.getX() && lastPos.getY() == newPos.getY() && lastPos.getZ() < newPos.getZ()) dir = Library.NEG_Z; + IEnterableBlock enterable = (IEnterableBlock) newBlock; if(enterable.canEnter(worldObj, newPos.getX(), newPos.getY(), newPos.getZ(), dir, this)) { + enterable.onEnter(worldObj, newPos.getX(), newPos.getY(), newPos.getZ(), dir, this); this.setDead(); } @@ -193,7 +201,7 @@ public class EntityMovingItem extends Entity implements IConveyorItem { this.syncPosX = x; this.syncPosY = y; this.syncPosZ = z; - this.turnProgress = theNumberThree + 7; //use 4-ply for extra smoothness + this.turnProgress = theNumberThree + 2; //use 4-ply for extra smoothness this.motionX = this.velocityX; this.motionY = this.velocityY; this.motionZ = this.velocityZ; diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index ac2bb4927..2a93686ba 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -10,6 +10,7 @@ import com.hbm.inventory.container.*; import com.hbm.inventory.gui.*; import com.hbm.inventory.inv.InventoryLeadBox; import com.hbm.items.ModItems; +import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.machine.*; import com.hbm.tileentity.machine.oil.*; @@ -17,6 +18,7 @@ import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.turret.*; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -29,6 +31,18 @@ public class GUIHandler implements IGuiHandler { public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); + if(entity instanceof IGUIProvider) { + return ((IGUIProvider) entity).provideContainer(ID, player, world, x, y, z); + } + + Block block = world.getBlock(x, y, z); + + if(block instanceof IGUIProvider) { + return ((IGUIProvider) block).provideContainer(ID, player, world, x, y, z); + } + + //notice: stop doing this, unless you absolutely have to \/ + if(entity instanceof TileEntityCrateIron) { return new ContainerCrateIron(player.inventory, (TileEntityCrateIron) entity); } if(entity instanceof TileEntityCrateSteel) { return new ContainerCrateSteel(player.inventory, (TileEntityCrateSteel) entity); } if(entity instanceof TileEntityCrateDesh) { return new ContainerCrateDesh(player.inventory, (TileEntityCrateDesh) entity); } @@ -47,6 +61,8 @@ public class GUIHandler implements IGuiHandler { if(entity instanceof TileEntityRBMKHeater) { return new ContainerRBMKHeater(player.inventory, (TileEntityRBMKHeater) entity); } + //notice: stop doing this completely, period \/ + switch(ID) { case ModBlocks.guiID_test_difurnace: { if(entity instanceof TileEntityDiFurnace) { @@ -854,6 +870,18 @@ public class GUIHandler implements IGuiHandler { @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); + + if(entity instanceof IGUIProvider) { + return ((IGUIProvider) entity).provideGUI(ID, player, world, x, y, z); + } + + Block block = world.getBlock(x, y, z); + + if(block instanceof IGUIProvider) { + return ((IGUIProvider) block).provideGUI(ID, player, world, x, y, z); + } + + //stop doing this unless you absolutely have to \/ if(entity instanceof TileEntityCrateIron) { return new GUICrateIron(player.inventory, (TileEntityCrateIron) entity); } if(entity instanceof TileEntityCrateSteel) { return new GUICrateSteel(player.inventory, (TileEntityCrateSteel) entity); } @@ -873,6 +901,8 @@ public class GUIHandler implements IGuiHandler { if(entity instanceof TileEntityRBMKHeater) { return new GUIRBMKHeater(player.inventory, (TileEntityRBMKHeater) entity); } + //stop doing this, period \/ + switch(ID) { case ModBlocks.guiID_test_difurnace: { if(entity instanceof TileEntityDiFurnace) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneInserter.java b/src/main/java/com/hbm/inventory/container/ContainerCraneInserter.java new file mode 100644 index 000000000..ff9848108 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneInserter.java @@ -0,0 +1,68 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.network.TileEntityCraneInserter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCraneInserter extends Container { + + protected TileEntityCraneInserter inserter; + + public ContainerCraneInserter(InventoryPlayer invPlayer, TileEntityCraneInserter inserter) { + this.inserter = inserter; + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 7; j++) { + this.addSlotToContainer(new Slot(inserter, j + i * 7, 26 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 20)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + 20)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= inserter.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, inserter.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else if(!this.mergeItemStack(var5, 0, inserter.getSizeInventory(), false)) { + return null; + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + + var4.onPickupFromSlot(p_82846_1_, var5); + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return inserter.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java b/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java new file mode 100644 index 000000000..28813d9ae --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICraneInserter.java @@ -0,0 +1,40 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCraneInserter; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.network.TileEntityCraneInserter; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUICraneInserter extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crane_inserter.png"); + private TileEntityCraneInserter inserter; + + public GUICraneInserter(InventoryPlayer invPlayer, TileEntityCraneInserter tedf) { + super(new ContainerCraneInserter(invPlayer, tedf)); + inserter = tedf; + + this.xSize = 176; + this.ySize = 185; + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.inserter.hasCustomInventoryName() ? this.inserter.getInventoryName() : I18n.format(this.inserter.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/com/hbm/render/block/RenderConveyor.java b/src/main/java/com/hbm/render/block/RenderConveyor.java index 14c69a909..72922766a 100644 --- a/src/main/java/com/hbm/render/block/RenderConveyor.java +++ b/src/main/java/com/hbm/render/block/RenderConveyor.java @@ -3,35 +3,79 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; import com.hbm.blocks.network.BlockConveyor; -import com.hbm.main.ResourceManager; -import com.hbm.render.util.ObjUtil; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; -import net.minecraftforge.client.model.obj.WavefrontObject; public class RenderConveyor implements ISimpleBlockRenderingHandler { @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + public void renderInventoryBlock(Block block, int meta, int modelId, RenderBlocks renderer) { GL11.glPushMatrix(); Tessellator tessellator = Tessellator.instance; - IIcon iicon = block.getIcon(0, 0); tessellator.setColorOpaque_F(1, 1, 1); - if(renderer.hasOverrideBlockTexture()) { - iicon = renderer.overrideBlockTexture; - } + GL11.glTranslatef(-0.5F, -0.25F, -0.5F); + renderer.setRenderBounds( 0D, 0D, 0D, 1D, 0.25D, 1D); + + meta = 2; - GL11.glTranslated(0, -0.125, 0); + if(meta == 2) { + renderer.uvRotateTop = 3; + renderer.uvRotateBottom = 0; + renderer.uvRotateWest = 3; + } + if(meta == 3) { + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 3; + renderer.uvRotateEast = 3; + } + if(meta == 4) { + renderer.uvRotateTop = 1; + renderer.uvRotateBottom = 1; + renderer.uvRotateSouth = 3; + } + if(meta == 5) { + renderer.uvRotateTop = 2; + renderer.uvRotateBottom = 2; + renderer.uvRotateNorth = 3; + } + tessellator.startDrawingQuads(); - ObjUtil.renderWithIcon((WavefrontObject) ResourceManager.arrow, iicon, tessellator, 0, false); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, meta)); tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, meta)); + tessellator.draw(); + + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + renderer.uvRotateEast = 0; + renderer.uvRotateWest = 0; GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java index 30f1c0402..1115a27bf 100644 --- a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java +++ b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java @@ -20,23 +20,23 @@ public class RenderMovingItem extends Render { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - - EntityMovingItem item = (EntityMovingItem)entity; - ItemStack stack = item.getItemStack(); + + EntityMovingItem item = (EntityMovingItem) entity; + ItemStack stack = item.getItemStack().copy(); if(!(stack.getItem() instanceof ItemBlock)) { GL11.glRotatef(90F, 1.0F, 0.0F, 0.0F); GL11.glTranslated(0.0, -0.1875, 0.0); } - + EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, stack); - dummy.getEntityItem().stackSize = 1; + //dummy.getEntityItem().stackSize = 1; dummy.hoverStart = 0.0F; - RenderItem.renderInFrame = true; - RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); - RenderItem.renderInFrame = false; - + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/tileentity/IGUIProvider.java b/src/main/java/com/hbm/tileentity/IGUIProvider.java new file mode 100644 index 000000000..f707f3d61 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/IGUIProvider.java @@ -0,0 +1,15 @@ +package com.hbm.tileentity; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.world.World; + +public interface IGUIProvider { + + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z); + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z); +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java new file mode 100644 index 000000000..95a3561a2 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -0,0 +1,20 @@ +package com.hbm.tileentity.network; + +import com.hbm.tileentity.TileEntityMachineBase; + +public class TileEntityCraneExtractor extends TileEntityMachineBase { + + public TileEntityCraneExtractor() { + super(20); + } + + @Override + public String getName() { + return "container.craneExtractor"; + } + + @Override + public void updateEntity() { + + } +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java new file mode 100644 index 000000000..bcfca593c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java @@ -0,0 +1,41 @@ +package com.hbm.tileentity.network; + +import com.hbm.inventory.container.ContainerCraneInserter; +import com.hbm.inventory.gui.GUICraneInserter; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.world.World; + +public class TileEntityCraneInserter extends TileEntityMachineBase implements IGUIProvider { + + public TileEntityCraneInserter() { + super(21); + } + + @Override + public String getName() { + return "container.craneInserter"; + } + + @Override + public void updateEntity() { + + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCraneInserter(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICraneInserter(player.inventory, this); + } +} diff --git a/src/main/java/com/hbm/world/feature/OreCave.java b/src/main/java/com/hbm/world/feature/OreCave.java index 0dba4397b..e71bf9d1d 100644 --- a/src/main/java/com/hbm/world/feature/OreCave.java +++ b/src/main/java/com/hbm/world/feature/OreCave.java @@ -9,7 +9,6 @@ import com.hbm.inventory.RecipesCommon.MetaBlock; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.MinecraftForge; @@ -82,8 +81,8 @@ public class OreCave { double scale = 0.01D; - for(int x = cX; x < cX + 16; x++) { - for(int z = cZ; z < cZ + 16; z++) { + for(int x = cX + 8; x < cX + 24; x++) { + for(int z = cZ + 8; z < cZ + 24; z++) { double n = noise.func_151601_a(x * scale, z * scale); @@ -105,7 +104,7 @@ public class OreCave { boolean canGenFluid = event.rand.nextBoolean(); for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - Block neighbor = world.getBlock(MathHelper.clamp_int(x + dir.offsetX, cX, cX + 16), y + dir.offsetY, MathHelper.clamp_int(z + dir.offsetZ, cZ, cZ + 16)); + Block neighbor = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(neighbor.getMaterial() == Material.air || neighbor instanceof BlockStalagmite) { shouldGen = true; } @@ -132,8 +131,8 @@ public class OreCave { for(int i = 2; i < 6; i++) { ForgeDirection dir = ForgeDirection.getOrientation(i); - int clX = MathHelper.clamp_int(x + dir.offsetX, cX, cX + 16); - int clZ = MathHelper.clamp_int(z + dir.offsetZ, cZ, cZ + 16); + int clX = x + dir.offsetX; + int clZ = z + dir.offsetZ; Block neighbor = world.getBlock(clX, y, clZ); if(neighbor.isNormalCube()) @@ -146,7 +145,7 @@ public class OreCave { } else { - if((genTarget.getMaterial() == Material.air || !genTarget.isNormalCube()) && event.rand.nextInt(5) == 0) { + if((genTarget.getMaterial() == Material.air || !genTarget.isNormalCube()) && event.rand.nextInt(5) == 0 && !genTarget.getMaterial().isLiquid()) { if(ModBlocks.stalactite.canPlaceBlockAt(world, x, y, z)) { world.setBlock(x, y, z, ModBlocks.stalactite, ore.meta, 2); diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_in_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_in_side_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f0374fbe7023637a45803160f3c9d5d12149d3a8 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf+Jex-PppcYdY* z%%mor(^6(3D)LLOXkCc1=3u!NRekW7#FU_jY);iLt;aV%JTxafSIp({0g1;l^P-ED z7%JxEGh7jU^DS0PeS(-}YGmD6zpx8Y#k=A=CiAV+Hn-6hIQh`ZBW6P}>%=9ld=Fa0 zS@%1vWXNEcl`b!{`}*?wz10WpH+*S~dAuz77tggY?x-wx!~N#=XMw(8@O1TaS?83{ F1OP|hU%dbT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_in_side_up.png b/src/main/resources/assets/hbm/textures/blocks/crane_in_side_up.png new file mode 100644 index 0000000000000000000000000000000000000000..181ab8eb930d0b15658dbf7efb7cb5e615947b1e GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfyU$hTfE6so$9tJafhvMWKX>|StUInXK&BkC0u1qSC1!Yb+$%|)<064nO1K1 z%vNk#=OvT1k^vj{OC(!0p4++nz~O7R6e5IiE}eJ!AfQzW+aM29483 z5e7e`l^3wB;P*AyJ74kd%R3yu4(#jyW5yS??D~T2yA0oL{Q3UWcB}#Vg2B_(&t;uc GLK6UDLuc;* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_out_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_out_side_down.png new file mode 100644 index 0000000000000000000000000000000000000000..0b77746b16a6fde2d3b165a45f50717c0ac6cfef GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfkGELn6N^p+f1ZF^iyHM36pPq&w95U z74yCPy z=G+!*sGbw=z*}CWmFHJFzH-WgUX($58NW6 z4*VDHFAA)`H|OWa9@hT{jKqt2clW)#ePflm$TttKpJF!tK=(6vy85}Sb4q9e0BBWY A2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_out_side_up.png b/src/main/resources/assets/hbm/textures/blocks/crane_out_side_up.png new file mode 100644 index 0000000000000000000000000000000000000000..9bde5e3f7323365d3bb4de258b75447ba01aa320 GIT binary patch literal 254 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 AVgLXD literal 2399 zcmbtVX;2eb5`KwcAgGX_0)lb`0l|_(9=BOu zO&$QS*~t;>3IIfELV(;)QssHM=)6?H!VfyR$w?(%?yqzJ;L1)|2e;_FX`$&wb$8{T zI@?0}#qcTLwwpmAsev1c+#Gnt2Pqf?@3dC2 z>xIVby<1-vAPro{2(fu_3RLTiaI++ydP6`u8RlrrWN)~YxaCFZtv?m^J!-0$W4)Vpnz;$ zjzZ~WIAO7$rl-9IDsqqMg+)h4PuCQM7T=6b;)ecWS04_c*0#;;XJf7#xArL+83D#GmC)_09+FOKEIuT%Ku| zMWKADR5V4hGOj+r(6GD4WHOgWOSvV>(;XAnsXiX?_9pirMErcG3($DE(%Ug2&Q0WqMncN^*r7bux_wl;HIQvRT1t@;(`VpMyN8<3Ti z4Q80CZt}I&P%*=E2Yur5Vw4-bbK~2MihafhACGa5*6IP2(ct4LRfS|z4MwV(e@2$A zOGk$e>ivt6R`&r@=A-sifH1O!y?g!XtNw_{8vGD_Z5LSX0tg|0?p(J6flco zV#T(%wQW~qFv$lPYc3k-rd7$^X}Sk7y-X>fO8fcUXPRnPF?aey<@U{99(2{0{4CEt zbQ`x6d$=;d24!^dj8jpJ#gIfo`7}G*dUrZCHMKqqYTUrDYZ;*VyMdki?9g1RdUw-c z@67fDGnhe+JgvIFNxiaSp=SMOFp)l{MDn`@g3Vxoh6%5G&p^p^U7oPI29{kuuVRnC zGqoapcBxGoZ2{}+X`(^d2p5*U*Ch8W z`HqxoMpadnDx=lHc+ursWZ4iG0~=Wj&j;POwcNh7f;IsL1;d0XAOGw(Y_h);_A!mYIM>C5<}lX6&2p*a zU$;B9D9i9jCiLOC@M{APTXPDn`c#shz7Yy7ZS1_Pf4g47yFtBk{tLs%VnfQ?yFgk| zaMW;4#Ak!RyqKuLa@UV&q0nn3Y>X&_cyJhkxKXIn`A~kyC_^)}iU>*P8*T&DPcms| z12QAfWe365fXw}pgEVtF8npZo3;```v!XpMTNP0P62WeI2KAiLYyFmEsQXt z)<;V&FSxu^V(YAmDS1pLKiW2}qu!}c24htWtk0i@!bpc$KwRb~)^hd%4VgxtcXzAE}8dDwnIV-)|U2ps$e3qKV5BSBKv{om6h3+iih5H}rh?4{Gt@9e%U*M~&N znB(Ci2O6MnG`y}{Ke=X!$6rj-{d3Cy46K6p%z(1P9Oq7|O{?HdKY;yfaBmH(KC>d@ zw<8<9IquB-{Maz`l7)G+WZA@C!>VVF?`XKv#Z~iY$6D*@I8>b>x Scm%<>L{5kC*ouRstN#SkuMzzK diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_crane_inserter.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_crane_inserter.png new file mode 100644 index 0000000000000000000000000000000000000000..a8047227319ef46c59a6c5284222663a794200de GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGv=yQhm| zNX4ADcLVbtMF_NAELv^OnsZp%@snKyM_ha4wC9RUzUfMCvNe-m|9QUW$y$eo{Sw?= z3%6}In{o2ILCtsB2maCaim!KB{rh>tfG1Sx!qj-_b44FMU)iJ+dQM>Xrqtg590%T( z-7YY(Klrq0<*HS$zeYXvS->4VkI}~BN22^J7KR(_j137)3(8%{j7X zE$8~_pI^9EpVQ&$ZSF^+mrbtPoPYKvqi^&6e>*uiu$XRu(^~zT>;`?wzL!({Zpi%l zuF5#$`Ol}i#@~HSpS?-%>vj0MS@6W1wBj6=SM#%BPQ_^$iUdUCi}}3{&rD_~D+m0~ zVKG{MQ%1V+*K;XUucK%~4il&ZMB^{>9Eswd7+Q{*!z#@W6@Li4Fbx=50{n;D0 zKJ@m!Z$FkSOJ~@Ad+oXB#iwU8#9jEKdtmP`hx!?B z==qF1#~&9yp7=*akKxs!3@a+wDY|)CvZ*N}aGv|H0eDATvHDIjG z`25mx`Q?{SEo!{Ra{HqgMq0sQC?pYqB>cZK_B@Wb zY_hjT`PmHT`E9GBu9vP|_3Qj2R_VqwFB8xG?sb@cdg-cF>#k>Cy`4S7e-ki*-#x#< zaix!p2!8kc0x*$0E3rTBwxA3YProhAn6^G9BZ7ZhZuwlIEb!%o+k&?h+_0dmt`fWu zmQY+Z<8z(1!R?KrH-JvvVR5%_JBeu#tnotM+5>NZ7!jmpPwRf2H>(T3YQS@Nmrggk z_@O(%H1hc4kG172|Jt}4Zdd$gSa-ij|G|4i!hj?Xa>)g~^$drnUVidO+a?=ihNr8a J%Q~loCIB(!zCi#0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/piston_hydraulic.png b/src/main/resources/assets/hbm/textures/items/piston_hydraulic.png new file mode 100644 index 0000000000000000000000000000000000000000..1d069ab700ea7413bbc1392fe00f61130ee760f7 GIT binary patch literal 380 zcmV-?0fYXDP)vh}iF1>WUZrdrPTpY)4R`0ncN#c%=4gnYp`@B3o0_N`F a-}xJ*@t>{;GdrgfO)wOGqXsD57EMqb&g($DQ-eJ-PS2`wSW|8jbQY_kG`}^Hs$0 zc$_Px7+$q_OP*QIS6H1k_lqNJ+s1WWt!A%Gq?GyDdI~2+@zcX>d)8-#wSGlPnRmNg zqc$LlB0SG4NOH~L=`jFSr;RxXNz;@linNZk0D#G4g5x-x4?@f@x>Blg2U{ zMu6pf)nwC0_zScEDP`VdZ1U9XK?uP6>{cth2&U}*Y7crhn7u+X`B!^TGW_T}e*j1c VlqeEhmz)3q002ovPDHLkV1hcCpIHC^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/turrets/arty.png b/src/main/resources/assets/hbm/textures/models/turrets/arty.png new file mode 100644 index 0000000000000000000000000000000000000000..9f87d68621454d03e116ab55134ddea21731dad1 GIT binary patch literal 3441 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 e2`js3C<_Ad4DDDo$$@jQ+l}jH`W0~G<9`Eyj