diff --git a/changelog b/changelog index acd5b1383..22dc7d698 100644 --- a/changelog +++ b/changelog @@ -1,34 +1,8 @@ -## Added -* Large Radar - * A giant version of the radar with 3x the scan range - -## Changed -* Nuclear craters have been reworked - * The fallout effect no longer creates dead grass, instead it converts the area into three new biomes, the outer crater, crater and inner crater - * The entire crater is now slaked sellafite which now has texture variance to look more like debris, as well as getting darker towards the center - * The biomes being overridden means that nukes are now a solution to thaumcraft taint. Yay! - * There are now new ore variants for the block conversions which match the surrounding sellafite - * Beryllium ore now has a 100% chance of being converted into emerald -* The watz now cools up to 20% of its current heat level instead of 10%, making reactors a lot cooler and therefore react faster, which means more energy and faster depletion rates - * Mud production rates have been halved, to prevent currently working setups from exploding instantly - * This is your reminder that you can achieve more power, mud and depletion by building larger watz powerplants, i.e. stacking more watz segments on top of each other. Your tiny poo reactors make me sick. -* Watz pellets now have a 50% smaller yield, halving the expected time until depletion -* Adjusted the nuclear flash's intensity, the flash will now deal less and less radiation the longer it goes on -* The nuclear flash now bypasses radiation resistance, being only affected by blocks and distance -* Mushroom clouds' initial scale is now based on the total scale instead of all spawning roughly at the same size, causing fireballs to be comically small for huge bombs -* Removed the old mining drill, combustion generator, old watz core, structure marker, all old large reactor parts and CMB furnace for good -* Chemical plants will now eject all their outputs within a single tick if possible, increasing the throughput of fast recipes with many outputs, like asphalt -* Hitting CTRL + ALT when hovering over an item now displays a preview of that item. Useful if you want to get authentic renders for a wiki, or just like staring at things. -* 256k tanks and BAT9000s can now output comparator signals from their fluid ports -* Trenchmaster general damage multiplier has been halved, making it twice as strong -* Updated generation rules for layers like schist and hematite, they will now only replace things tagged as stone, just like most ores -* Mushroom clouds now have two additional outer condensation rings, those are not entirely finished and are still subject to change -* Small radars are now a tad cheaper ## Fixed -* Fixed a rare crash caused by radars force-loading chunks conflicting with certain mods' chunk loading changes -* Fixed PWR fuel rods not having any radiation value assigned to them -* Fixed trenchmaster helmet not having gas mask protection -* Fixed large thermobaric artillery rocket still using the wrong slag block -* Fixed some of the assembly templates having broken names due to using the wrong way of translating the output -* Fixed the soyuz launcher's NEI construction recipe showing the wrong amount of blocks +* Fixed sellafite emerald ore being oredicted as emerald dust +* Fixed fire replacing petrified wood, creating tons of dead trees with holes in them +* Fixed inconsistent scaling with nuclear missiles +* Fixed BFB rods being called ZFB in hot and depleted variants +* Fixed infinite water barrels voiding water completely after the chemplant's input buffer runs full, infinite barrels can no longer void water in chemplants +* Fixed fallout affecting things on Y:0 like bedrock ores and oil diff --git a/gradle.properties b/gradle.properties index e134592d6..963b4f95a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4837 +mod_build_number=4845 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ @@ -16,4 +16,4 @@ credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion al \ (OpenComputers integration), martemen (project settings), Pvndols (thorium fuel recipe, gas turbine),\ \ JamesH2 (blood mechanics, nitric acid, particle emitter), sdddddf80 (recipe configs, chinese localization,\ \ custom machine holograms, I18n improvements), SuperCraftAlex (tooltips) LePeep (coilgun model, BDCL QC),\ - \ 70k (textures), Maksymisio (polish localization) Ice-Arrow (research reactor tweaks) + \ 70k (textures, glyphid AI, strand caster), Maksymisio (polish localization) Ice-Arrow (research reactor tweaks) diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 923ba0029..31d8488d5 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -602,6 +602,7 @@ public class ModBlocks { public static Block sliding_blast_door; public static Block fire_door; public static Block transition_seal; + public static Block silo_hatch; // 1.12.2 Doors public static Block secure_access_door; @@ -2115,6 +2116,7 @@ public class ModBlocks { sliding_blast_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDE_DOOR).setBlockName("sliding_blast_door").setHardness(10.0F).setResistance(750.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":sliding_blast_door"); fire_door = new BlockDoorGeneric(Material.iron, DoorDecl.FIRE_DOOR).setBlockName("fire_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fire_door"); transition_seal = new BlockDoorGeneric(Material.iron, DoorDecl.TRANSITION_SEAL).setBlockName("transition_seal").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transition_seal"); + silo_hatch = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH).setBlockName("silo_hatch").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); secure_access_door = new BlockDoorGeneric(Material.iron, DoorDecl.SECURE_ACCESS_DOOR).setBlockName("secure_access_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); large_vehicle_door = new BlockDoorGeneric(Material.iron, DoorDecl.LARGE_VEHICLE_DOOR).setBlockName("large_vehicle_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); qe_containment = new BlockDoorGeneric(Material.iron, DoorDecl.QE_CONTAINMENT).setBlockName("qe_containment").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3052,6 +3054,7 @@ public class ModBlocks { GameRegistry.registerBlock(blast_door, blast_door.getUnlocalizedName()); GameRegistry.registerBlock(fire_door, fire_door.getUnlocalizedName()); GameRegistry.registerBlock(transition_seal, transition_seal.getUnlocalizedName()); + GameRegistry.registerBlock(silo_hatch, silo_hatch.getUnlocalizedName()); GameRegistry.registerBlock(sliding_blast_door, sliding_blast_door.getUnlocalizedName()); //Doors diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 5d44d76f0..841d834f9 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -43,7 +43,7 @@ public class BlockDoorGeneric extends BlockDummyable { @Override public int getOffset(){ - return 0; + return type.getBlockOffset(); } @Override @@ -80,8 +80,8 @@ public class BlockDoorGeneric extends BlockDummyable { Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)); - if(box.minY == y && box.maxY == y) - return; + if(box.minY == y && box.maxY == y) return; + if(box.minX == box.maxX && box.minY == box.maxY && box.minZ == box.maxZ) return; if(box != null && box.intersectsWith(entityBox)) { collidingBoxes.add(box); @@ -91,6 +91,13 @@ public class BlockDoorGeneric extends BlockDummyable { // return; //super.addCollisionBoxesToList(worldIn, x, y, z, entityBox, collidingBoxes, entityIn); } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z); + if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null; + return aabb; + } @Override //should fix AI pathfinding public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { //btw the method name is the exact opposite of that it's doing, check net.minecraft.pathfinding.PathNavigate#512 diff --git a/src/main/java/com/hbm/blocks/generic/BlockMush.java b/src/main/java/com/hbm/blocks/generic/BlockMush.java index 1651682a5..a13511b5f 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockMush.java +++ b/src/main/java/com/hbm/blocks/generic/BlockMush.java @@ -1,5 +1,6 @@ package com.hbm.blocks.generic; +import java.util.HashSet; import java.util.Random; import java.util.Set; @@ -47,17 +48,19 @@ public class BlockMush extends Block implements IGrowable, IPlantable { } } - private static final Set canGrowOn = Sets.newHashSet(new Block[] { - ModBlocks.waste_earth, - ModBlocks.waste_mycelium, - ModBlocks.waste_trinitite, - ModBlocks.waste_trinitite_red, - ModBlocks.block_waste, - ModBlocks.block_waste_painted, - ModBlocks.block_waste_vitrified - }); + private static final Set canGrowOn = new HashSet(); public boolean canMushGrowHere(World world, int x, int y, int z) { + if(canGrowOn.isEmpty()) { + canGrowOn.add(ModBlocks.waste_earth); + canGrowOn.add(ModBlocks.waste_mycelium); + canGrowOn.add(ModBlocks.waste_trinitite); + canGrowOn.add(ModBlocks.waste_trinitite_red); + canGrowOn.add(ModBlocks.block_waste); + canGrowOn.add(ModBlocks.block_waste_painted); + canGrowOn.add(ModBlocks.block_waste_vitrified); + } + Block block = world.getBlock(x, y - 1, z); return canGrowOn.contains(block); } @@ -75,7 +78,7 @@ public class BlockMush extends Block implements IGrowable, IPlantable { */ @Override public boolean func_149851_a(World world, int x, int y, int z, boolean b) { - return this.canMushGrowHere(world, x, y, z); + return canBlockStay(world, x, y, z); } /** diff --git a/src/main/java/com/hbm/blocks/generic/BlockOre.java b/src/main/java/com/hbm/blocks/generic/BlockOre.java index 97aae0c8c..269f6b037 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockOre.java +++ b/src/main/java/com/hbm/blocks/generic/BlockOre.java @@ -205,6 +205,9 @@ public class BlockOre extends Block { if(this == ModBlocks.ore_cobalt || this == ModBlocks.ore_nether_cobalt) { return ModItems.fragment_cobalt; } + if(this == ModBlocks.block_meteor_molten) { + return null; + } return Item.getItemFromBlock(this); } @@ -345,8 +348,7 @@ public class BlockOre extends Block { public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int i) { if(this == ModBlocks.block_meteor_molten) { - if(!world.isRemote) - world.setBlock(x, y, z, Blocks.lava); + if(!world.isRemote) world.setBlock(x, y, z, Blocks.lava); } } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java index 9b2c6ced5..4a33bff5f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java @@ -10,12 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; import com.hbm.tileentity.TileEntityProxyCombo; -import com.hbm.tileentity.machine.TileEntityCrucible; -import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityMachineStrandCaster; import com.hbm.util.I18nUtil; -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.entity.item.EntityItem; @@ -30,203 +26,204 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -import java.util.Random; public class MachineStrandCaster extends BlockDummyable implements ICrucibleAcceptor, ILookOverlay, IToolable { - public MachineStrandCaster() { - super(Material.iron); - } + public MachineStrandCaster() { + super(Material.iron); + } - //reminder, if the machine is a solid brick, get dimensions will already handle it without the need to use fillSapce - //the order is up, down, forward, backward, left, right - //x is for left(-)/right(+), z is for forward(+)/backward(-), y you already know - @Override - public int[] getDimensions() { - return new int[]{0, 0, 6, 0, 1, 0}; - } + // reminder, if the machine is a solid brick, get dimensions will already + // handle it without the need to use fillSapce + // the order is up, down, forward, backward, left, right + // x is for left(-)/right(+), z is for forward(+)/backward(-), y you already + // know + @Override + public int[] getDimensions() { + return new int[] { 0, 0, 6, 0, 1, 0 }; + } - @Override - public int getOffset() { - return 0; - } + @Override + public int getOffset() { + return 0; + } - @Override - public TileEntity createNewTileEntity(World world, int meta) { - if (meta >= 12) return new TileEntityMachineStrandCaster(); - if (meta >= 6) return new TileEntityProxyCombo(true, false, true).moltenMetal(); - return null; - } + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineStrandCaster(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, true).moltenMetal(); + return null; + } - @Override - public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { - super.fillSpace(world, x, y, z, dir, o); + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); - x += dir.offsetX * o; - z += dir.offsetZ * o; + x += dir.offsetX * o; + z += dir.offsetZ * o; - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - //up,down;forward,backward;left,right - MultiblockHandlerXR.fillSpace(world, x, y, z, new int[]{2, 0, 1, 0, 1, 0}, this, dir); - //Fluid ports - this.makeExtra(world, x + rot.offsetX - dir.offsetX, y, z + rot.offsetZ - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); - this.makeExtra(world, x + rot.offsetX - dir.offsetX * 5, y, z + rot.offsetZ - dir.offsetZ * 5); - //Molten slop ports - this.makeExtra(world, x + rot.offsetX - dir.offsetX, y + 2, z + rot.offsetZ - dir.offsetZ); - this.makeExtra(world, x - dir.offsetX, y + 2, z - dir.offsetZ); - this.makeExtra(world, x + rot.offsetX, y + 2, z + rot.offsetZ); - this.makeExtra(world, x, y + 2, z); - } + // up,down;forward,backward;left,right + MultiblockHandlerXR.fillSpace(world, x, y, z, new int[] { 2, 0, 1, 0, 1, 0 }, this, dir); + // Fluid ports + this.makeExtra(world, x + rot.offsetX - dir.offsetX, y, z + rot.offsetZ - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX * 5, y, z - dir.offsetZ * 5); + this.makeExtra(world, x + rot.offsetX - dir.offsetX * 5, y, z + rot.offsetZ - dir.offsetZ * 5); + // Molten slop ports + this.makeExtra(world, x + rot.offsetX - dir.offsetX, y + 2, z + rot.offsetZ - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX, y + 2, z - dir.offsetZ); + this.makeExtra(world, x + rot.offsetX, y + 2, z + rot.offsetZ); + this.makeExtra(world, x, y + 2, z); + } - @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { - TileEntity poured = world.getTileEntity(x, y, z); - if (!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return false; + TileEntity poured = world.getTileEntity(x, y, z); + if(!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return false; - int[] pos = this.findCore(world, x, y, z); - if (pos == null) return false; - TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); - if (!(tile instanceof TileEntityMachineStrandCaster)) return false; - TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return false; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof TileEntityMachineStrandCaster)) return false; + TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; - return caster.canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); - } + return caster.canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } - @Override - public Mats.MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { + @Override + public Mats.MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { - TileEntity poured = world.getTileEntity(x, y, z); - if (!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return stack; + TileEntity poured = world.getTileEntity(x, y, z); + if(!(poured instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) poured).moltenMetal)) return stack; - int[] pos = this.findCore(world, x, y, z); - if (pos == null) return stack; - TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); - if (!(tile instanceof TileEntityMachineStrandCaster)) return stack; - TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return stack; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof TileEntityMachineStrandCaster)) return stack; + TileEntityMachineStrandCaster caster = (TileEntityMachineStrandCaster) tile; - return caster.pour(world, x, y, z, dX, dY, dZ, side, stack); - } + return caster.pour(world, x, y, z, dX, dY, dZ, side, stack); + } - @Override - public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - return false; - } + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { + return false; + } - @Override - public Mats.MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - return null; - } + @Override + public Mats.MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { + return null; + } - @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; - } + @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; + } - int[] coords = findCore(world, x, y, z); - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - if (cast != null) { - //insert mold - if (player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { - cast.slots[0] = player.getHeldItem().copy(); - cast.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); - cast.markDirty(); - return true; + int[] coords = findCore(world, x, y, z); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + if(cast != null) { + // insert mold + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { + cast.slots[0] = player.getHeldItem().copy(); + cast.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); + cast.markDirty(); + return true; - } + } - if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && player.getHeldItem().getItem().getToolClasses(player.getHeldItem()).contains("shovel")) { - if (cast.amount > 0) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); - if (!player.inventory.addItemStackToInventory(scrap)) { - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); - world.spawnEntityInWorld(item); - } else { - player.inventoryContainer.detectAndSendChanges(); - } - cast.amount = 0; - cast.type = null; - cast.markDirty(); - } - return true; - } - } - return this.standardOpenBehavior(world, x, y, z, player, 0); - } + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && player.getHeldItem().getItem().getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + } + return true; + } + } + return this.standardOpenBehavior(world, x, y, z, player, 0); + } - @Override - public void breakBlock(World world, int x, int y, int z, Block b, int i) { + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { - TileEntity te = world.getTileEntity(x, y, z); - if (te instanceof TileEntityMachineStrandCaster) { - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) te; + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityMachineStrandCaster) { + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) te; - if (cast.amount > 0) { - ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); - world.spawnEntityInWorld(item); - cast.amount = 0; //just for safety - } - } - super.breakBlock(world, x, y, z, b, i); - } + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new Mats.MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; // just for safety + } + } + super.breakBlock(world, x, y, z, b, i); + } - public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { - int[] coords = findCore(world, x, y, z); - if (coords == null) return; + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + int[] coords = findCore(world, x, y, z); + if(coords == null) + return; - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - List text = new ArrayList(); - if (cast != null) { - if (cast.slots[0] == null) { - text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); - } else if (cast.slots[0].getItem() == ModItems.mold) { - ItemMold.Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); - text.add(EnumChatFormatting.BLUE + mold.getTitle()); - } - } - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); - } + List text = new ArrayList(); + if(cast != null) { + if(cast.slots[0] == null) { + text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); + } else if(cast.slots[0].getItem() == ModItems.mold) { + ItemMold.Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); + text.add(EnumChatFormatting.BLUE + mold.getTitle()); + } + } + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } - @Override - protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { - x += dir.offsetX * o; - z += dir.offsetZ * o; + @Override + protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { + x += dir.offsetX * o; + z += dir.offsetZ * o; - if (!MultiblockHandlerXR.checkSpace(world, x, y, z, getDimensions(), x, y, z, dir)) return false; - return MultiblockHandlerXR.checkSpace(world, x, y, z, new int[]{2, 0, 1, 0, 1, 0}, x, y, z, dir); - } + if(!MultiblockHandlerXR.checkSpace(world, x, y, z, getDimensions(), x, y, z, dir)) + return false; + return MultiblockHandlerXR.checkSpace(world, x, y, z, new int[] { 2, 0, 1, 0, 1, 0 }, x, y, z, dir); + } - @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; + @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[] coords = findCore(world, x, y, z); - TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); + int[] coords = findCore(world, x, y, z); + TileEntityMachineStrandCaster cast = (TileEntityMachineStrandCaster) world.getTileEntity(coords[0], coords[1], coords[2]); - if (cast.slots[0] == null) - return false; + if(cast.slots[0] == null) + return false; - if (!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { - EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); - world.spawnEntityInWorld(item); - } else { - player.inventoryContainer.detectAndSendChanges(); - } + if(!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } - cast.markDirty(); + cast.slots[0] = null; + cast.markDirty(); - cast.slots[0] = null; - - return true; - } + return true; + } } - diff --git a/src/main/java/com/hbm/config/MobConfig.java b/src/main/java/com/hbm/config/MobConfig.java index 1d57e39c8..e777a25bc 100644 --- a/src/main/java/com/hbm/config/MobConfig.java +++ b/src/main/java/com/hbm/config/MobConfig.java @@ -58,7 +58,7 @@ public class MobConfig { public static boolean rampantMode = false; public static boolean rampantNaturalScoutSpawn = false; - public static double rampantScoutSpawnThresh = 20; + public static double rampantScoutSpawnThresh = 14; public static int rampantScoutSpawnChance = 600; public static boolean scoutInitialSpawn = false; public static boolean rampantExtendedTargetting = false; @@ -101,7 +101,7 @@ public class MobConfig { spawnMax = CommonConfig.createConfigDouble(config, CATEGORY, "12.G07_spawnMax", "Maximum amount of glyphids being able to exist at once through natural spawning", 50); targetingThreshold = CommonConfig.createConfigDouble(config, CATEGORY, "12.G08_targetingThreshold", "Minimum amount of soot required for glyphids' extended targeting range to activate", 1D); - scoutSwarmSpawnChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G10_scoutSwarmSpawn", "How likely are scouts to spawn in swarms, 1 in x chance format", 2); + scoutSwarmSpawnChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G10_scoutSwarmSpawn", "How likely are scouts to spawn in swarms, 1 in x chance format", 3); largeHiveChance = CommonConfig.createConfigInt(config, CATEGORY,"12.G11_largeHiveChance", "The chance for a large hive to spawn, formula: 1/x", 5); largeHiveThreshold = CommonConfig.createConfigInt(config, CATEGORY,"12.G12_largeHiveThreshold", "The soot threshold for a large hive to spawn", 20); diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 801563946..227010114 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -108,6 +108,7 @@ public class WorldConfig { public static int meteorShowerChance = 20 * 60 * 5; public static int meteorShowerDuration = 6000; + public static boolean enableCraterBiomes = true; public static int craterBiomeId = 80; public static int craterBiomeInnerId = 81; public static int craterBiomeOuterId = 82; @@ -227,6 +228,7 @@ public class WorldConfig { meteorShowerDuration = CommonConfig.createConfigInt(config, CATEGORY_METEOR, "5.05_meteorShowerDuration", "Max duration of meteor shower in ticks", 20 * 60 * 30); final String CATEGORY_BIOMES = CommonConfig.CATEGORY_BIOMES; + enableCraterBiomes = CommonConfig.createConfigBool(config, CATEGORY_BIOMES, "17.B_toggle", "Enables the biome change caused by nuclear explosions", true); craterBiomeId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B00_craterBiomeId", "The numeric ID for the crater biome", 80); craterBiomeInnerId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B01_craterBiomeInnerId", "The numeric ID for the inner crater biome", 81); craterBiomeOuterId = CommonConfig.createConfigInt(config, CATEGORY_BIOMES, "17.B02_craterBiomeOuterId", "The numeric ID for the outer crater biome", 82); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 8b8f2c27c..5d1edf7e4 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -128,7 +128,11 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_tool, 1), new Object[] { "TBT", "SRS", "SCS", 'T', TA.nugget(), 'B', ModItems.nugget_bismuth, 'S', ANY_RESISTANTALLOY.ingot(), 'R', ModItems.reacher, 'C', ModItems.circuit_aluminium }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.sat_designator, 1), new Object[] { "RRD", "PIC", " P", 'P', GOLD.plate(), 'R', Items.redstone, 'C', ModItems.circuit_gold, 'D', ModItems.sat_chip, 'I', GOLD.ingot() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.sat_relay), new Object[] { ModItems.sat_chip, ModItems.ducttape, ModItems.radar_linker }); - + + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette, 1), new Object[] { " L", " G ", "G ", 'L', ANY_RUBBER.ingot(), 'G', KEY_CLEARGLASS}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_boron, 1), new Object[] { " P", " B ", "B ", 'P', RUBBER.ingot(), 'B', ModBlocks.glass_boron}); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipette_laboratory, 1), new Object[] { " C", " R ", "P ", 'C', ModItems.circuit_aluminium, 'R', RUBBER.ingot(), 'P', ModItems.pipette_boron }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.mirror_tool), new Object[] { " A ", " IA", "I ", 'A', AL.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.rbmk_tool), new Object[] { " A ", " IA", "I ", 'A', PB.ingot(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.power_net_tool), new Object[] { "WRW", " I ", " B ", 'W', ModItems.wire_red_copper, 'R', REDSTONE.dust(), 'I', IRON.ingot(), 'B', ModItems.battery_su }); diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index bcc6cd6b3..40bae46eb 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.config.FalloutConfigJSON; import com.hbm.config.FalloutConfigJSON.FalloutEntry; +import com.hbm.config.WorldConfig; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.saveddata.AuxSavedData; import com.hbm.world.WorldUtil; @@ -114,6 +115,7 @@ public class EntityFalloutRain extends Entity { } public static BiomeGenBase getBiomeChange(double dist, int scale) { + if(!WorldConfig.enableCraterBiomes) return null; if(scale >= 150 && dist < 15) return BiomeGenCraterBase.craterInnerBiome; if(scale >= 100 && dist < 55) return BiomeGenCraterBase.craterBiome; if(scale >= 25) return BiomeGenCraterBase.craterOuterBiome; @@ -153,13 +155,14 @@ public class EntityFalloutRain extends Entity { int depth = 0; - for(int y = 255; y >= 0; y--) { + for(int y = 255; y >= 1; y--) { if(depth >= 3) return; Block b = worldObj.getBlock(x, y, z); if(b.getMaterial() == Material.air) continue; + if(b == Blocks.bedrock) return; Block ab = worldObj.getBlock(x, y + 1, z); int meta = worldObj.getBlockMetadata(x, y, z); @@ -175,7 +178,7 @@ public class EntityFalloutRain extends Entity { } if(dist < 65 && b.isFlammable(worldObj, x, y, z, ForgeDirection.UP)) { - if(rand.nextInt(5) == 0) + if(rand.nextInt(5) == 0 && worldObj.getBlock(x, y + 1, z).isAir(worldObj, x, y + 1, z)) setBlock(x, y + 1, z, Blocks.fire); } diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java index dfe3c6376..c0cbb40f2 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java @@ -176,8 +176,7 @@ public class EntityGlyphid extends EntityMob { protected Entity findPlayerToAttack() { if(this.isPotionActive(Potion.blindness)) return null; - EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 16D); - return entityplayer; + return this.worldObj.getClosestVulnerablePlayerToEntity(this, useExtendedTargeting() ? 128D : 16D); } @Override @@ -316,7 +315,7 @@ public class EntityGlyphid extends EntityMob { if(source.isFireDamage()) { amount *= 0.7F; } else if(source.getDamageType().equals("player")) { - amount *= 1.5F; + amount *= getScale() < 1.25 ? 1.5 : getScale() < 1.3 ? 0.8 : 0.5; } else if(source == ModDamageSource.acid || source.equals(new DamageSource(ModDamageSource.s_acid))){ amount = 0; } else if(source == DamageSource.inWall) { diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java index ef2ccde88..5eecc8132 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidBlaster.java @@ -60,7 +60,7 @@ public class EntityGlyphidBlaster extends EntityGlyphidBombardier { @Override public float getBombDamage() { - return 10F; + return 15F; } @Override diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java index 7fda8206d..8a2093b63 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidBombardier.java @@ -46,7 +46,7 @@ public class EntityGlyphidBombardier extends EntityGlyphid { if(this.ticksExisted % 60 == 1) { - boolean topAttack = rand.nextBoolean(); + boolean topAttack = false; double velX = e.posX - lastX; double velY = e.posY - lastY; @@ -55,7 +55,11 @@ public class EntityGlyphidBombardier extends EntityGlyphid { if(this.lastTarget != e || Vec3.createVectorHelper(velX, velY, velZ).lengthVector() > 30) { velX = velY = velZ = 0; } - + + if (this.getDistanceToEntity(e) > 20) { + topAttack = true; + } + int prediction = topAttack ? 60 : 20; Vec3 delta = Vec3.createVectorHelper(e.posX - posX + velX * prediction, (e.posY + e.height / 2) - (posY + 1) + velY * prediction, e.posZ - posZ + velZ * prediction); double len = delta.lengthVector(); @@ -91,7 +95,7 @@ public class EntityGlyphidBombardier extends EntityGlyphid { } public float getBombDamage() { - return 1.5F; + return 5F; } public int getBombCount() { diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java index 09801fe4b..f0c8d6a12 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidDigger.java @@ -1,12 +1,26 @@ package com.hbm.entity.mob; +import com.hbm.entity.projectile.EntityRubble; +import com.hbm.lib.Library; import com.hbm.main.ResourceManager; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; import net.minecraft.world.World; +import java.util.List; + public class EntityGlyphidDigger extends EntityGlyphid { + protected Entity lastTarget; + protected double lastX; + protected double lastY; + protected double lastZ; public EntityGlyphidDigger(World world) { super(world); @@ -18,17 +32,121 @@ public class EntityGlyphidDigger extends EntityGlyphid { @Override public double getScale() { - return 1.25D; + return 1.3D; } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(35D); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(50D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1D); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5D); } + public int timer = 0; + @Override + public void onUpdate(){ + super.onUpdate(); + Entity e = this.getEntityToAttack(); + if (e != null) { + + this.lastX = e.posX; + this.lastY = e.posY; + this.lastZ = e.posZ; + + if (--timer <= 0) { + groundSlam(); + timer = 120; + } + } + } + /** + * Mainly composed of crusty old power fist code, with some touch ups + **/ + public void groundSlam(){ + if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < 30) { + Entity e = this.getEntityToAttack(); + + boolean topAttack = false; + + int l = 6; + float part = -1F / 16F; + + int bugX = (int) posX; + int bugY = (int) posY; + int bugZ = (int) posZ; + + Vec3 vec0 = getLookVec(); + + List list = Library.getBlockPosInPath(bugX, bugY, bugZ, l, vec0); + + for (int i = 0; i < 8; i++) { + vec0.rotateAroundY(part); + list.addAll(Library.getBlockPosInPath(bugX, bugY - 1, bugZ, l, vec0)); + } + + double velX = e.posX - lastX; + double velY = e.posY - lastY; + double velZ = e.posZ - lastZ; + + if(this.lastTarget != e) { + velX = velY = velZ = 0; + } + + if (this.getDistanceToEntity(e) > 20) { + topAttack = true; + } + + int prediction = 60; + Vec3 delta = Vec3.createVectorHelper(e.posX - posX + velX * prediction, (e.posY + e.height / 2) - (posY + 1) + velY * prediction, e.posZ - posZ + velZ * prediction); + double len = delta.lengthVector(); + if(len < 3) return; + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + + double x = Math.sqrt(delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord); + double y = delta.yCoord; + double v0 = 1.2; + double v02 = v0 * v0; + double g = 0.03D; + double upperLower = topAttack ? 1 : -1; + double targetPitch = Math.atan((v02 + Math.sqrt(v02*v02 - g*(g*x*x + 2*y*v02)) * upperLower) / (g*x)); + Vec3 fireVec = null; + if(!Double.isNaN(targetPitch)) { + + fireVec = Vec3.createVectorHelper(v0, 0, 0); + fireVec.rotateAroundZ((float) -targetPitch); + fireVec.rotateAroundY((float) -(targetYaw + Math.PI * 0.5)); + } + + for (int[] ints : list) { + + int x1 = ints[0]; + int y1 = ints[1]; + int z1 = ints[2]; + + + Block b = worldObj.getBlock(x1, y1, z1); + float k = b.getExplosionResistance(null); + + if (k < 200 && b.isNormalCube()) { + + EntityRubble rubble = new EntityRubble(worldObj); + rubble.posX = x1 + 0.5F; + rubble.posY = y1 + 2; + rubble.posZ = z1 + 0.5F; + + rubble.setMetaBasedOnBlock(b, worldObj.getBlockMetadata(x1, y1, z1)); + + if(fireVec != null) + rubble.setThrowableHeading(fireVec.xCoord, fireVec.yCoord, fireVec.zCoord, (float) v0, rand.nextFloat()); + + worldObj.spawnEntityInWorld(rubble); + + worldObj.setBlock(x1, y1, z1, Blocks.air); + } + } + } + } @Override public boolean isArmorBroken(float amount) { return this.rand.nextInt(100) <= Math.min(Math.pow(amount * 0.25, 2), 100); diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java index 7e0378bbd..4d1e08a89 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphidScout.java @@ -81,6 +81,7 @@ public class EntityGlyphidScout extends EntityGlyphid { target.setLocationAndAngles(dirVec.xCoord, dirVec.yCoord, dirVec.zCoord, 0, 0); target.maxAge = 300; target.radius = 6; + target.setWaypointType(TASK_BUILD_HIVE); worldObj.spawnEntityInWorld(target); hasTarget = true; @@ -111,6 +112,10 @@ public class EntityGlyphidScout extends EntityGlyphid { hasTarget = true; } } + //fixes edge case where glyphids have no task and yet hasTarget is true + if(taskWaypoint == null && hasTarget){ + hasTarget = false; + } if (getCurrentTask() == TASK_TERRAFORM && super.isAtDestination() && canBuildHiveHere()) { communicate(TASK_TERRAFORM, taskWaypoint); @@ -291,6 +296,14 @@ public class EntityGlyphidScout extends EntityGlyphid { return false; } + @Override + protected Entity findPlayerToAttack() { + if(this.isPotionActive(Potion.blindness)) return null; + //no extended targeting, and a low attack distance, ensures the scouts are focused in expanding, and not in chasing the player + return this.worldObj.getClosestVulnerablePlayerToEntity(this, 10); + } + + ///RAMPANT MODE STUFFS /** Finds the direction from the bug's location to the target and adds it to their current coord diff --git a/src/main/java/com/hbm/entity/projectile/EntityRubble.java b/src/main/java/com/hbm/entity/projectile/EntityRubble.java index 82aedea6b..05459bcfd 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityRubble.java +++ b/src/main/java/com/hbm/entity/projectile/EntityRubble.java @@ -12,16 +12,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -public class EntityRubble extends EntityThrowable { +public class EntityRubble extends EntityThrowableNT { - public EntityRubble(World p_i1773_1_) + public EntityRubble(World world) { - super(p_i1773_1_); - } - - public EntityRubble(World p_i1774_1_, EntityLivingBase p_i1774_2_) - { - super(p_i1774_1_, p_i1774_2_); + super(world); } @Override @@ -30,19 +25,18 @@ public class EntityRubble extends EntityThrowable { this.dataWatcher.addObject(17, (int)Integer.valueOf(0)); } - public EntityRubble(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) - { - super(p_i1775_1_, p_i1775_2_, p_i1775_4_, p_i1775_6_); + public EntityRubble(World world, double x, double y, double z) { + super(world, x, y, z); } @Override - protected void onImpact(MovingObjectPosition p_70184_1_) + protected void onImpact(MovingObjectPosition mop) { - if (p_70184_1_.entityHit != null) + if (mop.entityHit != null) { byte b0 = 15; - p_70184_1_.entityHit.attackEntityFrom(ModDamageSource.rubble, b0); + mop.entityHit.attackEntityFrom(ModDamageSource.rubble, b0); } if(this.ticksExisted > 2) { @@ -55,7 +49,12 @@ public class EntityRubble extends EntityThrowable { PacketDispatcher.wrapper.sendToAllAround(new ParticleBurstPacket((int)Math.floor(posX), (int)posY, (int)Math.floor(posZ), this.dataWatcher.getWatchableObjectInt(16), this.dataWatcher.getWatchableObjectInt(17)), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 50)); } } - + + @Override + protected float getAirDrag() { + return 1F; + } + public void setMetaBasedOnBlock(Block b, int i) { this.dataWatcher.updateObject(16, Block.getIdFromBlock(b)); diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index 28cd279c4..934a0524b 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -11,6 +11,7 @@ import java.util.UUID; import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; +import com.hbm.entity.mob.EntityGlyphidDigger; import com.hbm.entity.mob.EntityGlyphidScout; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; @@ -354,7 +355,8 @@ public class PollutionHandler { && !event.world.isRemote && event.world.provider.dimensionId == 0 && event.type == EnumCreatureType.monster - && event.world.canBlockSeeTheSky(event.x, event.y, event.z)) { + && event.world.canBlockSeeTheSky(event.x, event.y, event.z) + && !event.isCanceled()) { if (event.world.rand.nextInt(MobConfig.rampantScoutSpawnChance) == 0) { @@ -362,8 +364,12 @@ public class PollutionHandler { if (soot >= MobConfig.rampantScoutSpawnThresh) { EntityGlyphidScout scout = new EntityGlyphidScout(event.world); + //escort for the scout, which can also deal with obstacles + EntityGlyphidDigger digger = new EntityGlyphidDigger(event.world); scout.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); + digger.setLocationAndAngles(event.x, event.y, event.z, event.world.rand.nextFloat() * 360.0F, 0.0F); event.world.spawnEntityInWorld(scout); + event.world.spawnEntityInWorld(digger); } } } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index ee56d55cb..4995290e8 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -314,8 +314,8 @@ public class OreDictManager { GOLD.plate(plate_gold).dust(powder_gold).ore(ore_gneiss_gold); LAPIS.dust(powder_lapis); NETHERQUARTZ.gem(Items.quartz).dust(powder_quartz).ore(Blocks.quartz_ore); - DIAMOND.dust(powder_diamond).ore(gravel_diamond); - EMERALD.dust(powder_emerald); + DIAMOND.dust(powder_diamond).ore(gravel_diamond, ore_sellafield_diamond); + EMERALD.dust(powder_emerald).ore(ore_sellafield_emerald); /* * RADIOACTIVE diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 4294759bb..508f94c01 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -1,7 +1,9 @@ package com.hbm.inventory.fluid.tank; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.lwjgl.opengl.GL11; @@ -15,6 +17,7 @@ import com.hbm.packet.TEFluidPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -22,8 +25,9 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; public class FluidTank { - + public static final List loadingHandlers = new ArrayList(); + public static final Set noDualUnload = new HashSet(); static { loadingHandlers.add(new FluidLoaderStandard()); diff --git a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java index 1ee5069b3..817be3b10 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFunnel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFunnel.java @@ -4,15 +4,18 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerFunnel; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityMachineFunnel; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; -public class GUIFunnel extends GuiContainer { +public class GUIFunnel extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_funnel.png"); private TileEntityMachineFunnel funnel; @@ -24,6 +27,25 @@ public class GUIFunnel extends GuiContainer { this.xSize = 176; this.ySize = 168; } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 159, guiTop + 73, 10, 10, mouseX, mouseY, "Mode: " + (funnel.mode == funnel.MODE_3x3 ? "3x3 only" : funnel.mode == funnel.MODE_2x2 ? "2x2 only" : "3x3 then 2x2")); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(this.checkClick(x, y, 159, 73, 10, 10)) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("toggle", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, funnel.xCoord, funnel.yCoord, funnel.zCoord)); + } + } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { @@ -38,5 +60,7 @@ public class GUIFunnel extends GuiContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + drawTexturedModalRect(guiLeft + 159, guiTop + 73, 176, funnel.mode * 10, 10, 10); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineStrandCaster.java b/src/main/java/com/hbm/inventory/gui/GUIMachineStrandCaster.java index a2e959621..f30b6d7a1 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineStrandCaster.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineStrandCaster.java @@ -2,7 +2,6 @@ package com.hbm.inventory.gui; import com.hbm.inventory.container.ContainerMachineStrandCaster; import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineStrandCaster; import com.hbm.util.I18nUtil; @@ -21,78 +20,77 @@ import java.util.List; public class GUIMachineStrandCaster extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_strand_caster.png"); - private TileEntityMachineStrandCaster caster; + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_strand_caster.png"); + private TileEntityMachineStrandCaster caster; - public GUIMachineStrandCaster(InventoryPlayer invPlayer, TileEntityMachineStrandCaster tedf) { - super(new ContainerMachineStrandCaster(invPlayer, tedf)); - caster = tedf; + public GUIMachineStrandCaster(InventoryPlayer invPlayer, TileEntityMachineStrandCaster tedf) { + super(new ContainerMachineStrandCaster(invPlayer, tedf)); + caster = tedf; - this.xSize = 176; - this.ySize = 214; - } + this.xSize = 176; + this.ySize = 214; + } - @Override - public void drawScreen(int x, int y, float interp) { - super.drawScreen(x, y, interp); + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); - drawStackInfo(x, y, 16, 17); + drawStackInfo(x, y, 16, 17); - caster.water.renderTankInfo(this, x, y, guiLeft + 82, guiTop + 14, 16, 24); - caster.steam.renderTankInfo(this, x, y, guiLeft + 82, guiTop + 64, 16, 24); - } + caster.water.renderTankInfo(this, x, y, guiLeft + 82, guiTop + 14, 16, 24); + caster.steam.renderTankInfo(this, x, y, guiLeft + 82, guiTop + 65, 16, 24); + } - @Override - protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.caster.hasCustomInventoryName() ? this.caster.getInventoryName() : I18n.format(this.caster.getInventoryName()); + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.caster.hasCustomInventoryName() ? this.caster.getInventoryName() : I18n.format(this.caster.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 4, 0xffffff); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - } + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 4, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } - @Override - protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - if (caster.amount != 0) { + if(caster.amount != 0) { - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - int targetHeight = Math.min((caster.amount) * 79 / caster.getCapacity(), 92); + int targetHeight = Math.min((caster.amount) * 79 / caster.getCapacity(), 92); - int hex = caster.type.moltenColor; - //hex = 0xC18336; - Color color = new Color(hex); - GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); - drawTexturedModalRect(guiLeft + 17, guiTop + 93 - targetHeight, 176, 89 - targetHeight, 34, targetHeight); - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor4f(1F, 1F, 1F, 0.3F); - drawTexturedModalRect(guiLeft + 17, guiTop + 93 - targetHeight, 176, 89 - targetHeight, 34, targetHeight); - GL11.glDisable(GL11.GL_BLEND); + int hex = caster.type.moltenColor; + // hex = 0xC18336; + Color color = new Color(hex); + GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + drawTexturedModalRect(guiLeft + 17, guiTop + 93 - targetHeight, 176, 89 - targetHeight, 34, targetHeight); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1F, 1F, 1F, 0.3F); + drawTexturedModalRect(guiLeft + 17, guiTop + 93 - targetHeight, 176, 89 - targetHeight, 34, targetHeight); + GL11.glDisable(GL11.GL_BLEND); - } - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor3f(255, 255, 255); + } + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor3f(255, 255, 255); - caster.water.renderTank(guiLeft + 82, guiTop + 38, this.zLevel, 16, 24); - caster.steam.renderTank(guiLeft + 82, guiTop + 90, this.zLevel, 16, 24); + caster.water.renderTank(guiLeft + 82, guiTop + 38, this.zLevel, 16, 24); + caster.steam.renderTank(guiLeft + 82, guiTop + 89, this.zLevel, 16, 24); - } + } + protected void drawStackInfo(int mouseX, int mouseY, int x, int y) { - protected void drawStackInfo(int mouseX, int mouseY, int x, int y) { + List list = new ArrayList(); - List list = new ArrayList(); - - if (caster.type == null) list.add(EnumChatFormatting.RED + "Empty"); - else - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey(caster.type.getUnlocalizedName()) + ": " + Mats.formatAmount(caster.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); - - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + x, guiTop + y, 36, 81, mouseX, mouseY, list); - } + if(caster.type == null) + list.add(EnumChatFormatting.RED + "Empty"); + else + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey(caster.type.getUnlocalizedName()) + ": " + Mats.formatAmount(caster.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + x, guiTop + y, 36, 81, mouseX, mouseY, list); + } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d7c0bc745..af65ba54f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -9,6 +9,7 @@ import com.hbm.handler.WeaponAbility; import com.hbm.handler.guncfg.*; import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.items.ItemAmmoEnums.*; @@ -934,6 +935,9 @@ public class ModItems { public static Item fluid_barrel_full; public static Item fluid_barrel_empty; public static Item fluid_barrel_infinite; + public static Item pipette; + public static Item pipette_boron; + public static Item pipette_laboratory; public static Item disperser_canister_empty; public static Item disperser_canister; @@ -3005,6 +3009,7 @@ public class ModItems { component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); + FluidTank.noDualUnload.add(chlorine_pinwheel); ring_starmetal = new Item().setUnlocalizedName("ring_starmetal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ring_starmetal"); flywheel_beryllium = new Item().setUnlocalizedName("flywheel_beryllium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":flywheel_beryllium"); deuterium_filter = new Item().setUnlocalizedName("deuterium_filter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":deuterium_filter"); @@ -3235,8 +3240,6 @@ public class ModItems { singularity_spark = new ItemDrop().setUnlocalizedName("singularity_spark").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.nuclear_waste).setTextureName(RefStrings.MODID + ":singularity_spark_alt"); pellet_antimatter = new ItemDrop().setUnlocalizedName("pellet_antimatter").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.cell_empty).setTextureName(RefStrings.MODID + ":pellet_antimatter"); crystal_xen = new ItemDrop().setUnlocalizedName("crystal_xen").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":crystal_xen"); - inf_water = new ItemInfiniteFluid(Fluids.WATER, 50).setUnlocalizedName("inf_water").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water"); - inf_water_mk2 = new ItemInfiniteFluid(Fluids.WATER, 500).setUnlocalizedName("inf_water_mk2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water_mk2"); stamp_stone_flat = new ItemStamp(10, StampType.FLAT).setUnlocalizedName("stamp_stone_flat").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":stamp_stone_flat"); stamp_stone_plate = new ItemStamp(10, StampType.PLATE).setUnlocalizedName("stamp_stone_plate").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":stamp_stone_plate"); @@ -4652,7 +4655,16 @@ public class ModItems { fluid_barrel_empty = new Item().setUnlocalizedName("fluid_barrel_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_full = new ItemFluidTank().setUnlocalizedName("fluid_barrel_full").setContainerItem(ModItems.fluid_barrel_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_infinite = new ItemInfiniteFluid(null, 1_000_000_000).setUnlocalizedName("fluid_barrel_infinite").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel_infinite"); + pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); + pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); + pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); + inf_water = new ItemInfiniteFluid(Fluids.WATER, 50).setUnlocalizedName("inf_water").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water"); + inf_water_mk2 = new ItemInfiniteFluid(Fluids.WATER, 500).setUnlocalizedName("inf_water_mk2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":inf_water_mk2"); + FluidTank.noDualUnload.add(fluid_barrel_infinite); + FluidTank.noDualUnload.add(inf_water); + FluidTank.noDualUnload.add(inf_water_mk2); + disperser_canister_empty = new Item().setUnlocalizedName("disperser_canister_empty").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); disperser_canister = new ItemDisperser().setUnlocalizedName("disperser_canister").setContainerItem(ModItems.disperser_canister_empty).setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":disperser_canister"); @@ -6381,6 +6393,11 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); + //Pipette + GameRegistry.registerItem(pipette, pipette.getUnlocalizedName()); + GameRegistry.registerItem(pipette_boron, pipette_boron.getUnlocalizedName()); + GameRegistry.registerItem(pipette_laboratory, pipette_laboratory.getUnlocalizedName()); + //Disperser Canister GameRegistry.registerItem(disperser_canister_empty, disperser_canister_empty.getUnlocalizedName()); GameRegistry.registerItem(disperser_canister, disperser_canister.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java b/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java index 0036d36e6..4967059fc 100644 --- a/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java +++ b/src/main/java/com/hbm/items/armor/ArmorTrenchmaster.java @@ -50,6 +50,7 @@ public class ArmorTrenchmaster extends ArmorFSB { @Override public void handleHurt(LivingHurtEvent event) { + super.handleHurt(event); EntityLivingBase e = event.entityLiving; @@ -68,6 +69,7 @@ public class ArmorTrenchmaster extends ArmorFSB { @Override public void handleAttack(LivingAttackEvent event) { + super.handleAttack(event); EntityLivingBase e = event.entityLiving; diff --git a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java index 3e165b474..99619f968 100644 --- a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java +++ b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java @@ -57,84 +57,6 @@ public class ItemMachineUpgrade extends Item { } } - if(this.type == UpgradeType.SPEED) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Delay -" + (15 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Laser Miner:"); - list.add("Delay ÷" + (1 + this.tier) + " / Consumption +" + (625 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Electric Furnace:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (50 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Assembly Machine:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Chemical Plant:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (25 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Crystallizer:"); - list.add("Delay -" + (20 * this.tier) + "% / Consumption +" + (1000 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("Speed x" + (1 + this.tier)); - list.add(EnumChatFormatting.RED + "Flare Stack:"); - list.add("Speed x" + (1 + this.tier)); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Damage +" + (0.25 * (double)this.tier) + "dmg/t"); - } - - if(this.type == UpgradeType.EFFECT) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Radius +" + this.tier + "m / Consumption +" + (80 * this.tier) + "HE/t"); - list.add(EnumChatFormatting.RED + "Crystallizer:"); - list.add("+" + (5 * this.tier) + "% chance of not consuming an item / Acid consumption +" + (1000 * this.tier) + "mB"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("-" + (100 - 100 / (this.tier + 1)) + "% chance of incrementing overheat counter"); - list.add(EnumChatFormatting.RED + "Flare Stack:"); - list.add("+" + (100 * this.tier / 3) + "% power production"); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Range +" + (3 * this.tier) + "m"); - } - - if(this.type == UpgradeType.POWER) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Electric Furnace:"); - list.add("Consumption -" + (15 * this.tier) + "HE/t / Delay +" + (10 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Assembly Machine:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Chemical Plant:"); - list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Consumption -" + (25 * this.tier) + "% / Delay +" + (10 * this.tier) + "%"); - list.add(EnumChatFormatting.RED + "Cyclotron:"); - list.add("Consumption -" + (100 * this.tier) + "kHE/t"); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Consumption -" + (150 * this.tier) + "HE/t"); - list.add("Consumption when firing -" + (1500 * this.tier) + "HE/t"); - } - - if(this == ModItems.upgrade_fortune_1) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +1 / Delay +15"); - } - - if(this == ModItems.upgrade_fortune_2) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +2 / Delay +30"); - } - - if(this == ModItems.upgrade_fortune_3) { - list.add(EnumChatFormatting.RED + "Mining Drill:"); - list.add("Fortune +3 / Delay +45"); - } - - if(this.type == UpgradeType.AFTERBURN) { - list.add(EnumChatFormatting.RED + "Turbofan:"); - list.add("Production x" + (this.tier + 1) + " / Consumption x" + (this.tier + 2)); - list.add(EnumChatFormatting.RED + "Maxwell:"); - list.add("Afterburn +" + (this.tier * 3) + "s"); - list.add(EnumChatFormatting.RED + "Oil Wells:"); - list.add("Burn " + (this.tier * 10) + "mB of gas for " + (this.tier * 50) + "HE/t"); - } - if(this == ModItems.upgrade_radius) { list.add(EnumChatFormatting.RED + "Forcefield Range Upgrade"); list.add("Radius +16 / Consumption +500"); diff --git a/src/main/java/com/hbm/items/tool/ItemPipette.java b/src/main/java/com/hbm/items/tool/ItemPipette.java new file mode 100644 index 000000000..b7829ae2c --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemPipette.java @@ -0,0 +1,202 @@ +package com.hbm.items.tool; + +import api.hbm.fluid.IFillableItem; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class ItemPipette extends Item implements IFillableItem { + + public ItemPipette() { + this.canRepair = false; + this.setMaxDamage(1); + } + + @SideOnly(Side.CLIENT) protected IIcon overlayIcon; + @SideOnly(Side.CLIENT) protected IIcon emptyIcon; + + public short getMaxFill() { + if(this == ModItems.pipette_laboratory) return 50; + else return 1_000; + } + + public void initNBT(ItemStack stack) { + stack.stackTagCompound = new NBTTagCompound(); + this.setFill(stack, Fluids.NONE, (short) 0); // sets "type" and "fill" NBT + stack.stackTagCompound.setShort("capacity", this.getMaxFill()); // set "capacity" + } + + public FluidType getType(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + return Fluids.fromID(stack.stackTagCompound.getShort("type")); + } + + public short getCapacity(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + return stack.stackTagCompound.getShort("capacity"); + } + + public void setFill(ItemStack stack, FluidType type, short fill) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + stack.stackTagCompound.setShort("type", (short) type.getID()); + stack.stackTagCompound.setShort("fill", fill); + } + + public short getFill(ItemStack stack) { + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + return stack.stackTagCompound.getShort("fill"); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(!stack.hasTagCompound()) { + initNBT(stack); + } + + if(!world.isRemote) { + if(this.getFill(stack) == 0) { + int a; + if(this == ModItems.pipette_laboratory) + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 1, 50) : Math.max(this.getCapacity(stack) - 1, 1); + else + a = !player.isSneaking() ? Math.min(this.getCapacity(stack) + 50, 1_000) : Math.max(this.getCapacity(stack) - 50, 50); + stack.stackTagCompound.setShort("capacity", (short) a); + player.addChatMessage(new ChatComponentText(a + "/" + this.getMaxFill() + "mB")); + } else { + player.addChatMessage(new ChatComponentText(I18nUtil.resolveKey("desc.item.pipette.noEmpty"))); + } + } + return stack; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + if(this == ModItems.pipette_laboratory) { + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + list.add(I18nUtil.resolveKey("desc.item.pipette.laboratory")); + } + if(this == ModItems.pipette_boron) + list.add(I18nUtil.resolveKey("desc.item.pipette.corrosive")); + if(this == ModItems.pipette) + list.add(I18nUtil.resolveKey("desc.item.pipette.noCorrosive")); + list.add("Fluid: " + this.getType(stack).getLocalizedName()); + list.add("Amount: " + this.getFill(stack) + "/" + this.getCapacity(stack) + "mB (" + this.getMaxFill() + "mB)"); + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return (type == this.getType(stack) || this.getFill(stack) == 0) && (!type.isAntimatter()); + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + if(this.getFill(stack) == 0) + this.setFill(stack, type, (short) 0); + + int req = this.getCapacity(stack) - this.getFill(stack); + int toFill = Math.min(req, amount); + + this.setFill(stack, type, (short) (this.getFill(stack) + toFill)); + + // fizzling checks + if(this.getFill(stack) > 0 && (this.getType(stack).isCorrosive() && type != Fluids.ACID)) { + if(this == ModItems.pipette) { + stack.stackSize = 0; + } + } + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return this.getType(stack) == type; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + if(providesFluid(type, stack)) { + int toUnload = Math.min(amount, this.getFill(stack)); + this.setFill(stack, type, (short) (this.getFill(stack) - toUnload)); + if(this.getFill(stack) == 0) + this.setFill(stack, Fluids.NONE, (short) 0); + return toUnload; + } + return amount; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister icon) { + super.registerIcons(icon); + if(this == ModItems.pipette_laboratory) + this.overlayIcon = icon.registerIcon("hbm:pipette_laboratory_overlay"); + else + this.overlayIcon = icon.registerIcon("hbm:pipette_overlay"); + + this.emptyIcon = icon.registerIcon("hbm:pipette_empty"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + if(getFill(stack) == 0 && pass == 1) return this.emptyIcon; + return pass == 1 ? this.overlayIcon : getIconFromDamageForRenderPass(stack.getItemDamage(), pass); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 0) { + return 0xffffff; + } else { + int j = this.getType(stack).getColor(); + + if(j < 0) { + j = 0xffffff; + } + + return j; + } + } + +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index a5cbbc5ea..df5d5a653 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4837)"; + public static final String VERSION = "1.0.27 BETA (4845)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index e323183b7..8116119b3 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -41,6 +41,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; + import java.util.Random; import com.hbm.blocks.ModBlocks; @@ -90,6 +91,7 @@ import com.hbm.render.entity.mob.*; import com.hbm.render.entity.projectile.*; import com.hbm.render.entity.rocket.*; import com.hbm.render.item.*; +import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType; import com.hbm.render.item.block.*; import com.hbm.render.item.weapon.*; import com.hbm.render.loader.HmfModelLoader; @@ -415,10 +417,36 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.cmb_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); MinecraftForgeClient.registerItemRenderer(ModItems.dnt_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); - /*for(ItemSwordMeteorite sword : ItemSwordMeteorite.swords) { - MinecraftForgeClient.registerItemRenderer(sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir)); - }*/ - + ItemRenderMissileGeneric.init(); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_taint, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_micro, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_bhole, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_schrabidium, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_stealth, new ItemRenderMissileGeneric(RenderMissileType.TYPE_STEALTH)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_generic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_decoy, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_anti_ballistic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ABM)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_burst, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_inferno, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_rain, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_drill, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_volcano, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_endo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_exo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday, new ItemRenderMissileGeneric(RenderMissileType.TYPE_DOOMSDAY)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_carrier, new ItemRenderMissileGeneric(RenderMissileType.TYPE_CARRIER)); + MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); //test crap MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_bomb_advanced), new ItemRenderTestBombAdvanced()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index b02fb3722..5809ea4ee 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -295,7 +295,7 @@ public class MainRegistry { OreDictManager.registerGroups(); //important to run first OreDictManager.registerOres(); - BiomeGenCraterBase.initDictionary(); + if(WorldConfig.enableCraterBiomes) BiomeGenCraterBase.initDictionary(); Library.superuser.add("192af5d7-ed0f-48d8-bd89-9d41af8524f8"); Library.superuser.add("5aee1e3d-3767-4987-a222-e7ce1fbdf88e"); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 0eeb22d63..599ccb1d2 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -349,6 +349,9 @@ public class ResourceManager { public static WavefrontObjDisplayList large_vehicle_door = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/large_vehicle_door.obj"))); public static final ResourceLocation qe_containment_decal = new ResourceLocation(RefStrings.MODID, "textures/models/doors/qe_containment_decal.png"); + public static final ResourceLocation silo_hatch_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch.png"); + public static WavefrontObjDisplayList silo_hatch = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj"))); + //Lantern public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj")); diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java index f69443b8f..9282833db 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java @@ -18,6 +18,7 @@ public class RenderMissileNuclear extends Render { GL11.glPushMatrix(); GL11.glTranslatef((float) p_76986_2_, (float) p_76986_4_, (float) p_76986_6_); + GL11.glScalef(1.5F, 1.5F, 1.5F); GL11.glRotatef(missile.prevRotationYaw + (missile.rotationYaw - missile.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(missile.prevRotationPitch + (missile.rotationPitch - missile.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); diff --git a/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java new file mode 100644 index 000000000..64763d78b --- /dev/null +++ b/src/main/java/com/hbm/render/item/ItemRenderMissileGeneric.java @@ -0,0 +1,192 @@ +package com.hbm.render.item; + +import java.util.HashMap; +import java.util.function.Consumer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.model.IModelCustom; + +public class ItemRenderMissileGeneric implements IItemRenderer { + + public static HashMap> renderers = new HashMap(); + + protected RenderMissileType type; + + public static enum RenderMissileType { + TYPE_TIER0, + TYPE_TIER1, + TYPE_TIER2, + TYPE_TIER3, + TYPE_STEALTH, + TYPE_ABM, + TYPE_NUCLEAR, + TYPE_THERMAL, + TYPE_DOOMSDAY, + TYPE_CARRIER, + TYPE_ROBIN + } + + public ItemRenderMissileGeneric(RenderMissileType type) { + this.type = type; + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + Consumer renderer = renderers.get(new ComparableStack(item).makeSingular()); + if(renderer == null) return; + + GL11.glPushMatrix(); + + double guiScale = 1; + double guiOffset = 0; + + switch(this.type) { + case TYPE_TIER0: guiScale = 2.25D; guiOffset = 7.5D; break; + case TYPE_TIER1: guiScale = 2.5D; guiOffset = 8.5D; break; + case TYPE_TIER2: guiScale = 2D; guiOffset = 6.5D; break; + case TYPE_TIER3: guiScale = 1.25D; guiOffset = 1D; break; + case TYPE_STEALTH: guiScale = 1.75D; guiOffset = 4.75D; break; + case TYPE_ABM: guiScale = 2.25D; guiOffset = 7D; break; + case TYPE_NUCLEAR: guiScale = 1.75D; guiOffset = 4D; break; + case TYPE_THERMAL: guiScale = 1.75D; guiOffset = 4.5D; break; + case TYPE_DOOMSDAY: guiScale = 1.5D; guiOffset = 3D; break; + case TYPE_CARRIER: guiScale = 0.625D; guiOffset = -17D; break; + case TYPE_ROBIN: guiScale = 1.25D; guiOffset = 2D; break; + } + + switch(type) { + case EQUIPPED: + double s = 0.15; + GL11.glTranslated(0.5, -0.25, 0); + GL11.glScaled(s, s, s); + break; + case EQUIPPED_FIRST_PERSON: + double heldScale = 0.1; + GL11.glTranslated(0.5, 0.25, 0); + GL11.glScaled(heldScale, heldScale, heldScale); + break; + case ENTITY: + double s2 = 0.15; + GL11.glScaled(s2, s2, s2); + break; + case INVENTORY: + RenderHelper.enableGUIStandardItemLighting(); + GL11.glScaled(guiScale, guiScale, guiScale); + GL11.glRotated(135, 0, 0, 1); + GL11.glRotatef(System.currentTimeMillis() / 15 % 360, 0, 1, 0); + GL11.glTranslated(0, -16 + guiOffset, 0); + break; + default: break; + } + + GL11.glDisable(GL11.GL_CULL_FACE); + renderer.accept(Minecraft.getMinecraft().renderEngine); + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glPopMatrix(); + } + + public static Consumer generateStandard(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1F); } + public static Consumer generateLarge(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1.5F); } + public static Consumer generateDouble(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 2F); } + + public static Consumer generateWithScale(ResourceLocation texture, IModelCustom model, float scale) { + return x -> { + GL11.glScalef(scale, scale, scale); + GL11.glShadeModel(GL11.GL_SMOOTH); + x.bindTexture(texture); model.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }; + } + + public static void init() { + + renderers.put(new ComparableStack(ModItems.missile_taint), generateDouble(ResourceManager.missileTaint_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_micro), generateDouble(ResourceManager.missileMicro_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_bhole), generateDouble(ResourceManager.missileMicroBHole_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_schrabidium), generateDouble(ResourceManager.missileMicroSchrab_tex, ResourceManager.missileTaint)); + renderers.put(new ComparableStack(ModItems.missile_emp), generateDouble(ResourceManager.missileMicroEMP_tex, ResourceManager.missileTaint)); + + renderers.put(new ComparableStack(ModItems.missile_stealth), x -> { + GL11.glShadeModel(GL11.GL_SMOOTH); + x.bindTexture(ResourceManager.missileStealth_tex); ResourceManager.missileStealth.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }); + + renderers.put(new ComparableStack(ModItems.missile_generic), generateStandard(ResourceManager.missileV2_HE_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_incendiary), generateStandard(ResourceManager.missileV2_IN_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_cluster), generateStandard(ResourceManager.missileV2_CL_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_buster), generateStandard(ResourceManager.missileV2_BU_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_decoy), generateStandard(ResourceManager.missileV2_decoy_tex, ResourceManager.missileV2)); + renderers.put(new ComparableStack(ModItems.missile_anti_ballistic), generateStandard(ResourceManager.missileAA_tex, ResourceManager.missileABM)); + + renderers.put(new ComparableStack(ModItems.missile_strong), generateLarge(ResourceManager.missileStrong_HE_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_incendiary_strong), generateLarge(ResourceManager.missileStrong_IN_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_cluster_strong), generateLarge(ResourceManager.missileStrong_CL_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_buster_strong), generateLarge(ResourceManager.missileStrong_BU_tex, ResourceManager.missileStrong)); + renderers.put(new ComparableStack(ModItems.missile_emp_strong), generateLarge(ResourceManager.missileStrong_EMP_tex, ResourceManager.missileStrong)); + + renderers.put(new ComparableStack(ModItems.missile_burst), generateStandard(ResourceManager.missileHuge_HE_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_inferno), generateStandard(ResourceManager.missileHuge_IN_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_rain), generateStandard(ResourceManager.missileHuge_CL_tex, ResourceManager.missileHuge)); + renderers.put(new ComparableStack(ModItems.missile_drill), generateStandard(ResourceManager.missileHuge_BU_tex, ResourceManager.missileHuge)); + + renderers.put(new ComparableStack(ModItems.missile_nuclear), generateLarge(ResourceManager.missileNuclear_tex, ResourceManager.missileNuclear)); + renderers.put(new ComparableStack(ModItems.missile_nuclear_cluster), generateLarge(ResourceManager.missileMIRV_tex, ResourceManager.missileNuclear)); + renderers.put(new ComparableStack(ModItems.missile_volcano), generateLarge(ResourceManager.missileVolcano_tex, ResourceManager.missileNuclear)); + + renderers.put(new ComparableStack(ModItems.missile_endo), generateLarge(ResourceManager.missileEndo_tex, ResourceManager.missileThermo)); + renderers.put(new ComparableStack(ModItems.missile_exo), generateLarge(ResourceManager.missileExo_tex, ResourceManager.missileThermo)); + + renderers.put(new ComparableStack(ModItems.missile_doomsday), generateDouble(ResourceManager.missileDoomsday_tex, ResourceManager.missileDoomsday)); + + renderers.put(new ComparableStack(ModItems.missile_carrier), x -> { + GL11.glScalef(2F, 2F, 2F); + x.bindTexture(ResourceManager.missileCarrier_tex); + ResourceManager.missileCarrier.renderAll(); + GL11.glTranslated(0.0D, 0.5D, 0.0D); + GL11.glTranslated(1.25D, 0.0D, 0.0D); + x.bindTexture(ResourceManager.missileBooster_tex); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(-2.5D, 0.0D, 0.0D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(1.25D, 0.0D, 0.0D); + GL11.glTranslated(0.0D, 0.0D, 1.25D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(0.0D, 0.0D, -2.5D); + ResourceManager.missileBooster.renderAll(); + GL11.glTranslated(0.0D, 0.0D, 1.25D); + }); + + renderers.put(new ComparableStack(ModItems.missile_shuttle), generateStandard(ResourceManager.missileShuttle_tex, ResourceManager.missileShuttle)); + } +} diff --git a/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java b/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java index fa0dc5387..27834f8e0 100644 --- a/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java +++ b/src/main/java/com/hbm/render/item/ItemRendererMeteorSword.java @@ -6,10 +6,14 @@ import com.hbm.render.util.RenderItemStack; import com.hbm.render.util.RenderMiscEffects; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; public class ItemRendererMeteorSword implements IItemRenderer { @@ -17,16 +21,16 @@ public class ItemRendererMeteorSword implements IItemRenderer { float r; float g; float b; - + public ItemRendererMeteorSword(float r, float g, float b) { this.r = r; this.g = g; this.b = b; } - + @Override public boolean handleRenderType(ItemStack stack, ItemRenderType type) { - return type == ItemRenderType.INVENTORY; + return type != ItemRenderType.ENTITY; } @Override @@ -39,56 +43,138 @@ public class ItemRendererMeteorSword implements IItemRenderer { GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); - Minecraft mc = Minecraft.getMinecraft(); - RenderItemStack.renderItem.renderItemIntoGUI(mc.fontRenderer, mc.renderEngine, item, 0, 0); + switch(type) { - mc.renderEngine.bindTexture(RenderMiscEffects.glint); + case EQUIPPED_FIRST_PERSON: + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.5, 0.5, 0); + GL11.glTranslated(-0.5, -0.5, 0); + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.5, 0.5, 0); + GL11.glScaled(1.36 * 2, 1.36 * 2, 0.68 * 2); + GL11.glTranslated(-0.5, -0.5, 0.25); + break; + case EQUIPPED: + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-90, 0, 0, 1); + GL11.glTranslated(0.2, 0.55, 0); + GL11.glRotated(45, 0, 0, 1); + GL11.glRotated(180, 0, 1, 0); + GL11.glRotated(-45, 0, 0, 1); + GL11.glScaled(1.7, 1.7, 0.85); + break; + case INVENTORY: + break; + + default: break; + } - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - - for (int j1 = 0; j1 < 2; ++j1) { - OpenGlHelper.glBlendFunc(772, 1, 0, 0); - float f = 0.00390625F; - float f1 = 0.00390625F; - float f2 = (float)(Minecraft.getSystemTime() % (long)(3000 + j1 * 1873)) / (3000.0F + (float)(j1 * 1873)) * 256.0F; - float f3 = 0.0F; - Tessellator tessellator = Tessellator.instance; - float f4 = 4.0F; + if(data.length > 1 && data[1] instanceof EntityLivingBase) { + EntityLivingBase entity = (EntityLivingBase) data[1]; + IIcon iicon = entity.getItemIcon(item, 0); - if (j1 == 1) - { - f4 = -1.0F; - } - - float in = 0.36F; - - GL11.glColor4f(r * in, g * in, b * in, 1.0F); - - int p_77018_2_ = 0; - int p_77018_4_ = 16; - int p_77018_3_ = 0; - int p_77018_5_ = 16; - int zLevel = 0; + if(iicon == null) { + return; + } - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_4_ + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + (float)p_77018_4_) * f), (double)((f3 + 0.0F) * f1)); - tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + 0.0F) * f), (double)((f3 + 0.0F) * f1)); - tessellator.draw(); - } + Minecraft.getMinecraft().getTextureManager().bindTexture(Minecraft.getMinecraft().getTextureManager().getResourceLocation(item.getItemSpriteNumber())); + TextureUtil.func_152777_a(false, false, 1.0F); + Tessellator tessellator = Tessellator.instance; + ItemRenderer.renderItemIn2D(tessellator, iicon.getMaxU(), iicon.getMinV(), iicon.getMinU(), iicon.getMaxV(), iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); + renderGlint3D(tessellator, 0.0625F); + } else { + RenderItemStack.renderItemStackNoEffect(0, 0, 0, item); + renderGlintFlat(); + } - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDepthMask(true); - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - GL11.glPopMatrix(); } + + public void renderGlintFlat() { + + Minecraft mc = Minecraft.getMinecraft(); + mc.renderEngine.bindTexture(RenderMiscEffects.glint); + + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + + for(int j1 = 0; j1 < 2; ++j1) { + OpenGlHelper.glBlendFunc(772, 1, 0, 0); + float scaleU = 0.00390625F; + float scaleV = 0.00390625F; + float anim = (float) (Minecraft.getSystemTime() % (long) (3000 + j1 * 1873)) / (3000.0F + (float) (j1 * 1873)) * 256.0F; + float offsetV = 0.0F; + Tessellator tessellator = Tessellator.instance; + float sizeMultU = 4.0F; + + if(j1 == 1) { + sizeMultU = -1.0F; + } + + float in = 0.36F; + GL11.glColor4f(r * in, g * in, b * in, 1.0F); + + int x = 0; + int sizeX = 16; + int y = 0; + int sizeY = 16; + int zLevel = 0; + + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(x + 0, y + sizeY, zLevel, (anim + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV); + tessellator.addVertexWithUV(x + sizeX, y + sizeY, zLevel, (anim + sizeX + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV); + tessellator.addVertexWithUV(x + sizeX, y + 0, zLevel, (anim + sizeX) * scaleU, (offsetV + 0.0F) * scaleV); + tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (anim + 0.0F) * scaleU, (offsetV + 0.0F) * scaleV); + tessellator.draw(); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDepthMask(true); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + public void renderGlint3D(Tessellator tessellator, float depth) { + + Minecraft mc = Minecraft.getMinecraft(); + mc.renderEngine.bindTexture(RenderMiscEffects.glint); + + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + + float in = 0.36F; + GL11.glColor4f(r * in, g * in, b * in, 1.0F); + + GL11.glMatrixMode(GL11.GL_TEXTURE); + + GL11.glPushMatrix(); + float scale = 0.125F; + GL11.glScalef(scale, scale, scale); + float offset = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; + GL11.glTranslatef(offset, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(scale, scale, scale); + offset = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; + GL11.glTranslatef(-offset, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth); + GL11.glPopMatrix(); + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java index f2b5f3cb8..a7e1a1c49 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadTier1.java @@ -1,11 +1,15 @@ package com.hbm.render.tileentity; +import java.util.function.Consumer; + import org.lwjgl.opengl.GL11; -import com.hbm.items.ModItems; +import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPad; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -29,188 +33,8 @@ public class RenderLaunchPadTier1 extends TileEntitySpecialRenderer { if(toRender != null) { GL11.glTranslated(0, 1, 0); - - //TODO: add a registry for missile rendering to be reused here and for the entity renderer - if(toRender.getItem() == ModItems.missile_generic) { - bindTexture(ResourceManager.missileV2_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_decoy) { - bindTexture(ResourceManager.missileV2_decoy_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_stealth) { - bindTexture(ResourceManager.missileStealth_tex); - ResourceManager.missileStealth.renderAll(); - } - if(toRender.getItem() == ModItems.missile_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_cluster) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_nuclear) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileNuclear_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_incendiary) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_buster) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileV2_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileV2.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_incendiary_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_cluster_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_buster_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_burst) { - bindTexture(ResourceManager.missileHuge_HE_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_inferno) { - bindTexture(ResourceManager.missileHuge_IN_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_rain) { - bindTexture(ResourceManager.missileHuge_CL_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_drill) { - bindTexture(ResourceManager.missileHuge_BU_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileHuge.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_endo) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileEndo_tex); - ResourceManager.missileThermo.renderAll(); - } - if(toRender.getItem() == ModItems.missile_exo) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileExo_tex); - ResourceManager.missileThermo.renderAll(); - } - if(toRender.getItem() == ModItems.missile_nuclear_cluster) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileMIRV_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_doomsday) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileDoomsday_tex); - ResourceManager.missileDoomsday.renderAll(); - } - if(toRender.getItem() == ModItems.missile_taint) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileTaint_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_micro) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicro_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_carrier) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileCarrier_tex); - ResourceManager.missileCarrier.renderAll(); - GL11.glTranslated(0.0D, 0.5D, 0.0D); - GL11.glTranslated(1.25D, 0.0D, 0.0D); - bindTexture(ResourceManager.missileBooster_tex); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(-2.5D, 0.0D, 0.0D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(1.25D, 0.0D, 0.0D); - GL11.glTranslated(0.0D, 0.0D, 1.25D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(0.0D, 0.0D, -2.5D); - ResourceManager.missileBooster.renderAll(); - GL11.glTranslated(0.0D, 0.0D, 1.25D); - } - if(toRender.getItem() == ModItems.missile_anti_ballistic) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileAA_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileABM.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_bhole) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroBHole_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_schrabidium) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroSchrab_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_emp) { - GL11.glScalef(2F, 2F, 2F); - bindTexture(ResourceManager.missileMicroEMP_tex); - ResourceManager.missileTaint.renderAll(); - } - if(toRender.getItem() == ModItems.missile_emp_strong) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileStrong_EMP_tex); - GL11.glShadeModel(GL11.GL_SMOOTH); - ResourceManager.missileStrong.renderAll(); - GL11.glShadeModel(GL11.GL_FLAT); - } - if(toRender.getItem() == ModItems.missile_volcano) { - GL11.glScalef(1.5F, 1.5F, 1.5F); - bindTexture(ResourceManager.missileVolcano_tex); - ResourceManager.missileNuclear.renderAll(); - } - if(toRender.getItem() == ModItems.missile_shuttle) { - GL11.glScalef(1.0F, 1.0F, 1.0F); - bindTexture(ResourceManager.missileShuttle_tex); - ResourceManager.missileShuttle.renderAll(); - } + Consumer renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(toRender).makeSingular()); + if(renderer != null) renderer.accept(this.field_147501_a.field_147553_e); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java b/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java index 92342b53b..5980da6a6 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRadarScreen.java @@ -7,7 +7,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.inventory.gui.GUIMachineRadarNT; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; -import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import com.hbm.tileentity.machine.TileEntityMachineRadarScreen; import api.hbm.entity.RadarEntry; @@ -56,6 +55,7 @@ public class RenderRadarScreen extends TileEntitySpecialRenderer implements IIte GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glShadeModel(GL11.GL_SMOOTH); tess.draw(); @@ -70,8 +70,8 @@ public class RenderRadarScreen extends TileEntitySpecialRenderer implements IIte for(RadarEntry entry : screen.entries) { - double sX = (entry.posX - screen.refX) / ((double) TileEntityMachineRadarNT.radarRange + 1) * (0.875D); - double sZ = (entry.posZ - screen.refZ) / ((double) TileEntityMachineRadarNT.radarRange + 1) * (0.875D); + double sX = (entry.posX - screen.refX) / ((double) screen.range + 1) * (0.875D); + double sZ = (entry.posZ - screen.refZ) / ((double) screen.range + 1) * (0.875D); double size = 0.0625D; tess.addVertexWithUV(0.38, 1 - sZ + size, 0.5 - sX + size, 216D / 256D, (entry.blipLevel * 8F + 8F) / 256F); tess.addVertexWithUV(0.38, 1 - sZ + size, 0.5 - sX - size, 224D / 256D, (entry.blipLevel * 8F + 8F) / 256F); diff --git a/src/main/java/com/hbm/render/tileentity/RenderStrandCaster.java b/src/main/java/com/hbm/render/tileentity/RenderStrandCaster.java index 6d9579ab0..5655e97fc 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStrandCaster.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStrandCaster.java @@ -16,7 +16,6 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; -import java.awt.*; import java.nio.DoubleBuffer; public class RenderStrandCaster extends TileEntitySpecialRenderer implements IItemRendererProvider { @@ -70,7 +69,7 @@ public class RenderStrandCaster extends TileEntitySpecialRenderer implements IIt buf.put(new double[] { 0, 0, -1, 0.5} ); buf.rewind(); GL11.glClipPlane(GL11.GL_CLIP_PLANE0, buf); - GL11.glTranslated(0,0,-offset + 3.4); + GL11.glTranslated(0,0,Math.max(-offset + 3.4, 0)); ResourceManager.strand_caster.renderPart("plate"); GL11.glDisable(GL11.GL_CLIP_PLANE0); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java index 5b8d04cc7..7b99b1719 100644 --- a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java +++ b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java @@ -45,6 +45,7 @@ public class RenderAccessoryUtility { private static ResourceLocation vaer = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeVaer.png"); private static ResourceLocation adam = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeAdam.png"); private static ResourceLocation alcater = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeAlcater.png"); + private static ResourceLocation jame = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeJame.png"); public static ResourceLocation getCloakFromPlayer(EntityPlayer player) { @@ -127,6 +128,9 @@ public class RenderAccessoryUtility { if(uuid.equals(Library.Alcater)) { return alcater; } + if(uuid.equals(Library.ege444)) { + return jame; + } if(Library.contributors.contains(uuid)) { return wiki; } diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 5f81ef8f5..c0fcadc02 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -862,6 +862,65 @@ public abstract class DoorDecl { }; + public static final DoorDecl SILO_HATCH = new DoorDecl() { + + @Override public String getOpenSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public String getOpenSoundLoop() { return "hbm:door.wgh_big_start"; }; + @Override public String getOpenSoundStart() { return null; }; + @Override public String getCloseSoundStart() { return null; }; + @Override public String getCloseSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public float getSoundVolume() { return 2; } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("Hatch".equals(partName)) { + set(trans, 0, 0.25F * Library.smoothstep(getNormTime(openTicks, 0, 10), 0, 1), 0); + } else { + set(trans, 0, 0, 0); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void getOrigin(String partName, float[] orig) { + if("Hatch".equals(partName)) { + set(orig, 0F, 0.875F, -1.875F); + return; + } + set(orig, 0, 0, 0); + super.getOrigin(partName, orig); + }; + + @Override + @SideOnly(Side.CLIENT) + public void getRotation(String partName, float openTicks, float[] rot) { + if("Hatch".equals(partName)) { + set(rot, Library.smoothstep(getNormTime(openTicks, 20, 100), 0, 1) * -240, 0, 0); + return; + } + super.getRotation(partName, openTicks, rot); + }; + + @Override + @SideOnly(Side.CLIENT) + public boolean doesRender(String partName, boolean child) { + return true; + }; + + @Override public int timeToOpen() { return 60; }; + @Override public int[][] getDoorOpenRanges() { return new int[][] { { 1, 0, 1, -3, 3, 0 }, { 0, 0, 1, -3, 3, 0 }, { -1, 0, 1, -3, 3, 0 } }; } + @Override public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks, 20, 20); }; + + + @Override public int getBlockOffset() { return 2; } + @Override public int[] getDimensions() { return new int[] { 0, 0, 2, 2, 2, 2 }; } + @Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_tex; } + @Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_tex; } + @Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch; } + + }; + public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl() { @Override @@ -948,6 +1007,10 @@ public abstract class DoorDecl { public abstract int[][] getDoorOpenRanges(); public abstract int[] getDimensions(); + + public int getBlockOffset() { + return 0; + } public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks); diff --git a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java index f1a420b5f..90a348e1c 100644 --- a/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java +++ b/src/main/java/com/hbm/tileentity/IUpgradeInfoProvider.java @@ -22,8 +22,10 @@ public interface IUpgradeInfoProvider { public static final String KEY_ACID = "upgrade.acid"; public static final String KEY_BURN = "upgrade.burn"; public static final String KEY_CONSUMPTION = "upgrade.consumption"; + public static final String KEY_COOLANT_CONSUMPTION = "upgrade.coolantConsumption"; public static final String KEY_DELAY = "upgrade.delay"; public static final String KEY_EFFICIENCY = "upgrade.efficiency"; public static final String KEY_FORTUNE = "upgrade.fortune"; + public static final String KEY_OVERHEAT_CHANCE = "upgrade.overheatChance"; public static final String KEY_RANGE = "upgrade.range"; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java index da2a8d8a5..a4645bade 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -7,7 +7,6 @@ import com.hbm.items.machine.ItemMold.Mold; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 3c421facd..1c7fe4c47 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -86,6 +86,12 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public String getName() { return "container.chemplant"; } + + // last successful load + int lsl0 = 0; + int lsl1 = 0; + int lsu0 = 0; + int lsu1 = 0; @Override public void updateEntity() { @@ -98,11 +104,21 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.isProgressing = false; this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); - if(!tanks[0].loadTank(17, 19, slots) && (slots[17] == null || slots[17].getItem() != ModItems.fluid_barrel_infinite)) tanks[0].unloadTank(17, 19, slots); - if(!tanks[1].loadTank(18, 20, slots) && (slots[18] == null || slots[18].getItem() != ModItems.fluid_barrel_infinite)) tanks[1].unloadTank(18, 20, slots); + int fluidDelay = 40; + + if(lsu0 >= fluidDelay && tanks[0].loadTank(17, 19, slots)) lsl0 = 0; + if(lsu1 >= fluidDelay && tanks[1].loadTank(18, 20, slots)) lsl1 = 0; + + if(lsl0 >= fluidDelay && slots[17] != null && !FluidTank.noDualUnload.contains(slots[17].getItem())) if(tanks[0].unloadTank(17, 19, slots)) lsu0 = 0; + if(lsl1 >= fluidDelay && slots[18] != null && !FluidTank.noDualUnload.contains(slots[18].getItem())) if(tanks[1].unloadTank(18, 20, slots)) lsu1 = 0; tanks[2].unloadTank(9, 11, slots); tanks[3].unloadTank(10, 12, slots); + + if(lsl0 < fluidDelay) lsl0++; + if(lsl1 < fluidDelay) lsl1++; + if(lsu0 < fluidDelay) lsu0++; + if(lsu1 < fluidDelay) lsu1++; loadItems(); unloadItems(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index 9d30a9f22..f5a489a8c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.List; import java.util.Map.Entry; +import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityBlackHole; import com.hbm.entity.logic.EntityBalefire; @@ -21,12 +22,15 @@ import com.hbm.inventory.gui.GUIMachineCyclotron; import com.hbm.inventory.recipes.CyclotronRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; @@ -42,14 +46,15 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess { +public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider { public long power; public static final long maxPower = 100000000; - public int consumption = 1000000; + public int consumption = 1_000_000; public boolean isOn; @@ -98,7 +103,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(isOn) { - int defConsumption = consumption - 100000 * getConsumption(); + int defConsumption = consumption - 100_000 * getConsumption(); if(canProcess() && power >= defConsumption) { @@ -111,14 +116,16 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements this.markDirty(); } + int safety = this.getSafety(); + if(coolant.getFill() > 0) { countdown = 0; - if(worldObj.rand.nextInt(3) == 0) + if(worldObj.rand.nextInt(3 * safety) == 0) coolant.setFill(coolant.getFill() - 1); - } else if(worldObj.rand.nextInt(this.getSafety()) == 0) { + } else if(worldObj.rand.nextInt(safety) == 0) { countdown++; @@ -576,4 +583,32 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements return new int[] {6, 7, 8}; } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.EFFECT; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_cyclotron)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level + 1)) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 10) + "%")); + } + if(type == UpgradeType.EFFECT) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_COOLANT_CONSUMPTION, "-" + (100 - 100 / (level + 1)) + "%")); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_OVERHEAT_CHANCE, "-" + (100 - 100 / (level + 1)) + "%")); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.POWER) return 3; + if(type == UpgradeType.EFFECT) return 3; + return 0; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index 87ba3eb7f..04064d367 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -852,7 +852,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_excavator)); if(type == UpgradeType.SPEED) { - info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level / 2 + 1)) + "%")); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 200 / (level + 2)) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); } if(type == UpgradeType.POWER) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java index ee40ccf8f..3a1933554 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineFunnel.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerFunnel; import com.hbm.inventory.gui.GUIFunnel; import com.hbm.tileentity.IGUIProvider; @@ -8,6 +9,7 @@ import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCrafting import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -15,9 +17,15 @@ import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityMachineFunnel extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityMachineFunnel extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { + + public int mode = 0; + public static final int MODE_ALL = 0; + public static final int MODE_3x3 = 1; + public static final int MODE_2x2 = 2; public TileEntityMachineFunnel() { super(18); @@ -37,9 +45,9 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG if(slots[i] != null) { int stacksize = 9; - ItemStack compressed = slots[i].stackSize < 9 ? null : this.getFrom9(slots[i]); + ItemStack compressed = (mode == MODE_2x2 || slots[i].stackSize < 9) ? null : this.getFrom9(slots[i]); if(compressed == null) { - compressed = slots[i].stackSize < 4 ? null : this.getFrom4(slots[i]); + compressed = (mode == MODE_3x3 || slots[i].stackSize < 4) ? null : this.getFrom4(slots[i]); stacksize = 4; } @@ -54,8 +62,20 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG } } } + + this.networkPackNT(15); } } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(this.mode); + } + + @Override + public void deserialize(ByteBuf buf) { + this.mode = buf.readInt(); + } public int[] topAccess = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; public int[] bottomAccess = new int[] { 9, 10, 11, 12, 13, 14, 15, 16, 17 }; @@ -104,6 +124,18 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG } return null; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.mode = nbt.getInteger("mode"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("mode", mode); + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { @@ -115,4 +147,16 @@ public class TileEntityMachineFunnel extends TileEntityMachineBase implements IG public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIFunnel(player.inventory, this); } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + this.mode++; + if(mode > 2) mode = 0; + this.markDirty(); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java index 4fd6d497b..79b60e6b5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarLarge.java @@ -1,12 +1,34 @@ package com.hbm.tileentity.machine; +import java.io.IOException; + +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.lib.Library; +import com.hbm.tileentity.IConfigurableMachine; import com.hbm.util.fauxpointtwelve.DirPos; import net.minecraft.util.AxisAlignedBB; public class TileEntityMachineRadarLarge extends TileEntityMachineRadarNT { + public static int radarLargeRange = 3_000; + + @Override + public String getConfigName() { + return "radar_large"; + } + + @Override + public void readIfPresent(JsonObject obj) { + radarLargeRange = IConfigurableMachine.grab(obj, "I:radarLargeRange", radarLargeRange); + } + + @Override + public void writeConfig(JsonWriter writer) throws IOException { + writer.name("I:radarLargeRange").value(radarLargeRange); + } + @Override public int getRange() { return radarLargeRange; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index 5d04f2aa6..b29d37ea4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -8,7 +8,6 @@ import java.util.function.Function; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; -import com.hbm.config.WeaponConfig; import com.hbm.extprop.HbmLivingProps; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerMachineRadarNT; @@ -19,11 +18,8 @@ import com.hbm.items.ModItems; import com.hbm.items.tool.ItemCoordinateBase; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; -import com.hbm.saveddata.satellites.Satellite.Interfaces; import com.hbm.saveddata.satellites.SatelliteHorizons; import com.hbm.saveddata.satellites.SatelliteLaser; import com.hbm.tileentity.IConfigurableMachine; @@ -40,12 +36,10 @@ import api.hbm.entity.IRadarDetectable; import api.hbm.entity.IRadarDetectableNT; import api.hbm.entity.IRadarDetectableNT.RadarScanParams; import api.hbm.entity.RadarEntry; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -59,7 +53,6 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import net.minecraftforge.common.util.ForgeDirection; /** * Now with SmЯt™ lag-free entity detection! (patent pending) @@ -88,7 +81,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public static int maxPower = 100_000; public static int consumption = 500; public static int radarRange = 1_000; - public static int radarLargeRange = 3_000; public static int radarBuffer = 30; public static int radarAltitude = 55; public static int chunkLoadCap = 10; @@ -109,7 +101,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); consumption = IConfigurableMachine.grab(obj, "L:consumption", consumption); radarRange = IConfigurableMachine.grab(obj, "I:radarRange", radarRange); - radarLargeRange = IConfigurableMachine.grab(obj, "I:radarLargeRange", radarLargeRange); radarBuffer = IConfigurableMachine.grab(obj, "I:radarBuffer", radarBuffer); radarAltitude = IConfigurableMachine.grab(obj, "I:radarAltitude", radarAltitude); chunkLoadCap = IConfigurableMachine.grab(obj, "I:chunkLoadCap", chunkLoadCap); @@ -121,7 +112,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I writer.name("L:powerCap").value(maxPower); writer.name("L:consumption").value(consumption); writer.name("I:radarRange").value(radarRange); - writer.name("I:radarLargeRange").value(radarLargeRange); writer.name("I:radarBuffer").value(radarBuffer); writer.name("I:radarAltitude").value(radarAltitude); writer.name("B:generateChunks").value(generateChunks); @@ -214,6 +204,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I screen.refX = xCoord; screen.refY = yCoord; screen.refZ = zCoord; + screen.range = this.getRange(); screen.linked = true; } } @@ -335,7 +326,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I if(this.power < consumption) return; this.power -= consumption; - int scan = this.scanRange(); + int scan = this.getRange(); RadarScanParams params = new RadarScanParams(this.scanMissiles, this.scanShells, this.scanPlayers, this.smartMode); @@ -401,10 +392,6 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I return 0; } - - protected int scanRange() { - return radarRange; - } @Override public void setPower(long i) { @@ -462,12 +449,9 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I int z = data.getInteger("launchPosZ"); int y = 60; //one day I will make radars transmit Y coordinate as well and you will be butchered alhamdulila worldObj.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); - sat.onCoordAction(world,player,x,y,z); + sat.onCoordAction(world, player, x, y, z); } - } - - } if(link != null && link.getItem() == ModItems.radar_linker) { BlockPos pos = ItemCoordinateBase.getPosition(link); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java index 663b6835a..ba08f0d82 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarScreen.java @@ -21,6 +21,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack public int refX; public int refY; public int refZ; + public int range; public boolean linked; @Override @@ -43,6 +44,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack buf.writeInt(refX); buf.writeInt(refY); buf.writeInt(refZ); + buf.writeInt(range); buf.writeInt(entries.size()); for(RadarEntry entry : entries) entry.toBytes(buf); } @@ -53,6 +55,7 @@ public class TileEntityMachineRadarScreen extends TileEntity implements IBufPack refX = buf.readInt(); refY = buf.readInt(); refZ = buf.readInt(); + range = buf.readInt(); int count = buf.readInt(); this.entries.clear(); for(int i = 0; i < count; i++) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java index 7bbecbc4d..8a1be5c06 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineStrandCaster.java @@ -34,35 +34,34 @@ import net.minecraftforge.common.util.ForgeDirection; //god thank you bob for this base class public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase implements IGUIProvider, ICrucibleAcceptor, ISidedInventory, IFluidStandardTransceiver, INBTPacketReceiver, IInventory { - public FluidTank water; - public FluidTank steam; + public FluidTank water; + public FluidTank steam; - public String getName() { - return "container.machineStrandCaster"; - } + public String getName() { + return "container.machineStrandCaster"; + } - @Override - public String getInventoryName() { - return getName(); - } + @Override + public String getInventoryName() { + return getName(); + } - public TileEntityMachineStrandCaster() { - super(7); - water = new FluidTank(Fluids.WATER, 64_000); - steam = new FluidTank(Fluids.SPENTSTEAM, 64_000); - } + public TileEntityMachineStrandCaster() { + super(7); + water = new FluidTank(Fluids.WATER, 64_000); + steam = new FluidTank(Fluids.SPENTSTEAM, 64_000); + } + @Override + public void updateEntity() { - @Override - public void updateEntity() { + if(!worldObj.isRemote) { - if (!worldObj.isRemote) { - - if (this.lastType != this.type || this.lastAmount != this.amount) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - this.lastType = this.type; - this.lastAmount = this.amount; - } + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } if (this.amount >= this.getCapacity()) { //In case of overfill problems, spit out the excess as scrap @@ -72,262 +71,258 @@ public class TileEntityMachineStrandCaster extends TileEntityFoundryCastingBase worldObj.spawnEntityInWorld(item); } this.amount = this.getCapacity(); + } - } + if(this.amount == 0) { + this.type = null; + } - if (this.amount == 0) { - this.type = null; - } + this.updateConnections(); - this.updateConnections(); + ItemMold.Mold mold = this.getInstalledMold(); - ItemMold.Mold mold = this.getInstalledMold(); + if(canProcess()) { - if (canProcess()) { + int itemsCasted = Math.min(amount / mold.getCost(), 9); - int itemsCasted = Math.min(amount / mold.getCost(), 9); + for(int j = 0; j < itemsCasted; j++) { + this.amount -= mold.getCost(); - for (int j = 0; j < itemsCasted; j++) { - this.amount -= mold.getCost(); + ItemStack out = mold.getOutput(type); - ItemStack out = mold.getOutput(type); + for(int i = 1; i < 7; i++) { + if(slots[i] == null) { + slots[i] = out.copy(); + break; + } - for (int i = 1; i < 7; i++) { - if (slots[i] == null) { - slots[i] = out.copy(); - break; - } + if(slots[i].isItemEqual(out) && slots[i].stackSize + out.stackSize <= out.getMaxStackSize()) { + slots[i].stackSize += out.stackSize; + break; + } - if (slots[i].isItemEqual(out) && slots[i].stackSize + out.stackSize <= out.getMaxStackSize()) { - slots[i].stackSize += out.stackSize; - break; - } + } + } + markChanged(); - } - } - markChanged(); + water.setFill(water.getFill() - getWaterRequired() * itemsCasted); + steam.setFill(steam.getFill() + getWaterRequired() * itemsCasted); + } + } - water.setFill(water.getFill() - getWaterRequired() * itemsCasted); - steam.setFill(steam.getFill() + getWaterRequired() * itemsCasted); - } - } + NBTTagCompound data = new NBTTagCompound(); - NBTTagCompound data = new NBTTagCompound(); + water.writeToNBT(data, "w"); + steam.writeToNBT(data, "s"); - water.writeToNBT(data, "w"); - steam.writeToNBT(data, "s"); + this.networkPack(data, 150); - this.networkPack(data, 150); + } - } + public boolean canProcess() { + ItemMold.Mold mold = this.getInstalledMold(); + if(type != null && mold != null && this.amount >= mold.getCost() * 9 && mold.getOutput(type) != null) { + for(int i = 1; i < 7; i++) { + if(slots[i] == null || slots[i].isItemEqual(mold.getOutput(type)) && slots[i].stackSize + mold.getOutput(type).stackSize <= mold.getOutput(type).getMaxStackSize()) + return water.getFill() >= getWaterRequired() && steam.getFill() < steam.getMaxFill(); - public boolean canProcess() { - ItemMold.Mold mold = this.getInstalledMold(); - if (type != null && mold != null && this.amount >= mold.getCost() * 9 && mold.getOutput(type) != null) { - for (int i = 1; i < 7; i++) { - if (slots[i] == null || slots[i].isItemEqual(mold.getOutput(type)) && slots[i].stackSize + mold.getOutput(type).stackSize <= mold.getOutput(type).getMaxStackSize()) - return water.getFill() >= getWaterRequired() && steam.getFill() < steam.getMaxFill(); + } + } - } - } + return false; + } - return false; - } + public DirPos[] getFluidConPos() { - public DirPos[] getFluidConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + return new DirPos[] { + new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), + new DirPos(xCoord - rot.offsetX - dir.offsetX, yCoord, zCoord - rot.offsetZ - dir.offsetZ, rot.getOpposite()), + new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX * 5, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ * 5, rot), + new DirPos(xCoord - rot.offsetX - dir.offsetX * 5, yCoord, zCoord - rot.offsetZ - dir.offsetZ * 5, rot.getOpposite()) + }; + } - return new DirPos[]{ - new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), - new DirPos(xCoord - rot.offsetX - dir.offsetX, yCoord, zCoord - rot.offsetZ - dir.offsetZ, rot.getOpposite()), - new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX * 5, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ * 5, rot), - new DirPos(xCoord - rot.offsetX - dir.offsetX * 5, yCoord, zCoord - rot.offsetZ + dir.offsetZ * 5, rot.getOpposite()), - }; - } + public int[][] getMetalPourPos() { - public int[][] getMetalPourPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + return new int[][] { + new int[] { xCoord + rot.offsetX - dir.offsetX, yCoord + 2, zCoord + rot.offsetZ - dir.offsetZ }, + new int[] { xCoord - dir.offsetX, yCoord + 2, zCoord - dir.offsetZ }, + new int[] { xCoord + rot.offsetX, yCoord + 2, zCoord + rot.offsetZ }, + new int[] { xCoord, yCoord + 2, zCoord } + }; + } - return new int[][]{ - new int[]{xCoord + rot.offsetX - dir.offsetX, yCoord + 2, zCoord + rot.offsetZ - dir.offsetZ}, - new int[]{xCoord - dir.offsetX, yCoord + 2, zCoord - dir.offsetZ}, - new int[]{xCoord + rot.offsetX, yCoord + 2, zCoord + rot.offsetZ}, - new int[]{xCoord, yCoord + 2, zCoord}, - }; - } + @Override + public ItemMold.Mold getInstalledMold() { + if(slots[0] == null) + return null; - @Override - public ItemMold.Mold getInstalledMold() { - if (slots[0] == null) return null; + if(slots[0].getItem() == ModItems.mold) { + return ((ItemMold) slots[0].getItem()).getMold(slots[0]); + } - if (slots[0].getItem() == ModItems.mold) { - return ((ItemMold) slots[0].getItem()).getMold(slots[0]); - } + return null; + } - return null; - } + @Override + public int getMoldSize() { + return getInstalledMold().size; + } - @Override - public int getMoldSize() { - return getInstalledMold().size; - } + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { - @Override - public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, Mats.MaterialStack stack) { + if(side != ForgeDirection.UP) + return false; + for(int[] pos : getMetalPourPos()) { + if(pos[0] == x && pos[1] == y && pos[2] == z) { + return this.standardCheck(world, x, y, z, side, stack); + } + } + return false; - if (side != ForgeDirection.UP) return false; - for (int[] pos : getMetalPourPos()) { - if (pos[0] == x && pos[1] == y && pos[2] == z) { - return this.standardCheck(world, x, y, z, side, stack); - } - } - return false; + } - } + @Override + public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { + if(this.type != null && this.type != stack.material) return false; + return !(this.amount >= this.getCapacity() || getInstalledMold() == null); + } - @Override - public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, Mats.MaterialStack stack) { - if (this.type != null && this.type != stack.material) return false; - return !(this.amount >= this.getCapacity() || getInstalledMold() == null); - } + @Override + public int getCapacity() { + ItemMold.Mold mold = this.getInstalledMold(); + return mold == null ? 50000 : mold.getCost() * 10; + } - @Override - public int getCapacity() { - ItemMold.Mold mold = this.getInstalledMold(); - return mold == null ? 50000 : mold.getCost() * 10; - } + private int getWaterRequired() { + return getInstalledMold() != null ? 5 * getInstalledMold().getCost() : 50; + } - private int getWaterRequired() { - return getInstalledMold() != null ? 5 * getInstalledMold().getCost() : 50; - } + private void updateConnections() { + for(DirPos pos : getFluidConPos()) { + this.trySubscribe(water.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.sendFluid(steam, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } - private void updateConnections() { - for (DirPos pos : getFluidConPos()) { - this.trySubscribe(water.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - } - for (DirPos pos : getFluidConPos()) { - sendFluid(steam, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); - } - } + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] { steam }; + } - @Override - public FluidTank[] getSendingTanks() { - return new FluidTank[]{steam}; - } + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] { water }; + } - @Override - public FluidTank[] getReceivingTanks() { - return new FluidTank[]{water}; - } + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam }; + } - @Override - public FluidTank[] getAllTanks() { - return new FluidTank[]{water, steam}; - } + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerMachineStrandCaster(player.inventory, this); + } - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerMachineStrandCaster(player.inventory, this); - } + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIMachineStrandCaster(player.inventory, this); + } - @Override - @SideOnly(Side.CLIENT) - public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineStrandCaster(player.inventory, this); - } + public void networkPack(NBTTagCompound nbt, int range) { + if(!worldObj.isRemote) + PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + } - public void networkPack(NBTTagCompound nbt, int range) { - if (!worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); - } + @Override + public void networkUnpack(NBTTagCompound nbt) { + water.readFromNBT(nbt, "w"); + steam.readFromNBT(nbt, "s"); - @Override - public void networkUnpack(NBTTagCompound nbt) { - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); + } - } + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + water.writeToNBT(nbt, "w"); + steam.writeToNBT(nbt, "s"); + } - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - water.writeToNBT(nbt, "w"); - steam.writeToNBT(nbt, "s"); - } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + water.readFromNBT(nbt, "w"); + steam.readFromNBT(nbt, "s"); + } - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - water.readFromNBT(nbt, "w"); - steam.readFromNBT(nbt, "s"); - } + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { - @Override - public boolean isItemValidForSlot(int i, ItemStack stack) { + if(i == 0) { + return stack.getItem() == ModItems.mold; + } - if (i == 0) { - return stack.getItem() == ModItems.mold; - } + return false; + } - return false; - } + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() { - return 65536.0D; - } + @Override + public int[] getAccessibleSlotsFromSide(int meta) { + return new int[] { 1, 2, 3, 4, 5, 6 }; + } - @Override - public int[] getAccessibleSlotsFromSide(int meta) { - return new int[]{1, 2, 3, 4, 5, 6}; - } + public void markChanged() { + this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); + } - public void markChanged() { - this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); - } + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { + return false; + } else { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 128; + } + } - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { - return false; - } else { - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 128; - } - } + @Override + public boolean canInsertItem(int slot, ItemStack itemStack, int side) { + return this.isItemValidForSlot(slot, itemStack); + } + @Override + public boolean canExtractItem(int slot, ItemStack itemStack, int side) { + return !this.isItemValidForSlot(slot, itemStack); + } - @Override - public boolean canInsertItem(int slot, ItemStack itemStack, int side) { - return this.isItemValidForSlot(slot, itemStack); - } + AxisAlignedBB bb = null; - @Override - public boolean canExtractItem(int slot, ItemStack itemStack, int side) { - return !this.isItemValidForSlot(slot, itemStack); - } - - AxisAlignedBB bb = null; - - @Override - public AxisAlignedBB getRenderBoundingBox() { - - if (bb == null) { - bb = AxisAlignedBB.getBoundingBox( - xCoord - 7, - yCoord, - zCoord - 7, - xCoord + 7, - yCoord + 3, - zCoord + 7 - ); - } - return bb; - } + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 7, + yCoord, + zCoord - 7, + xCoord + 7, + yCoord + 3, + zCoord + 7); + } + return bb; + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 5076c1fd6..d89423eae 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4299,6 +4299,10 @@ tile.ore_random.name=%s-Erz tile.ore_rare.name=Seltenerden-Erz tile.ore_reiium.name=Reiit tile.ore_schrabidium.name=Schrabidiumerz +tile.ore_sellafield_diamond.name=Sellafit-Diamanterz +tile.ore_sellafield_emerald.name=Sellafit-Smaragderz +tile.ore_sellafield_schrabidium.name=Sellafit-Schrabidiumerz +tile.ore_sellafield_uranium_scorched.name=Verschmortes Sellafit-Uranerz tile.ore_sulfur.name=Schwefelerz tile.ore_tektite_osmiridium.name=Osmiridiumreiches Tektit tile.ore_thorium.name=Thoriumerz diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index e8a6504bc..2d45971c6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1004,7 +1004,11 @@ desc.item.kitArmor=Armor will be displaced by new set. desc.item.kitHaz=Armor will be displaced by hazmat suit. desc.item.kitPack=What a bargain! desc.item.kitPool=Please empty inventory before opening! -desc.item.pileRod=§eUse on drilled graphite to insert$§eUse screwdriver to extract$ +desc.item.pileRod=§eUse on drilled graphite to insert$§eUse screwdriver to extract$ +desc.item.pipette.corrosive=Can handle corrosive liquids. +desc.item.pipette.laboratory=Now with 50x more precision! +desc.item.pipette.noCorrosive=§eCannot handle corrosive liquids. +desc.item.pipette.noEmpty=§ePipette not empty! desc.item.rtgDecay=Decays to: %s desc.item.rtgHeat=Power Level: %s desc.item.storage.capacity=Capacity %s%%s @@ -3646,6 +3650,9 @@ item.powder_xe135_tiny.name=Tiny Pile of Xenon-135 Powder item.powder_yellowcake.name=Yellowcake item.powder_zirconium.name=Zirconium Powder item.power_net_tool.name=Cable Network Analysis Tool +item.pipette.name=Pipette +item.pipette_boron.name=Boron Pipette +item.pipette_laboratory.name=Laboratory Grade Pipette item.primer_357.name=.357 Magnum Primer (x24) item.primer_44.name=.44 Magnum Primer (x24) item.primer_50.name=Large Caliber Primer (x12) @@ -3669,8 +3676,8 @@ item.pwr_fuel.men.name=MEN PWR Fuel Rod item.pwr_fuel.mep.name=MEP PWR Fuel Rod item.pwr_fuel.meu.name=MEU PWR Fuel Rod item.pwr_fuel.mox.name=MOX PWR Fuel Rod -item.pwr_fuel_depleted.bfb_am_mix.name=Depleted Fuel Grade Americium PWR ZFB Rod -item.pwr_fuel_depleted.bfb_pu241.name=Depleted Plutonium-241 PWR ZFB Rod +item.pwr_fuel_depleted.bfb_am_mix.name=Depleted Fuel Grade Americium PWR BFB Rod +item.pwr_fuel_depleted.bfb_pu241.name=Depleted Plutonium-241 PWR BFB Rod item.pwr_fuel_depleted.hea242.name=Depleted HEA-242 PWR Fuel Rod item.pwr_fuel_depleted.hen237.name=Depleted HEN-237 PWR Fuel Rod item.pwr_fuel_depleted.hep239.name=Depleted HEP-239 PWR Fuel Rod @@ -3684,8 +3691,8 @@ item.pwr_fuel_depleted.men.name=Depleted MEN PWR Fuel Rod item.pwr_fuel_depleted.mep.name=Depleted MEP PWR Fuel Rod item.pwr_fuel_depleted.meu.name=Depleted MEU PWR Fuel Rod item.pwr_fuel_depleted.mox.name=Depleted MOX PWR Fuel Rod -item.pwr_fuel_hot.bfb_am_mix.name=Hot Fuel Grade Americium PWR ZFB Rod -item.pwr_fuel_hot.bfb_pu241.name=Hot Plutonium-241 PWR ZFB Rod +item.pwr_fuel_hot.bfb_am_mix.name=Hot Fuel Grade Americium PWR BFB Rod +item.pwr_fuel_hot.bfb_pu241.name=Hot Plutonium-241 PWR BFB Rod item.pwr_fuel_hot.hea242.name=Hot HEA-242 PWR Fuel Rod item.pwr_fuel_hot.hen237.name=Hot HEN-237 PWR Fuel Rod item.pwr_fuel_hot.hep239.name=Hot HEP-239 PWR Fuel Rod @@ -5291,6 +5298,10 @@ tile.ore_random.name=%s Ore tile.ore_rare.name=Rare Earth Ore tile.ore_reiium.name=Reiite tile.ore_schrabidium.name=Schrabidium Ore +tile.ore_sellafield_diamond.name=Sellafite Diamond Ore +tile.ore_sellafield_emerald.name=Sellafite Emerald Ore +tile.ore_sellafield_schrabidium.name=Sellafite Schrabidium Ore +tile.ore_sellafield_uranium_scorched.name=Scorched Sellafite Uranium Ore tile.ore_sulfur.name=Sulfur Ore tile.ore_tektite_osmiridium.name=Osmiridium-Infused Tektite tile.ore_thorium.name=Thorium Ore @@ -5657,9 +5668,11 @@ turret.players=Target Players: %s upgrade.acid=Acid required %s upgrade.burn=Burn %smb/t for %sHE upgrade.consumption=Consumption %s +upgrade.coolantConsumption=Coolant Consumption %s upgrade.delay=Process time %s upgrade.efficiency=Efficiency %s upgrade.fortune=Fortune %s +upgrade.overheatChance=Overheat chance %s upgrade.range=Range %s upgrade.gui.title=§lAcceptable Upgrades:§r diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 82de31e27..cda7cdfa9 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -1463,6 +1463,8 @@ upgrade.delay=Время %s upgrade.efficiency=Эффективность %s upgrade.fortune=Удача %s upgrade.range=Радиус %s +upgrade.coolantConsumption=Потребление охладителя %s +upgrade.overheatChance=Шанс перегрева %s upgrade.gui.title=§lПринимаемые улучшения:§r upgrade.gui.afterburner= * §dФорсаж§r: Стакается до %s уровней @@ -1790,6 +1792,7 @@ tile.turret_tau.name=Турель с тау-пушкой tile.turret_spitfire.name=Турель без названия [WIP] tile.turret_cwis.name=”Фэленкс” Mk-15 CIWS tile.turret_cheapo.name=Дешёвая пулемётная турель +tile.machine_radar_large.name=Большой радар tile.machine_radar.name=Радар container.radar=Радар item.radar_linker.name=Радарный соединитель @@ -1985,8 +1988,8 @@ tile.machine_excavator.name=Большой горный бур tile.machine_assembler.name=Сборочная машина container.assembler=Сборочная машина tile.machine_assemfac.name=Сборочный завод -tile.machine_autocrafter.name=Стол автокрафта -container.autocrafter=Стол автокрафта +tile.machine_autocrafter.name=Автоматический верстак +container.autocrafter=Автоматический верстак container.machineFunnel=Комбинаторная воронка tile.machine_funnel.name=Комбинаторная воронка tile.machine_funnel.descАвтоматически сжимает предметы в сетке 2x2 или 3x3 для крафтинга$Верх: Вход$Низ: Выход$Бок: Выход для очистки ингредиентов @@ -2130,6 +2133,8 @@ tile.machine_liquefactor.desc=Мощная машина для превраще container.machineSolidifier=Отвердитель tile.machine_solidifier.name=Промышленный отвердитель tile.machine_solidifier.desc=Универсальная машина, оснащенная системами охлаждения и другими$универсальными инструментами для превращения жидкостей в твердые вещества с использованием различных$процессов, таких как замораживание и нефтехимическая полимеризация. +container.machineStrandCaster=Машина непрерывного литья заготовок +tile.machine_strand_caster.name=Машина непрерывного литья заготовок tile.conveyor.name=Конвейер tile.conveyor.desc=Moves items dropped on it$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend @@ -3191,6 +3196,10 @@ tile.ore_cobalt.name=Кобальтовая руда tile.stone_porous.name=Пористый камень tile.ore_random.name=Руда %s tile.ore_bedrock.name=Бедроковая руда +tile.ore_sellafield_diamond.name=Селлафитовая алмазная руда +tile.ore_sellafield_emerald.name=Селлафитовая изумрудная руда +tile.ore_sellafield_schrabidium.name=Селлафитовая шрабидиевая руда +tile.ore_sellafield_uranium_scorched.name=Обожженная селлафитовая урановая руда item.ore.asbestos=Асбестовая item.ore.borax=Буровая @@ -3816,6 +3825,14 @@ item.fluid_barrel_full.name=Жидкостная бочка: item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов item.fluid_tank_lead_full.name=Резервуар с опасными материалами: item.fluid_barrel_infinite.name=Бесконечная жидкостная бочка +desc.item.pileRod=§eПКМ по просверленному графиту для вставки$§eПКМ отвёрткой чтобы извлечь$ +desc.item.pipette.corrosive=Может работать с коррозийными жидкостями. +desc.item.pipette.laboratory=Теперь с 50-кратной точностью! +desc.item.pipette.noCorrosive=§eНе может работать с коррозийными жидкостями. +desc.item.pipette.noEmpty=§eПипетка не пуста! +item.pipette.name=Пипетка +item.pipette_boron.name=Борная пипетка +item.pipette_laboratory.name=Лабораторная пипетка item.rod_of_discord.name=Жезл раздора item.rod_empty.name=Пустой стержень diff --git a/src/main/resources/assets/hbm/models/doors/silo_hatch.obj b/src/main/resources/assets/hbm/models/doors/silo_hatch.obj new file mode 100644 index 000000000..e500f7adf --- /dev/null +++ b/src/main/resources/assets/hbm/models/doors/silo_hatch.obj @@ -0,0 +1,344 @@ +# Blender v2.79 (sub 0) OBJ File: 'silo_hatch.blend' +# www.blender.org +o Hatch +v -1.750000 0.750000 1.750000 +v 1.750000 0.750000 1.750000 +v -1.750000 0.750000 -1.750000 +v 1.750000 0.750000 -1.750000 +v -1.750000 1.000000 -1.750000 +v -1.750000 1.000000 1.750000 +v 1.750000 1.000000 1.750000 +v 1.750000 1.000000 -1.750000 +v -1.500000 0.750000 -1.500000 +v -1.500000 0.750000 1.500000 +v 1.500000 0.750000 1.500000 +v 1.500000 0.750000 -1.500000 +v -1.500000 0.500000 -1.500000 +v -1.500000 0.500000 1.500000 +v 1.500000 0.500000 1.500000 +v 1.500000 0.500000 -1.500000 +v -1.000000 0.750000 -1.500000 +v 1.000000 0.750000 -1.500000 +v -1.000000 0.750000 -2.000000 +v 1.000000 0.750000 -2.000000 +v -1.000000 0.500000 -2.000000 +v -1.000000 0.500000 -1.500000 +v 1.000000 0.500000 -1.500000 +v 1.000000 0.500000 -2.000000 +vt 0.588235 0.333333 +vt 0.970588 0.309524 +vt 1.000000 0.333333 +vt 1.000000 0.357143 +vt 0.588235 0.690476 +vt 0.588235 0.357143 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 1.000000 0.333333 +vt 0.588235 0.357143 +vt 0.588235 0.333333 +vt 0.970588 0.309524 +vt 0.970588 0.309524 +vt 0.970588 0.309524 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.617647 0.309524 +vt 0.970588 0.285714 +vt 0.970588 0.000000 +vt 0.617647 0.285714 +vt 0.617647 -0.000000 +vt 0.852941 0.809524 +vt 0.617647 0.761905 +vt 0.852941 0.761905 +vt 0.617647 0.738095 +vt 0.852941 0.690476 +vt 0.852941 0.738095 +vt 0.558824 0.761905 +vt 0.911765 0.738095 +vt 0.911765 0.761905 +vt 1.000000 0.690476 +vt 1.000000 0.357143 +vt 1.000000 0.357143 +vt 1.000000 0.357143 +vt 0.617647 0.285714 +vt 0.617647 0.285714 +vt 0.617647 0.285714 +vt 0.617647 0.809524 +vt 0.617647 0.690476 +vt 0.558824 0.738095 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 1/1/1 11/2/1 2/3/1 +f 7/4/2 5/5/2 6/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/3/4 6/6/4 1/1/4 +f 4/10/5 7/11/5 2/12/5 +f 1/13/6 5/14/6 3/15/6 +f 2/12/1 12/16/1 4/10/1 +f 4/9/1 9/17/1 3/7/1 +f 3/15/1 10/18/1 1/13/1 +f 11/19/5 16/20/5 12/16/5 +f 9/21/6 14/22/6 10/18/6 +f 12/23/3 13/24/3 9/17/3 +f 10/25/4 15/26/4 11/2/4 +f 16/27/1 14/28/1 13/29/1 +f 17/30/2 20/31/2 19/32/2 +f 24/33/1 22/34/1 21/35/1 +f 18/36/5 24/33/5 20/31/5 +f 20/31/3 21/35/3 19/32/3 +f 19/32/6 22/37/6 17/38/6 +f 1/1/1 10/25/1 11/2/1 +f 7/4/2 8/39/2 5/5/2 +f 3/7/3 5/40/3 8/8/3 +f 2/3/4 7/4/4 6/6/4 +f 4/10/5 8/41/5 7/11/5 +f 1/13/6 6/42/6 5/14/6 +f 2/12/1 11/19/1 12/16/1 +f 4/9/1 12/23/1 9/17/1 +f 3/15/1 9/21/1 10/18/1 +f 11/19/5 15/43/5 16/20/5 +f 9/21/6 13/44/6 14/22/6 +f 12/23/3 16/45/3 13/24/3 +f 10/25/4 14/28/4 15/26/4 +f 16/27/1 15/26/1 14/28/1 +f 17/30/2 18/46/2 20/31/2 +f 24/33/1 23/47/1 22/34/1 +f 18/36/5 23/48/5 24/33/5 +f 20/31/3 24/33/3 21/35/3 +f 19/32/6 21/35/6 22/37/6 +o Frame +v -2.500000 0.000000 2.500000 +v 2.500000 0.000000 2.500000 +v -2.500000 0.000000 -2.500000 +v 2.500000 0.000000 -2.500000 +v -2.500000 0.250000 2.500000 +v 2.500000 0.250000 2.500000 +v -2.500000 0.250000 -2.500000 +v 2.500000 0.250000 -2.500000 +v -2.250000 1.000000 2.250000 +v 2.250000 1.000000 2.250000 +v -2.250000 1.000000 -2.250000 +v 2.250000 1.000000 -2.250000 +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.750000 -1.500000 +v -1.500000 0.750000 1.500000 +v 1.500000 0.750000 1.500000 +v 1.500000 0.750000 -1.500000 +v -1.750000 0.750000 1.750000 +v 1.750000 0.750000 1.750000 +v -1.750000 0.750000 -1.750000 +v 1.750000 0.750000 -1.750000 +v -1.750000 1.000000 1.750000 +v 1.750000 1.000000 1.750000 +v -1.750000 1.000000 -1.750000 +v 1.750000 1.000000 -1.750000 +v -1.000000 0.750000 -1.750000 +v 1.000000 0.750000 -1.750000 +v 1.000000 0.500000 -1.500000 +v -1.000000 0.500000 -1.500000 +v -1.000000 1.000000 -1.750000 +v 1.000000 1.000000 -1.750000 +v -1.000000 1.000000 -2.000000 +v 1.000000 1.000000 -2.000000 +v -1.000000 0.500000 -2.000000 +v 1.000000 0.500000 -2.000000 +v -1.000000 0.750000 -1.500000 +v 1.000000 0.750000 -1.500000 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.176471 0.809524 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt -0.000000 0.500000 +vt 0.588235 0.476190 +vt 0.000000 0.500000 +vt 0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.500000 +vt -0.000000 0.476190 +vt 0.588235 0.476190 +vt -0.000000 0.500000 +vt -0.000000 0.476190 +vt 0.470588 0.380952 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.588235 0.500000 +vt 0.029412 0.571429 +vt 0.000000 0.000000 +vt 0.117647 0.380952 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.833333 +vt 0.117647 0.761905 +vt 0.470588 0.761905 +vt 0.470588 0.095238 +vt 0.588235 0.000000 +vt 0.117647 0.095238 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.176471 0.857143 +vt 0.117647 0.833333 +vt 0.176471 0.833333 +vt 0.088235 0.857143 +vt 0.117647 0.833333 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.857143 +vt 0.088235 0.880952 +vt 0.500000 0.619048 +vt 0.558824 0.571429 +vt 0.500000 0.952381 +vt 0.558824 1.000000 +vt 0.176471 0.928571 +vt 0.411765 0.976190 +vt 0.176471 0.976190 +vt 0.088235 0.619048 +vt 0.029412 1.000000 +vt 0.176471 0.880952 +vt 0.411765 0.928571 +vt 0.117647 0.928571 +vt 0.117647 0.904762 +vt 0.147059 0.904762 +vt 0.176471 0.880952 +vt 0.088235 0.857143 +vt 0.500000 0.857143 +vt 0.411765 0.880952 +vt 0.411765 0.857143 +vt 0.470588 0.833333 +vt 0.411765 0.833333 +vt 0.441176 0.904762 +vt 0.470588 0.928571 +vt 0.411765 0.809524 +vt 0.558824 0.571429 +vt 0.558824 0.571429 +vt 0.558824 0.571429 +vt 0.500000 0.880952 +vt 0.500000 0.880952 +vt 0.500000 0.880952 +vt 0.088235 0.952381 +vt 0.411765 0.880952 +vt 0.147059 0.880952 +vt 0.088235 0.880952 +vt 0.500000 0.880952 +vt 0.176471 0.952381 +vt 0.411765 0.952381 +vt 0.441176 0.880952 +vt 0.470588 0.904762 +vn 0.0000 0.0000 1.0000 +vn 0.9487 0.3162 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 -1.0000 0.0000 +vn -0.9487 0.3162 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 0.3162 0.9487 +vn 0.0000 1.0000 0.0000 +s off +f 39/49/7 40/50/7 56/51/7 +f 32/52/8 34/53/8 30/54/8 +f 26/55/7 29/56/7 25/57/7 +f 28/58/9 30/54/9 26/59/9 +f 25/60/10 31/61/10 27/62/10 +f 27/63/11 32/64/11 28/65/11 +f 25/57/12 38/66/12 26/55/12 +f 29/67/13 35/68/13 31/61/13 +f 31/69/14 36/70/14 32/64/14 +f 30/71/15 33/72/15 29/56/15 +f 27/73/12 37/74/12 25/57/12 +f 42/75/11 38/76/11 37/77/11 +f 43/78/10 40/79/10 38/80/10 +f 41/81/9 37/82/9 39/83/9 +f 26/55/12 40/84/12 28/85/12 +f 28/85/12 39/86/12 27/73/12 +f 42/75/16 46/87/16 43/88/16 +f 43/78/16 48/89/16 44/90/16 +f 53/91/16 41/92/16 63/93/16 +f 41/81/16 45/94/16 42/95/16 +f 45/96/11 50/97/11 46/87/11 +f 46/98/10 52/99/10 48/89/10 +f 47/100/9 49/101/9 45/94/9 +f 50/102/16 33/72/16 34/103/16 +f 52/104/16 34/103/16 36/105/16 +f 61/106/7 60/107/7 59/108/7 +f 49/109/16 35/110/16 33/72/16 +f 56/111/16 62/112/16 61/106/16 +f 59/113/9 57/114/9 53/115/9 +f 57/116/7 47/117/7 53/91/7 +f 48/118/7 58/119/7 54/120/7 +f 35/110/16 60/107/16 36/105/16 +f 44/121/16 54/120/16 64/122/16 +f 54/123/10 60/124/10 62/112/10 +f 63/93/7 41/92/7 56/51/7 +f 41/92/7 39/49/7 56/51/7 +f 40/50/7 44/121/7 55/125/7 +f 44/121/7 64/122/7 55/125/7 +f 40/50/7 55/125/7 56/51/7 +f 32/52/8 36/126/8 34/53/8 +f 26/55/7 30/71/7 29/56/7 +f 28/58/9 32/52/9 30/54/9 +f 25/60/10 29/67/10 31/61/10 +f 27/63/11 31/69/11 32/64/11 +f 25/57/12 37/74/12 38/66/12 +f 29/67/13 33/127/13 35/68/13 +f 31/69/14 35/128/14 36/70/14 +f 30/71/15 34/103/15 33/72/15 +f 27/73/12 39/86/12 37/74/12 +f 42/75/11 43/88/11 38/76/11 +f 43/78/10 44/90/10 40/79/10 +f 41/81/9 42/95/9 37/82/9 +f 26/55/12 38/66/12 40/84/12 +f 28/85/12 40/84/12 39/86/12 +f 42/75/16 45/96/16 46/87/16 +f 43/78/16 46/98/16 48/89/16 +f 53/91/16 47/117/16 41/92/16 +f 41/81/16 47/100/16 45/94/16 +f 45/96/11 49/129/11 50/97/11 +f 46/98/10 50/130/10 52/99/10 +f 47/100/9 51/131/9 49/101/9 +f 50/102/16 49/109/16 33/72/16 +f 52/104/16 50/102/16 34/103/16 +f 61/106/7 62/112/7 60/107/7 +f 49/109/16 51/132/16 35/110/16 +f 56/111/16 55/133/16 62/112/16 +f 63/134/9 56/111/9 53/115/9 +f 56/111/9 61/106/9 53/115/9 +f 61/106/9 59/113/9 53/115/9 +f 57/116/7 51/135/7 47/117/7 +f 48/118/7 52/136/7 58/119/7 +f 35/110/16 51/132/16 59/108/16 +f 51/132/16 57/137/16 59/108/16 +f 58/138/16 52/104/16 60/107/16 +f 52/104/16 36/105/16 60/107/16 +f 35/110/16 59/108/16 60/107/16 +f 44/121/16 48/118/16 54/120/16 +f 55/133/10 64/139/10 54/123/10 +f 54/123/10 58/140/10 60/124/10 +f 62/112/10 55/133/10 54/123/10 diff --git a/src/main/resources/assets/hbm/models/machines/strand_caster.obj b/src/main/resources/assets/hbm/models/machines/strand_caster.obj index 2a009d538..eb3b63b98 100644 --- a/src/main/resources/assets/hbm/models/machines/strand_caster.obj +++ b/src/main/resources/assets/hbm/models/machines/strand_caster.obj @@ -1,11 +1,55 @@ -# Blender 3.6.1 +# Blender v2.79 (sub 0) OBJ File: 'strand_caster.blend' # www.blender.org -mtllib strand_caster.mtl +o plate +v -0.500000 0.937500 -1.500000 +v 0.500000 0.937500 -1.500000 +v -0.500000 0.937500 -5.250000 +v 0.500000 0.937500 -5.250000 +v -0.500000 1.062500 -5.250000 +v -0.500000 1.062500 -1.500000 +v 0.500000 1.062500 -1.500000 +v 0.500000 1.062500 -5.250000 +vt 0.890625 0.566667 +vt 0.656250 0.700000 +vt 0.656250 0.566667 +vt 0.656250 0.566667 +vt 0.890625 0.700000 +vt 0.656250 0.700000 +vt 0.664062 0.700000 +vt 0.656250 0.566667 +vt 0.664062 0.566667 +vt 0.890625 0.683333 +vt 0.656250 0.700000 +vt 0.656250 0.683333 +vt 0.656250 0.583333 +vt 0.890625 0.566667 +vt 0.890625 0.583333 +vt 0.890625 0.700000 +vt 0.890625 0.566667 +vt 0.656250 0.700000 +vt 0.890625 0.700000 +vt 0.656250 0.566667 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +s off +f 3/1/1 2/2/1 1/3/1 +f 7/4/2 5/5/2 6/6/2 +f 3/7/3 8/8/3 4/9/3 +f 4/10/4 7/11/4 2/12/4 +f 1/13/5 5/14/5 3/15/5 +f 3/1/1 4/16/1 2/2/1 +f 7/4/2 8/17/2 5/5/2 +f 3/7/3 5/18/3 8/8/3 +f 4/10/4 8/19/4 7/11/4 +f 1/13/5 6/20/5 5/14/5 o caster v -1.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 -v -1.000000 -0.000000 -6.000000 -v 1.000000 -0.000000 -6.000000 +v -1.000000 0.000000 -6.000000 +v 1.000000 0.000000 -6.000000 v -1.000000 0.750000 -6.000000 v -1.000000 0.750000 1.000000 v 1.000000 0.750000 1.000000 @@ -32,12 +76,14 @@ v -0.750000 2.000000 -0.750000 v 0.750000 2.000000 -0.750000 v -0.750000 0.500000 -1.500000 v -0.750000 0.500000 0.750000 +v 0.750000 0.500000 0.750000 v 0.750000 0.500000 -1.500000 v -0.750000 0.750000 -5.750000 v -0.750000 0.750000 0.750000 v 0.750000 0.750000 0.750000 v 0.750000 0.750000 -5.750000 v -0.750000 0.500000 -5.750000 +v -0.750000 0.500000 0.750000 v 0.750000 0.500000 0.750000 v 0.750000 0.500000 -5.750000 v 0.750000 1.250000 -1.500000 @@ -266,8 +312,8 @@ v 0.750000 0.750000 -0.125000 v 0.750000 2.000000 -0.125000 v 0.838388 0.750000 -0.088388 v 0.838388 2.000000 -0.088388 -v 0.875000 0.750000 -0.000000 -v 0.875000 2.000000 -0.000000 +v 0.875000 0.750000 0.000000 +v 0.875000 2.000000 0.000000 v 0.838388 0.750000 0.088388 v 0.838388 2.000000 0.088388 v 0.750000 0.750000 0.125000 @@ -298,8 +344,8 @@ v -0.750000 0.750000 0.125000 v -0.750000 2.000000 0.125000 v -0.838388 0.750000 0.088388 v -0.838388 2.000000 0.088388 -v -0.875000 0.750000 -0.000000 -v -0.875000 2.000000 -0.000000 +v -0.875000 0.750000 0.000000 +v -0.875000 2.000000 0.000000 v -0.838388 0.750000 -0.088388 v -0.838388 2.000000 -0.088388 v -0.750000 0.750000 0.375000 @@ -322,49 +368,6 @@ v -0.875000 0.750000 -0.500000 v -0.875000 2.000000 -0.500000 v -0.838388 0.750000 -0.588388 v -0.838388 2.000000 -0.588388 -vn -0.0000 -1.0000 -0.0000 -vn -0.0000 1.0000 -0.0000 -vn -0.0000 -0.0000 -1.0000 -vn -0.0000 -0.0000 1.0000 -vn 1.0000 -0.0000 -0.0000 -vn -1.0000 -0.0000 -0.0000 -vn -0.0000 0.7071 -0.7071 -vn -0.0000 -0.7071 0.7071 -vn -0.0000 -0.7071 -0.7071 -vn -0.0000 0.7071 0.7071 -vn -0.7311 0.2611 0.6303 -vn -0.9955 -0.0000 -0.0949 -vn -0.9947 -0.0393 -0.0948 -vn -0.6333 -0.2962 -0.7150 -vn -0.0000 -0.3827 -0.9239 -vn 0.6333 -0.2962 -0.7150 -vn 0.9955 -0.0000 -0.0949 -vn 0.7311 0.2611 0.6303 -vn 0.9947 -0.0393 -0.0948 -vn -0.6630 -0.0000 -0.7486 -vn 0.6630 -0.0000 -0.7486 -vn 0.6794 0.4063 -0.6110 -vn 0.9987 0.0196 -0.0473 -vn 0.7574 -0.0000 0.6530 -vn -0.9987 0.0196 -0.0473 -vn -0.7263 -0.3800 0.5728 -vn -0.7574 -0.0000 0.6530 -vn -0.6794 0.4063 -0.6110 -vn -0.0000 -0.5562 0.8311 -vn 0.7263 -0.3800 0.5728 -vn 0.7071 -0.5000 0.5000 -vn -0.7071 -0.5000 0.5000 -vn -0.0000 0.5628 -0.8266 -vn -0.7071 0.5000 -0.5000 -vn 0.3827 -0.0000 -0.9239 -vn 0.7071 -0.0000 -0.7071 -vn 0.7071 -0.0000 0.7071 -vn 0.3827 -0.0000 0.9239 -vn -0.3827 -0.0000 0.9239 -vn -0.7071 -0.0000 0.7071 -vn -0.7071 -0.0000 -0.7071 -vn -0.3827 -0.0000 -0.9239 -vn 0.7071 0.5000 -0.5000 vt 0.484375 0.100000 vt 0.046875 0.366667 vt 0.046875 0.100000 @@ -379,13 +382,34 @@ vt 0.484375 -0.000000 vt 0.656250 0.600000 vt 0.531250 0.466667 vt 0.656250 0.466667 +vt 0.656250 0.466667 +vt 0.531250 0.600000 +vt 0.531250 0.466667 +vt 0.531250 0.466667 +vt 0.656250 0.600000 vt 0.531250 0.600000 vt 0.531250 0.200000 +vt 0.656250 0.466667 +vt 0.656250 0.600000 +vt 0.531250 0.466667 +vt 0.656250 0.466667 vt 0.539062 0.616667 +vt 0.531250 0.600000 vt 0.648438 0.616667 vt 0.539062 0.733333 +vt 0.539062 0.616667 +vt 0.656250 0.600000 +vt 0.539062 0.616667 +vt 0.539062 0.616667 +vt 0.531250 0.600000 +vt 0.539062 0.733333 vt 0.648438 0.966667 vt 0.539062 0.966667 +vt 0.648438 0.616667 +vt 0.539062 0.733333 +vt 0.648438 0.616667 +vt 0.648438 0.616667 +vt 0.539062 0.733333 vt 0.468750 0.733333 vt 0.062500 0.766667 vt 0.062500 0.733333 @@ -401,7 +425,7 @@ vt 0.765625 0.100000 vt 0.906250 0.200000 vt 1.000000 -0.000000 vt 1.000000 0.200000 -vt 0.058594 0.500000 +vt 0.062500 0.500000 vt 0.468750 0.700000 vt 0.468750 0.966667 vt 0.062500 0.966667 @@ -425,6 +449,7 @@ vt 0.695312 0.450000 vt 0.687500 0.450000 vt 0.695312 0.466667 vt 0.679688 0.450000 +vt 0.695312 0.450000 vt 0.835938 0.550000 vt 0.851562 0.566667 vt 0.835938 0.566667 @@ -433,10 +458,37 @@ vt 0.656250 0.516667 vt 0.656250 0.500000 vt 0.695312 0.433333 vt 0.835938 0.450000 +vt 0.695312 0.450000 vt 0.835938 0.433333 vt 0.843750 0.450000 +vt 0.695312 0.466667 +vt 0.679688 0.500000 +vt 0.851562 0.500000 +vt 0.679688 0.450000 +vt 0.695312 0.450000 vt 0.835938 0.466667 vt 0.851562 0.450000 +vt 0.695312 0.433333 +vt 0.835938 0.450000 +vt 0.679688 0.516667 +vt 0.835938 0.550000 +vt 0.851562 0.566667 +vt 0.835938 0.566667 +vt 0.656250 0.516667 +vt 0.656250 0.500000 +vt 0.695312 0.550000 +vt 0.679688 0.566667 +vt 0.835938 0.466667 +vt 0.851562 0.450000 +vt 0.835938 0.433333 +vt 0.843750 0.450000 +vt 0.687500 0.433333 +vt 0.687500 0.450000 +vt 0.875000 0.500000 +vt 0.851562 0.516667 +vt 0.902344 0.391667 +vt 0.667969 0.408333 +vt 0.667969 0.391667 vt 0.902344 0.391667 vt 0.667969 0.408333 vt 0.667969 0.391667 @@ -445,19 +497,37 @@ vt 0.914062 0.408333 vt 0.902344 0.408333 vt 0.656250 0.391667 vt 0.667969 0.433333 +vt 0.902344 0.408333 +vt 0.667969 0.433333 +vt 0.914062 0.408333 +vt 0.656250 0.391667 +vt 0.902344 0.366667 vt 0.531250 0.100000 vt 0.000000 0.366667 vt 0.046875 -0.000000 vt 0.656250 0.200000 vt 0.648438 0.733333 -vt 0.621094 0.200000 +vt 0.648438 0.733333 +vt 0.648438 0.733333 +vt 0.648438 0.733333 +vt 0.625000 0.200000 +vt 0.531250 0.200000 vt 0.695312 0.566667 vt 0.875000 0.516667 vt 0.843750 0.433333 +vt 0.835938 0.450000 +vt 0.695312 0.566667 +vt 0.835938 0.450000 +vt 0.843750 0.433333 +vt 0.875000 0.516667 vt 0.667969 0.366667 vt 0.914062 0.391667 vt 0.656250 0.408333 vt 0.902344 0.433333 +vt 0.902344 0.433333 +vt 0.914062 0.391667 +vt 0.656250 0.408333 +vt 0.667969 0.366667 vt 0.921875 0.200000 vt 0.929688 0.400000 vt 0.921875 0.400000 @@ -469,11 +539,113 @@ vt 0.945312 0.400000 vt 0.937500 0.400000 vt 0.968750 0.200000 vt 0.976562 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.937500 0.400000 +vt 0.929688 0.200000 +vt 0.929688 0.400000 +vt 0.914062 0.200000 +vt 0.921875 0.400000 +vt 0.914062 0.400000 +vt 0.921875 0.200000 +vt 0.921875 0.400000 +vt 0.921875 0.200000 +vt 0.929688 0.400000 +vt 0.914062 0.200000 +vt 0.914062 0.400000 +vt 0.929688 0.200000 +vt 0.937500 0.400000 +vt 0.953125 0.200000 +vt 0.960938 0.400000 +vt 0.953125 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.968750 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.960938 0.200000 +vt 0.945312 0.200000 +vt 0.953125 0.400000 +vt 0.929688 0.200000 +vt 0.945312 0.200000 +vt 0.953125 0.200000 +vt 0.914062 0.200000 +vt 0.914062 0.400000 +vt 0.953125 0.200000 +vt 0.960938 0.400000 +vt 0.953125 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.968750 0.400000 +vt 0.960938 0.200000 +vt 0.945312 0.200000 +vt 0.921875 0.200000 +vt 0.929688 0.400000 +vt 0.921875 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.937500 0.400000 vt 0.929688 0.200000 vt 0.914062 0.200000 vt 0.914062 0.400000 vt 0.953125 0.200000 +vt 0.960938 0.400000 vt 0.953125 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.968750 0.400000 +vt 0.960938 0.200000 +vt 0.945312 0.200000 +vt 0.921875 0.200000 +vt 0.929688 0.400000 +vt 0.921875 0.400000 +vt 0.960938 0.200000 +vt 0.968750 0.400000 +vt 0.960938 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.937500 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.937500 0.400000 +vt 0.929688 0.200000 +vt 0.929688 0.400000 +vt 0.914062 0.200000 +vt 0.921875 0.400000 +vt 0.914062 0.400000 +vt 0.921875 0.200000 +vt 0.921875 0.400000 +vt 0.921875 0.200000 +vt 0.929688 0.400000 +vt 0.914062 0.200000 +vt 0.914062 0.400000 +vt 0.929688 0.200000 +vt 0.937500 0.400000 +vt 0.953125 0.200000 +vt 0.960938 0.400000 +vt 0.953125 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.968750 0.400000 +vt 0.937500 0.200000 +vt 0.945312 0.400000 +vt 0.960938 0.200000 +vt 0.945312 0.200000 +vt 0.953125 0.400000 +vt 0.929688 0.200000 +vt 0.945312 0.200000 +vt 0.953125 0.200000 +vt 0.914062 0.200000 +vt 0.914062 0.400000 +vt 0.953125 0.200000 +vt 0.960938 0.400000 +vt 0.953125 0.400000 +vt 0.968750 0.200000 +vt 0.976562 0.400000 +vt 0.968750 0.400000 +vt 0.960938 0.200000 vt 0.945312 0.200000 vt 0.695312 0.341667 vt 0.703125 0.333333 @@ -500,6 +672,42 @@ vt 0.742188 0.325000 vt 0.742188 0.200000 vt 0.750000 0.308333 vt 0.742188 0.308333 +vt 0.718750 0.358333 +vt 0.726562 0.333333 +vt 0.726562 0.358333 +vt 0.734375 0.200000 +vt 0.734375 0.308333 +vt 0.695312 0.200000 +vt 0.703125 0.308333 +vt 0.695312 0.308333 +vt 0.718750 0.200000 +vt 0.718750 0.308333 +vt 0.703125 0.200000 +vt 0.695312 0.341667 +vt 0.703125 0.333333 +vt 0.703125 0.350000 +vt 0.687500 0.200000 +vt 0.687500 0.308333 +vt 0.710938 0.333333 +vt 0.710938 0.358333 +vt 0.718750 0.333333 +vt 0.726562 0.308333 +vt 0.703125 0.316667 +vt 0.734375 0.333333 +vt 0.742188 0.341667 +vt 0.734375 0.350000 +vt 0.734375 0.316667 +vt 0.742188 0.333333 +vt 0.710938 0.200000 +vt 0.695312 0.333333 +vt 0.710938 0.308333 +vt 0.687500 0.333333 +vt 0.695312 0.325000 +vt 0.750000 0.333333 +vt 0.742188 0.325000 +vt 0.742188 0.200000 +vt 0.750000 0.308333 +vt 0.742188 0.308333 vt 0.734375 0.200000 vt 0.734375 0.308333 vt 0.695312 0.200000 @@ -513,434 +721,501 @@ vt 0.687500 0.308333 vt 0.710938 0.200000 vt 0.687500 0.366667 vt 0.679688 0.200000 +vt 0.687500 0.200000 vt 0.679688 0.366667 +vt 0.671875 0.200000 vt 0.671875 0.366667 vt 0.664062 0.200000 vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.679688 0.366667 +vt 0.671875 0.200000 +vt 0.679688 0.200000 +vt 0.687500 0.366667 +vt 0.687500 0.200000 +vt 0.671875 0.366667 +vt 0.664062 0.200000 +vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.679688 0.366667 +vt 0.671875 0.200000 +vt 0.679688 0.200000 +vt 0.687500 0.366667 +vt 0.687500 0.200000 +vt 0.671875 0.366667 +vt 0.664062 0.200000 +vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.687500 0.366667 +vt 0.679688 0.200000 +vt 0.687500 0.200000 +vt 0.679688 0.366667 +vt 0.671875 0.200000 +vt 0.671875 0.366667 +vt 0.664062 0.200000 +vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.687500 0.366667 +vt 0.679688 0.200000 +vt 0.687500 0.200000 +vt 0.679688 0.366667 +vt 0.671875 0.200000 +vt 0.671875 0.366667 +vt 0.664062 0.200000 +vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.687500 0.366667 +vt 0.679688 0.200000 +vt 0.687500 0.200000 +vt 0.679688 0.366667 +vt 0.671875 0.200000 +vt 0.671875 0.366667 +vt 0.664062 0.200000 +vt 0.664062 0.366667 +vt 0.656250 0.200000 +vt 0.976562 0.200000 +vt 0.976562 0.200000 +vt 0.976562 0.200000 +vt 0.976562 0.200000 +vt 0.976562 0.200000 +vt 0.976562 0.200000 vt 0.976562 0.200000 vt 0.750000 0.200000 vt 0.726562 0.200000 +vt 0.750000 0.200000 +vt 0.726562 0.200000 vt 0.656250 0.366667 -s 0 -usemtl -f 3/1/1 2/2/1 1/3/1 -f 5/4/2 35/5/2 8/6/2 -f 3/1/3 8/7/3 4/8/3 -f 2/2/4 6/9/4 1/3/4 -f 4/8/5 7/10/5 2/2/5 -f 1/3/6 5/11/6 3/1/6 -f 12/12/4 9/13/4 10/14/4 -f 13/14/3 16/15/3 14/13/3 -f 10/13/5 16/12/5 12/15/5 -f 9/16/1 14/14/1 10/13/1 -f 11/12/6 13/13/6 9/14/6 -f 11/12/2 19/17/2 15/15/2 -f 17/18/5 23/19/5 19/17/5 -f 16/12/2 18/17/2 12/15/2 -f 15/12/2 20/17/2 16/15/2 -f 12/12/2 17/17/2 11/15/2 -f 22/19/2 23/20/2 21/21/2 -f 19/18/4 24/19/4 20/17/4 -f 20/18/6 22/19/6 18/17/6 -f 18/18/3 21/19/3 17/17/3 -f 35/22/6 37/23/6 34/24/6 -f 7/10/2 33/25/2 6/26/2 -f 37/27/5 31/28/5 39/29/5 -f 27/30/6 29/31/6 30/32/6 -f 39/29/3 29/31/3 40/33/3 -f 25/34/4 37/35/4 26/36/4 -f 8/6/2 34/37/2 7/10/2 -f 6/26/2 32/38/2 5/4/2 -f 37/23/2 36/39/2 30/40/2 -f 33/41/5 36/39/5 32/42/5 -f 32/43/4 38/44/4 35/45/4 -f 34/46/3 30/40/3 33/47/3 -f 28/48/7 40/33/7 27/49/7 -f 157/50/6 153/51/6 162/52/6 -f 183/53/3 180/54/3 179/55/3 -f 155/56/3 160/57/3 156/58/3 -f 160/59/5 154/60/5 156/57/5 -f 178/61/6 184/62/6 182/63/6 -f 163/64/4 153/65/4 154/66/4 -f 164/67/1 177/68/1 161/57/1 -f 178/69/4 181/70/4 177/68/4 -f 161/59/5 179/55/5 158/64/5 -f 171/55/2 162/52/2 163/64/2 -f 161/59/5 169/60/5 167/57/5 -f 177/71/5 183/72/5 179/55/5 -f 157/67/1 165/68/1 160/57/1 -f 179/55/2 159/52/2 158/64/2 -f 166/61/6 176/62/6 174/63/6 -f 160/59/5 171/55/5 163/64/5 -f 162/52/6 166/61/6 157/50/6 -f 158/64/4 170/65/4 169/66/4 -f 159/52/6 178/61/6 164/50/6 -f 164/50/6 170/51/6 159/52/6 -f 165/71/5 175/72/5 171/55/5 -f 166/69/4 173/70/4 165/68/4 -f 168/56/3 161/57/3 167/58/3 -f 175/53/3 172/54/3 171/55/3 -f 191/73/2 188/74/2 187/75/2 -f 190/73/2 185/74/2 186/75/2 -f 187/75/5 200/76/5 191/73/5 -f 190/73/3 197/77/3 189/78/3 -f 185/74/4 194/79/4 186/75/4 -f 189/78/6 193/80/6 185/74/6 -f 192/78/6 195/80/6 188/74/6 -f 191/73/3 199/77/3 192/78/3 -f 188/74/4 196/79/4 187/75/4 -f 186/75/5 198/76/5 190/73/5 -f 3/1/1 4/8/1 2/2/1 -f 5/4/2 32/38/2 35/5/2 -f 3/1/3 5/81/3 8/7/3 -f 2/2/4 7/82/4 6/9/4 -f 4/8/5 8/6/5 7/10/5 -f 1/3/6 6/83/6 5/11/6 -f 12/12/4 11/15/4 9/13/4 -f 13/14/3 15/12/3 16/15/3 -f 10/13/5 14/14/5 16/12/5 -f 9/16/1 13/84/1 14/14/1 -f 11/12/6 15/15/6 13/13/6 -f 11/12/2 17/18/2 19/17/2 -f 17/18/5 21/85/5 23/19/5 -f 16/12/2 20/18/2 18/17/2 -f 15/12/2 19/18/2 20/17/2 -f 12/12/2 18/18/2 17/17/2 -f 22/19/2 24/85/2 23/20/2 -f 19/18/4 23/85/4 24/19/4 -f 20/18/6 24/85/6 22/19/6 -f 18/18/3 22/85/3 21/19/3 -f 35/22/6 38/44/6 37/23/6 -f 7/10/2 34/37/2 33/25/2 -f 39/29/5 28/86/5 37/27/5 -f 28/86/5 26/16/5 37/27/5 -f 30/32/6 25/34/6 27/30/6 -f 27/30/6 40/33/6 29/31/6 -f 39/29/3 31/28/3 29/31/3 -f 25/34/4 30/32/4 37/35/4 -f 8/6/2 35/5/2 34/37/2 -f 6/26/2 33/25/2 32/38/2 -f 37/23/2 38/44/2 36/39/2 -f 33/41/5 30/40/5 36/39/5 -f 32/43/4 36/39/4 38/44/4 -f 34/46/3 37/23/3 30/40/3 -f 28/48/7 39/29/7 40/33/7 -f 157/50/6 155/87/6 153/51/6 -f 183/53/3 184/88/3 180/54/3 -f 155/56/3 157/67/3 160/57/3 -f 160/59/5 163/64/5 154/60/5 -f 178/61/6 180/54/6 184/62/6 -f 163/64/4 162/52/4 153/65/4 -f 164/67/1 178/69/1 177/68/1 -f 178/69/4 182/89/4 181/70/4 -f 161/59/5 177/71/5 179/55/5 -f 171/55/2 172/54/2 162/52/2 -f 161/59/5 158/64/5 169/60/5 -f 177/71/5 181/68/5 183/72/5 -f 157/67/1 166/69/1 165/68/1 -f 179/55/2 180/54/2 159/52/2 -f 166/61/6 172/54/6 176/62/6 -f 160/59/5 165/71/5 171/55/5 -f 162/52/6 172/54/6 166/61/6 -f 158/64/4 159/52/4 170/65/4 -f 159/52/6 180/54/6 178/61/6 -f 164/50/6 168/87/6 170/51/6 -f 165/71/5 173/68/5 175/72/5 -f 166/69/4 174/89/4 173/70/4 -f 168/56/3 164/67/3 161/57/3 -f 175/53/3 176/88/3 172/54/3 -f 191/73/2 192/78/2 188/74/2 -f 190/73/2 189/78/2 185/74/2 -f 187/75/5 196/90/5 200/76/5 -f 190/73/3 198/91/3 197/77/3 -f 185/74/4 193/92/4 194/79/4 -f 189/78/6 197/93/6 193/80/6 -f 192/78/6 199/93/6 195/80/6 -f 191/73/3 200/91/3 199/77/3 -f 188/74/4 195/92/4 196/79/4 -f 186/75/5 194/90/5 198/76/5 +vt 0.656250 0.366667 +vt 0.656250 0.366667 +vt 0.656250 0.366667 +vt 0.656250 0.366667 +vt 0.656250 0.366667 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.7311 0.2611 0.6303 +vn -0.9955 -0.0000 -0.0949 +vn -0.9947 -0.0393 -0.0948 +vn -0.6333 -0.2962 -0.7150 +vn -0.0000 -0.3827 -0.9239 +vn 0.6333 -0.2962 -0.7150 +vn 0.9955 -0.0000 -0.0949 +vn 0.7311 0.2611 0.6303 +vn 0.9947 -0.0393 -0.0948 +vn -0.6630 -0.0000 -0.7486 +vn 0.6630 -0.0000 -0.7486 +vn 0.6794 0.4063 -0.6110 +vn 0.9987 0.0196 -0.0473 +vn 0.7574 -0.0000 0.6530 +vn -0.9987 0.0196 -0.0473 +vn -0.7263 -0.3800 0.5728 +vn -0.7574 -0.0000 0.6530 +vn -0.6794 0.4063 -0.6110 +vn 0.0000 -0.5562 0.8311 +vn 0.7263 -0.3800 0.5728 +vn 0.7071 -0.5000 0.5000 +vn -0.7071 -0.5000 0.5000 +vn 0.0000 0.5628 -0.8266 +vn -0.7071 0.5000 -0.5000 +vn 0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.3827 0.0000 0.9239 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 -0.9239 +vn 0.7071 0.5000 -0.5000 +s off +f 11/21/6 10/22/6 9/23/6 +f 13/24/7 44/25/7 16/26/7 +f 11/21/8 16/27/8 12/28/8 +f 10/22/9 14/29/9 9/23/9 +f 12/28/10 15/30/10 10/22/10 +f 9/23/11 13/31/11 11/21/11 +f 20/32/9 17/33/9 18/34/9 +f 21/35/8 24/36/8 22/37/8 +f 18/38/10 24/39/10 20/40/10 +f 17/41/6 22/42/6 18/38/6 +f 19/43/11 21/44/11 17/45/11 +f 19/43/7 27/46/7 23/47/7 +f 25/48/10 31/49/10 27/46/10 +f 24/39/7 26/50/7 20/40/7 +f 23/51/7 28/52/7 24/36/7 +f 20/32/7 25/53/7 19/54/7 +f 30/55/7 31/56/7 29/57/7 +f 27/58/9 32/59/9 28/52/9 +f 28/60/11 30/55/11 26/50/11 +f 26/61/8 29/62/8 25/53/8 +f 44/63/11 47/64/11 43/65/11 +f 15/30/7 42/66/7 14/67/7 +f 39/68/10 40/69/10 49/70/10 +f 35/71/11 37/72/11 38/73/11 +f 49/70/8 37/72/8 50/74/8 +f 33/75/9 39/76/9 34/77/9 +f 16/26/7 43/78/7 15/30/7 +f 14/67/7 41/79/7 13/24/7 +f 47/64/7 45/80/7 46/81/7 +f 42/82/10 45/80/10 41/83/10 +f 41/84/9 48/85/9 44/86/9 +f 43/87/8 46/81/8 42/88/8 +f 36/89/12 50/74/12 35/90/12 +f 167/91/11 163/92/11 172/93/11 +f 193/94/8 190/95/8 189/96/8 +f 165/97/8 170/98/8 166/99/8 +f 170/100/10 164/101/10 166/102/10 +f 188/103/11 194/104/11 192/105/11 +f 173/106/9 163/107/9 164/108/9 +f 174/109/6 187/110/6 171/111/6 +f 188/112/9 191/113/9 187/110/9 +f 171/114/10 189/96/10 168/115/10 +f 181/116/7 172/93/7 173/106/7 +f 171/114/10 179/117/10 177/118/10 +f 187/119/10 193/120/10 189/96/10 +f 167/121/6 175/122/6 170/98/6 +f 189/96/7 169/123/7 168/115/7 +f 176/124/11 186/125/11 184/126/11 +f 170/100/10 181/116/10 173/106/10 +f 172/93/11 176/124/11 167/91/11 +f 168/115/9 180/127/9 179/128/9 +f 169/123/11 188/103/11 174/129/11 +f 174/129/11 180/130/11 169/123/11 +f 175/131/10 185/132/10 181/116/10 +f 176/133/9 183/134/9 175/122/9 +f 178/135/8 171/111/8 177/136/8 +f 185/137/8 182/138/8 181/116/8 +f 201/139/7 198/140/7 197/141/7 +f 200/142/7 195/143/7 196/144/7 +f 197/141/10 210/145/10 201/139/10 +f 200/142/8 207/146/8 199/147/8 +f 195/143/9 204/148/9 196/144/9 +f 199/147/11 203/149/11 195/143/11 +f 202/150/11 205/151/11 198/140/11 +f 201/139/8 209/152/8 202/150/8 +f 198/140/9 206/153/9 197/141/9 +f 196/144/10 208/154/10 200/142/10 +f 11/21/6 12/28/6 10/22/6 +f 13/24/7 41/79/7 44/25/7 +f 11/21/8 13/155/8 16/27/8 +f 10/22/9 15/156/9 14/29/9 +f 12/28/10 16/26/10 15/30/10 +f 9/23/11 14/157/11 13/31/11 +f 20/32/9 19/54/9 17/33/9 +f 21/35/8 23/51/8 24/36/8 +f 18/38/10 22/42/10 24/39/10 +f 17/41/6 21/158/6 22/42/6 +f 19/43/11 23/47/11 21/44/11 +f 19/43/7 25/48/7 27/46/7 +f 25/48/10 29/159/10 31/49/10 +f 24/39/7 28/60/7 26/50/7 +f 23/51/7 27/58/7 28/52/7 +f 20/32/7 26/61/7 25/53/7 +f 30/55/7 32/160/7 31/56/7 +f 27/58/9 31/161/9 32/59/9 +f 28/60/11 32/160/11 30/55/11 +f 26/61/8 30/162/8 29/62/8 +f 44/63/11 48/85/11 47/64/11 +f 15/30/7 43/78/7 42/66/7 +f 49/70/10 36/163/10 39/68/10 +f 36/163/10 34/164/10 39/68/10 +f 38/73/11 33/75/11 35/71/11 +f 35/71/11 50/74/11 37/72/11 +f 49/70/8 40/69/8 37/72/8 +f 33/75/9 38/73/9 39/76/9 +f 16/26/7 44/25/7 43/78/7 +f 14/67/7 42/66/7 41/79/7 +f 47/64/7 48/85/7 45/80/7 +f 42/82/10 46/81/10 45/80/10 +f 41/84/9 45/80/9 48/85/9 +f 43/87/8 47/64/8 46/81/8 +f 36/89/12 49/70/12 50/74/12 +f 167/91/11 165/165/11 163/92/11 +f 193/94/8 194/166/8 190/95/8 +f 165/97/8 167/121/8 170/98/8 +f 170/100/10 173/106/10 164/101/10 +f 188/103/11 190/95/11 194/104/11 +f 173/106/9 172/93/9 163/107/9 +f 174/109/6 188/112/6 187/110/6 +f 188/112/9 192/167/9 191/113/9 +f 171/114/10 187/119/10 189/96/10 +f 181/116/7 182/138/7 172/93/7 +f 171/114/10 168/115/10 179/117/10 +f 187/119/10 191/168/10 193/120/10 +f 167/121/6 176/133/6 175/122/6 +f 189/96/7 190/95/7 169/123/7 +f 176/124/11 182/138/11 186/125/11 +f 170/100/10 175/131/10 181/116/10 +f 172/93/11 182/138/11 176/124/11 +f 168/115/9 169/123/9 180/127/9 +f 169/123/11 190/95/11 188/103/11 +f 174/129/11 178/169/11 180/130/11 +f 175/131/10 183/170/10 185/132/10 +f 176/133/9 184/171/9 183/134/9 +f 178/135/8 174/109/8 171/111/8 +f 185/137/8 186/172/8 182/138/8 +f 201/139/7 202/150/7 198/140/7 +f 200/142/7 199/147/7 195/143/7 +f 197/141/10 206/173/10 210/145/10 +f 200/142/8 208/174/8 207/146/8 +f 195/143/9 203/175/9 204/148/9 +f 199/147/11 207/176/11 203/149/11 +f 202/150/11 209/177/11 205/151/11 +f 201/139/8 210/178/8 209/152/8 +f 198/140/9 205/179/9 206/153/9 +f 196/144/10 204/180/10 208/154/10 s 1 -f 80/94/8 81/95/4 79/96/8 -f 44/97/3 45/98/9 43/99/3 -f 68/100/10 69/101/2 67/102/10 -f 46/103/9 47/104/1 45/98/9 -f 84/100/10 85/101/2 83/102/10 -f 66/105/4 67/102/10 65/95/4 -f 48/106/1 49/96/8 47/107/1 -f 64/94/8 65/95/4 63/96/8 -f 50/94/8 51/95/4 49/96/8 -f 62/106/1 63/96/8 61/107/1 -f 52/105/4 53/102/10 51/95/4 -f 72/108/7 42/99/3 71/109/7 -f 60/103/9 61/104/1 59/98/9 -f 54/100/10 55/101/2 53/102/10 -f 41/97/3 59/98/9 42/99/3 -f 56/110/2 57/109/7 55/101/2 -f 82/105/4 83/102/10 81/95/4 -f 70/110/2 71/109/7 69/101/2 -f 58/108/7 43/99/3 57/109/7 -f 78/106/1 79/96/8 77/107/1 -f 88/108/7 74/99/3 87/109/7 -f 76/103/9 77/104/1 75/98/9 -f 73/97/3 75/98/9 74/99/3 -f 86/110/2 87/109/7 85/101/2 -f 96/94/8 97/95/4 95/96/8 -f 100/100/10 101/101/2 99/102/10 -f 98/105/4 99/102/10 97/95/4 -f 94/106/1 95/96/8 93/107/1 -f 104/108/7 90/99/3 103/109/7 -f 92/103/9 93/104/1 91/98/9 -f 89/97/3 91/98/9 90/99/3 -f 102/110/2 103/109/7 101/101/2 -f 144/94/8 145/95/4 143/96/8 -f 108/97/3 109/98/9 107/99/3 -f 132/100/10 133/101/2 131/102/10 -f 110/103/9 111/104/1 109/98/9 -f 148/100/10 149/101/2 147/102/10 -f 130/105/4 131/102/10 129/95/4 -f 112/106/1 113/96/8 111/107/1 -f 128/94/8 129/95/4 127/96/8 -f 114/94/8 115/95/4 113/96/8 -f 126/106/1 127/96/8 125/107/1 -f 116/105/4 117/102/10 115/95/4 -f 136/108/7 106/99/3 135/109/7 -f 124/103/9 125/104/1 123/98/9 -f 118/100/10 119/101/2 117/102/10 -f 105/97/3 123/98/9 106/99/3 -f 120/110/2 121/109/7 119/101/2 -f 146/105/4 147/102/10 145/95/4 -f 134/110/2 135/109/7 133/101/2 -f 122/108/7 107/99/3 121/109/7 -f 142/106/1 143/96/8 141/107/1 -f 152/108/7 138/99/3 151/109/7 -f 140/103/9 141/104/1 139/98/9 -f 137/97/3 139/98/9 138/99/3 -f 150/110/2 151/109/7 149/101/2 -f 204/111/11 211/112/12 203/113/13 -f 202/114/14 209/115/3 201/116/15 -f 209/115/3 208/117/16 201/116/15 -f 214/118/17 206/119/18 207/120/19 -f 203/113/13 210/121/20 202/114/14 -f 215/122/21 207/120/19 208/117/16 -f 209/115/3 222/123/22 215/122/21 -f 221/124/23 213/125/24 214/118/17 -f 218/126/25 210/121/20 211/112/12 -f 215/122/21 221/124/23 214/118/17 -f 219/127/26 211/112/12 212/128/27 -f 217/129/28 209/115/3 210/121/20 -f 204/111/11 205/130/29 212/128/27 -f 212/128/27 205/130/29 219/127/26 -f 205/131/29 206/119/18 213/125/24 -f 213/125/24 220/132/30 205/131/29 -f 236/133/31 205/134/29 220/135/30 -f 230/116/15 245/122/21 223/117/16 -f 222/123/22 235/136/5 221/137/23 -f 234/138/32 218/139/25 219/140/26 -f 232/141/7 222/123/22 216/142/33 -f 235/136/5 220/135/30 221/137/23 -f 233/143/6 217/129/28 218/139/25 -f 227/111/11 241/112/12 228/113/13 -f 238/144/8 219/140/26 205/145/29 -f 228/113/13 240/121/20 229/114/14 -f 239/115/3 252/123/22 245/122/21 -f 248/126/25 240/121/20 241/112/12 -f 240/121/20 230/116/15 229/114/14 -f 244/118/17 225/119/18 224/120/19 -f 245/122/21 224/120/19 223/117/16 -f 251/124/23 243/125/24 244/118/17 -f 231/146/34 216/142/33 217/129/28 -f 245/122/21 251/124/23 244/118/17 -f 242/128/27 248/126/25 241/112/12 -f 247/129/28 239/115/3 240/121/20 -f 227/111/11 226/130/29 242/128/27 -f 242/128/27 226/130/29 249/127/26 -f 226/131/29 225/119/18 243/125/24 -f 243/125/24 250/132/30 226/131/29 -f 258/133/31 226/134/29 250/135/30 -f 252/123/22 257/136/5 251/137/23 -f 256/138/32 248/139/25 249/140/26 -f 254/141/7 252/123/22 246/142/33 -f 257/136/5 250/135/30 251/137/23 -f 255/143/6 247/129/28 248/139/25 -f 260/144/8 249/140/26 226/145/29 -f 253/146/34 246/142/33 247/129/28 -f 262/147/35 263/148/36 261/144/35 -f 264/149/36 265/48/5 263/148/36 -f 266/150/5 267/151/37 265/48/5 -f 268/152/37 269/84/38 267/151/37 -f 274/149/36 275/48/5 273/148/36 -f 272/147/35 273/148/36 271/144/35 -f 276/150/5 277/151/37 275/48/5 -f 278/152/37 279/84/38 277/151/37 -f 284/149/36 285/48/5 283/148/36 -f 282/147/35 283/148/36 281/144/35 -f 286/150/5 287/151/37 285/48/5 -f 288/152/37 289/84/38 287/151/37 -f 294/147/39 295/148/40 293/144/39 -f 296/149/40 297/48/6 295/148/40 -f 298/150/6 299/151/41 297/48/6 -f 300/152/41 291/84/42 299/151/41 -f 304/147/39 305/148/40 303/144/39 -f 306/149/40 307/48/6 305/148/40 -f 308/150/6 309/151/41 307/48/6 -f 310/152/41 301/84/42 309/151/41 -f 314/147/39 315/148/40 313/144/39 -f 316/149/40 317/48/6 315/148/40 -f 318/150/6 319/151/41 317/48/6 -f 320/152/41 311/84/42 319/151/41 -f 80/94/8 82/105/4 81/95/4 -f 44/97/3 46/103/9 45/98/9 -f 68/100/10 70/110/2 69/101/2 -f 46/103/9 48/153/1 47/104/1 -f 84/100/10 86/110/2 85/101/2 -f 66/105/4 68/100/10 67/102/10 -f 48/106/1 50/94/8 49/96/8 -f 64/94/8 66/105/4 65/95/4 -f 50/94/8 52/105/4 51/95/4 -f 62/106/1 64/94/8 63/96/8 -f 52/105/4 54/100/10 53/102/10 -f 72/108/7 41/97/3 42/99/3 -f 60/103/9 62/153/1 61/104/1 -f 54/100/10 56/110/2 55/101/2 -f 41/97/3 60/103/9 59/98/9 -f 56/110/2 58/108/7 57/109/7 -f 82/105/4 84/100/10 83/102/10 -f 70/110/2 72/108/7 71/109/7 -f 58/108/7 44/97/3 43/99/3 -f 78/106/1 80/94/8 79/96/8 -f 88/108/7 73/97/3 74/99/3 -f 76/103/9 78/153/1 77/104/1 -f 73/97/3 76/103/9 75/98/9 -f 86/110/2 88/108/7 87/109/7 -f 96/94/8 98/105/4 97/95/4 -f 100/100/10 102/110/2 101/101/2 -f 98/105/4 100/100/10 99/102/10 -f 94/106/1 96/94/8 95/96/8 -f 104/108/7 89/97/3 90/99/3 -f 92/103/9 94/153/1 93/104/1 -f 89/97/3 92/103/9 91/98/9 -f 102/110/2 104/108/7 103/109/7 -f 144/94/8 146/105/4 145/95/4 -f 108/97/3 110/103/9 109/98/9 -f 132/100/10 134/110/2 133/101/2 -f 110/103/9 112/153/1 111/104/1 -f 148/100/10 150/110/2 149/101/2 -f 130/105/4 132/100/10 131/102/10 -f 112/106/1 114/94/8 113/96/8 -f 128/94/8 130/105/4 129/95/4 -f 114/94/8 116/105/4 115/95/4 -f 126/106/1 128/94/8 127/96/8 -f 116/105/4 118/100/10 117/102/10 -f 136/108/7 105/97/3 106/99/3 -f 124/103/9 126/153/1 125/104/1 -f 118/100/10 120/110/2 119/101/2 -f 105/97/3 124/103/9 123/98/9 -f 120/110/2 122/108/7 121/109/7 -f 146/105/4 148/100/10 147/102/10 -f 134/110/2 136/108/7 135/109/7 -f 122/108/7 108/97/3 107/99/3 -f 142/106/1 144/94/8 143/96/8 -f 152/108/7 137/97/3 138/99/3 -f 140/103/9 142/153/1 141/104/1 -f 137/97/3 140/103/9 139/98/9 -f 150/110/2 152/108/7 151/109/7 -f 204/111/11 212/128/27 211/112/12 -f 202/114/14 210/121/20 209/115/3 -f 209/115/3 215/122/21 208/117/16 -f 214/118/17 213/125/24 206/119/18 -f 203/113/13 211/112/12 210/121/20 -f 215/122/21 214/118/17 207/120/19 -f 209/115/3 216/142/33 222/123/22 -f 221/124/23 220/132/30 213/125/24 -f 218/126/25 217/129/28 210/121/20 -f 215/122/21 222/123/22 221/124/23 -f 219/127/26 218/126/25 211/112/12 -f 217/129/28 216/142/33 209/115/3 -f 236/133/31 238/154/8 205/134/29 -f 230/116/15 239/115/3 245/122/21 -f 222/123/22 237/155/43 235/136/5 -f 234/138/32 233/143/6 218/139/25 -f 232/141/7 237/155/43 222/123/22 -f 235/136/5 236/133/31 220/135/30 -f 233/143/6 231/146/34 217/129/28 -f 227/111/11 242/128/27 241/112/12 -f 238/144/8 234/138/32 219/140/26 -f 228/113/13 241/112/12 240/121/20 -f 239/115/3 246/142/33 252/123/22 -f 248/126/25 247/129/28 240/121/20 -f 240/121/20 239/115/3 230/116/15 -f 244/118/17 243/125/24 225/119/18 -f 245/122/21 244/118/17 224/120/19 -f 251/124/23 250/132/30 243/125/24 -f 231/146/34 232/141/7 216/142/33 -f 245/122/21 252/123/22 251/124/23 -f 242/128/27 249/127/26 248/126/25 -f 247/129/28 246/142/33 239/115/3 -f 258/133/31 260/154/8 226/134/29 -f 252/123/22 259/155/43 257/136/5 -f 256/138/32 255/143/6 248/139/25 -f 254/141/7 259/155/43 252/123/22 -f 257/136/5 258/133/31 250/135/30 -f 255/143/6 253/146/34 247/129/28 -f 260/144/8 256/138/32 249/140/26 -f 253/146/34 254/141/7 246/142/33 -f 262/147/35 264/149/36 263/148/36 -f 264/149/36 266/150/5 265/48/5 -f 266/150/5 268/152/37 267/151/37 -f 268/152/37 270/156/38 269/84/38 -f 274/149/36 276/150/5 275/48/5 -f 272/147/35 274/149/36 273/148/36 -f 276/150/5 278/152/37 277/151/37 -f 278/152/37 280/156/38 279/84/38 -f 284/149/36 286/150/5 285/48/5 -f 282/147/35 284/149/36 283/148/36 -f 286/150/5 288/152/37 287/151/37 -f 288/152/37 290/156/38 289/84/38 -f 294/147/39 296/149/40 295/148/40 -f 296/149/40 298/150/6 297/48/6 -f 298/150/6 300/152/41 299/151/41 -f 300/152/41 292/156/42 291/84/42 -f 304/147/39 306/149/40 305/148/40 -f 306/149/40 308/150/6 307/48/6 -f 308/150/6 310/152/41 309/151/41 -f 310/152/41 302/156/42 301/84/42 -f 314/147/39 316/149/40 315/148/40 -f 316/149/40 318/150/6 317/48/6 -f 318/150/6 320/152/41 319/151/41 -f 320/152/41 312/156/42 311/84/42 -o plate -v -0.500000 0.937500 -1.500000 -v 0.500000 0.937500 -1.500000 -v -0.500000 0.937500 -5.250000 -v 0.500000 0.937500 -5.250000 -v -0.500000 1.062500 -5.250000 -v -0.500000 1.062500 -1.500000 -v 0.500000 1.062500 -1.500000 -v 0.500000 1.062500 -5.250000 -vn -0.0000 -1.0000 -0.0000 -vn -0.0000 1.0000 -0.0000 -vn -0.0000 -0.0000 -1.0000 -vn 1.0000 -0.0000 -0.0000 -vn -1.0000 -0.0000 -0.0000 -vt 0.890625 0.566667 -vt 0.656250 0.700000 -vt 0.656250 0.566667 -vt 0.890625 0.700000 -vt 0.664062 0.700000 -vt 0.664062 0.566667 -vt 0.890625 0.683333 -vt 0.656250 0.683333 -vt 0.656250 0.583333 -vt 0.890625 0.583333 -s 0 -usemtl -f 323/157/44 322/158/44 321/159/44 -f 327/159/45 325/160/45 326/158/45 -f 323/161/46 328/159/46 324/162/46 -f 324/163/47 327/158/47 322/164/47 -f 321/165/48 325/157/48 323/166/48 -f 323/157/44 324/160/44 322/158/44 -f 327/159/45 328/157/45 325/160/45 -f 323/161/46 325/158/46 328/159/46 -f 324/163/47 328/160/47 327/158/47 -f 321/165/48 326/159/48 325/157/48 +f 90/181/13 91/182/9 89/183/13 +f 54/184/8 55/185/14 53/186/8 +f 78/187/15 79/188/7 77/189/15 +f 56/190/14 57/191/6 55/185/14 +f 94/192/15 95/193/7 93/194/15 +f 76/195/9 77/189/15 75/196/9 +f 58/197/6 59/198/13 57/199/6 +f 74/200/13 75/196/9 73/201/13 +f 60/202/13 61/203/9 59/198/13 +f 72/204/6 73/201/13 71/205/6 +f 62/206/9 63/207/15 61/203/9 +f 82/208/12 52/209/8 81/210/12 +f 70/211/14 71/212/6 69/213/14 +f 64/214/15 65/215/7 63/207/15 +f 51/216/8 69/213/14 52/209/8 +f 66/217/7 67/218/12 65/215/7 +f 92/219/9 93/194/15 91/182/9 +f 80/220/7 81/210/12 79/188/7 +f 68/221/12 53/186/8 67/218/12 +f 88/222/6 89/183/13 87/223/6 +f 98/224/12 84/225/8 97/226/12 +f 86/227/14 87/228/6 85/229/14 +f 83/230/8 85/229/14 84/225/8 +f 96/231/7 97/226/12 95/193/7 +f 106/232/13 107/233/9 105/234/13 +f 110/235/15 111/236/7 109/237/15 +f 108/238/9 109/237/15 107/233/9 +f 104/239/6 105/234/13 103/240/6 +f 114/241/12 100/242/8 113/243/12 +f 102/244/14 103/245/6 101/246/14 +f 99/247/8 101/246/14 100/242/8 +f 112/248/7 113/243/12 111/236/7 +f 154/249/13 155/250/9 153/251/13 +f 118/252/8 119/253/14 117/254/8 +f 142/255/15 143/256/7 141/257/15 +f 120/258/14 121/259/6 119/253/14 +f 158/260/15 159/261/7 157/262/15 +f 140/263/9 141/257/15 139/264/9 +f 122/265/6 123/266/13 121/267/6 +f 138/268/13 139/264/9 137/269/13 +f 124/270/13 125/271/9 123/266/13 +f 136/272/6 137/269/13 135/273/6 +f 126/274/9 127/275/15 125/271/9 +f 146/276/12 116/277/8 145/278/12 +f 134/279/14 135/280/6 133/281/14 +f 128/282/15 129/283/7 127/275/15 +f 115/284/8 133/281/14 116/277/8 +f 130/285/7 131/286/12 129/283/7 +f 156/287/9 157/262/15 155/250/9 +f 144/288/7 145/278/12 143/256/7 +f 132/289/12 117/254/8 131/286/12 +f 152/290/6 153/251/13 151/291/6 +f 162/292/12 148/293/8 161/294/12 +f 150/295/14 151/296/6 149/297/14 +f 147/298/8 149/297/14 148/293/8 +f 160/299/7 161/294/12 159/261/7 +f 214/300/16 221/301/17 213/302/18 +f 212/303/19 219/304/8 211/305/20 +f 219/304/8 218/306/21 211/305/20 +f 224/307/22 216/308/23 217/309/24 +f 213/302/18 220/310/25 212/303/19 +f 225/311/26 217/309/24 218/306/21 +f 219/304/8 232/312/27 225/311/26 +f 231/313/28 223/314/29 224/307/22 +f 228/315/30 220/310/25 221/301/17 +f 225/311/26 231/313/28 224/307/22 +f 229/316/31 221/301/17 222/317/32 +f 227/318/33 219/304/8 220/310/25 +f 214/300/16 215/319/34 222/317/32 +f 222/317/32 215/319/34 229/316/31 +f 215/320/34 216/308/23 223/314/29 +f 223/314/29 230/321/35 215/320/34 +f 246/322/36 215/323/34 230/324/35 +f 240/325/20 255/326/26 233/327/21 +f 232/312/27 245/328/10 231/329/28 +f 244/330/37 228/331/30 229/332/31 +f 242/333/12 232/312/27 226/334/38 +f 245/328/10 230/324/35 231/329/28 +f 243/335/11 227/318/33 228/331/30 +f 237/336/16 251/337/17 238/338/18 +f 248/339/13 229/332/31 215/340/34 +f 238/338/18 250/341/25 239/342/19 +f 249/343/8 262/344/27 255/326/26 +f 258/345/30 250/341/25 251/337/17 +f 250/341/25 240/325/20 239/342/19 +f 254/346/22 235/347/23 234/348/24 +f 255/326/26 234/348/24 233/327/21 +f 261/349/28 253/350/29 254/346/22 +f 241/351/39 226/334/38 227/318/33 +f 255/326/26 261/349/28 254/346/22 +f 252/352/32 258/345/30 251/337/17 +f 257/353/33 249/343/8 250/341/25 +f 237/336/16 236/354/34 252/352/32 +f 252/352/32 236/354/34 259/355/31 +f 236/356/34 235/347/23 253/350/29 +f 253/350/29 260/357/35 236/356/34 +f 268/358/36 236/359/34 260/360/35 +f 262/344/27 267/361/10 261/362/28 +f 266/363/37 258/364/30 259/365/31 +f 264/366/12 262/344/27 256/367/38 +f 267/361/10 260/360/35 261/362/28 +f 265/368/11 257/353/33 258/364/30 +f 270/369/13 259/365/31 236/370/34 +f 263/371/39 256/367/38 257/353/33 +f 272/372/40 273/373/41 271/374/40 +f 274/375/41 275/376/10 273/373/41 +f 276/377/10 277/378/42 275/376/10 +f 278/379/42 279/380/43 277/378/42 +f 284/381/41 285/382/10 283/383/41 +f 282/384/40 283/383/41 281/385/40 +f 286/386/10 287/387/42 285/382/10 +f 288/388/42 289/389/43 287/387/42 +f 294/390/41 295/391/10 293/392/41 +f 292/393/40 293/392/41 291/394/40 +f 296/395/10 297/396/42 295/391/10 +f 298/397/42 299/398/43 297/396/42 +f 304/399/44 305/400/45 303/401/44 +f 306/402/45 307/403/11 305/400/45 +f 308/404/11 309/405/46 307/403/11 +f 310/406/46 301/407/47 309/405/46 +f 314/408/44 315/409/45 313/410/44 +f 316/411/45 317/412/11 315/409/45 +f 318/413/11 319/414/46 317/412/11 +f 320/415/46 311/416/47 319/414/46 +f 324/417/44 325/418/45 323/419/44 +f 326/420/45 327/421/11 325/418/45 +f 328/422/11 329/423/46 327/421/11 +f 330/424/46 321/425/47 329/423/46 +f 90/181/13 92/219/9 91/182/9 +f 54/184/8 56/190/14 55/185/14 +f 78/187/15 80/220/7 79/188/7 +f 56/190/14 58/426/6 57/191/6 +f 94/192/15 96/231/7 95/193/7 +f 76/195/9 78/187/15 77/189/15 +f 58/197/6 60/202/13 59/198/13 +f 74/200/13 76/195/9 75/196/9 +f 60/202/13 62/206/9 61/203/9 +f 72/204/6 74/200/13 73/201/13 +f 62/206/9 64/214/15 63/207/15 +f 82/208/12 51/216/8 52/209/8 +f 70/211/14 72/427/6 71/212/6 +f 64/214/15 66/217/7 65/215/7 +f 51/216/8 70/211/14 69/213/14 +f 66/217/7 68/221/12 67/218/12 +f 92/219/9 94/192/15 93/194/15 +f 80/220/7 82/208/12 81/210/12 +f 68/221/12 54/184/8 53/186/8 +f 88/222/6 90/181/13 89/183/13 +f 98/224/12 83/230/8 84/225/8 +f 86/227/14 88/428/6 87/228/6 +f 83/230/8 86/227/14 85/229/14 +f 96/231/7 98/224/12 97/226/12 +f 106/232/13 108/238/9 107/233/9 +f 110/235/15 112/248/7 111/236/7 +f 108/238/9 110/235/15 109/237/15 +f 104/239/6 106/232/13 105/234/13 +f 114/241/12 99/247/8 100/242/8 +f 102/244/14 104/429/6 103/245/6 +f 99/247/8 102/244/14 101/246/14 +f 112/248/7 114/241/12 113/243/12 +f 154/249/13 156/287/9 155/250/9 +f 118/252/8 120/258/14 119/253/14 +f 142/255/15 144/288/7 143/256/7 +f 120/258/14 122/430/6 121/259/6 +f 158/260/15 160/299/7 159/261/7 +f 140/263/9 142/255/15 141/257/15 +f 122/265/6 124/270/13 123/266/13 +f 138/268/13 140/263/9 139/264/9 +f 124/270/13 126/274/9 125/271/9 +f 136/272/6 138/268/13 137/269/13 +f 126/274/9 128/282/15 127/275/15 +f 146/276/12 115/284/8 116/277/8 +f 134/279/14 136/431/6 135/280/6 +f 128/282/15 130/285/7 129/283/7 +f 115/284/8 134/279/14 133/281/14 +f 130/285/7 132/289/12 131/286/12 +f 156/287/9 158/260/15 157/262/15 +f 144/288/7 146/276/12 145/278/12 +f 132/289/12 118/252/8 117/254/8 +f 152/290/6 154/249/13 153/251/13 +f 162/292/12 147/298/8 148/293/8 +f 150/295/14 152/432/6 151/296/6 +f 147/298/8 150/295/14 149/297/14 +f 160/299/7 162/292/12 161/294/12 +f 214/300/16 222/317/32 221/301/17 +f 212/303/19 220/310/25 219/304/8 +f 219/304/8 225/311/26 218/306/21 +f 224/307/22 223/314/29 216/308/23 +f 213/302/18 221/301/17 220/310/25 +f 225/311/26 224/307/22 217/309/24 +f 219/304/8 226/334/38 232/312/27 +f 231/313/28 230/321/35 223/314/29 +f 228/315/30 227/318/33 220/310/25 +f 225/311/26 232/312/27 231/313/28 +f 229/316/31 228/315/30 221/301/17 +f 227/318/33 226/334/38 219/304/8 +f 246/322/36 248/433/13 215/323/34 +f 240/325/20 249/343/8 255/326/26 +f 232/312/27 247/434/48 245/328/10 +f 244/330/37 243/335/11 228/331/30 +f 242/333/12 247/434/48 232/312/27 +f 245/328/10 246/322/36 230/324/35 +f 243/335/11 241/351/39 227/318/33 +f 237/336/16 252/352/32 251/337/17 +f 248/339/13 244/330/37 229/332/31 +f 238/338/18 251/337/17 250/341/25 +f 249/343/8 256/367/38 262/344/27 +f 258/345/30 257/353/33 250/341/25 +f 250/341/25 249/343/8 240/325/20 +f 254/346/22 253/350/29 235/347/23 +f 255/326/26 254/346/22 234/348/24 +f 261/349/28 260/357/35 253/350/29 +f 241/351/39 242/333/12 226/334/38 +f 255/326/26 262/344/27 261/349/28 +f 252/352/32 259/355/31 258/345/30 +f 257/353/33 256/367/38 249/343/8 +f 268/358/36 270/435/13 236/359/34 +f 262/344/27 269/436/48 267/361/10 +f 266/363/37 265/368/11 258/364/30 +f 264/366/12 269/436/48 262/344/27 +f 267/361/10 268/358/36 260/360/35 +f 265/368/11 263/371/39 257/353/33 +f 270/369/13 266/363/37 259/365/31 +f 263/371/39 264/366/12 256/367/38 +f 272/372/40 274/375/41 273/373/41 +f 274/375/41 276/377/10 275/376/10 +f 276/377/10 278/379/42 277/378/42 +f 278/379/42 280/437/43 279/380/43 +f 284/381/41 286/386/10 285/382/10 +f 282/384/40 284/381/41 283/383/41 +f 286/386/10 288/388/42 287/387/42 +f 288/388/42 290/438/43 289/389/43 +f 294/390/41 296/395/10 295/391/10 +f 292/393/40 294/390/41 293/392/41 +f 296/395/10 298/397/42 297/396/42 +f 298/397/42 300/439/43 299/398/43 +f 304/399/44 306/402/45 305/400/45 +f 306/402/45 308/404/11 307/403/11 +f 308/404/11 310/406/46 309/405/46 +f 310/406/46 302/440/47 301/407/47 +f 314/408/44 316/411/45 315/409/45 +f 316/411/45 318/413/11 317/412/11 +f 318/413/11 320/415/46 319/414/46 +f 320/415/46 312/441/47 311/416/47 +f 324/417/44 326/420/45 325/418/45 +f 326/420/45 328/422/11 327/421/11 +f 328/422/11 330/424/46 329/423/46 +f 330/424/46 322/442/47 321/425/47 diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png deleted file mode 100644 index 20d822588..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_control_side_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png deleted file mode 100644 index bd53b0db8..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_control_top_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png deleted file mode 100644 index b73f785d0..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_element_side_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_element_top_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_element_top_alt.png deleted file mode 100644 index 773251de3..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_element_top_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_side_alt.png deleted file mode 100644 index dc6fa1bc3..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_side_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png b/src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png deleted file mode 100644 index f93b61cb9..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/reactor_top_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png index 23f79d504..2f4670d81 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png and b/src/main/resources/assets/hbm/textures/gui/processing/gui_funnel.png differ diff --git a/src/main/resources/assets/hbm/textures/items/bottle_rad.png b/src/main/resources/assets/hbm/textures/items/bottle_rad.png index 554d5cdf8..b1aa2e0a1 100644 Binary files a/src/main/resources/assets/hbm/textures/items/bottle_rad.png and b/src/main/resources/assets/hbm/textures/items/bottle_rad.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette.png b/src/main/resources/assets/hbm/textures/items/pipette.png new file mode 100644 index 000000000..a24218949 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette_boron.png b/src/main/resources/assets/hbm/textures/items/pipette_boron.png new file mode 100644 index 000000000..7bf66ade3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette_boron.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette_empty.png b/src/main/resources/assets/hbm/textures/items/pipette_empty.png new file mode 100644 index 000000000..07f7b0e2b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette_empty.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette_laboratory.png b/src/main/resources/assets/hbm/textures/items/pipette_laboratory.png new file mode 100644 index 000000000..314f23205 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette_laboratory.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png b/src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png new file mode 100644 index 000000000..8a2ad573c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette_laboratory_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pipette_overlay.png b/src/main/resources/assets/hbm/textures/items/pipette_overlay.png new file mode 100644 index 000000000..207f90f2e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pipette_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/models/capes/CapeJame.png b/src/main/resources/assets/hbm/textures/models/capes/CapeJame.png new file mode 100644 index 000000000..4a7615d18 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/capes/CapeJame.png differ diff --git a/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png new file mode 100644 index 000000000..226f0c34d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch.png differ