diff --git a/changelog b/changelog index 3e1f26717..da40438bd 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,41 @@ +## Added +* New Chicago Pile + * Assembled multiblock, similar to the PWR + * Requires new chicago pile graphite bricks + * Assembled with a hand drill out of a box made from graphite bricks, at least 5x5x5, and at most 15x15x15 blocks large + * Drilling the assembled reactor will add channels at the selected locations + * Drilling along the reactor's orientation will add a fuel channel + * Drilling perpendicular to fuel channels will add a ventilation channel + * Drilling vertically will add a control rod channel + * Fuel insertion is now done with a dedicated fuel loader which can be operated by hand or automated with hopper IO and redstone + * Ventilation channels need chicago pile vents which are powered with compressed air at 1 PU + * Chicago pile control rods can either be fully withdrawn with redstone or fine tuned with RoR + * Additionally, channels can be drilled by right clicking a pile addon device with the hand drill, the addon doesn't need to be removed beforehand + * This is mainly for convenience when disassembling and reassembling the reactor, which requires all channels to be drilled again + * Piles that overheat will explode, throwing flaming graphite everywhere + ## Changed * Updated all oil well GUI textures * There's now only two upgrade slots instead of three * All legacy pixel gauges have been replaced with smooth ones (watz, ZIRNOX, CCGT) making them more accurate +* Updated the diesel generator's GUI + * The diesel gen now also has an in-GUI button for turning it on and off like the industrial combustion engine +* MS-ESv1.1 `split` instruction now supports variable substitution +* Multiblocks now display a wireframe preview of how much space they take up + * This preview is green if it can be placed and red if it can not + * On some machines, this preview might not be perfect, but the check on whether it can be placed should always be accurate + * This makes it easier to anticipate how much space a machine takes up, as well as lining up large parts like fusion reactor components which were notoriously hard to place down right +* Updated the small pylon model + * The small pylon now has a steel variant +* Items in the battery socket which previously didn't show up in the socket's model are now rendered +* Reduced the cost for the heavy stirling engine ## Fixed -* Fixed held block being placed when not sneaking when opening the cable diode's GUI \ No newline at end of file +* Fixed held block being placed when not sneaking when opening the cable diode's GUI +* Fixed an issue where the diesel generator's fuel capacity is the original 4,000mB instead of the intended new 16,000mB + * This means that explosive barrels and universal barrels can now be loaded into the diesel generator +* Fixed RoR terminal's `set` command not working +* Fixed a longstanding issue where the transparent part of beams from tile entity models would often have incorrect render order, sometimes rendering things behind them invisible + * This also fixes the same phenomenon for other types of beams, such as those from hitscan laser and tesla weapons +* Fixed some issues regarding the new crane structure +* Fixed skeletonizer ashes floating over the floor after landing \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index c7d7bd432..1cca3e365 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -5,6 +5,9 @@ import com.hbm.handler.ThreeInts; import com.hbm.interfaces.ICopiable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; +import com.hbm.util.Clock; +import com.hbm.util.EntityDamageUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; @@ -13,6 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -32,10 +36,14 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.client.renderer.Tessellator; import java.util.ArrayList; import java.util.List; import java.util.Random; +import java.util.Set; + +import org.lwjgl.opengl.GL11; public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTBlockTransformable { @@ -595,4 +603,272 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return meta; } + public int[][] getAllDimensions() { + return new int[][] { getDimensions() }; + } + + public double[][] getAABBExtras() { + return new double[0][0]; + } + + @SideOnly(Side.CLIENT) + public void drawPlacementHighlight(EntityPlayer player, float interp) { + MovingObjectPosition mop = EntityDamageUtil.getMouseOver(player, 5.0D); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) interp; + double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) interp; + double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) interp; + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int o = -getOffset(); + int pY = mop.blockY + getHeightOffset(); + + // Orientation + ForgeDirection facing = ForgeDirection.NORTH; + if(i == 0) facing = ForgeDirection.getOrientation(2); + if(i == 1) facing = ForgeDirection.getOrientation(5); + if(i == 2) facing = ForgeDirection.getOrientation(3); + if(i == 3) facing = ForgeDirection.getOrientation(4); + + ForgeDirection sideHit = ForgeDirection.getOrientation(mop.sideHit); + facing = getDirModified(facing); + + double originX = mop.blockX + facing.offsetX * o + sideHit.offsetX; + double originY = pY + sideHit.offsetY; + double originZ = mop.blockZ + facing.offsetZ * o + sideHit.offsetZ; + + boolean canPlace = checkRequirement(player.worldObj, mop.blockX + sideHit.offsetX, pY + sideHit.offsetY, mop.blockZ + sideHit.offsetZ, facing, o); + Tessellator tess = Tessellator.instance; + + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + GL11.glLineWidth(2.0F); + GL11.glDepthMask(false); + tess.startDrawing(GL11.GL_LINES); + tess.setBrightness(240); + + double timer = (Clock.get_ms() % (1000D * Math.PI)) / 250D; + double sine = Math.sin(timer); + int color = (int) (255 * (sine * 0.25 + 0.75)); + + if(canPlace) { + tess.setColorRGBA(0, color, 0, 255); + } else { + tess.setColorRGBA(color, 0, 0, 255); + } + + // Gets the list of different dimensions that each XLmultiblock has, + // and generates the list of blocks that needs to be highlighted. + // Each XL multiblock has the getAllDimensions overridden in its own + // class. Each NEEDS it or it will show the incorect shape. + List blocks = new java.util.ArrayList<>(); + Set set = new java.util.HashSet<>(); + + for(int[] dims : getAllDimensions()) { + // Some of the multiblocks have offsets for the placements, so + // this allows for the ones that dont need it to have a bunch of + // 0s at the end. + int offFwd = dims.length > 6 ? dims[6] : 0; + int offUp = dims.length > 7 ? dims[7] : 0; + int offLat = dims.length > 8 ? dims[8] : 0; + int worldOffX; + int worldOffY; + int worldOffZ; + + worldOffY = offUp; + worldOffX = facing.offsetX * offFwd + facing.getRotation(ForgeDirection.UP).offsetX * offLat; + worldOffZ = facing.offsetZ * offFwd + facing.getRotation(ForgeDirection.UP).offsetZ * offLat; + + int[] rot = MultiblockHandlerXR.rotate(dims, facing); + for(int bx = -rot[4] + worldOffX; bx <= rot[5] + worldOffX; bx++) { + for(int by = -rot[1] + worldOffY; by <= rot[0] + worldOffY; by++) { + for(int bz = -rot[2] + worldOffZ; bz <= rot[3] + worldOffZ; bz++) { + BlockPos bp = new BlockPos(MathHelper.floor_double(originX) + bx, MathHelper.floor_double(originY) + by, MathHelper.floor_double(originZ) + bz); + blocks.add(bp); + set.add(bp); + } + } + + } + } + // This looks for the blocks nearby and draws lines between the + // vertexes to make different shaped boxes. + // Most of this was taken from Mellow (Thanks mellow) -Wolf + for(BlockPos pos : blocks) { + boolean px = set.contains(pos.add(1, 0, 0)); + boolean nx = set.contains(pos.add(-1, 0, 0)); + boolean ppy = set.contains(pos.add(0, 1, 0)); + boolean ny = set.contains(pos.add(0, -1, 0)); + boolean ppz = set.contains(pos.add(0, 0, 1)); + boolean nz = set.contains(pos.add(0, 0, -1)); + + double minX = pos.getX() - dX; + double maxX = pos.getX() + 1 - dX; + double minY = pos.getY() - dY; + double maxY = pos.getY() + 1 - dY; + double minZ = pos.getZ() - dZ; + double maxZ = pos.getZ() + 1 - dZ; + + if(!ppy) { + if(!nx) { + tess.addVertex(minX, maxY, minZ); + tess.addVertex(minX, maxY, maxZ); + } + if(!ppz) { + tess.addVertex(minX, maxY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + } + if(!px) { + tess.addVertex(maxX, maxY, maxZ); + tess.addVertex(maxX, maxY, minZ); + } + if(!nz) { + tess.addVertex(maxX, maxY, minZ); + tess.addVertex(minX, maxY, minZ); + } + } + if(!ny) { + if(!nx) { + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, minY, maxZ); + } + if(!ppz) { + tess.addVertex(minX, minY, maxZ); + tess.addVertex(maxX, minY, maxZ); + } + if(!px) { + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, minY, minZ); + } + if(!nz) { + tess.addVertex(maxX, minY, minZ); + tess.addVertex(minX, minY, minZ); + } + } + if(!nz) { + if(!nx) { + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, maxY, minZ); + } + if(!ppy) { + tess.addVertex(minX, maxY, minZ); + tess.addVertex(maxX, maxY, minZ); + } + if(!px) { + tess.addVertex(maxX, maxY, minZ); + tess.addVertex(maxX, minY, minZ); + } + if(!ny) { + tess.addVertex(maxX, minY, minZ); + tess.addVertex(minX, minY, minZ); + } + } + if(!ppz) { + if(!nx) { + tess.addVertex(minX, minY, maxZ); + tess.addVertex(minX, maxY, maxZ); + } + if(!ppy) { + tess.addVertex(minX, maxY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + } + if(!px) { + tess.addVertex(maxX, maxY, maxZ); + tess.addVertex(maxX, minY, maxZ); + } + if(!ny) { + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(minX, minY, maxZ); + } + } + if(!nx) { + if(!nz) { + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, maxY, minZ); + } + if(!ppy) { + tess.addVertex(minX, maxY, minZ); + tess.addVertex(minX, maxY, maxZ); + } + if(!ppz) { + tess.addVertex(minX, maxY, maxZ); + tess.addVertex(minX, minY, maxZ); + } + if(!ny) { + tess.addVertex(minX, minY, maxZ); + tess.addVertex(minX, minY, minZ); + } + } + if(!px) { + if(!nz) { + tess.addVertex(maxX, minY, minZ); + tess.addVertex(maxX, maxY, minZ); + } + if(!ppy) { + tess.addVertex(maxX, maxY, minZ); + tess.addVertex(maxX, maxY, maxZ); + } + if(!ppz) { + tess.addVertex(maxX, maxY, maxZ); + tess.addVertex(maxX, minY, maxZ); + } + if(!ny) { + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, minY, minZ); + } + } + } + + tess.setColorRGBA(0, 0, color, 255); + + // boo-yeah + for(double[] extra : this.getAABBExtras()) { + ForgeDirection rot = facing.getRotation(ForgeDirection.UP); + double cX = MathHelper.floor_double(originX) - dX + 0.5; + double cY = MathHelper.floor_double(originY) - dY; + double cZ = MathHelper.floor_double(originZ) - dZ + 0.5; + + double upr = extra[0]; + double lwr = extra[1]; + double fwd = extra[2]; + double bwd = extra[3]; + double lft = extra[4]; + double rgt = extra[5]; + + double x0 = cX + fwd * facing.offsetX + lft * rot.offsetX; + double x1 = cX + bwd * facing.offsetX + rgt * rot.offsetX; + double y0 = cY + lwr; + double y1 = cY + upr; + double z0 = cZ + fwd * facing.offsetZ + lft * rot.offsetZ; + double z1 = cZ + bwd * facing.offsetZ + rgt * rot.offsetZ; + + tess.addVertex(x0, y0, z0); tess.addVertex(x0, y0, z1); + tess.addVertex(x1, y0, z0); tess.addVertex(x1, y0, z1); + tess.addVertex(x0, y0, z0); tess.addVertex(x1, y0, z0); + tess.addVertex(x0, y0, z1); tess.addVertex(x1, y0, z1); + + tess.addVertex(x0, y1, z0); tess.addVertex(x0, y1, z1); + tess.addVertex(x1, y1, z0); tess.addVertex(x1, y1, z1); + tess.addVertex(x0, y1, z0); tess.addVertex(x1, y1, z0); + tess.addVertex(x0, y1, z1); tess.addVertex(x1, y1, z1); + + tess.addVertex(x0, y0, z0); tess.addVertex(x0, y1, z0); + tess.addVertex(x1, y0, z0); tess.addVertex(x1, y1, z0); + tess.addVertex(x0, y0, z1); tess.addVertex(x0, y1, z1); + tess.addVertex(x1, y0, z1); tess.addVertex(x1, y1, z1); + } + + tess.draw(); + tess.setTranslation(0, 0, 0); + + GL11.glDepthMask(true); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, OpenGlHelper.lastBrightnessX, OpenGlHelper.lastBrightnessY); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 507d6d814..d8d83ad42 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -745,6 +745,7 @@ public class ModBlocks { public static Block red_connector; public static Block red_connector_super; public static Block red_pylon; + public static Block red_pylon_steel; public static Block red_pylon_medium_wood; public static Block red_pylon_medium_wood_transformer; public static Block red_pylon_medium_steel; @@ -1020,6 +1021,8 @@ public class ModBlocks { public static Block machine_radgen; public static Block machine_satlinker; + public static Block machine_satlink; + public static Block machine_keyforge; public static Block machine_armor_table; @@ -1510,8 +1513,8 @@ public class ModBlocks { reinforced_ducrete = new BlockNoSpawn(Material.rock).setBlockName("reinforced_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(1000.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_ducrete"); lightstone = new BlockLightstone(Material.rock, LightstoneType.class, true, true).setBlockName("lightstone").setCreativeTab(MainRegistry.blockTab).setHardness(2F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":lightstone"); - brick_forgotten = new BlockPillar(Material.rock, RefStrings.MODID + ":brick_forgotten_top").setBlockName("brick_forgotten").setBlockUnbreakable().setResistance(666_666F).setBlockTextureName(RefStrings.MODID + ":brick_forgotten"); - brick_forgotten_lock = new BlockForgottenLock(Material.rock, RefStrings.MODID + ":brick_forgotten_top").setBlockName("brick_forgotten_lock").setBlockUnbreakable().setResistance(666_666F).setBlockTextureName(RefStrings.MODID + ":brick_forgotten_lock"); + brick_forgotten = new BlockForgottenBrick().setBlockName("brick_forgotten").setBlockUnbreakable().setResistance(666_666F).setBlockTextureName(RefStrings.MODID + ":brick_forgotten"); + brick_forgotten_lock = new BlockForgottenLock().setBlockName("brick_forgotten_lock").setBlockUnbreakable().setResistance(666_666F).setBlockTextureName(RefStrings.MODID + ":brick_forgotten_lock"); concrete_slab = new BlockMultiSlab(null, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete, asphalt).setBlockName("concrete_slab").setCreativeTab(MainRegistry.blockTab); concrete_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete, asphalt).setBlockName("concrete_double_slab").setCreativeTab(MainRegistry.blockTab); @@ -1854,6 +1857,7 @@ public class ModBlocks { red_connector = new ConnectorRedWire(Material.iron).setBlockName("red_connector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_connector"); red_connector_super = new ConnectorRedWireSuper(Material.iron).setBlockName("red_connector_super").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_connector"); red_pylon = new PylonRedWire(Material.iron).setBlockName("red_pylon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); + red_pylon_steel = new PylonRedWire(Material.iron).setBlockName("red_pylon_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_medium_wood = new PylonMedium(Material.wood).setBlockName("red_pylon_medium_wood").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_medium_wood_transformer = new PylonMedium(Material.wood).setBlockName("red_pylon_medium_wood_transformer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_medium_steel = new PylonMedium(Material.iron).setBlockName("red_pylon_medium_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); @@ -1900,7 +1904,7 @@ public class ModBlocks { crane_splitter = new CraneSplitter().setBlockName("crane_splitter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":crane_side"); crane_partitioner = new CranePartitioner().setBlockName("crane_partitioner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":crane_partitioner_side"); fan = new MachineFan().setBlockName("fan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - piston_inserter = new PistonInserter().setBlockName("piston_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + piston_inserter = new PistonInserter().setBlockName("piston_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); drone_waypoint = new DroneWaypoint().setBlockName("drone_waypoint").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint"); drone_crate = new DroneCrate().setBlockName("drone_crate").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -1936,6 +1940,7 @@ public class ModBlocks { machine_transformer = new MachineTransformer(Material.iron).setBlockName("machine_transformer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_transformer_iron"); machine_satlinker = new MachineSatLinker(Material.iron).setBlockName("machine_satlinker").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":machine_satlinker_side"); + machine_satlink = new MachineSatLink().setBlockName("machine_satlink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_keyforge = new MachineKeyForge(Material.iron).setBlockName("machine_keyforge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab).setBlockTextureName(RefStrings.MODID + ":machine_keyforge_side"); machine_armor_table = new BlockArmorTable(Material.iron).setBlockName("machine_armor_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab); machine_weapon_table = new BlockWeaponTable().setBlockName("machine_weapon_table").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab); @@ -3130,6 +3135,7 @@ public class ModBlocks { register(red_connector); register(red_connector_super); register(red_pylon); + register(red_pylon_steel); register(red_pylon_medium_wood); register(red_pylon_medium_wood_transformer); register(red_pylon_medium_steel); @@ -3289,6 +3295,7 @@ public class ModBlocks { GameRegistry.registerBlock(teleanchor, teleanchor.getUnlocalizedName()); GameRegistry.registerBlock(field_disturber, field_disturber.getUnlocalizedName()); GameRegistry.registerBlock(machine_satlinker, machine_satlinker.getUnlocalizedName()); + register(machine_satlink); GameRegistry.registerBlock(machine_keyforge, machine_keyforge.getUnlocalizedName()); GameRegistry.registerBlock(machine_armor_table, machine_armor_table.getUnlocalizedName()); GameRegistry.registerBlock(machine_weapon_table, machine_weapon_table.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockForgottenBrick.java b/src/main/java/com/hbm/blocks/generic/BlockForgottenBrick.java new file mode 100644 index 000000000..42bb95b16 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockForgottenBrick.java @@ -0,0 +1,112 @@ +package com.hbm.blocks.generic; + +import java.util.List; + +import com.hbm.blocks.BlockMulti; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class BlockForgottenBrick extends BlockMulti { + + private IIcon iconTop; + private IIcon iconAlt; + private IIcon iconAltTop; + private IIcon iconStone; + private IIcon iconHole; + private IIcon iconEmpty; + private IIcon iconPlanks; + private IIcon iconBricks; + + public static final int META_DEFAULT = 0; + public static final int META_BW = 1; + public static final int META_NULLSTONE = 2; + public static final int META_HOLE = 3; + public static final int META_HOLE_EMPTY = 4; + public static final int META_NULLROOM_WOOD = 5; + public static final int META_NULLROOM_STONE = 6; + + public BlockForgottenBrick() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.iconTop = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_top"); + this.iconAlt = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_bw"); + this.iconAltTop = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_bw_top"); + this.iconStone = reg.registerIcon(RefStrings.MODID + ":playground/nullstone_demo_1_wip"); + this.iconHole = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_hole"); + this.iconEmpty = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_hole_empty"); + this.iconPlanks = reg.registerIcon(RefStrings.MODID + ":nr_planks"); + this.iconBricks = reg.registerIcon(RefStrings.MODID + ":nr_stone"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + + if(meta == META_BW) { + if(side == 0 || side == 1) return this.iconAltTop; + return this.iconAlt; + } + if(meta == META_NULLSTONE) { + return this.iconStone; + } + if(meta == META_HOLE) { + if(side == 0 || side == 1) return this.iconTop; + return this.iconHole; + } + if(meta == META_HOLE_EMPTY) { + if(side == 0 || side == 1) return this.iconTop; + return this.iconEmpty; + } + if(meta == META_NULLROOM_WOOD) { + return this.iconPlanks; + } + if(meta == META_NULLROOM_STONE) { + return this.iconBricks; + } + + if(side == 0 || side == 1) return this.iconTop; + return this.blockIcon; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + int meta = world.getBlockMetadata(x, y, z); + + if(meta == META_HOLE) { + if(player.getHeldItem() == null) { + player.inventory.mainInventory[player.inventory.currentItem] = new ItemStack(ModItems.coal_eternal); + world.setBlockMetadataWithNotify(x, y, z, META_HOLE_EMPTY, 3); + return true; + } + return false; + } + + return false; + } + + @Override public int getSubCount() { return 7; } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < getSubCount(); ++i) { + list.add(new ItemStack(item, 1, i)); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockForgottenLock.java b/src/main/java/com/hbm/blocks/generic/BlockForgottenLock.java index b1af065e0..cca103db8 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockForgottenLock.java +++ b/src/main/java/com/hbm/blocks/generic/BlockForgottenLock.java @@ -1,21 +1,82 @@ package com.hbm.blocks.generic; -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.machine.BlockPillar; -import com.hbm.items.ModItems; +import java.util.List; +import com.hbm.blocks.BlockMulti; +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; + +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.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockForgottenLock extends BlockPillar { +public class BlockForgottenLock extends BlockMulti { + + private IIcon iconTop; + private IIcon iconAlt; + private IIcon iconAltTop; + private IIcon iconStone; + private IIcon iconStoneTop; + + public static final int META_DEFAULT = 0; + public static final int META_BW = 1; + public static final int META_NULLSTONE = 2; + public static final int META_THE_BLOCK_THAT_FUCKING_KILLS_YOU = 3; - public BlockForgottenLock(Material mat, String top) { - super(mat, top); + public BlockForgottenLock() { + super(Material.rock); } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.iconTop = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_top"); + this.iconAlt = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_bw_lock"); + this.iconStone = reg.registerIcon(RefStrings.MODID + ":playground/nullstone_demo_2_wip"); + this.iconStoneTop = reg.registerIcon(RefStrings.MODID + ":playground/nullstone_demo_1_wip"); + this.iconAltTop = reg.registerIcon(RefStrings.MODID + ":brick_forgotten_bw_top"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + + if(meta == META_BW) { + if(side == 0 || side == 1) return this.iconAltTop; + return this.iconAlt; + } + + if(meta == META_NULLSTONE) { + if(side == 0 || side == 1) return this.iconStoneTop; + return this.iconStone; + } + + if(side == 0 || side == 1) return this.iconTop; + return this.blockIcon; + } + + /* + * A red herring is something that misleads or distracts from a relevant or important question.[1] + * It may be either a logical fallacy or a literary device that leads readers or audiences toward a + * false conclusion. A red herring may be used intentionally, as in mystery fiction or as part of + * rhetorical strategies (e.g., in politics), or may be used in argumentation inadvertently.[2] + * + * The expression was popularized in 1807 by the English polemicist William Cobbett, who told a + * story of having used a strong-smelling smoked herring to divert and distract hounds from + * chasing a rabbit.[3] + */ @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { @@ -49,4 +110,14 @@ public class BlockForgottenLock extends BlockPillar { world.setBlock(x - dir.offsetX * d + rot.offsetX * w, y + h, z - dir.offsetZ * d + rot.offsetZ * w, b); } } + + @Override public int getSubCount() { return 3; } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < getSubCount(); ++i) { + list.add(new ItemStack(item, 1, i)); + } + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineAnnihilator.java b/src/main/java/com/hbm/blocks/machine/MachineAnnihilator.java index 38bb83680..1c00e165b 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineAnnihilator.java +++ b/src/main/java/com/hbm/blocks/machine/MachineAnnihilator.java @@ -31,7 +31,13 @@ public class MachineAnnihilator extends BlockDummyable { @Override public int[] getDimensions() { return new int[] {2, 0, 4, 4, 1, 1}; } @Override public int getOffset() { return 4; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {2, 0, 4, 4, 1, 1}, + new int[] {8, -2, 1, 1, 1, 1, -3, 0, 0} + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank.java index aea632987..77df48aff 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank.java @@ -43,7 +43,18 @@ public class MachineBigAssTank extends BlockDummyable implements IPersistentInfo @Override public int[] getDimensions() { return new int[] {5, 0, 4, 4, 4, 4}; } @Override public int getOffset() { return 6; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {5, 0, 4, 4, 4, 4}, + new int[] {4, 0, 5, -4, 2, 2}, + new int[] {4, 0, -4, 5, 2, 2}, + new int[] {4, 0, 2, 2, 5, -4}, + new int[] {4, 0, 2, 2, -4, 5}, + new int[] {3, 0, 6, -5, 0, 0}, + new int[] {3, 0, -5, 6, 0, 0} + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java b/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java index 9b7910686..282405fe7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCatalyticCracker.java @@ -49,7 +49,16 @@ public class MachineCatalyticCracker extends BlockDummyable implements ILookOver public int getOffset() { return 3; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {0, 0, 3, 3, 2, 3}, + new int[]{8, -1, 3, -1, 2, 0}, + new int[]{13, 0, 0, 3, 2, 1}, + new int[]{14, -13, -1, 2, 1, 0}, + new int[]{3, -1, 2, 3, -1, 3} + }; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java b/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java index b8401426a..e190051ed 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCatalyticReformer.java @@ -68,7 +68,14 @@ public class MachineCatalyticReformer extends BlockDummyable implements IPersist public int getOffset() { return 1; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {2, 0, 1, 1, 2, 2}, + new int[] {3, -3, 1, 0, -1, 2}, + new int[] {6, -3, 1, 1, 2, 0}, + }; + } @Override public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineChungus.java b/src/main/java/com/hbm/blocks/machine/MachineChungus.java index 8972ca7ac..6614dbfe8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChungus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChungus.java @@ -89,7 +89,15 @@ public class MachineChungus extends BlockDummyable implements ITooltipProvider, public int getOffset() { return 3; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 3, 0, 0, 3, 2, 2 }, + new int[] { 4, -4, 0, 3, 1, 1 }, + new int[] { 3, 0, 6, -1, 1, 1 }, + new int[] { 2, 0, 10, -7, 1, 1 }, + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/MachineCoker.java b/src/main/java/com/hbm/blocks/machine/MachineCoker.java index 695698016..4c26a4aa7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCoker.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCoker.java @@ -43,7 +43,17 @@ public class MachineCoker extends BlockDummyable implements ITooltipProvider { public int getOffset() { return 1; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {22, 0, 1, 1, 1, 1}, + new int[] {5, 0, 2, 2, 2, 2, 0, 1, 0}, + new int[] {0, 1, 0, 0, 0, 0, 2, 1, 2}, + new int[] {0, 1, 0, 0, 0, 0, 2, 1, -2}, + new int[] {0, 1, 0, 0, 0, 0, -2, 1, 2}, + new int[] {0, 1, 0, 0, 0, 0, -2, 1, -2}, + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { if(super.checkRequirement(world, x, y, z, dir, o)) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineCompressor.java b/src/main/java/com/hbm/blocks/machine/MachineCompressor.java index f22bc3fc1..22cc0d0e8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCompressor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCompressor.java @@ -34,7 +34,14 @@ public class MachineCompressor extends BlockDummyable { public int getOffset() { return 2; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {2, 0, 1, 2, 1, 1}, + new int[] {3, -3, 1, 1, 1, 1}, + new int[] {8, -4, 0, 0, 1, 1} + }; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java index 1f7b923a2..d4204d79f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java @@ -59,7 +59,7 @@ public class MachineDiesel extends BlockMachineBase implements ITooltipProvider if(efficiency != null) { int eff = (int)(efficiency * 100); - list.add(EnumChatFormatting.YELLOW + "-" + grade.getGrade() + ": " + EnumChatFormatting.RED + "" + eff + "%"); + list.add(EnumChatFormatting.YELLOW + "-" + grade.getLocalizedName() + ": " + EnumChatFormatting.RED + "" + eff + "%"); } } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index ec787564a..0a4825728 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -32,7 +32,24 @@ public class MachineElectrolyser extends BlockDummyable { public int getOffset() { return 5; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {0, 0, 5, 5, 1, 3}, + new int[] {2, -1, 5, 5, 1, 1}, + new int[] {3, -3, 5, 5, 0, 0}, + new int[] {3, -1, 4, -4, -3, 3}, + new int[] {3, -1, 2, -2, -3, 3}, + new int[] {3, -1, 0, 0, -3, 3}, + new int[] {3, -1, -2, 2, -3, 3}, + new int[] {3, -1, -4, 4, -3, 3}, + new int[] {0, 0, 0, 0, -1, 2, 4, 3, 0}, + new int[] {0, 0, 0, 0, -1, 2, 2, 3, 0}, + new int[] {0, 0, 0, 0, -1, 2, 0, 3, 0}, + new int[] {0, 0, 0, 0, -1, 2, -2, 3, 0}, + new int[] {0, 0, 0, 0, -1, 2, -4, 3, 0}, + }; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, -1); diff --git a/src/main/java/com/hbm/blocks/machine/MachineExcavator.java b/src/main/java/com/hbm/blocks/machine/MachineExcavator.java index c91d6bb16..06dfce2e8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineExcavator.java +++ b/src/main/java/com/hbm/blocks/machine/MachineExcavator.java @@ -44,7 +44,15 @@ public class MachineExcavator extends BlockDummyable { public int getHeightOffset() { return 3; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {3, 0, 3, 3, 3, 3}, + new int[] {-1, 3, 3, -2, 3, -2}, + new int[] {-1, 3, 3, -2, -2, 3}, + new int[] {-1, 3, -2, 3, 3, 3}, + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { x += dir.offsetX * o; diff --git a/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java b/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java index e0d906181..e062201dc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java +++ b/src/main/java/com/hbm/blocks/machine/MachineExposureChamber.java @@ -32,7 +32,17 @@ public class MachineExposureChamber extends BlockDummyable { public int getOffset() { return 2; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + getDimensions(), + new int[] {3, 0, 0, 0, -3, 8}, + new int[] {0, 0, 1, -1, -3, 6, 0, 2, 0}, + new int[] {0, 0, -1, 1, -3, 6, 0, 2, 0}, + new int[] {3, 0, 1, -1, 0, 1, 0, 0, -7}, + new int[] {3, 0, -1, 1, 0, 1, 0, 0, -7}, + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java b/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java index 761aa10ed..d872fc7a9 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFrackingTower.java @@ -46,7 +46,20 @@ public class MachineFrackingTower extends BlockDummyable implements IPersistentI public int getOffset() { return 0; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {3, 0, 0, 0, 0, 0}, + new int[] {1, 0, 3, 3, 3, 3, 0, 2, 0}, + new int[] {-1, 2, 0, 1, 0, 1, -2, 2, -2}, + new int[] {-1, 2, 0, 1, 0, 1, 3, 2, -2}, + new int[] {-1, 2, 0, 1, 0, 1, -2, 2, 3}, + new int[] {-1, 2, 0, 1, 0, 1, 3, 2, 3}, + new int[] {10, -4, 2, 2, 2, 2}, + new int[] {24, -9, 1, 1, 1, 1}, + new int[] {1, 0, -2, 3, 1, 1, 0, 15, 0}, + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineICF.java b/src/main/java/com/hbm/blocks/machine/MachineICF.java index 29bca9b90..6e39bd62e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineICF.java +++ b/src/main/java/com/hbm/blocks/machine/MachineICF.java @@ -33,7 +33,14 @@ public class MachineICF extends BlockDummyable { public int getOffset() { return 1; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {5, 0, 1, 1, 8, 8}, + new int[] {1, 1, -1, 2, 8, 8, 0, 3, 0}, + new int[] {1, 1, 2, -1, 8, 8, 0, 3, 0}, + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/MachinePumpjack.java b/src/main/java/com/hbm/blocks/machine/MachinePumpjack.java index 56f05147d..ad8af4b7b 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePumpjack.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePumpjack.java @@ -47,7 +47,16 @@ public class MachinePumpjack extends BlockDummyable implements IPersistentInfoPr public int getOffset() { return 0; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {3, 0, 0, 0, 0, 6}, + new int[] {0, 0, -1, 1, -2, 4}, + new int[] {0, 0, 1, -1, -1, 5}, + new int[] {0, 0, -1, 1, 1, 1, 0, 0, -3}, + new int[] {0, 0, 1, -1, 2, 2, 0, 0, -3}, + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/MachineSatLink.java b/src/main/java/com/hbm/blocks/machine/MachineSatLink.java new file mode 100644 index 000000000..443778855 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineSatLink.java @@ -0,0 +1,84 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.items.ISatChip; +import com.hbm.main.NTMSounds; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityMachineSatLink; +import com.hbm.util.i18n.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class MachineSatLink extends BlockDummyable implements ILookOverlay { + + public MachineSatLink() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineSatLink(); + if(meta >= 6) return new TileEntityProxyCombo(); + return null; + } + + @Override public int[] getDimensions() { return new int[] {6, 0, 1, 0, 1, 0}; } + @Override public int getOffset() { return 0; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(!world.isRemote && !player.isSneaking()) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ISatChip) { + + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return false; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(te instanceof TileEntityMachineSatLink)) return false; + + TileEntityMachineSatLink link = (TileEntityMachineSatLink) te; + + link.freq = ISatChip.getFreqS(player.getHeldItem()); + player.addChatComponentMessage(new ChatComponentText("Set frequency to " + link.freq).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW))); + world.playSoundAtEntity(player, NTMSounds.TECH_BLEEP, 1F, 1F); + + return true; + } + return false; + + } else { + return true; + } + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return; + + TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(te instanceof TileEntityMachineSatLink)) return; + + TileEntityMachineSatLink link = (TileEntityMachineSatLink) te; + + List text = new ArrayList(); + text.add("Freq: " + link.freq); + text.add("Connected: " + (link.connected ? (EnumChatFormatting.GREEN + "Yes") : (EnumChatFormatting.RED + "No"))); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java index 354e91136..10345bcb8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java @@ -47,7 +47,13 @@ public class MachineStrandCaster extends BlockDummyable implements ICrucibleAcce public int getOffset() { return 0; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 0, 0, 6, 0, 1, 0 }, + new int[] { 2, 0, 1, 0, 1, 0 } + }; + } @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachineStrandCaster(); diff --git a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java index fb8a30c88..78f9ac60e 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java @@ -78,6 +78,6 @@ public class MachineTurbofan extends BlockDummyable implements ITooltipProvider @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.YELLOW + "Fuel efficiency:"); - list.add(EnumChatFormatting.YELLOW + "-" + FuelGrade.AERO.getGrade() + ": " + EnumChatFormatting.RED + "100%"); + list.add(EnumChatFormatting.YELLOW + "-" + FuelGrade.AERO.getLocalizedName() + ": " + EnumChatFormatting.RED + "100%"); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java b/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java index 1316a02eb..5d892c5ea 100644 --- a/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java +++ b/src/main/java/com/hbm/blocks/machine/ReactorZirnox.java @@ -62,7 +62,15 @@ public class ReactorZirnox extends BlockDummyable { public int getOffset() { return 2; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {1, 0, 2, 2, 2, 2,}, + new int[] {4, -2, 1, 1, 1, 1}, + new int[] {4, -2, 0, 0, 2, -2}, + new int[] {4, -2, 0, 0, -2, 2} + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/SoyuzLauncher.java b/src/main/java/com/hbm/blocks/machine/SoyuzLauncher.java index 598f9aef4..98106fada 100644 --- a/src/main/java/com/hbm/blocks/machine/SoyuzLauncher.java +++ b/src/main/java/com/hbm/blocks/machine/SoyuzLauncher.java @@ -168,7 +168,18 @@ public class SoyuzLauncher extends BlockDummyable { public int getOffset() { return 0; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 0, 1, 6, 6, 6, 6 }, + new int[] { -2, 4, -3, 6, -3, 6 }, + new int[] { -2, 4, 6, -3, -3, 6 }, + new int[] { -2, 4, 6, -3, 6, -3 }, + new int[] { -2, 4, -3, 6, 6, -3 }, + new int[] { 0, 4, 1, 1, -6, 8 }, + new int[] { 0, 4, 2, 2, 9, -5 }, + }; + } private final Random field_149933_a = new Random(); private static boolean keepInventory; diff --git a/src/main/java/com/hbm/blocks/machine/Watz.java b/src/main/java/com/hbm/blocks/machine/Watz.java index 41f6767ed..bedbd245e 100644 --- a/src/main/java/com/hbm/blocks/machine/Watz.java +++ b/src/main/java/com/hbm/blocks/machine/Watz.java @@ -53,7 +53,16 @@ public class Watz extends BlockDummyable { public int getOffset() { return 3; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {2, 0, 3, 3, 1, 1}, + new int[] {2, 0, 2, 2, 2, -2}, + new int[] {2, 0, 2, 2, -2, 2}, + new int[] {2, 0, 1, 1, 3, -3}, + new int[] {2, 0, 1, 1, -3, 3}, + }; + } @Override protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java index 4b7461433..4c6e24608 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java @@ -43,9 +43,8 @@ public class BlockPASource extends BlockDummyable implements ITooltipProvider { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); - - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); this.makeExtra(world, x + rot.offsetX * 4, y, z + rot.offsetZ * 4); this.makeExtra(world, x + dir.offsetX, y, z + dir.offsetZ); this.makeExtra(world, x + dir.offsetX + rot.offsetX * 2, y, z + dir.offsetZ + rot.offsetZ * 2); @@ -53,6 +52,10 @@ public class BlockPASource extends BlockDummyable implements ITooltipProvider { this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); this.makeExtra(world, x - dir.offsetX + rot.offsetX * 2, y, z - dir.offsetZ + rot.offsetZ * 2); this.makeExtra(world, x - dir.offsetX - rot.offsetX * 2, y, z - dir.offsetZ - rot.offsetZ * 2); + + this.makeExtra(world, x, y - 1, z); + this.makeExtra(world, x + rot.offsetX * 2, y - 1, z + rot.offsetZ * 2); + this.makeExtra(world, x - rot.offsetX * 2, y - 1, z - rot.offsetZ * 2); } @Override diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBoiler.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBoiler.java index 7e61a254d..38426d68a 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBoiler.java @@ -44,6 +44,13 @@ public class MachineFusionBoiler extends BlockDummyable implements ILookOverlay, return 4; } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -4.5, -4.5, 1, -1} + }; + } + @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBreeder.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBreeder.java index d86c1f6bd..e16e9a468 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBreeder.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionBreeder.java @@ -36,6 +36,13 @@ public class MachineFusionBreeder extends BlockDummyable implements ITooltipProv public int getOffset() { return 2; } + + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -2.5, -2.5, 1, -1} + }; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCollector.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCollector.java index 2c7b92ebc..f8ff9fe50 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCollector.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCollector.java @@ -35,6 +35,13 @@ public class MachineFusionCollector extends BlockDummyable implements ITooltipPr return 1; } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -2.5, -2.5, 1, -1} + }; + } + @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCoupler.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCoupler.java index e9ddafbe1..fcfa2b5b4 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCoupler.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionCoupler.java @@ -34,6 +34,14 @@ public class MachineFusionCoupler extends BlockDummyable implements ITooltipProv return 0; } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, 1, -1, 1.5, 1.5}, + {1.5, 3.5, 1, -1, -1.5, -1.5} + }; + } + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { addStandardInfo(stack, player, list, ext); diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystron.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystron.java index 46f5abc0f..b186de59a 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystron.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystron.java @@ -35,7 +35,21 @@ public class MachineFusionKlystron extends BlockDummyable implements ITooltipPro @Override public int[] getDimensions() { return new int[] { 3, 0, 4, 3, 2, 2 }; } @Override public int getOffset() { return 3; } + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 3, 0, 4, 3, 2, 2 }, + new int[] { 4, -3, 4, 3, 1, 1 }, + }; + } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -4.5, -4.5, 1, -1} + }; + } + @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystronCreative.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystronCreative.java index 5b0b2edba..28cba05a4 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystronCreative.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionKlystronCreative.java @@ -28,7 +28,21 @@ public class MachineFusionKlystronCreative extends BlockDummyable implements ITo @Override public int[] getDimensions() { return new int[] { 3, 0, 4, 3, 2, 2 }; } @Override public int getOffset() { return 3; } + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 3, 0, 4, 3, 2, 2 }, + new int[] { 4, -3, 4, 3, 1, 1 }, + }; + } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -4.5, -4.5, 1, -1} + }; + } + @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionMHDT.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionMHDT.java index 2af2192b9..952abfb17 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionMHDT.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionMHDT.java @@ -44,7 +44,26 @@ public class MachineFusionMHDT extends BlockDummyable implements ILookOverlay, I public int getOffset() { return 7; } + + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 2, 0, 6, 7, 2, 2 }, + new int[] { 3, -2, 6, 2, 1, 1 }, + new int[] { 3, -2, -6, 7, 1, 1 }, + new int[] { 3, -2, -3, 5, 2, 2 }, + new int[] { 4, -3, -3, 5, 1, 1 }, + new int[] { 1, 0, 0, 1, 3, 3, 3, 0, 0 }, + }; + } + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, -6.5, -6.5, 1, -1} + }; + } + @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { return super.checkRequirement(world, x, y, z, dir, o) && diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java index 5da87a630..aa365a6f4 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionPlasmaForge.java @@ -31,6 +31,29 @@ public class MachineFusionPlasmaForge extends BlockDummyable { @Override public int[] getDimensions() { return new int[] { 2, 0, 2, 2, 5, 5 }; } @Override public int getOffset() { return 5; } + + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 2, 0, 2, 2, 5, 5 }, + new int[] { 4, -3, 0, 0, 4, 4 }, + new int[] { 2, 0, 3, -2, 4, 4 }, + new int[] { 2, 0, -2, 3, 4, 4 }, + new int[] { 2, 0, 4, -3, 3, 3 }, + new int[] { 2, 0, -3, 4, 3, 3 }, + new int[] { 2, 0, 5, -4, 2, 2 }, + new int[] { 2, 0, -4, 5, 2, 2 }, + new int[] { 3, -2, 1, 1, 5, 5 } + }; + } + + @Override + public double[][] getAABBExtras() { + return new double[][] { + {1.5, 3.5, 1, -1, 5.5, 5.5}, + {1.5, 3.5, 1, -1, -5.5, -5.5} + }; + } @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { diff --git a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionTorus.java b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionTorus.java index 578e23738..d557e8886 100644 --- a/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionTorus.java +++ b/src/main/java/com/hbm/blocks/machine/fusion/MachineFusionTorus.java @@ -97,6 +97,27 @@ public class MachineFusionTorus extends BlockDummyable implements ITooltipProvid public int getOffset() { return 7; } + + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] { 4, 0, 7, 7, 3, 3 }, + new int[] { 4, 0, 6, 6, 4, 4 }, + new int[] { 4, 0, 5, 5, 5, 5 }, + new int[] { 4, 0, 4, 4, 6, 6 }, + new int[] { 4, 0, 3, 3, 7, 7 }, + }; + } + + @Override + public double[][] getAABBExtras() { + return new double[][] { + {3.5, 1.5, 7.5, 7.5, 1, -1}, + {3.5, 1.5, -7.5, -7.5, 1, -1}, + {3.5, 1.5, 1, -1, 7.5, 7.5}, + {3.5, 1.5, 1, -1, -7.5, -7.5}, + }; + } @Override public boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) { diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java index c205ef53d..51d620a2f 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPile.java @@ -98,19 +98,21 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable, IL @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityPileBaseMK2) { - TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; - world.removeTileEntity(x, y, z); - if(pile.coreY >= 0) world.setBlock(x, y, z, ModBlocks.pile_brick); + if(!TileEntityPileCore.meltingDown) { + TileEntity tile = world.getTileEntity(x, y, z); - TileEntityPileCore core = pile.getCore(); - if(core != null && !core.isInvalid()) core.destroy(); - - } else { - world.removeTileEntity(x, y, z); - world.setBlock(x, y, z, ModBlocks.pile_brick); + if(tile instanceof TileEntityPileBaseMK2) { + TileEntityPileBaseMK2 pile = (TileEntityPileBaseMK2) tile; + world.removeTileEntity(x, y, z); + if(pile.coreY >= 0) world.setBlock(x, y, z, ModBlocks.pile_brick); + + TileEntityPileCore core = pile.getCore(); + if(core != null && !core.isInvalid()) core.destroy(); + + } else { + world.removeTileEntity(x, y, z); + world.setBlock(x, y, z, ModBlocks.pile_brick); + } } super.breakBlock(world, x, y, z, block, meta); } @@ -151,6 +153,15 @@ public class BlockPile extends BlockContainer implements IBlockCT, IToolable, IL if(meta == META_AIR_IN) text.add("Air Inlet"); if(meta == META_AIR_OUT) text.add("Air Outlet"); if(meta == META_CONTROL) text.add("Control Rod Channel"); + + if(meta == META_CORE) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityPileCore) { + TileEntityPileCore core = (TileEntityPileCore) tile; + text.add("Max Temp: " + (int) Math.round(core.highestHeat) + " / " + core.MAX_HEAT + "°C"); + } + } + if(!text.isEmpty()) ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java index f309e03ba..7a3d77f88 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileBrick.java @@ -1,6 +1,7 @@ package com.hbm.blocks.machine.pile; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockFlammable; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.pile.TileEntityPileBaseMK2; @@ -10,7 +11,6 @@ import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileOrientation; import api.hbm.block.IToolable; 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.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -18,13 +18,13 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockPileBrick extends Block implements IToolable { +public class BlockPileBrick extends BlockFlammable implements IToolable { @SideOnly(Side.CLIENT) protected IIcon iconTop; @SideOnly(Side.CLIENT) protected IIcon iconSide; public BlockPileBrick() { - super(Material.rock); + super(Material.rock, 30, 5); } @Override @@ -127,7 +127,7 @@ public class BlockPileBrick extends Block implements IToolable { world.setBlock(iX, iY, iZ, ModBlocks.pile_block, BlockPile.META_CORE, 3); TileEntityPileCore core = (TileEntityPileCore) world.getTileEntity(iX, iY, iZ); core.orientation = PileOrientation.getOrientation(dir); - core.setupSize(posHeight + negHeight + 1, left + right + 1, depth + 1); + core.setupSize(posHeight, negHeight, left, right, depth + 1); } else { int edgeCount = 0; if(h == -negHeight || h == posHeight) edgeCount++; diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java index d362e0c7e..c0fc2adc5 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockPileDevice.java @@ -6,14 +6,18 @@ import java.util.List; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; import com.hbm.main.NTMSounds; import com.hbm.tileentity.machine.pile.TileEntityPileControl; +import com.hbm.tileentity.machine.pile.TileEntityPileCore; import com.hbm.tileentity.machine.pile.TileEntityPileLoader; import com.hbm.tileentity.machine.pile.TileEntityPileVent; import com.hbm.util.i18n.I18nUtil; +import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; @@ -28,7 +32,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILookOverlay, ITooltipProvider { +public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILookOverlay, ITooltipProvider, IToolable { public static final int ITEM_META_LOADER = 0; public static final int ITEM_META_VENT = 1; @@ -79,6 +83,8 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(player.isSneaking()) return false; + int meta = world.getBlockMetadata(x, y, z); meta -= meta % 4; @@ -151,20 +157,24 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo List text = new ArrayList(); TileEntity tile = world.getTileEntity(x, y, z); + /*if(tile instanceof TileEntityPileDeviceBase) { + TileEntityPileDeviceBase device = (TileEntityPileDeviceBase) tile; + text.add("#" + (device.chanNum + 1)); + }*/ + if(tile instanceof TileEntityPileLoader) { TileEntityPileLoader device = (TileEntityPileLoader) tile; - text.add("Index: " + device.chanNum); + text.add("Temp: " + (int) Math.round(device.channelTemp) + " / " + TileEntityPileCore.MAX_HEAT + "°C"); if(device.syncStack != null) text.add("Loading: " + device.syncStack.getDisplayName()); - } - - if(tile instanceof TileEntityPileVent) { - TileEntityPileVent device = (TileEntityPileVent) tile; - text.add("Index: " + device.chanNum); + + if(device.channelStack != null) { + text.add("Last rod: " + device.channelStack.getDisplayName()); + if(device.channelDepletion > 0) text.add("Depletion: " + (int) Math.round(device.channelDepletion) + "%"); + } } if(tile instanceof TileEntityPileControl) { TileEntityPileControl device = (TileEntityPileControl) tile; - text.add("Index: " + device.chanNum); text.add("Extraction level: " + (int) + (device.level * 100) + "%"); } @@ -184,4 +194,27 @@ public class BlockPileDevice extends BlockContainer implements IBlockMulti, ILoo if(meta == ITEM_META_CONTROL) return this.getUnlocalizedName() + ".control"; return this.getUnlocalizedName(); } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + int meta = world.getBlockMetadata(x, y, z); + + if(meta >= BLOCK_META_CONTROL) { + y -= 1; + side = 1; + } else { + ForgeDirection dir = ForgeDirection.getOrientation(meta % 4 + 2); + x -= dir.offsetX; + z -= dir.offsetZ; + side = dir.ordinal(); + } + + Block b = world.getBlock(x, y, z); + if(b == ModBlocks.pile_block) { + return ((BlockPile) b).onScrew(world, player, x, y, z, side, fX, fY, fZ, tool); + } + + return false; + } } diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java index de8789215..568c4f3ec 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java @@ -107,7 +107,13 @@ public class RBMKConsole extends BlockDummyable implements IToolable { public int getOffset() { return 1; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {3, 0, 0, 0, 2, 2}, + new int[] {0, 0, 0, 1, 2, 2}, + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKCraneConsole.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKCraneConsole.java index 680856254..9468765bd 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKCraneConsole.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKCraneConsole.java @@ -38,7 +38,13 @@ public class RBMKCraneConsole extends BlockDummyable implements IToolable { public int getOffset() { return 1; } - + @Override + public int[][] getAllDimensions() { + return new int[][] { + new int[] {1, 0, 0, 0, 1, 1}, + new int[] {0, 0, 0, 1, 1, 1}, + }; + } @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); diff --git a/src/main/java/com/hbm/blocks/network/PylonRedWire.java b/src/main/java/com/hbm/blocks/network/PylonRedWire.java index 8594cbb72..7c14957c1 100644 --- a/src/main/java/com/hbm/blocks/network/PylonRedWire.java +++ b/src/main/java/com/hbm/blocks/network/PylonRedWire.java @@ -1,6 +1,10 @@ package com.hbm.blocks.network; +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.network.TileEntityPylonBase; import com.hbm.tileentity.network.TileEntityPylon; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -10,15 +14,17 @@ import net.minecraft.world.World; import java.util.List; -public class PylonRedWire extends PylonBase { +public class PylonRedWire extends BlockDummyable implements ITooltipProvider { - public PylonRedWire(Material material) { - super(material); + public PylonRedWire(Material mat) { + super(mat); } @Override public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityPylon(); + + if(meta >= 12) return new TileEntityPylon(); + return null; } @Override @@ -26,4 +32,34 @@ public class PylonRedWire extends PylonBase { list.add(EnumChatFormatting.GOLD + "Connection Type: " + EnumChatFormatting.YELLOW + "Single"); list.add(EnumChatFormatting.GOLD + "Connection Range: " + EnumChatFormatting.YELLOW + "25m"); } + + @Override + public int[] getDimensions() { + return new int[] {4, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int m) { + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityPylonBase) ((TileEntityPylonBase)te).disconnectAll(); + super.breakBlock(world, x, y, z, b, m); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + TileEntityPylonBase te = (TileEntityPylonBase) world.getTileEntity(pos[0], pos[1], pos[2]); + return te.setColor(player.getHeldItem()); + } else { + return false; + } + } } diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java index 279cf0a52..e20d2410c 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -50,6 +50,7 @@ public class StructureConfig { public static int radioSpawnWeight = 30; public static int forestChemSpawnWeight = 30; public static int forestPostSpawnWeight = 30; + public static int towerBaseSpawnWeight = 30; public static int spireSpawnWeight = 2; public static int craneSpawnWeight = 20; @@ -115,6 +116,7 @@ public class StructureConfig { oceanNullWeight = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.38_oceanNullWeight", "Null spawn weight for ocean biomes", 35); craneSpawnWeight = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.39_craneSpawnWeight", "Spawn weight for crane structure.", 20); broadcastingTowerSpawnWeight = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.40_broadcastingTowerSpawnWeight", "Spawn weight for broadcasting tower structure.", 25); + towerBaseSpawnWeight = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.41_towerBaseSpawnWeight", "Spawn weight for tower base.", 30); structureMinChunks = CommonConfig.setDef(structureMinChunks, 4); diff --git a/src/main/java/com/hbm/handler/FuelHandler.java b/src/main/java/com/hbm/handler/FuelHandler.java index b89b86d58..f188eef34 100644 --- a/src/main/java/com/hbm/handler/FuelHandler.java +++ b/src/main/java/com/hbm/handler/FuelHandler.java @@ -39,6 +39,7 @@ public class FuelHandler implements IFuelHandler { if(fuel.getItem() == Item.getItemFromBlock(ModBlocks.block_coke)) return single * 160; if(fuel.getItem() == ModItems.book_guide) return single; if(fuel.getItem() == ModItems.coal_infernal) return 4800; + if(fuel.getItem() == ModItems.coal_eternal) return single * 16; if(fuel.getItem() == ModItems.crystal_coal) return 6400; if(fuel.getItem() == ModItems.powder_sawdust) return single / 2; diff --git a/src/main/java/com/hbm/handler/MultiblockHandlerXR.java b/src/main/java/com/hbm/handler/MultiblockHandlerXR.java index 80ed65dc5..7f054d8c7 100644 --- a/src/main/java/com/hbm/handler/MultiblockHandlerXR.java +++ b/src/main/java/com/hbm/handler/MultiblockHandlerXR.java @@ -128,11 +128,8 @@ public class MultiblockHandlerXR { public static int[] rotate(int[] dim, ForgeDirection dir) { - if(dim == null) - return null; - - if(dir == ForgeDirection.SOUTH) - return dim; + if(dim == null) return null; + if(dir == ForgeDirection.SOUTH) return dim; if(dir == ForgeDirection.NORTH) { // U D N S W E @@ -151,5 +148,27 @@ public class MultiblockHandlerXR { return dim; } - + + public static double[] rotateDouble(double[] dim, ForgeDirection dir) { + + if(dim == null) return null; + if(dir == ForgeDirection.SOUTH) return dim; + + if(dir == ForgeDirection.NORTH) { + // U D N S W E + return new double[] { dim[0], dim[1], dim[3], dim[2], dim[5], dim[4] }; + } + + if(dir == ForgeDirection.EAST) { + // U D N S W E + return new double[] { dim[0], dim[1], dim[5], dim[4], dim[2], dim[3] }; + } + + if(dir == ForgeDirection.WEST) { + // U D N S W E + return new double[] { dim[0], dim[1], dim[4], dim[5], dim[3], dim[2] }; + } + + return dim; + } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineDiesel.java b/src/main/java/com/hbm/inventory/container/ContainerMachineDiesel.java index a4539cf77..86406303b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineDiesel.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineDiesel.java @@ -10,68 +10,57 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerMachineDiesel extends Container { - + private TileEntityMachineDiesel diFurnace; - + public ContainerMachineDiesel(InventoryPlayer invPlayer, TileEntityMachineDiesel tedf) { - + diFurnace = tedf; - - this.addSlotToContainer(new Slot(tedf, 0, 44, 17)); - this.addSlotToContainer(new SlotTakeOnly(tedf, 1, 44, 53)); - this.addSlotToContainer(new Slot(tedf, 2, 116, 53)); - this.addSlotToContainer(new Slot(tedf, 3, 8, 17)); - this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 8, 53)); - - for(int i = 0; i < 3; i++) - { - for(int j = 0; j < 9; j++) - { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + + this.addSlotToContainer(new Slot(tedf, 0, 17, 17)); + this.addSlotToContainer(new SlotTakeOnly(tedf, 1, 17, 53)); + this.addSlotToContainer(new Slot(tedf, 2, 141, 71)); + this.addSlotToContainer(new Slot(tedf, 3, 35, 71)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 121 + i * 18)); } } - - for(int i = 0; i < 9; i++) - { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 179)); } } - + @Override public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); - - if (var4 != null && var4.getHasStack()) - { + + if(var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - - if (par2 <= 4) { - if (!this.mergeItemStack(var5, 5, this.inventorySlots.size(), true)) - { + + if(par2 <= 4) { + if(!this.mergeItemStack(var5, 5, this.inventorySlots.size(), true)) { return null; } + } else if(!this.mergeItemStack(var5, 0, 1, false)) { + if(!this.mergeItemStack(var5, 2, 3, false)) + if(!this.mergeItemStack(var5, 4, 5, false)) + return null; } - else if (!this.mergeItemStack(var5, 0, 1, false)) - { - if (!this.mergeItemStack(var5, 2, 3, false)) - if (!this.mergeItemStack(var5, 4, 5, false)) - return null; - } - - if (var5.stackSize == 0) - { + + if(var5.stackSize == 0) { var4.putStack((ItemStack) null); - } - else - { + } else { var4.onSlotChanged(); } } - + return var3; - } + } @Override public boolean canInteractWith(EntityPlayer player) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineKeyForge.java b/src/main/java/com/hbm/inventory/container/ContainerMachineKeyForge.java index e95d67023..8c35c1d43 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineKeyForge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineKeyForge.java @@ -17,21 +17,21 @@ public class ContainerMachineKeyForge extends Container { diFurnace = tedf; - this.addSlotToContainer(new Slot(tedf, 0, 44, 35)); - this.addSlotToContainer(new Slot(tedf, 1, 80, 35)); - this.addSlotToContainer(new Slot(tedf, 2, 116, 35)); + this.addSlotToContainer(new Slot(tedf, 0, 44, 36)); + this.addSlotToContainer(new Slot(tedf, 1, 80, 36)); + this.addSlotToContainer(new Slot(tedf, 2, 116, 36)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineSatLinker.java b/src/main/java/com/hbm/inventory/container/ContainerMachineSatLinker.java index 449ee965e..273cacbe8 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineSatLinker.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineSatLinker.java @@ -17,21 +17,21 @@ public class ContainerMachineSatLinker extends Container { diFurnace = tedf; - this.addSlotToContainer(new Slot(tedf, 0, 44, 35)); - this.addSlotToContainer(new Slot(tedf, 1, 80, 35)); - this.addSlotToContainer(new Slot(tedf, 2, 116, 35)); + this.addSlotToContainer(new Slot(tedf, 0, 44, 36)); + this.addSlotToContainer(new Slot(tedf, 1, 80, 36)); + this.addSlotToContainer(new Slot(tedf, 2, 116, 36)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerSatDock.java b/src/main/java/com/hbm/inventory/container/ContainerSatDock.java index 02f02db56..3cee8e12e 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerSatDock.java +++ b/src/main/java/com/hbm/inventory/container/ContainerSatDock.java @@ -18,23 +18,23 @@ public class ContainerSatDock extends Container { tileSatelliteDock = tesd; //Storage - this.addSlotToContainer(new SlotTakeOnly(tesd, 0, 62, 17)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 1, 80, 17)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 2, 98, 17)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 3, 116, 17)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 4, 134, 17)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 5, 62, 35)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 6, 80, 35)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 7, 98, 35)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 8, 116, 35)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 9, 134, 35)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 10, 62, 53)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 11, 80, 53)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 12, 98, 53)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 13, 116, 53)); - this.addSlotToContainer(new SlotTakeOnly(tesd, 14, 134, 53)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 0, 71, 18)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 1, 71 + 18, 18)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 2, 71 + 18 * 2, 18)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 3, 71 + 18 * 3, 18)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 4, 71 + 18 * 4, 18)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 5, 71, 36)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 6, 71 + 18, 36)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 7, 71 + 18 * 2, 36)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 8, 71 + 18 * 3, 36)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 9, 71 + 18 * 4, 36)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 10, 71, 54)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 11, 71 + 18, 54)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 12, 71 + 18 * 2, 54)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 13, 71 + 18 * 3, 54)); + this.addSlotToContainer(new SlotTakeOnly(tesd, 14, 71 + 18 * 4, 54)); //Chip - this.addSlotToContainer(new Slot(tesd, 15, 26, 35) { + this.addSlotToContainer(new Slot(tesd, 15, 26, 36) { @Override public boolean isItemValid(ItemStack stack) { return stack.getItem() instanceof ItemSatChip; @@ -43,12 +43,12 @@ public class ContainerSatDock extends Container { for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerSoyuzCapsule.java b/src/main/java/com/hbm/inventory/container/ContainerSoyuzCapsule.java index 390391847..4ccf28730 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerSoyuzCapsule.java +++ b/src/main/java/com/hbm/inventory/container/ContainerSoyuzCapsule.java @@ -19,23 +19,23 @@ public class ContainerSoyuzCapsule extends Container { { for(int j = 0; j < 6; j++) { - this.addSlotToContainer(new Slot(tedf, j + i * 6, 8 + j * 18 + 18 * 2, 17 + i * 18)); + this.addSlotToContainer(new Slot(tedf, j + i * 6, 26 + j * 18 + 18 * 2, 18 + i * 18)); } } - this.addSlotToContainer(new Slot(tedf, 18, 8, 35)); + this.addSlotToContainer(new Slot(tedf, 18, 17, 36)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerSoyuzLauncher.java b/src/main/java/com/hbm/inventory/container/ContainerSoyuzLauncher.java index 6c13565d7..6fa787caa 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerSoyuzLauncher.java +++ b/src/main/java/com/hbm/inventory/container/ContainerSoyuzLauncher.java @@ -17,29 +17,29 @@ public class ContainerSoyuzLauncher extends Container { nukeBoy = tedf; //Soyuz - this.addSlotToContainer(new Slot(tedf, 0, 62, 18)); + this.addSlotToContainer(new Slot(tedf, 0, 98, 80)); //Designator - this.addSlotToContainer(new Slot(tedf, 1, 62, 36)); + this.addSlotToContainer(new Slot(tedf, 1, 80, 80)); //Satellite - this.addSlotToContainer(new Slot(tedf, 2, 116, 18)); + this.addSlotToContainer(new Slot(tedf, 2, 98, 26)); //Landing module - this.addSlotToContainer(new Slot(tedf, 3, 116, 36)); + this.addSlotToContainer(new Slot(tedf, 3, 80, 26)); //Kerosene IN - this.addSlotToContainer(new Slot(tedf, 4, 8, 90)); + this.addSlotToContainer(new Slot(tedf, 4, 152, 98)); //Kerosene OUT - this.addSlotToContainer(new Slot(tedf, 5, 8, 108)); - //Peroxide IN - this.addSlotToContainer(new Slot(tedf, 6, 26, 90)); - //Peroxide OUT - this.addSlotToContainer(new Slot(tedf, 7, 26, 108)); + this.addSlotToContainer(new Slot(tedf, 5, 152, 116)); + //Oxyden IN + this.addSlotToContainer(new Slot(tedf, 6, 170, 98)); + //Oxyden OUT + this.addSlotToContainer(new Slot(tedf, 7, 170, 116)); //Battery - this.addSlotToContainer(new Slot(tedf, 8, 44, 108)); + this.addSlotToContainer(new Slot(tedf, 8, 134, 98)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 6; j++) { - this.addSlotToContainer(new Slot(tedf, j + i * 6 + 9, 62 + j * 18, 72 + i * 18)); + this.addSlotToContainer(new Slot(tedf, j + i * 6 + 9, 44 - i * 18, 26 + j * 18)); } } @@ -47,13 +47,13 @@ public class ContainerSoyuzLauncher extends Container { { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 56)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 17 + j * 18, 162 + i * 18)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + 56)); + this.addSlotToContainer(new Slot(invPlayer, i, 17 + i * 18, 220)); } } @@ -68,8 +68,8 @@ public class ContainerSoyuzLauncher extends Container { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - if (par2 <= 27) { - if (!this.mergeItemStack(var5, 9, this.inventorySlots.size(), true)) + if (par2 < 27) { + if (!this.mergeItemStack(var5, 27, this.inventorySlots.size(), true)) { return null; } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 99d05b0ac..2efe207de 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -194,7 +194,7 @@ public class Fluids { public static FluidType CONCRETE; public static FluidType DHC; - /* Lagacy names for compatibility purposes */ + /* Legacy names for compatibility purposes */ @Deprecated public static FluidType ACID; //JAOPCA uses this, apparently public static final HashBiMap renameMapping = HashBiMap.create(); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java index a297d40ca..781b92004 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java @@ -6,6 +6,7 @@ import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.util.BobMathUtil; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; @@ -25,11 +26,11 @@ public class FT_Combustible extends FluidTrait { public void addInfo(List info) { super.addInfo(info); - info.add(EnumChatFormatting.GOLD + "[Combustible]"); + info.add(EnumChatFormatting.GOLD + "[" + I18nUtil.resolveKey("hbmfluid.trait.combustible") + "]"); if(combustionEnergy > 0) { - info.add(EnumChatFormatting.GOLD + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(combustionEnergy) + "HE " + EnumChatFormatting.GOLD + "per bucket"); - info.add(EnumChatFormatting.GOLD + "Fuel grade: " + EnumChatFormatting.RED + this.fuelGrade.getGrade()); + info.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("hbmfluid.trait.provides") + " " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(combustionEnergy) + "HE " + EnumChatFormatting.GOLD + I18nUtil.resolveKey("hbmfluid.trait.perBucket")); + info.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("hbmfluid.trait.fuelGrade") + ": " + EnumChatFormatting.RED + this.fuelGrade.getLocalizedName()); } } @@ -42,11 +43,11 @@ public class FT_Combustible extends FluidTrait { } public static enum FuelGrade { - LOW("Low"), //heating and industrial oil < star engine, iGen - MEDIUM("Medium"), //petroil < diesel generator - HIGH("High"), //diesel, gasoline < HP engine - AERO("Aviation"), //kerosene and other light aviation fuels < turbofan - GAS("Gaseous"); //fuel gasses like NG, PG and syngas < gas turbine + LOW("low"), //heating and industrial oil < star engine, iGen + MEDIUM("medium"), //petroil < diesel generator + HIGH("high"), //diesel, gasoline < HP engine + AERO("aviation"), //kerosene and other light aviation fuels < turbofan + GAS("gaseous"); //fuel gasses like NG, PG and syngas < gas turbine private String grade; @@ -54,8 +55,8 @@ public class FT_Combustible extends FluidTrait { this.grade = grade; } - public String getGrade() { - return this.grade; + public String getLocalizedName() { + return I18nUtil.resolveKey("hbmfluid.trait.fuel." + this.grade); } } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java index 3e57ac963..7de6e2e07 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; @@ -42,26 +43,30 @@ public class FT_Coolable extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.RED + "Thermal capacity: " + heatEnergy + " TU per " + amountReq + "mB"); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey("hbmfluid.trait.thermalCapacity") + ": " + heatEnergy + " " + I18nUtil.resolveKey("hbmfluid.trait.perTU") + " " + amountReq + "mB"); for(CoolingType type : CoolingType.values()) { double eff = getEfficiency(type); if(eff > 0) { - info.add(EnumChatFormatting.YELLOW + "[" + type.name + "] " + EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + info.add(EnumChatFormatting.YELLOW + "[" + type.getLocalizedName() + "] " + EnumChatFormatting.AQUA + I18nUtil.resolveKey("hbmfluid.trait.efficiency") + ": " + ((int) (eff * 100D)) + "%"); } } } public static enum CoolingType { - TURBINE("Turbine Steam"), - HEATEXCHANGER("Coolable"); + TURBINE("steam"), + HEATEXCHANGER("coolable"); - public String name; + private String name; private CoolingType(String name) { this.name = name; } + + public String getLocalizedName() { + return I18nUtil.resolveKey("hbmfluid.trait." + this.name); + } } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java index 2a459e25c..e1ed00366 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java @@ -6,6 +6,8 @@ import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.util.EnumChatFormatting; public class FT_Corrosive extends FluidTrait { @@ -31,9 +33,9 @@ public class FT_Corrosive extends FluidTrait { public void addInfo(List info) { if(isHighlyCorrosive()) - info.add(EnumChatFormatting.GOLD + "[Strongly Corrosive]"); + info.add(EnumChatFormatting.GOLD + "[" + I18nUtil.resolveKey("hbmfluid.trait.corrosiveStrong") + "]"); else - info.add(EnumChatFormatting.YELLOW + "[Corrosive]"); + info.add(EnumChatFormatting.YELLOW + "[" + I18nUtil.resolveKey("hbmfluid.trait.corrosive") + "]"); } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java index 82e309ef9..42078c841 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java @@ -6,6 +6,7 @@ import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.util.BobMathUtil; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; @@ -28,10 +29,10 @@ public class FT_Flammable extends FluidTrait { public void addInfo(List info) { super.addInfo(info); - info.add(EnumChatFormatting.YELLOW + "[Flammable]"); + info.add(EnumChatFormatting.YELLOW + "[" + I18nUtil.resolveKey("hbmfluid.trait.flammable") + "]"); if(energy > 0) - info.add(EnumChatFormatting.YELLOW + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "TU " + EnumChatFormatting.YELLOW + "per bucket"); + info.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("hbmfluid.trait.provides") + " " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "TU " + EnumChatFormatting.YELLOW + I18nUtil.resolveKey("hbmfluid.trait.perBucket")); } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java index f51d64ab8..3186da963 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; @@ -42,13 +43,13 @@ public class FT_Heatable extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.RED + "Thermal capacity: " + this.getFirstStep().heatReq + " TU per " + this.getFirstStep().amountReq + "mB"); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey("hbmfluid.trait.thermalCapacity") + ": " + this.getFirstStep().heatReq + " " + I18nUtil.resolveKey("hbmfluid.trait.perTU") + " " + this.getFirstStep().amountReq + "mB"); for(HeatingType type : HeatingType.values()) { double eff = getEfficiency(type); if(eff > 0) { - info.add(EnumChatFormatting.YELLOW + "[" + type.name + "] " + EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + info.add(EnumChatFormatting.YELLOW + "[" + type.getLocalizedName() + "] " + EnumChatFormatting.AQUA + I18nUtil.resolveKey("hbmfluid.trait.efficiency") + ": " + ((int) (eff * 100D)) + "%"); } } } @@ -68,17 +69,21 @@ public class FT_Heatable extends FluidTrait { } public static enum HeatingType { - BOILER("Boilable"), - HEATEXCHANGER("Heatable"), - PWR("PWR Coolant"), - ICF("ICF Coolant"), - PA("Particle Accelerator Coolant"); + BOILER("boilable"), + HEATEXCHANGER("heatable"), + PWR("coolantPWR"), + ICF("coolantICF"), + PA("coolantPA"); - public String name; + private String name; private HeatingType(String name) { this.name = name; } + + public String getLocalizedName() { + return I18nUtil.resolveKey("hbmfluid.trait." + this.name); + } } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java index 26f254e54..4d873a8cc 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java @@ -6,6 +6,8 @@ import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.util.EnumChatFormatting; public class FT_PWRModerator extends FluidTrait { @@ -22,13 +24,13 @@ public class FT_PWRModerator extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.BLUE + "[PWR Flux Multiplier]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.pwrFluxMultiplier") + "]"); } @Override public void addInfoHidden(List info) { int mult = (int) (multiplier * 100 - 100); - info.add(EnumChatFormatting.BLUE + "Core flux " + (mult >= 0 ? "+" : "") + mult + "%"); + info.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("hbmfluid.trait.pwrFluxCore") + " " + (mult >= 0 ? "+" : "") + mult + "%"); } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Pheromone.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Pheromone.java index 123b2751b..670cbc70c 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Pheromone.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Pheromone.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import net.minecraft.util.EnumChatFormatting; +import com.hbm.util.i18n.I18nUtil; import java.io.IOException; import java.util.List; @@ -25,9 +26,9 @@ public class FT_Pheromone extends FluidTrait{ public void addInfo(List info) { if(type == 1) { - info.add(EnumChatFormatting.AQUA + "[Glyphid Pheromones]"); + info.add(EnumChatFormatting.AQUA + "[" + I18nUtil.resolveKey("hbmfluid.trait.glyphidPheromones") + "]"); } else { - info.add(EnumChatFormatting.BLUE + "[Modified Pheromones]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.modifiedPheromones") + "]"); } } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Polluting.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Polluting.java index 79103bc68..ab4566820 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Polluting.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Polluting.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; +import java.util.Locale; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; @@ -11,9 +12,11 @@ import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraft.util.StatCollector; public class FT_Polluting extends FluidTrait { @@ -33,20 +36,20 @@ public class FT_Polluting extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.GOLD + "[Polluting]"); + info.add(EnumChatFormatting.GOLD + "[" + I18nUtil.resolveKey("hbmfluid.trait.polluting") + "]"); } @Override public void addInfoHidden(List info) { if(!this.releaseMap.isEmpty()) { - info.add(EnumChatFormatting.GREEN + "When spilled:"); - for(Entry entry : releaseMap.entrySet()) info.add(EnumChatFormatting.GREEN + " - " + entry.getValue() + " " + entry.getKey() + " per mB"); + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("hbmfluid.trait.spilled") + ":"); + for(Entry entry : releaseMap.entrySet()) info.add(EnumChatFormatting.GREEN + " - " + entry.getValue() + " " + StatCollector.translateToLocal("pollution.trait." + entry.getKey().name().toLowerCase(Locale.US)) + " " + I18nUtil.resolveKey("hbmfluid.trait.perMB")); } if(!this.burnMap.isEmpty()) { - info.add(EnumChatFormatting.RED + "When burned:"); - for(Entry entry : burnMap.entrySet()) info.add(EnumChatFormatting.RED + " - " + entry.getValue() + " " + entry.getKey() + " per mB"); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey("hbmfluid.trait.burned") + ":"); + for(Entry entry : burnMap.entrySet()) info.add(EnumChatFormatting.RED + " - " + entry.getValue() + " " + StatCollector.translateToLocal("pollution.trait." + entry.getKey().name().toLowerCase(Locale.US)) + " " + I18nUtil.resolveKey("hbmfluid.trait.perMB")); } } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Toxin.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Toxin.java index 748459014..92e60adf7 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Toxin.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Toxin.java @@ -31,7 +31,7 @@ public class FT_Toxin extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.LIGHT_PURPLE + "[Toxin]"); + info.add(EnumChatFormatting.LIGHT_PURPLE + "[" + I18nUtil.resolveKey("hbmfluid.trait.toxin") + "]"); for(ToxinEntry entry : entries) { entry.addInfo(info); @@ -101,7 +101,7 @@ public class FT_Toxin extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(clazz.lang) + (fullBody ? EnumChatFormatting.RED + " (requires hazmat suit)" : "") + ": " + EnumChatFormatting.YELLOW + String.format(Locale.US, "%,.1f", amount * 20 / delay) + " DPS"); + info.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(clazz.lang) + (fullBody ? EnumChatFormatting.RED + " (" + I18nUtil.resolveKey("hbmfluid.trait.hazmat") + ")" : "") + ": " + EnumChatFormatting.YELLOW + String.format(Locale.US, "%,.1f", amount * 20 / delay) + " " + I18nUtil.resolveKey("hbmfluid.trait.perDamage")); } } @@ -130,7 +130,7 @@ public class FT_Toxin extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(clazz.lang) + (fullBody ? EnumChatFormatting.RED + " (requires hazmat suit)" + EnumChatFormatting.YELLOW : "") + ":"); + info.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(clazz.lang) + (fullBody ? EnumChatFormatting.RED + " (" + I18nUtil.resolveKey("hbmfluid.trait.hazmat") + ")" + EnumChatFormatting.YELLOW : "") + ":"); for(PotionEffect eff : effects) { info.add(EnumChatFormatting.YELLOW + " - " + I18nUtil.resolveKey(eff.getEffectName()) + (eff.getAmplifier() > 0 ? " " + StatCollector.translateToLocal("potion.potency." + eff.getAmplifier()).trim() : "") + " " + StringUtils.ticksToElapsedTime(eff.getDuration())); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java index 976dfedb2..dbc4fdfa6 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -32,7 +33,7 @@ public class FT_VentRadiation extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.YELLOW + "[Radioactive]"); + info.add(EnumChatFormatting.YELLOW + "[" + I18nUtil.resolveKey("hbmfluid.trait.radioactive") + "]"); } @Override diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java index 71cdc2a3e..30a7ae2e9 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java @@ -2,37 +2,38 @@ package com.hbm.inventory.fluid.trait; import java.util.List; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.util.EnumChatFormatting; public class FluidTraitSimple { public static class FT_Gaseous extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.BLUE + "[Gaseous]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.gaseous") + "]"); } } /** gaseous at room temperature, for cryogenic hydrogen for example */ public static class FT_Gaseous_ART extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.BLUE + "[Gaseous at Room Temperature]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.gaseousRoom") + "]"); } } public static class FT_Liquid extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.BLUE + "[Liquid]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.liquid") + "]"); } } /** to viscous to be sprayed/turned into a mist */ public static class FT_Viscous extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.BLUE + "[Viscous]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.viscous") + "]"); } } - - public static class FT_Plasma extends FluidTrait { + @Deprecated public static class FT_Plasma extends FluidTrait { @Override public void addInfoHidden(List info) { info.add(EnumChatFormatting.LIGHT_PURPLE + "[Plasma]"); } @@ -40,25 +41,25 @@ public class FluidTraitSimple { public static class FT_Amat extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.DARK_RED + "[Antimatter]"); + info.add(EnumChatFormatting.DARK_RED + "[" + I18nUtil.resolveKey("hbmfluid.trait.antimatter") + "]"); } } public static class FT_LeadContainer extends FluidTrait { @Override public void addInfo(List info) { - info.add(EnumChatFormatting.DARK_RED + "[Requires hazardous material tank to hold]"); + info.add(EnumChatFormatting.DARK_RED + "[" + I18nUtil.resolveKey("hbmfluid.trait.leadContainer") + "]"); } } public static class FT_Delicious extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.DARK_GREEN + "[Delicious]"); + info.add(EnumChatFormatting.DARK_GREEN + "[" + I18nUtil.resolveKey("hbmfluid.trait.delicious") + "]"); } } public static class FT_Unsiphonable extends FluidTrait { @Override public void addInfoHidden(List info) { - info.add(EnumChatFormatting.BLUE + "[Ignored by siphon]"); + info.add(EnumChatFormatting.BLUE + "[" + I18nUtil.resolveKey("hbmfluid.trait.unsiphonable") + "]"); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICalculator.java b/src/main/java/com/hbm/inventory/gui/GUICalculator.java index 63933eec5..ddfa8e3b7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICalculator.java +++ b/src/main/java/com/hbm/inventory/gui/GUICalculator.java @@ -48,7 +48,7 @@ public class GUICalculator extends GuiScreen { if (!inputField.textboxKeyTyped(p_73869_1_, p_73869_2_)) super.keyTyped(p_73869_1_, p_73869_2_); - String input = inputField.getText().replaceAll("[^\\d+\\-*/^!.()\\sA-Za-z]+", ""); + String input = inputField.getText().replaceAll("[^\\d+\\-*/%^!.()\\sA-Za-z]+", ""); if (p_73869_1_ == 13 || p_73869_1_ == 10) { // when pressing enter (CR or LF) if (selectedHist != -1) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java index a50cb1277..a7a3d900d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java @@ -4,16 +4,20 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineDiesel; import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.TileEntityMachineDiesel; import net.minecraft.client.Minecraft; +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 GUIMachineDiesel extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/GUIDiesel.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/generators/gui_diesel.png"); private TileEntityMachineDiesel diesel; public GUIMachineDiesel(InventoryPlayer invPlayer, TileEntityMachineDiesel tedf) { @@ -21,35 +25,43 @@ public class GUIMachineDiesel extends GuiInfoContainer { diesel = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 203; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - diesel.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 69 - 52, 16, 52); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 69 - 52, 16, 52, diesel.power, diesel.powerCap); + diesel.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 69 - 52, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 141, guiTop + 69 - 52, 16, 52, diesel.power, diesel.powerCap); String[] text = new String[] { "Fuel consumption rate:", " 1 mB/t", " 20 mB/s", "(Consumption rate is constant)" }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 8, guiTop + 36, 16, 16, guiLeft, guiTop + 36 + 16, text); if(!diesel.hasAcceptableFuel()) { - String[] text2 = new String[] { "Error: The currently set fuel type", "is not supported by this engine!" }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 32, 16, 16, guiLeft - 8, guiTop + 36 + 16 + 32, text2); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 8, guiTop + 36 + 32, 16, 16, guiLeft, guiTop + 36 + 16 + 32, text2); + } + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 89 <= x && guiLeft + 89 + 16 > x && guiTop + 61 < y && guiTop + 61 + 14 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("turnOn", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, diesel.xCoord, diesel.yCoord, diesel.zCoord)); } } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diesel.hasCustomInventoryName() ? this.diesel.getInventoryName() : I18n.format(this.diesel.getInventoryName()); - - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -60,20 +72,18 @@ public class GUIMachineDiesel extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); if(diesel.power > 0) { - int i = (int)diesel.getPowerScaled(52); - drawTexturedModalRect(guiLeft + 152, guiTop + 69 - i, 176, 52 - i, 16, i); + int i = (int) diesel.getPowerScaled(52); + drawTexturedModalRect(guiLeft + 141, guiTop + 69 - i, 176, 52 - i, 16, i); } - if(diesel.tank.getFill() > 0 && diesel.hasAcceptableFuel()) - { - drawTexturedModalRect(guiLeft + 43 + 18 * 4, guiTop + 34, 208, 0, 18, 18); - } + if(diesel.isOn) drawTexturedModalRect(guiLeft + 79, guiTop + 61, 192, 16, 35, 14); + if(diesel.wasOn) drawTexturedModalRect(guiLeft + 89, guiTop + 42, 192, 0, 16, 16); - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); + this.drawInfoPanel(guiLeft - 8, guiTop + 36, 16, 16, 2); if(!diesel.hasAcceptableFuel()) - this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 32, 16, 16, 6); + this.drawInfoPanel(guiLeft - 8, guiTop + 36 + 32, 16, 16, 6); - diesel.tank.renderTank(guiLeft + 80, guiTop + 69, this.zLevel, 16, 52); + diesel.tank.renderTank(guiLeft + 35, guiTop + 69, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineKeyForge.java b/src/main/java/com/hbm/inventory/gui/GUIMachineKeyForge.java index 54cafc0d0..dfa6794a7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineKeyForge.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineKeyForge.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineKeyForge; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineKeyForge; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; @@ -13,7 +14,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineKeyForge extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_keyforge.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_keyforge.png"); private TileEntityMachineKeyForge siren; public GUIMachineKeyForge(InventoryPlayer invPlayer, TileEntityMachineKeyForge tedf) { @@ -21,26 +22,25 @@ public class GUIMachineKeyForge extends GuiInfoContainer { siren = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 186; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - String[] text = new String[] { "The first slot will copy the key/lock's", - "pin configuration and paste it to the second slot." }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); + String[] keyText = I18nUtil.resolveKeyArray("desc.gui.keyforge.key"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 12, guiTop + 28, 16, 16, guiLeft - 8, guiTop + 36 + 16, keyText); - String[] text1 = new String[] { "The third slot will randomize the", - "key/lock's pin configuration."}; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16, text1); + String[] randomText = I18nUtil.resolveKeyArray("desc.gui.keyforge.random"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 12, guiTop + 28 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16, randomText); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.siren.hasCustomInventoryName() ? this.siren.getInventoryName() : I18n.format(this.siren.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0xffffff); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -50,7 +50,7 @@ public class GUIMachineKeyForge extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); - this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); + this.drawInfoPanel(guiLeft + 12, guiTop + 28, 16, 16, 2); + this.drawInfoPanel(guiLeft + 12, guiTop + 28 + 16, 16, 16, 3); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java index dfb32841c..908ce2c73 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java @@ -36,11 +36,12 @@ public class GUIMachineOilWell extends GuiInfoContainer { derrick.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 54, guiTop + 45, 6, 32); } - String[] upgradeText = new String[4]; + String[] upgradeText = new String[5]; upgradeText[0] = I18nUtil.resolveKey("desc.gui.upgrade"); upgradeText[1] = I18nUtil.resolveKey("desc.gui.upgrade.speed"); upgradeText[2] = I18nUtil.resolveKey("desc.gui.upgrade.power"); upgradeText[3] = I18nUtil.resolveKey("desc.gui.upgrade.afterburner"); + upgradeText[4] = I18nUtil.resolveKey("desc.gui.upgrade.overdrive"); this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 160, guiTop + 21, 8, 8, mouseX, mouseY, upgradeText); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 22, 16, 34, derrick.power, derrick.getMaxPower()); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSatLinker.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSatLinker.java index 9bd5eeb50..c6783fa0a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSatLinker.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSatLinker.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineSatLinker; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineSatLinker; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; @@ -13,7 +14,7 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineSatLinker extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_linker.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_sat_linker.png"); private TileEntityMachineSatLinker siren; public GUIMachineSatLinker(InventoryPlayer invPlayer, TileEntityMachineSatLinker tedf) { @@ -21,25 +22,24 @@ public class GUIMachineSatLinker extends GuiInfoContainer { siren = tedf; this.xSize = 176; - this.ySize = 166; + this.ySize = 186; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - String[] text = new String[] { "The first slot will copy the satellite/chip's", - "frequency and paste it to the second slot." }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); + String[] chipText = I18nUtil.resolveKeyArray("desc.gui.satlinker.chip"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 12, guiTop + 28, 16, 16, guiLeft - 8, guiTop + 36 + 16, chipText); - String[] text1 = new String[] { "The third slot will randomize the", - "satellite/chip's frequency."}; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16, text1); + String[] randomText = I18nUtil.resolveKeyArray("desc.gui.satlinker.random"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 12, guiTop + 28 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16, randomText); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.siren.hasCustomInventoryName() ? this.siren.getInventoryName() : I18n.format(this.siren.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -50,7 +50,7 @@ public class GUIMachineSatLinker extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); - this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); + this.drawInfoPanel(guiLeft + 12, guiTop + 28, 16, 16, 2); + this.drawInfoPanel(guiLeft + 12, guiTop + 28 + 16, 16, 16, 3); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUISatDock.java b/src/main/java/com/hbm/inventory/gui/GUISatDock.java index 369530b2f..08d66d82a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISatDock.java +++ b/src/main/java/com/hbm/inventory/gui/GUISatDock.java @@ -3,6 +3,8 @@ package com.hbm.inventory.gui; import com.hbm.inventory.container.ContainerSatDock; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineSatDock; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; @@ -11,7 +13,7 @@ import org.lwjgl.opengl.GL11; public class GUISatDock extends GuiInfoContainer { - public static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_dock.png"); + public static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_sat_dock.png"); private final TileEntityMachineSatDock tileSatelliteDock; public GUISatDock(InventoryPlayer invPlayer, TileEntityMachineSatDock tesd) { @@ -19,24 +21,22 @@ public class GUISatDock extends GuiInfoContainer { tileSatelliteDock = tesd; this.xSize = 176; - this.ySize = 168; + this.ySize = 186; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - String[] text = new String[] { "Requires linked miner sat chip.", - "Cargo ship will land periodically to", - "deliver resources." }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); + String[] text = I18nUtil.resolveKeyArray("desc.gui.satdock.desc"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 7, guiTop + 36, 16, 16, guiLeft - 7, guiTop + 36 + 16, text); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.tileSatelliteDock.hasCustomInventoryName() ? this.tileSatelliteDock.getInventoryName() : I18n.format(this.tileSatelliteDock.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0x404040); + this.fontRendererObj.drawString(name, 115 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0x404040); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 0x404040); } @@ -46,6 +46,6 @@ public class GUISatDock extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); + this.drawInfoPanel(guiLeft - 7, guiTop + 36, 16, 16, 2); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUISoyuzCapsule.java b/src/main/java/com/hbm/inventory/gui/GUISoyuzCapsule.java index 055aeabd5..b1a83afe0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISoyuzCapsule.java +++ b/src/main/java/com/hbm/inventory/gui/GUISoyuzCapsule.java @@ -14,7 +14,7 @@ import net.minecraft.util.ResourceLocation; public class GUISoyuzCapsule extends GuiContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_soyuz_capsule.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_soyuz_capsule.png"); private TileEntitySoyuzCapsule diFurnace; public GUISoyuzCapsule(InventoryPlayer invPlayer, TileEntitySoyuzCapsule tedf) { @@ -22,14 +22,14 @@ public class GUISoyuzCapsule extends GuiContainer { diFurnace = tedf; this.xSize = 176; - this.ySize = 168; + this.ySize = 186; } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, 115 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0x7daf71); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java index a1fdb30cc..aace50777 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java @@ -7,6 +7,7 @@ import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.AuxButtonPacket; import com.hbm.tileentity.machine.TileEntitySoyuzLauncher; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; @@ -16,49 +17,50 @@ import net.minecraft.util.ResourceLocation; public class GUISoyuzLauncher extends GuiInfoContainer { - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_soyuz.png"); + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_soyuz.png"); private TileEntitySoyuzLauncher launcher; public GUISoyuzLauncher(InventoryPlayer invPlayer, TileEntitySoyuzLauncher tedf) { super(new ContainerSoyuzLauncher(invPlayer, tedf)); launcher = tedf; - this.xSize = 176; - this.ySize = 222; + this.xSize = 194; + this.ySize = 244; } @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - launcher.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 36, 16, 52); - launcher.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 36, 16, 52); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 49, guiTop + 72, 6, 34, launcher.power, launcher.maxPower); + launcher.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 44, 16, 52); + launcher.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 170, guiTop + 44, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 134, guiTop + 44, 16, 52, launcher.power, launcher.maxPower); + + String[] descText = I18nUtil.resolveKeyArray("desc.gui.soyuz.desc"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 53, 16, 16, guiLeft - 8, guiTop + 53 + 16, descText); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 43, guiTop + 17, 18, 18, mouseX, mouseY, new String[]{"The Soyuz goes here"} ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 43, guiTop + 35, 18, 18, mouseX, mouseY, new String[]{"Designator only for CARGO MODE"} ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 17, 18, 18, mouseX, mouseY, new String[]{"The payload for SATELLITE MODE"} ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 35, 18, 18, mouseX, mouseY, new String[]{"The orbital module for special payloads"} ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 88, guiTop + 17, 18, 18, mouseX, mouseY, new String[]{"SATELLITE MODE"} ); - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 88, guiTop + 35, 18, 18, mouseX, mouseY, new String[]{"CARGO MODE"} ); + String[] cargoText = I18nUtil.resolveKeyArray("desc.gui.soyuz.cargo"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 79, guiTop + 52, 18, 18, mouseX, mouseY, cargoText ); + String[] satelliteText = I18nUtil.resolveKeyArray("desc.gui.soyuz.satellite"); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 97, guiTop + 52, 18, 18, mouseX, mouseY, satelliteText ); } protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); - if(guiLeft + 88 <= x && guiLeft + 88 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(launcher.xCoord, launcher.yCoord, launcher.zCoord, 0, 0)); } - if(guiLeft + 88 <= x && guiLeft + 88 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { + if(guiLeft + 79 <= x && guiLeft + 79 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(launcher.xCoord, launcher.yCoord, launcher.zCoord, 1, 0)); } - if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 17 < y && guiTop + 17 + 18 >= y) { + if(guiLeft + 88 <= x && guiLeft + 88 + 18 > x && guiTop + 97 < y && guiTop + 97 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(launcher.xCoord, launcher.yCoord, launcher.zCoord, 0, 1)); @@ -69,8 +71,8 @@ public class GUISoyuzLauncher extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.launcher.hasCustomInventoryName() ? this.launcher.getInventoryName() : I18n.format(this.launcher.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 4, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 17, this.ySize - 96 + 2, 4210752); String secs = "" + launcher.countdown / 20; String cents = "" + (launcher.countdown % 20) * 5; @@ -79,9 +81,9 @@ public class GUISoyuzLauncher extends GuiInfoContainer { if(cents.length() == 1) cents += "0"; - float scale = 0.5F; + float scale = 1; GL11.glScalef(scale, scale, 1); - this.fontRendererObj.drawString(secs + ":" + cents, (int)(153.5F / scale), (int)(37.5F / scale), 0xff0000); + this.fontRendererObj.drawString(secs + ":" + cents, (int)(85 / scale), (int)(121 / scale), 0xff0000); GL11.glScalef(1/scale, 1/scale, 1); } @@ -91,47 +93,49 @@ public class GUISoyuzLauncher extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int i = (int)launcher.getPowerScaled(34); - drawTexturedModalRect(guiLeft + 49, guiTop + 106 - i, 194, 52 - i, 6, i); + int i = (int)launcher.getPowerScaled(52); + drawTexturedModalRect(guiLeft + 134, guiTop + 96 - i, 194, 52 - i, 16, i); - drawTexturedModalRect(guiLeft + 61, guiTop + 17, 176 + (launcher.hasRocket() ? 18 : 0), 0, 18, 18); + drawTexturedModalRect(guiLeft + 97, guiTop + 79, 210 + (launcher.hasRocket() ? 18 : 0), 8, 18, 18); int j = launcher.designator(); if(j > 0) - drawTexturedModalRect(guiLeft + 61, guiTop + 35, 176 + (j - 1) * 18, 0, 18, 18); + drawTexturedModalRect(guiLeft + 79, guiTop + 79, 210 + (j - 1) * 18, 8, 18, 18); int k = launcher.mode; - drawTexturedModalRect(guiLeft + 88, guiTop + 17 + k * 18, 176, 18 + k * 18, 18, 18); + drawTexturedModalRect(guiLeft + 97 - k * 18, guiTop + 52, 228 - k * 18, 26, 18, 18); int l = launcher.orbital(); if(l > 0) - drawTexturedModalRect(guiLeft + 115, guiTop + 35, 176 + (l - 1) * 18, 0, 18, 18); + drawTexturedModalRect(guiLeft + 79, guiTop + 25, 210 + (l - 1) * 18, 8, 18, 18); int m = launcher.satellite(); if(m > 0) - drawTexturedModalRect(guiLeft + 115, guiTop + 17, 176 + (m - 1) * 18, 0, 18, 18); + drawTexturedModalRect(guiLeft + 97, guiTop + 25, 210 + (m - 1) * 18, 8, 18, 18); if(launcher.starting) - drawTexturedModalRect(guiLeft + 151, guiTop + 17, 176, 54, 18, 18); + drawTexturedModalRect(guiLeft + 88, guiTop + 97, 210, 44, 18, 18); if(launcher.hasFuel()) - drawTexturedModalRect(guiLeft + 13, guiTop + 23, 212, 0, 6, 8); + drawTexturedModalRect(guiLeft + 157, guiTop + 31, 210, 0, 6, 8); else - drawTexturedModalRect(guiLeft + 13, guiTop + 23, 218, 0, 6, 8); + drawTexturedModalRect(guiLeft + 157, guiTop + 31, 216, 0, 6, 8); if(launcher.hasOxy()) - drawTexturedModalRect(guiLeft + 31, guiTop + 23, 212, 0, 6, 8); + drawTexturedModalRect(guiLeft + 175, guiTop + 31, 210, 0, 6, 8); else - drawTexturedModalRect(guiLeft + 31, guiTop + 23, 218, 0, 6, 8); + drawTexturedModalRect(guiLeft + 175, guiTop + 31, 216, 0, 6, 8); if(launcher.hasPower()) - drawTexturedModalRect(guiLeft + 49, guiTop + 59, 212, 0, 6, 8); + drawTexturedModalRect(guiLeft + 139, guiTop + 31, 210, 0, 6, 8); else - drawTexturedModalRect(guiLeft + 49, guiTop + 59, 218, 0, 6, 8); + drawTexturedModalRect(guiLeft + 139, guiTop + 31, 216, 0, 6, 8); - launcher.tanks[0].renderTank(guiLeft + 8, guiTop + 88, this.zLevel, 16, 52); - launcher.tanks[1].renderTank(guiLeft + 26, guiTop + 88, this.zLevel, 16, 52); + launcher.tanks[0].renderTank(guiLeft + 152, guiTop + 96, this.zLevel, 16, 52); + launcher.tanks[1].renderTank(guiLeft + 170, guiTop + 96, this.zLevel, 16, 52); + + this.drawInfoPanel(guiLeft - 16, guiTop + 53, 16, 16, 2); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 4b34d1d84..ad06c04d4 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -30,6 +30,7 @@ import com.hbm.items.machine.ItemBatterySC.EnumBatterySC; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.machine.ItemDrillbit.EnumDrillType; import com.hbm.items.machine.ItemPACoil.EnumCoilType; +import com.hbm.items.machine.ItemPileRodMK2.EnumPileRod; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.grenade.ItemGrenadeFuze.EnumGrenadeFuze; @@ -160,6 +161,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + // pile rods + String autoPileRod = "autoswitch.pilerod"; + this.register(new GenericRecipe("ass.pilepabe").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.RA226BE.ordinal())) + .inputItems(new ComparableStack(ModItems.billet_ra226be, 3)).setGroup(autoPileRod, INSTANCE)); + this.register(new GenericRecipe("ass.pilepobe").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.PO210BE.ordinal())) + .inputItems(new ComparableStack(ModItems.billet_po210be, 3)).setGroup(autoPileRod, INSTANCE)); + this.register(new GenericRecipe("ass.pilezr").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 3, EnumPileRod.ZR.ordinal())) + .inputItems(new OreDictStack(ZR.billet(), 1)).setGroup(autoPileRod, INSTANCE)); + this.register(new GenericRecipe("ass.pilenu").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.NU.ordinal())) + .inputItems(new OreDictStack(U.billet(), 3)).setGroup(autoPileRod, INSTANCE)); + this.register(new GenericRecipe("ass.pilepu239").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.PU239.ordinal())) + .inputItems(new OreDictStack(PU239.billet(), 3)).setGroup(autoPileRod, INSTANCE)); + this.register(new GenericRecipe("ass.pilergp").setup(40, 200).outputItems(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.RGP.ordinal())) + .inputItems(new OreDictStack(PURG.billet(), 3)).setGroup(autoPileRod, INSTANCE)); + // powders String autoCyclotron = "autoswitch.cyclotron"; this.register(new GenericRecipe("ass.partlith").setup(40, 100).outputItems(new ItemStack(ModItems.part_lithium, 8)) diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java index 68f03ae6b..0aef690b3 100644 --- a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -13,6 +13,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemPileRodMK2.EnumPileRod; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import net.minecraft.item.ItemStack; @@ -60,23 +61,25 @@ public class PUREXRecipes extends GenericRecipes { //CP-1 String autoPile = "autoswitch.pile"; - this.register((PUREXRecipe) new PUREXRecipe("purex.pilepu").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) - .inputItems(new ComparableStack(ModItems.pile_rod_plutonium)) + this.register((PUREXRecipe) new PUREXRecipe("purex.pilepu239").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) + .inputItems(new ComparableStack(ModItems.pile_rod, 1, EnumPileRod.PU239)) + .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 100)) + .outputItems(new ItemStack(ModItems.billet_pu239, 2), + new ItemStack(ModItems.billet_uranium, 1)) + .setIconToFirstIngredient()); + this.register((PUREXRecipe) new PUREXRecipe("purex.pilergp").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) + .inputItems(new ComparableStack(ModItems.pile_rod, 1, EnumPileRod.RGP)) .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 100)) .outputItems(new ItemStack(ModItems.billet_pu_mix, 2), - new ItemStack(ModItems.billet_uranium, 1), - new ItemStack(ModItems.plate_iron, 2)) + new ItemStack(ModItems.billet_uranium, 1)) .setIconToFirstIngredient()); - - this.register((PUREXRecipe) new PUREXRecipe("purex.pilepu239").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) - .inputItems(new ComparableStack(ModItems.pile_rod_pu239)) + this.register((PUREXRecipe) new PUREXRecipe("purex.pilewaste").setup(40, pilePower).setNameWrapper("purex.recycle").setGroup(autoPile, this) + .inputItems(new ComparableStack(ModItems.pile_rod, 1, EnumPileRod.WASTE)) .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 100)) - .outputItems(new ItemStack(ModItems.billet_pu239, 1), - new ItemStack(ModItems.billet_pu_mix, 1), - new ItemStack(ModItems.billet_uranium, 1), - new ItemStack(ModItems.plate_iron, 2)) + .outputItems(new ItemStack(ModItems.billet_nuclear_waste, 2), + new ItemStack(ModItems.billet_polonium, 1)) .setIconToFirstIngredient()); - + // ZIRNOX String autoZirnox = "autoswitch.zirnox"; this.register((PUREXRecipe) new PUREXRecipe("purex.zirnoxnu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 5f0e52e54..c5c3bd1da 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -25,6 +25,7 @@ import com.hbm.items.ModItems; import com.hbm.items.food.ItemFlask.EnumInfusion; import com.hbm.items.machine.ItemBatterySC.EnumBatterySC; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.machine.ItemPileRodMK2.EnumPileRod; import com.hbm.util.Tuple.Pair; import net.minecraft.block.Block; @@ -333,8 +334,8 @@ public class AnvilRecipes extends SerializableRecipe { new AStack[] { new OreDictStack(STEEL.plate(), 16), new OreDictStack(BE.ingot(), 6), - new OreDictStack(CU.ingot(), 8), - new ComparableStack(ModItems.coil_gold, 16), + new OreDictStack(CU.ingot(), 4), + new ComparableStack(ModItems.coil_gold, 8), new ComparableStack(ModItems.gear_large, 1, 1) }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling_steel))).setTier(2)); @@ -698,8 +699,8 @@ public class AnvilRecipes extends SerializableRecipe { new AnvilOutput[] { new AnvilOutput(new ItemStack(ModItems.plate_steel, 16)), new AnvilOutput(new ItemStack(ModItems.ingot_beryllium, 6)), - new AnvilOutput(new ItemStack(ModItems.ingot_copper, 8)), - new AnvilOutput(new ItemStack(ModItems.coil_gold, 16)), + new AnvilOutput(new ItemStack(ModItems.ingot_copper, 4)), + new AnvilOutput(new ItemStack(ModItems.coil_gold, 8)), new AnvilOutput(new ItemStack(ModItems.gear_large,1, 1)), } @@ -725,8 +726,8 @@ public class AnvilRecipes extends SerializableRecipe { new AnvilOutput[] { new AnvilOutput(new ItemStack(ModItems.plate_steel, 16)), new AnvilOutput(new ItemStack(ModItems.ingot_beryllium, 6)), - new AnvilOutput(new ItemStack(ModItems.ingot_copper, 8)), - new AnvilOutput(new ItemStack(ModItems.coil_gold, 16)), + new AnvilOutput(new ItemStack(ModItems.ingot_copper, 4)), + new AnvilOutput(new ItemStack(ModItems.coil_gold, 8)), } ).setTier(2)); @@ -846,30 +847,28 @@ public class AnvilRecipes extends SerializableRecipe { ).setTier(1)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_uranium), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_uranium, 3)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 2)) + new ComparableStack(ModItems.billet_ra226be, 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.RA226BE.ordinal())), }).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_source), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_ra226be, 3)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 2)) + new ComparableStack(ModItems.billet_po210be, 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.PO210BE.ordinal())), }).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_boron), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.ingot_boron, 2)), - new AnvilOutput(new ItemStack(Items.stick, 2)) + new OreDictStack(ZR.billet(), 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.ZR.ordinal())), }).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_detector), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.ingot_boron, 2)), - new AnvilOutput(new ItemStack(ModItems.motor, 1)), - new AnvilOutput(DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE)) + new OreDictStack(U.billet(), 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.NU.ordinal())), }).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_lithium), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.lithium, 1)), - new AnvilOutput(new ItemStack(ModItems.cell_empty, 1)) + new OreDictStack(PU239.billet(), 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.PU239.ordinal())), + }).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new OreDictStack(PURG.billet(), 3), new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.pile_rod, 1, EnumPileRod.RGP.ordinal())), }).setTier(2)); //RBMK @@ -968,20 +967,6 @@ public class AnvilRecipes extends SerializableRecipe { new AnvilOutput(new ItemStack(ModItems.circuit, 1, EnumCircuitType.BASIC.ordinal()), 0.5F), }).setTier(4)); - } else { - constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_plutonium), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_pu_mix, 2)), - new AnvilOutput(new ItemStack(ModItems.billet_nuclear_waste, 1)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 1)) - }).setTier(2)); - constructionRecipes.add(new AnvilConstructionRecipe( - new ComparableStack(ModItems.pile_rod_pu239), new AnvilOutput[] { - new AnvilOutput(new ItemStack(ModItems.billet_pu239, 1)), - new AnvilOutput(new ItemStack(ModItems.billet_pu_mix, 1)), - new AnvilOutput(new ItemStack(ModItems.billet_nuclear_waste, 1)), - new AnvilOutput(new ItemStack(ModItems.plate_iron, 2)) - }).setTier(2)); } constructionRecipes.add(new AnvilConstructionRecipe( diff --git a/src/main/java/com/hbm/itempool/ItemPoolsPile.java b/src/main/java/com/hbm/itempool/ItemPoolsPile.java index 8c303556c..a0e414951 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsPile.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsPile.java @@ -30,6 +30,7 @@ public class ItemPoolsPile { public static final String POOL_PILE_OF_GARBAGE = "POOL_PILE_OF_GARBAGE"; public static final String POOL_PILE_MECHANICAL = "POOL_PILE_MECHANICAL"; public static final String POOL_PILE_GEAR = "POOL_PILE_GEAR"; + public static final String POOL_PILE_SUPPLIES = "POOL_PILE_SUPPLIES"; public static void init() { @@ -173,5 +174,17 @@ public class ItemPoolsPile { weighted(ModItems.taurun_boots, 0, 1, 1, 20) }; }}; + + new ItemPool(POOL_PILE_SUPPLIES) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ItemGrenadeUniversal.make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.HE, EnumGrenadeFuze.S3, EnumGrenadeExtra.FRAG_SLEEVE), 3, 5, 10), + weighted(ItemGrenadeUniversal.make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.HE, EnumGrenadeFuze.S3, EnumGrenadeExtra.FRAG_SLEEVE), 3, 5, 10), + weighted(ItemGrenadeUniversal.make(EnumGrenadeShell.FRAG, EnumGrenadeFilling.HE, EnumGrenadeFuze.S3, EnumGrenadeExtra.FRAG_SLEEVE), 3, 5, 10), + weighted(ModItems.syringe_metal_stimpak, 0, 3, 5, 30), + weighted(ModItems.syringe_metal_psycho, 0, 3, 5, 30), + weighted(ModItems.syringe_antidote, 0, 1, 2, 30), + weighted(ModItems.ammo_container, 0, 2, 3, 40) + }; + }}; } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index aeae45ce9..6fe99b259 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -105,6 +105,7 @@ public class ModItems { public static Item powder_lignite; public static Item briquette; public static Item coal_infernal; + public static Item coal_eternal; public static Item cinnebar; public static Item powder_ash; public static Item powder_limestone; @@ -2338,6 +2339,7 @@ public class ModItems { briquette = new ItemEnumMulti(EnumBriquetteType.class, true, true).setUnlocalizedName("briquette").setCreativeTab(MainRegistry.partsTab); powder_lignite = new Item().setUnlocalizedName("powder_lignite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_lignite"); coal_infernal = new Item().setUnlocalizedName("coal_infernal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coal_infernal"); + coal_eternal = new Item().setUnlocalizedName("coal_eternal").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":coal_eternal"); cinnebar = new Item().setUnlocalizedName("cinnebar").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":cinnebar"); powder_ash = new ItemEnumMulti(EnumAshType.class, true, true).setUnlocalizedName("powder_ash").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_ash"); powder_limestone = new Item().setUnlocalizedName("powder_limestone").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_limestone"); @@ -4406,6 +4408,8 @@ public class ModItems { BucketHandler.INSTANCE.buckets.put(ModBlocks.schrabidic_block, ModItems.bucket_schrabidic_acid); BucketHandler.INSTANCE.buckets.put(ModBlocks.sulfuric_acid_block, ModItems.bucket_sulfuric_acid); MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE); + + coal_eternal.setContainerItem(coal_eternal); } private static void registerItem() { @@ -4605,6 +4609,7 @@ public class ModItems { GameRegistry.registerItem(coke, coke.getUnlocalizedName()); GameRegistry.registerItem(lignite, lignite.getUnlocalizedName()); GameRegistry.registerItem(coal_infernal, coal_infernal.getUnlocalizedName()); + GameRegistry.registerItem(coal_eternal, coal_eternal.getUnlocalizedName()); GameRegistry.registerItem(briquette, briquette.getUnlocalizedName()); GameRegistry.registerItem(sulfur, sulfur.getUnlocalizedName()); GameRegistry.registerItem(niter, niter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java b/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java index 2fd4fc344..a1db4e42f 100644 --- a/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java +++ b/src/main/java/com/hbm/items/machine/ItemPileRodMK2.java @@ -1,11 +1,17 @@ package com.hbm.items.machine; +import java.util.List; + import com.hbm.items.ItemEnumMulti; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; +import com.hbm.util.i18n.I18nUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; public class ItemPileRodMK2 extends ItemEnumMulti { @@ -29,18 +35,19 @@ public class ItemPileRodMK2 extends ItemEnumMulti { } public static enum EnumPileRod { - RA226BE(1D), - PO210BE(1D), - ZR( 0D, 0D, 0D), - NU( 1D, 1_000D, 1D), - RGP( 1D, 1_000D, 1D), - PU239( 1D, 1_000D, 1D), - WASTE( 1D, 1_000D, 1D); + /* 0 */ RA226BE(1D), + /* 1 */ PO210BE(1D), + /* 2 */ ZR( 0D, 0D, 0D, 2), + /* 3 */ NU( 1D, 25_000D, 0.25D, 4), + /* 4 */ PU239( 1D, 500D, 0.5D, 5), + /* 5 */ RGP( 1D, 1_000D, 0.5D, 6), + /* 6 */ WASTE( 1D, 0D, 1.5D, 6); public double reactionMult = 1.0D; public double life = 1_000D; - public double heatMult = 1.0D; + public double heatMult = 0.0D; public double neutronSource = 0D; + public int turnsInto; private EnumPileRod(double neutronSource) { this.neutronSource = neutronSource; @@ -49,10 +56,26 @@ public class ItemPileRodMK2 extends ItemEnumMulti { this.heatMult = 0; } - private EnumPileRod(double reaction, double life, double heat) { + private EnumPileRod(double reaction, double life, double heat, int turnsInto) { this.reactionMult = reaction; this.life = life; this.heatMult = heat; + this.turnsInto = turnsInto; + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + + if(rod.life > 0) { + list.add("Lifetime: " + (int) Math.round(rod.life)); + double depletion = getDepletionPercent(stack); + if(depletion > 0) list.add("Depletion: " + (int) Math.round(depletion) + "%"); + } + + for(String loc : I18nUtil.autoBreak(Minecraft.getMinecraft().fontRenderer, I18nUtil.resolveKey(this.getUnlocalizedName(stack) + ".desc"), 225)) { + list.add(EnumChatFormatting.YELLOW + loc); } } @@ -69,6 +92,14 @@ public class ItemPileRodMK2 extends ItemEnumMulti { return getDepletion(stack) / life; } + public static double getDepletionPercent(ItemStack stack) { + if(stack == null) return 0D; + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + double life = rod.life; + if(life <= 0) return 0D; + return (getDepletion(stack) / life) * 100; + } + public static double getDepletion(ItemStack stack) { if(!stack.hasTagCompound()) return 0D; return stack.stackTagCompound.getDouble(KEY_NBT_DEPLETION); @@ -87,4 +118,22 @@ public class ItemPileRodMK2 extends ItemEnumMulti { } return outFlux; } + + public static double getHeatPerNeutron(ItemStack stack) { + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + return rod.heatMult; + } + + public static ItemStack react(ItemStack stack, double inFlux) { + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, stack.getItemDamage()); + if(rod.life <= 0) return stack; + double dep = getDepletion(stack) + inFlux; + + if(dep < rod.life) { + setDepletion(stack, dep); + return stack; + } else { + return new ItemStack(stack.getItem(), 1, rod.turnsInto); + } + } } diff --git a/src/main/java/com/hbm/items/machine/ItemPistons.java b/src/main/java/com/hbm/items/machine/ItemPistons.java index 4736b5cdd..822c0a5ba 100644 --- a/src/main/java/com/hbm/items/machine/ItemPistons.java +++ b/src/main/java/com/hbm/items/machine/ItemPistons.java @@ -46,7 +46,7 @@ public class ItemPistons extends ItemEnumMulti { list.add(EnumChatFormatting.YELLOW + "Fuel efficiency:"); for(int i = 0; i < type.eff.length; i++) { - list.add(EnumChatFormatting.YELLOW + "-" + FuelGrade.values()[i].getGrade() + ": " + EnumChatFormatting.RED + "" + (int)(type.eff[i] * 100) + "%"); + list.add(EnumChatFormatting.YELLOW + "-" + FuelGrade.values()[i].getLocalizedName() + ": " + EnumChatFormatting.RED + "" + (int)(type.eff[i] * 100) + "%"); } } diff --git a/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java b/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java index c83ca9459..c05f62632 100644 --- a/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java +++ b/src/main/java/com/hbm/items/tool/ItemPollutionDetector.java @@ -6,6 +6,7 @@ import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.util.ChatBuilder; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; @@ -34,9 +35,9 @@ public class ItemPollutionDetector extends Item { heavymetal = ((int) (heavymetal * 100)) / 100F; //fallout = ((int) (fallout * 100)) / 100F; - PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("Soot: " + soot).color(EnumChatFormatting.YELLOW).flush(), 100, 4000), (EntityPlayerMP) entity); - PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("Poison: " + poison).color(EnumChatFormatting.YELLOW).flush(), 101, 4000), (EntityPlayerMP) entity); - PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("Heavy metal: " + heavymetal).color(EnumChatFormatting.YELLOW).flush(), 102, 4000), (EntityPlayerMP) entity); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(I18nUtil.resolveKey("pollution.soot") + ": " + soot).color(EnumChatFormatting.YELLOW).flush(), 100, 4000), (EntityPlayerMP) entity); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(I18nUtil.resolveKey("pollution.poison") + ": " + poison).color(EnumChatFormatting.YELLOW).flush(), 101, 4000), (EntityPlayerMP) entity); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(I18nUtil.resolveKey("pollution.heavymetal") + ": " + heavymetal).color(EnumChatFormatting.YELLOW).flush(), 102, 4000), (EntityPlayerMP) entity); //PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("Fallout: " + fallout).color(EnumChatFormatting.YELLOW).flush(), 103, 4000), (EntityPlayerMP) entity); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index 208243818..c225a3283 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -33,6 +33,7 @@ import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.main.ResourceManager; import com.hbm.render.item.weapon.sedna.*; +import com.hbm.tileentity.machine.pile.TileEntityPileCore; import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; import net.minecraftforge.client.MinecraftForgeClient; @@ -250,6 +251,8 @@ public class GunFactoryClient { setRendererBulk(LegoClient.RENDER_FRAGMENTATION, ItemGrenadeFilling.fragmentation, ItemGrenadeFilling.pellets, ItemGrenadeFilling.pellets_heavy); ItemGrenadeFilling.laser.setRendererBeam(LegoClient.RENDER_LASER_RED); + TileEntityPileCore.pile_debris.setRenderer(LegoClient.RENDER_GRAPHITE); + //HUDS ((ItemGunBaseNT) ModItems.gun_debug) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO, LegoClient.HUD_COMPONENT_AMMO_SECOND); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index bc46023ec..bb28f3dd1 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -12,6 +12,7 @@ import com.hbm.items.weapon.sedna.hud.HUDComponentDurabilityBar; import com.hbm.items.weapon.sedna.impl.ItemGunChargeThrower; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; +import com.hbm.render.entity.projectile.RenderRBMKDebris; import com.hbm.render.item.weapon.sedna.ItemRenderFatMan; import com.hbm.render.tileentity.RenderArcFurnace; import com.hbm.render.util.BeamPronter; @@ -210,6 +211,14 @@ public class LegoClient { GL11.glPopMatrix(); } + public static BiConsumer RENDER_GRAPHITE = (bullet, interp) -> { + GL11.glScalef(2F, 2F, 2F); + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().getTextureManager().bindTexture(RenderRBMKDebris.tex_graphite); + ResourceManager.deb_graphite.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }; + public static BiConsumer RENDER_GRENADE = (bullet, interp) -> { GL11.glScalef(0.25F, 0.25F, 0.25F); GL11.glRotated(90, 0, 0, 1); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 71d29a399..e20c75122 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -301,6 +301,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadarNT.class, new RenderRadar()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadarLarge.class, new RenderRadarLarge()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadarScreen.class, new RenderRadarScreen()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineSatLink.class, new RenderSatLink()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityReactorResearch.class, new RenderSmallReactor()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTesla.class, new RenderTesla()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBarrel.class, new RenderFluidBarrel()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 9f25e38bc..de2992170 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -134,7 +134,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.gas_empty, 2), new Object[] { "S ", "AA", "AA", 'A', STEEL.plate(), 'S', CU.plate() }); addShapelessAuto(new ItemStack(ModBlocks.block_waste_painted, 1), new Object[] { KEY_YELLOW, ModBlocks.block_waste }); - addRecipeAuto(new ItemStack(ModItems.ingot_aluminium, 1), new Object[] { "###", "###", "###", '#', AL.wireFine() }); addRecipeAuto(new ItemStack(ModItems.ingot_copper, 1), new Object[] { "###", "###", "###", '#', CU.wireFine() }); addRecipeAuto(new ItemStack(ModItems.ingot_tungsten, 1), new Object[] { "###", "###", "###", '#', W.wireFine() }); @@ -242,7 +241,8 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.red_cable_gauge), new Object[] { ModBlocks.red_wire_coated, STEEL.ingot(), DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); addRecipeAuto(new ItemStack(ModBlocks.red_connector, 4), new Object[] { "C", "I", "S", 'C', ModItems.coil_copper, 'I', ModItems.plate_polymer, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.red_connector_super, 2), new Object[] { "CCC", "III", " S ", 'C', ModItems.coil_copper, 'I', ModItems.plate_polymer, 'S', ANY_RESISTANTALLOY.ingot() }); - addRecipeAuto(new ItemStack(ModBlocks.red_pylon, 4), new Object[] { "CWC", "PWP", " T ", 'C', ModItems.coil_copper, 'W', KEY_PLANKS, 'P', ModItems.plate_polymer, 'T', ModBlocks.red_wire_coated }); + addRecipeAuto(new ItemStack(ModBlocks.red_pylon, 4), new Object[] { "CWC", "PWP", " S ", 'C', ModItems.coil_copper, 'W', KEY_PLANKS, 'P', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); + addRecipeAuto(new ItemStack(ModBlocks.red_pylon_steel, 4), new Object[] { "CWC", "PWP", " S ", 'C', ModItems.coil_copper, 'W', STEEL.pipe(), 'P', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); addRecipeAuto(new ItemStack(ModBlocks.red_pylon_medium_wood, 2), new Object[] { "CCW", "IIW", " S", 'C', ModItems.coil_copper, 'W', KEY_PLANKS, 'I', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); addShapelessAuto(new ItemStack(ModBlocks.red_pylon_medium_wood_transformer, 1), new Object[] { ModBlocks.red_pylon_medium_wood, ModItems.plate_polymer, ModItems.coil_copper }); addRecipeAuto(new ItemStack(ModBlocks.red_pylon_medium_steel, 2), new Object[] { "CCW", "IIW", " S", 'C', ModItems.coil_copper, 'W', STEEL.pipe(), 'I', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); @@ -299,7 +299,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.furnace_iron), new Object[] { "III", "IFI", "BBB", 'I', IRON.ingot(), 'F', Blocks.furnace, 'B', Blocks.stonebrick }); addRecipeAuto(new ItemStack(ModBlocks.machine_mixer), new Object[] { "PIP", "GCG", "PMP", 'P', STEEL.plate(), 'I', DURA.ingot(), 'G', KEY_ANYPANE, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.VACUUM_TUBE), 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.fan), new Object[] { "BPB", "PRP", "BPB", 'B', STEEL.bolt(), 'P', IRON.plate(), 'R', REDSTONE.dust() }); - addRecipeAuto(new ItemStack(ModBlocks.piston_inserter), new Object[] { "ITI", "TPT", "ITI", 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'I', IRON.plate(), 'T', STEEL.bolt() }); addRecipeAuto(new ItemStack(ModItems.upgrade_muffler, 16), new Object[] { "III", "IWI", "III", 'I', ANY_RUBBER.ingot(), 'W', Blocks.wool }); addRecipeAuto(new ItemStack(ModItems.upgrade_template, 1), new Object[] { "WIW", "PCP", "WIW", 'W', CU.wireFine(), 'I', IRON.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', ModItems.plate_polymer }); @@ -312,6 +311,10 @@ public class CraftingManager { addRecipeAuto(DictFrame.fromOne(ModItems.arc_electrode, EnumElectrodeType.DESH), new Object[] { "C", "T", "C", 'C', DESH.ingot(), 'T', W.ingot() }); addRecipeAuto(DictFrame.fromOne(ModItems.arc_electrode, EnumElectrodeType.SATURNITE), new Object[] { "C", "T", "C", 'C', BIGMT.ingot(), 'T', NB.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.pile_device, 1, 0), new Object[] { " A ", "CBS", 'A', AL.plate(), 'C', STEEL.plateCast(), 'B', B.ingot(), 'S', STEEL.shell() }); + addRecipeAuto(new ItemStack(ModBlocks.pile_device, 1, 1), new Object[] { " M ", "ACA", " S ", 'M', ModItems.motor, 'A', AL.plate(), 'C', CU.shell(), 'S', STEEL.plateCast() }); + addRecipeAuto(new ItemStack(ModBlocks.pile_device, 1, 2), new Object[] { " B ", "SBS", "SBS", 'B', B.ingot(), 'S', STEEL.plate() }); + addRecipeAuto(new ItemStack(ModItems.detonator, 1), new Object[] { "C", "S", 'S', STEEL.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), }); addShapelessAuto(new ItemStack(ModItems.detonator_multi, 1), new Object[] { ModItems.detonator, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); addShapelessAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), RUBBER.ingot(), GOLD.wireDense() }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index f1a16b507..65272819c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -1,5 +1,6 @@ package com.hbm.main; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ICustomBlockHighlight; import com.hbm.config.ClientConfig; import com.hbm.config.RadiationConfig; @@ -414,6 +415,16 @@ public class ModEventHandlerRenderer { public void onDrawHighlight(DrawBlockHighlightEvent event) { EntityPlayer player = MainRegistry.proxy.me(); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemBlock) { + Block b = Block.getBlockFromItem(player.getHeldItem().getItem()); + if(b instanceof BlockDummyable) { + ((BlockDummyable) b).drawPlacementHighlight(player, event.partialTicks); + event.setCanceled(true); + return; + } + } + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gun_drill) { XFactoryDrill.drawBlockHighlight(player, player.getHeldItem(), event.partialTicks); event.setCanceled(true); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 68a296fd0..7cc44b3fc 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -25,6 +25,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; import java.util.List; @@ -92,6 +93,10 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModBlocks.conveyor_double)); API.hideItem(new ItemStack(ModBlocks.conveyor_triple)); + API.hideItem(new ItemStack(ModBlocks.brick_forgotten, 1, OreDictionary.WILDCARD_VALUE)); + API.hideItem(new ItemStack(ModBlocks.brick_forgotten_lock, 1, OreDictionary.WILDCARD_VALUE)); + API.hideItem(new ItemStack(ModItems.coal_eternal)); + API.registerHighlightIdentifier(ModBlocks.plushie, new IHighlightHandler() { @Override public ItemStack identifyHighlight(World world, EntityPlayer player, MovingObjectPosition mop) { int x = mop.blockX; diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index fc2f13c3a..5fc7aa957 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -272,6 +272,7 @@ public class ResourceManager { public static final IModelCustom radar = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar.obj")).noSmooth().asVBO(); public static final IModelCustom radar_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar_large.obj")).noSmooth().asVBO(); public static final IModelCustom radar_screen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/radar_screen.obj")).noSmooth().asVBO(); + public static final IModelCustom satlink = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/satlink.obj")).noSmooth().asVBO(); //Forcefield public static final IModelCustom forcefield_top = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/forcefield_top.obj")); @@ -407,6 +408,7 @@ public class ResourceManager { //Network public static final IModelCustom connector = new HFRWavefrontObject("models/network/connector.obj").noSmooth().asVBO(); public static final IModelCustom connector_super = new HFRWavefrontObject("models/network/connector_super.obj").noSmooth().asVBO(); + public static final IModelCustom pylon = new HFRWavefrontObject("models/network/pylon.obj").noSmooth().asVBO(); public static final IModelCustom pylon_medium = new HFRWavefrontObject("models/network/pylon_medium.obj").noSmooth().asVBO(); public static final IModelCustom pylon_large = new HFRWavefrontObject("models/network/pylon_large.obj").noSmooth().asVBO(); public static final IModelCustom substation = new HFRWavefrontObject("models/network/substation.obj").asVBO(); @@ -746,6 +748,7 @@ public class ResourceManager { public static final ResourceLocation radar_dish_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_dish.png"); public static final ResourceLocation radar_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_large.png"); public static final ResourceLocation radar_screen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radar_screen.png"); + public static final ResourceLocation satlink_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/satlink.png"); //Forcefield public static final ResourceLocation forcefield_base_tex = new ResourceLocation(RefStrings.MODID, "textures/models/forcefield_base.png"); @@ -859,6 +862,8 @@ public class ResourceManager { //Electricity public static final ResourceLocation connector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/connector.png"); public static final ResourceLocation connector_super_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/connector_super.png"); + public static final ResourceLocation pylon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon.png"); + public static final ResourceLocation pylon_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_steel.png"); public static final ResourceLocation pylon_medium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_medium.png"); public static final ResourceLocation pylon_medium_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_medium_steel.png"); public static final ResourceLocation pylon_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_large.png"); diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 1fa86803a..8b0709e87 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -82,6 +82,7 @@ public class StructureManager { public static final NBTStructure forest_chem = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/forest_chem.nbt")); public static final NBTStructure plane1 = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed_plane_1.nbt")); public static final NBTStructure plane2 = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed_plane_2.nbt")); + public static final NBTStructure tower_base = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/tower_base.nbt")); public static final NBTStructure factory = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/factory.nbt")); public static final NBTStructure crane = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crane_mod.nbt")); diff --git a/src/main/java/com/hbm/particle/ParticleAshes.java b/src/main/java/com/hbm/particle/ParticleAshes.java index 4b76c52ac..f845f7185 100644 --- a/src/main/java/com/hbm/particle/ParticleAshes.java +++ b/src/main/java/com/hbm/particle/ParticleAshes.java @@ -72,14 +72,15 @@ public class ParticleAshes extends EntityFXRotating { float pZ = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - interpPosZ); Vec3NT vec = new Vec3NT(particleScale, 0, particleScale).rotateAroundYDeg(this.rotationPitch); + double yOff = 0.09; - tess.addVertexWithUV(pX + vec.xCoord, pY + 0.05, pZ + vec.zCoord, particleIcon.getMaxU(), particleIcon.getMaxV()); + tess.addVertexWithUV(pX + vec.xCoord, pY - yOff, pZ + vec.zCoord, particleIcon.getMaxU(), particleIcon.getMaxV()); vec.rotateAroundYDeg(90); - tess.addVertexWithUV(pX + vec.xCoord, pY + 0.05, pZ + vec.zCoord, particleIcon.getMaxU(), particleIcon.getMinV()); + tess.addVertexWithUV(pX + vec.xCoord, pY - yOff, pZ + vec.zCoord, particleIcon.getMaxU(), particleIcon.getMinV()); vec.rotateAroundYDeg(90); - tess.addVertexWithUV(pX + vec.xCoord, pY + 0.05, pZ + vec.zCoord, particleIcon.getMinU(), particleIcon.getMinV()); + tess.addVertexWithUV(pX + vec.xCoord, pY - yOff, pZ + vec.zCoord, particleIcon.getMinU(), particleIcon.getMinV()); vec.rotateAroundYDeg(90); - tess.addVertexWithUV(pX + vec.xCoord, pY + 0.05, pZ + vec.zCoord, particleIcon.getMinU(), particleIcon.getMaxV()); + tess.addVertexWithUV(pX + vec.xCoord, pY - yOff, pZ + vec.zCoord, particleIcon.getMinU(), particleIcon.getMaxV()); } else { renderParticleRotated(tess, interp, sX, sY, sZ, dX, dZ, this.particleScale); } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 6e4aeec31..fbcea7522 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -217,6 +217,10 @@ public class QMAWLoader implements IResourceManagerReloadListener { QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); } } + + if(json.has("noindex") && json.get("noindex").getAsBoolean()) { + qmaw.noIndex(); + } if(!qmaw.contents.isEmpty()) { QMAWLoader.qmaw.put(name, qmaw); diff --git a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java index f961cd2fe..ed7b20a9e 100644 --- a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java +++ b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java @@ -5,10 +5,13 @@ import java.util.HashMap; import net.minecraft.item.ItemStack; public class QuickManualAndWiki { - + public String name; public ItemStack icon; + /** Removes this manual from the calculator search feature */ + public boolean noIndex = false; + public HashMap title = new HashMap(); public HashMap contents = new HashMap(); @@ -30,4 +33,9 @@ public class QuickManualAndWiki { this.contents.put(lang, contents); return this; } + + public QuickManualAndWiki noIndex() { + this.noIndex = true; + return this; + } } diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderRBMKDebris.java b/src/main/java/com/hbm/render/entity/projectile/RenderRBMKDebris.java index 383b7a77b..d774dffe5 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderRBMKDebris.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderRBMKDebris.java @@ -14,12 +14,12 @@ import net.minecraft.util.ResourceLocation; public class RenderRBMKDebris extends Render { //for fallback only - private static final ResourceLocation tex_base = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_side.png"); - private static final ResourceLocation tex_element = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_fuel.png"); - private static final ResourceLocation tex_control = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_control.png"); - private static final ResourceLocation tex_blank = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_blank_side.png"); - private static final ResourceLocation tex_lid = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_blank_cover_top.png"); - private static final ResourceLocation tex_graphite = new ResourceLocation(RefStrings.MODID + ":textures/blocks/block_graphite.png"); + public static final ResourceLocation tex_base = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_side.png"); + public static final ResourceLocation tex_element = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_fuel.png"); + public static final ResourceLocation tex_control = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_control.png"); + public static final ResourceLocation tex_blank = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_blank_side.png"); + public static final ResourceLocation tex_lid = new ResourceLocation(RefStrings.MODID + ":textures/blocks/rbmk/rbmk_blank_cover_top.png"); + public static final ResourceLocation tex_graphite = new ResourceLocation(RefStrings.MODID + ":textures/blocks/block_graphite.png"); @Override public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { diff --git a/src/main/java/com/hbm/render/model/ModelPylon.java b/src/main/java/com/hbm/render/model/ModelPylon.java deleted file mode 100755 index 3fffe8e93..000000000 --- a/src/main/java/com/hbm/render/model/ModelPylon.java +++ /dev/null @@ -1,63 +0,0 @@ -//This File was created with the Minecraft-SMP Modelling Toolbox 2.3.0.0 -// Copyright (C) 2017 Minecraft-SMP.de -// This file is for Flan's Flying Mod Version 4.0.x+ - -// Model: Pylon -// Model Creator: -// Created on:13.06.2017 - 11:17:46 -// Last changed on: 13.06.2017 - 11:17:46 - -package com.hbm.render.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - -public class ModelPylon extends ModelBase { - - public ModelRenderer[] pylonModel; - - public ModelPylon() { - this.textureWidth = 64; - this.textureHeight = 128; - - this.pylonModel = new ModelRenderer[4]; - this.pylonModel[0] = new ModelRenderer(this, 0, 96); // Box 0 - this.pylonModel[1] = new ModelRenderer(this, 1, 1); // Box 1 - this.pylonModel[2] = new ModelRenderer(this, 24, 1); // Box 2 - this.pylonModel[3] = new ModelRenderer(this, 25, 17); // Box 3 - - this.pylonModel[0].addBox(0F, 0F, 0F, 16, 16, 16, 0F); // Box 0 - this.pylonModel[0].setRotationPoint(-8F, -6F, -8F); - - this.pylonModel[1].addBox(0F, 0F, 0F, 4, 73, 4, 0F); // Box 1 - this.pylonModel[1].setRotationPoint(-2F, -79F, -2F); - - this.pylonModel[2].addBox(0F, 0F, 0F, 6, 4, 6, 0F); // Box 2 - this.pylonModel[2].setRotationPoint(-3F, -74F, -3F); - - this.pylonModel[3].addBox(0F, 0F, 0F, 6, 2, 6, 0F); // Box 3 - this.pylonModel[3].setRotationPoint(-3F, -78F, -3F); - - - for (ModelRenderer modelRenderer : this.pylonModel) { - modelRenderer.setTextureSize(this.textureWidth, this.textureHeight); - modelRenderer.mirror = true; - } - } - - @Override - public void render(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor) { - - for(int i = 0; i < 4; i++) { - this.pylonModel[i].render(scaleFactor); - } - } - - public void renderAll(float scaleFactor) { - - for(int i = 0; i < 4; i++) { - this.pylonModel[i].render(scaleFactor); - } - } -} diff --git a/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java b/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java index d31484758..42e35965a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java +++ b/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java @@ -17,6 +17,9 @@ import com.hbm.render.util.BeamPronter.EnumWaveType; import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; import com.hbm.util.EnumUtil; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -28,6 +31,8 @@ import net.minecraftforge.client.IItemRenderer; public class RenderBatterySocket extends TileEntitySpecialRenderer implements IItemRendererProvider { private static ResourceLocation blorbo = new ResourceLocation(RefStrings.MODID, "textures/models/horse/sunburst.png"); + + public static EntityItem dummy; @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -78,6 +83,34 @@ public class RenderBatterySocket extends TileEntitySpecialRenderer implements II Random rand = new Random(tile.getWorldObj().getTotalWorldTime() / 5); rand.nextBoolean(); + for(int i = -1; i <= 1; i += 2) for(int j = -1; j <= 1; j += 2) if(rand.nextInt(4) == 0) { + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 0); + BeamPronter.prontBeam(Vec3.createVectorHelper(0.4375 * i, 1.1875, 0.4375 * j), EnumWaveType.RANDOM, EnumBeamType.SOLID, 0x404040, 0x002040, (int)(System.currentTimeMillis() % 1000) / 50, 15, 0.0625F, 3, 0.025F); + BeamPronter.prontBeam(Vec3.createVectorHelper(0.4375 * i, 1.1875, 0.4375 * j), EnumWaveType.RANDOM, EnumBeamType.SOLID, 0x404040, 0x002040, (int)(System.currentTimeMillis() % 1000) / 50, 1, 0, 3, 0.025F); + GL11.glPopMatrix(); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.5, 0); + GL11.glScaled(1.5, 1.5, 1.5); + GL11.glRotated((socket.getWorldObj().getTotalWorldTime() % 360 + interp) * 2.5D, 0, -1, 0); + + if(dummy == null || dummy.worldObj != tile.getWorldObj()) { + dummy = new EntityItem(tile.getWorldObj(), 0, 0, 0, render); + } + dummy.setEntityItemStack(render); + dummy.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + + GL11.glPopMatrix(); + + Random rand = new Random(tile.getWorldObj().getTotalWorldTime() / 5); + rand.nextBoolean(); + for(int i = -1; i <= 1; i += 2) for(int j = -1; j <= 1; j += 2) if(rand.nextInt(4) == 0) { GL11.glPushMatrix(); GL11.glTranslated(0, 0.75, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLPW2.java b/src/main/java/com/hbm/render/tileentity/RenderLPW2.java index 4e4eacf41..34989045e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLPW2.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLPW2.java @@ -29,7 +29,7 @@ public class RenderLPW2 extends TileEntitySpecialRenderer { case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; } - long time = te.getWorldObj().getTotalWorldTime(); + long time = te.getWorldObj().getTotalWorldTime() % 1000000; double swayTimer = ((time + interp) / 3D) % (Math.PI * 4); double sway = (Math.sin(swayTimer) + Math.sin(swayTimer * 2) + Math.sin(swayTimer * 4) + 2.23255D) * 0.5; diff --git a/src/main/java/com/hbm/render/tileentity/RenderPylon.java b/src/main/java/com/hbm/render/tileentity/RenderPylon.java index ef270f2f3..b0285d1de 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPylon.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPylon.java @@ -2,38 +2,77 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; -import com.hbm.lib.RefStrings; -import com.hbm.render.model.ModelPylon; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.network.TileEntityPylon; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; -public class RenderPylon extends RenderPylonBase { - - private static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":" + "textures/models/ModelPylon.png"); +public class RenderPylon extends RenderPylonBase implements IItemRendererProvider { - private ModelPylon pylon; - - public RenderPylon() { - this.pylon = new ModelPylon(); + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + + TileEntityPylon pylon = (TileEntityPylon)tile; + + if(tile.getBlockType() == ModBlocks.red_pylon) + bindTexture(ResourceManager.pylon_tex); + else + bindTexture(ResourceManager.pylon_steel_tex); + + if(tile.getBlockType() == ModBlocks.red_pylon ) + ResourceManager.pylon.renderPart("Pylon"); + else + ResourceManager.pylon.renderPart("Pylon_steel"); + + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + this.renderLinesGeneric(pylon, x, y, z); + GL11.glPopMatrix(); } @Override - public void renderTileEntityAt(TileEntity te, double x, double y, double z, float f) { - TileEntityPylon pyl = (TileEntityPylon)te; - - GL11.glEnable(GL11.GL_LIGHTING); - - GL11.glPushMatrix(); - GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F - ((1F / 16F) * 14F), (float) z + 0.5F); - GL11.glRotatef(180, 0F, 0F, 1F); - bindTexture(texture); - this.pylon.renderAll(0.0625F); - GL11.glPopMatrix(); - - GL11.glPushMatrix(); - this.renderLinesGeneric(pyl, x, y, z); - GL11.glPopMatrix(); + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.red_pylon), + Item.getItemFromBlock(ModBlocks.red_pylon_steel), + }; + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.red_pylon); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -5, 0); + GL11.glScaled(2.9, 2.9, 2.9); + } + public void renderCommonWithStack(ItemStack stack) { + GL11.glScaled(1, 1, 1); + + if(stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon)) + bindTexture(ResourceManager.pylon_tex); + else + bindTexture(ResourceManager.pylon_steel_tex); + + if(stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon) ) + ResourceManager.pylon.renderPart("Pylon"); + else + ResourceManager.pylon.renderPart("Pylon_steel"); + } + }; } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderSatLink.java b/src/main/java/com/hbm/render/tileentity/RenderSatLink.java new file mode 100644 index 000000000..5698a1736 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderSatLink.java @@ -0,0 +1,77 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityMachineSatLink; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +public class RenderSatLink extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glRotatef(180, 0F, 1F, 0F); + + TileEntityMachineSatLink link = (TileEntityMachineSatLink) tile; + + ForgeDirection dir = ForgeDirection.getOrientation(tile.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + GL11.glTranslated((dir.offsetX + rot.offsetX) * 0.5, 0, (dir.offsetZ + rot.offsetZ) * 0.5); + + float r = link.prevRot + (link.rot - link.prevRot) * interp; + float l = link.prevLift + (link.lift - link.prevLift) * interp; + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.satlink_tex); + ResourceManager.satlink.renderPart("Base"); + GL11.glRotated(r, 0, 1, 0); + ResourceManager.satlink.renderPart("Rotor"); + GL11.glTranslated(0, 7.375, 0); + GL11.glRotated(l, 0, 0, 1); + GL11.glTranslated(0, -7.375, 0); + ResourceManager.satlink.renderPart("Dish"); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_satlink); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -5, 0); + GL11.glScaled(3.5, 3.5, 3.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.satlink_tex); + ResourceManager.satlink.renderPart("Base"); + GL11.glRotated(15, 0, 1, 0); + ResourceManager.satlink.renderPart("Rotor"); + GL11.glTranslated(0, 7.375, 0); + GL11.glRotated(-45, 0, 0, 1); + GL11.glTranslated(0, -7.375, 0); + ResourceManager.satlink.renderPart("Dish"); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/saveddata/SatelliteSavedData.java b/src/main/java/com/hbm/saveddata/SatelliteSavedData.java index a0dd2a624..2ced0842d 100644 --- a/src/main/java/com/hbm/saveddata/SatelliteSavedData.java +++ b/src/main/java/com/hbm/saveddata/SatelliteSavedData.java @@ -23,18 +23,18 @@ public class SatelliteSavedData extends WorldSavedData { /** * Default constructor for satellites map data. */ - public SatelliteSavedData() { - super("satellites"); - this.markDirty(); - } - - public boolean isFreqTaken(int freq) { - return getSatFromFreq(freq) != null; - } - - public Satellite getSatFromFreq(int freq) { - return sats.get(freq); - } + public SatelliteSavedData() { + super("satellites"); + this.markDirty(); + } + + public boolean isFreqTaken(int freq) { + return getSatFromFreq(freq) != null; + } + + public Satellite getSatFromFreq(int freq) { + return sats.get(freq); + } @Override public void readFromNBT(NBTTagCompound nbt) { @@ -53,28 +53,28 @@ public class SatelliteSavedData extends WorldSavedData { @Override public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("satCount", sats.size()); - + int i = 0; - for(Entry struct : sats.entrySet()) { - NBTTagCompound data = new NBTTagCompound(); - struct.getValue().writeToNBT(data); - - nbt.setInteger("sat_id_" + i, struct.getValue().getID()); - nbt.setTag("sat_data_" + i, data); - nbt.setInteger("sat_freq_" + i, struct.getKey()); + for(Entry struct : sats.entrySet()) { + NBTTagCompound data = new NBTTagCompound(); + struct.getValue().writeToNBT(data); + + nbt.setInteger("sat_id_" + i, struct.getValue().getID()); + nbt.setTag("sat_data_" + i, data); + nbt.setInteger("sat_freq_" + i, struct.getKey()); i++; - } + } } public static SatelliteSavedData getData(World worldObj) { - SatelliteSavedData data = (SatelliteSavedData)worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); - if(data == null) { - worldObj.perWorldStorage.setData("satellites", new SatelliteSavedData()); - - data = (SatelliteSavedData)worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); - } - - return data; + SatelliteSavedData data = (SatelliteSavedData) worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); + if(data == null) { + worldObj.perWorldStorage.setData("satellites", new SatelliteSavedData()); + + data = (SatelliteSavedData) worldObj.perWorldStorage.loadData(SatelliteSavedData.class, "satellites"); + } + + return data; } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ad13bb825..560761911 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -133,6 +133,7 @@ public class TileMappings { put(TileEntityMachineRadarScreen.class, "tileentity_radar_screen"); put(TileEntityBroadcaster.class, "tileentity_pink_cloud_broadcaster"); put(TileEntityMachineSatLinker.class, "tileentity_satlinker"); + put(TileEntityMachineSatLink.class, "tileentity_satlink"); put(TileEntityReactorResearch.class, "tileentity_small_reactor"); put(TileEntityVaultDoorMigration.class, "tileentity_vault_door"); put(TileEntityRadiobox.class, "tileentity_radio_broadcaster"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index e3ef0ab69..a0d77cf4e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -6,6 +6,7 @@ import java.util.HashMap; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.container.ContainerMachineDiesel; import com.hbm.inventory.fluid.FluidType; @@ -28,10 +29,8 @@ import com.hbm.util.CompatEnergyControl; import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IEnergyProviderMK2; -import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -40,8 +39,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidStandardTransceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC, IFluidCopiable { +public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidStandardTransceiverMK2, IControlReceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC, IFluidCopiable { + public boolean isOn = false; public long power; public long powerCap = maxPower; public FluidTank tank; @@ -50,8 +50,8 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen private AudioWrapper audio; /* CONFIGURABLE CONSTANTS */ - public static long maxPower = 50000; - public static int fluidCap = 16000; + public static long maxPower = 50_000; + public static int fuelCap = 16_000; public static HashMap fuelEfficiency = new HashMap(); static { fuelEfficiency.put(FuelGrade.MEDIUM, 0.5D); @@ -63,9 +63,45 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen private static final int[] slots_bottom = new int[] { 1, 2 }; private static final int[] slots_side = new int[] { 2 }; + @Override + public String getConfigName() { + return "dieselgen"; + } + + @Override + public void readIfPresent(JsonObject obj) { + maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); + fuelCap = IConfigurableMachine.grab(obj, "I:fuelCap", fuelCap); + + if(obj.has("D[:efficiency")) { + JsonArray array = obj.get("D[:efficiency").getAsJsonArray(); + for(FuelGrade grade : FuelGrade.values()) { + fuelEfficiency.put(grade, array.get(grade.ordinal()).getAsDouble()); + } + } + } + + @Override + public void writeConfig(JsonWriter writer) throws IOException { + writer.name("L:powerCap").value(maxPower); + writer.name("I:fuelCap").value(fuelCap); + + String info = "Fuel grades in order: "; + for(FuelGrade grade : FuelGrade.values()) info += grade.name() + " "; + info = info.trim(); + writer.name("INFO").value(info); + + writer.name("D[:efficiency").beginArray().setIndent(""); + for(FuelGrade grade : FuelGrade.values()) { + double d = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0.0D; + writer.value(d); + } + writer.endArray().setIndent(" "); + } + public TileEntityMachineDiesel() { - super(5, 100); - tank = new FluidTank(Fluids.DIESEL, 4_000); + super(4, 100); + tank = new FluidTank(Fluids.DIESEL, fuelCap); } @Override @@ -84,6 +120,7 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + this.isOn = nbt.getBoolean("isOn"); this.power = nbt.getLong("powerTime"); this.powerCap = nbt.getLong("powerCap"); tank.readFromNBT(nbt, "fuel"); @@ -92,7 +129,8 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + + nbt.setBoolean("isOn", isOn); nbt.setLong("powerTime", power); nbt.setLong("powerCap", powerCap); tank.writeToNBT(nbt, "fuel"); @@ -110,9 +148,7 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen return false; } - public long getPowerScaled(long i) { - return (power * i) / powerCap; - } + public long getPowerScaled(long i) { return (power * i) / powerCap; } @Override public void updateEntity() { @@ -120,29 +156,18 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen if(!worldObj.isRemote) { this.wasOn = false; + + tank.setType(3, slots); + tank.loadTank(0, 1, slots); for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); this.sendSmoke(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.trySubscribe(tank.getTankType(), worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } - - //Tank Management - FluidType last = tank.getTankType(); - if(tank.setType(3, 4, slots)) this.unsubscribeToAllAround(last, this); - tank.loadTank(0, 1, slots); - this.subscribeToAllAround(tank.getTankType(), this); - - FluidType type = tank.getTankType(); - if(type == Fluids.NITAN) - powerCap = maxPower * 10; - else - powerCap = maxPower; - - // Battery Item power = Library.chargeItemsFromTE(slots, 2, power, powerCap); - - generate(); + if(isOn) generate(); this.networkPackNT(50); } else { @@ -196,6 +221,7 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen super.serialize(buf); buf.writeInt((int) power); buf.writeInt((int) powerCap); + buf.writeBoolean(isOn); buf.writeBoolean(wasOn); tank.serialize(buf); } @@ -205,17 +231,13 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen super.deserialize(buf); this.power = buf.readInt(); this.powerCap = buf.readInt(); + this.isOn = buf.readBoolean(); this.wasOn = buf.readBoolean(); tank.deserialize(buf); } - public boolean hasAcceptableFuel() { - return getHEFromFuel() > 0; - } - - public long getHEFromFuel() { - return getHEFromFuel(tank.getTankType()); - } + public boolean hasAcceptableFuel() { return getHEFromFuel() > 0; } + public long getHEFromFuel() { return getHEFromFuel(tank.getTankType()); } public static long getHEFromFuel(FluidType type) { @@ -234,28 +256,36 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen public void generate() { + if(!this.isOn) return; if(this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) return; + if(!hasAcceptableFuel()) return; + if(tank.getFill() <= 0) return; - if(hasAcceptableFuel()) { - if (tank.getFill() > 0) { - - this.wasOn = true; - - tank.setFill(tank.getFill() - 1); - if(tank.getFill() < 0) - tank.setFill(0); - - if(worldObj.getTotalWorldTime() % 5 == 0) { - super.pollute(tank.getTankType(), FluidReleaseType.BURN, 5F); - } - - if(power + getHEFromFuel() <= powerCap) { - power += getHEFromFuel(); - } else { - power = powerCap; - } - } + this.wasOn = true; + tank.setFill(tank.getFill() - 1); + + if(tank.getFill() < 0) tank.setFill(0); + + if(worldObj.getTotalWorldTime() % 5 == 0) { + super.pollute(tank.getTankType(), FluidReleaseType.BURN, 5F); } + + if(power + getHEFromFuel() <= powerCap) { + power += getHEFromFuel(); + } else { + power = powerCap; + } + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return player.getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25; + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("turnOn")) this.isOn = !this.isOn; + this.markChanged(); } @Override public long getPower() { return power; } @@ -265,57 +295,9 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } @Override public FluidTank[] getAllTanks() { return new FluidTank[] { tank }; } - @Override - public String getConfigName() { - return "dieselgen"; - } - - @Override - public void readIfPresent(JsonObject obj) { - maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); - fluidCap = IConfigurableMachine.grab(obj, "I:fuelCap", fluidCap); - - if(obj.has("D[:efficiency")) { - JsonArray array = obj.get("D[:efficiency").getAsJsonArray(); - for(FuelGrade grade : FuelGrade.values()) { - fuelEfficiency.put(grade, array.get(grade.ordinal()).getAsDouble()); - } - } - } - - @Override - public void writeConfig(JsonWriter writer) throws IOException { - writer.name("L:powerCap").value(maxPower); - writer.name("I:fuelCap").value(fluidCap); - - String info = "Fuel grades in order: "; - for(FuelGrade grade : FuelGrade.values()) info += grade.name() + " "; - info = info.trim(); - writer.name("INFO").value(info); - - writer.name("D[:efficiency").beginArray().setIndent(""); - for(FuelGrade grade : FuelGrade.values()) { - double d = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0.0D; - writer.value(d); - } - writer.endArray().setIndent(" "); - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerMachineDiesel(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineDiesel(player.inventory, this); - } - - @Override - public FluidTank[] getSendingTanks() { - return this.getSmokeTanks(); - } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineDiesel(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineDiesel(player.inventory, this); } + @Override public FluidTank[] getSendingTanks() { return this.getSmokeTanks(); } @Override public void provideExtraInfo(NBTTagCompound data) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSatLink.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSatLink.java new file mode 100644 index 000000000..e327f1dac --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSatLink.java @@ -0,0 +1,120 @@ +package com.hbm.tileentity.machine; + +import com.hbm.saveddata.SatelliteSavedData; +import com.hbm.tileentity.TileEntityTickingBase; + +import api.hbm.redstoneoverradio.IRORInteractive; +import api.hbm.redstoneoverradio.IRORValueProvider; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.util.AxisAlignedBB; + +public class TileEntityMachineSatLink extends TileEntityTickingBase implements IRORValueProvider, IRORInteractive { + + public boolean connected; + public int freq; + + public float rot = INACTIVE_ROT; + public float prevRot = INACTIVE_ROT; + public float lift = INACTIVE_LIFT; + public float prevLift = INACTIVE_LIFT; + + public static final float SPEED = 0.25F; + public static final float ACTIVE_ROT = -15F; + public static final float ACTIVE_LIFT = -45F; + public static final float INACTIVE_ROT = 0F; + public static final float INACTIVE_LIFT = -85F; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.connected = false; + + if(worldObj.getHeightValue(xCoord, zCoord) <= yCoord) { + + SatelliteSavedData dat = SatelliteSavedData.getData(worldObj); + this.connected = dat.isFreqTaken(freq); + } + + this.networkPackNT(150); + + } else { + + this.prevRot = this.rot; + this.prevLift = this.lift; + + float targetR = this.connected ? ACTIVE_ROT : INACTIVE_ROT; + float targetL = this.connected ? ACTIVE_LIFT : INACTIVE_LIFT; + + if(Math.abs(rot - targetR) <= SPEED) rot = targetR; + else if(rot < targetR) rot += SPEED; + else if(rot > targetR) rot -= SPEED; + + if(Math.abs(lift - targetL) <= SPEED) lift = targetL; + else if(lift < targetL) lift += SPEED; + else if(lift > targetL) lift -= SPEED; + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeBoolean(connected); + buf.writeInt(freq); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.connected = buf.readBoolean(); + this.freq = buf.readInt(); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 2, + yCoord, + zCoord - 2, + xCoord + 3, + yCoord + 10, + zCoord + 3 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "connected", + PREFIX_VALUE + "freq", + PREFIX_VALUE + "rx", + PREFIX_FUNCTION + "setfreq" + NAME_SEPARATOR + "freq", + PREFIX_FUNCTION + "tx" + NAME_SEPARATOR + "payload" + }; + } + + @Override + public String provideRORValue(String name) { + return null; + } + + @Override + public String runRORFunction(String name, String[] params) { + return null; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 4ecf97689..391df724b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -655,6 +655,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG PREFIX_VALUE + "rods", PREFIX_VALUE + "coreheat", PREFIX_VALUE + "hullheat", + PREFIX_VALUE + "coldbuf", + PREFIX_VALUE + "hotbuf", PREFIX_VALUE + "flux", PREFIX_VALUE + "depletion", PREFIX_FUNCTION + "setrods" + NAME_SEPARATOR + "percent", @@ -671,6 +673,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if((PREFIX_VALUE + "rods").equals(name)) return "" + (int) (100 - this.rodLevel); // why the fuck did i invert this again? if((PREFIX_VALUE + "coreheat").equals(name)) return "" + this.coreHeat; if((PREFIX_VALUE + "hullheat").equals(name)) return "" + this.hullHeat; + if((PREFIX_VALUE + "coldbuf").equals(name)) return "" + this.tanks[0].getFill(); + if((PREFIX_VALUE + "hotbuf").equals(name)) return "" + this.tanks[1].getFill(); if((PREFIX_VALUE + "flux").equals(name)) return "" + (int) this.flux; if((PREFIX_VALUE + "depletion").equals(name)) return "" + (int) (this.progress * 100 / this.processTime); return null; diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java index ceaa30bfc..dfd0cdb86 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java @@ -16,6 +16,7 @@ import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,7 +32,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider { public static final long usage = 100_000; @@ -186,6 +187,22 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr return true; } + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "temperature", + PREFIX_VALUE + "pfmcold", + PREFIX_VALUE + "pfm" + }; + } + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "temperature").equals(name)) return "" + (int) this.temperature; + if((PREFIX_VALUE + "pfmcold").equals(name)) return "" + coolantTanks[0].getFill(); + if((PREFIX_VALUE + "pfm").equals(name)) return "" + coolantTanks[1].getFill(); + return null; + } + @Override public BlockPos getExitPos(Particle particle) { return null; diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java index 25900ded6..31d6024fc 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -16,6 +16,7 @@ import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORValueProvider; import api.hbm.redstoneoverradio.IRORInteractive; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -35,7 +36,7 @@ import net.minecraftforge.common.util.ForgeDirection; @SuppressWarnings("unused") @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, IParticleUser, OCComponent, SimpleComponent, IRORInteractive { +public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, IParticleUser, OCComponent, SimpleComponent, IRORInteractive, IRORValueProvider { public int dirLower; public int dirUpper; @@ -391,10 +392,21 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv @Override public String[] getFunctionInfo() { return new String[] { - PREFIX_FUNCTION + "setthreshold" + NAME_SEPARATOR + "threshold", + PREFIX_VALUE + "temperature", + PREFIX_VALUE + "pfmcold", + PREFIX_VALUE + "pfm", + PREFIX_FUNCTION + "setthreshold" + NAME_SEPARATOR + "threshold" }; } + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "temperature").equals(name)) return "" + (int) this.temperature; + if((PREFIX_VALUE + "pfmcold").equals(name)) return "" + coolantTanks[0].getFill(); + if((PREFIX_VALUE + "pfm").equals(name)) return "" + coolantTanks[1].getFill(); + return null; + } + @Override public String runRORFunction(String name, String[] params) { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java index 6a893cfef..df032e4b5 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java @@ -13,6 +13,7 @@ import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,7 +28,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider { public static final long usage = 100_000; public static final int focusGain = 100; @@ -137,6 +138,22 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI return new GUIPAQuadrupole(player.inventory, this); } + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "temperature", + PREFIX_VALUE + "pfmcold", + PREFIX_VALUE + "pfm" + }; + } + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "temperature").equals(name)) return "" + (int) this.temperature; + if((PREFIX_VALUE + "pfmcold").equals(name)) return "" + coolantTanks[0].getFill(); + if((PREFIX_VALUE + "pfm").equals(name)) return "" + coolantTanks[1].getFill(); + return null; + } + @Override @Optional.Method(modid = "OpenComputers") public String getComponentName() { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java index 139cd9529..a8fa30740 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java @@ -10,6 +10,7 @@ import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,7 +25,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider, IParticleUser, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider { public static final long usage = 250_000; public static final int momentumGain = 100; @@ -129,6 +130,22 @@ public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvide return new GUIPARFC(player.inventory, this); } + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "temperature", + PREFIX_VALUE + "pfmcold", + PREFIX_VALUE + "pfm" + }; + } + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "temperature").equals(name)) return "" + (int) this.temperature; + if((PREFIX_VALUE + "pfmcold").equals(name)) return "" + coolantTanks[0].getFill(); + if((PREFIX_VALUE + "pfm").equals(name)) return "" + coolantTanks[1].getFill(); + return null; + } + @Override @Optional.Method(modid = "OpenComputers") public String getComponentName() { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java index 993b76359..e27e7649a 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine.albion; +import api.hbm.redstoneoverradio.IRORInteractive; import com.hbm.blocks.BlockDummyable; import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; @@ -12,6 +13,7 @@ import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.redstoneoverradio.IRORValueProvider; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,7 +34,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider, IConditionalInvAccess, IControlReceiver, SimpleComponent, CompatHandler.OCComponent { +public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider, IConditionalInvAccess, IControlReceiver, SimpleComponent, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { public static final long usage = 100_000; public Particle particle; @@ -81,7 +83,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv int steps = 1; if(this.particle != null) steps = 1 + MathHelper.clamp_int(this.particle.momentum / 1_000, 0, 9); - + for(int i = 0; i < steps; i++) { if(particle != null) { this.state = PAState.RUNNING; @@ -164,6 +166,9 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ * 2, dir.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 2, dir.getOpposite()), new DirPos(xCoord + rot.offsetX * 5, yCoord, zCoord + rot.offsetZ * 5, rot), + new DirPos(xCoord, yCoord-2, zCoord, dir), + new DirPos(xCoord + rot.offsetX * 2, yCoord-2, zCoord + rot.offsetZ * 2, dir), + new DirPos(xCoord - rot.offsetX * 2, yCoord-2, zCoord - rot.offsetZ * 2, dir), }; } @@ -448,4 +453,40 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv if(this.defocus < 0) this.defocus = 0; } } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "status", + PREFIX_VALUE + "momentum", + PREFIX_VALUE + "defocus", + PREFIX_VALUE + "temperature", + PREFIX_VALUE + "pfmcold", + PREFIX_VALUE + "pfm", + PREFIX_FUNCTION + "cancel" + }; + } + @Override + public String provideRORValue(String name) { + if((PREFIX_VALUE + "status").equals(name)) return "" + this.state; + if((PREFIX_VALUE + "momentum").equals(name)) return "" + this.lastSpeed; + if((PREFIX_VALUE + "defocus").equals(name)) { + return this.particle != null ? "" + this.particle.defocus : "0"; + } + if((PREFIX_VALUE + "temperature").equals(name)) return "" + (int) this.temperature; + if((PREFIX_VALUE + "pfmcold").equals(name)) return "" + coolantTanks[0].getFill(); + if((PREFIX_VALUE + "pfm").equals(name)) return "" + coolantTanks[1].getFill(); + return null; + } + + @Override + public String runRORFunction(String name, String[] params) { + + if ((PREFIX_FUNCTION + "cancel").equals(name)) { + particle = null; + state = PAState.IDLE; + return null; + } + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java index e01a7ad67..5566ff999 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileControl.java @@ -7,6 +7,7 @@ import com.hbm.util.Compat; import api.hbm.redstoneoverradio.IRORInteractive; import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; @@ -98,6 +99,22 @@ public class TileEntityPileControl extends TileEntityPileDeviceBase implements I if(this.syncLevel != lastSync) this.turnProgress = 2; } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.level = nbt.getDouble("level"); + this.targetLevel = nbt.getDouble("targetLevel"); + this.wasRedstone = nbt.getBoolean("redstone"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("level", level); + nbt.setDouble("targetLevel", targetLevel); + nbt.setBoolean("wasRedstone", wasRedstone); + } + @Override public String[] getFunctionInfo() { return new String[] { diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java index a92e97f8d..7b368780b 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileCore.java @@ -3,23 +3,35 @@ package com.hbm.tileentity.machine.pile; import java.util.ArrayList; import java.util.List; import java.util.Random; +import java.util.function.BiConsumer; +import java.util.function.Consumer; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachinePWRController; import com.hbm.blocks.machine.pile.BlockPile; +import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.interfaces.NotableComments; +import com.hbm.items.machine.ItemPileRodMK2; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.main.MainRegistry; import com.hbm.main.NTMSounds; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.particle.helper.FlameCreator; import com.hbm.tileentity.TileEntityTickingBase; +import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.util.ForgeDirection; @NotableComments @@ -56,24 +68,70 @@ public class TileEntityPileCore extends TileEntityTickingBase { public List ventilationChannels = new ArrayList(); public List controlChannels = new ArrayList(); + public int left; + public int right; + public int up; + /** + * Segments are fuel and control channels grouped by vertical slices viewed from the front, this makes the simulation part easier. + */ + public PileSegment[] segments = new PileSegment[0]; + + public double highestHeat; + public static final int MAX_HEAT = 800; + public static boolean meltingDown = false; + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); height = nbt.getInteger("height"); width = nbt.getInteger("width"); depth = nbt.getInteger("depth"); + left = nbt.getInteger("left"); + right = nbt.getInteger("right"); + up = nbt.getInteger("up"); + + orientation = EnumUtil.grabEnumSafely(PileOrientation.class, nbt.getInteger("orientation")); + + segments = new PileSegment[width]; + + fuelChannels.clear(); + ventilationChannels.clear(); + controlChannels.clear(); int fuelCount = nbt.getByte("fc"); int ventCount = nbt.getByte("vc"); int contCount = nbt.getByte("cc"); - fuelChannels.clear(); - ventilationChannels.clear(); - controlChannels.clear(); - for(int i = 0; i < fuelCount; i++) fuelChannels.add(readChannelFromNBT(nbt, "f" + i)); for(int i = 0; i < ventCount; i++) ventilationChannels.add(readChannelFromNBT(nbt, "v" + i)); for(int i = 0; i < contCount; i++) controlChannels.add(readChannelFromNBT(nbt, "c" + i)); + + this.recalculateSegments(); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("height", height); + nbt.setInteger("width", width); + nbt.setInteger("depth", depth); + nbt.setInteger("left", left); + nbt.setInteger("right", right); + nbt.setInteger("up", up); + + nbt.setInteger("orientation", orientation.ordinal()); + + int fuelCount = fuelChannels.size(); + int ventCount = ventilationChannels.size(); + int contCount = controlChannels.size(); + + nbt.setByte("fc", (byte) fuelCount); + nbt.setByte("vc", (byte) ventCount); + nbt.setByte("cc", (byte) contCount); + + for(int i = 0; i < fuelCount; i++) fuelChannels.get(i).writeChannelToNBT(nbt, "f" + i); + for(int i = 0; i < ventCount; i++) ventilationChannels.get(i).writeChannelToNBT(nbt, "v" + i); + for(int i = 0; i < contCount; i++) controlChannels.get(i).writeChannelToNBT(nbt, "c" + i); } public PileChannel getFuelChannel(int x, int y, int z) { return getChannel(x, y, z, fuelChannels); } @@ -93,30 +151,14 @@ public class TileEntityPileCore extends TileEntityTickingBase { return list.indexOf(chan); // more reliable when channels change and not that big of a deal because we have lists in single digit length } - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("height", height); - nbt.setInteger("width", width); - nbt.setInteger("depth", depth); - - int fuelCount = fuelChannels.size(); - int ventCount = ventilationChannels.size(); - int contCount = controlChannels.size(); - - nbt.setByte("fc", (byte) fuelCount); - nbt.setByte("vc", (byte) ventCount); - nbt.setByte("cc", (byte) contCount); - - for(int i = 0; i < fuelCount; i++) fuelChannels.get(i).writeChannelToNBT(nbt, "f" + i); - for(int i = 0; i < ventCount; i++) ventilationChannels.get(i).writeChannelToNBT(nbt, "v" + i); - for(int i = 0; i < contCount; i++) controlChannels.get(i).writeChannelToNBT(nbt, "c" + i); - } - - public TileEntityPileCore setupSize(int h, int w, int d) { - this.height = h; - this.width = w; + public TileEntityPileCore setupSize(int up, int down, int l, int r, int d) { + this.height = up + 1 + down; + this.width = l + 1 + r; this.depth = d; + this.left = l; + this.right = r; + this.up = up; + this.segments = new PileSegment[width]; return this; } @@ -140,6 +182,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { for(int i = 0; i < list.size(); i++) { PileChannel chan = list.get(i); if(chan.entry.compare(x, y, z) && chan.entry.getDir() == dir) { + if(chan.type == chan.type.FUEL) chan.ejectAll(); list.remove(i); for(int j = 0; j < size; j++) { int iX = x + dir.offsetX * j; @@ -148,6 +191,7 @@ public class TileEntityPileCore extends TileEntityTickingBase { worldObj.setBlockMetadataWithNotify(iX, iY, iZ, BlockPile.META_DUMMY, 3); } worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, NTMSounds.VANILLA_PLINK, 1F, 0.75F); + recalculateSegments(); return true; } } @@ -190,6 +234,8 @@ public class TileEntityPileCore extends TileEntityTickingBase { worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, NTMSounds.VANILLA_PLINK, 1F, 1.25F); this.markChanged(); + recalculateSegments(); + return true; } @@ -198,37 +244,207 @@ public class TileEntityPileCore extends TileEntityTickingBase { if(!worldObj.isRemote) { - for(PileChannel chan : this.ventilationChannels) { - if(chan.air <= 0) continue; - - int toUse = (int) Math.ceil(chan.air * 5D / 1_000); - chan.air -= toUse; - - if(worldObj.getTotalWorldTime() % 3 != 0) continue; + this.runSimulation(); + this.handleVentilation(); + this.handleMeltdown(); + + this.networkPackNT(25); + } + } + + @Override + public void invalidate() { + super.invalidate(); + for(PileChannel chan : this.fuelChannels) chan.ejectAll(); + } - double x = chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (this.width - 0.375); - double y = chan.entry.getY() + 0.5; - double z = chan.entry.getZ() + 0.5 + chan.entry.getDir().offsetZ * (this.width - 0.375); - Random rand = worldObj.rand; - - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "tower"); - data.setFloat("lift", 1F); - data.setFloat("base", 0.125F + rand.nextFloat() * 0.125F); - data.setFloat("max", 1F); - data.setFloat("strafe", 0.0025F); - data.setBoolean("noWind", true); - data.setInteger("life", 20 + worldObj.rand.nextInt(30)); - data.setInteger("color", 0xa0a0a0); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.highestHeat); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.highestHeat = buf.readDouble(); + } + + protected void runSimulation() { + + // reaction + for(PileChannel chan : this.fuelChannels) { + if(chan.length <= 0) continue; + double producedNeutrons = 0; + + for(int i = 0; i < chan.rods.length; i++) { + ItemStack stack = chan.rods[i]; + if(stack != null && stack.getItem() instanceof ItemPileRodMK2) { + double neut = ItemPileRodMK2.getReactivity(stack, chan.incomingNeutrons / chan.length); + producedNeutrons += neut; + chan.heat += neut * ItemPileRodMK2.getHeatPerNeutron(stack); + chan.rods[i] = ItemPileRodMK2.react(stack, neut); + } + } + chan.outgoingNeutrons = producedNeutrons; + chan.incomingNeutrons = 0; + } + + // intra-segment propagation + for(PileSegment seg : this.segments) { + if(seg == null || seg.segType != seg.segType.FUEL) continue; + double outgoing = 0D; + for(PileChannel chan : seg.channels) outgoing += chan.outgoingNeutrons; + for(PileChannel chan : seg.channels) chan.incomingNeutrons += outgoing; + } + + // inter-segment propagation + for(int i = 1; i < this.segments.length - 1; i++) { // bound chosen because edges can't have channels + PileSegment seg = this.segments[i]; + if(seg == null || seg.segType != seg.segType.FUEL) continue; + double outgoing = 0D; + for(PileChannel chan : seg.channels) outgoing += chan.outgoingNeutrons; + + double mult = 1D; + for(int j = i - 1; j >= 1; j--) { // center to left + PileSegment neighbor = this.segments[j]; + if(neighbor == null) continue; + mult *= neighbor.getNeutronMult(this); + if(neighbor.segType == neighbor.segType.FUEL) { + for(PileChannel chan : neighbor.channels) chan.incomingNeutrons += outgoing * mult; + } + } + + mult = 1D; + for(int j = i + 1; j < this.segments.length - 1; j++) { // center to right + PileSegment neighbor = this.segments[j]; + if(neighbor == null) continue; + mult *= neighbor.getNeutronMult(this); + if(neighbor.segType == neighbor.segType.FUEL) { + for(PileChannel chan : neighbor.channels) chan.incomingNeutrons += outgoing * mult; + } } } } + protected void handleVentilation() { + + for(PileChannel chan : this.ventilationChannels) { + if(chan.air <= 0) continue; + + double airCap = (double) chan.air / (double) chan.MAX_AIR; + + for(PileChannel fuel : this.fuelChannels) { + if(Math.abs(fuel.entry.getY() - chan.entry.getY()) <= 1) { + fuel.heat *= (1D - airCap * 0.05D); // channel can hold up to 1000mB, turning into a 0.95 heat mult for connected fuel channels + } + } + + int toUse = (int) Math.ceil(airCap * 5D); + chan.air -= toUse; + + if(worldObj.getTotalWorldTime() % 3 != 0) continue; + + double x = chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (this.width - 0.375); + double y = chan.entry.getY() + 0.5; + double z = chan.entry.getZ() + 0.5 + chan.entry.getDir().offsetZ * (this.width - 0.375); + Random rand = worldObj.rand; + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", 1F); + data.setFloat("base", (0.125F + rand.nextFloat() * 0.125F) * (float) airCap); + data.setFloat("max", 1F * (float) airCap); + data.setFloat("strafe", 0.0025F); + data.setBoolean("noWind", true); + data.setInteger("life", 20 + worldObj.rand.nextInt(30)); + data.setInteger("color", 0xa0a0a0); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + } + + for(PileChannel chan : this.fuelChannels) { + chan.heat *= 0.999; + if(chan.heat < 20) chan.heat = 20; + } + } + + protected void handleMeltdown() { + + this.highestHeat = 0; + for(PileChannel chan : this.fuelChannels) { + if(chan.heat > this.highestHeat) this.highestHeat = chan.heat; + } + + if(this.highestHeat > this.MAX_HEAT) { + this.destroy(); + double avgX = 0; + double avgZ = 0; + for(PileChannel chan : this.fuelChannels) { + avgX += chan.entry.getX() + 0.5 + chan.entry.getDir().offsetX * (chan.length - 1) / 2D; + avgZ += chan.entry.getZ() + 0.5 + chan.entry.getDir().offsetZ * (chan.length - 1) / 2D; + } + avgX /= this.fuelChannels.size(); + avgZ /= this.fuelChannels.size(); + meltingDown = true; + worldObj.newExplosion(null, avgX, yCoord + up, avgZ, 15F, true, true); + meltingDown= false; + + for(int i = 0; i < 15; i++) { + double mY = worldObj.rand.nextDouble() * 0.5 + 1D; + EntityBulletBaseMK4 fragment = new EntityBulletBaseMK4(worldObj, null, pile_debris, 100F, 0.35F, avgX, yCoord + up + 1, avgZ, 0, mY, 0); + worldObj.spawnEntityInWorld(fragment); + } + } + } + + protected void recalculateSegments() { + this.segments = new PileSegment[width]; + + for(PileChannel chan : fuelChannels) { + int index = getChannelVerticalIndex(chan); + if(index < 0 || index >= this.segments.length) continue; + + if(this.segments[index] == null) { + this.segments[index] = new PileSegment(PileChannelType.FUEL).addChan(chan); + } else { + if(this.segments[index].segType == PileChannelType.FUEL) this.segments[index].addChan(chan); + } + } + + for(PileChannel chan : controlChannels) { + int index = getChannelVerticalIndex(chan); + if(index < 0 || index >= this.segments.length) continue; + + if(this.segments[index] == null) { + this.segments[index] = new PileSegment(PileChannelType.CONTROL).addChan(chan); + } else { + if(this.segments[index].segType == PileChannelType.CONTROL) this.segments[index].addChan(chan); + } + } + } + + /** + * Splits the entire pile into vertical slices, left to right, and returns the index of which slice a channel belongs to. + * Since this left-to-right approach assumes the front of the pile, this only is used for fuel channels and control rods. + */ + protected int getChannelVerticalIndex(PileChannel chan) { + DirPos pos = chan.entry; + ForgeDirection right = pos.getDir().getRotation(ForgeDirection.UP); + int deltaX = (pos.getX() - xCoord) * right.offsetX; + int deltaZ = (pos.getZ() - zCoord) * right.offsetZ; + int abs = deltaX == 0 ? deltaZ : deltaX; + int index = abs + this.left; + return index; + } + public void destroy() { worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.pile_brick); } + /** + * The orientation of the pile, based on the direction the core is pointing in. + * Channels that follow the orientation are fuel, perpendicular ones are for ventilation. + */ public static enum PileOrientation { NORTH_SOUTH, EAST_WEST, @@ -241,6 +457,10 @@ public class TileEntityPileCore extends TileEntityTickingBase { } } + /** + * A channel, represents any type, therefore has the data of all three types. + * Could have been an abstract class + three child classes but then we'd just be overcomplicating it. + */ public class PileChannel { // originally called "PileHole", however i didn't want it sounding too sexual public final DirPos entry; // first channel block plus direction it faces inward @@ -249,6 +469,9 @@ public class TileEntityPileCore extends TileEntityTickingBase { public final ItemStack[] rods; public double heat = 0D; + public double outgoingNeutrons = 0D; + public double incomingNeutrons = 0D; + public static final int MAX_AIR = 1_000; public int air; public double control = 1D; // pulled out by default, unlike me who never pulls out @@ -274,18 +497,29 @@ public class TileEntityPileCore extends TileEntityTickingBase { nbt.setInteger(name + "_y", entry.getY()); nbt.setInteger(name + "_z", entry.getZ()); nbt.setByte(name + "_d", (byte) entry.getDir().ordinal()); - + if(type == type.FUEL) { NBTTagList list = new NBTTagList(); for(int i = 0; i < rods.length; i++) { if(rods[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); + nbt1.setByte("slot", (byte) i); rods[i].writeToNBT(nbt1); list.appendTag(nbt1); } } - nbt.setTag("items", list); + nbt.setTag(name + "items", list); + + nbt.setDouble(name + "heat", heat); + nbt.setDouble(name + "neutrons", incomingNeutrons); + } + + if(type == type.VENTILATION) { + nbt.setInteger(name + "air", air); + } + + if(type == type.CONTROL) { + nbt.setDouble(name + "control", control); } } @@ -308,11 +542,24 @@ public class TileEntityPileCore extends TileEntityTickingBase { if(stack != null) dropItem(stack, length); } + public void ejectAll() { + for(int i = 0; i < this.rods.length; i++) { + this.dropItem(rods[i], length); + this.rods[i] = null; + } + } + public void dropItem(ItemStack stack, int depth) { + if(stack == null) return; int x = entry.getX() + entry.getDir().offsetX * depth; int y = entry.getY(); int z = entry.getZ() + entry.getDir().offsetZ * depth; + if(stack.hasTagCompound() && stack.stackTagCompound.hasKey(ItemPileRodMK2.KEY_NBT_DEPLETION)) { + stack.stackTagCompound.removeTag(ItemPileRodMK2.KEY_NBT_DEPLETION); + if(stack.stackTagCompound.hasNoTags()) stack.stackTagCompound = null; + } + EntityItem item = new EntityItem(worldObj, x + 0.5, y + 0.5, z + 0.5, stack); worldObj.spawnEntityInWorld(item); } @@ -325,9 +572,9 @@ public class TileEntityPileCore extends TileEntityTickingBase { ForgeDirection dir = ForgeDirection.getOrientation(nbt.getByte(name + "_d")); PileChannel chan = new PileChannel(x, y, z, dir); - + if(chan.type == chan.type.FUEL) { - NBTTagList list = nbt.getTagList("fuel", 10); + NBTTagList list = nbt.getTagList(name + "items", 10); for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); byte b0 = nbt1.getByte("slot"); @@ -335,6 +582,17 @@ public class TileEntityPileCore extends TileEntityTickingBase { chan.rods[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } + + chan.heat = nbt.getDouble(name + "heat"); + chan.incomingNeutrons = nbt.getDouble(name + "neutrons"); + } + + if(chan.type == chan.type.VENTILATION) { + chan.air = nbt.getInteger(name + "air"); + } + + if(chan.type == chan.type.CONTROL) { + chan.control = nbt.getDouble(name + "control"); } return chan; @@ -354,4 +612,46 @@ public class TileEntityPileCore extends TileEntityTickingBase { } } } + + /** A vertical "slice" of the front of the reactor, can include multiple channels per slice, + * due to reactor geometry constraints, all channels are of the same type. */ + public static class PileSegment { + + public List channels = new ArrayList(); + public final PileChannelType segType; + + public PileSegment(PileChannelType segType) { + this.segType = segType; + } + + public PileSegment addChan(PileChannel chan) { + this.channels.add(chan); + return this; + } + + public double getNeutronMult(TileEntityPileCore core) { + if(this.segType != this.segType.CONTROL) return 1D; + int size = core.depth - 1; // minus one to make the calculation easier, a xixix pattern becomes xixi which means the rods cover 50% + if(size < 3) return 0D; // reactors this small can't exist, nor can they have control rods + double total = 0D; + + for(PileChannel chan : channels) total += chan.control; + return MathHelper.clamp_double(total / size, 0D, 0.5D); + } + } + + public static BulletConfig pile_debris; + + public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { + bullet.worldObj.newExplosion(bullet, bullet.posX, bullet.posY, bullet.posZ, 5F, true, false); + bullet.setDead(); + }; + + public static Consumer LAMBDA_FIRE = (bullet) -> { + if(bullet.worldObj.isRemote && MainRegistry.proxy.me().getDistanceToEntity(bullet) < 100) FlameCreator.composeEffectClient(bullet.worldObj, bullet.posX, bullet.posY - 0.125, bullet.posZ, FlameCreator.META_FIRE); + }; + + static { + pile_debris = new BulletConfig().setLife(200).setVel(1F).setGrav(0.1D).setOnUpdate(LAMBDA_FIRE).setOnImpact(LAMBDA_STANDARD_EXPLODE); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java index 503d7684e..29520c70f 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileLoader.java @@ -3,19 +3,24 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.pile.BlockPile; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPileRodMK2; +import com.hbm.items.machine.ItemPileRodMK2.EnumPileRod; import com.hbm.main.NTMSounds; import com.hbm.tileentity.machine.pile.TileEntityPileCore.PileChannel; import com.hbm.util.Compat; +import com.hbm.util.EnumUtil; +import api.hbm.redstoneoverradio.IRORValueProvider; import io.netty.buffer.ByteBuf; 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.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPileLoader extends TileEntityPileDeviceBase implements ISidedInventory{ +public class TileEntityPileLoader extends TileEntityPileDeviceBase implements ISidedInventory, IRORValueProvider { public double syncLevel; public double level; @@ -30,6 +35,10 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS public ItemStack syncStack; public ItemStack stack; public boolean wasRedstone; + + public ItemStack channelStack; + public double channelDepletion; + public double channelTemp; @Override public void updateEntity() { @@ -38,6 +47,9 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS ForgeDirection dir = getOrientation(); PileChannel fuelChan = null; + this.channelStack = null; + this.channelDepletion = 0D; + this.channelTemp = 0D; int x = xCoord - dir.offsetX; int y = yCoord; @@ -55,6 +67,9 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS if(fuelChan != null) { this.chanNum = core.getFuelChannelNum(fuelChan); + this.channelStack = fuelChan.rods[fuelChan.rods.length - 1]; + this.channelDepletion = ItemPileRodMK2.getDepletionPercent(channelStack); + this.channelTemp = fuelChan.heat; } } } @@ -114,12 +129,23 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeDouble(this.level); + if(this.stack != null) { buf.writeInt(Item.getIdFromItem(this.stack.getItem())); buf.writeShort(this.stack.getItemDamage()); } else { buf.writeInt(-1); } + + if(this.channelStack != null) { + buf.writeInt(Item.getIdFromItem(this.channelStack.getItem())); + buf.writeShort(this.channelStack.getItemDamage()); + } else { + buf.writeInt(-1); + } + + buf.writeDouble(this.channelDepletion); + buf.writeDouble(this.channelTemp); } @Override @@ -127,12 +153,49 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS super.deserialize(buf); double lastSync = this.syncLevel; this.syncLevel = buf.readDouble(); + int itemId = buf.readInt(); if(itemId != -1) this.syncStack = new ItemStack(Item.getItemById(itemId), 1, buf.readShort()); else this.syncStack = null; + + int chanId = buf.readInt(); + if(chanId != -1) this.channelStack = new ItemStack(Item.getItemById(chanId), 1, buf.readShort()); + else this.channelStack = null; + + this.channelDepletion = buf.readDouble(); + this.channelTemp = buf.readDouble(); if(this.syncLevel != lastSync) this.turnProgress = 2; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.loading = nbt.getBoolean("loading"); + this.level = nbt.getDouble("level"); + this.delay = nbt.getInteger("delay"); + this.wasRedstone = nbt.getBoolean("redstone"); + + if(nbt.hasKey("stack")) { + this.stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setBoolean("loading", loading); + nbt.setDouble("level", level); + nbt.setInteger("delay", delay); + nbt.setBoolean("wasRedstone", wasRedstone); + + if(this.stack != null) { + NBTTagCompound stackTag = new NBTTagCompound(); + this.stack.writeToNBT(stackTag); + nbt.setTag("stack", stackTag); + } + } public static boolean isItemLoadable(ItemStack stack) { return stack.getItem() == ModItems.pile_rod; @@ -169,4 +232,40 @@ public class TileEntityPileLoader extends TileEntityPileDeviceBase implements IS @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return isItemLoadable(stack); } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { return isItemLoadable(stack); } @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return false; } + + @Override + public String[] getFunctionInfo() { + return new String[] { + PREFIX_VALUE + "meta", + PREFIX_VALUE + "depletion", + PREFIX_VALUE + "deppercent", + PREFIX_VALUE + "lifetime", + PREFIX_VALUE + "temp", + }; + } + + @Override + public String provideRORValue(String name) { + + if(name.equals(PREFIX_VALUE + "meta")) { + return this.channelStack == null ? "-1" : this.channelStack.getItemDamage() + ""; + } + if(name.equals(PREFIX_VALUE + "deppercent")) { + return "" + (int) Math.round(this.channelDepletion); + } + if(name.equals(PREFIX_VALUE + "depletion")) { + if(this.channelStack == null) return "0"; + return "" + (int) Math.round(ItemPileRodMK2.getDepletionPercent(this.channelStack)); + } + if(name.equals(PREFIX_VALUE + "lifetime")) { + if(this.channelStack == null) return "0"; + EnumPileRod rod = EnumUtil.grabEnumSafely(EnumPileRod.class, this.channelStack.getItemDamage()); + return "" + (int) Math.round(rod.life); + } + if(name.equals(PREFIX_VALUE + "meta")) { + return "" + (int) Math.round(this.channelTemp); + } + + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java index 149c4bec4..70a19b795 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileVent.java @@ -11,6 +11,7 @@ import com.hbm.util.Compat; import api.hbm.fluidmk2.IFluidStandardReceiverMK2; import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; @@ -62,7 +63,7 @@ public class TileEntityPileVent extends TileEntityPileDeviceBase implements IFlu if(ventChan != null) { this.chanNum = core.getVentilationChannelNum(ventChan); - int toFill = BobMathUtil.min(compair.getFill(), 1_000 - ventChan.air); + int toFill = BobMathUtil.min(compair.getFill(), ventChan.MAX_AIR - ventChan.air); ventChan.air += toFill; this.compair.setFill(this.compair.getFill() - toFill); this.isActive = toFill > 0; @@ -99,4 +100,16 @@ public class TileEntityPileVent extends TileEntityPileDeviceBase implements IFlu super.deserialize(buf); this.isActive = buf.readBoolean(); } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + compair.readFromNBT(nbt, "t"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + compair.writeToNBT(nbt, "t"); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java index 4f2cde942..0f8703227 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java @@ -46,10 +46,10 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityBatterySocket extends TileEntityBatteryBase implements IRORValueProvider, IRORInteractive, IInfoProviderEC { public boolean frame = false; - + public static BulletConfig discharge; public static BiConsumer BEAM_DISCHARGE_HIT = (beam, mop) -> { - + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { beam.worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); explodeDischarge(beam.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); @@ -59,7 +59,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR explodeDischarge(beam.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); } }; - + public static void explodeDischarge(World world, double x, double y, double z) { ExplosionVNT vnt = new ExplosionVNT(world, x, y, z, 5F); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, 20).setDamageClass(DamageClass.ELECTRIC)); @@ -68,7 +68,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR vnt.explode(); world.playSoundEffect(x, y, z, "hbm:entity.ufoBlast", 5.0F, 0.9F + world.rand.nextFloat() * 0.2F); } - + static { discharge = new BulletConfig().setupDamageClass(DamageClass.ELECTRIC).setBeam().setSpread(0.0F).setLife(3).setThresholdNegation(20F).setArmorPiercing(0.5F).setRenderRotations(false).setDoesPenetrate(true) .setOnBeamImpact(BEAM_DISCHARGE_HIT); @@ -83,7 +83,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR public int damageTimer; public int damageTarget; public double scPowerMult = 1D; - + public TileEntityBatterySocket() { super(1); } @@ -97,7 +97,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR super.updateEntity(); if(!worldObj.isRemote) { - + if(hasSCLoaded()) { if(this.damageTarget == 0) pickNewSCTarget(); this.damageTimer++; @@ -114,30 +114,30 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR this.log[19] = avg; } else { - + if(worldObj.getTotalWorldTime() % 20 == 0) { frame = !worldObj.getBlock(xCoord, yCoord + 2, zCoord).isAir(worldObj, xCoord, yCoord + 2, zCoord); } } } - + protected boolean hasSCLoaded() { return slots[0] != null && slots[0].getItem() == ModItems.battery_sc && slots[0].getItemDamage() != EnumBatterySC.EMPTY.ordinal(); } - + protected void pickNewSCTarget() { this.damageTimer = 0; //this.damageTarget = 100; this.damageTarget = 1200 + worldObj.rand.nextInt(2400); // 1-3 minutes; this.markChanged(); } - + protected void discharge() { pickNewSCTarget(); - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - + double x = xCoord + 0.5 - dir.offsetX * 0.5 + rot.offsetX * 0.5; double y = yCoord + 1; double z = zCoord + 0.5 - dir.offsetZ * 0.5 + rot.offsetX * 0.5; @@ -156,15 +156,15 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR initialDelta.multiply(1.125D / dominantAxis); // move 1.125 blocks outwards sub.setPosition(xCoord + initialDelta.xCoord, yCoord + initialDelta.yCoord, zCoord + initialDelta.zCoord); Vec3NT actualDelta = new Vec3NT(target.posX - sub.posX, target.posY + target.height / 2 - sub.posY, target.posZ - sub.posZ); - + sub.setRotationsFromVector(actualDelta); sub.performHitscanExternal(actualDelta.lengthVector()); worldObj.spawnEntityInWorld(sub); } - + explodeDischarge(worldObj, x + worldObj.rand.nextGaussian() * 0.5, y + worldObj.rand.nextGaussian() * 0.5, z + worldObj.rand.nextGaussian() * 0.5); } - + protected void fluctuate() { double steppy = 1D / 100D; this.scPowerMult += (steppy * (worldObj.rand.nextDouble() * 2 - 1)); @@ -233,18 +233,18 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR return power; } @Override public long getMaxPower() { return maxPowerFromStack(slots[0]); } - + @Override public void setPower(long power) { if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return; ((IBatteryItem) slots[0].getItem()).setCharge(slots[0], power); } - + public static long powerFromStack(ItemStack stack) { if(stack == null || !(stack.getItem() instanceof IBatteryItem)) return 0; return ((IBatteryItem) stack.getItem()).getCharge(stack); } - + public static long maxPowerFromStack(ItemStack stack) { if(stack == null || !(stack.getItem() instanceof IBatteryItem)) return 0; return ((IBatteryItem) stack.getItem()).getMaxCharge(stack); @@ -319,6 +319,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR public String[] getFunctionInfo() { return new String[] { PREFIX_VALUE + "fill", + PREFIX_VALUE + "maxfill", PREFIX_VALUE + "fillpercent", PREFIX_VALUE + "delta", PREFIX_FUNCTION + "setmode" + NAME_SEPARATOR + "mode (0-3)", @@ -332,6 +333,7 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR @Override public String provideRORValue(String name) { if((PREFIX_VALUE + "fill").equals(name)) return "" + this.getPower(); + if((PREFIX_VALUE + "maxfill").equals(name)) return "" + this.getMaxPower(); if((PREFIX_VALUE + "fillpercent").equals(name)) return "" + this.getPower() * 100 / (Math.max(this.getMaxPower(), 1)); if((PREFIX_VALUE + "delta").equals(name)) return "" + delta; return null; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java index 03646593c..99f185e8b 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java @@ -18,12 +18,17 @@ public class TileEntityPylon extends TileEntityPylonBase { @Override public Vec3[] getMountPos() { - return new Vec3[] {Vec3.createVectorHelper(0.5, 5.4, 0.5)}; + return new Vec3[] {Vec3.createVectorHelper(0.5, 5.5D, 0.5)}; } @Override public double getMaxWireLength() { - return 25D; + return 25; + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return dir != ForgeDirection.DOWN; } @Override @@ -33,8 +38,6 @@ public class TileEntityPylon extends TileEntityPylonBase { new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN), new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X), - new DirPos(xCoord, yCoord + 1, zCoord, Library.POS_Y), - new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y), new DirPos(xCoord, yCoord, zCoord + 1, Library.POS_Z), new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z) ); diff --git a/src/main/java/com/hbm/util/Calculator.java b/src/main/java/com/hbm/util/Calculator.java index 88d91000f..439c7c606 100644 --- a/src/main/java/com/hbm/util/Calculator.java +++ b/src/main/java/com/hbm/util/Calculator.java @@ -21,7 +21,7 @@ public class Calculator { for (int i = 0; i < tokens.length; i++) { if (tokens[i] == ' ') continue; - if (tokens[i] >= '0' && tokens[i] <= '9' || tokens[i] == '.' || (tokens[i] == '-' && (i == 0 || "+-*/^(".contains(String.valueOf(tokens[i - 1]))))) { + if (tokens[i] >= '0' && tokens[i] <= '9' || tokens[i] == '.' || (tokens[i] == '-' && (i == 0 || "+-*/%^(".contains(String.valueOf(tokens[i - 1]))))) { StringBuilder buffer = new StringBuilder(); if (tokens[i] == '-') { buffer.append('-'); // for negative numbers @@ -37,7 +37,7 @@ public class Calculator { operators.pop(); if (!operators.isEmpty() && operators.peek().length() > 1) values.push(evaluateFunction(operators.pop(), values.pop())); - } else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/' || tokens[i] == '^') { + } else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/' || tokens[i] == '%' || tokens[i] == '^') { while (!operators.isEmpty() && hasPrecedence(String.valueOf(tokens[i]), operators.peek())) values.push(evaluateOperator(operators.pop().charAt(0), values.pop(), values.pop())); operators.push(Character.toString(tokens[i])); @@ -67,6 +67,7 @@ public class Calculator { case '-': return y - x; case '*': return y * x; case '/': return y / x; + case '%': return y % x; case '^': return Math.pow(y, x); // should not happen here, but oh well } @@ -102,7 +103,7 @@ public class Calculator { char secondChar = second.charAt(0); if (secondChar == '(' || secondChar == ')') return false; - else return (firstChar != '*' && firstChar != '/' && firstChar != '^') || (secondChar != '+' && secondChar != '-'); + else return (firstChar != '*' && firstChar != '/' && firstChar != '%' && firstChar != '^') || (secondChar != '+' && secondChar != '-'); } /** Returns the input with all powers evaluated */ diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index 77bc6d2a0..9ad983f1c 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -32,6 +32,7 @@ public class LootGenerator { public static final String LOOT_SHIT = "LOOT_SHIT"; public static final String LOOT_MECHANICAL = "LOOT_MECHANICAL"; public static final String LOOT_GEAR = "LOOT_GEAR"; + public static final String LOOT_SUPPLIES = "LOOT_SUPPLIES"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -47,7 +48,8 @@ public class LootGenerator { case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); case LOOT_SHIT: lootShit(world, x, y, z); case LOOT_MECHANICAL: lootMechanical(world, x, y, z); - case LOOT_GEAR: lootMechanical(world, x, y, z); + case LOOT_GEAR: lootGear(world, x, y, z); + case LOOT_SUPPLIES: lootSupplies(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -65,8 +67,10 @@ public class LootGenerator { LOOT_METEOR, LOOT_FLAREGUN, LOOT_MECHANICAL, - LOOT_GEAR, LOOT_SHIT, + LOOT_GEAR, + LOOT_SUPPLIES + }; } @@ -280,4 +284,17 @@ public class LootGenerator { } } } + + public static void lootSupplies(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 4; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_SUPPLIES), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } } diff --git a/src/main/java/com/hbm/util/ShadyUtil.java b/src/main/java/com/hbm/util/ShadyUtil.java index b40c9a783..7f991f696 100644 --- a/src/main/java/com/hbm/util/ShadyUtil.java +++ b/src/main/java/com/hbm/util/ShadyUtil.java @@ -4,7 +4,6 @@ import com.google.common.collect.Sets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Base64; import java.util.HashSet; import java.util.Random; import java.util.Set; @@ -62,10 +61,6 @@ public class ShadyUtil { "ccd9aa1c-26b9-4dde-8f37-b96f8d99de22", //kakseao }); - // simple cryptographic utils - @Deprecated public static String encode(String msg) { return Base64.getEncoder().encodeToString(msg.getBytes()); } - @Deprecated public static String decode(String msg) { return new String(Base64.getDecoder().decode(msg)); } - /** complete fucking shit */ public static String smoosh(String s1, String s2, String s3, String s4) { @@ -81,18 +76,12 @@ public class ShadyUtil { s += s1; rand.setSeed(b1[0]); - s += rand.nextInt(0xffffff); - s += s2; + s += rand.nextInt(0xffffff) + s2; rand.setSeed(rand.nextInt(0xffffff) + b2[0]); - rand.setSeed(b2[0]); - s += rand.nextInt(0xffffff); - s += s3; + s += rand.nextInt(0xffffff) + s3; rand.setSeed(rand.nextInt(0xffffff) + b3[0]); - rand.setSeed(b3[0]); - s += rand.nextInt(0xffffff); - s += s4; + s += rand.nextInt(0xffffff) + s4; rand.setSeed(rand.nextInt(0xffffff) + b4[0]); - rand.setSeed(b4[0]); s += rand.nextInt(0xffffff); return getHash(s); } diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 051b11d1e..c0be7e888 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -34,12 +34,12 @@ import net.minecraftforge.event.world.WorldEvent; public class NTMWorldGenerator implements IWorldGenerator { boolean regTest = false; - + /** Includes all biomes tagged as ocean or river */ public static boolean isWaterBiome(BiomeGenBase biome) { return BiomeDictionary.isBiomeOfType(biome, Type.WATER); } - + /** Includes biomes with little height variation and sparse vegetation, excludes water biomes */ public static boolean isFlatBiome(BiomeGenBase biome) { return biome.heightVariation <= 0.2F && !isWaterBiome(biome) && BiomeDictionary.isBiomeOfType(biome, Type.SPARSE); @@ -144,17 +144,17 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition("factory") {{ - canSpawn = biome -> isFlatBiome(biome); + canSpawn = biome -> biome.heightVariation <= 0.2F && !isWaterBiome(biome); structure = new JigsawPiece("factory", StructureManager.factory, -10); spawnWeight = StructureConfig.factorySpawnWeight; }}); NBTStructure.registerStructure(0, new SpawnCondition("crane") {{ - canSpawn = biome -> isFlatBiome(biome); - structure = new JigsawPiece("crane", StructureManager.crane, -9); + canSpawn = biome -> biome.heightVariation <= 0.2F && !isWaterBiome(biome); + structure = new JigsawPiece("crane", StructureManager.crane, -13); spawnWeight = StructureConfig.craneSpawnWeight; }}); - + NBTStructure.registerStructure(0, new SpawnCondition("broadcaster_tower") {{ canSpawn = biome -> isFlatBiome(biome); structure = new JigsawPiece("broadcaster_tower", StructureManager.broadcasting_tower, -9); @@ -241,6 +241,11 @@ public class NTMWorldGenerator implements IWorldGenerator { structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; spawnWeight = StructureConfig.enableRuins ? StructureConfig.ruinsJSpawnWeight : 0; }}); + NBTStructure.registerStructure(0, new SpawnCondition("tower_base") {{ + canSpawn = biome -> biome.heightVariation <= 0.3F && !isWaterBiome(biome); + structure = new JigsawPiece("tower_base", StructureManager.tower_base, -6); + spawnWeight = StructureConfig.towerBaseSpawnWeight; + }}); NBTStructure.registerNullWeight(0, StructureConfig.plainsNullWeight, biome -> biome == BiomeGenBase.plains); NBTStructure.registerNullWeight(0, StructureConfig.oceanNullWeight, biome -> BiomeDictionary.isBiomeOfType(biome, Type.OCEAN)); diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index cbbf17142..59380d70d 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -487,6 +487,34 @@ public class LogicBlockActions { } }; + public static Consumer DEAD_GUY_BASE_TOWER = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1) { + world.setBlock(x, y, z, ModBlocks.skeleton_holder); + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + int roll = world.rand.nextInt(100); + + if(roll < 44) { + skeleton.item = new ItemStack(ModItems.ammo_standard, 3, 91); + } else if(roll < 71) { + skeleton.item = new ItemStack(ModItems.ammo_standard, 1, 92); + } else if(roll < 92) { + skeleton.item = new ItemStack(ModItems.ammo_standard, 1, 73); + } else if(roll < 96) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, 3); + } else { + skeleton.item = new ItemStack(ModItems.item_secret, 1, 4); + } + } + } + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -506,6 +534,7 @@ public class LogicBlockActions { actions.put("BOMB_TRAP", BOMB_TRAP); actions.put("BOMB_CRANE", BOMB_CRANE); actions.put("DEAD_GUY_CRANE", DEAD_GUY_CRANE); + //actions.put("DEAD_GUY_TOWER_BASE", DEAD_GUY_TOWER_BASE); //Mob Block Actions actions.put("SKELETON_GUN_TIER_1", SKELETONS_GUN_TIER_1); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 336065b4e..501693dbc 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -137,6 +137,7 @@ ass.nitra=Nitra zu Munition autoswitch=Teil der Rezeptgruppe "%s"$Rezept ändert sich basierend auf das erste Item autoswitch.cyclotron=Zyklotron-Pulverkisten autoswitch.pile=Wiederaufbereitung Chicago-Pile-Brennstoff +autoswitch.pilerod=Chicago-Pile-Brennstoff autoswitch.plate=Wiederaufbereitung Plattenbrennstoff autoswitch.plates=Metallplatten autoswitch.pwr=Wiederaufbereitung PWR-Brennstoff @@ -1733,6 +1734,7 @@ item.cmb_pickaxe.name=CMB-Stahlspitzhacke item.cmb_plate.name=CMB-Stahlbrustpanzer item.cmb_shovel.name=CMB-Stahlschaufel item.cmb_sword.name=CMB-Stahlschwert +item.coal_eternal.name=Ewige Kohle item.coal_infernal.name=Höllische Kohle item.cobalt_axe.name=Kobaltaxt item.cobalt_boots.name=Kobaltstiefel @@ -3980,6 +3982,7 @@ tile.brick_dungeon_flat.name=Berzelianitblock tile.brick_dungeon_tile.name=Berzelianitfliese tile.brick_fire.name=Schamottsteinziegel tile.brick_fire_stairs.name=Schamottsteintreppe +tile.brick_forgotten.name=Block tile.brick_jungle.name=Enargitziegel tile.brick_jungle_circle.name=Mechanistenzirkel tile.brick_jungle_cracked.name=Rissige Enargitziegel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 375d2c3c0..06542768a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -192,6 +192,7 @@ ass.nitra=Nitra to Ammunition autoswitch=Part of auto switch group "%s"$Recipe changes based on first ingredient autoswitch.cyclotron=Cyclotron Powder Boxes autoswitch.pile=Reprocessing Chicago Pile Rods +autoswitch.pilerod=Chicago Pile Rods autoswitch.plate=Reprocessing Plate Fuel autoswitch.plates=Metal Plates autoswitch.pwr=Reprocessing PWR Fuel @@ -953,6 +954,8 @@ desc.gui.assembler.warning=§cError:§r This machine requires an assembly templa desc.gui.chemplant.warning=§cError:§r This machine requires an chemistry template! desc.gui.gasCent.enrichment=§2Enrichment§r$Uranium enrichment requires cascades.$Two-centrifuge cascades will give$uranium fuel, four-centrifuge cascades$will give total separation. desc.gui.gasCent.output=§6Fluid Transfer§r$Fluid can be transferred to another centrifuge$via the output port for further processing. +desc.gui.keyforge.key=The first slot will copy the key/lock's$pin configuration and paste it to the second slot. +desc.gui.keyforge.random=The third slot will randomize the$key/lock's pin configuration. desc.gui.nukeBoy.desc=§1Requires:§r$ * Neutron Shielding$ * U235 Projectile$ * Subcritical U235 Target$ * Propellant$ * Bomb Igniter desc.gui.nukeGadget.desc=§1Requires:§r$ * 4 Arrays of First-Generation$ High-Explosive Lenses$ * Heavy Plutonium Core$ * Wiring desc.gui.nukeMan.desc=§1Requires:§r$ * 4 Arrays of First-Generation$ High-Explosive Lenses$ * Plutonium Core$ * Bomb Firing Unit @@ -974,6 +977,12 @@ desc.gui.rtg.heat=§eCurrent heat level: %s desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) +desc.gui.satdock.desc=Requires linked miner sat chip.$Cargo ship will land periodically to$deliver resources. +desc.gui.satlinker.chip=The first slot will copy the satellite/chip's$frequency and paste it to the second slot. +desc.gui.satlinker.random=The third slot will randomize the$satellite/chip's frequency. +desc.gui.soyuz.cargo=CARGO MODE +desc.gui.soyuz.desc=Designator only for CARGO MODE$The payload for SATELLITE MODE +desc.gui.soyuz.satellite=SATELLITE MODE desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r @@ -2518,6 +2527,7 @@ item.cmb_pickaxe.name=CMB Steel Pickaxe item.cmb_plate.name=CMB Steel Chestplate item.cmb_shovel.name=CMB Steel Shovel item.cmb_sword.name=CMB Steel Sword +item.coal_eternal.name=Eternal Coal item.coal_infernal.name=Infernal Coal item.cobalt_axe.name=Cobalt Axe item.cobalt_boots.name=Cobalt Boots @@ -3815,6 +3825,20 @@ item.pellet_rtg_weak.name=Weak Uranium RTG Pellet item.pellet_rtg_weak.desc=Cheaper and weaker pellet, now with more U238! item.pellet_schrabidium.name=Pure Schrabidium Watz Pellet item.photo_panel.name=Photovoltaic Panel +item.pile_rod.nu.name=Chicago Pile Natural Uranium Rod +item.pile_rod.nu.desc=Basic breeding target for making plutonium-239. +item.pile_rod.po210be.name=Chicago Pile Po210Be Neutron source +item.pile_rod.po210be.desc=Advanced polonium-beryllium neutron source for starting the Chicago Pile's reaction. +item.pile_rod.pu239.name=Chicago Pile Plutonium-239 Rod +item.pile_rod.pu239.desc=Plutonium bred from natural uranium, can be bred further into RGP. +item.pile_rod.ra226be.name=Chicago Pile Ra226Be Neutron source +item.pile_rod.ra226be.desc=Basic radium-beryllium neutron source for starting the Chicago Pile's reaction. +item.pile_rod.rgp.name=Chicago Pile RGP Rod +item.pile_rod.rgp.desc=Reactor-grade plutonium rod, mainly plutonium-239 with plutonium-240 impurities. +item.pile_rod.waste.name=Chicago Pile Nuclear Waste Rod +item.pile_rod.waste.desc=Highly reactive end product from leaving a Chicago Pile fuel rod in the reactor for too long. +item.pile_rod.zr.name=Chicago Pile Zirconium Rod +item.pile_rod.zr.desc=Inert zirconium rod which is transparent to neutrons. Ideal for pushing other rods safely out of the reactor. item.pile_rod_boron.name=Chicago Pile Control Rod item.pile_rod_boron.desc=§9[Neutron Absorber]$§eClick to toggle item.pile_rod_detector.name=Chicago Pile Control & Detector Rod @@ -5173,6 +5197,7 @@ tile.brick_dungeon_flat.name=Berzelianite Block tile.brick_dungeon_tile.name=Berzelianite Tile tile.brick_fire.name=Firebricks tile.brick_fire_stairs.name=Firebrick Stairs +tile.brick_forgotten.name=Block tile.brick_jungle.name=Enargite Bricks tile.brick_jungle_circle.name=Mechanist's Circle tile.brick_jungle_cracked.name=Cracked Enargite Bricks @@ -6197,7 +6222,8 @@ tile.red_cable_paintable.name=Paintable Red Copper Cable tile.red_cable_paintable.desc=Right-click with a solid block to set a paint$Paint can be cleared with a screwdriver$Port texture can be disabled with a defuser$Paints can be copied with the copy tool tile.red_connector.name=Electricity Connector tile.red_connector_super.name=Heavy Duty Electricity Connector -tile.red_pylon.name=Electricity Pylon +tile.red_pylon.name=Wooden Electricity Pylon +tile.red_pylon_steel.name=Steel Electricity Pylon tile.red_pylon_large.name=Large Electricity Pylon tile.red_pylon_medium_steel.name=Medium Steel Electricity Pylon tile.red_pylon_medium_steel_transformer.name=Medium Steel Electricity Pylon with Transformer @@ -6392,6 +6418,57 @@ tile.round_airlock_door.name=Round Airlock Door tile.secure_access_door.name=Secure Access Door tile.sliding_seal_door.name=Sliding Seal Door +hbmfluid.trait.antimatter=Antimatter +hbmfluid.trait.boilable=Boilable +hbmfluid.trait.burned=When burned +hbmfluid.trait.combustible=Combustible +hbmfluid.trait.coolable=Coolable +hbmfluid.trait.coolantICF=ICF Coolant +hbmfluid.trait.coolantPA=Particle Accelerator Coolant +hbmfluid.trait.coolantPWR=PWR Coolant +hbmfluid.trait.corrosive=Corrosive +hbmfluid.trait.corrosiveStrong=Strongly Corrosive +hbmfluid.trait.delicious=Delicious +hbmfluid.trait.efficiency=Efficiency +hbmfluid.trait.flammable=Flammable +hbmfluid.trait.fuel.aviation=Aviation +hbmfluid.trait.fuel.gaseous=Gaseous +hbmfluid.trait.fuel.high=High +hbmfluid.trait.fuel.low=Low +hbmfluid.trait.fuel.medium=Medium +hbmfluid.trait.fuelGrade=Fuel grade +hbmfluid.trait.gaseous=Gaseous +hbmfluid.trait.gaseousRoom=Gaseous at Room Temperature +hbmfluid.trait.glyphidPheromones=Glyphid Pheromones +hbmfluid.trait.hazmat=requires hazmat suit +hbmfluid.trait.heatable=Heatable +hbmfluid.trait.leadContainer=Requires hazardous material tank to hold +hbmfluid.trait.liquid=Liquid +hbmfluid.trait.modifiedPheromones=Modified Pheromones +hbmfluid.trait.perBucket=per bucket +hbmfluid.trait.perDamage=DPS +hbmfluid.trait.perMB=per mB +hbmfluid.trait.perTU=TU per +hbmfluid.trait.polluting=Polluting +hbmfluid.trait.provides=Provides +hbmfluid.trait.pwrFluxCore=Core flux +hbmfluid.trait.pwrFluxMultiplier=PWR Flux Multiplier +hbmfluid.trait.radioactive=Radioactive +hbmfluid.trait.spilled=When spilled +hbmfluid.trait.steam=Turbine Steam +hbmfluid.trait.thermalCapacity=Thermal capacity +hbmfluid.trait.toxin=Toxin +hbmfluid.trait.unsiphonable=Ignored by siphon +hbmfluid.trait.viscous=Viscous + +pollution.soot=Soot +pollution.poison=Poison +pollution.heavymetal=Heavy metal + +pollution.trait.soot=SOOT +pollution.trait.poison=POISON +pollution.trait.heavymetal=HEAVY METAL + trait.asbestos=Asbestos trait.blinding=Blinding trait.coal=Coal Dust diff --git a/src/main/resources/assets/hbm/manual/material/etcoal.json b/src/main/resources/assets/hbm/manual/material/etcoal.json new file mode 100644 index 000000000..b247f658c --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/etcoal.json @@ -0,0 +1,12 @@ +{ + "name": "Eternal Coal", + "icon": ["hbm:item.nothing"], + "trigger": [["hbm:item.coal_eternal"]], + "noindex": true, + "title": { + "en_US": "█ █ █ █ █ █" + }, + "content": { + "en_US": "████████████ ███ ███ ██ ████████ ████████ ██ ████ ████ ████████ ████ ███ ███████ █ ████ █████ ██████ ███████ █ ████ █████ ██ ██ ███ ██████" + } +} diff --git a/src/main/resources/assets/hbm/manual/pile/pile.json b/src/main/resources/assets/hbm/manual/pile/pile.json new file mode 100644 index 000000000..a5ddf27f9 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/pile/pile.json @@ -0,0 +1,12 @@ +{ + "name": "Chicago Pile", + "icon": ["hbm:tile.pile_brick", 1, 0], + "trigger": [["hbm:tile.pile_brick"]], + "title": { + "en_US": "Chicago Pile" + }, + "content": { + "en_US": "The Chcago Pile is a low-tech low-power reactor used for breeding nuclear material, mainly turning [[uranium|Uranium]] into [[plutonium-239|Plutonium-239]]. Due to its simplicity, operating it either requires manual intervention or some form of external operation with [[Redstone over Radio]].

The pile is constructed out of a box of Chicago Pile graphite bricks at least 5x5x5 blocks in size, and at most 15x15x15 blocks. The box does not need to be a perfect cube, so shapes like 5x7x9 are valid, so long as the box is filled. Using a hand drill, the pile is assembled, with the drilled block acting as the core.

To prepare the Chicago Pile for use, channels need to be drilled, again with a hand drill. The function of the channel depends on the orientation relative to the core. Using the hand drill again on the input side of an existing channel will close the channel again. Channels cannot intersect one another.

Fuel channels are channels that follow the core's orientation, i.e. either the input or output side is on the same face as the core's panel. Fuel channels can be loaded with Chicago Pile fuel rods using a [[fuel loader|Chicago Pile Fuel Loader]]. The amount of fuel that fits into any given channel depends on its length, with one block of channel being able to hold one fuel rod.

Ventilation channels are channels which are perpendicular to the core's orientation and therefore also to the fuel channels. Ventilation channels cool down fuel channels which touch (but not intersect) them if compressed air is supplied at a pressure of 1 PU via a [[vent|Chicago Pile Vent]]. Passive cooling in the Chicago Pile is quite low, so while technically optional, vents are basically mandatory for every Pile in practice.

Channels drilled from the top are for [[control rods|Chicago Pile Control Rod]]. Control rods are used to reduce the interactiion between fuel channels in larger Pile setups, although smaller setups are usually fine without control rods. Still, throttling the reactor can be useful when cycling fuel, since the window for extracting pure plutonium-239 is quite small.
<>br>If the Pile is disassembled, channels can be drilled again without having to remove all the attachments like fuel loaders and vents, simply shift-click the attachment with the hand drill and a channel will be drilled into the Pile behind it.

See also:
* [[Chicago Pile Operation]]" + } +} + diff --git a/src/main/resources/assets/hbm/manual/pile/pilecontrol.json b/src/main/resources/assets/hbm/manual/pile/pilecontrol.json new file mode 100644 index 000000000..ee4b473da --- /dev/null +++ b/src/main/resources/assets/hbm/manual/pile/pilecontrol.json @@ -0,0 +1,12 @@ +{ + "name": "Chicago Pile Control Rod", + "icon": ["hbm:tile.pile_device", 1, 2], + "trigger": [["hbm:tile.pile_device", 1, 2]], + "title": { + "en_US": "Chicago Pile Control Rod" + }, + "content": { + "en_US": "Control rods can be placed on top of the vertically drilled channels of the [[Chicago Pile]]. Control rods, when inserted, will reduce the reactivity between fuel channels. The control rods can be controlled with a redstone signal, causing it to fully withdraw when a signal is supplied, or via [[RoR controller|Redstone-over-Radio Controller]], which allows more precise settings.

See also:
* [[Chicago Pile Fuel Loader]]
* [[Chicago Pile Vent]]" + } +} + diff --git a/src/main/resources/assets/hbm/manual/pile/pileloader.json b/src/main/resources/assets/hbm/manual/pile/pileloader.json new file mode 100644 index 000000000..854f9ebf4 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/pile/pileloader.json @@ -0,0 +1,12 @@ +{ + "name": "Chicago Pile Fuel Loader", + "icon": ["hbm:tile.pile_device", 1, 0], + "trigger": [["hbm:tile.pile_device", 1, 0]], + "title": { + "en_US": "Chicago Pile Fuel Loader" + }, + "content": { + "en_US": "The fuel loader is required to load [[Chicago Pile]] fuel rods into the Pile's fuel channels. Right-clicking with a fuel rod will insert that rod into the loader, and right-clicking again will load it into the Pile manually. Fuel can also be supplied using hoppers or conveyors, and the loading action can be triggered by supplying a redstone signal to the loader's back side (where the light grey circle is).

Additionally, the loader can relay information about the connected channel to the [[RoR reader|Redstone-over-Radio Reader]], like the type (metadata) and depletion of the backmost loaded fuel rod or the channel's current temperature.

See also:
* [[Chicago Pile Vent]]
* [[Chicago Pile Control Rod]]" + } +} + diff --git a/src/main/resources/assets/hbm/manual/pile/pileop.json b/src/main/resources/assets/hbm/manual/pile/pileop.json new file mode 100644 index 000000000..ed9937519 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/pile/pileop.json @@ -0,0 +1,12 @@ +{ + "name": "Chicago Pile Operation", + "icon": ["hbm:tile.pile_brick", 1, 0], + "trigger": [], + "title": { + "en_US": "Chicago Pile Operation" + }, + "content": { + "en_US": "The [[Chicago Pile]] requires at least one fuel channel with some sort of neutron source, being radium-226-beryllium or polonium-210-beryllium rods. It's safest and easiest to simply have one fuel channel dedicated to the neutron sources, although mixing neutron sources in with the regular fuel is also an option. [[Ventilation|Chicago Pile Vent]] is also required before actually using fuel, the amount of compressed air used over time is static no matter how hot the reactor is, so doing a dry-run to see if the [[compressor|Compressor]] setup is sufficient is recommended.

Once ventilation and neutron sources are in place, fuel can be added, usually in the form of natural uranium which is bred into plutonium-239. The [[fuel loader|Chicago Pile Fuel Loader]] will only load one rod at a time, simply load as many rods as the channel can hold. Any extra rod loaded will cause the last rod in the channel to be pushed out the other end, where it can be collected with a hopper.

The supplied fuel will be bred as long as its in the reactor. Pu-239 can also be bred into RGP, which can be further bred into nuclear waste. Therefore, leaving fuel in the reactor for too long is undesirable. For this, the fuel loader can be read with an [[RoR reader|Redstone-over-Radio Reader]], which will report the fuel's lifetime and current type in the form of the numeric metadata of the item. For example, Plutonium-239 rods have a meta of 4. Using an [[RoR logic receiver|Redstone-over-Radio Logic Receiver]], this meta can be detected, causing a redstone signal to be sent to the fuel loader, pushing that fuel rod out.

It is not only desirable to eject the fuel in time due to the purity, but also because nuclear waste has a high heat output, which might destroy Piles not prepared for it. If no new fuel is available and the existing loaded fuel is intended to be ejected, rods made from zirconium are ideal, since they are cheap, inert, and transparent to neutrons, not adding any heat while not interfering with the Pile's reaction either.

In an emergency, should the Pile overheat, it will catch fire, explode, and eject many flaming graphite bricks which also explode into fire, setting the surroundings ablaze. It is recommended to keep the Pile in a small room, away from flammable material, and to keep a fire extinguisher nearby.

For people who want to make the most out of their fuel, using [[RoR controllers|Redstone-over-Radio Controller]] to adjust the control rod settings automatically may be desirable. Especially in larger setups, control rods are important to prevent the Pile from quickly overheating, and having an adaptive system controlled either by RoR logic receivers or an [[AUTOCAL]] unit can allow the Pile to run reasonably hot without exploding." + } +} + diff --git a/src/main/resources/assets/hbm/manual/pile/pilevent.json b/src/main/resources/assets/hbm/manual/pile/pilevent.json new file mode 100644 index 000000000..8b6b619b1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/pile/pilevent.json @@ -0,0 +1,12 @@ +{ + "name": "Chicago Pile Vent", + "icon": ["hbm:tile.pile_device", 1, 1], + "trigger": [["hbm:tile.pile_device", 1, 1]], + "title": { + "en_US": "Chicago Pile Vent" + }, + "content": { + "en_US": "The vent is needed to insert compressed air at 1 PU into the [[Chicago Pile's|Chicago Pile]] ventilation channels. Due to the pressure requirement, each Pile therefore needs at least one [[compressor|Compressor]]. Hot air will harmlessly exit the Pile at the output side of the ventilation channel.

The vent's cooling effect only applies to fuel channels that touch the ventilation channel, or rather, fuel channels exactly one block above and below that ventilation channel. Without sufficient cooling, the channel will surpass 800°C, causing the highly-flammable graphite bricks to ignite, forcefully disassembling the Pile.

See also:
* [[Chicago Pile Fuel Loader]]
* [[Chicago Pile Control Rod]]" + } +} + diff --git a/src/main/resources/assets/hbm/models/machines/satlink.obj b/src/main/resources/assets/hbm/models/machines/satlink.obj new file mode 100644 index 000000000..3da21b552 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/satlink.obj @@ -0,0 +1,1520 @@ +# Blender v2.79 (sub 0) OBJ File: 'satlink.blend' +# www.blender.org +o Rotor +v -0.125000 7.000000 0.250000 +v -0.250000 7.000000 0.125000 +v 0.250000 7.000000 0.125000 +v 0.125000 7.000000 0.250000 +v -0.250000 7.000000 -0.125000 +v -0.125000 7.000000 -0.250000 +v 0.125000 7.000000 -0.250000 +v 0.250000 7.000000 -0.125000 +v -0.125000 7.125000 -0.250000 +v -0.250000 7.125000 -0.125000 +v -0.250000 7.125000 0.125000 +v -0.125000 7.125000 0.250000 +v 0.125000 7.125000 0.250000 +v 0.250000 7.125000 0.125000 +v 0.250000 7.125000 -0.125000 +v 0.125000 7.125000 -0.250000 +v 0.125000 7.125000 0.250000 +v -0.125000 7.125000 0.250000 +v -0.125000 7.125000 0.125000 +v 0.125000 7.125000 0.125000 +v 0.125000 7.500000 0.125000 +v -0.125000 7.500000 0.125000 +v 0.125000 7.500000 0.250000 +v -0.125000 7.500000 0.250000 +v 0.125000 7.125000 -0.125000 +v -0.125000 7.125000 -0.125000 +v -0.125000 7.125000 -0.250000 +v 0.125000 7.125000 -0.250000 +v 0.125000 7.500000 -0.250000 +v -0.125000 7.500000 -0.250000 +v 0.125000 7.500000 -0.125000 +v -0.125000 7.500000 -0.125000 +vt 0.538462 0.022222 +vt 0.576923 0.044444 +vt 0.564103 0.111111 +vt 0.564103 0.000000 +vt 0.538462 0.000000 +vt 0.589744 0.088889 +vt 0.589744 0.044444 +vt 0.512821 0.044444 +vt 0.525641 0.088889 +vt 0.512821 0.088889 +vt 0.576923 0.133333 +vt 0.564103 0.133333 +vt 0.576923 0.022222 +vt 0.564103 0.022222 +vt 0.525641 0.000000 +vt 0.538462 0.133333 +vt 0.525641 0.111111 +vt 0.538462 0.111111 +vt 0.602564 -0.000000 +vt 0.589744 0.066667 +vt 0.589744 -0.000000 +vt 0.666667 -0.000000 +vt 0.641026 0.066667 +vt 0.641026 -0.000000 +vt 0.602564 -0.000000 +vt 0.589744 0.066667 +vt 0.589744 -0.000000 +vt 0.628205 -0.000000 +vt 0.602564 0.066667 +vt 0.628205 0.066667 +vt 0.602564 0.088889 +vt 0.602564 0.066667 +vt 0.628205 0.066667 +vt 0.641026 -0.000000 +vt 0.628205 -0.000000 +vt 0.602564 0.088889 +vt 0.666667 -0.000000 +vt 0.641026 0.066667 +vt 0.525641 0.044444 +vt 0.576923 0.088889 +vt 0.576923 0.111111 +vt 0.576923 0.000000 +vt 0.525641 0.022222 +vt 0.525641 0.133333 +vt 0.666667 0.066667 +vt 0.628205 0.088889 +vt 0.628205 0.088889 +vt 0.666667 0.066667 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +s off +f 14/1/1 16/2/1 10/3/1 +f 8/4/2 14/1/2 3/5/2 +f 6/6/3 16/2/3 7/7/3 +f 4/8/4 12/9/4 1/10/4 +f 10/3/5 6/11/5 5/12/5 +f 8/4/6 16/13/6 15/14/6 +f 14/1/7 4/15/7 3/5/7 +f 2/16/8 12/17/8 11/18/8 +f 2/16/9 10/3/9 5/12/9 +f 26/19/9 30/20/9 27/21/9 +f 19/22/3 21/23/3 20/24/3 +f 18/25/9 22/26/9 19/27/9 +f 17/28/4 24/29/4 18/25/4 +f 31/30/1 30/31/1 32/32/1 +f 20/24/2 23/33/2 17/28/2 +f 28/34/2 31/30/2 25/35/2 +f 23/33/1 22/36/1 24/29/1 +f 27/37/3 29/38/3 28/34/3 +f 25/35/4 32/32/4 26/19/4 +f 10/3/1 11/18/1 12/9/1 +f 12/9/1 13/39/1 14/1/1 +f 14/1/1 15/14/1 16/2/1 +f 16/2/1 9/40/1 10/3/1 +f 10/3/1 12/9/1 14/1/1 +f 8/4/2 15/14/2 14/1/2 +f 6/6/3 9/40/3 16/2/3 +f 4/8/4 13/39/4 12/9/4 +f 10/3/5 9/41/5 6/11/5 +f 8/4/6 7/42/6 16/13/6 +f 14/1/7 13/43/7 4/15/7 +f 2/16/8 1/44/8 12/17/8 +f 2/16/9 11/18/9 10/3/9 +f 26/19/9 32/32/9 30/20/9 +f 19/22/3 22/45/3 21/23/3 +f 18/25/9 24/29/9 22/26/9 +f 17/28/4 23/33/4 24/29/4 +f 31/30/1 29/46/1 30/31/1 +f 20/24/2 21/23/2 23/33/2 +f 28/34/2 29/38/2 31/30/2 +f 23/33/1 21/47/1 22/36/1 +f 27/37/3 30/48/3 29/38/3 +f 25/35/4 31/30/4 32/32/4 +o Dish +v 0.000000 7.625000 -0.125000 +v 0.000000 7.625000 0.125000 +v 0.176777 7.551777 -0.125000 +v 0.176777 7.551777 0.125000 +v 0.250000 7.375000 -0.125000 +v 0.250000 7.375000 0.125000 +v 0.176777 7.198223 -0.125000 +v 0.176777 7.198223 0.125000 +v -0.000000 7.125000 -0.125000 +v -0.000000 7.125000 0.125000 +v -0.176777 7.198223 -0.125000 +v -0.176777 7.198223 0.125000 +v -0.250000 7.375000 -0.125000 +v -0.250000 7.375000 0.125000 +v -0.176777 7.551777 -0.125000 +v -0.176777 7.551777 0.125000 +v -0.125000 7.750000 0.093750 +v 0.125000 7.750000 0.093750 +v -0.125000 7.750000 -0.093750 +v 0.125000 7.750000 -0.093750 +v -0.125000 7.500000 -0.093750 +v -0.125000 7.500000 0.093750 +v 0.125000 7.500000 0.093750 +v 0.125000 7.500000 -0.093750 +v 0.000000 8.125000 -1.500000 +v -0.750000 8.125000 -1.299038 +v -1.299038 8.125000 -0.750000 +v -1.500000 8.125000 0.000000 +v -1.299038 8.125000 0.750000 +v -0.750000 8.125000 1.299038 +v -0.000000 8.125000 1.500000 +v 0.750000 8.125000 1.299038 +v 1.299038 8.125000 0.750000 +v 1.500000 8.125000 0.000001 +v 1.299039 8.125000 -0.749999 +v 0.750001 8.125000 -1.299038 +v 0.000000 7.750000 -0.750000 +v -0.375000 7.750000 -0.649519 +v -0.649519 7.750000 -0.375000 +v -0.750000 7.750000 0.000000 +v -0.649519 7.750000 0.375000 +v -0.375000 7.750000 0.649519 +v -0.000000 7.750000 0.750000 +v 0.375000 7.750000 0.649519 +v 0.649519 7.750000 0.375000 +v 0.750000 7.750000 0.000000 +v 0.649519 7.750000 -0.375000 +v 0.375000 7.750000 -0.649519 +v 0.000000 7.625000 0.000000 +v 0.000000 7.750000 -0.500000 +v -0.250000 7.750000 -0.433012 +v -0.433013 7.750000 -0.250000 +v -0.500000 7.750000 0.000000 +v -0.433013 7.750000 0.250000 +v -0.250000 7.750000 0.433013 +v -0.000000 7.750000 0.500000 +v 0.250000 7.750000 0.433013 +v 0.433013 7.750000 0.250000 +v 0.500000 7.750000 0.000000 +v 0.433013 7.750000 -0.250000 +v 0.250000 7.750000 -0.433012 +v -0.125000 8.625000 0.125000 +v -0.125000 8.875000 0.125000 +v -0.125000 8.625000 -0.125000 +v -0.125000 8.875000 -0.125000 +v 0.125000 8.625000 0.125000 +v 0.125000 8.875000 0.125000 +v 0.125000 8.625000 -0.125000 +v 0.125000 8.875000 -0.125000 +v -0.062500 7.750000 0.437500 +v 0.062500 7.750000 0.437500 +v -0.062500 7.750000 0.312500 +v 0.062500 7.750000 0.312500 +v -0.062500 8.625000 0.125000 +v 0.062500 8.625000 0.125000 +v -0.062500 8.625000 0.000000 +v 0.062500 8.625000 0.000000 +v -0.062500 7.750000 -0.312500 +v 0.062500 7.750000 -0.312500 +v -0.062500 7.750000 -0.437500 +v 0.062500 7.750000 -0.437500 +v -0.062500 8.625000 0.000000 +v 0.062500 8.625000 0.000000 +v -0.062500 8.625000 -0.125000 +v 0.062500 8.625000 -0.125000 +vt 0.487179 0.177778 +vt 0.506410 0.133333 +vt 0.506410 0.177778 +vt 0.551282 0.177778 +vt 0.576923 0.133333 +vt 0.576923 0.177778 +vt 0.743615 0.044444 +vt 0.769231 0.000044 +vt 0.794846 0.044444 +vt 0.532051 0.177778 +vt 0.551282 0.133333 +vt 0.794846 0.044445 +vt 0.787344 0.075841 +vt 0.751117 0.013048 +vt 0.532051 0.133333 +vt 0.512821 0.733333 +vt 0.487179 0.688889 +vt 0.512821 0.688889 +vt 0.487179 0.733333 +vt 0.461538 0.688889 +vt 0.461538 0.733333 +vt 0.435897 0.688889 +vt 0.435897 0.733333 +vt 0.410256 0.688889 +vt 0.435897 0.644444 +vt 0.461538 0.644444 +vt 0.461538 0.777778 +vt 0.500000 0.533333 +vt 0.487179 0.688889 +vt 0.487179 0.533333 +vt 0.474359 0.688889 +vt 0.461538 0.533333 +vt 0.474359 0.533333 +vt 0.512821 0.688889 +vt 0.512821 0.533333 +vt 0.500000 0.688889 +vt 0.487179 0.533333 +vt 0.500000 0.533333 +vt 0.474359 0.533333 +vt 0.461538 0.688889 +vt 0.461538 0.533333 +vt 0.512821 0.688889 +vt 0.512821 0.533333 +vt 0.487179 0.688889 +vt 0.487179 0.133333 +vt 0.787344 0.075841 +vt 0.769231 0.088845 +vt 0.751118 0.075841 +vt 0.751117 0.013048 +vt 0.787344 0.013048 +vt 0.769231 0.088845 +vt 0.751117 0.075841 +vt 0.743615 0.044445 +vt 0.769231 0.000044 +vt 0.787344 0.013048 +vt 0.410256 0.733333 +vt 0.435897 0.777778 +vt 0.500000 0.688889 +vt 0.461538 0.688889 +vt 0.474359 0.688889 +vt 0.794872 0.133333 +vt 0.820513 0.100000 +vt 0.820513 0.133333 +vt 0.794872 0.100000 +vt 0.820513 0.066667 +vt 0.794872 0.066667 +vt 0.820513 0.033333 +vt 0.794872 0.033333 +vt 0.820513 0.000000 +vt 0.794872 0.266667 +vt 0.820513 0.233333 +vt 0.820513 0.266667 +vt 0.794872 0.233333 +vt 0.820513 0.200000 +vt 0.794872 0.200000 +vt 0.820513 0.166667 +vt 0.794872 0.166667 +vt 0.980769 0.333333 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.980769 0.333333 +vt 0.961538 0.466667 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.980769 0.333333 +vt 0.942308 0.333333 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.923077 0.177778 +vt 1.000000 0.177778 +vt 0.974359 0.000000 +vt 0.974359 -0.000000 +vt 0.974359 0.000000 +vt 0.948718 -0.000000 +vt 0.974359 -0.000000 +vt 0.948718 0.000000 +vt 0.974359 0.000000 +vt 0.948718 -0.000000 +vt 0.974359 -0.000000 +vt 0.948718 0.000000 +vt 0.974359 0.000000 +vt 0.948718 -0.000000 +vt 0.974359 -0.000000 +vt 0.948718 0.000000 +vt 0.974359 0.000000 +vt 0.948718 -0.000000 +vt 0.974359 -0.000000 +vt 0.974359 0.000000 +vt 0.974359 -0.000000 +vt 0.717972 0.254688 +vt 0.717972 0.100868 +vt 0.794825 0.177778 +vt 0.794872 0.000000 +vt 0.948718 0.000000 +vt 0.948718 -0.000000 +vt 0.948718 0.000000 +vt 0.948718 0.000000 +vt 0.948718 -0.000000 +vt 0.787961 0.222182 +vt 0.769207 0.254688 +vt 0.743590 0.266586 +vt 0.699219 0.222182 +vt 0.692355 0.177778 +vt 0.699219 0.133374 +vt 0.743590 0.088970 +vt 0.769207 0.100868 +vt 0.787961 0.133374 +vn -1.0000 0.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 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.3363 -0.9417 +vn 0.0000 0.3363 0.9417 +vn 0.0000 0.3363 -0.9417 +vn 0.0000 -0.3363 0.9417 +vn 0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.2869 -0.9435 -0.1656 +vn 0.2236 -0.8944 -0.3873 +vn 0.3873 -0.8944 -0.2236 +vn -0.1656 -0.9435 -0.2869 +vn -0.2869 -0.9435 -0.1656 +vn -0.3313 -0.9435 -0.0000 +vn -0.2869 -0.9435 0.1656 +vn -0.1656 -0.9435 0.2869 +vn -0.0000 -0.9435 0.3313 +vn 0.1656 -0.9435 0.2869 +vn 0.2869 -0.9435 0.1656 +vn 0.3313 -0.9435 0.0000 +vn 0.1656 -0.9435 -0.2869 +vn -0.0000 -0.9435 -0.3313 +vn -0.0000 -0.8944 -0.4472 +vn -0.2236 -0.8944 -0.3873 +vn -0.3873 -0.8944 -0.2236 +vn -0.4472 -0.8944 -0.0000 +vn -0.3873 -0.8944 0.2236 +vn -0.2236 -0.8944 0.3873 +vn -0.0000 -0.8944 0.4472 +vn 0.2236 -0.8944 0.3873 +vn 0.3873 -0.8944 0.2236 +vn 0.4472 -0.8944 0.0000 +vn 0.1756 0.9363 -0.3041 +vn 0.1792 0.9784 -0.1034 +vn 0.3041 0.9363 -0.1756 +vn 0.2069 0.9784 -0.0000 +vn 0.3511 0.9363 -0.0000 +vn 0.1792 0.9784 0.1034 +vn 0.3041 0.9363 0.1756 +vn 0.1756 0.9363 0.3041 +vn 0.1034 0.9784 0.1792 +vn 0.0000 0.9363 0.3511 +vn -0.0000 0.9784 0.2069 +vn -0.1756 0.9363 0.3041 +vn -0.1034 0.9784 0.1792 +vn -0.3041 0.9363 0.1756 +vn -0.1792 0.9784 0.1034 +vn -0.3511 0.9363 -0.0000 +vn -0.2069 0.9784 0.0000 +vn -0.3041 0.9363 -0.1756 +vn -0.1792 0.9784 -0.1034 +vn -0.1756 0.9363 -0.3041 +vn -0.1034 0.9784 -0.1792 +vn 0.0000 0.9784 -0.2069 +vn 0.0000 0.9363 -0.3511 +vn 0.1034 0.9784 -0.1792 +s off +f 51/49/10 54/50/10 49/51/10 +f 52/52/11 53/53/11 51/54/11 +f 46/55/12 42/56/12 38/57/12 +f 50/58/13 56/59/13 52/52/13 +f 45/60/11 47/61/11 39/62/11 +f 49/51/12 55/63/12 50/58/12 +f 95/64/10 96/65/10 94/66/10 +f 97/67/11 100/68/11 96/65/11 +f 101/69/13 98/70/13 100/68/13 +f 99/71/12 94/72/12 98/70/12 +f 100/68/14 94/73/14 96/74/14 +f 97/75/15 99/71/15 101/69/15 +f 105/76/13 107/77/13 103/78/13 +f 106/79/10 104/80/10 102/81/10 +f 108/82/16 105/76/16 104/83/16 +f 107/77/17 102/81/17 103/78/17 +f 117/84/13 111/85/13 113/86/13 +f 110/87/10 116/88/10 112/89/10 +f 116/90/18 113/86/18 112/91/18 +f 115/92/19 110/87/19 111/85/19 +f 51/49/10 53/93/10 54/50/10 +f 52/52/11 56/59/11 53/53/11 +f 38/57/12 36/94/12 34/95/12 +f 34/95/12 48/96/12 46/55/12 +f 46/55/12 44/97/12 42/56/12 +f 42/56/12 40/98/12 38/57/12 +f 38/57/12 34/95/12 46/55/12 +f 50/58/13 55/63/13 56/59/13 +f 47/61/11 33/99/11 35/100/11 +f 35/100/11 37/101/11 47/61/11 +f 37/101/11 39/62/11 47/61/11 +f 39/62/11 41/102/11 43/103/11 +f 43/103/11 45/60/11 39/62/11 +f 49/51/12 54/50/12 55/63/12 +f 95/64/10 97/67/10 96/65/10 +f 97/67/11 101/69/11 100/68/11 +f 101/69/13 99/71/13 98/70/13 +f 99/71/12 95/104/12 94/72/12 +f 100/68/14 98/70/14 94/73/14 +f 97/75/15 95/105/15 99/71/15 +f 105/76/13 109/106/13 107/77/13 +f 106/79/10 108/107/10 104/80/10 +f 108/82/16 109/106/16 105/76/16 +f 107/77/17 106/79/17 102/81/17 +f 117/84/13 115/92/13 111/85/13 +f 110/87/10 114/108/10 116/88/10 +f 116/90/18 117/84/18 113/86/18 +f 115/92/19 114/108/19 110/87/19 +s 1 +f 34/109/15 35/110/20 33/111/15 +f 36/112/20 37/113/13 35/110/20 +f 38/114/13 39/115/21 37/113/13 +f 40/116/21 41/117/14 39/115/21 +f 42/118/14 43/119/22 41/120/14 +f 44/121/22 45/122/10 43/119/22 +f 46/123/10 47/124/23 45/122/10 +f 48/125/23 33/111/15 47/124/23 +f 79/126/24 68/127/25 67/128/26 +f 70/129/27 81/130/14 71/131/28 +f 71/132/28 81/130/14 72/133/29 +f 72/134/29 81/130/14 73/135/30 +f 73/136/30 81/130/14 74/137/31 +f 74/138/31 81/130/14 75/139/32 +f 75/140/32 81/130/14 76/141/33 +f 76/142/33 81/130/14 77/143/34 +f 77/144/34 81/130/14 78/145/35 +f 78/146/35 81/130/14 79/147/24 +f 79/126/24 81/130/14 80/148/36 +f 80/149/36 81/130/14 69/150/37 +f 69/151/37 81/130/14 70/152/27 +f 80/149/36 57/153/38 68/154/25 +f 69/151/37 58/155/39 57/156/38 +f 58/157/39 71/131/28 59/158/40 +f 71/132/28 60/159/41 59/160/40 +f 72/134/29 61/161/42 60/162/41 +f 61/163/42 74/137/31 62/164/43 +f 74/138/31 63/165/44 62/166/43 +f 63/167/44 76/141/33 64/168/45 +f 76/142/33 65/169/46 64/170/45 +f 77/144/34 66/171/47 65/172/46 +f 78/146/35 67/173/26 66/174/47 +f 62/164/48 86/175/49 61/163/50 +f 61/161/50 85/176/51 60/162/52 +f 60/159/52 84/177/53 59/160/54 +f 58/157/55 84/178/53 83/179/56 +f 57/156/57 83/180/56 82/181/58 +f 68/154/59 82/182/58 93/183/60 +f 67/128/61 93/184/60 92/185/62 +f 66/174/63 92/186/62 91/187/64 +f 65/172/65 91/188/64 90/189/66 +f 64/170/67 90/190/66 89/191/68 +f 64/168/67 88/192/69 63/167/70 +f 63/165/70 87/193/71 62/166/48 +f 86/194/49 90/195/66 82/196/58 +f 34/109/15 36/112/20 35/110/20 +f 36/112/20 38/114/13 37/113/13 +f 38/114/13 40/116/21 39/115/21 +f 40/116/21 42/197/14 41/117/14 +f 42/118/14 44/121/22 43/119/22 +f 44/121/22 46/123/10 45/122/10 +f 46/123/10 48/125/23 47/124/23 +f 48/125/23 34/109/15 33/111/15 +f 79/126/24 80/148/36 68/127/25 +f 80/149/36 69/150/37 57/153/38 +f 69/151/37 70/152/27 58/155/39 +f 58/157/39 70/129/27 71/131/28 +f 71/132/28 72/133/29 60/159/41 +f 72/134/29 73/135/30 61/161/42 +f 61/163/42 73/136/30 74/137/31 +f 74/138/31 75/139/32 63/165/44 +f 63/167/44 75/140/32 76/141/33 +f 76/142/33 77/143/34 65/169/46 +f 77/144/34 78/145/35 66/171/47 +f 78/146/35 79/147/24 67/173/26 +f 62/164/48 87/198/71 86/175/49 +f 61/161/50 86/199/49 85/176/51 +f 60/159/52 85/200/51 84/177/53 +f 58/157/55 59/158/54 84/178/53 +f 57/156/57 58/155/55 83/180/56 +f 68/154/59 57/153/57 82/182/58 +f 67/128/61 68/127/59 93/184/60 +f 66/174/63 67/173/61 92/186/62 +f 65/172/65 66/171/63 91/188/64 +f 64/170/67 65/169/65 90/190/66 +f 64/168/67 89/201/68 88/192/69 +f 63/165/70 88/202/69 87/193/71 +f 82/196/58 83/203/56 84/204/53 +f 84/204/53 85/205/51 82/196/58 +f 85/205/51 86/194/49 82/196/58 +f 86/194/49 87/206/71 88/207/69 +f 88/207/69 89/208/68 86/194/49 +f 89/208/68 90/195/66 86/194/49 +f 90/195/66 91/209/64 92/210/62 +f 92/210/62 93/211/60 90/195/66 +f 93/211/60 82/196/58 90/195/66 +o Base +v -1.000000 0.000000 1.000000 +v 1.000000 0.000000 1.000000 +v -1.000000 0.000000 -1.000000 +v 1.000000 0.000000 -1.000000 +v -1.000000 0.750000 1.000000 +v 1.000000 0.750000 1.000000 +v -1.000000 0.750000 -1.000000 +v 1.000000 0.750000 -1.000000 +v -0.750000 1.000000 0.750000 +v 0.750000 1.000000 0.750000 +v -0.750000 1.000000 -0.750000 +v 0.750000 1.000000 -0.750000 +v 0.500000 1.000000 -0.500000 +v 0.750000 1.000000 -0.500000 +v 0.500000 1.000000 -0.750000 +v 0.750000 1.000000 -0.750000 +v 0.000000 6.000000 0.000000 +v 0.250000 6.000000 0.000000 +v 0.000000 6.000000 -0.250000 +v 0.250000 6.000000 -0.250000 +v 0.500000 1.000000 0.750000 +v 0.750000 1.000000 0.750000 +v 0.500000 1.000000 0.500000 +v 0.750000 1.000000 0.500000 +v 0.000000 6.000000 0.250000 +v 0.250000 6.000000 0.250000 +v 0.000000 6.000000 0.000000 +v 0.250000 6.000000 0.000000 +v -0.750000 1.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v -0.750000 1.000000 -0.750000 +v -0.500000 1.000000 -0.750000 +v -0.250000 6.000000 0.000000 +v 0.000000 6.000000 0.000000 +v -0.250000 6.000000 -0.250000 +v 0.000000 6.000000 -0.250000 +v -0.750000 1.000000 0.750000 +v -0.500000 1.000000 0.750000 +v -0.750000 1.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.250000 6.000000 0.250000 +v 0.000000 6.000000 0.250000 +v -0.250000 6.000000 0.000000 +v 0.000000 6.000000 0.000000 +v -0.375000 6.000000 0.375000 +v 0.375000 6.000000 0.375000 +v -0.375000 6.000000 -0.375000 +v 0.375000 6.000000 -0.375000 +v -0.312500 6.125000 -0.312500 +v -0.312500 6.125000 0.312500 +v 0.312500 6.125000 0.312500 +v 0.312500 6.125000 -0.312500 +v -0.375000 6.125000 -0.375000 +v -0.375000 6.125000 0.375000 +v 0.375000 6.125000 0.375000 +v 0.375000 6.125000 -0.375000 +v -0.312500 6.250000 -0.312500 +v -0.312500 6.250000 0.312500 +v 0.312500 6.250000 0.312500 +v 0.312500 6.250000 -0.312500 +v -0.375000 6.250000 -0.375000 +v -0.375000 6.250000 0.375000 +v 0.375000 6.250000 0.375000 +v 0.375000 6.250000 -0.375000 +v -0.375000 7.000000 -0.375000 +v -0.375000 7.000000 0.375000 +v 0.375000 7.000000 0.375000 +v 0.375000 7.000000 -0.375000 +v 0.562500 2.125000 -0.500000 +v 0.687500 1.125000 0.500000 +v 0.437500 2.125000 -0.500000 +v 0.562500 1.125000 0.500000 +v 0.687500 1.000000 0.500000 +v 0.562500 1.000000 0.500000 +v 0.562500 2.000000 -0.500000 +v 0.437500 2.000000 -0.500000 +v 0.687500 1.125000 -0.500000 +v 0.562500 2.125000 0.500000 +v 0.562500 1.125000 -0.500000 +v 0.437500 2.125000 0.500000 +v 0.562500 2.000000 0.500000 +v 0.437500 2.000000 0.500000 +v 0.687500 1.000000 -0.500000 +v 0.562500 1.000000 -0.500000 +v 0.437500 3.125000 -0.375000 +v 0.562500 2.375000 0.375000 +v 0.312500 3.125000 -0.375000 +v 0.437500 2.375000 0.375000 +v 0.562500 2.250000 0.375000 +v 0.437500 2.250000 0.375000 +v 0.437500 3.000000 -0.375000 +v 0.312500 3.000000 -0.375000 +v 0.562500 2.375000 -0.375000 +v 0.437500 3.125000 0.375000 +v 0.437500 2.375000 -0.375000 +v 0.312500 3.125000 0.375000 +v 0.437500 3.000000 0.375000 +v 0.312500 3.000000 0.375000 +v 0.562500 2.250000 -0.375000 +v 0.437500 2.250000 -0.375000 +v 0.375000 4.000000 -0.312500 +v 0.437500 3.375000 0.312500 +v 0.250000 4.000000 -0.312500 +v 0.312500 3.375000 0.312500 +v 0.437500 3.250000 0.312500 +v 0.312500 3.250000 0.312500 +v 0.375000 3.875000 -0.312500 +v 0.250000 3.875000 -0.312500 +v 0.437500 3.375000 -0.312500 +v 0.375000 4.000000 0.312500 +v 0.312500 3.375000 -0.312500 +v 0.250000 4.000000 0.312500 +v 0.375000 3.875000 0.312500 +v 0.250000 3.875000 0.312500 +v 0.437500 3.250000 -0.312500 +v 0.312500 3.250000 -0.312500 +v -0.562500 2.125000 0.500000 +v -0.687500 1.125000 -0.500000 +v -0.437500 2.125000 0.500000 +v -0.562500 1.125000 -0.500000 +v -0.687500 1.000000 -0.500000 +v -0.562500 1.000000 -0.500000 +v -0.562500 2.000000 0.500000 +v -0.437500 2.000000 0.500000 +v -0.687500 1.125000 0.500000 +v -0.562500 2.125000 -0.500000 +v -0.562500 1.125000 0.500000 +v -0.437500 2.125000 -0.500000 +v -0.562500 2.000000 -0.500000 +v -0.437500 2.000000 -0.500000 +v -0.687500 1.000000 0.500000 +v -0.562500 1.000000 0.500000 +v -0.437500 3.125000 0.375000 +v -0.562500 2.375000 -0.375000 +v -0.312500 3.125000 0.375000 +v -0.437500 2.375000 -0.375000 +v -0.562500 2.250000 -0.375000 +v -0.437500 2.250000 -0.375000 +v -0.437500 3.000000 0.375000 +v -0.312500 3.000000 0.375000 +v -0.562500 2.375000 0.375000 +v -0.437500 3.125000 -0.375000 +v -0.437500 2.375000 0.375000 +v -0.312500 3.125000 -0.375000 +v -0.437500 3.000000 -0.375000 +v -0.312500 3.000000 -0.375000 +v -0.562500 2.250000 0.375000 +v -0.437500 2.250000 0.375000 +v -0.375000 4.000000 0.312500 +v -0.437500 3.375000 -0.312500 +v -0.250000 4.000000 0.312500 +v -0.312500 3.375000 -0.312500 +v -0.437500 3.250000 -0.312500 +v -0.312500 3.250000 -0.312500 +v -0.375000 3.875000 0.312500 +v -0.250000 3.875000 0.312500 +v -0.437500 3.375000 0.312500 +v -0.375000 4.000000 -0.312500 +v -0.312500 3.375000 0.312500 +v -0.250000 4.000000 -0.312500 +v -0.375000 3.875000 -0.312500 +v -0.250000 3.875000 -0.312500 +v -0.437500 3.250000 0.312500 +v -0.312500 3.250000 0.312500 +v -0.500000 2.125000 -0.562500 +v 0.500000 1.125000 -0.687500 +v -0.500000 2.125000 -0.437500 +v 0.500000 1.125000 -0.562500 +v 0.500000 1.000000 -0.687500 +v 0.500000 1.000000 -0.562500 +v -0.500000 2.000000 -0.562500 +v -0.500000 2.000000 -0.437500 +v -0.500000 1.125000 -0.687500 +v 0.500000 2.125000 -0.562500 +v -0.500000 1.125000 -0.562500 +v 0.500000 2.125000 -0.437500 +v 0.500000 2.000000 -0.562500 +v 0.500000 2.000000 -0.437500 +v -0.500000 1.000000 -0.687500 +v -0.500000 1.000000 -0.562500 +v -0.375000 3.125000 -0.437500 +v 0.375000 2.375000 -0.562500 +v -0.375000 3.125000 -0.312500 +v 0.375000 2.375000 -0.437500 +v 0.375000 2.250000 -0.562500 +v 0.375000 2.250000 -0.437500 +v -0.375000 3.000000 -0.437500 +v -0.375000 3.000000 -0.312500 +v -0.375000 2.375000 -0.562500 +v 0.375000 3.125000 -0.437500 +v -0.375000 2.375000 -0.437500 +v 0.375000 3.125000 -0.312500 +v 0.375000 3.000000 -0.437500 +v 0.375000 3.000000 -0.312500 +v -0.375000 2.250000 -0.562500 +v -0.375000 2.250000 -0.437500 +v -0.312500 4.000000 -0.375000 +v 0.312500 3.375000 -0.437500 +v -0.312500 4.000000 -0.250000 +v 0.312500 3.375000 -0.312500 +v 0.312500 3.250000 -0.437500 +v 0.312500 3.250000 -0.312500 +v -0.312500 3.875000 -0.375000 +v -0.312500 3.875000 -0.250000 +v -0.312500 3.375000 -0.437500 +v 0.312500 4.000000 -0.375000 +v -0.312500 3.375000 -0.312500 +v 0.312500 4.000000 -0.250000 +v 0.312500 3.875000 -0.375000 +v 0.312500 3.875000 -0.250000 +v -0.312500 3.250000 -0.437500 +v -0.312500 3.250000 -0.312500 +v 0.500000 2.125000 0.562500 +v -0.500000 1.125000 0.687500 +v 0.500000 2.125000 0.437500 +v -0.500000 1.125000 0.562500 +v -0.500000 1.000000 0.687500 +v -0.500000 1.000000 0.562500 +v 0.500000 2.000000 0.562500 +v 0.500000 2.000000 0.437500 +v 0.500000 1.125000 0.687500 +v -0.500000 2.125000 0.562500 +v 0.500000 1.125000 0.562500 +v -0.500000 2.125000 0.437500 +v -0.500000 2.000000 0.562500 +v -0.500000 2.000000 0.437500 +v 0.500000 1.000000 0.687500 +v 0.500000 1.000000 0.562500 +v 0.375000 3.125000 0.437500 +v -0.375000 2.375000 0.562500 +v 0.375000 3.125000 0.312500 +v -0.375000 2.375000 0.437500 +v -0.375000 2.250000 0.562500 +v -0.375000 2.250000 0.437500 +v 0.375000 3.000000 0.437500 +v 0.375000 3.000000 0.312500 +v 0.375000 2.375000 0.562500 +v -0.375000 3.125000 0.437500 +v 0.375000 2.375000 0.437500 +v -0.375000 3.125000 0.312500 +v -0.375000 3.000000 0.437500 +v -0.375000 3.000000 0.312500 +v 0.375000 2.250000 0.562500 +v 0.375000 2.250000 0.437500 +v 0.312500 4.000000 0.375000 +v -0.312500 3.375000 0.437500 +v 0.312500 4.000000 0.250000 +v -0.312500 3.375000 0.312500 +v -0.312500 3.250000 0.437500 +v -0.312500 3.250000 0.312500 +v 0.312500 3.875000 0.375000 +v 0.312500 3.875000 0.250000 +v 0.312500 3.375000 0.437500 +v -0.312500 4.000000 0.375000 +v 0.312500 3.375000 0.312500 +v -0.312500 4.000000 0.250000 +v -0.312500 3.875000 0.375000 +v -0.312500 3.875000 0.250000 +v 0.312500 3.250000 0.437500 +v 0.312500 3.250000 0.312500 +vt 0.410256 -0.000000 +vt 0.205128 0.355556 +vt 0.205128 -0.000000 +vt 0.410256 0.488889 +vt 0.230769 0.533333 +vt 0.205128 0.488889 +vt 0.410256 0.355556 +vt 0.820513 0.355556 +vt 0.615385 0.488889 +vt 0.615385 0.355556 +vt 0.000000 0.488889 +vt 0.000000 0.355556 +vt 0.384615 0.800000 +vt 0.230769 0.800000 +vt 0.820513 0.488889 +vt 0.641026 0.533333 +vt 0.435897 0.533333 +vt 0.025641 0.533333 +vt 0.846154 0.888889 +vt 0.820513 0.000000 +vt 0.846154 0.000000 +vt 0.871795 0.888889 +vt 0.871795 0.000000 +vt 0.923077 0.000000 +vt 0.897436 0.888889 +vt 0.897436 0.000000 +vt 0.871795 0.888889 +vt 0.846154 0.000000 +vt 0.871795 0.000000 +vt 0.897436 0.000000 +vt 0.846154 0.888889 +vt 0.820513 0.000000 +vt 0.923077 0.000000 +vt 0.897436 0.888889 +vt 0.923077 0.000000 +vt 0.897436 0.888889 +vt 0.897436 0.000000 +vt 0.846154 0.888889 +vt 0.820513 0.000000 +vt 0.846154 0.000000 +vt 0.871795 0.888889 +vt 0.871795 0.000000 +vt 0.897436 0.000000 +vt 0.871795 0.888889 +vt 0.871795 0.000000 +vt 0.923077 0.000000 +vt 0.897436 0.888889 +vt 0.846154 0.000000 +vt 0.846154 0.888889 +vt 0.820513 0.000000 +vt 0.666667 0.533333 +vt 0.589744 0.666667 +vt 0.589744 0.533333 +vt 0.660256 0.700000 +vt 0.596154 0.722222 +vt 0.596154 0.700000 +vt 0.666667 0.666667 +vt 0.589744 0.688889 +vt 0.820513 0.666667 +vt 0.743590 0.688889 +vt 0.743590 0.666667 +vt 0.666667 0.688889 +vt 0.512821 0.688889 +vt 0.512821 0.666667 +vt 0.750000 0.700000 +vt 0.820513 0.688889 +vt 0.814103 0.700000 +vt 0.519231 0.700000 +vt 0.583333 0.700000 +vt 0.673077 0.700000 +vt 0.737179 0.700000 +vt 0.820513 0.733333 +vt 0.750000 0.722222 +vt 0.814103 0.722222 +vt 0.673077 0.722222 +vt 0.519231 0.722222 +vt 0.589744 0.733333 +vt 0.583333 0.722222 +vt 0.666667 0.733333 +vt 0.660256 0.722222 +vt 0.743590 0.733333 +vt 0.737179 0.722222 +vt 0.589744 0.866667 +vt 0.743590 0.866667 +vt 0.666667 0.866667 +vt 0.512821 0.866667 +vt 0.512821 0.733333 +vt 0.589744 1.000000 +vt 0.666667 1.000000 +vt 0.512821 0.022222 +vt 0.410256 0.044444 +vt 0.410256 0.022222 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.066667 +vt 0.512821 0.044444 +vt 0.410256 0.000000 +vt 0.410256 0.022222 +vt 0.512821 0.044444 +vt 0.410256 0.044444 +vt 0.410256 0.088889 +vt 0.512821 0.066667 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.000000 +vt 0.410256 0.000000 +vt 0.487179 0.111111 +vt 0.410256 0.133333 +vt 0.410256 0.111111 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.155556 +vt 0.487179 0.133333 +vt 0.410256 0.088889 +vt 0.410256 0.111111 +vt 0.487179 0.133333 +vt 0.410256 0.133333 +vt 0.410256 0.177778 +vt 0.487179 0.155556 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.088889 +vt 0.410256 0.088889 +vt 0.474359 0.200000 +vt 0.410256 0.222222 +vt 0.410256 0.200000 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.244444 +vt 0.474359 0.222222 +vt 0.410256 0.177778 +vt 0.410256 0.200000 +vt 0.474359 0.222222 +vt 0.410256 0.222222 +vt 0.410256 0.266667 +vt 0.474359 0.244444 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.177778 +vt 0.410256 0.177778 +vt 0.512821 0.022222 +vt 0.410256 0.044444 +vt 0.410256 0.022222 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.066667 +vt 0.512821 0.044444 +vt 0.410256 0.000000 +vt 0.410256 0.022222 +vt 0.512821 0.044444 +vt 0.410256 0.044444 +vt 0.410256 0.088889 +vt 0.512821 0.066667 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.000000 +vt 0.410256 0.000000 +vt 0.487179 0.111111 +vt 0.410256 0.133333 +vt 0.410256 0.111111 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.155556 +vt 0.487179 0.133333 +vt 0.410256 0.088889 +vt 0.410256 0.111111 +vt 0.487179 0.133333 +vt 0.410256 0.133333 +vt 0.410256 0.177778 +vt 0.487179 0.155556 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.088889 +vt 0.410256 0.088889 +vt 0.474359 0.200000 +vt 0.410256 0.222222 +vt 0.410256 0.200000 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.244444 +vt 0.474359 0.222222 +vt 0.410256 0.177778 +vt 0.410256 0.200000 +vt 0.474359 0.222222 +vt 0.410256 0.222222 +vt 0.410256 0.266667 +vt 0.474359 0.244444 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.177778 +vt 0.410256 0.177778 +vt 0.512821 0.022222 +vt 0.410256 0.044444 +vt 0.410256 0.022222 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.066667 +vt 0.512821 0.044444 +vt 0.410256 0.000000 +vt 0.410256 0.022222 +vt 0.512821 0.044444 +vt 0.410256 0.044444 +vt 0.410256 0.088889 +vt 0.512821 0.066667 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.000000 +vt 0.410256 0.000000 +vt 0.487179 0.111111 +vt 0.410256 0.133333 +vt 0.410256 0.111111 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.155556 +vt 0.487179 0.133333 +vt 0.410256 0.088889 +vt 0.410256 0.111111 +vt 0.487179 0.133333 +vt 0.410256 0.133333 +vt 0.410256 0.177778 +vt 0.487179 0.155556 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.088889 +vt 0.410256 0.088889 +vt 0.474359 0.200000 +vt 0.410256 0.222222 +vt 0.410256 0.200000 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.244444 +vt 0.474359 0.222222 +vt 0.410256 0.177778 +vt 0.410256 0.200000 +vt 0.474359 0.222222 +vt 0.410256 0.222222 +vt 0.410256 0.266667 +vt 0.474359 0.244444 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.177778 +vt 0.410256 0.177778 +vt 0.512821 0.022222 +vt 0.410256 0.044444 +vt 0.410256 0.022222 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.066667 +vt 0.512821 0.044444 +vt 0.410256 0.000000 +vt 0.410256 0.022222 +vt 0.512821 0.044444 +vt 0.410256 0.044444 +vt 0.410256 0.088889 +vt 0.512821 0.066667 +vt 0.512821 0.088889 +vt 0.410256 0.066667 +vt 0.512821 0.000000 +vt 0.410256 0.000000 +vt 0.487179 0.111111 +vt 0.410256 0.133333 +vt 0.410256 0.111111 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.155556 +vt 0.487179 0.133333 +vt 0.410256 0.088889 +vt 0.410256 0.111111 +vt 0.487179 0.133333 +vt 0.410256 0.133333 +vt 0.410256 0.177778 +vt 0.487179 0.155556 +vt 0.487179 0.177778 +vt 0.410256 0.155556 +vt 0.487179 0.088889 +vt 0.410256 0.088889 +vt 0.474359 0.200000 +vt 0.410256 0.222222 +vt 0.410256 0.200000 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.244444 +vt 0.474359 0.222222 +vt 0.410256 0.177778 +vt 0.410256 0.200000 +vt 0.474359 0.222222 +vt 0.410256 0.222222 +vt 0.410256 0.266667 +vt 0.474359 0.244444 +vt 0.474359 0.266667 +vt 0.410256 0.244444 +vt 0.474359 0.177778 +vt 0.410256 0.177778 +vt 0.384615 0.533333 +vt 0.794872 0.533333 +vt 0.589744 0.533333 +vt 0.179487 0.533333 +vt 0.820513 0.888889 +vt 0.923077 0.888889 +vt 0.820513 0.888889 +vt 0.923077 0.888889 +vt 0.923077 0.888889 +vt 0.820513 0.888889 +vt 0.923077 0.888889 +vt 0.820513 0.888889 +vt 0.820513 0.866667 +vt 0.410256 0.088889 +vt 0.512821 0.000000 +vt 0.512821 0.022222 +vt 0.410256 0.177778 +vt 0.487179 0.088889 +vt 0.487179 0.111111 +vt 0.410256 0.266667 +vt 0.474359 0.177778 +vt 0.474359 0.200000 +vt 0.410256 0.088889 +vt 0.512821 0.000000 +vt 0.512821 0.022222 +vt 0.410256 0.177778 +vt 0.487179 0.088889 +vt 0.487179 0.111111 +vt 0.410256 0.266667 +vt 0.474359 0.177778 +vt 0.474359 0.200000 +vt 0.410256 0.088889 +vt 0.512821 0.000000 +vt 0.512821 0.022222 +vt 0.410256 0.177778 +vt 0.487179 0.088889 +vt 0.487179 0.111111 +vt 0.410256 0.266667 +vt 0.474359 0.177778 +vt 0.474359 0.200000 +vt 0.410256 0.088889 +vt 0.512821 0.000000 +vt 0.512821 0.022222 +vt 0.410256 0.177778 +vt 0.487179 0.088889 +vt 0.487179 0.111111 +vt 0.410256 0.266667 +vt 0.474359 0.177778 +vt 0.474359 0.200000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.0995 0.9950 +vn 0.9950 0.0995 0.0000 +vn -0.9950 -0.0995 0.0000 +vn 0.0000 0.0995 -0.9950 +vn 0.0000 0.0995 0.9950 +vn 0.0000 -0.0995 -0.9950 +vn 0.9950 -0.0995 0.0000 +vn -0.9950 0.0995 0.0000 +vn 0.9923 0.0000 -0.1240 +vn -0.9923 0.0000 0.1240 +vn 0.0000 -0.7071 -0.7071 +vn 0.9923 0.0000 0.1240 +vn -0.9923 0.0000 -0.1240 +vn 0.0000 -0.7071 0.7071 +vn 0.9864 0.0000 -0.1644 +vn -0.9864 0.0000 0.1644 +vn 0.9864 0.0000 0.1644 +vn -0.9864 0.0000 -0.1644 +vn 0.9950 0.0000 -0.0995 +vn -0.9950 0.0000 0.0995 +vn 0.9950 0.0000 0.0995 +vn -0.9950 0.0000 -0.0995 +vn -0.1240 0.0000 -0.9923 +vn 0.1240 0.0000 0.9923 +vn -0.7071 -0.7071 0.0000 +vn 0.1240 0.0000 -0.9923 +vn -0.1240 0.0000 0.9923 +vn 0.7071 -0.7071 0.0000 +vn -0.1644 0.0000 -0.9864 +vn 0.1644 0.0000 0.9864 +vn 0.1644 0.0000 -0.9864 +vn -0.1644 0.0000 0.9864 +vn -0.0995 0.0000 -0.9950 +vn 0.0995 0.0000 0.9950 +vn 0.0995 0.0000 -0.9950 +vn -0.0995 0.0000 0.9950 +s off +f 120/212/72 119/213/72 118/214/72 +f 125/215/73 127/216/73 123/217/73 +f 121/218/74 123/217/74 119/213/74 +f 118/219/75 124/220/75 120/221/75 +f 120/221/76 125/215/76 121/218/76 +f 119/213/77 122/222/77 118/223/77 +f 127/216/78 128/224/78 126/225/78 +f 122/226/79 128/227/79 124/220/79 +f 124/220/80 129/228/80 125/215/80 +f 123/217/81 126/229/81 122/222/81 +f 135/230/82 130/231/82 131/232/82 +f 137/233/83 131/232/83 133/234/83 +f 130/235/84 136/236/84 132/237/84 +f 132/237/85 137/233/85 133/234/85 +f 143/238/86 138/239/86 139/240/86 +f 141/241/83 143/238/83 139/240/83 +f 142/242/84 140/243/84 138/239/84 +f 140/244/87 145/245/87 141/241/87 +f 147/246/82 150/247/82 146/248/82 +f 153/249/88 147/250/88 149/251/88 +f 146/248/89 152/252/89 148/253/89 +f 152/252/85 149/251/85 148/253/85 +f 155/254/86 158/255/86 154/256/86 +f 157/257/88 159/258/88 155/254/88 +f 158/255/89 156/259/89 154/256/89 +f 160/260/87 157/261/87 156/259/87 +f 164/262/72 163/263/72 162/264/72 +f 169/265/74 176/266/74 168/267/74 +f 165/268/74 172/269/74 163/263/74 +f 162/270/75 170/271/75 164/272/75 +f 164/272/76 173/273/76 165/268/76 +f 163/263/77 171/274/77 162/275/77 +f 166/276/78 171/277/78 167/278/78 +f 167/279/78 172/269/78 168/280/78 +f 168/267/78 173/273/78 169/265/78 +f 169/281/78 170/271/78 166/282/78 +f 179/283/72 174/284/72 175/285/72 +f 167/278/75 174/284/75 166/276/75 +f 166/282/76 177/286/76 169/281/76 +f 168/280/77 175/287/77 167/279/77 +f 180/288/72 175/287/72 176/289/72 +f 181/290/72 176/266/72 177/291/72 +f 178/292/72 177/286/72 174/293/72 +f 181/290/74 184/294/74 180/288/74 +f 179/283/75 182/295/75 178/292/75 +f 178/292/76 185/296/76 181/290/76 +f 180/288/77 183/297/77 179/298/77 +f 183/299/78 185/296/78 182/300/78 +f 192/301/90 187/302/90 190/303/90 +f 193/304/91 189/305/91 188/306/91 +f 189/305/81 186/307/81 188/306/81 +f 191/308/92 192/301/92 190/303/92 +f 198/309/93 194/310/93 195/311/93 +f 199/312/94 196/313/94 201/314/94 +f 195/311/80 196/313/80 197/315/80 +f 201/316/95 198/309/95 199/317/95 +f 208/318/96 203/319/96 206/320/96 +f 209/321/97 205/322/97 204/323/97 +f 205/322/81 202/324/81 204/323/81 +f 207/325/92 208/318/92 206/320/92 +f 214/326/98 210/327/98 211/328/98 +f 215/329/99 212/330/99 217/331/99 +f 211/328/80 212/330/80 213/332/80 +f 217/333/95 214/326/95 215/334/95 +f 224/335/100 219/336/100 222/337/100 +f 225/338/101 221/339/101 220/340/101 +f 221/339/81 218/341/81 220/340/81 +f 223/342/92 224/335/92 222/337/92 +f 230/343/102 226/344/102 227/345/102 +f 231/346/103 228/347/103 233/348/103 +f 227/345/80 228/347/80 229/349/80 +f 233/350/95 230/343/95 231/351/95 +f 240/352/91 235/353/91 238/354/91 +f 241/355/90 237/356/90 236/357/90 +f 237/356/80 234/358/80 236/357/80 +f 239/359/95 240/352/95 238/354/95 +f 246/360/94 242/361/94 243/362/94 +f 247/363/93 244/364/93 249/365/93 +f 243/362/81 244/364/81 245/366/81 +f 249/367/92 246/360/92 247/368/92 +f 256/369/97 251/370/97 254/371/97 +f 257/372/96 253/373/96 252/374/96 +f 253/373/80 250/375/80 252/374/80 +f 255/376/95 256/369/95 254/371/95 +f 262/377/99 258/378/99 259/379/99 +f 263/380/98 260/381/98 265/382/98 +f 259/379/81 260/381/81 261/383/81 +f 265/384/92 262/377/92 263/385/92 +f 272/386/101 267/387/101 270/388/101 +f 273/389/100 269/390/100 268/391/100 +f 269/390/80 266/392/80 268/391/80 +f 271/393/95 272/386/95 270/388/95 +f 278/394/103 274/395/103 275/396/103 +f 279/397/102 276/398/102 281/399/102 +f 275/396/81 276/398/81 277/400/81 +f 281/401/92 278/394/92 279/402/92 +f 288/403/104 283/404/104 286/405/104 +f 289/406/105 285/407/105 284/408/105 +f 285/407/73 282/409/73 284/408/73 +f 287/410/106 288/403/106 286/405/106 +f 294/411/107 290/412/107 291/413/107 +f 295/414/108 292/415/108 297/416/108 +f 291/413/79 292/415/79 293/417/79 +f 297/418/109 294/411/109 295/419/109 +f 304/420/110 299/421/110 302/422/110 +f 305/423/111 301/424/111 300/425/111 +f 301/424/73 298/426/73 300/425/73 +f 303/427/106 304/420/106 302/422/106 +f 310/428/112 306/429/112 307/430/112 +f 311/431/113 308/432/113 313/433/113 +f 307/430/79 308/432/79 309/434/79 +f 313/435/109 310/428/109 311/436/109 +f 320/437/114 315/438/114 318/439/114 +f 321/440/115 317/441/115 316/442/115 +f 317/441/73 314/443/73 316/442/73 +f 319/444/106 320/437/106 318/439/106 +f 326/445/116 322/446/116 323/447/116 +f 327/448/117 324/449/117 329/450/117 +f 323/447/79 324/449/79 325/451/79 +f 329/452/109 326/445/109 327/453/109 +f 336/454/105 331/455/105 334/456/105 +f 337/457/104 333/458/104 332/459/104 +f 333/458/79 330/460/79 332/459/79 +f 335/461/109 336/454/109 334/456/109 +f 342/462/108 338/463/108 339/464/108 +f 343/465/107 340/466/107 345/467/107 +f 339/464/73 340/466/73 341/468/73 +f 345/469/106 342/462/106 343/470/106 +f 352/471/111 347/472/111 350/473/111 +f 353/474/110 349/475/110 348/476/110 +f 349/475/79 346/477/79 348/476/79 +f 351/478/109 352/471/109 350/473/109 +f 358/479/113 354/480/113 355/481/113 +f 359/482/112 356/483/112 361/484/112 +f 355/481/73 356/483/73 357/485/73 +f 361/486/106 358/479/106 359/487/106 +f 368/488/115 363/489/115 366/490/115 +f 369/491/114 365/492/114 364/493/114 +f 365/492/79 362/494/79 364/493/79 +f 367/495/109 368/488/109 366/490/109 +f 374/496/117 370/497/117 371/498/117 +f 375/499/116 372/500/116 377/501/116 +f 371/498/73 372/500/73 373/502/73 +f 377/503/106 374/496/106 375/504/106 +f 120/212/72 121/218/72 119/213/72 +f 125/215/73 129/505/73 127/216/73 +f 121/218/74 125/215/74 123/217/74 +f 118/219/75 122/226/75 124/220/75 +f 120/221/76 124/220/76 125/215/76 +f 119/213/77 123/217/77 122/222/77 +f 127/216/78 129/505/78 128/224/78 +f 122/226/79 126/506/79 128/227/79 +f 124/220/80 128/507/80 129/228/80 +f 123/217/81 127/508/81 126/229/81 +f 135/230/82 134/509/82 130/231/82 +f 137/233/83 135/230/83 131/232/83 +f 130/235/84 134/510/84 136/236/84 +f 132/237/85 136/236/85 137/233/85 +f 143/238/86 142/242/86 138/239/86 +f 141/241/83 145/245/83 143/238/83 +f 142/242/84 144/511/84 140/243/84 +f 140/244/87 144/512/87 145/245/87 +f 147/246/82 151/513/82 150/247/82 +f 153/249/88 151/514/88 147/250/88 +f 146/248/89 150/247/89 152/252/89 +f 152/252/85 153/249/85 149/251/85 +f 155/254/86 159/258/86 158/255/86 +f 157/257/88 161/515/88 159/258/88 +f 158/255/89 160/260/89 156/259/89 +f 160/260/87 161/516/87 157/261/87 +f 164/262/72 165/268/72 163/263/72 +f 169/265/74 177/291/74 176/266/74 +f 165/268/74 173/273/74 172/269/74 +f 162/270/75 171/277/75 170/271/75 +f 164/272/76 170/271/76 173/273/76 +f 163/263/77 172/269/77 171/274/77 +f 166/276/78 170/271/78 171/277/78 +f 167/279/78 171/274/78 172/269/78 +f 168/267/78 172/269/78 173/273/78 +f 169/281/78 173/273/78 170/271/78 +f 179/283/72 178/292/72 174/284/72 +f 167/278/75 175/285/75 174/284/75 +f 166/282/76 174/293/76 177/286/76 +f 168/280/77 176/289/77 175/287/77 +f 180/288/72 179/298/72 175/287/72 +f 181/290/72 180/288/72 176/266/72 +f 178/292/72 181/290/72 177/286/72 +f 181/290/74 185/296/74 184/294/74 +f 179/283/75 183/517/75 182/295/75 +f 178/292/76 182/295/76 185/296/76 +f 180/288/77 184/294/77 183/297/77 +f 183/299/78 184/294/78 185/296/78 +f 192/301/90 186/307/90 187/302/90 +f 193/304/91 191/518/91 189/305/91 +f 189/305/81 187/302/81 186/307/81 +f 191/308/92 193/519/92 192/301/92 +f 198/309/93 200/520/93 194/310/93 +f 199/312/94 197/315/94 196/313/94 +f 195/311/80 194/310/80 196/313/80 +f 201/316/95 200/520/95 198/309/95 +f 208/318/96 202/324/96 203/319/96 +f 209/321/97 207/521/97 205/322/97 +f 205/322/81 203/319/81 202/324/81 +f 207/325/92 209/522/92 208/318/92 +f 214/326/98 216/523/98 210/327/98 +f 215/329/99 213/332/99 212/330/99 +f 211/328/80 210/327/80 212/330/80 +f 217/333/95 216/523/95 214/326/95 +f 224/335/100 218/341/100 219/336/100 +f 225/338/101 223/524/101 221/339/101 +f 221/339/81 219/336/81 218/341/81 +f 223/342/92 225/525/92 224/335/92 +f 230/343/102 232/526/102 226/344/102 +f 231/346/103 229/349/103 228/347/103 +f 227/345/80 226/344/80 228/347/80 +f 233/350/95 232/526/95 230/343/95 +f 240/352/91 234/358/91 235/353/91 +f 241/355/90 239/527/90 237/356/90 +f 237/356/80 235/353/80 234/358/80 +f 239/359/95 241/528/95 240/352/95 +f 246/360/94 248/529/94 242/361/94 +f 247/363/93 245/366/93 244/364/93 +f 243/362/81 242/361/81 244/364/81 +f 249/367/92 248/529/92 246/360/92 +f 256/369/97 250/375/97 251/370/97 +f 257/372/96 255/530/96 253/373/96 +f 253/373/80 251/370/80 250/375/80 +f 255/376/95 257/531/95 256/369/95 +f 262/377/99 264/532/99 258/378/99 +f 263/380/98 261/383/98 260/381/98 +f 259/379/81 258/378/81 260/381/81 +f 265/384/92 264/532/92 262/377/92 +f 272/386/101 266/392/101 267/387/101 +f 273/389/100 271/533/100 269/390/100 +f 269/390/80 267/387/80 266/392/80 +f 271/393/95 273/534/95 272/386/95 +f 278/394/103 280/535/103 274/395/103 +f 279/397/102 277/400/102 276/398/102 +f 275/396/81 274/395/81 276/398/81 +f 281/401/92 280/535/92 278/394/92 +f 288/403/104 282/409/104 283/404/104 +f 289/406/105 287/536/105 285/407/105 +f 285/407/73 283/404/73 282/409/73 +f 287/410/106 289/537/106 288/403/106 +f 294/411/107 296/538/107 290/412/107 +f 295/414/108 293/417/108 292/415/108 +f 291/413/79 290/412/79 292/415/79 +f 297/418/109 296/538/109 294/411/109 +f 304/420/110 298/426/110 299/421/110 +f 305/423/111 303/539/111 301/424/111 +f 301/424/73 299/421/73 298/426/73 +f 303/427/106 305/540/106 304/420/106 +f 310/428/112 312/541/112 306/429/112 +f 311/431/113 309/434/113 308/432/113 +f 307/430/79 306/429/79 308/432/79 +f 313/435/109 312/541/109 310/428/109 +f 320/437/114 314/443/114 315/438/114 +f 321/440/115 319/542/115 317/441/115 +f 317/441/73 315/438/73 314/443/73 +f 319/444/106 321/543/106 320/437/106 +f 326/445/116 328/544/116 322/446/116 +f 327/448/117 325/451/117 324/449/117 +f 323/447/79 322/446/79 324/449/79 +f 329/452/109 328/544/109 326/445/109 +f 336/454/105 330/460/105 331/455/105 +f 337/457/104 335/545/104 333/458/104 +f 333/458/79 331/455/79 330/460/79 +f 335/461/109 337/546/109 336/454/109 +f 342/462/108 344/547/108 338/463/108 +f 343/465/107 341/468/107 340/466/107 +f 339/464/73 338/463/73 340/466/73 +f 345/469/106 344/547/106 342/462/106 +f 352/471/111 346/477/111 347/472/111 +f 353/474/110 351/548/110 349/475/110 +f 349/475/79 347/472/79 346/477/79 +f 351/478/109 353/549/109 352/471/109 +f 358/479/113 360/550/113 354/480/113 +f 359/482/112 357/485/112 356/483/112 +f 355/481/73 354/480/73 356/483/73 +f 361/486/106 360/550/106 358/479/106 +f 368/488/115 362/494/115 363/489/115 +f 369/491/114 367/551/114 365/492/114 +f 365/492/79 363/489/79 362/494/79 +f 367/495/109 369/552/109 368/488/109 +f 374/496/117 376/553/117 370/497/117 +f 375/499/116 373/502/116 372/500/116 +f 371/498/73 370/497/73 372/500/73 +f 377/503/106 376/553/106 374/496/106 diff --git a/src/main/resources/assets/hbm/models/network/pylon.obj b/src/main/resources/assets/hbm/models/network/pylon.obj new file mode 100644 index 000000000..b3f0eedef --- /dev/null +++ b/src/main/resources/assets/hbm/models/network/pylon.obj @@ -0,0 +1,1724 @@ +# Blender 5.2.0 LTS +# www.blender.org +o Pylon +v -0.187500 0.500000 0.500000 +v -0.187500 0.500000 0.187500 +v -0.187500 0.000000 0.500000 +v -0.187500 0.000000 0.187500 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.187500 +v -0.500000 0.000000 0.500000 +v -0.500000 0.000000 0.187500 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.187500 +v 0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.187500 +v 0.187500 0.500000 0.500000 +v 0.187500 0.500000 0.187500 +v 0.187500 0.000000 0.500000 +v 0.187500 0.000000 0.187500 +v -0.187500 0.500000 -0.187500 +v -0.187500 0.500000 -0.500000 +v -0.187500 -0.000000 -0.187500 +v -0.187500 -0.000000 -0.500000 +v -0.500000 0.500000 -0.187500 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.000000 -0.187500 +v -0.500000 -0.000000 -0.500000 +v 0.500000 0.500000 -0.187500 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.000000 -0.187500 +v 0.500000 -0.000000 -0.500000 +v 0.187500 0.500000 -0.187500 +v 0.187500 0.500000 -0.500000 +v 0.187500 -0.000000 -0.187500 +v 0.187500 -0.000000 -0.500000 +v 0.500000 0.687500 -0.187500 +v 0.375000 0.687500 -0.187500 +v 0.500000 0.312500 -0.187500 +v 0.375000 0.312500 -0.187500 +v 0.500000 0.687500 0.187500 +v 0.375000 0.687500 0.187500 +v 0.500000 0.312500 0.187500 +v 0.375000 0.312500 0.187500 +v 0.375000 0.625000 -0.125000 +v 0.375000 0.375000 -0.125000 +v 0.375000 0.625000 0.125000 +v 0.375000 0.375000 0.125000 +v 0.125000 0.625000 0.125000 +v 0.125000 0.375000 0.125000 +v 0.187500 0.687500 0.500000 +v 0.187500 0.687500 0.375000 +v 0.187500 0.312500 0.500000 +v 0.187500 0.312500 0.375000 +v -0.187500 0.687500 0.500000 +v -0.187500 0.687500 0.375000 +v -0.187500 0.312500 0.500000 +v -0.187500 0.312500 0.375000 +v 0.125000 0.625000 0.375000 +v 0.125000 0.375000 0.375000 +v -0.125000 0.625000 0.375000 +v -0.125000 0.375000 0.375000 +v -0.500000 0.687500 0.187500 +v -0.375000 0.687500 0.187500 +v -0.500000 0.312500 0.187500 +v -0.375000 0.312500 0.187500 +v -0.500000 0.687500 -0.187500 +v -0.375000 0.687500 -0.187500 +v -0.500000 0.312500 -0.187500 +v -0.375000 0.312500 -0.187500 +v -0.375000 0.625000 0.125000 +v -0.375000 0.375000 0.125000 +v -0.375000 0.625000 -0.125000 +v -0.375000 0.375000 -0.125000 +v -0.125000 0.625000 0.125000 +v -0.125000 0.375000 0.125000 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.687500 -0.375000 +v -0.187500 0.312500 -0.500000 +v -0.187500 0.312500 -0.375000 +v 0.187500 0.687500 -0.500000 +v 0.187500 0.687500 -0.375000 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.312500 -0.375000 +v -0.125000 0.625000 -0.375000 +v -0.125000 0.375000 -0.375000 +v 0.125000 0.625000 -0.375000 +v 0.125000 0.375000 -0.375000 +v -0.125000 0.625000 -0.125000 +v -0.125000 0.375000 -0.125000 +v 0.125000 0.625000 -0.125000 +v 0.125000 0.375000 -0.125000 +v 0.187500 4.000000 0.062500 +v 0.187500 4.000000 -0.062500 +v 0.187500 0.625000 0.062500 +v 0.187500 0.625000 -0.062500 +v 0.125000 4.000000 0.062500 +v 0.125000 4.000000 -0.062500 +v 0.125000 0.625000 0.062500 +v 0.125000 0.625000 -0.062500 +v 0.125000 4.000000 0.125000 +v 0.125000 4.000000 -0.125000 +v 0.125000 0.625000 0.125000 +v 0.125000 0.625000 -0.125000 +v -0.125000 4.000000 0.125000 +v -0.125000 4.000000 -0.125000 +v -0.125000 0.625000 0.125000 +v -0.125000 0.625000 -0.125000 +v 0.250000 5.000000 0.250000 +v 0.250000 5.000000 -0.250000 +v 0.250000 4.000000 0.250000 +v 0.250000 4.000000 -0.250000 +v -0.250000 5.000000 0.250000 +v -0.250000 5.000000 -0.250000 +v -0.250000 4.000000 0.250000 +v -0.250000 4.000000 -0.250000 +v 0.125000 5.187500 -0.125000 +v 0.125000 5.250000 0.125000 +v 0.125000 5.187500 0.125000 +v -0.125000 5.187500 0.125000 +v -0.125000 5.250000 -0.125000 +v -0.125000 5.187500 -0.125000 +v -0.125000 5.062500 -0.125000 +v 0.187500 5.062500 -0.187500 +v 0.125000 5.062500 -0.125000 +v 0.125000 5.000000 -0.125000 +v 0.125000 5.062500 0.125000 +v 0.125000 5.000000 0.125000 +v -0.125000 5.000000 0.125000 +v -0.125000 5.000000 -0.125000 +v -0.125000 5.062500 0.125000 +v 0.187500 5.187500 0.187500 +v 0.187500 5.062500 0.187500 +v -0.187500 5.062500 0.187500 +v -0.187500 5.062500 -0.187500 +v 0.187500 5.250000 -0.187500 +v 0.125000 5.250000 -0.125000 +v -0.187500 5.187500 -0.187500 +v 0.187500 5.187500 -0.187500 +v -0.187500 5.187500 0.187500 +v -0.125000 5.250000 0.125000 +v 0.187500 5.375000 0.187500 +v 0.187500 5.250000 0.187500 +v -0.187500 5.250000 0.187500 +v -0.187500 5.250000 -0.187500 +v -0.187500 5.375000 -0.187500 +v 0.187500 5.375000 -0.187500 +v -0.187500 5.375000 0.187500 +v 0.125000 5.375000 -0.125000 +v 0.125000 5.437500 0.125000 +v 0.125000 5.375000 0.125000 +v -0.125000 5.375000 0.125000 +v -0.125000 5.437500 -0.125000 +v -0.125000 5.375000 -0.125000 +v 0.125000 5.437500 -0.125000 +v -0.125000 5.437500 0.125000 +v -0.062500 5.437500 -0.062500 +v 0.062500 5.437500 -0.062500 +v 0.062500 5.562500 0.062500 +v 0.062500 5.437500 0.062500 +v -0.062500 5.437500 0.062500 +v -0.062500 5.562500 0.062500 +v 0.062500 5.562500 -0.062500 +v -0.062500 5.562500 -0.062500 +v 0.437500 0.875000 0.437500 +v 0.437500 0.875000 -0.437500 +v 0.437500 0.500000 0.437500 +v 0.437500 0.500000 -0.437500 +v -0.437500 0.875000 0.437500 +v -0.437500 0.875000 -0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 -0.437500 +v 0.312500 1.000000 0.312500 +v 0.312500 1.000000 -0.312500 +v -0.312500 1.000000 0.312500 +v -0.312500 1.000000 -0.312500 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +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 -0.0000 0.7071 0.7071 +vn 0.7071 0.7071 -0.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 -0.0000 +vt 0.740741 0.162500 +vt 0.648148 0.162500 +vt 0.648148 0.062500 +vt 0.740741 0.062500 +vt 0.555556 0.062500 +vt 0.555556 0.162500 +vt 0.462963 0.162500 +vt 0.462963 0.062500 +vt 0.462963 0.225000 +vt 0.370370 0.225000 +vt 0.370370 0.162500 +vt 0.370370 0.062500 +vt 0.370370 0.000000 +vt 0.462963 0.000000 +vt 0.555556 0.325000 +vt 0.518519 0.325000 +vt 0.518519 0.250000 +vt 0.555556 0.250000 +vt 0.407407 0.250000 +vt 0.407407 0.325000 +vt 0.370370 0.325000 +vt 0.370370 0.250000 +vt 0.518519 0.350000 +vt 0.407407 0.350000 +vt 0.518519 0.225000 +vt 0.407407 0.225000 +vt 0.574074 0.312500 +vt 0.648148 0.312500 +vt 0.666667 0.325000 +vt 0.574074 0.262500 +vt 0.648148 0.262500 +vt 0.666667 0.250000 +vt 0.518519 0.400000 +vt 0.444444 0.400000 +vt 0.444444 0.350000 +vt 0.592593 0.400000 +vt 0.592593 0.350000 +vt 0.666667 0.400000 +vt 0.666667 0.350000 +vt 0.370370 0.400000 +vt 0.370370 0.350000 +vt 0.740741 0.350000 +vt 0.740741 0.400000 +vt 0.351852 0.675000 +vt 0.314815 0.675000 +vt 0.314815 0.000000 +vt 0.351852 0.000000 +vt 0.296296 0.675000 +vt 0.296296 0.000000 +vt 0.370370 0.675000 +vt 0.074074 0.675000 +vt 0.000000 0.675000 +vt 0.000000 0.000000 +vt 0.074074 0.000000 +vt 0.222222 0.000000 +vt 0.222222 0.675000 +vt 0.148148 0.675000 +vt 0.148148 0.000000 +vt 0.518519 0.700000 +vt 0.370370 0.700000 +vt 0.370370 0.500000 +vt 0.518519 0.500000 +vt 0.814815 0.500000 +vt 0.814815 0.700000 +vt 0.666667 0.700000 +vt 0.666667 0.500000 +vt 0.370370 0.800000 +vt 0.518519 0.800000 +vt 0.962963 0.500000 +vt 0.962963 0.700000 +vt 0.481481 0.862500 +vt 0.407407 0.875000 +vt 0.407407 0.862500 +vt 0.481481 0.812500 +vt 0.388889 0.825000 +vt 0.407407 0.812500 +vt 0.481481 0.800000 +vt 0.407407 0.800000 +vt 0.500000 0.825000 +vt 0.388889 0.850000 +vt 0.481481 0.875000 +vt 0.388889 0.887500 +vt 0.500000 0.887500 +vt 0.388889 0.912500 +vt 0.500000 0.850000 +vt 0.481481 0.925000 +vt 0.407407 0.937500 +vt 0.407407 0.925000 +vt 0.500000 0.912500 +vt 0.481481 0.937500 +vt 0.425926 0.950000 +vt 0.462963 0.950000 +vt 0.425926 0.975000 +vt 0.425926 1.000000 +vt 0.462963 0.975000 +vt 0.462963 1.000000 +vt 1.000000 0.250000 +vt 0.740741 0.250000 +vt 0.740741 0.175000 +vt 1.000000 0.175000 +vt 0.777778 0.275000 +vt 0.962963 0.275000 +vt 0.962963 0.400000 +vt 0.777778 0.400000 +vt 1.000000 0.000000 +vt 0.740741 0.000000 +s 1 +usemtl m_2d342b16-8f2e-5231-80ae-92eafddb5779 +f 2/1/1 1/2/1 3/3/1 +f 2/1/1 3/3/1 4/4/1 +f 7/5/2 5/6/2 6/7/2 +f 7/5/2 6/7/2 8/8/2 +f 5/9/3 1/10/3 2/11/3 +f 5/9/3 2/11/3 6/7/3 +f 4/12/4 3/13/4 7/14/4 +f 4/12/4 7/14/4 8/8/4 +f 3/3/5 1/2/5 5/6/5 +f 3/3/5 5/6/5 7/5/5 +f 6/7/6 2/11/6 4/12/6 +f 6/7/6 4/12/6 8/8/6 +f 10/1/1 9/2/1 11/3/1 +f 10/1/1 11/3/1 12/4/1 +f 15/5/2 13/6/2 14/7/2 +f 15/5/2 14/7/2 16/8/2 +f 13/9/3 9/10/3 10/11/3 +f 13/9/3 10/11/3 14/7/3 +f 12/12/4 11/13/4 15/14/4 +f 12/12/4 15/14/4 16/8/4 +f 11/3/5 9/2/5 13/6/5 +f 11/3/5 13/6/5 15/5/5 +f 14/7/6 10/11/6 12/12/6 +f 14/7/6 12/12/6 16/8/6 +f 18/1/1 17/2/1 19/3/1 +f 18/1/1 19/3/1 20/4/1 +f 23/5/2 21/6/2 22/7/2 +f 23/5/2 22/7/2 24/8/2 +f 21/9/3 17/10/3 18/11/3 +f 21/9/3 18/11/3 22/7/3 +f 20/12/4 19/13/4 23/14/4 +f 20/12/4 23/14/4 24/8/4 +f 19/3/5 17/2/5 21/6/5 +f 19/3/5 21/6/5 23/5/5 +f 22/7/6 18/11/6 20/12/6 +f 22/7/6 20/12/6 24/8/6 +f 26/1/1 25/2/1 27/3/1 +f 26/1/1 27/3/1 28/4/1 +f 31/5/2 29/6/2 30/7/2 +f 31/5/2 30/7/2 32/8/2 +f 29/9/3 25/10/3 26/11/3 +f 29/9/3 26/11/3 30/7/3 +f 28/12/4 27/13/4 31/14/4 +f 28/12/4 31/14/4 32/8/4 +f 27/3/5 25/2/5 29/6/5 +f 27/3/5 29/6/5 31/5/5 +f 30/7/6 26/11/6 28/12/6 +f 30/7/6 28/12/6 32/8/6 +f 34/15/6 33/16/6 35/17/6 +f 34/15/6 35/17/6 36/18/6 +f 39/19/5 37/20/5 38/21/5 +f 39/19/5 38/21/5 40/22/5 +f 37/20/3 33/16/3 34/23/3 +f 37/20/3 34/23/3 38/24/3 +f 36/25/4 35/17/4 39/19/4 +f 36/25/4 39/19/4 40/26/4 +f 35/17/1 33/16/1 37/20/1 +f 35/17/1 37/20/1 39/19/1 +f 41/27/2 43/28/2 38/29/2 +f 41/27/2 38/29/2 34/15/2 +f 42/30/2 41/27/2 34/15/2 +f 42/30/2 34/15/2 36/18/2 +f 44/31/2 42/30/2 36/18/2 +f 44/31/2 36/18/2 40/32/2 +f 43/28/2 44/31/2 40/32/2 +f 43/28/2 40/32/2 38/29/2 +f 87/33/3 45/34/3 43/35/3 +f 87/33/3 43/35/3 41/23/3 +f 88/36/6 87/33/6 41/23/6 +f 88/36/6 41/23/6 42/37/6 +f 46/38/4 88/36/4 42/37/4 +f 46/38/4 42/37/4 44/39/4 +f 45/34/5 46/40/5 44/41/5 +f 45/34/5 44/41/5 43/35/5 +f 48/15/1 47/16/1 49/17/1 +f 48/15/1 49/17/1 50/18/1 +f 53/19/2 51/20/2 52/21/2 +f 53/19/2 52/21/2 54/22/2 +f 51/20/3 47/16/3 48/23/3 +f 51/20/3 48/23/3 52/24/3 +f 50/25/4 49/17/4 53/19/4 +f 50/25/4 53/19/4 54/26/4 +f 49/17/5 47/16/5 51/20/5 +f 49/17/5 51/20/5 53/19/5 +f 55/27/6 57/28/6 52/29/6 +f 55/27/6 52/29/6 48/15/6 +f 56/30/6 55/27/6 48/15/6 +f 56/30/6 48/15/6 50/18/6 +f 58/31/6 56/30/6 50/18/6 +f 58/31/6 50/18/6 54/32/6 +f 57/28/6 58/31/6 54/32/6 +f 57/28/6 54/32/6 52/29/6 +f 45/33/3 71/34/3 57/35/3 +f 45/33/3 57/35/3 55/23/3 +f 46/36/1 45/33/1 55/23/1 +f 46/36/1 55/23/1 56/37/1 +f 72/38/4 46/36/4 56/37/4 +f 72/38/4 56/37/4 58/39/4 +f 71/34/2 72/40/2 58/41/2 +f 71/34/2 58/41/2 57/35/2 +f 60/15/5 59/16/5 61/17/5 +f 60/15/5 61/17/5 62/18/5 +f 65/19/6 63/20/6 64/21/6 +f 65/19/6 64/21/6 66/22/6 +f 63/20/3 59/16/3 60/23/3 +f 63/20/3 60/23/3 64/24/3 +f 62/25/4 61/17/4 65/19/4 +f 62/25/4 65/19/4 66/26/4 +f 61/17/2 59/16/2 63/20/2 +f 61/17/2 63/20/2 65/19/2 +f 67/27/1 69/28/1 64/29/1 +f 67/27/1 64/29/1 60/15/1 +f 68/30/1 67/27/1 60/15/1 +f 68/30/1 60/15/1 62/18/1 +f 70/31/1 68/30/1 62/18/1 +f 70/31/1 62/18/1 66/32/1 +f 69/28/1 70/31/1 66/32/1 +f 69/28/1 66/32/1 64/29/1 +f 71/33/3 85/34/3 69/35/3 +f 71/33/3 69/35/3 67/23/3 +f 72/36/5 71/33/5 67/23/5 +f 72/36/5 67/23/5 68/37/5 +f 86/38/4 72/36/4 68/37/4 +f 86/38/4 68/37/4 70/39/4 +f 85/34/6 86/40/6 70/41/6 +f 85/34/6 70/41/6 69/35/6 +f 74/15/2 73/16/2 75/17/2 +f 74/15/2 75/17/2 76/18/2 +f 79/19/1 77/20/1 78/21/1 +f 79/19/1 78/21/1 80/22/1 +f 77/20/3 73/16/3 74/23/3 +f 77/20/3 74/23/3 78/24/3 +f 76/25/4 75/17/4 79/19/4 +f 76/25/4 79/19/4 80/26/4 +f 75/17/6 73/16/6 77/20/6 +f 75/17/6 77/20/6 79/19/6 +f 81/27/5 83/28/5 78/29/5 +f 81/27/5 78/29/5 74/15/5 +f 82/30/5 81/27/5 74/15/5 +f 82/30/5 74/15/5 76/18/5 +f 84/31/5 82/30/5 76/18/5 +f 84/31/5 76/18/5 80/32/5 +f 83/28/5 84/31/5 80/32/5 +f 83/28/5 80/32/5 78/29/5 +f 85/33/3 87/34/3 83/35/3 +f 85/33/3 83/35/3 81/23/3 +f 86/36/2 85/33/2 81/23/2 +f 86/36/2 81/23/2 82/37/2 +f 88/38/4 86/36/4 82/37/4 +f 88/38/4 82/37/4 84/39/4 +f 87/34/1 88/40/1 84/41/1 +f 87/34/1 84/41/1 83/35/1 +f 72/38/4 86/39/4 88/42/4 +f 72/38/4 88/42/4 46/43/4 +f 90/44/1 89/45/1 91/46/1 +f 90/44/1 91/46/1 92/47/1 +f 91/46/5 89/45/5 93/48/5 +f 91/46/5 93/48/5 95/49/5 +f 94/50/6 90/44/6 92/47/6 +f 94/50/6 92/47/6 96/13/6 +f 98/51/1 97/52/1 99/53/1 +f 98/51/1 99/53/1 100/54/1 +f 103/55/2 101/56/2 102/57/2 +f 103/55/2 102/57/2 104/58/2 +f 99/49/5 97/48/5 101/56/5 +f 99/49/5 101/56/5 103/55/5 +f 102/57/6 98/51/6 100/54/6 +f 102/57/6 100/54/6 104/58/6 +f 106/59/1 105/60/1 107/61/1 +f 106/59/1 107/61/1 108/62/1 +f 111/63/2 109/64/2 110/65/2 +f 111/63/2 110/65/2 112/66/2 +f 109/67/3 105/60/3 106/59/3 +f 109/67/3 106/59/3 110/68/3 +f 108/62/4 107/61/4 111/40/4 +f 108/62/4 111/40/4 112/33/4 +f 107/69/5 105/70/5 109/64/5 +f 107/69/5 109/64/5 111/63/5 +f 110/65/6 106/59/6 108/62/6 +f 110/65/6 108/62/6 112/66/6 +f 113/71/1 114/72/1 115/73/1 +f 116/71/2 117/72/2 118/73/2 +f 119/74/4 120/75/4 121/76/4 +f 122/77/1 123/76/1 124/78/1 +f 125/77/2 119/76/2 126/78/2 +f 126/77/6 121/76/6 122/78/6 +f 124/77/5 127/76/5 125/78/5 +f 120/79/1 128/80/1 129/75/1 +f 123/74/4 130/75/4 127/76/4 +f 121/74/4 129/75/4 123/76/4 +f 127/74/4 131/75/4 119/76/4 +f 117/81/4 132/82/4 133/72/4 +f 130/79/2 134/80/2 131/75/2 +f 131/79/6 135/80/6 120/75/6 +f 129/79/5 136/80/5 130/75/5 +f 118/71/6 133/72/6 113/73/6 +f 115/71/5 137/72/5 116/73/5 +f 132/83/1 138/84/1 139/82/1 +f 114/81/4 140/82/4 137/72/4 +f 133/81/4 139/82/4 114/72/4 +f 137/81/4 141/82/4 117/72/4 +f 140/83/2 142/84/2 141/82/2 +f 141/83/6 143/84/6 132/82/6 +f 139/83/5 144/84/5 140/82/5 +f 115/71/3 136/80/3 128/85/3 +f 113/71/3 128/80/3 135/85/3 +f 118/71/3 135/80/3 134/85/3 +f 116/71/3 134/80/3 136/85/3 +f 145/86/1 146/87/1 147/88/1 +f 148/86/2 149/87/2 150/88/2 +f 150/86/6 151/87/6 145/88/6 +f 147/86/5 152/87/5 148/88/5 +f 147/86/3 144/84/3 138/89/3 +f 145/86/3 138/84/3 143/89/3 +f 150/86/3 143/84/3 142/89/3 +f 148/86/3 142/84/3 144/89/3 +f 152/90/3 153/91/3 149/87/3 +f 154/92/1 155/93/1 156/91/1 +f 149/90/3 154/91/3 151/87/3 +f 146/90/3 157/91/3 152/87/3 +f 151/90/3 156/91/3 146/87/3 +f 158/94/3 159/95/3 160/96/3 +f 157/92/2 160/93/2 153/91/2 +f 153/92/6 159/93/6 154/91/6 +f 156/92/5 158/93/5 157/91/5 +f 113/71/1 133/81/1 114/72/1 +f 116/71/2 137/81/2 117/72/2 +f 119/74/4 131/79/4 120/75/4 +f 122/77/1 121/74/1 123/76/1 +f 125/77/2 127/74/2 119/76/2 +f 126/77/6 119/74/6 121/76/6 +f 124/77/5 123/74/5 127/76/5 +f 120/79/1 135/85/1 128/80/1 +f 123/74/4 129/79/4 130/75/4 +f 121/74/4 120/79/4 129/75/4 +f 127/74/4 130/79/4 131/75/4 +f 117/81/4 141/83/4 132/82/4 +f 130/79/2 136/85/2 134/80/2 +f 131/79/6 134/85/6 135/80/6 +f 129/79/5 128/85/5 136/80/5 +f 118/71/6 117/81/6 133/72/6 +f 115/71/5 114/81/5 137/72/5 +f 132/83/1 143/89/1 138/84/1 +f 114/81/4 139/83/4 140/82/4 +f 133/81/4 132/83/4 139/82/4 +f 137/81/4 140/83/4 141/82/4 +f 140/83/2 144/89/2 142/84/2 +f 141/83/6 142/89/6 143/84/6 +f 139/83/5 138/89/5 144/84/5 +f 115/71/3 116/73/3 136/80/3 +f 113/71/3 115/73/3 128/80/3 +f 118/71/3 113/73/3 135/80/3 +f 116/71/3 118/73/3 134/80/3 +f 145/86/1 151/90/1 146/87/1 +f 148/86/2 152/90/2 149/87/2 +f 150/86/6 149/90/6 151/87/6 +f 147/86/5 146/90/5 152/87/5 +f 147/86/3 148/88/3 144/84/3 +f 145/86/3 147/88/3 138/84/3 +f 150/86/3 145/88/3 143/84/3 +f 148/86/3 150/88/3 142/84/3 +f 152/90/3 157/92/3 153/91/3 +f 154/92/1 159/95/1 155/93/1 +f 149/90/3 153/92/3 154/91/3 +f 146/90/3 156/92/3 157/91/3 +f 151/90/3 154/92/3 156/91/3 +f 158/94/3 155/93/3 159/95/3 +f 157/92/2 158/95/2 160/93/2 +f 153/92/6 160/95/6 159/93/6 +f 156/92/5 155/95/5 158/93/5 +f 162/97/1 161/98/1 163/99/1 +f 162/97/1 163/99/1 164/100/1 +f 167/100/2 165/97/2 166/98/2 +f 167/100/2 166/98/2 168/99/2 +f 171/101/3 169/102/3 170/103/3 +f 171/101/3 170/103/3 172/104/3 +f 164/105/4 163/100/4 167/99/4 +f 164/105/4 167/99/4 168/106/4 +f 163/100/5 161/97/5 165/98/5 +f 163/100/5 165/98/5 167/99/5 +f 166/97/6 162/98/6 164/99/6 +f 166/97/6 164/99/6 168/100/6 +f 169/102/7 171/101/7 165/98/7 +f 169/102/7 165/98/7 161/97/7 +f 170/102/8 169/101/8 161/98/8 +f 170/102/8 161/98/8 162/97/8 +f 172/102/9 170/101/9 162/98/9 +f 172/102/9 162/98/9 166/97/9 +f 171/102/10 172/101/10 166/98/10 +f 171/102/10 166/98/10 165/97/10 +o Pylon_steel +v -0.187500 0.500000 0.500000 +v -0.187500 0.500000 0.187500 +v -0.187500 0.000000 0.500000 +v -0.187500 0.000000 0.187500 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.187500 +v -0.500000 0.000000 0.500000 +v -0.500000 0.000000 0.187500 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.187500 +v 0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.187500 +v 0.187500 0.500000 0.500000 +v 0.187500 0.500000 0.187500 +v 0.187500 0.000000 0.500000 +v 0.187500 0.000000 0.187500 +v -0.187500 0.500000 -0.187500 +v -0.187500 0.500000 -0.500000 +v -0.187500 -0.000000 -0.187500 +v -0.187500 -0.000000 -0.500000 +v -0.500000 0.500000 -0.187500 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.000000 -0.187500 +v -0.500000 -0.000000 -0.500000 +v 0.500000 0.500000 -0.187500 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.000000 -0.187500 +v 0.500000 -0.000000 -0.500000 +v 0.187500 0.500000 -0.187500 +v 0.187500 0.500000 -0.500000 +v 0.187500 -0.000000 -0.187500 +v 0.187500 -0.000000 -0.500000 +v 0.250000 4.937500 0.250000 +v 0.250000 4.937500 -0.250000 +v 0.250000 4.687500 0.250000 +v 0.250000 4.687500 -0.250000 +v -0.250000 4.937500 0.250000 +v -0.250000 4.937500 -0.250000 +v -0.250000 4.687500 0.250000 +v -0.250000 4.687500 -0.250000 +v 0.125000 5.187500 -0.125000 +v 0.125000 5.250000 0.125000 +v 0.125000 5.187500 0.125000 +v -0.125000 5.187500 0.125000 +v -0.125000 5.250000 -0.125000 +v -0.125000 5.187500 -0.125000 +v -0.125000 5.062500 -0.125000 +v 0.187500 5.062500 -0.187500 +v 0.125000 5.062500 -0.125000 +v 0.125000 5.062500 0.125000 +v -0.125000 5.062500 0.125000 +v 0.187500 5.187500 0.187500 +v 0.187500 5.062500 0.187500 +v -0.187500 5.062500 0.187500 +v -0.187500 5.062500 -0.187500 +v 0.187500 5.250000 -0.187500 +v 0.125000 5.250000 -0.125000 +v -0.187500 5.187500 -0.187500 +v 0.187500 5.187500 -0.187500 +v -0.187500 5.187500 0.187500 +v -0.125000 5.250000 0.125000 +v 0.187500 5.375000 0.187500 +v 0.187500 5.250000 0.187500 +v -0.187500 5.250000 0.187500 +v -0.187500 5.250000 -0.187500 +v -0.187500 5.375000 -0.187500 +v 0.187500 5.375000 -0.187500 +v -0.187500 5.375000 0.187500 +v 0.125000 5.375000 -0.125000 +v 0.125000 5.437500 0.125000 +v 0.125000 5.375000 0.125000 +v -0.125000 5.375000 0.125000 +v -0.125000 5.437500 -0.125000 +v -0.125000 5.375000 -0.125000 +v 0.125000 5.437500 -0.125000 +v -0.125000 5.437500 0.125000 +v -0.062500 5.437500 -0.062500 +v 0.062500 5.437500 -0.062500 +v 0.062500 5.562500 0.062500 +v 0.062500 5.437500 0.062500 +v -0.062500 5.437500 0.062500 +v -0.062500 5.562500 0.062500 +v 0.062500 5.562500 -0.062500 +v -0.062500 5.562500 -0.062500 +v -0.250000 1.000000 -0.250000 +v -0.250000 1.000000 -0.437500 +v -0.250000 0.500000 -0.250000 +v -0.250000 0.500000 -0.437500 +v -0.437500 1.000000 -0.250000 +v -0.437500 1.000000 -0.437500 +v -0.437500 0.500000 -0.250000 +v -0.437500 0.500000 -0.437500 +v 0.000000 4.687500 -0.187500 +v -0.187500 4.687500 -0.187500 +v 0.437500 1.000000 -0.250000 +v 0.437500 1.000000 -0.437500 +v 0.437500 0.500000 -0.250000 +v 0.437500 0.500000 -0.437500 +v 0.250000 1.000000 -0.250000 +v 0.250000 1.000000 -0.437500 +v 0.250000 0.500000 -0.250000 +v 0.250000 0.500000 -0.437500 +v 0.187500 4.687500 -0.000000 +v 0.187500 4.687500 -0.187500 +v -0.250000 1.000000 0.437500 +v -0.250000 1.000000 0.250000 +v -0.250000 0.500000 0.437500 +v -0.250000 0.500000 0.250000 +v -0.437500 1.000000 0.437500 +v -0.437500 1.000000 0.250000 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.250000 +v 0.000000 4.687500 0.187500 +v 0.000000 4.687500 -0.000000 +v -0.187500 4.687500 0.187500 +v -0.187500 4.687500 -0.000000 +v 0.437500 1.000000 0.437500 +v 0.437500 1.000000 0.250000 +v 0.437500 0.500000 0.437500 +v 0.437500 0.500000 0.250000 +v 0.250000 1.000000 0.437500 +v 0.250000 1.000000 0.250000 +v 0.250000 0.500000 0.437500 +v 0.250000 0.500000 0.250000 +v 0.187500 4.687500 0.187500 +v 0.125000 0.625000 0.125000 +v 0.125000 4.750000 0.125000 +v -0.125000 0.625000 0.125000 +v -0.125000 4.750000 0.125000 +v -0.125000 0.625000 -0.125000 +v 0.125000 0.625000 -0.125000 +v -0.125000 4.750000 -0.125000 +v 0.125000 4.750000 -0.125000 +v 0.500000 0.687500 -0.187500 +v 0.375000 0.687500 -0.187500 +v 0.500000 0.312500 -0.187500 +v 0.375000 0.312500 -0.187500 +v 0.500000 0.687500 0.187500 +v 0.375000 0.687500 0.187500 +v 0.500000 0.312500 0.187500 +v 0.375000 0.312500 0.187500 +v 0.375000 0.625000 -0.125000 +v 0.375000 0.375000 -0.125000 +v 0.375000 0.625000 0.125000 +v 0.375000 0.375000 0.125000 +v 0.125000 0.625000 0.125000 +v 0.125000 0.375000 0.125000 +v 0.187500 0.687500 0.500000 +v 0.187500 0.687500 0.375000 +v 0.187500 0.312500 0.500000 +v 0.187500 0.312500 0.375000 +v -0.187500 0.687500 0.500000 +v -0.187500 0.687500 0.375000 +v -0.187500 0.312500 0.500000 +v -0.187500 0.312500 0.375000 +v 0.125000 0.625000 0.375000 +v 0.125000 0.375000 0.375000 +v -0.125000 0.625000 0.375000 +v -0.125000 0.375000 0.375000 +v -0.500000 0.687500 0.187500 +v -0.375000 0.687500 0.187500 +v -0.500000 0.312500 0.187500 +v -0.375000 0.312500 0.187500 +v -0.500000 0.687500 -0.187500 +v -0.375000 0.687500 -0.187500 +v -0.500000 0.312500 -0.187500 +v -0.375000 0.312500 -0.187500 +v -0.375000 0.625000 0.125000 +v -0.375000 0.375000 0.125000 +v -0.375000 0.625000 -0.125000 +v -0.375000 0.375000 -0.125000 +v -0.125000 0.625000 0.125000 +v -0.125000 0.375000 0.125000 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.687500 -0.375000 +v -0.187500 0.312500 -0.500000 +v -0.187500 0.312500 -0.375000 +v 0.187500 0.687500 -0.500000 +v 0.187500 0.687500 -0.375000 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.312500 -0.375000 +v -0.125000 0.625000 -0.375000 +v -0.125000 0.375000 -0.375000 +v 0.125000 0.625000 -0.375000 +v 0.125000 0.375000 -0.375000 +v -0.125000 0.625000 -0.125000 +v -0.125000 0.375000 -0.125000 +v 0.125000 0.625000 -0.125000 +v 0.125000 0.375000 -0.125000 +v 0.218750 1.937500 0.250000 +v 0.281250 1.937500 0.250000 +v 0.218750 1.812500 0.250000 +v 0.281250 1.812500 0.250000 +v 0.218750 1.437500 -0.250000 +v 0.281250 1.437500 -0.250000 +v 0.218750 1.312500 -0.250000 +v 0.281250 1.312500 -0.250000 +v 0.281250 1.437500 0.250000 +v 0.343750 1.437500 0.250000 +v 0.281250 1.312500 0.250000 +v 0.343750 1.312500 0.250000 +v 0.281250 1.937500 -0.250000 +v 0.343750 1.937500 -0.250000 +v 0.281250 1.812500 -0.250000 +v 0.343750 1.812500 -0.250000 +v 0.281250 1.187500 0.250000 +v 0.343750 1.187500 0.250000 +v 0.281250 1.062500 0.250000 +v 0.343750 1.062500 0.250000 +v 0.281250 0.687500 -0.250000 +v 0.343750 0.687500 -0.250000 +v 0.281250 0.562500 -0.250000 +v 0.343750 0.562500 -0.250000 +v 0.343750 0.687500 0.250000 +v 0.406250 0.687500 0.250000 +v 0.343750 0.562500 0.250000 +v 0.406250 0.562500 0.250000 +v 0.343750 1.187500 -0.250000 +v 0.406250 1.187500 -0.250000 +v 0.343750 1.062500 -0.250000 +v 0.406250 1.062500 -0.250000 +v 0.156250 2.687500 0.250000 +v 0.218750 2.687500 0.250000 +v 0.156250 2.562500 0.250000 +v 0.218750 2.562500 0.250000 +v 0.156250 2.187500 -0.250000 +v 0.218750 2.187500 -0.250000 +v 0.156250 2.062500 -0.250000 +v 0.218750 2.062500 -0.250000 +v 0.218750 2.187500 0.250000 +v 0.281250 2.187500 0.250000 +v 0.218750 2.062500 0.250000 +v 0.281250 2.062500 0.250000 +v 0.218750 2.687500 -0.250000 +v 0.281250 2.687500 -0.250000 +v 0.218750 2.562500 -0.250000 +v 0.281250 2.562500 -0.250000 +v -0.218750 1.937500 -0.250000 +v -0.281250 1.937500 -0.250000 +v -0.218750 1.812500 -0.250000 +v -0.281250 1.812500 -0.250000 +v -0.218750 1.437500 0.250000 +v -0.281250 1.437500 0.250000 +v -0.218750 1.312500 0.250000 +v -0.281250 1.312500 0.250000 +v -0.281250 1.437500 -0.250000 +v -0.343750 1.437500 -0.250000 +v -0.281250 1.312500 -0.250000 +v -0.343750 1.312500 -0.250000 +v -0.281250 1.937500 0.250000 +v -0.343750 1.937500 0.250000 +v -0.281250 1.812500 0.250000 +v -0.343750 1.812500 0.250000 +v -0.281250 1.187500 -0.250000 +v -0.343750 1.187500 -0.250000 +v -0.281250 1.062500 -0.250000 +v -0.343750 1.062500 -0.250000 +v -0.281250 0.687500 0.250000 +v -0.343750 0.687500 0.250000 +v -0.281250 0.562500 0.250000 +v -0.343750 0.562500 0.250000 +v -0.343750 0.687500 -0.250000 +v -0.406250 0.687500 -0.250000 +v -0.343750 0.562500 -0.250000 +v -0.406250 0.562500 -0.250000 +v -0.343750 1.187500 0.250000 +v -0.406250 1.187500 0.250000 +v -0.343750 1.062500 0.250000 +v -0.406250 1.062500 0.250000 +v -0.156250 2.687500 -0.250000 +v -0.218750 2.687500 -0.250000 +v -0.156250 2.562500 -0.250000 +v -0.218750 2.562500 -0.250000 +v -0.156250 2.187500 0.250000 +v -0.218750 2.187500 0.250000 +v -0.156250 2.062500 0.250000 +v -0.218750 2.062500 0.250000 +v -0.218750 2.187500 -0.250000 +v -0.281250 2.187500 -0.250000 +v -0.218750 2.062500 -0.250000 +v -0.281250 2.062500 -0.250000 +v -0.218750 2.687500 0.250000 +v -0.281250 2.687500 0.250000 +v -0.218750 2.562500 0.250000 +v -0.281250 2.562500 0.250000 +v -0.250000 1.937500 0.218750 +v -0.250000 1.937500 0.281250 +v -0.250000 1.812500 0.218750 +v -0.250000 1.812500 0.281250 +v 0.250000 1.437500 0.218750 +v 0.250000 1.437500 0.281250 +v 0.250000 1.312500 0.218750 +v 0.250000 1.312500 0.281250 +v -0.250000 1.437500 0.281250 +v -0.250000 1.437500 0.343750 +v -0.250000 1.312500 0.281250 +v -0.250000 1.312500 0.343750 +v 0.250000 1.937500 0.281250 +v 0.250000 1.937500 0.343750 +v 0.250000 1.812500 0.281250 +v 0.250000 1.812500 0.343750 +v -0.250000 1.187500 0.281250 +v -0.250000 1.187500 0.343750 +v -0.250000 1.062500 0.281250 +v -0.250000 1.062500 0.343750 +v 0.250000 0.687500 0.281250 +v 0.250000 0.687500 0.343750 +v 0.250000 0.562500 0.281250 +v 0.250000 0.562500 0.343750 +v -0.250000 0.687500 0.343750 +v -0.250000 0.687500 0.406250 +v -0.250000 0.562500 0.343750 +v -0.250000 0.562500 0.406250 +v 0.250000 1.187500 0.343750 +v 0.250000 1.187500 0.406250 +v 0.250000 1.062500 0.343750 +v 0.250000 1.062500 0.406250 +v 0.250000 1.937500 -0.218750 +v 0.250000 1.937500 -0.281250 +v 0.250000 1.812500 -0.218750 +v 0.250000 1.812500 -0.281250 +v -0.250000 1.437500 -0.218750 +v -0.250000 1.437500 -0.281250 +v -0.250000 1.312500 -0.218750 +v -0.250000 1.312500 -0.281250 +v 0.250000 1.437500 -0.281250 +v 0.250000 1.437500 -0.343750 +v 0.250000 1.312500 -0.281250 +v 0.250000 1.312500 -0.343750 +v -0.250000 1.937500 -0.281250 +v -0.250000 1.937500 -0.343750 +v -0.250000 1.812500 -0.281250 +v -0.250000 1.812500 -0.343750 +v 0.250000 1.187500 -0.281250 +v 0.250000 1.187500 -0.343750 +v 0.250000 1.062500 -0.281250 +v 0.250000 1.062500 -0.343750 +v -0.250000 0.687500 -0.281250 +v -0.250000 0.687500 -0.343750 +v -0.250000 0.562500 -0.281250 +v -0.250000 0.562500 -0.343750 +v 0.250000 0.687500 -0.343750 +v 0.250000 0.687500 -0.406250 +v 0.250000 0.562500 -0.343750 +v 0.250000 0.562500 -0.406250 +v -0.250000 1.187500 -0.343750 +v -0.250000 1.187500 -0.406250 +v -0.250000 1.062500 -0.343750 +v -0.250000 1.062500 -0.406250 +v 0.250000 2.687500 -0.156250 +v 0.250000 2.687500 -0.218750 +v 0.250000 2.562500 -0.156250 +v 0.250000 2.562500 -0.218750 +v -0.250000 2.187500 -0.156250 +v -0.250000 2.187500 -0.218750 +v -0.250000 2.062500 -0.156250 +v -0.250000 2.062500 -0.218750 +v 0.250000 2.187500 -0.218750 +v 0.250000 2.187500 -0.281250 +v 0.250000 2.062500 -0.218750 +v 0.250000 2.062500 -0.281250 +v -0.250000 2.687500 -0.218750 +v -0.250000 2.687500 -0.281250 +v -0.250000 2.562500 -0.218750 +v -0.250000 2.562500 -0.281250 +v -0.187500 4.937500 0.187500 +v 0.187500 4.937500 0.187500 +v 0.187500 4.937500 -0.187500 +v -0.187500 4.937500 -0.187500 +v -0.125000 5.000000 0.125000 +v 0.125000 5.000000 0.125000 +v 0.125000 5.000000 -0.125000 +v -0.125000 5.000000 -0.125000 +v -0.250000 2.687500 0.156250 +v -0.250000 2.687500 0.218750 +v -0.250000 2.562500 0.156250 +v -0.250000 2.562500 0.218750 +v 0.250000 2.187500 0.156250 +v 0.250000 2.187500 0.218750 +v 0.250000 2.062500 0.156250 +v 0.250000 2.062500 0.218750 +v -0.250000 2.187500 0.218750 +v -0.250000 2.187500 0.281250 +v -0.250000 2.062500 0.218750 +v -0.250000 2.062500 0.281250 +v 0.250000 2.687500 0.218750 +v 0.250000 2.687500 0.281250 +v 0.250000 2.562500 0.218750 +v 0.250000 2.562500 0.281250 +v -0.281250 2.937500 0.125000 +v -0.156250 2.937500 0.125000 +v -0.281250 2.812500 0.125000 +v -0.156250 2.812500 0.125000 +v -0.281250 2.937500 -0.125000 +v -0.156250 2.937500 -0.125000 +v -0.281250 2.812500 -0.125000 +v -0.156250 2.812500 -0.125000 +v 0.281250 2.937500 -0.125000 +v 0.156250 2.937500 -0.125000 +v 0.281250 2.812500 -0.125000 +v 0.156250 2.812500 -0.125000 +v 0.281250 2.937500 0.125000 +v 0.156250 2.937500 0.125000 +v 0.281250 2.812500 0.125000 +v 0.156250 2.812500 0.125000 +v -0.125000 2.937500 -0.281250 +v -0.125000 2.937500 -0.156250 +v -0.125000 2.812500 -0.281250 +v -0.125000 2.812500 -0.156250 +v 0.125000 2.937500 -0.281250 +v 0.125000 2.937500 -0.156250 +v 0.125000 2.812500 -0.281250 +v 0.125000 2.812500 -0.156250 +v 0.125000 2.937500 0.281250 +v 0.125000 2.937500 0.156250 +v 0.125000 2.812500 0.281250 +v 0.125000 2.812500 0.156250 +v -0.125000 2.937500 0.281250 +v -0.125000 2.937500 0.156250 +v -0.125000 2.812500 0.281250 +v -0.125000 2.812500 0.156250 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +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 -0.0000 -0.0676 0.9977 +vn 0.9977 -0.0676 -0.0000 +vn -0.0000 0.0676 -0.9977 +vn -0.9977 0.0676 -0.0000 +vn 0.9977 0.0676 -0.0000 +vn -0.9977 -0.0676 -0.0000 +vn -0.0000 0.0676 0.9977 +vn -0.0000 -0.0676 -0.9977 +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.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vt 0.866667 0.162500 +vt 0.783333 0.162500 +vt 0.783333 0.062500 +vt 0.866667 0.062500 +vt 0.700000 0.062500 +vt 0.700000 0.162500 +vt 0.616667 0.162500 +vt 0.616667 0.062500 +vt 0.616667 0.225000 +vt 0.533333 0.225000 +vt 0.533333 0.162500 +vt 0.533333 0.062500 +vt 0.533333 0.000000 +vt 0.616667 0.000000 +vt 0.600000 0.375000 +vt 0.466667 0.375000 +vt 0.466667 0.325000 +vt 0.600000 0.325000 +vt 0.866667 0.325000 +vt 0.866667 0.375000 +vt 0.733333 0.375000 +vt 0.733333 0.325000 +vt 0.466667 0.225000 +vt 0.600000 0.225000 +vt 1.000000 0.325000 +vt 1.000000 0.375000 +vt 0.566667 0.537500 +vt 0.500000 0.550000 +vt 0.500000 0.537500 +vt 0.566667 0.487500 +vt 0.483333 0.500000 +vt 0.500000 0.487500 +vt 0.566667 0.475000 +vt 0.500000 0.475000 +vt 0.583333 0.500000 +vt 0.483333 0.525000 +vt 0.566667 0.550000 +vt 0.483333 0.562500 +vt 0.583333 0.562500 +vt 0.483333 0.587500 +vt 0.583333 0.525000 +vt 0.566667 0.600000 +vt 0.500000 0.612500 +vt 0.500000 0.600000 +vt 0.583333 0.587500 +vt 0.566667 0.612500 +vt 0.516667 0.625000 +vt 0.550000 0.625000 +vt 0.516667 0.650000 +vt 0.516667 0.675000 +vt 0.550000 0.650000 +vt 0.550000 0.675000 +vt 0.050000 0.100000 +vt 0.000000 0.100000 +vt 0.000000 0.000000 +vt 0.050000 0.000000 +vt 0.150000 0.000000 +vt 0.150000 0.100000 +vt 0.100000 0.100000 +vt 0.100000 0.000000 +vt 0.200000 0.000000 +vt 0.200000 0.100000 +vt 0.200000 0.837500 +vt 0.150000 0.837500 +vt 0.050000 0.837500 +vt 0.000000 0.837500 +vt 0.100000 0.837500 +vt 0.466667 1.000000 +vt 0.400000 1.000000 +vt 0.400000 0.175000 +vt 0.466667 0.175000 +vt 0.266667 1.000000 +vt 0.200000 1.000000 +vt 0.200000 0.175000 +vt 0.266667 0.175000 +vt 0.333333 1.000000 +vt 0.333333 0.175000 +vt 0.366667 0.100000 +vt 0.333333 0.100000 +vt 0.333333 0.025000 +vt 0.366667 0.025000 +vt 0.233333 0.025000 +vt 0.233333 0.100000 +vt 0.200000 0.025000 +vt 0.333333 0.125000 +vt 0.233333 0.125000 +vt 0.333333 0.000000 +vt 0.233333 0.000000 +vt 0.383333 0.087500 +vt 0.450000 0.087500 +vt 0.466667 0.100000 +vt 0.383333 0.037500 +vt 0.450000 0.037500 +vt 0.466667 0.025000 +vt 0.266667 0.125000 +vt 0.400000 0.125000 +vt 0.466667 0.125000 +vt 0.200000 0.125000 +vt 0.533333 0.125000 +vt 0.533333 0.175000 +vt 0.750000 0.375000 +vt 0.750000 0.525000 +vt 0.733333 0.525000 +vt 0.766667 0.525000 +vt 0.766667 0.375000 +vt 0.733333 0.600000 +vt 0.733333 0.625000 +vt 0.600000 0.525000 +vt 0.600000 0.500000 +vt 0.733333 0.400000 +vt 0.600000 0.475000 +vt 0.483333 0.387500 +vt 0.483333 0.462500 +vt 0.466667 0.475000 +vt 0.583333 0.387500 +vt 0.583333 0.462500 +vt 0.500000 0.400000 +vt 0.500000 0.450000 +vt 0.566667 0.400000 +vt 0.566667 0.450000 +vt 0.766667 0.450000 +vt 0.833333 0.450000 +vt 0.833333 0.475000 +vt 0.766667 0.475000 +vt 0.833333 0.400000 +vt 0.833333 0.425000 +vt 0.766667 0.425000 +vt 0.766667 0.400000 +vt 0.833333 0.375000 +s 1 +usemtl m_bf2d8415-1140-6651-2d4b-44fa28d981c3 +f 174/107/11 173/108/11 175/109/11 +f 174/107/11 175/109/11 176/110/11 +f 179/111/12 177/112/12 178/113/12 +f 179/111/12 178/113/12 180/114/12 +f 177/115/13 173/116/13 174/117/13 +f 177/115/13 174/117/13 178/113/13 +f 176/118/14 175/119/14 179/120/14 +f 176/118/14 179/120/14 180/114/14 +f 175/109/15 173/108/15 177/112/15 +f 175/109/15 177/112/15 179/111/15 +f 178/113/16 174/117/16 176/118/16 +f 178/113/16 176/118/16 180/114/16 +f 182/107/11 181/108/11 183/109/11 +f 182/107/11 183/109/11 184/110/11 +f 187/111/12 185/112/12 186/113/12 +f 187/111/12 186/113/12 188/114/12 +f 185/115/13 181/116/13 182/117/13 +f 185/115/13 182/117/13 186/113/13 +f 184/118/14 183/119/14 187/120/14 +f 184/118/14 187/120/14 188/114/14 +f 183/109/15 181/108/15 185/112/15 +f 183/109/15 185/112/15 187/111/15 +f 186/113/16 182/117/16 184/118/16 +f 186/113/16 184/118/16 188/114/16 +f 190/107/11 189/108/11 191/109/11 +f 190/107/11 191/109/11 192/110/11 +f 195/111/12 193/112/12 194/113/12 +f 195/111/12 194/113/12 196/114/12 +f 193/115/13 189/116/13 190/117/13 +f 193/115/13 190/117/13 194/113/13 +f 192/118/14 191/119/14 195/120/14 +f 192/118/14 195/120/14 196/114/14 +f 191/109/15 189/108/15 193/112/15 +f 191/109/15 193/112/15 195/111/15 +f 194/113/16 190/117/16 192/118/16 +f 194/113/16 192/118/16 196/114/16 +f 198/107/11 197/108/11 199/109/11 +f 198/107/11 199/109/11 200/110/11 +f 203/111/12 201/112/12 202/113/12 +f 203/111/12 202/113/12 204/114/12 +f 201/115/13 197/116/13 198/117/13 +f 201/115/13 198/117/13 202/113/13 +f 200/118/14 199/119/14 203/120/14 +f 200/118/14 203/120/14 204/114/14 +f 199/109/15 197/108/15 201/112/15 +f 199/109/15 201/112/15 203/111/15 +f 202/113/16 198/117/16 200/118/16 +f 202/113/16 200/118/16 204/114/16 +f 206/121/11 205/122/11 207/123/11 +f 206/121/11 207/123/11 208/124/11 +f 211/125/12 209/126/12 210/127/12 +f 211/125/12 210/127/12 212/128/12 +f 208/124/14 207/123/14 211/129/14 +f 208/124/14 211/129/14 212/130/14 +f 207/131/15 205/132/15 209/126/15 +f 207/131/15 209/126/15 211/125/15 +f 210/127/16 206/121/16 208/124/16 +f 210/127/16 208/124/16 212/128/16 +f 213/133/11 214/134/11 215/135/11 +f 216/133/12 217/134/12 218/135/12 +f 219/136/14 220/137/14 221/138/14 +f 544/139/11 222/138/11 543/140/11 +f 542/139/12 219/138/12 545/140/12 +f 545/139/16 221/138/16 544/140/16 +f 543/139/15 223/138/15 542/140/15 +f 220/141/11 224/142/11 225/137/11 +f 222/136/14 226/137/14 223/138/14 +f 221/136/14 225/137/14 222/138/14 +f 223/136/14 227/137/14 219/138/14 +f 217/143/14 228/144/14 229/134/14 +f 226/141/12 230/142/12 227/137/12 +f 227/141/16 231/142/16 220/137/16 +f 225/141/15 232/142/15 226/137/15 +f 218/133/16 229/134/16 213/135/16 +f 215/133/15 233/134/15 216/135/15 +f 228/145/11 234/146/11 235/144/11 +f 214/143/14 236/144/14 233/134/14 +f 229/143/14 235/144/14 214/134/14 +f 233/143/14 237/144/14 217/134/14 +f 236/145/12 238/146/12 237/144/12 +f 237/145/16 239/146/16 228/144/16 +f 235/145/15 240/146/15 236/144/15 +f 215/133/13 232/142/13 224/147/13 +f 213/133/13 224/142/13 231/147/13 +f 218/133/13 231/142/13 230/147/13 +f 216/133/13 230/142/13 232/147/13 +f 241/148/11 242/149/11 243/150/11 +f 244/148/12 245/149/12 246/150/12 +f 246/148/16 247/149/16 241/150/16 +f 243/148/15 248/149/15 244/150/15 +f 243/148/13 240/146/13 234/151/13 +f 241/148/13 234/146/13 239/151/13 +f 246/148/13 239/146/13 238/151/13 +f 244/148/13 238/146/13 240/151/13 +f 248/152/13 249/153/13 245/149/13 +f 250/154/11 251/155/11 252/153/11 +f 245/152/13 250/153/13 247/149/13 +f 242/152/13 253/153/13 248/149/13 +f 247/152/13 252/153/13 242/149/13 +f 254/156/13 255/157/13 256/158/13 +f 253/154/12 256/155/12 249/153/12 +f 249/154/16 255/155/16 250/153/16 +f 252/154/15 254/155/15 253/153/15 +f 213/133/11 229/143/11 214/134/11 +f 216/133/12 233/143/12 217/134/12 +f 219/136/14 227/141/14 220/137/14 +f 544/139/11 221/136/11 222/138/11 +f 542/139/12 223/136/12 219/138/12 +f 545/139/16 219/136/16 221/138/16 +f 543/139/15 222/136/15 223/138/15 +f 220/141/11 231/147/11 224/142/11 +f 222/136/14 225/141/14 226/137/14 +f 221/136/14 220/141/14 225/137/14 +f 223/136/14 226/141/14 227/137/14 +f 217/143/14 237/145/14 228/144/14 +f 226/141/12 232/147/12 230/142/12 +f 227/141/16 230/147/16 231/142/16 +f 225/141/15 224/147/15 232/142/15 +f 218/133/16 217/143/16 229/134/16 +f 215/133/15 214/143/15 233/134/15 +f 228/145/11 239/151/11 234/146/11 +f 214/143/14 235/145/14 236/144/14 +f 229/143/14 228/145/14 235/144/14 +f 233/143/14 236/145/14 237/144/14 +f 236/145/12 240/151/12 238/146/12 +f 237/145/16 238/151/16 239/146/16 +f 235/145/15 234/151/15 240/146/15 +f 215/133/13 216/135/13 232/142/13 +f 213/133/13 215/135/13 224/142/13 +f 218/133/13 213/135/13 231/142/13 +f 216/133/13 218/135/13 230/142/13 +f 241/148/11 247/152/11 242/149/11 +f 244/148/12 248/152/12 245/149/12 +f 246/148/16 245/152/16 247/149/16 +f 243/148/15 242/152/15 248/149/15 +f 243/148/13 244/150/13 240/146/13 +f 241/148/13 243/150/13 234/146/13 +f 246/148/13 241/150/13 239/146/13 +f 244/148/13 246/150/13 238/146/13 +f 248/152/13 253/154/13 249/153/13 +f 250/154/11 255/157/11 251/155/11 +f 245/152/13 249/154/13 250/153/13 +f 242/152/13 252/154/13 253/153/13 +f 247/152/13 250/154/13 252/153/13 +f 254/156/13 251/155/13 255/157/13 +f 253/154/12 254/157/12 256/155/12 +f 249/154/16 256/157/16 255/155/16 +f 252/154/15 251/157/15 254/155/15 +f 258/159/11 257/160/11 259/161/11 +f 258/159/11 259/161/11 260/162/11 +f 263/163/12 261/164/12 262/165/12 +f 263/163/12 262/165/12 264/166/12 +f 259/167/15 257/168/15 261/164/15 +f 259/167/15 261/164/15 263/163/15 +f 262/165/16 258/159/16 260/162/16 +f 262/165/16 260/162/16 264/166/16 +f 286/169/17 288/170/17 261/164/17 +f 286/169/17 261/164/17 257/168/17 +f 265/171/18 286/172/18 257/160/18 +f 265/171/18 257/160/18 258/159/18 +f 266/173/19 265/171/19 258/159/19 +f 266/173/19 258/159/19 262/165/19 +f 288/170/20 266/173/20 262/165/20 +f 288/170/20 262/165/20 261/164/20 +f 268/159/11 267/160/11 269/161/11 +f 268/159/11 269/161/11 270/162/11 +f 273/163/12 271/164/12 272/165/12 +f 273/163/12 272/165/12 274/166/12 +f 269/167/15 267/168/15 271/164/15 +f 269/167/15 271/164/15 273/163/15 +f 272/165/16 268/159/16 270/162/16 +f 272/165/16 270/162/16 274/166/16 +f 275/169/17 286/170/17 271/164/17 +f 275/169/17 271/164/17 267/168/17 +f 276/171/21 275/172/21 267/160/21 +f 276/171/21 267/160/21 268/159/21 +f 265/173/19 276/171/19 268/159/19 +f 265/173/19 268/159/19 272/165/19 +f 286/170/22 265/173/22 272/165/22 +f 286/170/22 272/165/22 271/164/22 +f 278/159/11 277/160/11 279/161/11 +f 278/159/11 279/161/11 280/162/11 +f 283/163/12 281/164/12 282/165/12 +f 283/163/12 282/165/12 284/166/12 +f 279/167/15 277/168/15 281/164/15 +f 279/167/15 281/164/15 283/163/15 +f 282/165/16 278/159/16 280/162/16 +f 282/165/16 280/162/16 284/166/16 +f 285/169/23 287/170/23 281/164/23 +f 285/169/23 281/164/23 277/168/23 +f 286/171/18 285/172/18 277/160/18 +f 286/171/18 277/160/18 278/159/18 +f 288/173/24 286/171/24 278/159/24 +f 288/173/24 278/159/24 282/165/24 +f 287/170/20 288/173/20 282/165/20 +f 287/170/20 282/165/20 281/164/20 +f 290/159/11 289/160/11 291/161/11 +f 290/159/11 291/161/11 292/162/11 +f 295/163/12 293/164/12 294/165/12 +f 295/163/12 294/165/12 296/166/12 +f 291/167/15 289/168/15 293/164/15 +f 291/167/15 293/164/15 295/163/15 +f 294/165/16 290/159/16 292/162/16 +f 294/165/16 292/162/16 296/166/16 +f 297/169/23 285/170/23 293/164/23 +f 297/169/23 293/164/23 289/168/23 +f 275/171/21 297/172/21 289/160/21 +f 275/171/21 289/160/21 290/159/21 +f 286/173/24 275/171/24 290/159/24 +f 286/173/24 290/159/24 294/165/24 +f 285/170/22 286/173/22 294/165/22 +f 285/170/22 294/165/22 293/164/22 +f 299/174/15 301/175/15 300/176/15 +f 299/174/15 300/176/15 298/177/15 +f 305/178/11 299/179/11 298/180/11 +f 305/178/11 298/180/11 303/181/11 +f 301/175/12 304/182/12 302/183/12 +f 301/175/12 302/183/12 300/176/12 +f 304/182/16 305/178/16 303/181/16 +f 304/182/16 303/181/16 302/183/16 +f 307/184/16 306/185/16 308/186/16 +f 307/184/16 308/186/16 309/187/16 +f 312/188/15 310/189/15 311/168/15 +f 312/188/15 311/168/15 313/190/15 +f 310/189/13 306/185/13 307/191/13 +f 310/189/13 307/191/13 311/192/13 +f 309/193/14 308/186/14 312/188/14 +f 309/193/14 312/188/14 313/194/14 +f 308/186/11 306/185/11 310/189/11 +f 308/186/11 310/189/11 312/188/11 +f 314/195/12 316/196/12 311/197/12 +f 314/195/12 311/197/12 307/184/12 +f 315/198/12 314/195/12 307/184/12 +f 315/198/12 307/184/12 309/187/12 +f 317/199/12 315/198/12 309/187/12 +f 317/199/12 309/187/12 313/200/12 +f 316/196/12 317/199/12 313/200/12 +f 316/196/12 313/200/12 311/197/12 +f 360/183/13 318/181/13 316/201/13 +f 360/183/13 316/201/13 314/191/13 +f 361/176/16 360/183/16 314/191/16 +f 361/176/16 314/191/16 315/202/16 +f 319/177/14 361/176/14 315/202/14 +f 319/177/14 315/202/14 317/203/14 +f 318/181/15 319/180/15 317/204/15 +f 318/181/15 317/204/15 316/201/15 +f 321/184/11 320/185/11 322/186/11 +f 321/184/11 322/186/11 323/187/11 +f 326/188/12 324/189/12 325/168/12 +f 326/188/12 325/168/12 327/190/12 +f 324/189/13 320/185/13 321/191/13 +f 324/189/13 321/191/13 325/192/13 +f 323/193/14 322/186/14 326/188/14 +f 323/193/14 326/188/14 327/194/14 +f 322/186/15 320/185/15 324/189/15 +f 322/186/15 324/189/15 326/188/15 +f 328/195/16 330/196/16 325/197/16 +f 328/195/16 325/197/16 321/184/16 +f 329/198/16 328/195/16 321/184/16 +f 329/198/16 321/184/16 323/187/16 +f 331/199/16 329/198/16 323/187/16 +f 331/199/16 323/187/16 327/200/16 +f 330/196/16 331/199/16 327/200/16 +f 330/196/16 327/200/16 325/197/16 +f 318/183/13 344/181/13 330/201/13 +f 318/183/13 330/201/13 328/191/13 +f 319/176/11 318/183/11 328/191/11 +f 319/176/11 328/191/11 329/202/11 +f 345/177/14 319/176/14 329/202/14 +f 345/177/14 329/202/14 331/203/14 +f 344/181/12 345/180/12 331/204/12 +f 344/181/12 331/204/12 330/201/12 +f 333/184/15 332/185/15 334/186/15 +f 333/184/15 334/186/15 335/187/15 +f 338/188/16 336/189/16 337/168/16 +f 338/188/16 337/168/16 339/190/16 +f 336/189/13 332/185/13 333/191/13 +f 336/189/13 333/191/13 337/192/13 +f 335/193/14 334/186/14 338/188/14 +f 335/193/14 338/188/14 339/194/14 +f 334/186/12 332/185/12 336/189/12 +f 334/186/12 336/189/12 338/188/12 +f 340/195/11 342/196/11 337/197/11 +f 340/195/11 337/197/11 333/184/11 +f 341/198/11 340/195/11 333/184/11 +f 341/198/11 333/184/11 335/187/11 +f 343/199/11 341/198/11 335/187/11 +f 343/199/11 335/187/11 339/200/11 +f 342/196/11 343/199/11 339/200/11 +f 342/196/11 339/200/11 337/197/11 +f 344/183/13 358/181/13 342/201/13 +f 344/183/13 342/201/13 340/191/13 +f 345/176/15 344/183/15 340/191/15 +f 345/176/15 340/191/15 341/202/15 +f 359/177/14 345/176/14 341/202/14 +f 359/177/14 341/202/14 343/203/14 +f 358/181/16 359/180/16 343/204/16 +f 358/181/16 343/204/16 342/201/16 +f 347/184/12 346/185/12 348/186/12 +f 347/184/12 348/186/12 349/187/12 +f 352/188/11 350/189/11 351/168/11 +f 352/188/11 351/168/11 353/190/11 +f 350/189/13 346/185/13 347/191/13 +f 350/189/13 347/191/13 351/192/13 +f 349/193/14 348/186/14 352/188/14 +f 349/193/14 352/188/14 353/194/14 +f 348/186/16 346/185/16 350/189/16 +f 348/186/16 350/189/16 352/188/16 +f 354/195/15 356/196/15 351/197/15 +f 354/195/15 351/197/15 347/184/15 +f 355/198/15 354/195/15 347/184/15 +f 355/198/15 347/184/15 349/187/15 +f 357/199/15 355/198/15 349/187/15 +f 357/199/15 349/187/15 353/200/15 +f 356/196/15 357/199/15 353/200/15 +f 356/196/15 353/200/15 351/197/15 +f 358/183/13 360/181/13 356/201/13 +f 358/183/13 356/201/13 354/191/13 +f 359/176/12 358/183/12 354/191/12 +f 359/176/12 354/191/12 355/202/12 +f 361/177/14 359/176/14 355/202/14 +f 361/177/14 355/202/14 357/203/14 +f 360/181/11 361/180/11 357/204/11 +f 360/181/11 357/204/11 356/201/11 +f 345/177/14 359/203/14 361/205/14 +f 345/177/14 361/205/14 319/206/14 +f 366/207/25 362/208/25 363/209/25 +f 366/207/25 363/209/25 367/127/25 +f 365/210/26 364/208/26 368/207/26 +f 365/210/26 368/207/26 369/211/26 +f 364/212/12 362/213/12 366/214/12 +f 364/212/12 366/214/12 368/215/12 +f 367/216/11 363/215/11 365/217/11 +f 367/216/11 365/217/11 369/127/11 +f 374/209/27 370/127/27 371/207/27 +f 374/209/27 371/207/27 375/208/27 +f 373/207/28 372/211/28 376/210/28 +f 373/207/28 376/210/28 377/208/28 +f 372/127/12 370/216/12 374/215/12 +f 372/127/12 374/215/12 376/217/12 +f 375/213/11 371/214/11 373/215/11 +f 375/213/11 373/215/11 377/212/11 +f 382/207/25 378/208/25 379/209/25 +f 382/207/25 379/209/25 383/127/25 +f 381/210/26 380/208/26 384/207/26 +f 381/210/26 384/207/26 385/211/26 +f 380/212/12 378/213/12 382/214/12 +f 380/212/12 382/214/12 384/215/12 +f 383/216/11 379/215/11 381/217/11 +f 383/216/11 381/217/11 385/127/11 +f 390/209/27 386/127/27 387/207/27 +f 390/209/27 387/207/27 391/208/27 +f 389/207/28 388/211/28 392/210/28 +f 389/207/28 392/210/28 393/208/28 +f 388/127/12 386/216/12 390/215/12 +f 388/127/12 390/215/12 392/217/12 +f 391/213/11 387/214/11 389/215/11 +f 391/213/11 389/215/11 393/212/11 +f 398/207/25 394/208/25 395/209/25 +f 398/207/25 395/209/25 399/127/25 +f 397/210/26 396/208/26 400/207/26 +f 397/210/26 400/207/26 401/211/26 +f 396/212/12 394/213/12 398/214/12 +f 396/212/12 398/214/12 400/215/12 +f 399/216/11 395/215/11 397/217/11 +f 399/216/11 397/217/11 401/127/11 +f 406/209/27 402/127/27 403/207/27 +f 406/209/27 403/207/27 407/208/27 +f 405/207/28 404/211/28 408/210/28 +f 405/207/28 408/210/28 409/208/28 +f 404/127/12 402/216/12 406/215/12 +f 404/127/12 406/215/12 408/217/12 +f 407/213/11 403/214/11 405/215/11 +f 407/213/11 405/215/11 409/212/11 +f 414/207/27 410/208/27 411/209/27 +f 414/207/27 411/209/27 415/127/27 +f 413/210/28 412/208/28 416/207/28 +f 413/210/28 416/207/28 417/211/28 +f 412/212/11 410/213/11 414/214/11 +f 412/212/11 414/214/11 416/215/11 +f 415/216/12 411/215/12 413/217/12 +f 415/216/12 413/217/12 417/127/12 +f 422/209/25 418/127/25 419/207/25 +f 422/209/25 419/207/25 423/208/25 +f 421/207/26 420/211/26 424/210/26 +f 421/207/26 424/210/26 425/208/26 +f 420/127/11 418/216/11 422/215/11 +f 420/127/11 422/215/11 424/217/11 +f 423/213/12 419/214/12 421/215/12 +f 423/213/12 421/215/12 425/212/12 +f 430/207/27 426/208/27 427/209/27 +f 430/207/27 427/209/27 431/127/27 +f 429/210/28 428/208/28 432/207/28 +f 429/210/28 432/207/28 433/211/28 +f 428/212/11 426/213/11 430/214/11 +f 428/212/11 430/214/11 432/215/11 +f 431/216/12 427/215/12 429/217/12 +f 431/216/12 429/217/12 433/127/12 +f 438/209/25 434/127/25 435/207/25 +f 438/209/25 435/207/25 439/208/25 +f 437/207/26 436/211/26 440/210/26 +f 437/207/26 440/210/26 441/208/26 +f 436/127/11 434/216/11 438/215/11 +f 436/127/11 438/215/11 440/217/11 +f 439/213/12 435/214/12 437/215/12 +f 439/213/12 437/215/12 441/212/12 +f 446/207/27 442/208/27 443/209/27 +f 446/207/27 443/209/27 447/127/27 +f 445/210/28 444/208/28 448/207/28 +f 445/210/28 448/207/28 449/211/28 +f 444/212/11 442/213/11 446/214/11 +f 444/212/11 446/214/11 448/215/11 +f 447/216/12 443/215/12 445/217/12 +f 447/216/12 445/217/12 449/127/12 +f 454/209/25 450/127/25 451/207/25 +f 454/209/25 451/207/25 455/208/25 +f 453/207/26 452/211/26 456/210/26 +f 453/207/26 456/210/26 457/208/26 +f 452/127/11 450/216/11 454/215/11 +f 452/127/11 454/215/11 456/217/11 +f 455/213/12 451/214/12 453/215/12 +f 455/213/12 453/215/12 457/212/12 +f 462/207/29 458/208/29 459/209/29 +f 462/207/29 459/209/29 463/127/29 +f 461/210/30 460/208/30 464/207/30 +f 461/210/30 464/207/30 465/211/30 +f 460/212/16 458/213/16 462/214/16 +f 460/212/16 462/214/16 464/215/16 +f 463/216/15 459/215/15 461/217/15 +f 463/216/15 461/217/15 465/127/15 +f 470/209/31 466/127/31 467/207/31 +f 470/209/31 467/207/31 471/208/31 +f 469/207/32 468/211/32 472/210/32 +f 469/207/32 472/210/32 473/208/32 +f 468/127/16 466/216/16 470/215/16 +f 468/127/16 470/215/16 472/217/16 +f 471/213/15 467/214/15 469/215/15 +f 471/213/15 469/215/15 473/212/15 +f 478/207/29 474/208/29 475/209/29 +f 478/207/29 475/209/29 479/127/29 +f 477/210/30 476/208/30 480/207/30 +f 477/210/30 480/207/30 481/211/30 +f 476/212/16 474/213/16 478/214/16 +f 476/212/16 478/214/16 480/215/16 +f 479/216/15 475/215/15 477/217/15 +f 479/216/15 477/217/15 481/127/15 +f 486/209/31 482/127/31 483/207/31 +f 486/209/31 483/207/31 487/208/31 +f 485/207/32 484/211/32 488/210/32 +f 485/207/32 488/210/32 489/208/32 +f 484/127/16 482/216/16 486/215/16 +f 484/127/16 486/215/16 488/217/16 +f 487/213/15 483/214/15 485/215/15 +f 487/213/15 485/215/15 489/212/15 +f 494/207/31 490/208/31 491/209/31 +f 494/207/31 491/209/31 495/127/31 +f 493/210/32 492/208/32 496/207/32 +f 493/210/32 496/207/32 497/211/32 +f 492/212/15 490/213/15 494/214/15 +f 492/212/15 494/214/15 496/215/15 +f 495/216/16 491/215/16 493/217/16 +f 495/216/16 493/217/16 497/127/16 +f 502/209/29 498/127/29 499/207/29 +f 502/209/29 499/207/29 503/208/29 +f 501/207/30 500/211/30 504/210/30 +f 501/207/30 504/210/30 505/208/30 +f 500/127/15 498/216/15 502/215/15 +f 500/127/15 502/215/15 504/217/15 +f 503/213/16 499/214/16 501/215/16 +f 503/213/16 501/215/16 505/212/16 +f 510/207/31 506/208/31 507/209/31 +f 510/207/31 507/209/31 511/127/31 +f 509/210/32 508/208/32 512/207/32 +f 509/210/32 512/207/32 513/211/32 +f 508/212/15 506/213/15 510/214/15 +f 508/212/15 510/214/15 512/215/15 +f 511/216/16 507/215/16 509/217/16 +f 511/216/16 509/217/16 513/127/16 +f 518/209/29 514/127/29 515/207/29 +f 518/209/29 515/207/29 519/208/29 +f 517/207/30 516/211/30 520/210/30 +f 517/207/30 520/210/30 521/208/30 +f 516/127/15 514/216/15 518/215/15 +f 516/127/15 518/215/15 520/217/15 +f 519/213/16 515/214/16 517/215/16 +f 519/213/16 517/215/16 521/212/16 +f 526/207/31 522/208/31 523/209/31 +f 526/207/31 523/209/31 527/127/31 +f 525/210/32 524/208/32 528/207/32 +f 525/210/32 528/207/32 529/211/32 +f 524/212/15 522/213/15 526/214/15 +f 524/212/15 526/214/15 528/215/15 +f 527/216/16 523/215/16 525/217/16 +f 527/216/16 525/217/16 529/127/16 +f 534/209/29 530/127/29 531/207/29 +f 534/209/29 531/207/29 535/208/29 +f 533/207/30 532/211/30 536/210/30 +f 533/207/30 536/210/30 537/208/30 +f 532/127/15 530/216/15 534/215/15 +f 532/127/15 534/215/15 536/217/15 +f 535/213/16 531/214/16 533/215/16 +f 535/213/16 533/215/16 537/212/16 +f 539/218/13 538/219/13 209/220/13 +f 539/218/13 209/220/13 205/122/13 +f 540/221/13 539/218/13 205/122/13 +f 540/221/13 205/122/13 206/121/13 +f 541/222/13 540/221/13 206/121/13 +f 541/222/13 206/121/13 210/217/13 +f 538/219/13 541/222/13 210/217/13 +f 538/219/13 210/217/13 209/220/13 +f 543/223/27 542/224/27 538/219/27 +f 543/223/27 538/219/27 539/218/27 +f 544/225/29 543/223/29 539/218/29 +f 544/225/29 539/218/29 540/221/29 +f 545/226/25 544/225/25 540/221/25 +f 545/226/25 540/221/25 541/222/25 +f 542/224/31 545/226/31 541/222/31 +f 542/224/31 541/222/31 538/219/31 +f 550/207/29 546/208/29 547/209/29 +f 550/207/29 547/209/29 551/127/29 +f 549/210/30 548/208/30 552/207/30 +f 549/210/30 552/207/30 553/211/30 +f 548/212/16 546/213/16 550/214/16 +f 548/212/16 550/214/16 552/215/16 +f 551/216/15 547/215/15 549/217/15 +f 551/216/15 549/217/15 553/127/15 +f 558/209/31 554/127/31 555/207/31 +f 558/209/31 555/207/31 559/208/31 +f 557/207/32 556/211/32 560/210/32 +f 557/207/32 560/210/32 561/208/32 +f 556/127/16 554/216/16 558/215/16 +f 556/127/16 558/215/16 560/217/16 +f 559/213/15 555/214/15 557/215/15 +f 559/213/15 557/215/15 561/212/15 +f 566/227/13 562/228/13 563/229/13 +f 566/227/13 563/229/13 567/230/13 +f 565/231/14 564/232/14 568/233/14 +f 565/231/14 568/233/14 569/234/14 +f 564/232/12 562/228/12 566/227/12 +f 564/232/12 566/227/12 568/233/12 +f 567/211/11 563/235/11 565/231/11 +f 567/211/11 565/231/11 569/234/11 +f 574/227/13 570/228/13 571/229/13 +f 574/227/13 571/229/13 575/230/13 +f 573/231/14 572/232/14 576/233/14 +f 573/231/14 576/233/14 577/234/14 +f 572/232/11 570/228/11 574/227/11 +f 572/232/11 574/227/11 576/233/11 +f 575/211/12 571/235/12 573/231/12 +f 575/211/12 573/231/12 577/234/12 +f 582/227/13 578/228/13 579/229/13 +f 582/227/13 579/229/13 583/230/13 +f 581/231/14 580/232/14 584/233/14 +f 581/231/14 584/233/14 585/234/14 +f 580/232/16 578/228/16 582/227/16 +f 580/232/16 582/227/16 584/233/16 +f 583/211/15 579/235/15 581/231/15 +f 583/211/15 581/231/15 585/234/15 +f 590/227/13 586/228/13 587/229/13 +f 590/227/13 587/229/13 591/230/13 +f 589/231/14 588/232/14 592/233/14 +f 589/231/14 592/233/14 593/234/14 +f 588/232/15 586/228/15 590/227/15 +f 588/232/15 590/227/15 592/233/15 +f 591/211/16 587/235/16 589/231/16 +f 591/211/16 589/231/16 593/234/16 diff --git a/src/main/resources/assets/hbm/structures/crane_mod.nbt b/src/main/resources/assets/hbm/structures/crane_mod.nbt index fe86cd9b0..bd2743c58 100644 Binary files a/src/main/resources/assets/hbm/structures/crane_mod.nbt and b/src/main/resources/assets/hbm/structures/crane_mod.nbt differ diff --git a/src/main/resources/assets/hbm/structures/tower_base.nbt b/src/main/resources/assets/hbm/structures/tower_base.nbt new file mode 100644 index 000000000..79cb1d878 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/tower_base.nbt differ diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw_lock.png b/src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw_lock.png new file mode 100644 index 000000000..cccb643a2 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/brick_forgotten_bw_lock.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/nr_planks.png b/src/main/resources/assets/hbm/textures/blocks/nr_planks.png new file mode 100644 index 000000000..eb891d6d5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/nr_planks.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/nr_stone.png b/src/main/resources/assets/hbm/textures/blocks/nr_stone.png new file mode 100644 index 000000000..609c9a766 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/nr_stone.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_2_wip.png b/src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_2_wip.png new file mode 100644 index 000000000..ef10257b0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/playground/nullstone_demo_2_wip.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vacuum.png b/src/main/resources/assets/hbm/textures/blocks/vacuum.png deleted file mode 100644 index 3636b9ca4..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/vacuum.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vent.png b/src/main/resources/assets/hbm/textures/blocks/vent.png deleted file mode 100644 index e8e689ef9..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/vent.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/vent_side.png b/src/main/resources/assets/hbm/textures/blocks/vent_side.png deleted file mode 100644 index 51f0e451f..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/vent_side.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/generators/gui_diesel.png b/src/main/resources/assets/hbm/textures/gui/generators/gui_diesel.png new file mode 100644 index 000000000..710d16891 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/generators/gui_diesel.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_dock.png b/src/main/resources/assets/hbm/textures/gui/gui_dock.png deleted file mode 100644 index 7596be55e..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_dock.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_keyforge.png b/src/main/resources/assets/hbm/textures/gui/gui_keyforge.png deleted file mode 100644 index ec1f6ccb6..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_keyforge.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_linker.png b/src/main/resources/assets/hbm/textures/gui/gui_linker.png deleted file mode 100644 index 5ccf50936..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_linker.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_soyuz.png b/src/main/resources/assets/hbm/textures/gui/gui_soyuz.png deleted file mode 100644 index 2ae2fbdfe..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_soyuz.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_soyuz_capsule.png b/src/main/resources/assets/hbm/textures/gui/gui_soyuz_capsule.png deleted file mode 100644 index d5d1c4cfc..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_soyuz_capsule.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_keyforge.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_keyforge.png new file mode 100644 index 000000000..bc3a58a63 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_keyforge.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_sat_linker.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_sat_linker.png new file mode 100644 index 000000000..a1262001b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_sat_linker.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_soyuz.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_soyuz.png new file mode 100644 index 000000000..c7f830400 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_soyuz.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_sat_dock.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_sat_dock.png new file mode 100644 index 000000000..c0609a312 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/storage/gui_sat_dock.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_soyuz_capsule.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_soyuz_capsule.png new file mode 100644 index 000000000..88de9f7c5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/storage/gui_soyuz_capsule.png differ diff --git a/src/main/resources/assets/hbm/textures/items/clay_tablet.png b/src/main/resources/assets/hbm/textures/items/clay_tablet.png index 640d51e22..d3ce9e6a9 100644 Binary files a/src/main/resources/assets/hbm/textures/items/clay_tablet.png and b/src/main/resources/assets/hbm/textures/items/clay_tablet.png differ diff --git a/src/main/resources/assets/hbm/textures/items/sat_chip.png b/src/main/resources/assets/hbm/textures/items/sat_chip.png index ff0a9aa21..79f9fbc4a 100644 Binary files a/src/main/resources/assets/hbm/textures/items/sat_chip.png and b/src/main/resources/assets/hbm/textures/items/sat_chip.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/autosaw.png b/src/main/resources/assets/hbm/textures/models/machines/autosaw.png index 61a97f9bf..3c364ceae 100644 Binary files a/src/main/resources/assets/hbm/textures/models/machines/autosaw.png and b/src/main/resources/assets/hbm/textures/models/machines/autosaw.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/lpw2.png b/src/main/resources/assets/hbm/textures/models/machines/lpw2.png index 4b0ec544c..1753c8643 100644 Binary files a/src/main/resources/assets/hbm/textures/models/machines/lpw2.png and b/src/main/resources/assets/hbm/textures/models/machines/lpw2.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/satlink.png b/src/main/resources/assets/hbm/textures/models/machines/satlink.png new file mode 100644 index 000000000..154023649 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/satlink.png differ diff --git a/src/main/resources/assets/hbm/textures/models/network/pylon.png b/src/main/resources/assets/hbm/textures/models/network/pylon.png new file mode 100644 index 000000000..541ce0da0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/network/pylon.png differ diff --git a/src/main/resources/assets/hbm/textures/models/network/pylon_steel.png b/src/main/resources/assets/hbm/textures/models/network/pylon_steel.png new file mode 100644 index 000000000..5670d952e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/network/pylon_steel.png differ diff --git a/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png b/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png index 1c7bb4de6..95498a359 100644 Binary files a/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png and b/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png differ