From ecec7e5a36a88443cea263718f97aaff40fda57a Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 18 Jul 2023 18:34:16 +0200 Subject: [PATCH] the malicious gigglefish from the silly dimension --- changelog | 14 +- src/main/java/com/hbm/blocks/BlockEnums.java | 13 ++ src/main/java/com/hbm/blocks/ModBlocks.java | 22 ++ .../java/com/hbm/blocks/machine/BlockCM.java | 30 +++ .../com/hbm/blocks/machine/BlockCMGlass.java | 31 +++ .../blocks/machine/BlockCustomMachine.java | 131 ++++++++++++ .../hbm/commands/CommandDebugChunkLoad.java | 2 +- .../entity/projectile/EntityThrowableNT.java | 6 +- .../container/ContainerMachineCustom.java | 107 ++++++++++ .../hbm/inventory/gui/GUIMachineCustom.java | 63 ++++++ .../recipes/CustomMachineRecipes.java | 127 +++++++++++ .../recipes/loader/SerializableRecipe.java | 39 +++- .../hbm/items/block/ItemCustomMachine.java | 51 +++++ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityCustomMachine.java | 202 ++++++++++++++++++ .../machine/TileEntityMachineRTG.java | 20 +- .../hbm/textures/blocks/cm_block_alloy.png | Bin 0 -> 537 bytes .../hbm/textures/blocks/cm_block_base.png | Bin 0 -> 560 bytes .../hbm/textures/blocks/cm_block_desh.png | Bin 0 -> 577 bytes .../hbm/textures/blocks/cm_block_steel.png | Bin 0 -> 563 bytes .../hbm/textures/blocks/cm_block_tcalloy.png | Bin 0 -> 564 bytes .../hbm/textures/blocks/cm_engine_bismuth.png | Bin 0 -> 797 bytes .../hbm/textures/blocks/cm_engine_desh.png | Bin 0 -> 701 bytes .../textures/blocks/cm_engine_standard.png | Bin 0 -> 655 bytes .../hbm/textures/blocks/cm_port_alloy.png | Bin 0 -> 581 bytes .../hbm/textures/blocks/cm_port_desh.png | Bin 0 -> 615 bytes .../hbm/textures/blocks/cm_port_steel.png | Bin 0 -> 612 bytes .../hbm/textures/blocks/cm_port_tcalloy.png | Bin 0 -> 626 bytes .../hbm/textures/blocks/cm_sheet_alloy.png | Bin 0 -> 169 bytes .../hbm/textures/blocks/cm_sheet_base.png | Bin 0 -> 174 bytes .../hbm/textures/blocks/cm_sheet_desh.png | Bin 0 -> 165 bytes .../hbm/textures/blocks/cm_sheet_steel.png | Bin 0 -> 169 bytes .../hbm/textures/blocks/cm_sheet_tcalloy.png | Bin 0 -> 176 bytes .../hbm/textures/blocks/cm_tank_alloy.png | Bin 0 -> 371 bytes .../hbm/textures/blocks/cm_tank_desh.png | Bin 0 -> 373 bytes .../hbm/textures/blocks/cm_tank_steel.png | Bin 0 -> 397 bytes .../hbm/textures/blocks/cm_tank_tcalloy.png | Bin 0 -> 397 bytes .../hbm/textures/blocks/cm_terminal_front.png | Bin 0 -> 445 bytes .../hbm/textures/blocks/cm_terminal_side.png | Bin 0 -> 489 bytes .../textures/gui/processing/gui_custom.png | Bin 0 -> 3223 bytes 41 files changed, 843 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/BlockCM.java create mode 100644 src/main/java/com/hbm/blocks/machine/BlockCMGlass.java create mode 100644 src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineCustom.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java create mode 100644 src/main/java/com/hbm/inventory/recipes/CustomMachineRecipes.java create mode 100644 src/main/java/com/hbm/items/block/ItemCustomMachine.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_block_alloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_block_base.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_block_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_block_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_block_tcalloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_engine_bismuth.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_engine_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_engine_standard.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_port_alloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_port_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_port_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_port_tcalloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_sheet_alloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_sheet_base.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_sheet_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_sheet_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_sheet_tcalloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_tank_alloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_tank_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_tank_steel.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_tank_tcalloy.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_terminal_front.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/cm_terminal_side.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_custom.png diff --git a/changelog b/changelog index 2711907d1..ec89d27e1 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,11 @@ -## Fixed -* Fixed bedrock ore to cobblestone being wrong, using actual ore blocks instead of the extracted item -* Fixed missing mapping on the template chest, causing crashes +## Added +* Rubber ball + * can be thrown at people +* New chlorine processing chain + * Involves 240 processing steps of washing, electrolyzing, centrifuging and treating chlorocalcite + +## Changed +* Glyphids now have a higher tracking range, being 256 blocks +* Standard glyphids now have a base health of 100 +* Glyphid scouts are now immune to fire and explosive damage, have a 50% damage reduction against projectiles and have passive regeneration +* Increased hive block blast resistance, they can no longer be blown up wiith conventional explosives diff --git a/src/main/java/com/hbm/blocks/BlockEnums.java b/src/main/java/com/hbm/blocks/BlockEnums.java index 717ac2639..f1119ce64 100644 --- a/src/main/java/com/hbm/blocks/BlockEnums.java +++ b/src/main/java/com/hbm/blocks/BlockEnums.java @@ -20,6 +20,19 @@ public class BlockEnums { SULFUR, ASBESTOS } + + public static enum EnumCMMaterials { + STEEL, + ALLOY, + DESH, + TCALLOY + } + + public static enum EnumCMEngines { + STANDARD, + DESH, + BISMUTH + } /** DECO / STRUCTURE ENUMS */ //i apologize in advance diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fbdcadf67..31dd43231 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -864,6 +864,13 @@ public class ModBlocks { @Deprecated public static Block factory_advanced_furnace; @Deprecated public static Block factory_advanced_conductor; + public static Block cm_block; + public static Block cm_sheet; + public static Block cm_engine; + public static Block cm_tank; + public static Block cm_port; + public static Block custom_machine; + public static Block reactor_element; public static Block reactor_control; public static Block reactor_hatch; @@ -2013,6 +2020,13 @@ public class ModBlocks { factory_advanced_furnace = new FactoryHatch(Material.iron).setBlockName("factory_advanced_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_furnace"); factory_advanced_conductor = new BlockPillar(Material.iron, RefStrings.MODID + ":factory_advanced_conductor").setBlockName("factory_advanced_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); + cm_block = new BlockCM(Material.iron, EnumCMMaterials.class, true, true).setBlockName("cm_block").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_block"); + cm_sheet = new BlockCM(Material.iron, EnumCMMaterials.class, true, true).setBlockName("cm_sheet").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_sheet"); + cm_engine = new BlockCM(Material.iron, EnumCMEngines.class, true, true).setBlockName("cm_engine").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_engine"); + cm_tank = new BlockCMGlass(Material.iron, EnumCMMaterials.class, true, true).setBlockName("cm_tank").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_tank"); + cm_port = new BlockCM(Material.iron, EnumCMMaterials.class, true, true).setBlockName("cm_port").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_port"); + custom_machine = new BlockCustomMachine().setBlockName("custom_machine").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); + reactor_element = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_element_top", RefStrings.MODID + ":reactor_element_base").setBlockName("reactor_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_element_side"); reactor_control = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_control_top").setBlockName("reactor_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_control_side"); reactor_hatch = new ReactorHatch(Material.iron).setBlockName("reactor_hatch").setHardness(5.0F).setResistance(1000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_concrete"); @@ -3331,6 +3345,14 @@ public class ModBlocks { GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); + //CM stuff + register(custom_machine, ItemCustomMachine.class); + register(cm_block); + register(cm_sheet); + register(cm_engine); + register(cm_tank); + register(cm_port); + //Multiblock Generators GameRegistry.registerBlock(reactor_element, reactor_element.getUnlocalizedName()); GameRegistry.registerBlock(reactor_control, reactor_control.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/BlockCM.java b/src/main/java/com/hbm/blocks/machine/BlockCM.java new file mode 100644 index 000000000..eb8b23e78 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockCM.java @@ -0,0 +1,30 @@ +package com.hbm.blocks.machine; + +import java.util.Locale; + +import com.hbm.blocks.BlockEnumMulti; + +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.util.IIcon; + +public class BlockCM extends BlockEnumMulti { + + public BlockCM(Material mat, Class theEnum, boolean multiName, boolean multiTexture) { + super(mat, theEnum, multiName, multiTexture); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + Enum[] enums = theEnum.getEnumConstants(); + this.icons = new IIcon[enums.length]; + + for(int i = 0; i < icons.length; i++) { + Enum num = enums[i]; + this.icons[i] = reg.registerIcon(this.getTextureName() + "_" + num.name().toLowerCase(Locale.US)); + } + } +} diff --git a/src/main/java/com/hbm/blocks/machine/BlockCMGlass.java b/src/main/java/com/hbm/blocks/machine/BlockCMGlass.java new file mode 100644 index 000000000..af9a116a9 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockCMGlass.java @@ -0,0 +1,31 @@ +package com.hbm.blocks.machine; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; + +public class BlockCMGlass extends BlockCM { + + public BlockCMGlass(Material mat, Class theEnum, boolean multiName, boolean multiTexture) { + super(mat, theEnum, multiName, multiTexture); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + Block block = world.getBlock(x, y, z); + + return block == this ? false : super.shouldSideBeRendered(world, x, y, z, side); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java b/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java new file mode 100644 index 000000000..2d1eb0484 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockCustomMachine.java @@ -0,0 +1,131 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; + +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.machine.TileEntityCustomMachine; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockCustomMachine extends BlockContainer { + + @SideOnly(Side.CLIENT) + private IIcon iconFront; + + public BlockCustomMachine() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCustomMachine(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":cm_terminal_front"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":cm_terminal_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); + } + + @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()) { + + TileEntityCustomMachine tile = (TileEntityCustomMachine) world.getTileEntity(x, y, z); + + if(tile != null) { + + if(tile.checkStructure()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + } else if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) { + tile.buildStructure(); + } + } + return true; + } + + return false; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + + TileEntityCustomMachine tile = (TileEntityCustomMachine) world.getTileEntity(x, y, z); + + if(tile != null && stack.hasTagCompound()) { + tile.machineType = stack.stackTagCompound.getString("machineType"); + tile.init(); + tile.markChanged(); + } + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + + ArrayList ret = new ArrayList(); + Item item = getItemDropped(metadata, world.rand, fortune); + if(item != null) { + + ItemStack stack = new ItemStack(item, 1, damageDropped(metadata)); + TileEntityCustomMachine tile = (TileEntityCustomMachine) world.getTileEntity(x, y, z); + + if(tile != null) { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setString("machineType", tile.machineType); + } + + ret.add(stack); + } + + return ret; + } +} diff --git a/src/main/java/com/hbm/commands/CommandDebugChunkLoad.java b/src/main/java/com/hbm/commands/CommandDebugChunkLoad.java index ac10eae4d..caf5e7673 100644 --- a/src/main/java/com/hbm/commands/CommandDebugChunkLoad.java +++ b/src/main/java/com/hbm/commands/CommandDebugChunkLoad.java @@ -55,7 +55,7 @@ public class CommandDebugChunkLoad extends CommandBase { } Object[] data = anvil.loadChunk__Async(sender.getEntityWorld(), cX, cZ); - Chunk chunk = (Chunk) data[0]; + //Chunk chunk = (Chunk) data[0]; NBTTagCompound nbt = (NBTTagCompound) data[1]; NBTTagCompound level = nbt.getCompoundTag("Level"); NBTTagList tagList = level.getTagList("TileEntities", 10); diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index ebde86c60..fbd99c23c 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -179,6 +179,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX * motionMult(), this.motionY * motionMult(), this.motionZ * motionMult()).expand(1.0D, 1.0D, 1.0D)); double nearest = 0.0D; EntityLivingBase thrower = this.getThrower(); + MovingObjectPosition nonPenImpact = null; for(int j = 0; j < list.size(); ++j) { Entity entity = (Entity) list.get(j); @@ -192,7 +193,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { // if penetration is enabled, run impact for all intersecting entities if(this.doesPenetrate()) { - this.onImpact(new MovingObjectPosition(entity)); + this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); } else { double dist = pos.distanceTo(hitMop.hitVec); @@ -200,6 +201,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { if(dist < nearest || nearest == 0.0D) { hitEntity = entity; nearest = dist; + nonPenImpact = hitMop; } } } @@ -208,7 +210,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { // if not, only run it for the closest MOP if(!this.doesPenetrate() && hitEntity != null) { - mop = new MovingObjectPosition(hitEntity); + mop = new MovingObjectPosition(hitEntity, nonPenImpact.hitVec); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineCustom.java b/src/main/java/com/hbm/inventory/container/ContainerMachineCustom.java new file mode 100644 index 000000000..1a15db6ba --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineCustom.java @@ -0,0 +1,107 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.SlotPattern; +import com.hbm.tileentity.machine.TileEntityCustomMachine; + +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 ContainerMachineCustom extends Container { + + private TileEntityCustomMachine custom; + + public ContainerMachineCustom(InventoryPlayer playerInv, TileEntityCustomMachine tile) { + custom = tile; + + //Input + this.addSlotToContainer(new Slot(tile, 0, 150, 72)); + //Fluid IDs + for(int i = 0; i < tile.inputTanks.length; i++) this.addSlotToContainer(new Slot(tile, 1 + i, 8, 54 + 18 * i)); + //Item inputs + if(tile.config.itemInCount > 0) this.addSlotToContainer(new Slot(tile, 4, 8, 72)); + if(tile.config.itemInCount > 1) this.addSlotToContainer(new Slot(tile, 5, 26, 72)); + if(tile.config.itemInCount > 2) this.addSlotToContainer(new Slot(tile, 6, 44, 72)); + if(tile.config.itemInCount > 3) this.addSlotToContainer(new Slot(tile, 7, 8, 90)); + if(tile.config.itemInCount > 4) this.addSlotToContainer(new Slot(tile, 8, 26, 90)); + if(tile.config.itemInCount > 5) this.addSlotToContainer(new Slot(tile, 9, 44, 90)); + //Templates + if(tile.config.itemInCount > 0) this.addSlotToContainer(new SlotPattern(tile, 10, 8, 108)); + if(tile.config.itemInCount > 1) this.addSlotToContainer(new SlotPattern(tile, 11, 26, 108)); + if(tile.config.itemInCount > 2) this.addSlotToContainer(new SlotPattern(tile, 12, 44, 108)); + if(tile.config.itemInCount > 3) this.addSlotToContainer(new SlotPattern(tile, 13, 8, 126)); + if(tile.config.itemInCount > 4) this.addSlotToContainer(new SlotPattern(tile, 14, 26, 126)); + if(tile.config.itemInCount > 5) this.addSlotToContainer(new SlotPattern(tile, 15, 44, 126)); + //Output + if(tile.config.itemOutCount > 0) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 16, 78, 72)); + if(tile.config.itemOutCount > 1) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 17, 96, 72)); + if(tile.config.itemOutCount > 2) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 18, 114, 72)); + if(tile.config.itemOutCount > 3) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 19, 78, 90)); + if(tile.config.itemOutCount > 4) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 20, 96, 90)); + if(tile.config.itemOutCount > 5) this.addSlotToContainer(new SlotCraftingOutput(playerInv.player, tile, 21, 114, 90)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 174 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 232)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return custom.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + //TODO: shoot whoever at mojang wrote the container code + if(index < 0 || index >= this.inventorySlots.size() || !(this.inventorySlots.get(index) instanceof SlotPattern)) { + return super.slotClick(index, button, mode, player); + } + + Slot slot = this.getSlot(index); + index = ((Slot) this.inventorySlots.get(index)).getSlotIndex(); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) + ret = slot.getStack().copy(); + + if(button == 1 && mode == 0 && slot.getHasStack()) { + custom.matcher.nextMode(player.worldObj, slot.getStack(), index - 10); + return ret; + + } else { + + slot.putStack(held != null ? held.copy() : null); + + if(slot.getHasStack()) { + slot.getStack().stackSize = 1; + } + + slot.onSlotChanged(); + custom.matcher.initPatternSmart(player.worldObj, slot.getStack(), index - 10); + + return ret; + } + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java new file mode 100644 index 000000000..5bbc86167 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java @@ -0,0 +1,63 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineCustom; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityCustomMachine; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineCustom extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_custom.png"); + private TileEntityCustomMachine custom; + + public GUIMachineCustom(InventoryPlayer invPlayer, TileEntityCustomMachine tedf) { + super(new ContainerMachineCustom(invPlayer, tedf)); + custom = tedf; + + this.xSize = 176; + this.ySize = 256; + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.custom.getInventoryName(); + this.fontRendererObj.drawString(name, 68 - 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 interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + for(int i = 0; i < 2; i++) { + for(int j = 0; j < 3; j++) { + int index = i * 3 + j; + if(custom.config.itemInCount <= index) { + drawTexturedModalRect(guiLeft + 7 + j * 18, guiTop + 71 + i * 18, 192 + j * 18, 86 + i * 18, 18, 18); + drawTexturedModalRect(guiLeft + 7 + j * 18, guiTop + 107 + i * 18, 192 + j * 18, 86 + i * 18, 18, 18); + } + if(custom.config.itemOutCount <= index) { + drawTexturedModalRect(guiLeft + 77 + j * 18, guiTop + 71 + i * 18, 192 + j * 18, 86 + i * 18, 18, 18); + } + } + } + + for(int i = 0; i < 3; i++) { + if(custom.config.fluidInCount <= i) { + drawTexturedModalRect(guiLeft + 7 + i * 18, guiTop + 17, 192 + i * 18, 32, 18, 54); + } + if(custom.config.fluidOutCount <= i) { + drawTexturedModalRect(guiLeft + 77 + i * 18, guiTop + 17, 192 + i * 18, 32, 18, 36); + } + } + } + +} diff --git a/src/main/java/com/hbm/inventory/recipes/CustomMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/CustomMachineRecipes.java new file mode 100644 index 000000000..e3fe13cef --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/CustomMachineRecipes.java @@ -0,0 +1,127 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; +import com.hbm.util.Tuple.Pair; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +public class CustomMachineRecipes extends SerializableRecipe { + + public static HashMap> recipes = new HashMap(); + + @Override + public void registerDefaults() { + + recipes.put("paperPress", new ArrayList() {{ + CustomMachineRecipe recipe = new CustomMachineRecipe(); + recipe.inputFluids = new FluidStack[] {new FluidStack(Fluids.WATER, 250)}; + recipe.inputItems = new AStack[] {new ComparableStack(ModItems.powder_sawdust)}; + recipe.outputFluids = new FluidStack[0]; + recipe.outputItems = new Pair[] {new Pair(new ItemStack(Items.paper, 3), 1F)}; + recipe.duration = 60; + recipe.consumptionPerTick = 10; + add(recipe); + }}); + } + + @Override + public String getFileName() { + return "hbmCustomMachines.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = recipe.getAsJsonObject(); + + String name = obj.get("recipeKey").getAsString(); + List list = new ArrayList(); + JsonArray array = obj.get("recipes").getAsJsonArray(); + + for(int i = 0; i < array.size(); i++) { + JsonObject rec = array.get(i).getAsJsonObject(); + CustomMachineRecipe recipeInstance = new CustomMachineRecipe(); + recipeInstance.inputFluids = this.readFluidArray(rec.get("inputFluids").getAsJsonArray()); + recipeInstance.inputItems = this.readAStackArray(rec.get("inputItems").getAsJsonArray()); + recipeInstance.outputFluids = this.readFluidArray(rec.get("outputFluids").getAsJsonArray()); + recipeInstance.outputItems = this.readItemStackArrayChance(rec.get("outputItems").getAsJsonArray()); + recipeInstance.duration = rec.get("duration").getAsInt(); + recipeInstance.consumptionPerTick = rec.get("consumptionPerTick").getAsInt(); + list.add(recipeInstance); + } + + recipes.put(name, list); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + Entry> entry = (Entry) recipe; + + writer.name("recipeKey").value(entry.getKey()); + writer.name("recipes").beginArray(); + + for(CustomMachineRecipe recipeInstance : entry.getValue()) { + writer.beginObject(); + + writer.name("inputFluids").beginArray(); + for(FluidStack stack : recipeInstance.inputFluids) this.writeFluidStack(stack, writer); + writer.endArray(); + + writer.name("inputItems").beginArray(); + for(AStack stack : recipeInstance.inputItems) this.writeAStack(stack, writer); + writer.endArray(); + + writer.name("outputFluids").beginArray(); + for(FluidStack stack : recipeInstance.outputFluids) this.writeFluidStack(stack, writer); + writer.endArray(); + + writer.name("outputItems").beginArray(); + for(Pair stack : recipeInstance.outputItems) this.writeItemStackChance(stack, writer); + writer.endArray(); + + writer.name("duration").value(recipeInstance.duration); + writer.name("consumptionPerTick").value(recipeInstance.consumptionPerTick); + + writer.endObject(); + } + + writer.endArray(); + } + + public static class CustomMachineRecipe { + + public FluidStack[] inputFluids; + public AStack[] inputItems; + public FluidStack[] outputFluids; + public Pair[] outputItems; + + public int duration; + public int consumptionPerTick; + } + +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 405cede7f..5e2f11a98 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -25,6 +25,7 @@ import com.hbm.inventory.material.MatDistribution; import com.hbm.inventory.recipes.*; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; +import com.hbm.util.Tuple.Pair; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -62,6 +63,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new OutgasserRecipes()); recipeHandlers.add(new CompressorRecipes()); recipeHandlers.add(new MatDistribution()); + recipeHandlers.add(new CustomMachineRecipes()); } public static void initialize() { @@ -166,7 +168,9 @@ public abstract class SerializableRecipe { writer.endArray(); //end recipe array writer.endObject(); //final '}' writer.close(); - } catch(Exception ex) { } + } catch(Exception ex) { + ex.printStackTrace(); + } } public void readRecipeFile(File file) { @@ -243,6 +247,18 @@ public abstract class SerializableRecipe { return new ItemStack(ModItems.nothing); } + protected static Pair readItemStackChance(JsonArray array) { + try { + Item item = (Item) Item.itemRegistry.getObject(array.get(0).getAsString()); + int stacksize = array.size() > 2 ? array.get(1).getAsInt() : 1; + int meta = array.size() > 3 ? array.get(2).getAsInt() : 0; + float chance = array.get(array.size() - 1).getAsFloat(); + if(item != null) return new Pair(new ItemStack(item, stacksize, meta), chance); + } catch(Exception ex) { } + MainRegistry.logger.error("Error reading stack array " + array.toString() + " - defaulting to NOTHING item!"); + return new Pair(new ItemStack(ModItems.nothing), 1F); + } + protected static ItemStack[] readItemStackArray(JsonArray array) { try { ItemStack[] items = new ItemStack[array.size()]; @@ -253,6 +269,16 @@ public abstract class SerializableRecipe { return new ItemStack[0]; } + protected static Pair[] readItemStackArrayChance(JsonArray array) { + try { + Pair[] items = new Pair[array.size()]; + for(int i = 0; i < items.length; i++) { items[i] = readItemStackChance((JsonArray) array.get(i)); } + return items; + } catch(Exception ex) { } + MainRegistry.logger.error("Error reading stack array " + array.toString()); + return new Pair[0]; + } + protected static void writeItemStack(ItemStack stack, JsonWriter writer) throws IOException { writer.beginArray(); writer.setIndent(""); @@ -263,6 +289,17 @@ public abstract class SerializableRecipe { writer.setIndent(" "); } + protected static void writeItemStackChance(Pair stack, JsonWriter writer) throws IOException { + writer.beginArray(); + writer.setIndent(""); + writer.value(Item.itemRegistry.getNameForObject(stack.getKey().getItem())); //item name + if(stack.getKey().stackSize != 1 || stack.getKey().getItemDamage() != 0) writer.value(stack.getKey().stackSize); //stack size + if(stack.getKey().getItemDamage() != 0) writer.value(stack.getKey().getItemDamage()); //metadata + writer.value(stack.value); //chance + writer.endArray(); + writer.setIndent(" "); + } + protected static FluidStack readFluidStack(JsonArray array) { try { FluidType type = Fluids.fromName(array.get(0).getAsString()); diff --git a/src/main/java/com/hbm/items/block/ItemCustomMachine.java b/src/main/java/com/hbm/items/block/ItemCustomMachine.java new file mode 100644 index 000000000..fe62ea56a --- /dev/null +++ b/src/main/java/com/hbm/items/block/ItemCustomMachine.java @@ -0,0 +1,51 @@ +package com.hbm.items.block; + +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.config.CustomMachineConfigJSON; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemCustomMachine extends ItemBlock { + + public ItemCustomMachine(Block block) { + super(block); + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + + for(Entry entry : CustomMachineConfigJSON.customMachines.entrySet()) { + ItemStack stack = new ItemStack(item); + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setString("machineType", entry.getKey()); + list.add(stack); + } + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + + if(stack.hasTagCompound()) { + String name = stack.getTagCompound().getString("machineType"); + MachineConfiguration conf = CustomMachineConfigJSON.customMachines.get(name); + + if(conf != null) { + return conf.localizedName; + } + + return "INVALID MACHINE CONTROLLER (" + name + ")"; + } + + return "INVALID MACHINE CONTROLLER"; + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 3b92bc223..6e486d7e0 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -838,6 +838,8 @@ public class MainRegistry { AnvilRecipes.register(); RefineryRecipes.registerRefinery(); GasCentrifugeRecipes.register(); + + CustomMachineConfigJSON.initialize(); //the good stuff SerializableRecipe.registerAllHandlers(); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index dd84c756e..8498efeaa 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -194,6 +194,7 @@ public class TileMappings { put(TileEntityMachineBAT9000.class, "tileentity_bat9000"); put(TileEntityMachineOrbus.class, "tileentity_orbus"); put(TileEntityGlpyhidSpawner.class, "tileentity_glyphid_spawner"); + put(TileEntityCustomMachine.class, "tileentity_custom_machine"); put(TileEntityLoot.class, "tileentity_ntm_loot"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java new file mode 100644 index 000000000..28bfe2dbe --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java @@ -0,0 +1,202 @@ +package com.hbm.tileentity.machine; + +import com.hbm.config.CustomMachineConfigJSON; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; +import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration.ComponentDefinition; +import com.hbm.inventory.container.ContainerMachineCustom; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachineCustom; +import com.hbm.module.ModulePatternMatcher; +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.block.Block; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCustomMachine extends TileEntityMachineBase implements IGUIProvider { + + public String machineType; + public MachineConfiguration config; + + public long power; + public int progress; + public FluidTank[] inputTanks; + public FluidTank[] outputTanks; + public ModulePatternMatcher matcher; + public int structureCheckDelay; + public boolean structureOK = false; + + public TileEntityCustomMachine() { + /* + * 0: Battery + * 1-3: Fluid IDs + * 4-9: Inputs + * 10-15: Template + * 16-21: Output + */ + super(22); + } + + public void init() { + MachineConfiguration config = CustomMachineConfigJSON.customMachines.get(this.machineType); + + if(config != null) { + this.config = config; + + inputTanks = new FluidTank[config.fluidInCount]; + for(int i = 0; i < inputTanks.length; i++) inputTanks[i] = new FluidTank(Fluids.NONE, config.fluidInCap); + outputTanks = new FluidTank[config.fluidOutCount]; + for(int i = 0; i < outputTanks.length; i++) outputTanks[i] = new FluidTank(Fluids.NONE, config.fluidOutCap); + + matcher = new ModulePatternMatcher(config.itemInCount); + + } else { + worldObj.func_147480_a(xCoord, yCoord, zCoord, false); + } + } + + @Override + public String getName() { + return config != null ? config.localizedName : "INVALID"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(config == null) { + worldObj.func_147480_a(xCoord, yCoord, zCoord, false); + return; + } + + this.structureCheckDelay--; + if(this.structureCheckDelay <= 0) this.checkStructure(); + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", this.machineType); + data.setLong("power", power); + data.setInteger("progress", progress); + for(int i = 0; i < inputTanks.length; i++) inputTanks[i].writeToNBT(data, "i" + i); + for(int i = 0; i < outputTanks.length; i++) outputTanks[i].writeToNBT(data, "o" + i); + this.matcher.writeToNBT(data); + this.networkPack(data, 50); + } + } + + public boolean checkStructure() { + + this.structureCheckDelay = 300; + this.structureOK = false; + if(this.config == null) return false; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + for(ComponentDefinition comp : config.components) { + + /* vvv precisely the same method used for defining ports vvv */ + int x = xCoord - dir.offsetX * comp.x + rot.offsetX * comp.x; + int y = yCoord + comp.y; + int z = zCoord - dir.offsetZ * comp.z + rot.offsetZ * comp.z; + /* but for EW directions it just stops working entirely */ + /* there is absolutely zero reason why this should be required */ + if(dir == ForgeDirection.EAST || dir == ForgeDirection.WEST) { + x = xCoord + dir.offsetZ * comp.z - rot.offsetZ * comp.z; + z = zCoord + dir.offsetX * comp.x - rot.offsetX * comp.x; + } + /* i wholeheartedly believe it is the computer who is wrong here */ + + Block b = worldObj.getBlock(x, y, z); + if(b != comp.block) return false; + + int meta = worldObj.getBlockMetadata(x, y, z); + if(!comp.allowedMetas.contains(meta)) return false; + } + + this.structureOK = true; + return true; + } + + public void buildStructure() { + + if(this.config == null) return; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + for(ComponentDefinition comp : config.components) { + + int x = xCoord - dir.offsetX * comp.x + rot.offsetX * comp.x; + int y = yCoord + comp.y; + int z = zCoord - dir.offsetZ * comp.z + rot.offsetZ * comp.z; + if(dir == ForgeDirection.EAST || dir == ForgeDirection.WEST) { + x = xCoord + dir.offsetZ * comp.z - rot.offsetZ * comp.z; + z = zCoord + dir.offsetX * comp.x - rot.offsetX * comp.x; + } + + worldObj.setBlock(x, y, z, comp.block, (int) comp.allowedMetas.toArray()[0], 3); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.machineType = nbt.getString("type"); + if(this.config == null) this.init(); + + this.power = nbt.getLong("power"); + this.progress = nbt.getInteger("progress"); + for(int i = 0; i < inputTanks.length; i++) inputTanks[i].readFromNBT(nbt, "i" + i); + for(int i = 0; i < outputTanks.length; i++) outputTanks[i].readFromNBT(nbt, "o" + i); + + this.matcher.readFromNBT(nbt); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + + this.machineType = nbt.getString("machineType"); + this.init(); + + super.readFromNBT(nbt); + + for(int i = 0; i < inputTanks.length; i++) inputTanks[i].readFromNBT(nbt, "i" + i); + for(int i = 0; i < outputTanks.length; i++) outputTanks[i].readFromNBT(nbt, "o" + i); + + this.matcher.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + + nbt.setString("machineType", machineType); + + super.writeToNBT(nbt); + + for(int i = 0; i < inputTanks.length; i++) inputTanks[i].writeToNBT(nbt, "i" + i); + for(int i = 0; i < outputTanks.length; i++) outputTanks[i].writeToNBT(nbt, "o" + i); + + this.matcher.writeToNBT(nbt); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(this.config == null) return null; + return new ContainerMachineCustom(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(this.config == null) return null; + return new GUIMachineCustom(player.inventory, this); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java index b770c4111..63f6ec905 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java @@ -139,7 +139,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - power = nbt.getInteger("power"); + power = nbt.getLong("power"); heat = nbt.getInteger("heat"); slots = new ItemStack[getSizeInventory()]; @@ -157,16 +157,14 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("power", (short) (power)); - nbt.setInteger("heat", (short) (heat)); + nbt.setLong("power", power); + nbt.setInteger("heat", heat); NBTTagList list = new NBTTagList(); - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); + nbt1.setByte("slot", (byte) i); slots[i].writeToNBT(nbt1); list.appendTag(nbt1); } @@ -175,9 +173,9 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided } @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_){ - return slot_io; - } + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return slot_io; + } @Override public boolean canInsertItem(int i, ItemStack itemStack, int j) { diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_block_alloy.png b/src/main/resources/assets/hbm/textures/blocks/cm_block_alloy.png new file mode 100644 index 0000000000000000000000000000000000000000..af14c2675435802c3351505250a70df970d3a8f3 GIT binary patch literal 537 zcmV+!0_OdRP)~bf?XhoG-U^rYZ=e?Qt*2wp-LP}5ytk>W@|FvRd_v;bQIP&wy6K`)| zt%itZV>E}L`17o_+b!JPd0t<^lM?Um@bK`7oHHQ=xV?pOgu_7*N@2g>({+k4j_~pR zp1;2z@rVFmyr)bPDJ4SNLW~@bM~pEz=a}c2Qoy;>2-nwG3m)eXfsztk*I}*Y1JJfD z$K#BM7Ktn})g=NR?#HcnkjiT3O|XP_3y#g`fbn_~azhq`8z!5lg`s{WuH?ms)V=W@ema{Tit9udcrtft>&kGSEr;BuR!)9{^JS$#1xSW?0u?TQ= zg>&FJ9N2E*^Or4bHY!9)`qz4`w$vGnQ9+spo}Y0J%%5+_%M0vwi^3ur#^?xjq$+B? bAJ)P@EB!0_k(Miy00000NkvXXu0mjf9Z~Qw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_block_base.png b/src/main/resources/assets/hbm/textures/blocks/cm_block_base.png new file mode 100644 index 0000000000000000000000000000000000000000..ce60d26f2cfb41edb709781efd6031c35d83040c GIT binary patch literal 560 zcmV-00?+-4P)y7g=gl?_ntYQ&o!llsx z$rwWjfpuN~26*o=#xPA2<2WKBEXzVl32SYa-vBSm!aUEEQph>unl&K=N-2!v2+$>O z+t%$%DUoyTidFSD2hExW%6pHswl_B`w{1gJQPn?)?M_u?T~}g^IOiCKp>H0BfojWUPfr{UhaR9>EBpPPaUA;z#u$cSU>rw2 yK0ba2oX=-2mkY12ubps{*pk^!YEWA~M1&t42%h^wfmIFw00001r;P)Iw?Yzu9- zX?F(*P+RWx`8hW?H@v^Um(E zdw#sU;86v@drwM^J-3wWGEft)krIAW~@;BYu_ zJRVV1oO7ruBEoLB+hkC{<2?dfx0Pg`XL8Pn$VRb#uT3)G5kY|v0$tZpN+HHb2w_WD zlZ-Kh5SZurQ-Q9-G~{6zu+}n76FFy`a~u9D@H9<}n6**>PpxgNfm$oWFaT`GDJ5!q zlXIq&f~rCY2rNEWN3#mmbsf&REqNVfN(m7`ME;4WA{anKnCF=oBi?)ZzTZ0ceNRe> zX_|;JE+RUI0emS1Z3R|>71dgcbB$5sTGV_{9~;}fm$o26acKX)LKzhy!TAg zM6Go(Q$t5}F_Jqw;{q_Pq5?&P()K`d-u~0}Ljg`saDY$yJ=a%P+}+*r<>CTq22xc{ zb~_jbCq6Bc^Bw P00000NkvXXu0mjfkWu+h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_block_steel.png b/src/main/resources/assets/hbm/textures/blocks/cm_block_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..05180ac759cc1f413e5d6f709bdd28f22d57d96d GIT binary patch literal 563 zcmV-30?hr1P)3-lM9NQUEv}kKEqga(8!!ODXa7^~K}kBROZh_uSmv5M$(gJ|iNiD&ODV%<~LD zjFE?j2cDmwakW+eoO5j3MoNikng}6qxm+;DV6CN;f~sPz1>oxH3K79sYpJ!8QevKG zL1I8~+AN(ce(JvnD$jD!$+ zLu)d|5JF&G*S`VYdyFwm)5JKAhzQHFkW#{0+vPXF%d#-fGo=)A&bVex2!T=x<2V9z z$=kMd`%+5eoV#LG{mntMrh)R_W3BDY&B|@tP*qg*4`RDhRaw`S7$eR(hGFQNhhbpb zHkM@}#)ybut^I}GBsG|-+NHLSIp>~{lu`!^;97JW6aW#Sl+t`=Sr$quJxsOM9(Q+r zea+!;=o1_9rr_Uu0gN%!TG{P(SZi_T^O@uE$o>62hr^)#37J~1~gJn zyW4HMyaBS=a4T})s`~Z*H-FyVYDx)JWxwC!oa28gguu(o3ogdU>2%_JJ|iNC2(?y3 z1Y-;$g7+R(rIZ4|@p$C^{+`dzPh3igudgqjo}S1#ZYb^jbH#dj~&RR>Ym6Q_m zJR>3iOw+{mdZpG%`_nkJsLElF@_KV>$?69@ZMvLVVWk!aYRH|mW7lO*4i$=0bZ7cd7deykaNa0YeEQ=QW(b( zpiADit=pGUBIn!{tLje(7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_engine_bismuth.png b/src/main/resources/assets/hbm/textures/blocks/cm_engine_bismuth.png new file mode 100644 index 0000000000000000000000000000000000000000..c61aa02bd203d813d82e6e147bee5db73ea65c29 GIT binary patch literal 797 zcmV+&1LFLNP)E}UX*M+xK~N~A5D2;o#V&NM2#Qoei6V87DmFK1HJ8qqaOvbSNy<#`{qFrf7t@)w zXM5nh=e+N8#Pag8Gsa-8rC2PYwdVg+r_*6=Z4DjAF{`Vqv|25slt?LY&LO2l2!WK6 zTrP*TmMqHvsMTtWj*c=mHikCFu)Dj<<#ShPL;(PP=<~3=L$}-I*=OG3_uv~i0^Z~> ze}8_HFbtWWpJ!!d1?`*z;EQ{oVvOPZ#0B<%%J2*az;+VAVR-bN&2mp*RNNX+5IgBy9^4z<$%^l)61`oU!j{?y6ZI3rD zzr@?`oy8c_>-Pubayf($%$!*uhyrruQ^ax1ov*IrfA%%6El%N_qX2|KM4F~7EliVT z8EKj#`_XJg0r%TJ`w!{>NGW-JX`0<2;+@4Q!XP3KEGQGGP$0<%b9ZVjp}zWb)W!6Rov9Q)&?YQRh%=oBX)Pn~PHv zAFsXThy3#M1Ck_RW^w|KgHoyoTAHRf=ZKQqRM_UP?;CviNqum09uO&HS%$S1y5Qdp z2TABYx*h*VPL6w&fLk~3^U=P zd7eL-k|YVIPY8yFhREmhG#ZVb4|8*KuGws|v$KP>mOfa{IfM{st&viaW!c~xl~O3B bkW%s=+|h59^mKe200000NkvXXu0mjfU1D&? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_engine_desh.png b/src/main/resources/assets/hbm/textures/blocks/cm_engine_desh.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2e71fff90faa3a2586ede1e98f29b2fd16c9f4 GIT binary patch literal 701 zcmV;u0z&0v@6o#Lfxk;Kppdj2*LKdaXsuGYig<4%j=%&RVAnMMI z78ioxUl81MAugn-OQGAYEFzc|iys(T>Ea@V7D_K^6ADdpGk0cOG`X0C;4Ej(Iqx~| zc}A?PtT?ST)>^XJES~4_Kc~~_P_NhVq9|f@b(LnbiIfs4CC)jdln5b^Qj$ugu-0OX z0iakcGBGj18Qj(KG*U&hAB<#HS! zA5*DRSX*1ebIt*9dw(D89P6bLW#IkzH~=OH0Ccb7&O^6bi$Bxs=C5oa%8Q@Vm&F4ym`pgVk>*QT)jZCFd2qE}bE@Og# z=j}F86mh-T#TY{z$H>8I2D2|`G5|;^F9U;s&1y9zu>0)+VO>?fPc5I@H+%px5j1voG{Z zsY}q}IKEtCzr}mqF4qnYh8O@a#$c^Yga)GC0Nq9yQuck`g&}t@F1Wg}0l-eJMj7}% zH8oUpfV-E^=ka}?`>hsl!;m}Y=Kxr1*;`onCs@BnMo>!OwcBlq#UhJ~i!^+n$K5Vk zYn*eu&SuHX%n-*h+r1t_2-4{^dzlQ!2L~vn5KBu-?(p!CqoX6NwG6;=&LM=r^E{-K j7-N#(sFXq}g_M#%^j%%Tv;}Q`00000NkvXXu0mjfV7Ndc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_engine_standard.png b/src/main/resources/assets/hbm/textures/blocks/cm_engine_standard.png new file mode 100644 index 0000000000000000000000000000000000000000..a629ff54da589460abc0eda8546e5171cecaa8f4 GIT binary patch literal 655 zcmV;A0&x9_P)%(K$y5fzi=XwATE~ z7z_s7+}xn^Jm=`>h>wpCLE09lryl&U$z7!j>CAq0w| zU}t9sV+_yF&-JFeyE}|AWLZYlHc1iyoO4JBffyssIaXI!d3t&x&+}i&_xJZ~Y;3T( zxruYGUU$wRjYfkcNmyTB$68Cf-6qd-j*pKyIXNLs(>mE&OIen5yIs8Zlx2xjPgC7J z%Q65&gl@NswU#tZYnavCU@#zr@Z$l%KbF}`j?lN ztgWp9(ChX7SFB2RJuxvsv)SbO`Wk?Xiwgik2<-0e{#C4zkr9+q=&!FYTCEm~i;Fay zP1@}?&N*U?yuH0KK0eOe+#E$wFgrWT(9jUW!^6D1y!>!jT3U*)udnp`eL@ISV#OFq pk_4?aB7*n6{*6j0lv0QYe*jC$WY>7Ee-How002ovPDHLkV1gbYHU$6x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_port_alloy.png b/src/main/resources/assets/hbm/textures/blocks/cm_port_alloy.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb09e5bc762f1a517f4394d17b940a71638e471 GIT binary patch literal 581 zcmV-L0=oT)P)(gjP7g*ge=SrJGb-A&iBn4`SeBz0aAj=1ia_J zR?~3z;|fpP^6m34mP@c!O+>vh>a$GoyH0awGdMf*+}?sG1gZ)yE}ju%B+D{5J%zS~ z)k+ak;{N`gx>kg?g{SA|{Qh}`M+5-lJ!!uugg~}lL({O?Y%s>)oTKYHQUd1=EgTE zwTNi{2LZ5F_agca2T&N} T2woFD00000NkvXXu0mjfEII*z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_port_desh.png b/src/main/resources/assets/hbm/textures/blocks/cm_port_desh.png new file mode 100644 index 0000000000000000000000000000000000000000..fe18d8e6ffdd5ffd2df6160e33ed92c61be9ef16 GIT binary patch literal 615 zcmV-t0+{`YP)_=94Jr_gi>bXN*FKTDdq%p=ocV}01W=71S%64F2n1mo8AznP*dtvnEMu`zbU_1uz`L7oOKOY|O zbRFOC@0kL2C>^>PdI1QKhuP!(eNIkJczu1v6C*R=+vO!GC5ocp@bHkX>zL2ySZfgx z-rn9=tyTbZUB}tQ1&>cpcvJ!K-m}?kh%vHQEC?a6TrM%j;G84pjELZz>uK!nVgZkH zC=g?0wOV1V1z@pQuv{)tRh)CEDk8#oJl@KnfX90Tw%fe-{J6RTplKQa>beHt%k3@3 znC+4XctlVjgg{Xgq?7=-ySrmHn*mT&6_d#X=Nusf+P3`zpeQf{<+3cX*3vW$v)PR4 zbh@S6G!19gvR@vXo}33;1372Pviyhjfs_)e3LzlS=iuF%ccJRKrmCv#U{zJr zbxjBX5kW*gL{t$BAR@GFOE&;cCX>HJ?7EJw>v|EL!vH>|gbo1j3_e|7QxpYXt;IRV zXf&d2TSAOPRZPxcOrIZXEehnEw+>iq$vLB{c<))S*W{f0Fb&jE?Stg@_Ba5{fT%zc zA<^G~#JK&3{yr37X9oxP&3w-B(Gln8=X^dmK-!iVBdW^IcnoC;DIuE;#u&_K1ZBzU z`56b8$J0}Nd3oX2W`n?%q7K{qz$Ei=jczCl{05g}G|I{W3KswX002ovPDHLkV1lXB B5LW;I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_port_steel.png b/src/main/resources/assets/hbm/textures/blocks/cm_port_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c997edb72377a9c84d6e81244ce344db24f01d GIT binary patch literal 612 zcmV-q0-ODbP)*V?#5u?R%rFdme0<=hY2x+u zmF;$mh#(@Qln@b&F^C97QJ|{C7y($X*IZp)aeaM_^WM|8Ee{V5gb*l-g3HTGrfFig z+aV&TDnCCz^nDM&G)>&z-tzMDf=ej@;GE-lJmS5l>pF&EV87pEjKNwSibaB0`KY=gi@7AjUYCDWx>m-CbN_hyc)a9mnI5loI()=9DL;ggEC=)p?t9j#Wz3-@YN^h@B?3 zbnO_-5#jjzH*MR}G|g;xzuzOvC8yJgzVC@K5<ukDz@7#uRnjHs;KG=(Pc2I$~cZ>!QF1he!mA`yWP%9rfEV%u-0Cn zXGoF~*BU=Qy2C#2Du?rIhBn zyX)&~>bjm4Q%Zyo2qDZh&gTHe7*a|smrJa*xWnPVX0ze;_LjP?XR9eCR;v|dSrS6v zd_H50VX;_HmL(q_9~Xi5_jj76;pypVCY&wiX67&D$gQ?O1+rGQ;_CD!zTP$~d->|MgBtpi+M%wsd zlza9Ly$My@t_8jByB47BvG&IfL5arsEKVFtSS+126}EP5+<&~X`3nCW{dT^U6=?^6 Pb}@Lm`njxgN@xNAvV}UO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_sheet_base.png b/src/main/resources/assets/hbm/textures/blocks/cm_sheet_base.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6382d01783f90eafa9ee48e208bec73ec79b64 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfCSfAL}I^TR->l>bz&I$fC1v zZtE&rWm-hufnUYc93NhBLQKk{nzwO_W^q9Xn>azEeH UVExKrCeT6#Pgg&ebxsLQ0JHi&k^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_sheet_desh.png b/src/main/resources/assets/hbm/textures/blocks/cm_sheet_desh.png new file mode 100644 index 0000000000000000000000000000000000000000..b68c2850f1aa5e412d9048f79285c1eee80191f3 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfxhJ9)MBRDT4LSb z<(|uE8!(4?b1anSPT2aPP}zXVo^#0*jim)l;t5-y%=ul&9JXJgK6a9>;X?_aJq(_% KelF{r5}E*)BR0qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_sheet_steel.png b/src/main/resources/assets/hbm/textures/blocks/cm_sheet_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a1160bb14e74bce513b8d4e8f7f9c3a0e4ae1e GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfT*}D=J7Ra5wGxW#9j0?7JGy(YV)K z=};8+>h%)JtGYTCtcrMBvD5woyPc56(hE_Gzn_y}ULCvktL3vf5w*+(5sMe!OYK<$ Pw2Q&h)z4*}Q$iB}U2Qvb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_sheet_tcalloy.png b/src/main/resources/assets/hbm/textures/blocks/cm_sheet_tcalloy.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa07c6926ecefd10dbba5638dfe39d5b47f9565 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfm>{ z_J1x@o$u1JRV-}&z3LEALC4UIzaAX7ZB+lD-Z;m2YgpC$9>Wd4G?v!%TdIfEGc*-$ VlDB7mWC^sA!PC{xWt~$(695~TJnR4f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_tank_alloy.png b/src/main/resources/assets/hbm/textures/blocks/cm_tank_alloy.png new file mode 100644 index 0000000000000000000000000000000000000000..189361a5c14b806be91926d72d204c53395f919f GIT binary patch literal 371 zcmV-(0gV2MP)15QV?}k^jI|K%EMoA!V8zAWa}ePL?t^38V?ckUJz` zV?nUMm9Q*nC&ef-PGpe$U|E>m_hxqIjghAtp)4T;m`=fadLhqA-23`k{0m>3AA+#0T4j>-|qKIL%26atUfo*#;6nRbvU@3~r1o-{L z5H5Ryb80lIs>=#z(R!rGYO$SOI!kWbEYcWhJ|~X*37mLjGQm0U>~zuO?veEx(o`od1m%k8eeZQ5>-sp2&grriegIXlgC0}= Rq7485002ovPDHLkV1l&Tm+b%m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_tank_desh.png b/src/main/resources/assets/hbm/textures/blocks/cm_tank_desh.png new file mode 100644 index 0000000000000000000000000000000000000000..97d667b6d97d965b8ed86bf6f09e20fd9a221021 GIT binary patch literal 373 zcmV-*0gC>KP)c}Hcn8I7 zBGE+#XL_b9i)s8x1ZR9u6jWC|s;XZpnau>}z4c7r;WB$CBF{?I z>ZTgiT6_q+Hz)>hfX4e%2QLkZ&jeA_V0#xROA0_!mUnY+B2DptCd(cpAS_Y5e{2L} zDxnoc!TnD^_biO>m_VkxEFW+ofNV;7TLyHU_Zye$Q|);CnKWr+y!QJmQ=~ zL}(`o#4!{FKF?7~p;|47V}90a44{_dv1~RQKJy$;b#)R<0ha0_OU~D5f@$Cvy(f2> T;d{$#00000NkvXXu0mjfGmDi9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_tank_steel.png b/src/main/resources/assets/hbm/textures/blocks/cm_tank_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d207b556d40799b3a33b249b5ce85139cae4e0 GIT binary patch literal 397 zcmV;80doF{P)Pq2Ame06q?~0FPGTeiuta2G zW~O@s*63+>1M?~zbyfdVjoa_{7Gp$Jsj7+)0#nfUJ*U%&Fbo67D91 za}E)qC<;`SoHGDT)392tSg+TF7$aTRalKyMq}D*&w(NF0I~)#(nf+7H{qONFEEbE` z#NKCj6KveE@7QI;hsC7#bG&N*hY8D&}0w(aW<+wIoQ=QEef1yyAX rmYLz4BZPp6kaK?jM(;h|dqjlaTO6-u`Brpn00000NkvXXu0mjfn8U1C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_tank_tcalloy.png b/src/main/resources/assets/hbm/textures/blocks/cm_tank_tcalloy.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5444a3a8ffda1ae6b7e3d0a576e2c9c07b86d8 GIT binary patch literal 397 zcmV;80doF{P)C8E6oo%s$#ERWRPg2@|K$DBOqmOv3#B{=cqrsY1Txu> z$;6R#?;BEw($~T186}-_k93aQ-;WQAF`}weRYeGaIT(h4{eDjv$C2%JOV@RX2qJ=+ zAtE^E5D|)^Kvl^(1JE=Lo6UyP=|qSz()T^DFE4J^=uf=0t+j27nAv}u{ZEVEuv)Ed zj=lGMJ>Q$zlXJ7&m>Cj6Kve;Fe}D`SV?Y@a<37MjK6vHr} zs>nEwzY>7YM^x2cUBP>QD_Tm48L{6nbz~YUQ+4N(rUpul~F7e(I z&gU~t)3AGfwz{slTrR{IF*B;FqAW{NN?fm3oO3J|3(B(Ocs$+&4u=C>*Rk8}P*tX4 rnHkPGLI{WmIp_Ot^xosWM@0As*fz1|4V`VA00000NkvXXu0mjfp~|gZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_terminal_front.png b/src/main/resources/assets/hbm/textures/blocks/cm_terminal_front.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf5d2338a74627ffc954a1e94195535a9da99d9 GIT binary patch literal 445 zcmV;u0Yd(XP)-CzVC;%|V zpsI*SYt~v+l@I~|I zv)PROeoqoxvex3g$9vEDe8xG)<#ItpFvbu(0*M~`>Dke(vESz%yjf@fb*EgTZLAb!J&ck|b^AcvxwgayT5C%bm~X nIvfsFL=?Dd#+bV?YpwnS)IiGe+yzjP00000NkvXXu0mjfnw!8> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/cm_terminal_side.png b/src/main/resources/assets/hbm/textures/blocks/cm_terminal_side.png new file mode 100644 index 0000000000000000000000000000000000000000..24a8807743422723572c62f274bc5d4f52bcc53e GIT binary patch literal 489 zcmVSZOw$BFjFH3P!0mR!*OF9~oHIFR zUauD+1jcd1IfsZ)N@oV~uK^(hRFzT+DJ7<9`XaLegb)ZJ0FY9`t7@yjdyjLjW&eDbb4FDgKvl(8 zX{KpI8nS%18Zpei#O}+b#S3p4DpgH9)i3tZ`9$S5>;M<9@%t2kLk{+Gevc=bQn5 fnuz@AQ&sx~Y(-;x4_qu500000NkvXXu0mjfrW@1~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_custom.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_custom.png new file mode 100644 index 0000000000000000000000000000000000000000..7b47cbfac8943eba2e9d5d918b9623931455096a GIT binary patch literal 3223 zcmbVOc|4Ts9)D&`mXgWH)?ql4C6ir6*+%GCA~ZC0&IuuEPL7!(A>K)4%@%4ROOf@+ znk$LYP*N@#%gKznBynOaS!X8qr8=F@J-7SEeg1jh=Y5{%`}=*rzvX>moE(4HxPHre z0Ki6D8!Hz85b!Gkhzi4xpQwe$;RovUUR$ClJiz%_5KmlUOURVF`0P! zS_o&XO4hYnNLca8(YE>dd*Z^8t_FzRW@g$COoyjQJ-xj?`t&frj(V=_$NLVut^yeB z?c%%Xc6u#rF^cOW#~+?vF|2VS;hwGXMnlli&GmZa%b}Jn%siB2kcwm9q-V|Lj}t5aRCdXb&{u65A4Q zyMV~+^sm*~IJ0!vLc1LhZ9rk_@=0K@>RC}=0~)F=7jB4ZvvS_daU`UJEh-?-<;i(4 z-hqfN-~;**M3GTS3hC%W=fKm*X`O>_Waqi(+4TH$cJ3@-d*#SHJ`eAXq<<< zjwmeMpI!TrlDa5ZIX_=dzZXwI%J`VAodAui>Vo|=+Zd}PX;Ct-n*~1 zR;_!{->5BcF^1La6SC3hK2__3$HONNubxc# z5t1ilh3?gkU5GAa*hc<|DB~xk%iYK2d(_DIrlpB-y1w&y$(Q%;muGxY!>$zz*-c$g zu2`zcuQ58(lhA6{m^!H_P1^zUqOb9)YYJp={2`C zzUY!#9Xa^>^bTJ%qzYYrZ3<}`&3@M+zNXkG-rt3;g`;@QFMI$0jK@i@x(bw&cO%8_Y?ywsbb|7l%MC24fRT&vRzKI ziLM+9W_?EL_oyu_{$I=mgS`yaus>0yb|vH?KZFS36Q$NbePxg>?q)rD^Eh93ewuptI8w^Yhgxx0xJSMW;%1j|^A$-S;*Rby$w|M*xZ60Mp z=SsH$v}6%PfqWXmd^IFE^l>-N5-t7gjZ<0@{AUN%9!gN$oK*q&?0khd0h^n(?5*Xv zg)Y@pdEzW<7+`(uK(6rh8lx!(V^%^(U(ZmUg|#wD);jr2J*zk)*_M4`VJ%yw@yL;> zkwaUV+}4TmGl`bb;W0O}vf6I{kVw?Kwc08b^Grzzv4q`+_h9V>7`R^+4|0R*sbOIX zg*!=il8h0EZXs)?bMbVr$!tx~9iVs|YgFQLu`Y-8{_iOHy9YotwX z>1+KAZR|UE%|u>zv4nvo*cIFzObv;>)%tOPQ!fP7B+A2zB9rHCqH4PXbQ(I3e~CRV6%9 zTA|g>7%uLV5i@{C_QzDMm!?tSs)Bo5kAJPkTW2XEs_j|VbZV#0fXF}h4~PJx7Byv; zqGdB+rbiOTfSHqXJi&>(y`>7zm=7?sifSJu8<9F4~RK(^;ur~ z2#7RS#t`gOXjU6Ue8Lty!UDg4n6inhUb<`+JGu+uBq{2F1_3W7#GzOMFo3${_YiEH9S%<-rLy0 zjDAiD_rxbemnqwvnK+qr3og*6>@<7G{NqG+vFswh*4#i|1Y|%ESp_udl_5(5B1S!# z4&}I6-;YvQtiHpnVBO;N01p)iwQv^O#%3R7zGw;+gh$|2XgMUL<|9sR0sPb6@jf@t z)k`=DgT7zL4mL@jn+rVWej%Pt0PVoVW9oL14eaTvg?T{bSjaKrZrS`k5yX7qXM!O( zI&XGmUEKG2V8EN3k5U1I_pUR!xJ^zNIAU$3qE<+V44c0HFdGgwCf zw_9;IxKqW^fBpF3)y?%chz}wJ=gnVr%ti+sl;a~*)xcuVjt~tTF7grKBCXd(6Y*EC zWMX?){O;|PJQ4WoUK)XKn)*L?H$)hTXG`oiY$)o*ol zGuwTd+KwQ+o6}+lLkXFV1@RHxmL*Kg_hKjte2prkclxP3j^7!b-mVJTer~=m5L8{z z9>^~=ob^-|Hs@@}7DjzjA=KXmB-;)S^mm$L!^mWN2{by!GIN09&$^$V5XrzuK~MY5 zp_a+XG6gIa6J=C4Jf*=LDo1@g1pmdrYBGF|kY)w8si!CX{p4h^`$eNCGzTq7x?{mX z$vS>;03IpXx;JwvmcZlja5#NAajTc?=BF{SgeQ7RQLzMuCtNM@{~P{W%d5~~3Y%e+ z&scEMQQBK`aZZ#zq5qdl{2H1F!?siuMY6Ka2_PZAW@StUL|mtqaLH)al_n|SN{jI_ zlgN0*@D%&I{(q6@TmG-A_X#7`($%9I#%unHl;buuX8xEYmF!l+ypgbP>mJzvwJb!n wKl{Pq6PA!>9}xF?C{&PEjeMH$NU3QB;eb6B^e={Q literal 0 HcmV?d00001