From db288d06c7d69d73d8c8bd0ad522c675be36f95e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 3 Sep 2023 18:29:47 +0200 Subject: [PATCH] conveyor press, fixes --- changelog | 21 +- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../blocks/machine/MachineConveyorPress.java | 173 +++ .../java/com/hbm/crafting/WeaponRecipes.java | 2 +- .../projectile/EntityArtilleryShell.java | 1 + .../inventory/recipes/AssemblerRecipes.java | 3 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 2 + .../com/hbm/main/ModEventHandlerClient.java | 13 +- .../com/hbm/main/ModEventHandlerRenderer.java | 4 +- .../java/com/hbm/main/ResourceManager.java | 3 + .../hbm/render/entity/effect/RenderTorex.java | 2 +- .../tileentity/RenderConveyorPress.java | 80 ++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityConveyorPress.java | 269 +++++ .../machine/TileEntityCoreEmitter.java | 5 - .../machine/rbmk/TileEntityRBMKRod.java | 2 + .../storage/TileEntityMachineFENSU.java | 92 +- .../java/com/hbm/world/feature/BiomeCave.java | 7 +- .../java/com/hbm/world/feature/DeepLayer.java | 8 +- .../java/com/hbm/world/feature/OreCave.java | 7 +- .../java/com/hbm/world/feature/OreLayer.java | 7 +- .../com/hbm/world/feature/OreLayer3D.java | 8 +- .../com/hbm/world/feature/SchistStratum.java | 7 +- .../hbm/world/generator/DungeonToolbox.java | 8 + src/main/resources/assets/hbm/lang/de_DE.lang | 4 +- src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../hbm/models/machines/conveyor_press.obj | 1042 +++++++++++++++++ .../hbm/textures/armor/trenchmaster_arm.png | Bin 0 -> 546 bytes .../textures/armor/trenchmaster_helmet.png | Bin 0 -> 1378 bytes .../models/machines/conveyor_press.png | Bin 0 -> 1767 bytes .../models/machines/conveyor_press_belt.png | Bin 0 -> 1482 bytes 32 files changed, 1699 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderConveyorPress.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java create mode 100644 src/main/resources/assets/hbm/models/machines/conveyor_press.obj create mode 100644 src/main/resources/assets/hbm/textures/armor/trenchmaster_arm.png create mode 100644 src/main/resources/assets/hbm/textures/armor/trenchmaster_helmet.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/conveyor_press.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/conveyor_press_belt.png diff --git a/changelog b/changelog index e6f256dbe..a7baa47be 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,11 @@ +## Added +* Conveyor press + * An upgraded version of the electric press that can be integrated directly into conveyor belts + * Each pressing operation will process however many items happen to be at the belt at the time, so given enough conveyor infrastructure it can be much faster than a normal electric press + * Has no GUI, stamps are installed either by hand or via automation + * Stamps can be removed with a screwdriver + * Can only stamp single items to avoid issues with stack limits, so it's best to use ejection speed instead of stack ejection upgrades for the conveyor ejectors + ## Changed * Chlorophyte rounds now deal 2x more damage than their standard counterparts instead of 1.5x * Chlorophyte rounds now penetrate multiple enemies @@ -10,7 +18,18 @@ * 5mm assemblies now yield 64 instead of 32 bullets * The production complexity and time for making thermoelectric elements in the assembler has been reduced * Thermoelectric elements can now also be made in a tier 2 anvil +* Changed electric press recipe, crafting complexity has been reduced and the press now uses hydraulic pistons +* Removed DFC emitter beam cap again since the core already imposes a natural limit due to fuel consumption + * I don't know why anyone would need a DFC that strong anyway, but now you can have them again ## Fixed * Fixed logspam when pollution handler tries to save the pollution data for dimensions that have never been loaded before -* Fixed dead leaves layer not being replacable by other blocks \ No newline at end of file +* Fixed dead leaves layer not being replacable by other blocks +* Fixed rock layers like schist, hematite and sulfur caves not spawning at all +* Fixed rock layers replacing end portal frames or bedrock +* Fixed FEnSU instantly voiding all energy when sending +* Fixed some conflict causing the nuke flash to be applied permanently +* Fixed flux level not resetting when rods are above melting point with meltdowns disabled +* Fixed crash caused by express delivery shells +* Fixed 4 gauge solid steel slugs not being made from steel +* Fixed missing lang entry for fluorite ore \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index dd5bf106a..8adb34c14 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1050,6 +1050,7 @@ public class ModBlocks { public static Block press_preheater; public static Block machine_press; public static Block machine_epress; + public static Block machine_conveyor_press; public static Block machine_siren; @@ -2265,6 +2266,7 @@ public class ModBlocks { press_preheater = new BlockBase(Material.iron).setBlockName("press_preheater").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":press_preheater"); machine_press = new MachinePress(Material.iron).setBlockName("machine_press").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_press"); machine_epress = new MachineEPress(Material.iron).setBlockName("machine_epress").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_epress"); + machine_conveyor_press = new MachineConveyorPress(Material.iron).setBlockName("machine_conveyor_press").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_selenium = new MachineSeleniumEngine(Material.iron).setBlockName("machine_selenium").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_selenium"); reactor_research = new ReactorResearch(Material.iron).setBlockName("machine_reactor_small").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_reactor_small"); reactor_zirnox = new ReactorZirnox(Material.iron).setBlockName("machine_zirnox").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3084,6 +3086,7 @@ public class ModBlocks { GameRegistry.registerBlock(press_preheater, press_preheater.getUnlocalizedName()); GameRegistry.registerBlock(machine_press, machine_press.getUnlocalizedName()); GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); + register(machine_conveyor_press); register(heater_firebox); register(heater_oven); register(machine_ashpit); diff --git a/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java b/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java new file mode 100644 index 000000000..1bddf1a9d --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineConveyorPress.java @@ -0,0 +1,173 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.items.machine.ItemStamp; +import com.hbm.tileentity.machine.TileEntityConveyorPress; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; + +import api.hbm.block.IToolable; +import api.hbm.conveyor.IConveyorBelt; +import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineConveyorPress extends BlockDummyable implements IConveyorBelt, ILookOverlay, IToolable, ITooltipProvider { + + public MachineConveyorPress(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityConveyorPress(); + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @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 { + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityConveyorPress)) + return false; + + TileEntityConveyorPress press = (TileEntityConveyorPress) te; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemStamp && press.slots[0] == null) { + press.slots[0] = player.getHeldItem().copy(); + press.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + press.markChanged(); + world.markBlockForUpdate(x, y, z); + return true; + } + } + + return false; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) return false; + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityConveyorPress)) + return false; + + TileEntityConveyorPress press = (TileEntityConveyorPress) te; + + if(press.slots[0] == null) return false; + + if(!player.inventory.addItemStackToInventory(press.slots[0].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, press.slots[0].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + + press.slots[0] = null; + press.markChanged(); + + return true; + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; + } + + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { + int meta = world.getBlockMetadata(x, y - 1, z) - offset; + return ForgeDirection.getOrientation(meta).getRotation(ForgeDirection.UP); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + double posX = x + 0.5; + double posZ = z + 0.5; + if(dir.offsetX != 0) posX = itemPos.xCoord; + if(dir.offsetZ != 0) posZ = itemPos.zCoord; + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + + @Override + public boolean canItemStay(World world, int x, int y, int z, Vec3 itemPos) { + return world.getBlock(x, y - 1, z) == this && world.getBlockMetadata(x, y - 1, z) >= 12; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!(te instanceof TileEntityConveyorPress)) + return; + + TileEntityConveyorPress press = (TileEntityConveyorPress) te; + List text = new ArrayList(); + + text.add(BobMathUtil.getShortNumber(press.power) + "HE / " + BobMathUtil.getShortNumber(press.maxPower) + "HE"); + text.add("Installed stamp: " + ((press.syncStack == null || press.syncStack.getItem() == null) ? (EnumChatFormatting.RED + "NONE") : press.syncStack.getDisplayName())); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 0b55c4ab6..c81f7b911 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -196,7 +196,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_12gauge, 12), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot, 'L', ModItems.plate_polymer }); CraftingManager.addRecipeAuto(ModItems.ammo_12gauge.stackFromEnum(12, Ammo12Gauge.PERCUSSION), new Object[] { "G", "C", 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_4gauge, 12), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.SLUG), new Object[] { " I ", "GCL", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.SLUG), new Object[] { " I ", "GCL", 'I', STEEL.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.FLECHETTE), new Object[] { " I ", "GCL", 'I', ModItems.pellet_flechette, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(4, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", 'I', ModBlocks.tnt, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(6, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", 'I', ANY_PLASTICEXPLOSIVE.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java index a64891b70..b03d3118f 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java @@ -56,6 +56,7 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa @Override protected void entityInit() { + super.entityInit(); init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); this.dataWatcher.addObject(10, new Integer(0)); } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 0b2af8d85..50db8cf5a 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -13,6 +13,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ItemAmmoEnums; +import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemDrillbit.EnumDrillType; @@ -281,7 +282,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.machine_flare, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 12), new OreDictStack(IRON.ingot(), 12), new OreDictStack(CU.plate528(), 4), new ComparableStack(ModItems.tank_steel, 1), new ComparableStack(ModBlocks.deco_pipe_quad, 8), new ComparableStack(ModItems.hull_small_steel, 4), new ComparableStack(ModItems.thermo_element, 3), },200); makeRecipe(new ComparableStack(ModBlocks.machine_coker, 1), new AStack[] {new OreDictStack(STEEL.plate(), 24), new OreDictStack(IRON.ingot(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.tank_steel, 2), new ComparableStack(ModBlocks.steel_grate, 4) },200); makeRecipe(new ComparableStack(ModBlocks.machine_refinery, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.plate(), 16), new ComparableStack(ModItems.hull_big_steel, 6), new ComparableStack(ModItems.pipes_steel, 2), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit_red_copper, 1) },350); - makeRecipe(new ComparableStack(ModBlocks.machine_epress, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.bolt_tungsten, 4), new ComparableStack(ModItems.coil_copper, 2), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit_copper, 1), new OreDictStack(Fluids.LUBRICANT.getDict(1000)), },160); + makeRecipe(new ComparableStack(ModBlocks.machine_epress, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit_copper, 1) }, 100); makeRecipe(new ComparableStack(ModBlocks.machine_chemplant, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.plate528(), 6), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.hull_big_steel, 1), new ComparableStack(ModItems.coil_tungsten, 3), new ComparableStack(ModItems.circuit_copper, 2), new ComparableStack(ModItems.circuit_red_copper, 1), new ComparableStack(ModItems.plate_polymer, 8), },200); makeRecipe(new ComparableStack(ModBlocks.machine_crystallizer, 1), new AStack[] {new ComparableStack(ModItems.hull_big_steel, 4), new ComparableStack(ModItems.pipes_steel, 1), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.blades_advanced_alloy, 2), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(TI.plate(), 16), new ComparableStack(Blocks.glass, 4), new ComparableStack(ModItems.circuit_gold, 1), },400); makeRecipe(new ComparableStack(ModBlocks.machine_fluidtank, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(STEEL.plate528(), 6), new ComparableStack(ModItems.hull_big_steel, 4), new OreDictStack(ANY_TAR.any(), 4), },150); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 49b3aae01..97bcdb621 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -287,6 +287,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCoker.class, new RenderCoker()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFan.class, new RenderFan()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPistonInserter.class, new RenderPistonInserter()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityConveyorPress.class, new RenderConveyorPress()); //Foundry ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 7c0d6c047..338981eaa 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -984,6 +984,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.crane_unboxer), new Object[] { "WWW", "WPW", "CCC", 'W', KEY_STICK, 'P', Items.shears, 'C', ModBlocks.conveyor }); addRecipeAuto(new ItemStack(ModBlocks.crane_router), new Object[] { "PIP", "ICI", "PIP", 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'I', ModItems.plate_polymer, 'C', ModItems.circuit_copper }); addRecipeAuto(new ItemStack(ModBlocks.crane_splitter), new Object[] { "III", "PCP", "III", 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'I', STEEL.ingot(), 'C', ModItems.circuit_aluminium }); + + addRecipeAuto(new ItemStack(ModBlocks.machine_conveyor_press), new Object[] { "CPC", "CBC", "CCC", 'C', CU.plate(), 'P', ModBlocks.machine_epress, 'B', ModBlocks.conveyor }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1), new Object[] { ModItems.ingot_chainsteel, ASBESTOS.ingot(), ModItems.gem_alexandrite }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2) }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 8390aa880..bd54cf242 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -12,10 +12,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; -import com.hbm.blocks.rail.IRailNTM; -import com.hbm.blocks.rail.IRailNTM.MoveContext; -import com.hbm.blocks.rail.IRailNTM.RailCheckType; -import com.hbm.blocks.rail.IRailNTM.RailContext; import com.hbm.config.GeneralConfig; import com.hbm.entity.mob.EntityHunterChopper; import com.hbm.entity.projectile.EntityChopperMine; @@ -144,7 +140,8 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent; public class ModEventHandlerClient { - public static int flashTimer; + public static final int flashDuration = 5_000; + public static long flashTimestamp; @SubscribeEvent public void onOverlayRender(RenderGameOverlayEvent.Pre event) { @@ -152,7 +149,7 @@ public class ModEventHandlerClient { EntityPlayer player = Minecraft.getMinecraft().thePlayer; /// NUKE FLASH /// - if(event.type == ElementType.CROSSHAIRS && flashTimer > 0) { + if(event.type == ElementType.CROSSHAIRS && (flashTimestamp + flashDuration - System.currentTimeMillis()) > 0) { int width = event.resolution.getScaledWidth(); int height = event.resolution.getScaledHeight(); Tessellator tess = Tessellator.instance; @@ -162,7 +159,7 @@ public class ModEventHandlerClient { GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.0F); GL11.glDepthMask(false); tess.startDrawingQuads(); - float brightness = (flashTimer - event.partialTicks) / 200F; + float brightness = (flashTimestamp + flashDuration - System.currentTimeMillis()) / (float) flashDuration; tess.setColorRGBA_F(1F, 1F, 1F, brightness * 0.8F); tess.addVertex(width, 0, 0); tess.addVertex(0, 0, 0); @@ -1262,8 +1259,6 @@ public class ModEventHandlerClient { client.sendQueue.addToSendQueue(new C0CPacketInput(client.moveStrafing, client.moveForward, client.movementInput.jump, client.movementInput.sneak)); } } - - if(event.phase == Phase.START) if(flashTimer > 0) flashTimer--; } @SubscribeEvent diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index eee0c1d97..50156b735 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -383,8 +383,8 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onRenderHUD(RenderGameOverlayEvent.Pre event) { - if(event.type == ElementType.HOTBAR && ModEventHandlerClient.flashTimer > 0) { - double mult = (ModEventHandlerClient.flashTimer + event.partialTicks) * 0.01D; + if(event.type == ElementType.HOTBAR && (ModEventHandlerClient.flashTimestamp + ModEventHandlerClient.flashDuration - System.currentTimeMillis()) > 0) { + double mult = (ModEventHandlerClient.flashTimestamp + ModEventHandlerClient.flashDuration - System.currentTimeMillis()) / (double) ModEventHandlerClient.flashDuration * 2; double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 5; double vertical = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.01 + 2), -0.7, 0.7) * 1; GL11.glTranslated(horizontal * mult, vertical * mult, 0); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index be61c02bd..4ad9341a7 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -122,6 +122,7 @@ public class ResourceManager { public static final IModelCustom press_head = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/press_head.obj")); public static final IModelCustom epress_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/epress_body.obj")); public static final IModelCustom epress_head = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/epress_head.obj")); + public static final IModelCustom conveyor_press = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/conveyor_press.obj")); //Assembler public static final IModelCustom assembler_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_body.obj")); @@ -479,6 +480,8 @@ public class ResourceManager { public static final ResourceLocation press_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/press_head.png"); public static final ResourceLocation epress_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/epress_body.png"); public static final ResourceLocation epress_head_tex = new ResourceLocation(RefStrings.MODID, "textures/models/epress_head.png"); + public static final ResourceLocation conveyor_press_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/conveyor_press.png"); + public static final ResourceLocation conveyor_press_belt_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/conveyor_press_belt.png"); //Assembler public static final ResourceLocation assembler_body_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_base_new.png"); diff --git a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java index e54f175a0..e90761d3e 100644 --- a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java +++ b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java @@ -37,7 +37,7 @@ public class RenderTorex extends Render { EntityNukeTorex cloud = (EntityNukeTorex)entity; cloudletWrapper(cloud, interp); if(cloud.ticksExisted < 101) flashWrapper(cloud, interp); - if(cloud.ticksExisted < 10 && ModEventHandlerClient.flashTimer < 100) ModEventHandlerClient.flashTimer = 200; + if(cloud.ticksExisted < 10 && System.currentTimeMillis() - ModEventHandlerClient.flashTimestamp > 1_000) ModEventHandlerClient.flashTimestamp = System.currentTimeMillis(); if(fog) GL11.glEnable(GL11.GL_FOG); GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderConveyorPress.java b/src/main/java/com/hbm/render/tileentity/RenderConveyorPress.java new file mode 100644 index 000000000..1bfb50fae --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderConveyorPress.java @@ -0,0 +1,80 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityConveyorPress; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderConveyorPress extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + } + + TileEntityConveyorPress press = (TileEntityConveyorPress) tile; + + bindTexture(ResourceManager.conveyor_press_tex); + ResourceManager.conveyor_press.renderPart("Press"); + + if(press.syncStack != null) { + GL11.glPushMatrix(); + double piston = press.lastPress + (press.renderPress - press.lastPress) * interp; + GL11.glTranslated(0, -piston * 0.75, 0); + ResourceManager.conveyor_press.renderPart("Piston"); + GL11.glPopMatrix(); + } + + bindTexture(ResourceManager.conveyor_press_belt_tex); + + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + int ticks = (int)(tile.getWorldObj().getTotalWorldTime() % 16) - 2; + GL11.glTranslated(0, ticks / 16D, 0); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + ResourceManager.conveyor_press.renderPart("Belt"); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_conveyor_press); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -4, 0); + GL11.glScaled(4.5, 4.5, 4.5); + } + public void renderCommon() { + bindTexture(ResourceManager.conveyor_press_tex); + ResourceManager.conveyor_press.renderPart("Press"); + ResourceManager.conveyor_press.renderPart("Piston"); + bindTexture(ResourceManager.conveyor_press_belt_tex); + ResourceManager.conveyor_press.renderPart("Belt"); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index fd8d60aca..ebd4e6c46 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -140,6 +140,7 @@ public class TileMappings { put(TileEntityDecon.class, "tileentity_decon"); put(TileEntityMachineSatDock.class, "tileentity_miner_dock"); put(TileEntityMachineEPress.class, "tileentity_electric_press"); + put(TileEntityConveyorPress.class, "tileentity_conveyor_press"); put(TileEntityCoreEmitter.class, "tileentity_v0_emitter"); put(TileEntityCoreReceiver.class, "tileentity_v0_receiver"); put(TileEntityCoreInjector.class, "tileentity_v0_injector"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java new file mode 100644 index 000000000..c4f7eaf9f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -0,0 +1,269 @@ +package com.hbm.tileentity.machine; + +import java.util.List; + +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.inventory.recipes.PressRecipes; +import com.hbm.items.machine.ItemStamp; +import com.hbm.lib.Library; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energy.IEnergyUser; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityConveyorPress extends TileEntityMachineBase implements IEnergyUser { + + public int usage = 100; + public long power = 0; + public final static long maxPower = 50000; + + public double speed = 0.125; + public double press; + public double renderPress; + public double lastPress; + private double syncPress; + private int turnProgress; + protected boolean isRetracting = false; + private int delay; + + public ItemStack syncStack; + + public TileEntityConveyorPress() { + super(1); + } + + @Override + public String getName() { + return ""; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + this.updateConnections(); + + if(delay <= 0) { + + if(isRetracting) { + + if(this.canRetract()) { + this.press -= speed; + this.power -= this.usage; + + if(press <= 0) { + press = 0; + this.isRetracting = false; + delay = 0; + } + } + + } else { + + if(this.canExtend()) { + this.press += speed; + this.power -= this.usage; + + if(press >= 1) { + press = 1; + this.isRetracting = true; + delay = 5; + this.process(); + } + } + } + + } else { + delay--; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + data.setDouble("press", press); + if(slots[0] != null) { + NBTTagCompound stack = new NBTTagCompound(); + slots[0].writeToNBT(stack); + data.setTag("stack", stack); + } + + this.networkPack(data, 50); + } else { + + // approach-based interpolation, GO! + this.lastPress = this.renderPress; + + if(this.turnProgress > 0) { + this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.renderPress = this.syncPress; + } + } + } + + protected void updateConnections() { + for(DirPos pos : getConPos()) this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + + protected DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), + new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X), + new DirPos(xCoord, yCoord, zCoord + 1, Library.POS_Z), + new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z), + }; + } + + public boolean canExtend() { + + if(this.power < usage) return false; + if(slots[0] == null) return false; + + List items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1)); + if(items.isEmpty()) return false; + + for(EntityMovingItem item : items) { + ItemStack stack = item.getItemStack(); + if(PressRecipes.getOutput(stack, slots[0]) != null && stack.stackSize == 1) { + + double d0 = 0.35; + double d1 = 0.65; + if(item.posX > xCoord + d0 && item.posX < xCoord + d1 && item.posZ > zCoord + d0 && item.posZ < zCoord + d1) { + item.setPosition(xCoord + 0.5, item.posY, zCoord + 0.5); + } + + return true; + } + } + + return false; + } + + public void process() { + + List items = worldObj.getEntitiesWithinAABB(EntityMovingItem.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 1.5, zCoord + 1)); + + for(EntityMovingItem item : items) { + ItemStack stack = item.getItemStack(); + ItemStack output = PressRecipes.getOutput(stack, slots[0]); + + if(output != null && stack.stackSize == 1) { + item.setDead(); + EntityMovingItem out = new EntityMovingItem(worldObj); + out.setPosition(item.posX, item.posY, item.posZ); + out.setItemStack(output.copy()); + worldObj.spawnEntityInWorld(out); + } + } + + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", 1.5F, 1.0F); + + if(slots[0].getMaxDamage() != 0) { + slots[0].setItemDamage(slots[0].getItemDamage() + 1); + if(slots[0].getItemDamage() >= slots[0].getMaxDamage()) { + slots[0] = null; + } + } + } + + public boolean canRetract() { + if(this.power < usage) return false; + return true; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.power = nbt.getLong("power"); + this.syncPress = nbt.getInteger("press"); + + if(nbt.hasKey("stack")) { + NBTTagCompound stack = nbt.getCompoundTag("stack"); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + } else { + this.syncStack = null; + } + + this.turnProgress = 2; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return stack.getItem() instanceof ItemStamp; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 0 }; + } + + @Override + public boolean canInsertItem(int i, ItemStack itemStack, int j) { + return this.isItemValidForSlot(i, itemStack); + } + + @Override + public long getPower() { + return power; + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return dir != ForgeDirection.DOWN; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.power = nbt.getLong("power"); + this.press = nbt.getDouble("press"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("power", power); + nbt.setDouble("press", press); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 3, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index d40fff7d8..f19f9e586 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -43,7 +43,6 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne public boolean isOn; public FluidTank tank; public long prev; - public static long maxJoules = Long.MAX_VALUE / 100_000; public static final int range = 50; @@ -99,8 +98,6 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); for(int i = 1; i <= range; i++) { - if(out > maxJoules) out = maxJoules; - beam = i; int x = xCoord + dir.offsetX * i; @@ -111,13 +108,11 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne TileEntity te = worldObj.getTileEntity(x, y, z); if(block instanceof ILaserable) { - ((ILaserable)block).addEnergy(worldObj, x, y, z, out * 98 / 100, dir); break; } if(te instanceof ILaserable) { - ((ILaserable)te).addEnergy(worldObj, x, y, z, out * 98 / 100, dir); break; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 1b1f607d4..2a432b5d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -91,6 +91,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM } else { this.meltdown(); } + this.fluxFast = 0; + this.fluxSlow = 0; return; } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index eea2287d6..188b919e6 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -1,9 +1,16 @@ package com.hbm.tileentity.machine.storage; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import com.hbm.lib.Library; import api.hbm.energy.IEnergyConductor; import api.hbm.energy.IEnergyConnector; +import api.hbm.energy.IPowerNet; +import api.hbm.energy.PowerNet; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; @@ -28,7 +35,7 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); ////////////////////////////////////////////////////////////////////// - this.transmitPowerFairly(); + this.transmitPower(); ////////////////////////////////////////////////////////////////////// byte comp = this.getComparatorPower(); @@ -71,54 +78,61 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { short mode = (short) this.getRelevantMode(); - ForgeDirection dir = ForgeDirection.DOWN; + //HasSets to we don'T have any duplicates + Set nets = new HashSet(); + Set consumers = new HashSet(); + + //iterate over all sides + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) - con.getPowerNet().unsubscribe(this); - } - - if(mode == 1 || mode == 2) { - if(te instanceof IEnergyConnector) { + TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + + //if it's a cable, buffer both the network and all subscribers of the net + if(te instanceof IEnergyConductor) { + IEnergyConductor con = (IEnergyConductor) te; + if(con.canConnect(dir.getOpposite()) && con.getPowerNet() != null) { + nets.add(con.getPowerNet()); + con.getPowerNet().unsubscribe(this); + consumers.addAll(con.getPowerNet().getSubscribers()); + } + + //if it's just a consumer, buffer it as a subscriber + } else if(te instanceof IEnergyConnector) { IEnergyConnector con = (IEnergyConnector) te; - - long max = maxTransfer; - long toTransfer = Math.min(max, this.power); - long remainder = this.power - toTransfer; - this.power = toTransfer; - - long oldPower = this.power; - long transfer = this.power - con.transferPower(this.power); - this.power = oldPower - transfer; - - power += remainder; - } - } - - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null) { - if(mode == 2 || mode == 3) { - if(con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().unsubscribe(this); - } - } else if(!con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().subscribe(this); + if(con.canConnect(dir.getOpposite())) { + consumers.add((IEnergyConnector) te); } } } + + //send power to buffered consumers, independent of nets + if(this.power > 0 && (mode == mode_buffer || mode == mode_output)) { + List con = new ArrayList(); + con.addAll(consumers); + + if(PowerNet.trackingInstances == null) { + PowerNet.trackingInstances = new ArrayList(); + } + PowerNet.trackingInstances.clear(); + + nets.forEach(x -> { + if(x instanceof PowerNet) PowerNet.trackingInstances.add((PowerNet) x); + }); + + long toSend = Math.min(this.power, maxTransfer); + long powerRemaining = this.power - toSend; + this.power = PowerNet.fairTransfer(con, toSend) + powerRemaining; + } + + //resubscribe to buffered nets, if necessary + if(mode == mode_buffer || mode == mode_input) { + nets.forEach(x -> x.subscribe(this)); + } } @Override public long getPowerRemainingScaled(long i) { - double powerScaled = (double)power / (double)getMaxPower(); - return (long)(i * powerScaled); } diff --git a/src/main/java/com/hbm/world/feature/BiomeCave.java b/src/main/java/com/hbm/world/feature/BiomeCave.java index f1beb0d10..1dc57bd73 100644 --- a/src/main/java/com/hbm/world/feature/BiomeCave.java +++ b/src/main/java/com/hbm/world/feature/BiomeCave.java @@ -3,6 +3,7 @@ package com.hbm.world.feature; import java.util.Random; import com.hbm.blocks.BlockEnums.EnumBiomeType; +import com.hbm.world.generator.DungeonToolbox; import com.hbm.blocks.ModBlocks; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -13,7 +14,7 @@ import net.minecraft.world.biome.BiomeGenBase.TempCategory; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class BiomeCave { @@ -52,7 +53,7 @@ public class BiomeCave { } @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { World world = event.world; @@ -95,7 +96,7 @@ public class BiomeCave { private static void handleBiome(World world, int x, int y, int z, EnumBiomeType type) { Block target = world.getBlock(x, y, z); - if(target.isNormalCube()) { + if(target.isNormalCube() && DungeonToolbox.allowedToReplace(target)) { boolean shouldGen = false; diff --git a/src/main/java/com/hbm/world/feature/DeepLayer.java b/src/main/java/com/hbm/world/feature/DeepLayer.java index 685fdb7eb..69216034d 100644 --- a/src/main/java/com/hbm/world/feature/DeepLayer.java +++ b/src/main/java/com/hbm/world/feature/DeepLayer.java @@ -3,22 +3,22 @@ package com.hbm.world.feature; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.world.generator.DungeonToolbox; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class DeepLayer { NoiseGeneratorPerlin noise; @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { World world = event.world; if(world.provider == null || world.provider.dimensionId != 0) return; @@ -51,7 +51,7 @@ public class DeepLayer { Block target = world.getBlock(x, y, z); - if(target.isNormalCube() && target.getMaterial() == Material.rock && target != Blocks.bedrock) { + if(target.isNormalCube() && target.getMaterial() == Material.rock && DungeonToolbox.allowedToReplace(target)) { boolean lava = false; diff --git a/src/main/java/com/hbm/world/feature/OreCave.java b/src/main/java/com/hbm/world/feature/OreCave.java index 49ae81a9b..7f879866b 100644 --- a/src/main/java/com/hbm/world/feature/OreCave.java +++ b/src/main/java/com/hbm/world/feature/OreCave.java @@ -5,6 +5,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockStalagmite; import com.hbm.inventory.RecipesCommon.MetaBlock; +import com.hbm.world.generator.DungeonToolbox; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; @@ -13,7 +14,7 @@ import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class OreCave { @@ -71,7 +72,7 @@ public class OreCave { @SuppressWarnings("incomplete-switch") @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { World world = event.world; @@ -103,7 +104,7 @@ public class OreCave { for(int y = yLevel - range; y <= yLevel + range; y++) { Block genTarget = world.getBlock(x, y, z); - if(genTarget.isNormalCube() && (genTarget.getMaterial() == Material.rock || genTarget.getMaterial() == Material.ground)) { + if(genTarget.isNormalCube() && (genTarget.getMaterial() == Material.rock || genTarget.getMaterial() == Material.ground) && DungeonToolbox.allowedToReplace(genTarget)) { boolean shouldGen = false; boolean canGenFluid = event.rand.nextBoolean(); diff --git a/src/main/java/com/hbm/world/feature/OreLayer.java b/src/main/java/com/hbm/world/feature/OreLayer.java index 8e658cb65..aacf1c416 100644 --- a/src/main/java/com/hbm/world/feature/OreLayer.java +++ b/src/main/java/com/hbm/world/feature/OreLayer.java @@ -3,6 +3,7 @@ package com.hbm.world.feature; import java.util.Random; import com.hbm.inventory.RecipesCommon.MetaBlock; +import com.hbm.world.generator.DungeonToolbox; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; @@ -10,7 +11,7 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class OreLayer { @@ -65,7 +66,7 @@ public class OreLayer { } @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { World world = event.world; @@ -99,7 +100,7 @@ public class OreLayer { if(event.rand.nextFloat() < density) { Block genTarget = world.getBlock(x, y, z); - if(genTarget.isReplaceableOreGen(world, x, y, z, target)) { + if(genTarget.isReplaceableOreGen(world, x, y, z, target) && DungeonToolbox.allowedToReplace(genTarget)) { world.setBlock(x, y, z, ore.block, ore.meta, 2); } } diff --git a/src/main/java/com/hbm/world/feature/OreLayer3D.java b/src/main/java/com/hbm/world/feature/OreLayer3D.java index 08650db8e..50fba58b3 100644 --- a/src/main/java/com/hbm/world/feature/OreLayer3D.java +++ b/src/main/java/com/hbm/world/feature/OreLayer3D.java @@ -2,13 +2,15 @@ package com.hbm.world.feature; import java.util.Random; +import com.hbm.world.generator.DungeonToolbox; + import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class OreLayer3D { @@ -51,7 +53,7 @@ public class OreLayer3D { } @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { World world = event.world; @@ -74,7 +76,7 @@ public class OreLayer3D { if(nX * nY * nZ > threshold) { Block target = world.getBlock(x, y, z); - if(target.isNormalCube() && target.getMaterial() == Material.rock) { + if(target.isNormalCube() && target.getMaterial() == Material.rock && DungeonToolbox.allowedToReplace(target)) { world.setBlock(x, y, z, block, meta, 2); } } diff --git a/src/main/java/com/hbm/world/feature/SchistStratum.java b/src/main/java/com/hbm/world/feature/SchistStratum.java index 28d5d6fe2..d83ec528e 100644 --- a/src/main/java/com/hbm/world/feature/SchistStratum.java +++ b/src/main/java/com/hbm/world/feature/SchistStratum.java @@ -3,20 +3,21 @@ package com.hbm.world.feature; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.world.generator.DungeonToolbox; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; -import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; public class SchistStratum { NoiseGeneratorPerlin noise; @SubscribeEvent - public void onDecorate(PopulateChunkEvent.Pre event) { + public void onDecorate(DecorateBiomeEvent.Pre event) { if(this.noise == null) { this.noise = new NoiseGeneratorPerlin(new Random(event.world.getSeed()), 4); @@ -51,7 +52,7 @@ public class SchistStratum { Block target = world.getBlock(x, y, z); - if(target.isNormalCube() && target.getMaterial() == Material.rock) { + if(target.isNormalCube() && target.getMaterial() == Material.rock && DungeonToolbox.allowedToReplace(target)) { world.setBlock(x, y, z, ModBlocks.stone_gneiss, 0, 2); } } diff --git a/src/main/java/com/hbm/world/generator/DungeonToolbox.java b/src/main/java/com/hbm/world/generator/DungeonToolbox.java index 7e0a899f9..b5ab4499c 100644 --- a/src/main/java/com/hbm/world/generator/DungeonToolbox.java +++ b/src/main/java/com/hbm/world/generator/DungeonToolbox.java @@ -94,4 +94,12 @@ public class DungeonToolbox { genFlowers.func_150550_a(flower, meta); genFlowers.generate(world, rand, x, y, z); } + + public static boolean allowedToReplace(Block block) { + + if(block == Blocks.end_portal_frame) return false; + if(block == Blocks.bedrock) return false; + + return true; + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2e712ef87..17f3b4acd 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2523,7 +2523,6 @@ item.oil_detector.bullseye=Ölvorkommen direkt untertage! item.oil_detector.detected=Ölvorkommen in der Nähe! item.oil_detector.noOil=Kein Öl gefunden. item.oil_tar.coal.name=Kohleteer -item.oil_tar.name=Ölteer item.oil_tar.crude.name=Erdölteer item.oil_tar.crack.name=Crackölteer item.oil_tar.paraffin.name=Paraffinwachs @@ -2533,6 +2532,7 @@ item.ore.asbestos=Asbest item.ore.borax=Borax item.ore.chlorocalcite=Chlorokalzit item.ore.copper=Kupfer +item.ore.fluorite=Fluorit item.ore.gold=Gold item.ore.iron=Eisen item.ore.niobium=Niob @@ -4011,6 +4011,8 @@ tile.machine_condenser.name=Dampfkondensierer tile.machine_controller.name=Reaktorfernsteuerung tile.machine_converter_he_rf.name=HE zu RF Konverter tile.machine_converter_rf_he.name=RF zu HE Konverter +tile.machine_conveyor_press.name=Förderband-Presse +tile.machine_conveyor_press.desc=Band bewegt sich von links nach rechts$Rechtsclick um Stempel zu montieren$Stempel kann mit Schraubenzieher entfernt werden tile.machine_crucible.name=Schmelztiegel tile.machine_crystallizer.name=Erzauflöser tile.machine_cyclotron.name=Zyklotron diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cfa60dba7..56215f8d7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3291,6 +3291,7 @@ item.ore.asbestos=Asbestos item.ore.borax=Borax item.ore.chlorocalcite=Chlorocalcite item.ore.copper=Copper +item.ore.fluorite=Fluorite item.ore.gold=Gold item.ore.iron=Iron item.ore.niobium=Niobium @@ -4986,6 +4987,8 @@ tile.machine_condenser.name=Steam Condenser tile.machine_controller.name=Reactor Remote Control Block tile.machine_converter_he_rf.name=HE to RF Converter tile.machine_converter_rf_he.name=RF to HE Converter +tile.machine_conveyor_press.name=Conveyor Press +tile.machine_conveyor_press.desc=Conveyor moves left to right$Right click stamp to install$Use screwdriver to remove stamp tile.machine_crucible.name=Crucible tile.machine_crystallizer.name=Ore Acidizer tile.machine_cyclotron.name=Cyclotron diff --git a/src/main/resources/assets/hbm/models/machines/conveyor_press.obj b/src/main/resources/assets/hbm/models/machines/conveyor_press.obj new file mode 100644 index 000000000..0fca31982 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/conveyor_press.obj @@ -0,0 +1,1042 @@ +# Blender v2.79 (sub 0) OBJ File: 'conveyor_press.blend' +# www.blender.org +o Belt +v -0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 1.000000 -0.500000 +v 0.500000 1.250000 0.500000 +v -0.500000 1.250000 0.500000 +v 0.500000 1.250000 -0.500000 +v -0.500000 1.250000 -0.500000 +vt -0.000000 0.953125 +vt 1.000000 0.937500 +vt 1.000000 0.953125 +vt 1.000000 0.937500 +vt 0.000000 0.953125 +vt 0.000000 0.937500 +vt 0.000000 1.000000 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.953125 +vt 0.000000 0.937500 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +s off +f 2/1/1 7/2/1 4/3/1 +f 3/4/2 6/5/2 1/6/2 +f 8/7/3 5/8/3 7/9/3 +f 2/1/1 8/10/1 7/2/1 +f 3/4/2 5/11/2 6/5/2 +f 8/7/3 6/12/3 5/8/3 +o Piston +v -0.250000 2.125000 -0.250000 +v -0.250000 2.125000 0.250000 +v 0.250000 2.125000 0.250000 +v 0.250000 2.125000 -0.250000 +v -0.250000 2.000000 -0.250000 +v -0.250000 2.000000 0.250000 +v 0.250000 2.000000 0.250000 +v 0.250000 2.000000 -0.250000 +v -0.187500 2.125000 0.187500 +v 0.187500 2.125000 0.187500 +v -0.187500 2.125000 -0.187500 +v 0.187500 2.125000 -0.187500 +v -0.187500 2.875000 0.187500 +v 0.187500 2.875000 0.187500 +v -0.187500 2.875000 -0.187500 +v 0.187500 2.875000 -0.187500 +vt 0.553571 0.528846 +vt 0.428571 0.519231 +vt 0.571429 0.519231 +vt 0.571429 0.423077 +vt 0.428571 0.500000 +vt 0.428571 0.423077 +vt 0.571429 0.500000 +vt 0.428571 0.519231 +vt 0.571429 0.500000 +vt 0.571429 0.519231 +vt 0.428571 0.519231 +vt 0.571429 0.500000 +vt 0.571429 0.519231 +vt 0.428571 0.519231 +vt 0.571429 0.500000 +vt 0.571429 0.519231 +vt 0.553571 0.644231 +vt 0.446429 0.528846 +vt 0.553571 0.528846 +vt 0.553571 0.644231 +vt 0.446429 0.528846 +vt 0.553571 0.528846 +vt 0.553571 0.644231 +vt 0.446429 0.528846 +vt 0.553571 0.644231 +vt 0.446429 0.528846 +vt 0.553571 0.528846 +vt 0.428571 0.500000 +vt 0.428571 0.500000 +vt 0.428571 0.500000 +vt 0.446429 0.644231 +vt 0.446429 0.644231 +vt 0.446429 0.644231 +vt 0.446429 0.644231 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 20/13/4 11/14/4 12/15/4 +f 13/16/5 15/17/5 14/18/5 +f 11/14/6 16/19/6 12/15/6 +f 9/20/7 14/21/7 10/22/7 +f 12/23/8 13/24/8 9/25/8 +f 10/26/9 15/27/9 11/28/9 +f 23/29/8 20/30/8 19/31/8 +f 22/32/9 17/33/9 18/34/9 +f 24/35/6 18/36/6 20/13/6 +f 21/37/7 19/38/7 17/39/7 +f 19/31/4 12/23/4 9/25/4 +f 17/39/4 9/20/4 10/22/4 +f 18/34/4 10/26/4 11/28/4 +f 20/13/4 18/36/4 11/14/4 +f 13/16/5 16/19/5 15/17/5 +f 11/14/6 15/17/6 16/19/6 +f 9/20/7 13/40/7 14/21/7 +f 12/23/8 16/41/8 13/24/8 +f 10/26/9 14/42/9 15/27/9 +f 23/29/8 24/43/8 20/30/8 +f 22/32/9 21/44/9 17/33/9 +f 24/35/6 22/45/6 18/36/6 +f 21/37/7 23/46/7 19/38/7 +f 19/31/4 20/30/4 12/23/4 +f 17/39/4 19/38/4 9/20/4 +f 18/34/4 17/33/4 10/26/4 +o Press +v -0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 0.000000 0.375000 +v -0.500000 0.875000 0.375000 +v 0.500000 0.000000 0.375000 +v 0.500000 0.875000 0.375000 +v -0.500000 0.000000 -0.375000 +v -0.500000 0.875000 -0.375000 +v 0.500000 0.000000 -0.375000 +v 0.500000 0.875000 -0.375000 +v 0.375000 0.000000 0.500000 +v 0.375000 0.875000 0.500000 +v 0.375000 0.000000 -0.500000 +v 0.375000 0.875000 -0.500000 +v -0.375000 0.000000 0.500000 +v -0.375000 0.875000 0.500000 +v -0.375000 0.000000 -0.500000 +v -0.375000 0.875000 -0.500000 +v -0.437500 0.000000 0.375000 +v -0.437500 0.875000 0.375000 +v -0.437500 0.875000 -0.375000 +v -0.437500 0.000000 -0.375000 +v 0.375000 0.000000 0.437500 +v -0.375000 0.000000 0.437500 +v -0.375000 0.875000 0.437500 +v 0.375000 0.875000 0.437500 +v 0.437500 0.000000 0.375000 +v 0.437500 0.875000 0.375000 +v 0.437500 0.875000 -0.375000 +v 0.437500 0.000000 -0.375000 +v 0.375000 0.000000 -0.437500 +v -0.375000 0.000000 -0.437500 +v -0.375000 0.875000 -0.437500 +v 0.375000 0.875000 -0.437500 +v 0.500000 1.250000 0.500000 +v -0.500000 1.250000 0.500000 +v 0.500000 1.250000 -0.500000 +v -0.500000 1.250000 -0.500000 +v -0.375000 2.000000 0.375000 +v 0.375000 2.000000 0.375000 +v -0.375000 2.000000 -0.375000 +v 0.375000 2.000000 -0.375000 +v -0.375000 3.000000 -0.375000 +v -0.375000 3.000000 0.375000 +v 0.375000 3.000000 0.375000 +v 0.375000 3.000000 -0.375000 +v -0.250000 2.000000 0.250000 +v 0.250000 2.000000 0.250000 +v -0.250000 2.000000 -0.250000 +v 0.250000 2.000000 -0.250000 +v -0.250000 2.125000 -0.250000 +v -0.250000 2.125000 0.250000 +v 0.250000 2.125000 0.250000 +v 0.250000 2.125000 -0.250000 +v 0.625000 0.000000 0.500000 +v 0.625000 0.000000 0.375000 +v 0.750000 0.000000 0.500000 +v 0.750000 0.000000 0.375000 +v 0.625000 2.250000 0.500000 +v 0.625000 2.250000 0.375000 +v 0.750000 2.250000 0.500000 +v 0.750000 2.250000 0.375000 +v -0.750000 0.000000 0.500000 +v -0.750000 0.000000 0.375000 +v -0.625000 0.000000 0.500000 +v -0.625000 0.000000 0.375000 +v -0.750000 2.250000 0.500000 +v -0.750000 2.250000 0.375000 +v -0.625000 2.250000 0.500000 +v -0.625000 2.250000 0.375000 +v -0.500000 2.500000 0.375000 +v 0.500000 2.500000 0.375000 +v -0.500000 2.375000 0.375000 +v 0.500000 2.375000 0.375000 +v -0.500000 2.500000 0.500000 +v 0.500000 2.500000 0.500000 +v -0.500000 2.375000 0.500000 +v 0.500000 2.375000 0.500000 +v 0.625000 0.000000 -0.375000 +v 0.625000 0.000000 -0.500000 +v 0.750000 0.000000 -0.375000 +v 0.750000 0.000000 -0.500000 +v 0.625000 2.250000 -0.375000 +v 0.625000 2.250000 -0.500000 +v 0.750000 2.250000 -0.375000 +v 0.750000 2.250000 -0.500000 +v -0.750000 0.000000 -0.375000 +v -0.750000 0.000000 -0.500000 +v -0.625000 0.000000 -0.375000 +v -0.625000 0.000000 -0.500000 +v -0.750000 2.250000 -0.375000 +v -0.750000 2.250000 -0.500000 +v -0.625000 2.250000 -0.375000 +v -0.625000 2.250000 -0.500000 +v -0.500000 2.500000 -0.500000 +v 0.500000 2.500000 -0.500000 +v -0.500000 2.375000 -0.500000 +v 0.500000 2.375000 -0.500000 +v -0.500000 2.500000 -0.375000 +v 0.500000 2.500000 -0.375000 +v -0.500000 2.375000 -0.375000 +v 0.500000 2.375000 -0.375000 +v -0.250000 2.500000 0.375000 +v 0.250000 2.500000 0.375000 +v -0.250000 2.750000 0.375000 +v 0.250000 2.750000 0.375000 +v -0.250000 2.750000 0.437500 +v -0.250000 2.500000 0.437500 +v 0.250000 2.500000 0.437500 +v 0.250000 2.750000 0.437500 +v -0.250000 2.500000 -0.437500 +v 0.250000 2.500000 -0.437500 +v -0.250000 2.750000 -0.437500 +v 0.250000 2.750000 -0.437500 +v -0.250000 2.750000 -0.375000 +v -0.250000 2.500000 -0.375000 +v 0.250000 2.500000 -0.375000 +v 0.250000 2.750000 -0.375000 +v 0.500000 0.687500 0.187500 +v 0.500000 0.312500 0.187500 +v 0.500000 0.687500 -0.187500 +v 0.500000 0.312500 -0.187500 +v 0.437500 0.687500 -0.187500 +v 0.437500 0.687500 0.187500 +v 0.437500 0.312500 0.187500 +v 0.437500 0.312500 -0.187500 +v -0.500000 0.687500 -0.187500 +v -0.500000 0.312500 -0.187500 +v -0.500000 0.687500 0.187500 +v -0.500000 0.312500 0.187500 +v -0.437500 0.687500 0.187500 +v -0.437500 0.687500 -0.187500 +v -0.437500 0.312500 -0.187500 +v -0.437500 0.312500 0.187500 +v 0.187500 0.687500 -0.500000 +v 0.187500 0.312500 -0.500000 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.312500 -0.500000 +v -0.187500 0.687500 -0.437500 +v 0.187500 0.687500 -0.437500 +v 0.187500 0.312500 -0.437500 +v -0.187500 0.312500 -0.437500 +v -0.187500 0.687500 0.500000 +v -0.187500 0.312500 0.500000 +v 0.187500 0.687500 0.500000 +v 0.187500 0.312500 0.500000 +v 0.187500 0.687500 0.437500 +v -0.187500 0.687500 0.437500 +v -0.187500 0.312500 0.437500 +v 0.187500 0.312500 0.437500 +v 0.500000 0.093750 0.468750 +v 0.500000 0.031250 0.468750 +v 0.500000 0.093750 0.406250 +v 0.500000 0.031250 0.406250 +v 0.625000 0.093750 0.468750 +v 0.625000 0.031250 0.468750 +v 0.625000 0.093750 0.406250 +v 0.625000 0.031250 0.406250 +v 0.500000 0.968750 0.468750 +v 0.500000 0.906250 0.468750 +v 0.500000 0.968750 0.406250 +v 0.500000 0.906250 0.406250 +v 0.625000 0.968750 0.468750 +v 0.625000 0.906250 0.468750 +v 0.625000 0.968750 0.406250 +v 0.625000 0.906250 0.406250 +v 0.500000 0.093750 -0.406250 +v 0.500000 0.031250 -0.406250 +v 0.500000 0.093750 -0.468750 +v 0.500000 0.031250 -0.468750 +v 0.625000 0.093750 -0.406250 +v 0.625000 0.031250 -0.406250 +v 0.625000 0.093750 -0.468750 +v 0.625000 0.031250 -0.468750 +v 0.500000 0.968750 -0.406250 +v 0.500000 0.906250 -0.406250 +v 0.500000 0.968750 -0.468750 +v 0.500000 0.906250 -0.468750 +v 0.625000 0.968750 -0.406250 +v 0.625000 0.906250 -0.406250 +v 0.625000 0.968750 -0.468750 +v 0.625000 0.906250 -0.468750 +v -0.625000 0.093750 0.468750 +v -0.625000 0.031250 0.468750 +v -0.625000 0.093750 0.406250 +v -0.625000 0.031250 0.406250 +v -0.500000 0.093750 0.468750 +v -0.500000 0.031250 0.468750 +v -0.500000 0.093750 0.406250 +v -0.500000 0.031250 0.406250 +v -0.625000 0.968750 0.468750 +v -0.625000 0.906250 0.468750 +v -0.625000 0.968750 0.406250 +v -0.625000 0.906250 0.406250 +v -0.500000 0.968750 0.468750 +v -0.500000 0.906250 0.468750 +v -0.500000 0.968750 0.406250 +v -0.500000 0.906250 0.406250 +v -0.625000 0.093750 -0.406250 +v -0.625000 0.031250 -0.406250 +v -0.625000 0.093750 -0.468750 +v -0.625000 0.031250 -0.468750 +v -0.500000 0.093750 -0.406250 +v -0.500000 0.031250 -0.406250 +v -0.500000 0.093750 -0.468750 +v -0.500000 0.031250 -0.468750 +v -0.625000 0.968750 -0.406250 +v -0.625000 0.906250 -0.406250 +v -0.625000 0.968750 -0.468750 +v -0.625000 0.906250 -0.468750 +v -0.500000 0.968750 -0.406250 +v -0.500000 0.906250 -0.406250 +v -0.500000 0.968750 -0.468750 +v -0.500000 0.906250 -0.468750 +vt 0.285714 -0.000000 +vt 0.321429 0.134615 +vt 0.285714 0.153846 +vt 0.285714 -0.000000 +vt 0.321429 0.134615 +vt 0.285714 0.153846 +vt 0.571429 -0.000000 +vt 0.535714 0.134615 +vt 0.535714 -0.000000 +vt 0.285714 -0.000000 +vt 0.321429 0.134615 +vt 0.285714 0.153846 +vt 0.535714 0.134615 +vt 0.571429 -0.000000 +vt 0.571429 0.153846 +vt 0.571429 -0.000000 +vt 0.535714 0.134615 +vt 0.535714 -0.000000 +vt 0.285714 -0.000000 +vt 0.321429 0.134615 +vt 0.285714 0.153846 +vt 0.571429 -0.000000 +vt 0.535714 0.134615 +vt 0.535714 -0.000000 +vt 0.571429 0.153846 +vt 0.571429 0.153846 +vt 0.571429 0.153846 +vt 0.714286 0.230769 +vt 0.428571 0.269231 +vt 0.428571 0.230769 +vt 0.803571 0.134615 +vt 0.589286 0.000000 +vt 0.803571 0.000000 +vt 0.821429 0.000000 +vt 0.821429 0.134615 +vt 0.589286 0.134615 +vt 0.803571 0.144231 +vt 0.589286 0.144231 +vt 0.571429 0.134615 +vt 0.571429 0.000000 +vt 0.714286 0.230769 +vt 0.428571 0.269231 +vt 0.428571 0.230769 +vt 0.803571 0.134615 +vt 0.589286 0.000000 +vt 0.803571 0.000000 +vt 0.571429 0.000000 +vt 0.589286 0.134615 +vt 0.571429 0.134615 +vt 0.589286 0.144231 +vt 0.803571 0.144231 +vt 0.821429 0.134615 +vt 0.821429 0.000000 +vt 0.803571 0.000000 +vt 0.589286 0.134615 +vt 0.589286 0.000000 +vt 0.571429 0.000000 +vt 0.571429 0.134615 +vt 0.589286 0.144231 +vt 0.803571 0.134615 +vt 0.803571 0.144231 +vt 0.821429 0.134615 +vt 0.821429 0.000000 +vt 0.803571 0.000000 +vt 0.589286 0.134615 +vt 0.589286 0.000000 +vt 0.017857 0.019231 +vt 0.250000 0.009615 +vt 0.267857 0.019231 +vt 0.803571 0.134615 +vt 0.821429 0.000000 +vt 0.821429 0.134615 +vt 0.803571 0.144231 +vt 0.589286 0.144231 +vt 0.571429 0.134615 +vt 0.571429 0.000000 +vt 0.214286 0.153846 +vt 0.250000 0.250000 +vt 0.214286 0.269231 +vt 0.214286 0.423077 +vt 0.428571 0.538462 +vt 0.214286 0.538462 +vt 0.428571 0.269231 +vt 0.857143 0.269231 +vt 0.642857 0.423077 +vt 0.642857 0.269231 +vt 0.428571 0.423077 +vt 0.000000 0.423077 +vt 0.000000 0.269231 +vt 0.142857 0.250000 +vt -0.000000 0.269231 +vt -0.000000 0.250000 +vt 0.392857 0.250000 +vt 0.392857 0.173077 +vt 0.428571 0.153846 +vt 0.250000 0.173077 +vt 0.392857 0.173077 +vt 0.250000 0.250000 +vt 0.250000 0.173077 +vt 0.142857 0.250000 +vt -0.000000 0.269231 +vt -0.000000 0.250000 +vt 0.142857 0.250000 +vt -0.000000 0.269231 +vt -0.000000 0.250000 +vt 0.142857 0.250000 +vt -0.000000 0.269231 +vt -0.000000 0.250000 +vt 0.928571 0.019231 +vt 0.892857 0.000000 +vt 0.928571 0.000000 +vt 0.928571 0.634615 +vt 0.964286 0.586538 +vt 0.964286 0.625000 +vt 0.892857 0.019231 +vt 0.857143 0.365385 +vt 0.857143 0.019231 +vt 0.892857 0.365385 +vt 0.964286 0.019231 +vt 0.928571 0.365385 +vt 1.000000 0.019231 +vt 0.964286 0.365385 +vt 1.000000 0.586538 +vt 1.000000 0.625000 +vt 0.928571 1.000000 +vt 0.892857 0.980769 +vt 0.928571 0.980769 +vt 0.892857 0.423077 +vt 0.857143 0.375000 +vt 0.857143 0.980769 +vt 0.892857 0.634615 +vt 0.964286 0.980769 +vt 1.000000 0.634615 +vt 1.000000 0.980769 +vt 0.964286 0.634615 +vt 0.964286 0.423077 +vt 0.928571 0.576923 +vt 0.928571 0.423077 +vt 0.892857 0.576923 +vt 0.857143 0.423077 +vt 0.964286 0.375000 +vt 1.000000 0.576923 +vt 0.964286 0.576923 +vt 1.000000 0.625000 +vt 0.964286 0.586538 +vt 1.000000 0.586538 +vt 0.857143 0.586538 +vt 0.857143 0.625000 +vt 0.928571 0.019231 +vt 0.892857 0.000000 +vt 0.928571 0.000000 +vt 0.928571 0.634615 +vt 0.964286 0.586538 +vt 0.964286 0.625000 +vt 0.892857 0.019231 +vt 0.857143 0.365385 +vt 0.857143 0.019231 +vt 0.892857 0.365385 +vt 0.964286 0.019231 +vt 0.928571 0.365385 +vt 1.000000 0.019231 +vt 0.964286 0.365385 +vt 1.000000 0.586538 +vt 1.000000 0.625000 +vt 0.928571 1.000000 +vt 0.892857 0.980769 +vt 0.928571 0.980769 +vt 0.892857 0.423077 +vt 0.857143 0.375000 +vt 0.857143 0.980769 +vt 0.892857 0.634615 +vt 0.964286 0.980769 +vt 1.000000 0.634615 +vt 1.000000 0.980769 +vt 0.964286 0.634615 +vt 0.964286 0.423077 +vt 0.928571 0.576923 +vt 0.928571 0.423077 +vt 0.892857 0.576923 +vt 0.857143 0.423077 +vt 0.964286 0.375000 +vt 1.000000 0.576923 +vt 0.964286 0.576923 +vt 1.000000 0.413462 +vt 1.000000 0.375000 +vt 0.857143 0.586538 +vt 0.857143 0.625000 +vt 0.446429 0.192308 +vt 0.428571 0.153846 +vt 0.446429 0.153846 +vt 0.589286 0.153846 +vt 0.446429 0.192308 +vt 0.446429 0.153846 +vt 0.446429 0.201923 +vt 0.589286 0.192308 +vt 0.589286 0.201923 +vt 0.589286 0.192308 +vt 0.446429 0.201923 +vt 0.607143 0.192308 +vt 0.607143 0.153846 +vt 0.428571 0.153846 +vt 0.428571 0.192308 +vt 0.589286 0.153846 +vt 0.607143 0.192308 +vt 0.017857 0.163462 +vt 0.125000 0.221154 +vt 0.017857 0.221154 +vt 0.017857 0.163462 +vt 0.125000 0.221154 +vt 0.017857 0.221154 +vt 0.125000 0.163462 +vt 0.142857 0.221154 +vt -0.000000 0.163462 +vt 0.125000 0.153846 +vt 0.017857 0.230769 +vt 0.125000 0.163462 +vt 0.142857 0.221154 +vt -0.000000 0.163462 +vt 0.125000 0.153846 +vt 0.017857 0.230769 +vt 0.017857 0.163462 +vt 0.125000 0.221154 +vt 0.017857 0.221154 +vt 0.017857 0.163462 +vt 0.125000 0.221154 +vt 0.017857 0.221154 +vt 0.125000 0.163462 +vt 0.142857 0.221154 +vt -0.000000 0.163462 +vt 0.125000 0.153846 +vt 0.017857 0.230769 +vt 0.125000 0.163462 +vt 0.142857 0.221154 +vt -0.000000 0.163462 +vt 0.125000 0.153846 +vt 0.017857 0.230769 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.053571 0.423077 +vt 0.071429 0.442308 +vt 0.053571 0.442308 +vt 0.017857 0.423077 +vt 0.035714 0.442308 +vt 0.017857 0.442308 +vt -0.000000 0.423077 +vt -0.000000 0.442308 +vt 0.035714 0.423077 +vt 0.321429 -0.000000 +vt 0.321429 -0.000000 +vt 0.321429 -0.000000 +vt 0.535714 -0.000000 +vt 0.321429 -0.000000 +vt 0.714286 0.269231 +vt 0.714286 0.269231 +vt 0.035714 0.153846 +vt 0.000000 0.153846 +vt 0.035714 0.144231 +vt 0.000000 0.134615 +vt 0.017857 0.134615 +vt 0.000000 0.019231 +vt 0.000000 0.000000 +vt 0.250000 0.144231 +vt 0.285714 0.153846 +vt 0.250000 0.153846 +vt 0.035714 0.009615 +vt 0.035714 0.000000 +vt 0.267857 0.134615 +vt 0.285714 0.134615 +vt 0.285714 0.019231 +vt 0.250000 0.000000 +vt 0.857143 0.423077 +vt 0.142857 0.269231 +vt 0.392857 0.250000 +vt 0.142857 0.269231 +vt 0.142857 0.269231 +vt 0.142857 0.269231 +vt 1.000000 0.365385 +vt 0.892857 1.000000 +vt 0.857143 0.413462 +vt 0.857143 0.634615 +vt 0.857143 0.576923 +vt 0.964286 0.413462 +vt 1.000000 0.423077 +vt 0.964286 0.625000 +vt 1.000000 0.365385 +vt 0.892857 1.000000 +vt 0.857143 0.413462 +vt 0.857143 0.634615 +vt 0.857143 0.576923 +vt 0.964286 0.413462 +vt 1.000000 0.423077 +vt 0.428571 0.192308 +vt 0.589286 0.201923 +vt 0.607143 0.153846 +vt 0.142857 0.163462 +vt -0.000000 0.221154 +vt 0.017857 0.153846 +vt 0.125000 0.230769 +vt 0.142857 0.163462 +vt -0.000000 0.221154 +vt 0.017857 0.153846 +vt 0.125000 0.230769 +vt 0.142857 0.163462 +vt -0.000000 0.221154 +vt 0.017857 0.153846 +vt 0.125000 0.230769 +vt 0.142857 0.163462 +vt -0.000000 0.221154 +vt 0.017857 0.153846 +vt 0.125000 0.230769 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vt 0.071429 0.423077 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +s off +f 25/47/10 46/48/10 26/49/10 +f 27/50/11 38/51/11 28/52/11 +f 27/53/12 48/54/12 47/55/12 +f 31/56/12 44/57/12 32/58/12 +f 34/59/11 25/60/11 26/61/11 +f 29/62/10 42/63/10 41/64/10 +f 29/65/13 36/66/13 30/67/13 +f 31/68/13 40/69/13 39/70/13 +f 30/67/13 40/69/13 32/71/13 +f 26/49/10 42/63/10 30/72/10 +f 28/73/12 44/57/12 48/54/12 +f 28/52/11 34/59/11 26/61/11 +f 26/74/11 68/75/11 28/76/11 +f 50/77/11 52/78/11 49/79/11 +f 50/77/12 33/80/12 34/81/12 +f 51/82/14 34/83/14 38/84/14 +f 52/78/10 38/85/10 37/86/10 +f 32/87/13 65/88/13 30/89/13 +f 56/90/10 54/91/10 53/92/10 +f 45/93/13 55/94/13 46/95/13 +f 46/96/14 56/90/14 42/97/14 +f 42/98/11 53/92/11 41/99/11 +f 60/100/13 58/101/13 57/102/13 +f 35/103/12 58/101/12 36/104/12 +f 36/105/14 59/106/14 40/107/14 +f 40/108/10 60/100/10 39/109/10 +f 62/110/12 64/111/12 61/112/12 +f 61/113/14 57/114/14 53/115/14 +f 63/116/13 47/117/13 48/118/13 +f 64/111/14 48/119/14 44/120/14 +f 61/112/11 44/121/11 43/122/11 +f 69/123/14 78/124/14 70/125/14 +f 75/126/15 73/127/15 74/128/15 +f 72/129/13 75/126/13 70/125/13 +f 69/130/11 73/131/11 71/132/11 +f 71/132/12 76/133/12 72/129/12 +f 70/125/10 74/134/10 69/135/10 +f 80/136/10 81/137/10 79/138/10 +f 70/125/14 80/139/14 72/129/14 +f 72/129/14 79/140/14 71/141/14 +f 71/141/14 77/142/14 69/123/14 +f 81/143/14 83/144/14 82/145/14 +f 77/146/12 83/147/12 78/148/12 +f 78/149/11 84/150/11 80/151/11 +f 79/152/13 82/153/13 77/154/13 +f 88/155/14 85/156/14 86/157/14 +f 98/158/12 103/159/12 100/160/12 +f 87/161/10 89/162/10 85/163/10 +f 88/155/13 91/164/13 87/161/13 +f 86/165/12 92/166/12 88/155/12 +f 85/167/11 90/168/11 86/165/11 +f 100/160/16 107/169/16 99/170/16 +f 96/171/14 93/172/14 94/173/14 +f 106/174/10 89/175/10 91/164/10 +f 95/176/10 97/177/10 93/172/10 +f 96/178/13 99/179/13 95/180/13 +f 94/173/12 100/181/12 96/178/12 +f 93/172/11 98/158/11 94/173/11 +f 92/166/17 106/174/17 91/164/17 +f 104/182/12 101/183/12 102/184/12 +f 105/185/10 108/186/10 106/174/10 +f 90/187/12 102/184/12 92/166/12 +f 104/182/14 107/188/14 103/189/14 +f 108/190/18 90/191/18 89/192/18 +f 101/183/15 106/174/15 102/184/15 +f 97/177/19 101/183/19 98/158/19 +f 107/193/10 97/177/10 99/194/10 +f 112/195/14 109/196/14 110/197/14 +f 122/198/12 127/199/12 124/200/12 +f 111/201/10 113/202/10 109/203/10 +f 112/195/13 115/204/13 111/201/13 +f 110/205/12 116/206/12 112/195/12 +f 109/207/11 114/208/11 110/205/11 +f 124/200/16 131/209/16 123/210/16 +f 120/211/14 117/212/14 118/213/14 +f 130/214/10 113/215/10 115/204/10 +f 119/216/10 121/217/10 117/212/10 +f 120/218/13 123/219/13 119/220/13 +f 118/213/12 124/221/12 120/218/12 +f 117/212/11 122/198/11 118/213/11 +f 116/206/17 130/214/17 115/204/17 +f 128/222/12 125/223/12 126/224/12 +f 129/225/10 132/226/10 130/214/10 +f 114/227/12 126/224/12 116/206/12 +f 128/222/14 131/228/14 127/229/14 +f 132/230/18 114/227/18 113/231/18 +f 125/223/15 130/214/15 126/224/15 +f 121/217/19 125/223/19 122/198/19 +f 131/232/10 121/217/10 123/233/10 +f 144/234/13 147/235/13 142/236/13 +f 139/237/10 137/238/10 138/239/10 +f 135/240/15 140/241/15 136/242/15 +f 143/243/15 148/244/15 144/234/15 +f 136/245/13 139/237/13 134/246/13 +f 133/247/11 137/238/11 135/248/11 +f 141/249/11 145/250/11 143/243/11 +f 144/234/12 141/249/12 143/243/12 +f 150/251/13 151/252/13 149/253/13 +f 158/254/11 159/255/11 157/256/11 +f 152/257/12 153/258/12 151/252/12 +f 149/253/10 155/259/10 150/251/10 +f 150/251/14 156/260/14 152/257/14 +f 151/252/15 154/261/15 149/253/15 +f 160/262/10 161/263/10 159/255/10 +f 157/256/12 163/264/12 158/254/12 +f 158/254/14 164/265/14 160/262/14 +f 159/255/15 162/266/15 157/256/15 +f 166/267/12 167/268/12 165/269/12 +f 174/270/10 175/271/10 173/272/10 +f 168/273/11 169/274/11 167/268/11 +f 165/269/13 171/275/13 166/267/13 +f 166/267/14 172/276/14 168/273/14 +f 167/268/15 170/277/15 165/269/15 +f 176/278/13 177/279/13 175/271/13 +f 173/272/11 179/280/11 174/270/11 +f 174/270/14 180/281/14 176/278/14 +f 175/271/15 178/282/15 173/272/15 +f 187/283/12 184/284/12 183/285/12 +f 186/286/10 181/287/10 182/288/10 +f 188/289/14 182/288/14 184/290/14 +f 185/291/15 183/285/15 181/287/15 +f 195/292/12 192/293/12 191/294/12 +f 194/295/10 189/296/10 190/297/10 +f 196/298/14 190/297/14 192/299/14 +f 193/300/15 191/294/15 189/296/15 +f 203/301/12 200/302/12 199/303/12 +f 202/304/10 197/305/10 198/306/10 +f 204/307/14 198/306/14 200/308/14 +f 201/309/15 199/303/15 197/305/15 +f 211/310/12 208/311/12 207/312/12 +f 210/313/10 205/314/10 206/315/10 +f 212/316/14 206/315/14 208/317/14 +f 209/318/15 207/312/15 205/314/15 +f 219/319/12 216/320/12 215/321/12 +f 218/322/10 213/323/10 214/324/10 +f 220/325/14 214/324/14 216/326/14 +f 217/327/15 215/321/15 213/323/15 +f 227/328/12 224/329/12 223/330/12 +f 226/331/10 221/332/10 222/333/10 +f 228/334/14 222/333/14 224/335/14 +f 225/336/15 223/330/15 221/332/15 +f 235/337/12 232/338/12 231/339/12 +f 234/340/10 229/341/10 230/342/10 +f 236/343/14 230/342/14 232/344/14 +f 233/345/15 231/339/15 229/341/15 +f 243/346/12 240/347/12 239/348/12 +f 242/349/10 237/350/10 238/351/10 +f 244/352/14 238/351/14 240/353/14 +f 241/354/15 239/348/15 237/350/15 +f 25/47/10 45/355/10 46/48/10 +f 27/50/11 37/356/11 38/51/11 +f 27/53/12 28/73/12 48/54/12 +f 31/56/12 43/357/12 44/57/12 +f 34/59/11 33/358/11 25/60/11 +f 29/62/10 30/72/10 42/63/10 +f 29/65/13 35/359/13 36/66/13 +f 31/68/13 32/71/13 40/69/13 +f 30/67/13 36/66/13 40/69/13 +f 26/49/10 46/48/10 42/63/10 +f 28/73/12 32/58/12 44/57/12 +f 28/52/11 38/51/11 34/59/11 +f 26/74/11 66/360/11 68/75/11 +f 50/77/11 51/82/11 52/78/11 +f 50/77/12 49/79/12 33/80/12 +f 51/82/14 50/77/14 34/83/14 +f 52/78/10 51/82/10 38/85/10 +f 32/87/13 67/361/13 65/88/13 +f 56/90/10 55/94/10 54/91/10 +f 45/93/13 54/91/13 55/94/13 +f 46/96/14 55/94/14 56/90/14 +f 42/98/11 56/90/11 53/92/11 +f 60/100/13 59/106/13 58/101/13 +f 35/103/12 57/102/12 58/101/12 +f 36/105/14 58/101/14 59/106/14 +f 40/108/10 59/106/10 60/100/10 +f 62/110/12 63/116/12 64/111/12 +f 37/362/14 27/363/14 52/364/14 +f 27/363/14 47/365/14 62/366/14 +f 27/363/14 62/366/14 52/364/14 +f 61/113/14 43/367/14 31/368/14 +f 52/364/14 62/366/14 49/369/14 +f 62/366/14 61/113/14 49/369/14 +f 25/370/14 33/371/14 49/369/14 +f 61/113/14 31/368/14 60/372/14 +f 31/368/14 39/373/14 60/372/14 +f 25/370/14 49/369/14 54/374/14 +f 49/369/14 61/113/14 54/374/14 +f 54/374/14 45/375/14 25/370/14 +f 29/65/14 41/376/14 53/115/14 +f 35/377/14 29/65/14 57/114/14 +f 29/65/14 53/115/14 57/114/14 +f 53/115/14 54/374/14 61/113/14 +f 61/113/14 60/372/14 57/114/14 +f 63/116/13 62/110/13 47/117/13 +f 64/111/14 63/116/14 48/119/14 +f 61/112/11 64/111/11 44/121/11 +f 69/123/14 77/142/14 78/124/14 +f 75/126/15 76/133/15 73/127/15 +f 72/129/13 76/133/13 75/126/13 +f 69/130/11 74/378/11 73/131/11 +f 71/132/12 73/131/12 76/133/12 +f 70/125/10 75/126/10 74/134/10 +f 80/136/10 84/379/10 81/137/10 +f 70/125/14 78/124/14 80/139/14 +f 72/129/14 80/139/14 79/140/14 +f 71/141/14 79/140/14 77/142/14 +f 81/143/14 84/380/14 83/144/14 +f 77/146/12 82/381/12 83/147/12 +f 78/149/11 83/382/11 84/150/11 +f 79/152/13 81/383/13 82/153/13 +f 88/155/14 87/161/14 85/156/14 +f 98/158/12 101/183/12 103/159/12 +f 87/161/10 91/164/10 89/162/10 +f 88/155/13 92/166/13 91/164/13 +f 86/165/12 90/168/12 92/166/12 +f 85/167/11 89/384/11 90/168/11 +f 100/160/16 103/159/16 107/169/16 +f 96/171/14 95/385/14 93/172/14 +f 106/174/10 108/386/10 89/175/10 +f 95/176/10 99/387/10 97/177/10 +f 96/178/13 100/181/13 99/179/13 +f 94/173/12 98/158/12 100/181/12 +f 93/172/11 97/177/11 98/158/11 +f 92/166/17 102/184/17 106/174/17 +f 104/182/12 103/189/12 101/183/12 +f 105/185/10 107/388/10 108/186/10 +f 90/187/12 104/389/12 102/184/12 +f 104/182/14 108/390/14 107/188/14 +f 108/190/18 104/391/18 90/191/18 +f 101/183/15 105/185/15 106/174/15 +f 97/177/19 105/185/19 101/183/19 +f 107/193/10 105/185/10 97/177/10 +f 112/195/14 111/201/14 109/196/14 +f 122/198/12 125/223/12 127/199/12 +f 111/201/10 115/204/10 113/202/10 +f 112/195/13 116/206/13 115/204/13 +f 110/205/12 114/208/12 116/206/12 +f 109/207/11 113/392/11 114/208/11 +f 124/200/16 127/199/16 131/209/16 +f 120/211/14 119/393/14 117/212/14 +f 130/214/10 132/394/10 113/215/10 +f 119/216/10 123/395/10 121/217/10 +f 120/218/13 124/221/13 123/219/13 +f 118/213/12 122/198/12 124/221/12 +f 117/212/11 121/217/11 122/198/11 +f 116/206/17 126/224/17 130/214/17 +f 128/222/12 127/229/12 125/223/12 +f 129/225/10 131/396/10 132/226/10 +f 114/227/12 128/397/12 126/224/12 +f 128/222/14 132/398/14 131/228/14 +f 132/230/18 128/397/18 114/227/18 +f 125/223/15 129/225/15 130/214/15 +f 121/217/19 129/225/19 125/223/19 +f 131/232/10 129/225/10 121/217/10 +f 144/234/13 148/399/13 147/235/13 +f 139/237/10 140/241/10 137/238/10 +f 135/240/15 137/238/15 140/241/15 +f 143/243/15 145/400/15 148/244/15 +f 136/245/13 140/241/13 139/237/13 +f 133/247/11 138/239/11 137/238/11 +f 141/249/11 146/401/11 145/250/11 +f 144/234/12 142/236/12 141/249/12 +f 150/251/13 152/257/13 151/252/13 +f 158/254/11 160/262/11 159/255/11 +f 152/257/12 156/402/12 153/258/12 +f 149/253/10 154/403/10 155/259/10 +f 150/251/14 155/404/14 156/260/14 +f 151/252/15 153/405/15 154/261/15 +f 160/262/10 164/406/10 161/263/10 +f 157/256/12 162/407/12 163/264/12 +f 158/254/14 163/408/14 164/265/14 +f 159/255/15 161/409/15 162/266/15 +f 166/267/12 168/273/12 167/268/12 +f 174/270/10 176/278/10 175/271/10 +f 168/273/11 172/410/11 169/274/11 +f 165/269/13 170/411/13 171/275/13 +f 166/267/14 171/412/14 172/276/14 +f 167/268/15 169/413/15 170/277/15 +f 176/278/13 180/414/13 177/279/13 +f 173/272/11 178/415/11 179/280/11 +f 174/270/14 179/416/14 180/281/14 +f 175/271/15 177/417/15 178/282/15 +f 187/283/12 188/418/12 184/284/12 +f 186/286/10 185/291/10 181/287/10 +f 188/289/14 186/286/14 182/288/14 +f 185/291/15 187/283/15 183/285/15 +f 195/292/12 196/419/12 192/293/12 +f 194/295/10 193/300/10 189/296/10 +f 196/298/14 194/295/14 190/297/14 +f 193/300/15 195/292/15 191/294/15 +f 203/301/12 204/420/12 200/302/12 +f 202/304/10 201/309/10 197/305/10 +f 204/307/14 202/304/14 198/306/14 +f 201/309/15 203/301/15 199/303/15 +f 211/310/12 212/421/12 208/311/12 +f 210/313/10 209/318/10 205/314/10 +f 212/316/14 210/313/14 206/315/14 +f 209/318/15 211/310/15 207/312/15 +f 219/319/12 220/422/12 216/320/12 +f 218/322/10 217/327/10 213/323/10 +f 220/325/14 218/322/14 214/324/14 +f 217/327/15 219/319/15 215/321/15 +f 227/328/12 228/423/12 224/329/12 +f 226/331/10 225/336/10 221/332/10 +f 228/334/14 226/331/14 222/333/14 +f 225/336/15 227/328/15 223/330/15 +f 235/337/12 236/424/12 232/338/12 +f 234/340/10 233/345/10 229/341/10 +f 236/343/14 234/340/14 230/342/14 +f 233/345/15 235/337/15 231/339/15 +f 243/346/12 244/425/12 240/347/12 +f 242/349/10 241/354/10 237/350/10 +f 244/352/14 242/349/14 238/351/14 +f 241/354/15 243/346/15 239/348/15 diff --git a/src/main/resources/assets/hbm/textures/armor/trenchmaster_arm.png b/src/main/resources/assets/hbm/textures/armor/trenchmaster_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..57abed7bed4073b0df827b5b623e252bfb59d7f5 GIT binary patch literal 546 zcmV+-0^R+IP)b>!3_KP2LiUV(ONXv4;J%Rn4j(h|U2zRnEq0jb|b0y_om!L6Mxg1!co7?Pe581}E1PoN^8CE&D< zYRLLr6I(k1af)df7!+x;U~&x}q9$q;7C3E6_{85u(qu_-j9axAbFerA9NMNJ#^bNW zDZV7c--|_bDyP4nbehpbQ|jxajwD<-wcr07SW}`1w4w;KB71@2y_kfAsr?26z!@h8 zj1K~_fx^m{eTs`fEAoFy$~0p{5okpbXhjidMgEN%DASAy`KLJLUMyWyB6#xJL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/trenchmaster_helmet.png b/src/main/resources/assets/hbm/textures/armor/trenchmaster_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..75175e49473da956220f67c9fc4706a172f40cc8 GIT binary patch literal 1378 zcmV-o1)chdP)z+ z*zR;ya8f>`L#!zMnMk|}Rg+s4n_s^~szQ(`AagjTmErR1uha&8@hbu*yFS$~kqIki z#SgdJzW;8)%NfYeHUkR*f!e0kMX*%ne=!4?)9aTT@UoiBS{jk#Kr6AupbdVw1-+Q5 z+Nprb8tEj(u*H>{B!G%UY>RG6CeM0*yGcz6scDIyji?Ewrd77s*32w}qK#*ovlpOH zBUQh6UCq!W{Q;>q#8qe|ALj!YbF(;7dvPwB88a}F638V${!D$o$mYLb@Q0d2Ty4K9 z8D4EQLKo_IUP?t*)~8>2wL52T0g+b#R+N9~{OU_%mfB7!2u*g$^q!)~=0d*e?BvgK z9|8cZDK$p}`b`=|$}wSJP2i>4%@4Prm#+aJzw)YvX_=}vz0Eep1w6cl0_nErW@bp+Aj?dOf>OqdI_RTeDKMu|)Gyw{0H)kZ!s1!X^x4)yd+Q zKWa~RIB}#QdXMZf31-eu@53-m+tQBGY5FIkK^)4}Ih+IfHmw%ntPwe7*Y5?IZW6Y+ zOzn*{LPXYltJU(?kmu<#8WGXc6PcKaq^k@WHW{t@h%U5?_+yjdOhl+#FK^p4tvWJj zD1V;r4C4rV&gyR*p|g+H*@^Tyn-~3&x{*1UfcQk@&@hU!1T(e_5ba4#e_F@DINoim z0{$~H`WKxh)-{Zt&*uokke*w%;Uo;xEjml9O*m(;zQ}RByYP${myL752>=wul4FT8 zdG`DG_-Gt(c6PR>rPN0d1blygPrv~dR#g!M0eha8Un>)NgNVP&T>l+nDEGA6{u9XP z?CV6`G}ehh*!T4_fX+0clMrp+Qk*YRHe1=W7eAZZWq-Z8x>DvIg<(kgAQ__n4a{3& zUBq!*X&a9WTKWAi`6*EP1``kok>i(+V*o%zuZ-Ql@@Hdv)uhp+5gFH?0(hQ>&1QpI z&R&EV-)PUD8%1^(bmr{q1Z3Qi0AOq>AJ^_h{{G|0m>GY^_C7~4gK_qje8lY7`$S_R z*TKKW_5gv=5AOe|HgEi6iQG@>^ZtEgO;p9%$p`V$yakgFnod0yTkmGG=_zSk6Il)? z^0tozA|Is3ljN;A4m~-$D}*M>f@7|+AF9p!q>+7L`8EQ8yw3TM`O&+(7^m5oQw&5S z?~%~a6M2vHi0G(^2oeC`{x70gJrZ1B*LqEyde{!R1?0LV0yq|8VLmK83XQ~;dl~K( zVv^8wI(2&Y?(RTtfco*%?8gVr%{as;J`h8s- zg=tm6V2C*T$Y!%?WdWY&wKC6OH1b5`(BSMNZP<1Y1g!g-_$!nay^Xn+e2{q*8i_6U kGI}FY6#QHQ<6t!MKdjSoBTX?Q?f?J)07*qoM6N<$f-i-ZBme*a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/conveyor_press.png b/src/main/resources/assets/hbm/textures/models/machines/conveyor_press.png new file mode 100644 index 0000000000000000000000000000000000000000..6464d8f83d75d5d0d0206440341ffeb2bdd2d4ec GIT binary patch literal 1767 zcmVNU~gSm_O?DQ zrY9eI*+MQU=#a}oPd(%md`(Wv61sa^a9DaM&ych^JwJWy?g4yg$ulS^M+cj7XQ3||9aDcu$rO9I0NV@$fd zz9*hPe~#lgeM`0d{rxm}29y{u30%ulJbwIGUA%aaOP4P3`t@secX#8TYinz&TCJwK z9!(4wLF~G1^iW`gpa%j&f-b?Z1iB^oSxKkm4}5?-cO?hxj*uP-&X+nchJ844x-HoM zF{I@yT0XpZ@dDR%X*QeGYPI-!`}XZz=HUc@T~`c2w*=*%>V0lm-w$cY4qVGqJbCg2 z0N?isf&iryLI_OLq+Bk~9B81wi7RwnR1f+`E}C;KUlDfUA{TWW2iJ88f`E3rjizas zrkVPd38rvSLoyVuI9VfemERX??5X{(Qda1!w@MY&1REgv50Nk zwA<}8nELyhxIz>yt!}iG-8m%+^vI(ACa!RF&W%WizQVTcI9eKp z(HBJvg~H5%j!OLX_a$W(1=cx%wG7rd4f(E(bU?mS1Wko>R445y-v7DIX)6Dpn_t8* zz5n?VZ+L%F5Lg9)wJfmD39O=q1bh^-4KnOpegHuLr>*>PiZ;B)%94gv5ZGOVc2UDu z;46h6Dr8IHw-kP$kb&Z~l^>^xA4Grn?$=zfEd-ruHWWY&M&0Z*LFH zt5hmbn$+@a?N7CoSY2J6rh2OOr#@9H7K_}tapTy$X*I3=ILJ)ef!sxBpjp^Ivo0Db zchOPGU33a9+(rNL(ciI)0{cA;|DcWERQLx9d7!%KNiEOTzR~d7ScbsT1-1}a0_3|k zzN3(?LVBIc_Z5Lun4UOQ<;Md4&sCT@SQ=O;EI8brxQf74NM9kPA_x@5DJwq~@X!DL z)yM+d+uMCR{70XalrF(=qT>riVM)VS0%K+H`2L>{Jg6($C_KR9@EpeIUIhdQ0q1}^ zedTX{{o}|JhU!g5QW}3M{bMxXk>8WPn*jLb`tT#d#;eiiqCb2;V#9Yr86SQ9-$XAz zB8Wde`Nha`4?h1_eDJ&Xv^9ATr_{u!YU320%>cYvG+?DtQOnEAeHo7949q_`biZ+m z4xW;F$gHJRDwSg=>9D-WMaQZ4-NYhgL?idj`ETKawa(qWXMD`>hF6%tMHi{VIrzaE z{ARtA{{8_R^M*O8ivoQ2X=&t8rs>9s&(4#&=r}kS{|A^xha^n(M=>9;3u8T&`xpBw$y*dh+HXML9>`@SD=wl+`yNO;M z?6&)^dB}Knr>x*9Yq#qsn&{>AJps_E2Z0CX5)|GSm<0{9ATSGppt~>*Tt&-O1RjU! z=)RY3fPwBD3_RG_*ib7gD{)3|8lcf=97#VU@MhDAr?<lEfIC@`WJ5#jl`q%PUL)cr>wr*`6N->kJi6ZzkP7BkvCv)w8klE`B~ZR z^`et%XzU)=P+CyO*%8G0|N1^`DHNgFb1<7h0HrrpFYIuFQM>QsFYn}+wCD!?>! z<^c`p55H-I>P2c`1V;g64GxZR(P1E2go7?%qtQqNkhFXfyOZRNQg=7;kfiIuTh|_P z>rPqCYQa6JqHpV>Z|EK|00004b3#c}2nYxW zd8=15Xb+Doq`aBjVi&b)}V@{IDkc(D||)D15%~R1LURd z74ilFTqeM=y8vgwKnxs6L(LI;qQN2&l)^Xb*$)}Fq;415Mgr{}%?$aQ8P4ub{`mR3 z{o;pn{PgBq0KjZE0{{piKtm~|zi+o&%w{wE{>w*f-u;Jj0LbPOlx3+W(|NFal74Ov)Mo?g`y~s%_mO+#PSSX*P$#+E>Hg=07xkz zr33)1*K2)UYtS?e9v&XF%`};`sHzIH+3ZQ^YfFHX5=BuQ)PP^>x(;Ib9>Bk*53aAT zA%wtUu|U^#`g)${0ATpQF#&+S6Xbb*2WZ&B4IkXx+&B|_&jY`94gjj&K}xArC7(R! z2jGLLL7wMWuh$Sl;PUbkP19&qZ68P}q3WIMgR846{oS}_?3%5W7Eo0cs;V+3Kg-1{ zCZKQkSglrCRhtDVr8a4?SbYA=Ux$6rbsh3N*FGR^Hk%Earh$|aeY zEEb2K1Fky%q+jQP9RY-92+ocMp*TD7AUe*#-=+W{3}>-CgA)(Z;Y>aljI*kD!8kh_ z0AV;g@n96r0LJ0mxBFn6y*>!R*@*|-er`8;o}0vfL<=a(Qk!7oOcOVojn)+S^GQH9 zpTy73*=s8vM90}N0SLp{i3e$MCOZe?OlU^U&Q3gto}CR72+dL1ITU9n9*nNmyRLKo zk$*}l_1_-_FcY%*Bs@F6w0sbXb2eukSy6x&>Ys&`nez7NdKZ%qwCarX8PqGo49K;P~MWarj3Ap~cqJ{VoC+p62c zt{Dsggl5$2?Cl>!F1GJX0iig1`v>W828I;d3}?H45G6Z%`v+Y8ub!O^oC(dSy)-8t z9Hm-sng&7$6h(0mXW&5pfIBiuc6Q=HbetU%fH0h$c#sxn+Xulo6Pi)8vl9=ZXJ^BN zzTL;~rS&hZcrdhD|He0gY_DHZr zaGb^REe`e%;^Ry{;OYnAtm+-g^2fmJ{K+*T1ZSr{NV^ZEZ};(6y1e@jMpf&i9;r?1 z3ET`{e?iBC=-Jtc2Wi)x$<7d*z5Ro9I0Hk9ZH6XFs#9+(GXzloAZjnIZ%4j-I~vfVyxnf~ZS>&`JVq}=KsKKY$j)qm!ZzVcaQ5~O zPOI1!%TI9L7t-Mj3@Em_06M=AmYv_58USH9d-ort+lNB^gQzQA-u}U;YQ5_^&G~aU zb2GI7yMGWRJA3;FT>ZG~&NM=BcItz)IMXi-#+lHJnw`D