diff --git a/README.md b/README.md index 9f6813dc5..85bc0819a 100644 --- a/README.md +++ b/README.md @@ -40,17 +40,45 @@ Please note that these installation instructions are assuming you're running Mic ## Contributing If you want to make some changes to the mod, follow this guide: -1. Follow steps 1-4 from *Building from source* section -2. Setup forge decompilation workspace +1. Follow steps 1-2 from *Building from source* section +2. Create a directory where the repository will reside, using a name that is not "Hbm-s-Nuclear-Tech-GIT" +3. Download the forge src from [here](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.7.10.html) and extract it into the directory. +4. Download the source code: + * Using Git Bash, enter wherever your directory is located: +```bash + cd $HOME/Downloads +``` + * Download the source code: +```bash + git clone https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git + ``` + * Move or copy every file within the new folder into your directory, making sure to overwrite any files. + * Feel free to delete the remaining folder and rename your directory (such as "Hbm-s-Nuclear-Tech-GIT") +5. Enter the source directory +```bash + cd Hbm-s-Nuclear-Tech-GIT +``` +6. Setup forge decompilation workspace ```bash ./gradlew setupDecompWorkspace ``` -3. (OPTIONAL, but needed if you use eclipse) Generate eclipse files +### Necessary for Eclipse users +7. Generate eclipse files ```bash ./gradlew eclipse ``` -4. Open up the project directory in eclipse using *Open existing project from file system* -5. Code! +8. Switch to the **eclipse** folder inside your directory as a workspace. +9. If necessary, make sure that Eclipse is using the JDK8. + * On Linux, enter Windows>Preferences>Java>Installed JREs. + * Click search to navigate to /usr/lib/jvm and open it. Select the Java 8 JDK (e.g., java-8-openjdk). + * Afterwards, enter Execution Environment, select JavaSE-1.8, and select the jre listed as a **[perfect match]** + * On Windows, you may need to set your JAVA_HOME. + * Search for Environment Variables and click Edit the System Environment Variables. + * Click Environment Variables. Click new under System Variables. + * Enter **JAVA_HOME** under Variable Name and enter the path to your JDK 8 under Variable Value (e.g., C:\Program-Files\Java\jdk1.8.0_102). + * In Eclipse, now enter Windows>Preferences>Java>Installed JREs. + * Click **Add Standard VM**; in the JRE home, navigate to the directory where the JDK is installed, then click finish and select it. +10. Code! # License This software is licensed under the GNU Public License version 3. In short: This software is free, you may run the software freely, create modified versions, distribute this software and distribute modified versions, as long as the modified software too has a free software license. You win this round, Stallman. The full license can be found in the `LICENSE` file. diff --git a/src/main/java/api/hbm/block/ICrucibleAcceptor.java b/src/main/java/api/hbm/block/ICrucibleAcceptor.java new file mode 100644 index 000000000..0f140f941 --- /dev/null +++ b/src/main/java/api/hbm/block/ICrucibleAcceptor.java @@ -0,0 +1,25 @@ +package api.hbm.block; + +import com.hbm.inventory.material.Mats.MaterialStack; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ICrucibleAcceptor { + + /* + * Pouring: The metal leaves the channel/crucible and usually (but not always) falls down. The additional double coords give a more precise impact location. + * Also useful for entities like large crucibles since they are filled from the top. + */ + //public boolean canAcceptPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack); + + /* + * Flowing: The "safe" transfer of metal using a channel or other means, usually from block to block and usually horizontally (but not necessarily). + * May also be used for entities like minecarts that could be loaded from the side. + */ + //public boolean canAcceptFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack); +} diff --git a/src/main/java/api/hbm/block/IToolable.java b/src/main/java/api/hbm/block/IToolable.java index 47dfd0f82..093e924b4 100644 --- a/src/main/java/api/hbm/block/IToolable.java +++ b/src/main/java/api/hbm/block/IToolable.java @@ -10,6 +10,7 @@ public interface IToolable { public static enum ToolType { SCREWDRIVER, HAND_DRILL, - DEFUSER + DEFUSER, + WRENCH } } diff --git a/src/main/java/api/hbm/fluid/IFillableItem.java b/src/main/java/api/hbm/fluid/IFillableItem.java new file mode 100644 index 000000000..8818946ce --- /dev/null +++ b/src/main/java/api/hbm/fluid/IFillableItem.java @@ -0,0 +1,17 @@ +package api.hbm.fluid; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.item.ItemStack; + +public interface IFillableItem { + + /** Whether this stack can be filled with this type. Not particularly useful for normal operations */ + public boolean acceptsFluid(FluidType type, ItemStack stack); + /** Tries to fill the stack, returns the remainder that couldn't be added */ + public int tryFill(FluidType type, int amount, ItemStack stack); + /** Whether this stack can fill tiles with this type. Not particularly useful for normal operations */ + public boolean providesFluid(FluidType type, ItemStack stack); + /** Provides fluid with the maximum being the requested amount */ + public int tryEmpty(FluidType type, int amount, ItemStack stack); +} diff --git a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java index 2d198d1f4..e60aca9cd 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. diff --git a/src/main/java/api/hbm/fluid/IFluidStandardSender.java b/src/main/java/api/hbm/fluid/IFluidStandardSender.java index 6f6ef8238..46baee9da 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardSender.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardSender.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * Uses default implementation to make the underlying interfaces easier to use for the most common fluid users. diff --git a/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java index c9a40221f..4cbe6b0a4 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardTransceiver.java @@ -1,7 +1,7 @@ package api.hbm.fluid; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; /** * transceiver [trăn-sē′vər], noun diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java index 92c86e7c6..4abb80ed3 100644 --- a/src/main/java/api/hbm/fluid/IFluidUser.java +++ b/src/main/java/api/hbm/fluid/IFluidUser.java @@ -1,6 +1,7 @@ package api.hbm.fluid; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; @@ -90,4 +91,11 @@ public interface IFluidUser extends IFluidConnector { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryUnsubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); } + + /** + * Returns all internal tanks of this tile. Not used by the fluid network, it should only be used for display purposes or edge cases that can't be solved otherwise. + * The array is either composed of the original tank or outright the original tank array, so changes done to this array will extend to the IFluidUser. + * @return + */ + public FluidTank[] getAllTanks(); } diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 7cd8d75d5..908c9316a 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -7,12 +7,13 @@ import java.util.Random; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.handler.ThreeInts; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -22,7 +23,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -200,6 +203,7 @@ public abstract class BlockDummyable extends BlockContainer { int meta = getMetaForCore(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, (EntityPlayer) player, dir.ordinal() + offset); //lastCore = new BlockPos(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); world.setBlock(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, this, meta, 3); + IPersistentNBT.restoreData(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, itemStack); fillSpace(world, x, y, z, dir, o); } y -= getHeightOffset(); @@ -411,4 +415,62 @@ public abstract class BlockDummyable extends BlockContainer { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } + + public boolean useDetailedHitbox() { + return !bounding.isEmpty(); + } + + public List bounding = new ArrayList(); + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + if(!this.useDetailedHitbox()) { + super.addCollisionBoxesToList(world, x, y, z, entityBounding, list, entity); + return; + } + + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return; + + x = pos[0]; + y = pos[1]; + z = pos[2]; + + for(AxisAlignedBB aabb :this.bounding) { + AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x, y, z, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - this.offset).getRotation(ForgeDirection.UP)); + + if(entityBounding.intersectsWith(boxlet)) { + list.add(boxlet); + } + } + } + + public static AxisAlignedBB getAABBRotationOffset(AxisAlignedBB aabb, int x, int y, int z, ForgeDirection dir) { + + AxisAlignedBB newBox = null; + + if(dir == ForgeDirection.NORTH) newBox = AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ); + if(dir == ForgeDirection.EAST) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxZ, aabb.minY, aabb.minX, -aabb.minZ, aabb.maxY, aabb.maxX); + if(dir == ForgeDirection.SOUTH) newBox = AxisAlignedBB.getBoundingBox(-aabb.maxX, aabb.minY, -aabb.maxZ, -aabb.minX, aabb.maxY, -aabb.minZ); + if(dir == ForgeDirection.WEST) newBox = AxisAlignedBB.getBoundingBox(aabb.minZ, aabb.minY, -aabb.maxX, aabb.maxZ, aabb.maxY, -aabb.minX); + + if(newBox != null) { + newBox.offset(x + 0.5, y, z + 0.5); + return newBox; + } + + return AxisAlignedBB.getBoundingBox(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ).offset(x + 0.5, y + 0.5, z + 0.5); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if(!this.useDetailedHitbox()) { + super.setBlockBoundsBasedOnState(world, x, y, z); + } else { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions + } + } } diff --git a/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java new file mode 100644 index 000000000..ce033b3cb --- /dev/null +++ b/src/main/java/com/hbm/blocks/IPersistentInfoProvider.java @@ -0,0 +1,12 @@ +package com.hbm.blocks; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public interface IPersistentInfoProvider { + + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext); +} diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c9369b375..bb9c059d0 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -38,24 +38,18 @@ public class ModBlocks { } public static Block test_render; - public static Block test_container; public static Block test_bomb; public static Block test_bomb_advanced; public static Block test_nuke; public static final int guiID_test_nuke = 2; public static Block event_tester; - public static Block rotation_tester; public static Block obj_tester; - public static Block test_ticker; - public static Block test_missile; public static Block test_core; public static Block test_charge; - public static Block test_conductor; public static Block test_pipe; public static Block test_ct; public static Block test_rail; - public static Block test_bb_bork; - public static Block test_bb_inf; + public static Block structure_anchor; public static Block ore_uranium; public static Block ore_uranium_scorched; @@ -341,6 +335,32 @@ public class ModBlocks { public static Block brick_light; public static Block brick_compound; public static Block brick_asbestos; + public static Block brick_fire; + + public static Block concrete_slab; + public static Block concrete_double_slab; + public static Block concrete_brick_slab; + public static Block concrete_brick_double_slab; + public static Block brick_slab; + public static Block brick_double_slab; + + public static Block concrete_smooth_stairs; + public static Block concrete_stairs; + public static Block concrete_asbestos_stairs; + public static Block ducrete_smooth_stairs; + public static Block ducrete_stairs; + public static Block brick_concrete_stairs; + public static Block brick_concrete_mossy_stairs; + public static Block brick_concrete_cracked_stairs; + public static Block brick_concrete_broken_stairs; + public static Block brick_ducrete_stairs; + public static Block reinforced_stone_stairs; + public static Block reinforced_brick_stairs; + public static Block brick_obsidian_stairs; + public static Block brick_light_stairs; + public static Block brick_compound_stairs; + public static Block brick_asbestos_stairs; + public static Block brick_fire_stairs; public static Block cmb_brick; public static Block cmb_brick_reinforced; @@ -387,6 +407,8 @@ public class ModBlocks { public static Block brick_dungeon_circle; public static Block brick_forgotten; + + public static Block deco_computer; public static Block tape_recorder; public static Block steel_poles; @@ -452,6 +474,7 @@ public class ModBlocks { public static Block mush_block_stem; public static Block plant_flower; + public static Block plant_dead; public static Block waste_earth; public static Block waste_mycelium; @@ -617,20 +640,24 @@ public class ModBlocks { public static final int guiID_nuke_fstbmb = 96; public static Block bomb_multi; public static final int guiID_bomb_multi = 10; - - public static Block cel_prime; - public static final int guiID_cel_prime = 62; - public static Block cel_prime_terminal; - public static Block cel_prime_battery; - public static Block cel_prime_port; - public static Block cel_prime_tanks; public static Block heater_firebox; public static Block heater_oilburner; + public static Block heater_electric; public static Block furnace_iron; public static Block furnace_steel; public static Block machine_stirling; + public static Block machine_stirling_steel; + public static Block machine_sawmill; + public static Block machine_crucible; + public static Block machine_boiler; + + public static Block foundry_mold; + public static Block foundry_basin; + public static Block foundry_channel; + public static Block foundry_tank; + public static Block foundry_outlet; public static Block machine_difurnace_off; public static Block machine_difurnace_on; @@ -745,7 +772,6 @@ public class ModBlocks { public static Block cable_detector; public static Block cable_diode; public static Block machine_detector; - public static Block rf_cable; public static Block oil_duct_solid; public static Block oil_duct; public static Block gas_duct_solid; @@ -756,12 +782,14 @@ public class ModBlocks { public static Block fluid_duct_box; public static Block conveyor; + //public static Block conveyor_classic; public static Block conveyor_double; public static Block conveyor_triple; public static Block conveyor_chute; public static Block conveyor_lift; public static Block crane_extractor; public static Block crane_inserter; + public static Block crane_router; public static Block crane_boxer; public static Block crane_unboxer; @@ -809,12 +837,10 @@ public class ModBlocks { public static Block factory_titanium_hull; @Deprecated public static Block factory_titanium_furnace; @Deprecated public static Block factory_titanium_conductor; - @Deprecated public static Block factory_titanium_core; public static Block factory_advanced_hull; @Deprecated public static Block factory_advanced_furnace; @Deprecated public static Block factory_advanced_conductor; - @Deprecated public static Block factory_advanced_core; public static Block reactor_element; public static Block reactor_control; @@ -903,6 +929,7 @@ public class ModBlocks { public static Block machine_teleporter; public static final int guiID_machine_teleporter = 36; + public static Block teleanchor; public static Block machine_reix_mainframe; public static final int guiID_machine_reix_mainframe = 38; @@ -1075,13 +1102,7 @@ public class ModBlocks { public static Block anvil_murky; public static final int guiID_anvil = 121; - public static Block turret_light; - public static Block turret_heavy; - public static Block turret_rocket; - public static Block turret_flamer; - public static Block turret_tau; public static Block turret_spitfire; - public static Block turret_cwis; public static Block turret_cheapo; public static Block turret_chekhov; @@ -1223,22 +1244,18 @@ public class ModBlocks { public static Block sulfuric_acid_block; public static Fluid sulfuric_acid_fluid; + public static Block concrete_liquid; + public static Block volcano_core; - public static Block dummy_block_flare; - public static Block dummy_port_flare; public static Block dummy_block_drill; public static Block dummy_port_drill; public static Block dummy_block_assembler; public static Block dummy_port_assembler; - public static Block dummy_block_chemplant; - public static Block dummy_port_chemplant; public static Block dummy_block_fluidtank; public static Block dummy_port_fluidtank; public static Block dummy_block_refinery; public static Block dummy_port_refinery; - public static Block dummy_block_pumpjack; - public static Block dummy_port_pumpjack; public static Block dummy_block_turbofan; public static Block dummy_port_turbofan; public static Block dummy_block_ams_limiter; @@ -1247,8 +1264,6 @@ public class ModBlocks { public static Block dummy_port_ams_emitter; public static Block dummy_block_ams_base; public static Block dummy_port_ams_base; - public static Block dummy_block_radgen; - public static Block dummy_port_radgen; public static Block dummy_block_vault; public static Block dummy_block_blast; public static Block dummy_block_uf6; @@ -1287,23 +1302,17 @@ public class ModBlocks { private static void initializeBlock() { test_render = new TestRender(Material.rock).setBlockName("test_render").setCreativeTab(null); - test_container = new TestContainer(0).setBlockName("test_container").setCreativeTab(null); test_bomb = new TestBomb(Material.tnt).setBlockName("test_bomb").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":test_bomb"); test_bomb_advanced = new TestBombAdvanced(Material.tnt).setBlockName("test_bomb_advanced").setCreativeTab(null); test_nuke = new TestNuke(Material.iron).setBlockName("test_nuke").setCreativeTab(null).setHardness(2.5F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":test_nuke"); event_tester = new TestEventTester(Material.iron).setBlockName("event_tester").setCreativeTab(null).setHardness(2.5F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":event_tester"); - rotation_tester = new TestRotationTester(Material.iron).setBlockName("rotation_tester").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); obj_tester = new TestObjTester(Material.iron).setBlockName("obj_tester").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); - test_ticker = new TestTicker(Material.iron).setBlockName("test_ticker").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_ticker"); - test_missile = new TestMissile(Material.iron).setBlockName("test_missile").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_missile"); test_core = new TestCore(Material.iron).setBlockName("test_core").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_core"); test_charge = new TestCharge(Material.iron).setBlockName("test_charge").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F); - test_conductor = new TestConductor(Material.iron).setBlockName("test_conductor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cable_neo"); test_pipe = new TestPipe(Material.iron).setBlockName("test_pipe").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":pipe_neo"); test_ct = new TestCT(Material.iron).setBlockName("test_ct").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_ct"); test_rail = new TestRail(Material.iron).setBlockName("test_rail").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_rail"); - test_bb_bork = new TestBB(Material.iron).setBlockName("test_bb_bork").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_bork"); - test_bb_inf = new TestBB(Material.iron).setBlockName("test_bb_inf").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":test_bb_inf"); + structure_anchor = new BlockGeneric(Material.iron).setBlockName("structure_anchor").setCreativeTab(null).setHardness(2.5F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":structure_anchor"); ore_uranium = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium"); ore_uranium_scorched = new BlockOutgas(Material.rock, true, 5, true).setBlockName("ore_uranium_scorched").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_uranium_scorched"); @@ -1421,7 +1430,7 @@ public class ModBlocks { ore_oil_sand = new BlockFalling(Material.sand).setBlockName("ore_oil_sand").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeSand).setHardness(0.5F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":ore_oil_sand_alt"); ore_bedrock_oil = new BlockGeneric(Material.rock).setBlockName("ore_bedrock_oil").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1_000_000).setBlockTextureName(RefStrings.MODID + ":ore_bedrock_oil"); - ore_tikite = new BlockGeneric(Material.rock).setBlockName("ore_tikite").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tikite_alt"); + ore_tikite = new BlockDragonProof(Material.rock).setBlockName("ore_tikite").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":ore_tikite_alt"); crystal_power = new BlockCrystal(Material.glass).setBlockName("crystal_power").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":crystal_power"); crystal_energy = new BlockCrystal(Material.glass).setBlockName("crystal_energy").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(1.0F).setBlockTextureName(RefStrings.MODID + ":crystal_energy"); @@ -1588,12 +1597,38 @@ public class ModBlocks { cmb_brick = new BlockGeneric(Material.rock).setBlockName("cmb_brick").setCreativeTab(MainRegistry.blockTab).setHardness(25.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":cmb_brick"); cmb_brick_reinforced = new BlockGeneric(Material.rock).setBlockName("cmb_brick_reinforced").setCreativeTab(MainRegistry.blockTab).setHardness(25.0F).setResistance(60000.0F).setBlockTextureName(RefStrings.MODID + ":cmb_brick_reinforced"); brick_asbestos = new BlockOutgas(Material.rock, true, 5, true).setBlockName("brick_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(1000.0F).setBlockTextureName(RefStrings.MODID + ":brick_asbestos"); + brick_fire = new BlockGeneric(Material.rock).setBlockName("brick_fire").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(160.0F).setBlockTextureName(RefStrings.MODID + ":brick_fire"); - ducrete_smooth = new BlockGeneric(Material.rock).setBlockName("ducrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(8000.0F).setBlockTextureName(RefStrings.MODID + ":ducrete"); ducrete = new BlockGeneric(Material.rock).setBlockName("ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(8000.0F).setBlockTextureName(RefStrings.MODID + ":ducrete_tile"); brick_ducrete = new BlockGeneric(Material.rock).setBlockName("brick_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(12000.0F).setBlockTextureName(RefStrings.MODID + ":brick_ducrete"); reinforced_ducrete = new BlockGeneric(Material.rock).setBlockName("reinforced_ducrete").setCreativeTab(MainRegistry.blockTab).setHardness(20.0F).setResistance(24000.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_ducrete"); + + concrete_slab = new BlockMultiSlab(null, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_slab").setCreativeTab(MainRegistry.blockTab); + concrete_double_slab = new BlockMultiSlab(concrete_slab, Material.rock, concrete_smooth, concrete, concrete_asbestos, ducrete_smooth, ducrete).setBlockName("concrete_double_slab").setCreativeTab(MainRegistry.blockTab); + concrete_brick_slab = new BlockMultiSlab(null, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_slab").setCreativeTab(MainRegistry.blockTab); + concrete_brick_double_slab = new BlockMultiSlab(concrete_brick_slab, Material.rock, brick_concrete, brick_concrete_mossy, brick_concrete_cracked, brick_concrete_broken, brick_ducrete).setBlockName("concrete_brick_double_slab").setCreativeTab(MainRegistry.blockTab); + brick_slab = new BlockMultiSlab(null, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_slab").setCreativeTab(MainRegistry.blockTab); + brick_double_slab = new BlockMultiSlab(brick_slab, Material.rock, reinforced_stone, reinforced_brick, brick_obsidian, brick_light, brick_compound, brick_asbestos, brick_fire).setBlockName("brick_double_slab").setCreativeTab(MainRegistry.blockTab); + + concrete_smooth_stairs = new BlockGenericStairs(concrete_smooth, 0).setBlockName("concrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); + concrete_stairs = new BlockGenericStairs(concrete, 0).setBlockName("concrete_stairs").setCreativeTab(MainRegistry.blockTab); + concrete_asbestos_stairs = new BlockGenericStairs(concrete_asbestos, 0).setBlockName("concrete_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); + ducrete_smooth_stairs = new BlockGenericStairs(ducrete_smooth, 0).setBlockName("ducrete_smooth_stairs").setCreativeTab(MainRegistry.blockTab); + ducrete_stairs = new BlockGenericStairs(ducrete, 0).setBlockName("ducrete_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_stairs = new BlockGenericStairs(brick_concrete, 0).setBlockName("brick_concrete_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_mossy_stairs = new BlockGenericStairs(brick_concrete_mossy, 0).setBlockName("brick_concrete_mossy_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_cracked_stairs = new BlockGenericStairs(brick_concrete_cracked, 0).setBlockName("brick_concrete_cracked_stairs").setCreativeTab(MainRegistry.blockTab); + brick_concrete_broken_stairs = new BlockGenericStairs(brick_concrete_broken, 0).setBlockName("brick_concrete_broken_stairs").setCreativeTab(MainRegistry.blockTab); + brick_ducrete_stairs = new BlockGenericStairs(brick_ducrete, 0).setBlockName("brick_ducrete_stairs").setCreativeTab(MainRegistry.blockTab); + reinforced_stone_stairs = new BlockGenericStairs(reinforced_stone, 0).setBlockName("reinforced_stone_stairs").setCreativeTab(MainRegistry.blockTab); + reinforced_brick_stairs = new BlockGenericStairs(reinforced_brick, 0).setBlockName("reinforced_brick_stairs").setCreativeTab(MainRegistry.blockTab); + brick_obsidian_stairs = new BlockGenericStairs(brick_obsidian, 0).setBlockName("brick_obsidian_stairs").setCreativeTab(MainRegistry.blockTab); + brick_light_stairs = new BlockGenericStairs(brick_light, 0).setBlockName("brick_light_stairs").setCreativeTab(MainRegistry.blockTab); + brick_compound_stairs = new BlockGenericStairs(brick_compound, 0).setBlockName("brick_compound_stairs").setCreativeTab(MainRegistry.blockTab); + brick_asbestos_stairs = new BlockGenericStairs(brick_asbestos, 0).setBlockName("brick_asbestos_stairs").setCreativeTab(MainRegistry.blockTab); + brick_fire_stairs = new BlockGenericStairs(brick_fire, 0).setBlockName("brick_fire_stairs").setCreativeTab(MainRegistry.blockTab); + tile_lab = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab"); tile_lab_cracked = new BlockOutgas(Material.rock, false, 5, true).setBlockName("tile_lab_cracked").setStepSound(Block.soundTypeGlass).setCreativeTab(MainRegistry.blockTab).setHardness(1.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":tile_lab_cracked"); @@ -1636,7 +1671,9 @@ public class ModBlocks { brick_dungeon_circle = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_circle"); brick_forgotten = new BlockGeneric(Material.rock).setBlockName("brick_forgotten").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1000000).setBlockTextureName(RefStrings.MODID + ":brick_forgotten"); - + + deco_computer = new BlockDecoModel(Material.iron, 1).setBlockName("deco_computer").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_computer"); + tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder"); steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam"); pole_top = new DecoPoleTop(Material.iron).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top"); @@ -1700,6 +1737,7 @@ public class ModBlocks { mush_block_stem = new BlockMushHuge(Material.plants).setBlockName("mush_block_stem").setLightLevel(1.0F).setStepSound(Block.soundTypeGrass).setHardness(0.2F).setBlockTextureName(RefStrings.MODID + ":mush_block_stem"); plant_flower = new BlockNTMFlower().setBlockName("plant_flower").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); + plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); @@ -1757,12 +1795,6 @@ public class ModBlocks { nuke_n45 = new NukeN45(Material.iron).setBlockName("nuke_n45").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); nuke_fstbmb = new NukeBalefire(Material.iron, guiID_nuke_fstbmb).setBlockName("nuke_fstbmb").setCreativeTab(MainRegistry.nukeTab).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":nuke_fstbmb"); - cel_prime = new CelPrime(Material.iron).setBlockName("cel_prime").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_terminal = new CelPrimePart(Material.iron).setBlockName("cel_prime_terminal").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_battery = new CelPrimePart(Material.iron).setBlockName("cel_prime_battery").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_port = new CelPrimePart(Material.iron).setBlockName("cel_prime_port").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - cel_prime_tanks = new CelPrimePart(Material.iron).setBlockName("cel_prime_tanks").setCreativeTab(null).setHardness(5.0F).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":code"); - bomb_multi = new BombMulti(Material.iron).setBlockName("bomb_multi").setCreativeTab(MainRegistry.nukeTab).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":bomb_multi1"); //bomb_multi_large = new BombMultiLarge(Material.iron).setBlockName("bomb_multi_large").setCreativeTab(MainRegistry.tabNuke).setResistance(6000.0F).setBlockTextureName(RefStrings.MODID + ":bomb_multi_large"); @@ -1798,10 +1830,21 @@ public class ModBlocks { heater_firebox = new HeaterFirebox().setBlockName("heater_firebox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); heater_oilburner = new HeaterOilburner().setBlockName("heater_oilburner").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + heater_electric = new HeaterElectric().setBlockName("heater_electric").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_stirling = new MachineStirling().setBlockName("machine_stirling").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_stirling_steel = new MachineStirling().setBlockName("machine_stirling_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_sawmill = new MachineSawmill().setBlockName("machine_sawmill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_crucible = new MachineCrucible().setBlockName("machine_crucible").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + machine_boiler = new MachineHeatBoiler().setBlockName("machine_boiler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_copper"); + + foundry_mold = new FoundryMold().setBlockName("foundry_mold").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_basin = new FoundryBasin().setBlockName("foundry_basin").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_channel = new FoundryChannel().setBlockName("foundry_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_tank = new FoundryTank().setBlockName("foundry_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); + foundry_outlet = new FoundryOutlet().setBlockName("foundry_outlet").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); @@ -1884,6 +1927,7 @@ public class ModBlocks { machine_combine_factory = new MachineCMBFactory(Material.iron).setBlockName("machine_combine_factory").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_teleporter = new MachineTeleporter(Material.iron).setBlockName("machine_teleporter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + teleanchor = new MachineTeleanchor().setBlockName("teleanchor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_rtg_grey = new MachineRTG(Material.iron).setBlockName("machine_rtg_grey").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rtg"); //machine_rtg_red = new MachineRTG(Material.iron).setBlockName("machine_rtg_red").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -1902,7 +1946,6 @@ public class ModBlocks { red_wire_coated = new WireCoated(Material.iron).setBlockName("red_wire_coated").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_wire_coated"); red_cable = new BlockCable(Material.iron).setBlockName("red_cable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":cable_neo"); red_cable_classic = new BlockCable(Material.iron).setBlockName("red_cable_classic").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_cable_classic"); - rf_cable = new BlockRFCable(Material.iron).setBlockName("rf_cable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":rf_cable_icon"); red_connector = new ConnectorRedWire(Material.iron).setBlockName("red_connector").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_large = new PylonLarge(Material.iron).setBlockName("red_pylon_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon_large"); @@ -1921,12 +1964,14 @@ public class ModBlocks { fluid_duct_box = new FluidDuctBox(Material.iron).setBlockName("fluid_duct_box").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); conveyor = new BlockConveyor().setBlockName("conveyor").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); + //conveyor_classic = new BlockConveyorClassic().setBlockName("conveyor_classic").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); conveyor_double = new BlockConveyorDouble().setBlockName("conveyor_double").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor_double"); conveyor_triple = new BlockConveyorTriple().setBlockName("conveyor_triple").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor_triple"); conveyor_chute = new BlockConveyorChute().setBlockName("conveyor_chute").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); conveyor_lift = new BlockConveyorLift().setBlockName("conveyor_lift").setHardness(2.0F).setResistance(2.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":conveyor"); crane_extractor = new CraneExtractor().setBlockName("crane_extractor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_inserter = new CraneInserter().setBlockName("crane_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + crane_router = new CraneRouter().setBlockName("crane_router").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_boxer = new CraneBoxer().setBlockName("crane_boxer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); crane_unboxer = new CraneUnboxer().setBlockName("crane_unboxer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -1973,11 +2018,9 @@ public class ModBlocks { factory_titanium_hull = new BlockGeneric(Material.iron).setBlockName("factory_titanium_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_hull"); factory_titanium_furnace = new FactoryHatch(Material.iron).setBlockName("factory_titanium_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_furnace"); factory_titanium_conductor = new BlockPillar(Material.iron, RefStrings.MODID + ":factory_titanium_conductor").setBlockName("factory_titanium_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_hull"); - factory_titanium_core = new FactoryCoreTitanium(Material.iron).setBlockName("factory_titanium_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_titanium_core"); factory_advanced_hull = new BlockGeneric(Material.iron).setBlockName("factory_advanced_hull").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); factory_advanced_furnace = new FactoryHatch(Material.iron).setBlockName("factory_advanced_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_furnace"); factory_advanced_conductor = new BlockPillar(Material.iron, RefStrings.MODID + ":factory_advanced_conductor").setBlockName("factory_advanced_conductor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_hull"); - factory_advanced_core = new FactoryCoreAdvanced(Material.iron).setBlockName("factory_advanced_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":factory_advanced_core"); reactor_element = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_element_top", RefStrings.MODID + ":reactor_element_base").setBlockName("reactor_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_element_side"); reactor_control = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_control_top").setBlockName("reactor_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_control_side"); @@ -2079,13 +2122,7 @@ public class ModBlocks { sat_dock = new MachineSatDock(Material.iron).setBlockName("sat_dock").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":sat_dock"); soyuz_capsule = new SoyuzCapsule(Material.iron).setBlockName("soyuz_capsule").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":soyuz_capsule"); - turret_light = new TurretLight(Material.iron).setBlockName("turret_light").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_light"); - turret_heavy = new TurretHeavy(Material.iron).setBlockName("turret_heavy").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_heavy"); - turret_rocket = new TurretRocket(Material.iron).setBlockName("turret_rocket").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_rocket"); - turret_flamer = new TurretFlamer(Material.iron).setBlockName("turret_flamer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_flamer"); - turret_tau = new TurretTau(Material.iron).setBlockName("turret_tau").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_tau"); turret_spitfire = new TurretSpitfire(Material.iron).setBlockName("turret_spitfire").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":code"); - turret_cwis = new TurretCIWS(Material.iron).setBlockName("turret_cwis").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":turret_cwis"); turret_cheapo = new TurretCheapo(Material.iron).setBlockName("turret_cheapo").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":turret_cheapo"); turret_chekhov = new TurretChekhov(Material.iron).setBlockName("turret_chekhov").setHardness(5.0F).setResistance(600.0F).setCreativeTab(MainRegistry.weaponTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -2303,21 +2340,18 @@ public class ModBlocks { sulfuric_acid_fluid = new GenericFluid("sulfuric_acid_fluid").setDensity(1840).setViscosity(1000).setTemperature(273); FluidRegistry.registerFluid(sulfuric_acid_fluid); sulfuric_acid_block = new GenericFluidBlock(sulfuric_acid_fluid, Material.water, "sulfuric_acid_still", "sulfuric_acid_flowing").setDamage(ModDamageSource.acid, 5F).setBlockName("sulfuric_acid_block").setResistance(500F); + + Fluid liquidConcrete = new GenericFluid("concrete_liquid").setViscosity(2000); + concrete_liquid = new GenericFiniteFluid(liquidConcrete, Material.rock, "concrete_liquid", "concrete_liquid_flowing").setQuantaPerBlock(4).setBlockName("concrete_liquid").setResistance(500F); - dummy_block_flare = new DummyBlockFlare(Material.iron, false).setBlockName("dummy_block_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); - dummy_port_flare = new DummyBlockFlare(Material.iron, true).setBlockName("dummy_port_flare").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_aluminium"); dummy_block_drill = new DummyBlockDrill(Material.iron, false).setBlockName("dummy_block_drill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_lead"); dummy_port_drill = new DummyBlockDrill(Material.iron, true).setBlockName("dummy_port_drill").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_lead"); dummy_block_assembler = new DummyBlockAssembler(Material.iron, false).setBlockName("dummy_block_assembler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_assembler = new DummyBlockAssembler(Material.iron, true).setBlockName("dummy_port_assembler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_block_chemplant = new BlockGeneric(Material.iron).setBlockName("dummy_block_chemplant").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_port_chemplant = new BlockGeneric(Material.iron).setBlockName("dummy_port_chemplant").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_fluidtank = new DummyBlockFluidTank(Material.iron, false).setBlockName("dummy_block_fluidtank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_fluidtank = new DummyBlockFluidTank(Material.iron, true).setBlockName("dummy_port_fluidtank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_refinery = new DummyBlockRefinery(Material.iron, false).setBlockName("dummy_block_refinery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); dummy_port_refinery = new DummyBlockRefinery(Material.iron, true).setBlockName("dummy_port_refinery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); - dummy_block_pumpjack = new BlockGeneric(Material.iron).setBlockName("dummy_block_pumpjack").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); - dummy_port_pumpjack = new BlockGeneric(Material.iron).setBlockName("dummy_port_pumpjack").setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); dummy_block_turbofan = new DummyBlockTurbofan(Material.iron, false).setBlockName("dummy_block_turbofan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_port_turbofan = new DummyBlockTurbofan(Material.iron, true).setBlockName("dummy_port_turbofan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_ams_limiter = new DummyBlockAMSLimiter(Material.iron).setBlockName("dummy_block_ams_limiter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); @@ -2326,8 +2360,6 @@ public class ModBlocks { dummy_port_ams_emitter = new DummyBlockAMSEmitter(Material.iron).setBlockName("dummy_port_ams_emitter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); dummy_block_ams_base = new DummyBlockAMSBase(Material.iron).setBlockName("dummy_block_ams_base").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); dummy_port_ams_base = new DummyBlockAMSBase(Material.iron).setBlockName("dummy_port_ams_base").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_copper"); - dummy_block_radgen = new DummyBlockRadGen(Material.iron).setBlockName("dummy_block_radgen").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); - dummy_port_radgen = new DummyBlockRadGen(Material.iron).setBlockName("dummy_port_radgen").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_vault = new DummyBlockVault(Material.iron).setBlockName("dummy_block_vault").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_blast = new DummyBlockBlast(Material.iron).setBlockName("dummy_block_blast").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); dummy_block_uf6 = new DummyBlockMachine(Material.iron, guiID_uf6_tank, machine_uf6_tank, false).setBlockName("dummy_block_uf6").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_titanium"); @@ -2344,7 +2376,7 @@ public class ModBlocks { pink_planks = new BlockGeneric(Material.wood).setBlockName("pink_planks").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_slab = new BlockPinkSlab(false, Material.wood).setBlockName("pink_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_double_slab = new BlockPinkSlab(true, Material.wood).setBlockName("pink_double_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); - pink_stairs = new BlockPinkStairs(pink_planks, 0).setBlockName("pink_stairs").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); + pink_stairs = new BlockGenericStairs(pink_planks, 0).setBlockName("pink_stairs").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); ff = new BlockFF(Material.iron).setBlockName("ff").setHardness(0.5F).setStepSound(Block.soundTypeGravel).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":code"); } @@ -2359,18 +2391,13 @@ public class ModBlocks { GameRegistry.registerBlock(test_nuke, test_nuke.getUnlocalizedName()); GameRegistry.registerBlock(event_tester, event_tester.getUnlocalizedName()); - GameRegistry.registerBlock(rotation_tester, rotation_tester.getUnlocalizedName()); GameRegistry.registerBlock(obj_tester, obj_tester.getUnlocalizedName()); - GameRegistry.registerBlock(test_ticker, test_ticker.getUnlocalizedName()); - GameRegistry.registerBlock(test_missile, test_missile.getUnlocalizedName()); GameRegistry.registerBlock(test_core, test_core.getUnlocalizedName()); GameRegistry.registerBlock(test_charge, test_charge.getUnlocalizedName()); - GameRegistry.registerBlock(test_conductor, test_conductor.getUnlocalizedName()); GameRegistry.registerBlock(test_pipe, test_pipe.getUnlocalizedName()); GameRegistry.registerBlock(test_ct, test_ct.getUnlocalizedName()); GameRegistry.registerBlock(test_rail, test_rail.getUnlocalizedName()); - GameRegistry.registerBlock(test_bb_bork, test_bb_bork.getUnlocalizedName()); - GameRegistry.registerBlock(test_bb_inf, test_bb_inf.getUnlocalizedName()); + GameRegistry.registerBlock(structure_anchor, structure_anchor.getUnlocalizedName()); //Ores GameRegistry.registerBlock(ore_uranium, ore_uranium.getUnlocalizedName()); @@ -2675,6 +2702,32 @@ public class ModBlocks { GameRegistry.registerBlock(brick_compound, ItemBlockBlastInfo.class, brick_compound.getUnlocalizedName()); GameRegistry.registerBlock(brick_light, ItemBlockBlastInfo.class, brick_light.getUnlocalizedName()); GameRegistry.registerBlock(brick_asbestos, brick_asbestos.getUnlocalizedName()); + GameRegistry.registerBlock(brick_fire, ItemBlockBlastInfo.class, brick_fire.getUnlocalizedName()); + + GameRegistry.registerBlock(concrete_slab, ItemModSlab.class, concrete_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_double_slab, ItemModSlab.class, concrete_double_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_brick_slab, ItemModSlab.class, concrete_brick_slab.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_brick_double_slab, ItemModSlab.class, concrete_brick_double_slab.getUnlocalizedName()); + GameRegistry.registerBlock(brick_slab, ItemModSlab.class, brick_slab.getUnlocalizedName()); + GameRegistry.registerBlock(brick_double_slab, ItemModSlab.class, brick_double_slab.getUnlocalizedName()); + + GameRegistry.registerBlock(concrete_smooth_stairs, concrete_smooth_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_stairs, concrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_asbestos_stairs, concrete_asbestos_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(ducrete_smooth_stairs, ducrete_smooth_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_stairs, brick_concrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_mossy_stairs, brick_concrete_mossy_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_cracked_stairs, brick_concrete_cracked_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_concrete_broken_stairs, brick_concrete_broken_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_ducrete_stairs, brick_ducrete_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(reinforced_stone_stairs, reinforced_stone_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(reinforced_brick_stairs, reinforced_brick_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_obsidian_stairs, brick_obsidian_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_light_stairs, brick_light_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_compound_stairs, brick_compound_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_asbestos_stairs, brick_asbestos_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(brick_fire_stairs, brick_fire_stairs.getUnlocalizedName()); + GameRegistry.registerBlock(ducrete_stairs, ducrete_stairs.getUnlocalizedName()); //CMB Building Elements GameRegistry.registerBlock(cmb_brick, ItemBlockBlastInfo.class, cmb_brick.getUnlocalizedName()); @@ -2733,6 +2786,7 @@ public class ModBlocks { GameRegistry.registerBlock(brick_dungeon_tile, brick_dungeon_tile.getUnlocalizedName()); GameRegistry.registerBlock(brick_dungeon_circle, brick_dungeon_circle.getUnlocalizedName()); GameRegistry.registerBlock(brick_forgotten, brick_forgotten.getUnlocalizedName()); + GameRegistry.registerBlock(deco_computer, ItemBlockMeta.class, deco_computer.getUnlocalizedName()); GameRegistry.registerBlock(tape_recorder, tape_recorder.getUnlocalizedName()); GameRegistry.registerBlock(steel_poles, steel_poles.getUnlocalizedName()); GameRegistry.registerBlock(pole_top, pole_top.getUnlocalizedName()); @@ -2767,7 +2821,8 @@ public class ModBlocks { GameRegistry.registerBlock(deco_pipe_quad_green_rusted, ItemBlockBase.class, deco_pipe_quad_green_rusted.getUnlocalizedName()); GameRegistry.registerBlock(deco_pipe_quad_red, ItemBlockBase.class, deco_pipe_quad_red.getUnlocalizedName()); GameRegistry.registerBlock(deco_pipe_quad_marked, ItemBlockBase.class, deco_pipe_quad_marked.getUnlocalizedName()); - GameRegistry.registerBlock(plant_flower, ItemBlockBase.class, plant_flower.getUnlocalizedName()); + register(plant_flower); + register(plant_dead); GameRegistry.registerBlock(mush, mush.getUnlocalizedName()); GameRegistry.registerBlock(mush_block, mush_block.getUnlocalizedName()); GameRegistry.registerBlock(mush_block_stem, mush_block_stem.getUnlocalizedName()); @@ -2802,12 +2857,6 @@ public class ModBlocks { //RAD GameRegistry.registerBlock(sellafield_slaked, sellafield_slaked.getUnlocalizedName()); GameRegistry.registerBlock(sellafield, ItemBlockNamedMeta.class, sellafield.getUnlocalizedName()); - /*GameRegistry.registerBlock(sellafield_0, sellafield_0.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_1, sellafield_1.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_2, sellafield_2.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_3, sellafield_3.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_4, sellafield_4.getUnlocalizedName()); - GameRegistry.registerBlock(sellafield_core, sellafield_core.getUnlocalizedName());*/ //Geysirs GameRegistry.registerBlock(geysir_water, geysir_water.getUnlocalizedName()); @@ -2839,13 +2888,7 @@ public class ModBlocks { GameRegistry.registerBlock(c4, c4.getUnlocalizedName()); //Turrets - GameRegistry.registerBlock(turret_light, turret_light.getUnlocalizedName()); - GameRegistry.registerBlock(turret_heavy, turret_heavy.getUnlocalizedName()); - GameRegistry.registerBlock(turret_rocket, turret_rocket.getUnlocalizedName()); - GameRegistry.registerBlock(turret_flamer, turret_flamer.getUnlocalizedName()); - GameRegistry.registerBlock(turret_tau, turret_tau.getUnlocalizedName()); GameRegistry.registerBlock(turret_spitfire, turret_spitfire.getUnlocalizedName()); - GameRegistry.registerBlock(turret_cwis, ItemBlockLore.class, turret_cwis.getUnlocalizedName()); GameRegistry.registerBlock(turret_cheapo, turret_cheapo.getUnlocalizedName()); GameRegistry.registerBlock(turret_chekhov, turret_chekhov.getUnlocalizedName()); GameRegistry.registerBlock(turret_friendly, turret_friendly.getUnlocalizedName()); @@ -2872,13 +2915,6 @@ public class ModBlocks { GameRegistry.registerBlock(mine_shrap, mine_shrap.getUnlocalizedName()); GameRegistry.registerBlock(mine_fat, mine_fat.getUnlocalizedName()); - //Wot - GameRegistry.registerBlock(cel_prime, cel_prime.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_terminal, cel_prime_terminal.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_battery, cel_prime_battery.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_port, cel_prime_port.getUnlocalizedName()); - GameRegistry.registerBlock(cel_prime_tanks, cel_prime_tanks.getUnlocalizedName()); - //Block Bombs GameRegistry.registerBlock(flame_war, flame_war.getUnlocalizedName()); GameRegistry.registerBlock(float_bomb, float_bomb.getUnlocalizedName()); @@ -2946,12 +2982,12 @@ public class ModBlocks { GameRegistry.registerBlock(door_bunker, door_bunker.getUnlocalizedName()); //Crates - GameRegistry.registerBlock(crate_iron, crate_iron.getUnlocalizedName()); - GameRegistry.registerBlock(crate_steel, crate_steel.getUnlocalizedName()); - GameRegistry.registerBlock(crate_desh, crate_desh.getUnlocalizedName()); - GameRegistry.registerBlock(crate_tungsten, crate_tungsten.getUnlocalizedName()); - GameRegistry.registerBlock(safe, safe.getUnlocalizedName()); - GameRegistry.registerBlock(mass_storage, ItemBlockBase.class, mass_storage.getUnlocalizedName()); + register(crate_iron); + register(crate_steel); + register(crate_desh); + register(crate_tungsten); + register(safe); + register(mass_storage); //Junk GameRegistry.registerBlock(boxcar, boxcar.getUnlocalizedName()); @@ -2981,9 +3017,19 @@ public class ModBlocks { GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName()); register(heater_firebox); register(heater_oilburner); + register(heater_electric); register(furnace_iron); register(furnace_steel); register(machine_stirling); + register(machine_stirling_steel); + register(machine_sawmill); + register(machine_crucible); + register(machine_boiler); + register(foundry_mold); + register(foundry_basin); + register(foundry_channel); + register(foundry_tank); + register(foundry_outlet); GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName()); @@ -3086,7 +3132,6 @@ public class ModBlocks { GameRegistry.registerBlock(cable_detector, cable_detector.getUnlocalizedName()); GameRegistry.registerBlock(cable_diode, ItemBlockBase.class, cable_diode.getUnlocalizedName()); GameRegistry.registerBlock(machine_detector, machine_detector.getUnlocalizedName()); - GameRegistry.registerBlock(rf_cable, rf_cable.getUnlocalizedName()); GameRegistry.registerBlock(oil_duct, oil_duct.getUnlocalizedName()); GameRegistry.registerBlock(oil_duct_solid, oil_duct_solid.getUnlocalizedName()); GameRegistry.registerBlock(gas_duct, gas_duct.getUnlocalizedName()); @@ -3098,9 +3143,11 @@ public class ModBlocks { GameRegistry.registerBlock(crane_extractor, crane_extractor.getUnlocalizedName()); GameRegistry.registerBlock(crane_inserter, crane_inserter.getUnlocalizedName()); + GameRegistry.registerBlock(crane_router, crane_router.getUnlocalizedName()); GameRegistry.registerBlock(crane_boxer, crane_boxer.getUnlocalizedName()); GameRegistry.registerBlock(crane_unboxer, crane_unboxer.getUnlocalizedName()); GameRegistry.registerBlock(conveyor, conveyor.getUnlocalizedName()); + //GameRegistry.registerBlock(conveyor_classic, conveyor_classic.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_double, conveyor_double.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_triple, conveyor_triple.getUnlocalizedName()); GameRegistry.registerBlock(conveyor_chute, conveyor_chute.getUnlocalizedName()); @@ -3118,18 +3165,18 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_plastic, ItemBlockLore.class, barrel_plastic.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_corroded, ItemBlockLore.class, barrel_corroded.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_iron, ItemBlockLore.class, barrel_iron.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_steel, ItemBlockLore.class, barrel_steel.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_tcalloy, ItemBlockLore.class, barrel_tcalloy.getUnlocalizedName()); - GameRegistry.registerBlock(barrel_antimatter, ItemBlockLore.class, barrel_antimatter.getUnlocalizedName()); - GameRegistry.registerBlock(machine_battery_potato, machine_battery_potato.getUnlocalizedName()); - GameRegistry.registerBlock(machine_battery, machine_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_lithium_battery, machine_lithium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_schrabidium_battery, machine_schrabidium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_dineutronium_battery, machine_dineutronium_battery.getUnlocalizedName()); - GameRegistry.registerBlock(machine_fensu, machine_fensu.getUnlocalizedName()); + register(barrel_plastic); + register(barrel_corroded); + register(barrel_iron); + register(barrel_steel); + register(barrel_tcalloy); + register(barrel_antimatter); + register(machine_battery_potato); + register(machine_battery); + register(machine_lithium_battery); + register(machine_schrabidium_battery); + register(machine_dineutronium_battery); + register(machine_fensu); GameRegistry.registerBlock(machine_transformer, machine_transformer.getUnlocalizedName()); GameRegistry.registerBlock(machine_transformer_20, machine_transformer_20.getUnlocalizedName()); GameRegistry.registerBlock(machine_transformer_dnt, machine_transformer_dnt.getUnlocalizedName()); @@ -3145,16 +3192,16 @@ public class ModBlocks { GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemfac, machine_chemfac.getUnlocalizedName()); - GameRegistry.registerBlock(machine_fluidtank, machine_fluidtank.getUnlocalizedName()); - GameRegistry.registerBlock(machine_bat9000, machine_bat9000.getUnlocalizedName()); - GameRegistry.registerBlock(machine_orbus, machine_orbus.getUnlocalizedName()); + register(machine_fluidtank); + register(machine_bat9000); + register(machine_orbus); GameRegistry.registerBlock(machine_boiler_off, machine_boiler_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_on, machine_boiler_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_electric_on, machine_boiler_electric_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_boiler_electric_off, machine_boiler_electric_off.getUnlocalizedName()); - GameRegistry.registerBlock(machine_turbine, machine_turbine.getUnlocalizedName()); - GameRegistry.registerBlock(machine_large_turbine, machine_large_turbine.getUnlocalizedName()); - GameRegistry.registerBlock(machine_chungus, machine_chungus.getUnlocalizedName()); + register(machine_turbine); + register(machine_large_turbine); + register(machine_chungus); GameRegistry.registerBlock(machine_condenser, machine_condenser.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_small, machine_tower_small.getUnlocalizedName()); GameRegistry.registerBlock(machine_tower_large, machine_tower_large.getUnlocalizedName()); @@ -3184,6 +3231,7 @@ public class ModBlocks { GameRegistry.registerBlock(machine_schrabidium_transmutator, machine_schrabidium_transmutator.getUnlocalizedName()); GameRegistry.registerBlock(machine_combine_factory, machine_combine_factory.getUnlocalizedName()); GameRegistry.registerBlock(machine_teleporter, machine_teleporter.getUnlocalizedName()); + GameRegistry.registerBlock(teleanchor, teleanchor.getUnlocalizedName()); GameRegistry.registerBlock(machine_satlinker, machine_satlinker.getUnlocalizedName()); GameRegistry.registerBlock(machine_keyforge, machine_keyforge.getUnlocalizedName()); GameRegistry.registerBlock(machine_armor_table, machine_armor_table.getUnlocalizedName()); @@ -3223,13 +3271,11 @@ public class ModBlocks { //Industrial Factories GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_core, factory_titanium_core.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_core, factory_advanced_core.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); //The Fluid Inserter //GameRegistry.registerBlock(machine_inserter, machine_inserter.getUnlocalizedName()); @@ -3340,22 +3386,17 @@ public class ModBlocks { GameRegistry.registerBlock(corium_block, corium_block.getUnlocalizedName()); GameRegistry.registerBlock(volcanic_lava_block, volcanic_lava_block.getUnlocalizedName()); GameRegistry.registerBlock(sulfuric_acid_block, sulfuric_acid_block.getUnlocalizedName()); + //GameRegistry.registerBlock(concrete_liquid, concrete_liquid.getUnlocalizedName()); //Multiblock Dummy Blocks - GameRegistry.registerBlock(dummy_block_flare, dummy_block_flare.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_flare, dummy_port_flare.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_drill, dummy_block_drill.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_drill, dummy_port_drill.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_assembler, dummy_block_assembler.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_assembler, dummy_port_assembler.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_chemplant, dummy_block_chemplant.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_chemplant, dummy_port_chemplant.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_fluidtank, dummy_block_fluidtank.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_fluidtank, dummy_port_fluidtank.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_refinery, dummy_block_refinery.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_refinery, dummy_port_refinery.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_pumpjack, dummy_block_pumpjack.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_pumpjack, dummy_port_pumpjack.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_turbofan, dummy_block_turbofan.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_turbofan, dummy_port_turbofan.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_ams_limiter, dummy_block_ams_limiter.getUnlocalizedName()); @@ -3364,8 +3405,6 @@ public class ModBlocks { GameRegistry.registerBlock(dummy_port_ams_emitter, dummy_port_ams_emitter.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_ams_base, dummy_block_ams_base.getUnlocalizedName()); GameRegistry.registerBlock(dummy_port_ams_base, dummy_port_ams_base.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_block_radgen, dummy_block_radgen.getUnlocalizedName()); - GameRegistry.registerBlock(dummy_port_radgen, dummy_port_radgen.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_vault, dummy_block_vault.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_blast, dummy_block_blast.getUnlocalizedName()); GameRegistry.registerBlock(dummy_block_uf6, dummy_block_uf6.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/CelPrime.java b/src/main/java/com/hbm/blocks/bomb/CelPrime.java deleted file mode 100644 index 5c076bd16..000000000 --- a/src/main/java/com/hbm/blocks/bomb/CelPrime.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.hbm.blocks.bomb; - -import com.hbm.blocks.ModBlocks; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.bomb.TileEntityCelPrime; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class CelPrime extends BlockContainer { - - public CelPrime(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCelPrime(); - } - - @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()) - { - TileEntityCelPrime entity = (TileEntityCelPrime) world.getTileEntity(x, y, z); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_cel_prime, world, x, y, z); - } - return true; - } else { - return false; - } - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - } - -} diff --git a/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java b/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java deleted file mode 100644 index 7631719f1..000000000 --- a/src/main/java/com/hbm/blocks/bomb/CelPrimePart.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.hbm.blocks.bomb; - -import com.hbm.blocks.ModBlocks; -import com.hbm.tileentity.bomb.TileEntityCelPrimeBattery; -import com.hbm.tileentity.bomb.TileEntityCelPrimePort; -import com.hbm.tileentity.bomb.TileEntityCelPrimeTanks; -import com.hbm.tileentity.bomb.TileEntityCelPrimeTerminal; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class CelPrimePart extends BlockContainer { - - public CelPrimePart(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - if(this == ModBlocks.cel_prime_terminal) - return new TileEntityCelPrimeTerminal(); - if(this == ModBlocks.cel_prime_battery) - return new TileEntityCelPrimeBattery(); - if(this == ModBlocks.cel_prime_port) - return new TileEntityCelPrimePort(); - if(this == ModBlocks.cel_prime_tanks) - return new TileEntityCelPrimeTanks(); - - return null; - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - } -} diff --git a/src/main/java/com/hbm/blocks/bomb/NukeMike.java b/src/main/java/com/hbm/blocks/bomb/NukeMike.java index 458428a74..a1d1d846e 100644 --- a/src/main/java/com/hbm/blocks/bomb/NukeMike.java +++ b/src/main/java/com/hbm/blocks/bomb/NukeMike.java @@ -134,21 +134,11 @@ public class NukeMike extends BlockContainer implements IBomb { world.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(world, BombConfig.mikeRadius, x + 0.5, y + 0.5, z + 0.5)); - if(GeneralConfig.enableNukeClouds) { - EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(world, 1000, r * 0.005F); - entity2.posX = x; - entity2.posY = y; - entity2.posZ = z; - world.spawnEntityInWorld(entity2); - } else { - EntityNukeCloudSmall entity2 = new EntityNukeCloudNoShroom(world, 1000); - entity2.posX = x; - entity2.posY = y - (r / 10); - entity2.posZ = z; - world.spawnEntityInWorld(entity2); - } - - // ExplosionNukeAdvanced.mush(world, x, y, z); + EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(world, 1000, r * 0.005F); + entity2.posX = x; + entity2.posY = y; + entity2.posZ = z; + world.spawnEntityInWorld(entity2); } return false; diff --git a/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java b/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java new file mode 100644 index 000000000..df77a5130 --- /dev/null +++ b/src/main/java/com/hbm/blocks/fluid/GenericFiniteFluid.java @@ -0,0 +1,52 @@ +package com.hbm.blocks.fluid; + +import java.util.Random; + +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.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidFinite; +import net.minecraftforge.fluids.Fluid; + +public class GenericFiniteFluid extends BlockFluidFinite { + + @SideOnly(Side.CLIENT) + public static IIcon stillIcon; + @SideOnly(Side.CLIENT) + public static IIcon flowingIcon; + public Random rand = new Random(); + + private String stillName; + private String flowingName; + + public GenericFiniteFluid(Fluid fluid, Material material, String still, String flowing) { + super(fluid, material); + setCreativeTab(null); + stillName = still; + flowingName = flowing; + displacements.put(this, false); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return (side == 0 || side == 1) ? stillIcon : flowingIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + stillIcon = register.registerIcon(RefStrings.MODID + ":" + stillName); + flowingIcon = register.registerIcon(RefStrings.MODID + ":" + flowingName); + } + + @Override + public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { + return this.quantaPerBlock - 1; + } +} diff --git a/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java b/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java index 3edf0a6cd..67dca9fea 100644 --- a/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java +++ b/src/main/java/com/hbm/blocks/gas/BlockGasCoal.java @@ -33,8 +33,9 @@ public class BlockGasCoal extends BlockGasBase { EntityLivingBase living = (EntityLivingBase) entity; - if(!ArmorRegistry.hasProtection(living, 3, HazardClass.PARTICLE_COARSE)) + if(!ArmorRegistry.hasProtection(living, 3, HazardClass.PARTICLE_COARSE)) { HbmLivingProps.incrementBlackLung(living, 10); + } } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index c154fc950..72f9a7bf2 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -181,14 +181,14 @@ public class BlockBobble extends BlockContainer { PU238( "Pu-238", "Pu-238", "Improved Tom impact mechanics", null, false, ScrapType.CPU_REGISTER), VT( "VT-6/24", "VT-6/24", "Balefire warhead model and general texturework", "You cannot unfuck a horse.", true, ScrapType.CPU_EXT), DOC( "The Doctor", "Doctor17PH", "Russian localization, lunar miner", "Perhaps the moon rocks were too expensive", true, ScrapType.CPU_CACHE), - BLUEHAT( "The Blue Hat", "The Blue Hat", "Textures", "there's a listening device in this bobblehead$don't touch it thanks", true, ScrapType.MEM_16K_A), + BLUEHAT( "The Blue Hat", "The Blue Hat", "Textures", "payday 2's deagle freeaim champ of the year 2022", true, ScrapType.MEM_16K_A), PHEO( "Pheo", "Pheonix", "Deuterium machines, tantalium textures, Reliant Rocket", "RUN TO THE BEDROOM, ON THE SUITCASE ON THE LEFT,$YOU'LL FIND MY FAVORITE AXE", true, ScrapType.MEM_16K_B), ADAM29( "Adam29", "Adam29", "Ethanol, liquid petroleum gas", "You know, nukes are really quite beatiful.$It's like watching a star be born for a split second.", true, ScrapType.MEM_16K_C), UFFR( "UFFR", "UFFR", "All sorts of things from his PR", "fried shrimp", false, ScrapType.MEM_SOCKET), VAER( "vaer", "vaer", "ZIRNOX", "taken de family out to the weekend cigarette festival", true, ScrapType.MEM_16K_D), NOS( "Dr Nostalgia", "Dr Nostalgia", "SSG and Vortex models", "Take a picture, I'ma pose, paparazzi$I've been drinking, moving like a zombie", true, ScrapType.BOARD_TRANSISTOR), DRILLGON( "Drillgon200", "Drillgon200", "1.12 Port", null, false, ScrapType.CPU_LOGIC), - CIRNO( "Cirno", "Cirno", "being a dumb ice fairy", "No brain. Head empty.", true, ScrapType.BOARD_BLANK); + CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK); public String name; //the title of the tooltip public String label; //the name engraved in the socket diff --git a/src/main/java/com/hbm/blocks/generic/BlockCrystal.java b/src/main/java/com/hbm/blocks/generic/BlockCrystal.java index a21365a07..0204d0f78 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCrystal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCrystal.java @@ -1,11 +1,10 @@ package com.hbm.blocks.generic; import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; -public class BlockCrystal extends Block { +public class BlockCrystal extends BlockDragonProof { public BlockCrystal(Material mat) { super(mat); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java b/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java new file mode 100644 index 000000000..4693db839 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDeadPlant.java @@ -0,0 +1,85 @@ +package com.hbm.blocks.generic; + +import java.util.Random; + +import com.hbm.blocks.BlockEnumMulti; +import com.hbm.blocks.ModBlocks; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class BlockDeadPlant extends BlockEnumMulti { + + public BlockDeadPlant() { + super(Material.plants, EnumDeadPlantType.class, false, true); + } + + public static enum EnumDeadPlantType { + GENERIC, + GRASS, + FLOWER, + BIGFLOWER, + FERN + } + + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) { + return super.canPlaceBlockAt(world, x, y, z) && this.canBlockStay(world, x, y, z); + } + + protected boolean canPlaceBlockOn(Block block) { + return block == Blocks.grass || block == Blocks.dirt || block == ModBlocks.waste_earth || block == ModBlocks.dirt_oily || block == ModBlocks.dirt_dead; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + super.onNeighborBlockChange(world, x, y, z, block); + this.checkAndDropBlock(world, x, y, z); + } + + protected void checkAndDropBlock(World world, int x, int y, int z) { + if(!this.canBlockStay(world, x, y, z)) { + this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + world.setBlock(x, y, z, getBlockById(0), 0, 2); + } + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z) { + return canPlaceBlockOn(world.getBlock(x, y - 1, z)); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return null; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return 1; + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + return null; + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java new file mode 100644 index 000000000..d62ae2d39 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java @@ -0,0 +1,102 @@ +package com.hbm.blocks.generic; + +import java.util.List; + +import com.hbm.lib.RefStrings; + +import cpw.mods.fml.client.registry.RenderingRegistry; +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.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockDecoModel extends Block { + + //Allows between 1-4 differently colored/textured sub-blocks altogether. + int subTypes; + + public BlockDecoModel(Material mat, int types) { + super(mat); + subTypes = types; + } + + @SideOnly(Side.CLIENT) + protected IIcon[] icons; + + @Override + public int damageDropped(int meta) { + return meta & 12; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tabs, List list) { + for(byte i = 0; i < subTypes; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + icons = new IIcon[subTypes]; + + for(byte i = 0; i < subTypes; i++) + icons[i] = iconRegister.registerIcon(this.textureName + "_" + i); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.icons[(meta >> 2) % this.icons.length]; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + //Did somebody say - pain? + //Alright fuckers, looks like 2/b010 = North, 3/b011 = South, 4/b100 = West, 5/b101 = East for sides. + //I'll just opt for something similar (0/b00 North, 1/b01 South, 2/b10 West, 3/b11 East) + + //Assumes meta is using the third and fourth bits. + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + int meta; + + if((i & 1) != 1) + meta = i >> 1; //For North(b00>b00) and South(b10>b01), shift bits right by one + else { + if(i == 3) + meta = 2; //For West(b11>b10), just set to 2 + else + meta = 3; //For East(b01>b11), just set to 3 + } + + world.setBlockMetadataWithNotify(x, y, z, meta, 2); + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java b/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java new file mode 100644 index 000000000..91f2618a6 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockDragonProof.java @@ -0,0 +1,17 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.world.IBlockAccess; + +public class BlockDragonProof extends BlockGeneric { + + public BlockDragonProof(Material material) { + super(material); + } + + public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) { + return !(entity instanceof EntityDragon); + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java new file mode 100644 index 000000000..4910221d7 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java @@ -0,0 +1,19 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockStairs; + +public class BlockGenericStairs extends BlockStairs { + + public static List recipeGen = new ArrayList(); + + public BlockGenericStairs(Block block, int meta) { + super(block, meta); + this.useNeighborBrightness = true; + + recipeGen.add(new Object[] {block, meta, this}); + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java new file mode 100644 index 000000000..231bb58cb --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java @@ -0,0 +1,99 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockSlab; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class BlockMultiSlab extends BlockSlab { + + public static List recipeGen = new ArrayList(); + + public Block[] slabMaterials; + public Block single; + + public BlockMultiSlab(Block single, Material mat, Block... slabMaterials) { + super(single != null, mat); + this.single = single; + this.slabMaterials = slabMaterials; + this.useNeighborBrightness = true; + + if(single == null) { + for(int i = 0; i < slabMaterials.length; i++) { + recipeGen.add(new Object[] {slabMaterials[i], this, i}); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getIcon(side, meta); + } + + @Override + public Item getItemDropped(int meta, Random rand, int fortune) { + return Item.getItemFromBlock(single != null ? single : this); + } + + @Override + protected ItemStack createStackedBlock(int meta) { + return new ItemStack(Item.getItemFromBlock(single != null ? single : this), 2, (meta & 7) % slabMaterials.length); + } + + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return Item.getItemFromBlock(single != null ? single : this); + } + + @Override + public String func_150002_b(int meta) { + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return super.getUnlocalizedName() + "." + block.getUnlocalizedName().substring(5); + } + + @Override + public int getDamageValue(World world, int x, int y, int z) { + return (super.getDamageValue(world, x, y, z) & 7) % slabMaterials.length; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + + if(single == null) { + for(int i = 0; i < slabMaterials.length; ++i) { + list.add(new ItemStack(item, 1, i)); + } + } + } + + @Override + public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) { + int meta = world.getBlockMetadata(x, y, z); + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getExplosionResistance(entity); + } + + @Override + public float getBlockHardness(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + meta = (meta & 7) % slabMaterials.length; + Block block = slabMaterials[meta]; + return block.getBlockHardness(world, x, y, z); //relies on block not assuming that they are at that position + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java b/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java index 972a71df7..ad03375e9 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPinkSlab.java @@ -15,15 +15,15 @@ public class BlockPinkSlab extends BlockSlab { super(bool, mat); } - public Item getItemDropped(int i, Random rand, int j) - { - return Item.getItemFromBlock(ModBlocks.pink_slab); - } - - protected ItemStack createStackedBlock(int i) - { - return new ItemStack(Item.getItemFromBlock(ModBlocks.pink_slab), 2, i & 7); - } + @Override + public Item getItemDropped(int i, Random rand, int j) { + return Item.getItemFromBlock(ModBlocks.pink_slab); + } + + @Override + protected ItemStack createStackedBlock(int i) { + return new ItemStack(Item.getItemFromBlock(ModBlocks.pink_slab), 2, i & 7); + } @Override public String func_150002_b(int p_150002_1_) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java b/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java deleted file mode 100644 index 501caa6ac..000000000 --- a/src/main/java/com/hbm/blocks/generic/BlockPinkStairs.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.blocks.generic; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockStairs; - -public class BlockPinkStairs extends BlockStairs { - - public BlockPinkStairs(Block p_i45428_1_, int p_i45428_2_) { - super(p_i45428_1_, p_i45428_2_); - } - -} diff --git a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java index ea82080a8..2717c8844 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockSmolder.java +++ b/src/main/java/com/hbm/blocks/generic/BlockSmolder.java @@ -17,26 +17,26 @@ public class BlockSmolder extends Block { public BlockSmolder(Material mat) { super(mat); } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - super.randomDisplayTick(world, x, y, z, rand); - - if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { - world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); - } - } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + if(world.getBlock(x, y + 1, z).getMaterial() == Material.air) { + + world.spawnParticle("lava", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + world.spawnParticle("flame", x + 0.25 + rand.nextDouble() * 0.5, y + 1.1, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } @Override public Item getItemDropped(int i, Random rand, int j) { return ModItems.powder_fire; - } + } - @Override + @Override public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - entity.setFire(3); - } + entity.setFire(3); + } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java index 5dddb69ed..8844789ea 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java @@ -3,6 +3,7 @@ package com.hbm.blocks.generic; import java.io.IOException; import java.util.Random; +import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemLock; @@ -38,7 +39,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockStorageCrate extends BlockContainer { +public class BlockStorageCrate extends BlockContainer implements IBlockMulti { @SideOnly(Side.CLIENT) private IIcon iconTop; @@ -264,4 +265,9 @@ public class BlockStorageCrate extends BlockContainer { public Item getItemDropped(int i, Random rand, int j) { return null; } + + @Override + public int getSubCount() { + return 0; + } } diff --git a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java index 159b10303..a2b70c655 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java +++ b/src/main/java/com/hbm/blocks/machine/BlockFluidBarrel.java @@ -1,27 +1,37 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; import java.util.Random; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityBarrel; +import com.hbm.util.I18nUtil; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockFluidBarrel extends BlockContainer { +public class BlockFluidBarrel extends BlockContainer implements IPersistentInfoProvider { int capacity; @@ -125,4 +135,38 @@ public class BlockFluidBarrel extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, x, y, z, player, stack); + IPersistentNBT.restoreData(world, x, y, z, stack); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java index 18719d914..9eacde4da 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java +++ b/src/main/java/com/hbm/blocks/machine/DummyBlockAssembler.java @@ -1,9 +1,6 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityMachineAssembler; @@ -11,8 +8,6 @@ import com.hbm.tileentity.machine.TileEntityMachineAssembler; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; 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.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java b/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java deleted file mode 100644 index 93381f760..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockCyclotron.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.TileEntityMachineCyclotron; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -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.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockCyclotron extends DummyOldBase { - - public DummyBlockCyclotron(Material p_i45386_1_, boolean port) { - super(p_i45386_1_, port); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_cyclotron); - } - - @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()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineCyclotron entity = (TileEntityMachineCyclotron) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_machine_cyclotron, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java b/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java deleted file mode 100644 index 760add7d0..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockFlare.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.oil.TileEntityMachineGasFlare; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -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.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockFlare extends DummyOldBase { - - public DummyBlockFlare(Material p_i45386_1_, boolean port) { - super(p_i45386_1_, port); - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_flare); - } - - @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()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineGasFlare entity = (TileEntityMachineGasFlare) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_machine_flare, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java b/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java deleted file mode 100644 index 44503bc9e..000000000 --- a/src/main/java/com/hbm/blocks/machine/DummyBlockRadGen.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IDummy; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.TileEntityMachineRadGen; - -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -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.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class DummyBlockRadGen extends BlockContainer implements IDummy { - - public static boolean safeBreak = false; - - public DummyBlockRadGen(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityDummy(); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block block, int i) - { - if(!safeBreak) { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - //world.getBlock(a, b, c).breakBlock(world, a, b, c, block, i); - if(!world.isRemote) - world.func_147480_a(a, b, c, true); - } - } - world.removeTileEntity(x, y, z); - } - - @Override - public int getRenderType() { - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return null; - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(ModBlocks.machine_radgen); - } - - @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()) - { - TileEntity te = world.getTileEntity(x, y, z); - if(te != null && te instanceof TileEntityDummy) { - int a = ((TileEntityDummy)te).targetX; - int b = ((TileEntityDummy)te).targetY; - int c = ((TileEntityDummy)te).targetZ; - - TileEntityMachineRadGen entity = (TileEntityMachineRadGen) world.getTileEntity(a, b, c); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, ModBlocks.guiID_radgen, world, a, b, c); - } - } - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java b/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java deleted file mode 100644 index 63709f047..000000000 --- a/src/main/java/com/hbm/blocks/machine/FactoryCoreAdvanced.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.tileentity.machine.TileEntityCoreAdvanced; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class FactoryCoreAdvanced extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; - - public FactoryCoreAdvanced(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCoreAdvanced(); - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - TileEntityCoreAdvanced tileentityfurnace = (TileEntityCoreAdvanced)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } -} diff --git a/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java b/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java deleted file mode 100644 index 9fff1f9b2..000000000 --- a/src/main/java/com/hbm/blocks/machine/FactoryCoreTitanium.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.tileentity.machine.TileEntityCoreTitanium; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class FactoryCoreTitanium extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; - - public FactoryCoreTitanium(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCoreTitanium(); - } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - TileEntityCoreTitanium tileentityfurnace = (TileEntityCoreTitanium)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - -} diff --git a/src/main/java/com/hbm/blocks/machine/FactoryHatch.java b/src/main/java/com/hbm/blocks/machine/FactoryHatch.java index b86e508a3..55d64c79d 100644 --- a/src/main/java/com/hbm/blocks/machine/FactoryHatch.java +++ b/src/main/java/com/hbm/blocks/machine/FactoryHatch.java @@ -5,8 +5,6 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityCoreAdvanced; -import com.hbm.tileentity.machine.TileEntityCoreTitanium; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/blocks/machine/FoundryBasin.java b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java new file mode 100644 index 000000000..59014be8e --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryBasin.java @@ -0,0 +1,91 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryBasin; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryBasin extends FoundryCastingBase { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + + public FoundryBasin() { + super(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_basin_inner"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryBasin(); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB[] bbs = new AxisAlignedBB[] { + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.125D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 1D, z + 0.125D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125D, y + 1D, z + 1D), + AxisAlignedBB.getBoundingBox(x + 0.875D, y, z, x + 1D, y + 1D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1D, y + 1D, z + 1D), + }; + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java new file mode 100644 index 000000000..1ced99e75 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -0,0 +1,210 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.items.machine.ItemScraps; +import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; +import com.hbm.util.I18nUtil; + +import api.hbm.block.ICrucibleAcceptor; +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.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class FoundryCastingBase extends BlockContainer implements ICrucibleAcceptor, IToolable, ILookOverlay { + + protected FoundryCastingBase() { + super(Material.rock); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @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; + } + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + //remove casted item + if(cast.slots[1] != null) { + if(!player.inventory.addItemStackToInventory(cast.slots[1].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[1].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + + cast.slots[1] = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } + + //insert mold + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.mold && cast.slots[0] == null) { + Mold mold = ((ItemMold) player.getHeldItem().getItem()).getMold(player.getHeldItem()); + + if(mold.size == cast.getMoldSize()) { + cast.slots[0] = player.getHeldItem().copy(); + cast.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } + } + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; //just for safety + } + + for(ItemStack stack : cast.slots) { + if(stack != null) { + EntityItem drop = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, stack.copy()); + world.spawnEntityInWorld(drop); + } + } + + super.breakBlock(world, x, y, z, b, i); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + super.randomDisplayTick(world, x, y, z, rand); + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + if(cast.amount > 0 && cast.amount >= cast.getCapacity()) { + world.spawnParticle("smoke", x + 0.25 + rand.nextDouble() * 0.5, y + this.maxY, z + 0.25 + rand.nextDouble() * 0.5, 0.0, 0.0, 0.0); + } + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + + if(cast.slots[0] == null) + return false; + + if(!player.inventory.addItemStackToInventory(cast.slots[0].copy())) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, cast.slots[0].copy()); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + + cast.slots[0] = null; + cast.markDirty(); + + return true; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + List text = new ArrayList(); + + if(cast.slots[0] == null) { + text.add(EnumChatFormatting.RED + I18nUtil.resolveKey("foundry.noCast")); + } else if(cast.slots[0].getItem() == ModItems.mold){ + Mold mold = ((ItemMold) cast.slots[0].getItem()).getMold(cast.slots[0]); + text.add(EnumChatFormatting.BLUE + mold.getTitle()); + } + + if(cast.type != null && cast.amount > 0) { + text.add(EnumChatFormatting.YELLOW + cast.type.names[0] + ": " + cast.amount + " / " + cast.getCapacity()); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java new file mode 100644 index 000000000..bf00c6b60 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -0,0 +1,195 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.Library; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryChannel; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +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.client.renderer.texture.IIconRegister; +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.item.ItemTool; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconLava; + + public FoundryChannel() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_channel_inner"); + this.iconLava = iconRegister.registerIcon(RefStrings.MODID + ":lava_gray"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryChannel(); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + List bbs = new ArrayList(); + + bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.3125D, x + 0.6875D, y + 0.5D, z + 0.6875D)); + + if(canConnectTo(world, x, y, z, Library.POS_X)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.6875D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D)); + if(canConnectTo(world, x, y, z, Library.NEG_X)) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z + 0.3125D, x + 0.3125D, y + 0.5D, z + 0.6875D)); + if(canConnectTo(world, x, y, z, Library.POS_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.6875D, x + 0.6875D, y + 0.5D, z + 1D)); + if(canConnectTo(world, x, y, z, Library.NEG_Z)) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z, x + 0.6875D, y + 0.5D, z + 0.3125D)); + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds( + canConnectTo(world, x, y, z, Library.NEG_X) ? 0F : 0.3125F, + 0F, + canConnectTo(world, x, y, z, Library.NEG_Z) ? 0F : 0.3125F, + canConnectTo(world, x, y, z, Library.POS_X) ? 1F : 0.6875F, + 0.5F, + canConnectTo(world, x, y, z, Library.POS_Z) ? 1F : 0.6875F); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + public boolean canConnectTo(IBlockAccess world, int x, int y, int z, ForgeDirection dir) { + + if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN || dir == ForgeDirection.UNKNOWN) + return false; + + Block b = world.getBlock(x + dir.offsetX, y, z + dir.offsetZ); + int meta = world.getBlockMetadata(x + dir.offsetX, y, z + dir.offsetZ); + + if(b == ModBlocks.foundry_outlet && meta == dir.ordinal()) + return true; + + return b == ModBlocks.foundry_channel || b == ModBlocks.foundry_mold; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @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; + } + + TileEntityFoundryChannel cast = (TileEntityFoundryChannel) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryChannel channel = (TileEntityFoundryChannel) world.getTileEntity(x, y, z); + if(channel.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(channel.type, channel.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + channel.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryMold.java b/src/main/java/com/hbm/blocks/machine/FoundryMold.java new file mode 100644 index 000000000..1c3182d49 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryMold.java @@ -0,0 +1,86 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryMold; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryMold extends FoundryCastingBase { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + + public FoundryMold() { + super(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_mold_inner"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryMold(); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB[] bbs = new AxisAlignedBB[] { + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.125D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.5D, z + 0.125D), + AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125D, y + 0.5D, z + 1D), + AxisAlignedBB.getBoundingBox(x + 0.875D, y, z, x + 1D, y + 0.5D, z + 1D), + AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1D, y + 0.5D, z + 1D), + }; + + for(AxisAlignedBB bb : bbs) { + if(entityBounding.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1D, y + 0.5D, z + 1D); + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side == ForgeDirection.DOWN; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java new file mode 100644 index 000000000..32eac49b1 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -0,0 +1,183 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; +import com.hbm.util.I18nUtil; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryOutlet extends BlockContainer implements ICrucibleAcceptor, ILookOverlay { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconFront; + @SideOnly(Side.CLIENT) public IIcon iconLock; + @SideOnly(Side.CLIENT) public IIcon iconFilter; + + public FoundryOutlet() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_side"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_inner"); + this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_front"); + this.iconLock = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_lock"); + this.iconFilter = iconRegister.registerIcon(RefStrings.MODID + ":foundry_outlet_filter"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryOutlet(); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { + + AxisAlignedBB aabb = null; + int meta = world.getBlockMetadata(x, y, z); + + if(meta == 4) aabb = AxisAlignedBB.getBoundingBox(x + 0.625D, y, z + 0.3125D, x + 1D, y + 0.5D, z + 0.6875D); + if(meta == 5) aabb = AxisAlignedBB.getBoundingBox(x + 0D, y, z + 0.3125D, x + 0.375D, y + 0.5D, z + 0.6875D); + if(meta == 2) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0.625D, x + 0.6875D, y + 0.5D, z + 1D); + if(meta == 3) aabb = AxisAlignedBB.getBoundingBox(x + 0.3125D, y, z + 0D, x + 0.6875D, y + 0.5D, z + 0.375D); + + if(aabb != null && entityBounding.intersectsWith(aabb)) { + list.add(aabb); + } + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + + int meta = world.getBlockMetadata(x, y, z); + if(meta == 4) this.setBlockBounds(0.625F, 0F, 0.3125F, 1F, 0.5F, 0.6875F); + if(meta == 5) this.setBlockBounds(0F, 0F, 0.3125F, 0.375F, 0.5F, 0.6875F); + if(meta == 2) this.setBlockBounds(0.3125F, 0F, 0.625F, 0.6875F, 0.5F, 1F); + if(meta == 3) this.setBlockBounds(0.3125F, 0F, 0F, 0.6875F, 0.5F, 0.375F); + } + + @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; + } + + if(!player.isSneaking()) { + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.scraps) { + MaterialStack mat = ItemScraps.getMats(player.getHeldItem()); + if(mat != null) { + tile.filter = mat.material; + } + } else { + tile.invertRedstone = !tile.invertRedstone; + } + tile.markDirty(); + world.markBlockForUpdate(x, y, z); + } + + return true; + } + + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryOutlet) world.getTileEntity(x, y, z)).canAcceptPartialFlow(world, x, y, z, side, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return ((TileEntityFoundryOutlet) world.getTileEntity(x, y, z)).flow(world, x, y, z, side, stack); + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntityFoundryOutlet outlet = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + List text = new ArrayList(); + + if(outlet.filter != null) { + text.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("foundry.filter", outlet.filter.names[0])); + } + if(outlet.invertRedstone) { + text.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("foundry.inverted")); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(this.getUnlocalizedName() + ".name"), 0xFF4000, 0x401000, text); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/FoundryTank.java b/src/main/java/com/hbm/blocks/machine/FoundryTank.java new file mode 100644 index 000000000..fbf7c1538 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/FoundryTank.java @@ -0,0 +1,137 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import api.hbm.block.ICrucibleAcceptor; +import cpw.mods.fml.client.registry.RenderingRegistry; +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.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class FoundryTank extends BlockContainer implements ICrucibleAcceptor { + + @SideOnly(Side.CLIENT) public IIcon iconTop; + @SideOnly(Side.CLIENT) public IIcon iconSide; + @SideOnly(Side.CLIENT) public IIcon iconSideUpper; + @SideOnly(Side.CLIENT) public IIcon iconBottom; + @SideOnly(Side.CLIENT) public IIcon iconInner; + @SideOnly(Side.CLIENT) public IIcon iconLava; + + public FoundryTank() { + super(Material.rock); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_side"); + this.iconSideUpper = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_upper"); + this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_bottom"); + this.iconInner = iconRegister.registerIcon(RefStrings.MODID + ":foundry_tank_inner"); + this.iconLava = iconRegister.registerIcon(RefStrings.MODID + ":lava_gray"); + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityFoundryTank(); + } + + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).canAcceptPartialPour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return ((ICrucibleAcceptor) world.getTileEntity(x, y, z)).pour(world, x, y, z, dX, dY, dZ, side, stack); + } + + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @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; + } + + TileEntityFoundryTank cast = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + if(cast.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } else { + player.inventoryContainer.detectAndSendChanges(); + } + cast.amount = 0; + cast.type = null; + cast.markDirty(); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryTank tank = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + if(tank.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(tank.type, tank.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + tank.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return side != ForgeDirection.UP; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/HeaterElectric.java b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java new file mode 100644 index 000000000..7d458daf5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/HeaterElectric.java @@ -0,0 +1,107 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import api.hbm.block.IToolable; +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeaterElectric; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class HeaterElectric extends BlockDummyable implements ILookOverlay, ITooltipProvider, IToolable { + + public HeaterElectric() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityHeaterElectric(); + + if(hasExtra(meta)) + return new TileEntityProxyCombo().power(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {0, 0, 1, 2, 1, 1}; + } + + @Override + public int getOffset() { + return 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); + this.makeExtra(world, x, y, z); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } + + @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 TileEntityHeaterElectric)) + return; + + TileEntityHeaterElectric heater = (TileEntityHeaterElectric) te; + + List text = new ArrayList(); + text.add(String.format("%,d", heater.heatEnergy) + " TU"); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + heater.getConsumption() + " HE/t"); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + heater.getHeatGen() + " TU/t"); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + + if(world.isRemote) return true; + + 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 TileEntityHeaterElectric)) return false; + + TileEntityHeaterElectric tile = (TileEntityHeaterElectric) te; + tile.toggleSetting(); + tile.markDirty(); + + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineBattery.java b/src/main/java/com/hbm/blocks/machine/MachineBattery.java index f09e3e8f9..c96d2f901 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBattery.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBattery.java @@ -5,10 +5,11 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityDiFurnace; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; @@ -26,13 +27,15 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class MachineBattery extends BlockContainer implements ILookOverlay { +public class MachineBattery extends BlockContainer implements ILookOverlay, IPersistentInfoProvider { private final Random field_149933_a = new Random(); private static boolean keepInventory; @@ -143,8 +146,10 @@ public class MachineBattery extends BlockContainer implements ILookOverlay { } if(itemStack.hasDisplayName()) { - ((TileEntityDiFurnace) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + ((TileEntityMachineBattery) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } + + IPersistentNBT.restoreData(world, x, y, z, itemStack); } @Override @@ -249,4 +254,30 @@ public class MachineBattery extends BlockContainer implements ILookOverlay { TileEntityMachineBattery battery = (TileEntityMachineBattery) te; return battery.getComparatorPower(); } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.YELLOW + "" + BobMathUtil.getShortNumber(persistentTag.getLong("power")) + "/" + BobMathUtil.getShortNumber(this.maxPower) + "HE"); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java index 6f9d58b59..af50f4738 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java @@ -1,20 +1,31 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineBAT9000; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineBigAssTank9000 extends BlockDummyable { +public class MachineBigAssTank9000 extends BlockDummyable implements IPersistentInfoProvider { public MachineBigAssTank9000(Material mat) { super(mat); @@ -82,4 +93,16 @@ public class MachineBigAssTank9000 extends BlockDummyable { return true; } } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineBoiler.java index f89f9c003..4006d092d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBoiler.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBoiler.java @@ -30,7 +30,6 @@ import net.minecraft.world.World; public class MachineBoiler extends BlockContainer { private final Random field_149933_a = new Random(); - private Random rand; private final boolean isActive; private static boolean keepInventory; @@ -41,7 +40,6 @@ public class MachineBoiler extends BlockContainer { public MachineBoiler(boolean blockState) { super(Material.iron); - rand = new Random(); isActive = blockState; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java index eb1964ab5..026c67bfc 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java @@ -1,32 +1,16 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; -import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; -import com.hbm.tileentity.machine.TileEntityMachineGasCent; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -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.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -66,7 +50,7 @@ public class MachineCentrifuge extends BlockDummyable implements IMultiblock { @Override public int[] getDimensions() { - return new int[] {2, 0, 0, 0, 0, 0,}; + return new int[] {3, 0, 0, 0, 0, 0,}; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachineChungus.java b/src/main/java/com/hbm/blocks/machine/MachineChungus.java index 7277ca8a2..957169a40 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChungus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChungus.java @@ -1,6 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -9,11 +12,12 @@ import com.hbm.tileentity.machine.TileEntityChungus; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineChungus extends BlockDummyable { +public class MachineChungus extends BlockDummyable implements ITooltipProvider { public MachineChungus(Material mat) { super(mat); @@ -126,4 +130,9 @@ public class MachineChungus extends BlockDummyable { return true; } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java new file mode 100644 index 000000000..702ca3195 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -0,0 +1,116 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.machine.ItemScraps; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.machine.TileEntityCrucible; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class MachineCrucible extends BlockDummyable { + + public MachineCrucible() { + super(Material.rock); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, 1.5D, 0.5D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, -1.25D, 1.25D, 1.5D, -1D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, -1.25D, -1D, 1.5D, 1.25D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 0.5D, 1D, 1.25D, 1.5D, 1.25D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(1D, 0.5D, -1.25D, 1.25D, 1.5D, 1.25D)); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityCrucible(); + + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + + if(pos == null) + return false; + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemTool && ((ItemTool) player.getHeldItem().getItem()).getToolClasses(player.getHeldItem()).contains("shovel")) { + TileEntityCrucible crucible = (TileEntityCrucible) world.getTileEntity(pos[0], pos[1], pos[2]); + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + if(!player.inventory.addItemStackToInventory(scrap)) { + EntityItem item = new EntityItem(world, x + hitX, y + hitY, z + hitZ, scrap); + world.spawnEntityInWorld(item); + } + } + + player.inventoryContainer.detectAndSendChanges(); + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + crucible.markDirty(); + + } else { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); + } + return true; + } else { + return true; + } + } + + @Override + public int[] getDimensions() { + return new int[] {1, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 1; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityCrucible) { + TileEntityCrucible crucible = (TileEntityCrucible) te; + + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } + + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + } + + super.breakBlock(world, x, y, z, b, i); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java b/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java index fe0535f3d..7ca40d18f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCyclotron.java @@ -2,7 +2,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCyclotron; @@ -10,7 +9,6 @@ import com.hbm.tileentity.machine.TileEntityMachineCyclotron; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java index 6696b38e3..c99c41064 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiFurnace.java @@ -28,7 +28,6 @@ import net.minecraft.world.World; public class MachineDiFurnace extends BlockContainer { private final Random field_149933_a = new Random(); - private Random rand; private final boolean isActive; private static boolean keepInventory; @@ -39,7 +38,6 @@ public class MachineDiFurnace extends BlockContainer { public MachineDiFurnace(boolean blockState) { super(Material.iron); - rand = new Random(); isActive = blockState; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java index ecc409fa8..a08b4b6d1 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineDiesel.java +++ b/src/main/java/com/hbm/blocks/machine/MachineDiesel.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineDiesel; diff --git a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java index 6ba22f976..1acebe7e4 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFENSU.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFENSU.java @@ -5,6 +5,7 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; @@ -15,11 +16,14 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class MachineFENSU extends BlockDummyable implements ILookOverlay { +public class MachineFENSU extends BlockDummyable implements ILookOverlay, IPersistentInfoProvider { public MachineFENSU(Material mat) { super(mat); @@ -91,4 +95,9 @@ public class MachineFENSU extends BlockDummyable implements ILookOverlay { ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.YELLOW + "" + BobMathUtil.getShortNumber(persistentTag.getLong("power")) + "/" + BobMathUtil.getShortNumber(Long.MAX_VALUE) + "HE"); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java index 6de4dd1a6..994097ec3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFluidTank.java @@ -1,13 +1,20 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; import java.util.Random; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -20,11 +27,13 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineFluidTank extends BlockContainer implements IMultiblock { +public class MachineFluidTank extends BlockContainer implements IMultiblock, IPersistentInfoProvider { public MachineFluidTank(Material p_i45386_1_) { super(p_i45386_1_); @@ -76,6 +85,9 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + ItemStack drop = itemStack.copy(); + drop.stackSize = 1; if (i == 0) { world.setBlockMetadataWithNotify(x, y, z, 5, 2); @@ -119,8 +131,10 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + } } if (i == 1) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); @@ -164,8 +178,10 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + } } if (i == 2) { world.setBlockMetadataWithNotify(x, y, z, 4, 2); @@ -209,8 +225,10 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + } } if (i == 3) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); @@ -254,9 +272,13 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { DummyBlockFluidTank.safeBreak = false; // - } else - world.func_147480_a(x, y, z, true); + } else { + this.dropBlockAsItem(world, x, y, z, drop); + world.func_147480_a(x, y, z, false); + } } + + IPersistentNBT.restoreData(world, x, y, z, itemStack); } private final Random field_149933_a = new Random(); @@ -313,4 +335,35 @@ public class MachineFluidTank extends BlockContainer implements IMultiblock { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { + + if(!player.capabilities.isCreativeMode) { + harvesters.set(player); + this.dropBlockAsItem(world, x, y, z, meta, 0); + harvesters.set(null); + } + } + + /* + * Called after the block and TE are already gone, so this method is of no use to us. + */ + @Override + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java new file mode 100644 index 000000000..4264b777d --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineHeatBoiler.java @@ -0,0 +1,193 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IBlockMulti; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.items.ModItems; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityHeatBoiler; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineHeatBoiler extends BlockDummyable implements ILookOverlay, ITooltipProvider, IBlockMulti { + + public MachineHeatBoiler() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) return new TileEntityHeatBoiler(); + if(meta >= extra) return new TileEntityProxyCombo().fluid(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(!world.isRemote && !player.isSneaking()) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + 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 TileEntityHeatBoiler)) + return false; + + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) te; + + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, pos[0], pos[1], pos[2], player.getHeldItem()); + + if(type.hasTrait(FT_Heatable.class) && type.getTrait(FT_Heatable.class).getEfficiency(HeatingType.BOILER) > 0) { + boiler.tanks[0].setTankType(type); + boiler.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation("hbmfluid." + type.getName().toLowerCase())).appendSibling(new ChatComponentText("!"))); + } + return true; + } + return false; + + } else { + return true; + } + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + super.onBlockPlacedBy(world, x, y, z, player, itemStack); + + if(itemStack.getItemDamage() == 1) { + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int o = -getOffset(); + + ForgeDirection dir = ForgeDirection.NORTH; + if(i == 0) dir = ForgeDirection.getOrientation(2); + if(i == 1) dir = ForgeDirection.getOrientation(5); + if(i == 2) dir = ForgeDirection.getOrientation(3); + if(i == 3) dir = ForgeDirection.getOrientation(4); + + dir = getDirModified(dir); + + TileEntity te = world.getTileEntity(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); + + if(te instanceof TileEntityHeatBoiler) { + ((TileEntityHeatBoiler) te).hasExploded = true; + } + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + + int count = quantityDropped(metadata, fortune, world.rand); + int dmg = 0; + + int[] pos = this.findCore(world, x, y, z); + + if(pos != null) { + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler)world.getTileEntity(pos[0], pos[1], pos[2]); + if(boiler.hasExploded) { + //dmg = 1; + ret.add(new ItemStack(ModItems.ingot_steel, 4)); + ret.add(new ItemStack(ModItems.plate_copper, 8)); + return ret; + } + } + + for(int i = 0; i < count; i++) { + Item item = getItemDropped(metadata, world.rand, fortune); + if(item != null) { + ret.add(new ItemStack(item, 1, dmg)); + } + } + return ret; + } + + @Override + public int[] getDimensions() { + return new int[] {3, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 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); + + x = x + dir.offsetX * o; + z = z + dir.offsetZ * o; + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + this.makeExtra(world, x + rot.offsetX, y, z + rot.offsetZ); + this.makeExtra(world, x - rot.offsetX, y, z - rot.offsetZ); + this.makeExtra(world, x, y + 3, z); + } + + @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 TileEntityHeatBoiler)) + return; + + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) te; + + if(boiler.hasExploded) return; + + List text = new ArrayList(); + text.add(String.format("%,d", boiler.heat) + "TU"); + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[0].getTankType().getUnlocalizedName()) + ": " + String.format("%,d", boiler.tanks[0].getFill()) + " / " + String.format("%,d", boiler.tanks[0].getMaxFill()) + "mB"); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + I18nUtil.resolveKey(boiler.tanks[1].getTankType().getUnlocalizedName()) + ": " + String.format("%,d", boiler.tanks[1].getFill()) + " / " + String.format("%,d", boiler.tanks[1].getMaxFill()) + "mB"); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public int getSubCount() { + return 0; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java index 1e38531fb..dfa8d83d6 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineLargeTurbine.java @@ -1,6 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; @@ -12,12 +15,11 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineLargeTurbine extends BlockDummyable { +public class MachineLargeTurbine extends BlockDummyable implements ITooltipProvider { public MachineLargeTurbine(Material mat) { super(mat); @@ -98,4 +100,9 @@ public class MachineLargeTurbine extends BlockDummyable { this.makeExtra(world, xc + dir2.offsetX, y, zc + dir2.offsetZ); this.makeExtra(world, xc - dir2.offsetX, y, zc - dir2.offsetZ); } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java index 5bf08f383..17e5004e7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java @@ -1,19 +1,30 @@ package com.hbm.blocks.machine; +import java.util.ArrayList; +import java.util.List; + import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineOrbus; +import com.hbm.util.I18nUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineOrbus extends BlockDummyable { +public class MachineOrbus extends BlockDummyable implements IPersistentInfoProvider { public MachineOrbus(Material mat) { super(mat); @@ -73,4 +84,16 @@ public class MachineOrbus extends BlockDummyable { this.makeExtra(world, x + dir.offsetX + d2.offsetX, y + i, z + dir.offsetZ + d2.offsetZ); } } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return IPersistentNBT.getDrops(world, x, y, z, this); + } + + @Override + public void addInformation(ItemStack stack, NBTTagCompound persistentTag, EntityPlayer player, List list, boolean ext) { + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + tank.readFromNBT(persistentTag, "tank"); + list.add(EnumChatFormatting.YELLOW + "" + tank.getFill() + "/" + tank.getMaxFill() + "mB " + I18nUtil.resolveKey(tank.getTankType().getUnlocalizedName())); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineSawmill.java b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java new file mode 100644 index 000000000..e79978f1e --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineSawmill.java @@ -0,0 +1,232 @@ +package com.hbm.blocks.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.items.ModItems; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntitySawmill; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineSawmill extends BlockDummyable implements ILookOverlay, ITooltipProvider { + + public MachineSawmill() { + super(Material.iron); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, 1.5D, 1D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.25D, 1D, -0.5D, -0.625D, 1.875D, 0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.625D, 1D, -1D, 1.375D, 2D, 1D)); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntitySawmill(); + + if(meta >= extra) + return new TileEntityProxyCombo().inventory(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {1, 0, 1, 1, 1, 1}; + } + + @Override + public int getOffset() { + return 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); + + x = x + dir.offsetX * o; + z = z + dir.offsetZ * o; + + this.makeExtra(world, x + 1, y, z); + this.makeExtra(world, x - 1, y, z); + this.makeExtra(world, x, y, z + 1); + this.makeExtra(world, x, y, z - 1); + } + + @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); + + if(pos == null) + return false; + + TileEntitySawmill sawmill = (TileEntitySawmill)world.getTileEntity(pos[0], pos[1], pos[2]); + + if(!sawmill.hasBlade && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.sawblade) { + player.getHeldItem().stackSize--; + sawmill.hasBlade = true; + sawmill.markDirty(); + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:item.upgradePlug", 1.5F, 0.75F); + return true; + } + + if(sawmill.slots[1] != null || sawmill.slots[2] != null) { + for(int i = 1; i < 3; i++) { + if(sawmill.slots[i] != null) { + if(!player.inventory.addItemStackToInventory(sawmill.slots[i].copy())) { + player.dropPlayerItemWithRandomChoice(sawmill.slots[i].copy(), false); + } + sawmill.slots[i] = null; + } + } + player.inventoryContainer.detectAndSendChanges(); + sawmill.markDirty(); + return true; + + } else { + if(sawmill.slots[0] == null && player.getHeldItem() != null && sawmill.getOutput(player.getHeldItem()) != null) { + sawmill.slots[0] = player.getHeldItem().copy(); + sawmill.slots[0].stackSize = 1; + player.getHeldItem().stackSize--; + sawmill.markDirty(); + player.inventoryContainer.detectAndSendChanges(); + return true; + } + } + } + + return false; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + super.onBlockPlacedBy(world, x, y, z, player, itemStack); + + if(itemStack.getItemDamage() == 1) { + + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int o = -getOffset(); + + ForgeDirection dir = ForgeDirection.NORTH; + if(i == 0) dir = ForgeDirection.getOrientation(2); + if(i == 1) dir = ForgeDirection.getOrientation(5); + if(i == 2) dir = ForgeDirection.getOrientation(3); + if(i == 3) dir = ForgeDirection.getOrientation(4); + + dir = getDirModified(dir); + + TileEntity te = world.getTileEntity(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o); + + if(te instanceof TileEntitySawmill) { + ((TileEntitySawmill) te).hasBlade = false; + } + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + + int count = quantityDropped(metadata, fortune, world.rand); + int dmg = 0; + + int[] pos = this.findCore(world, x, y, z); + + if(pos != null) { + TileEntitySawmill stirling = (TileEntitySawmill)world.getTileEntity(pos[0], pos[1], pos[2]); + if(!stirling.hasBlade) { + dmg = 1; + } + } + + for(int i = 0; i < count; i++) { + Item item = getItemDropped(metadata, world.rand, fortune); + if(item != null) { + ret.add(new ItemStack(item, 1, dmg)); + } + } + return ret; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { } + + @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 TileEntitySawmill)) + return; + + TileEntitySawmill stirling = (TileEntitySawmill) te; + + List text = new ArrayList(); + text.add(stirling.heat + "TU/t"); + + double percent = (double) stirling.heat / (double) 300; + int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8); + + if(percent > 1D) + color = 0xff0000; + + text.add("&[" + color + "&]" + ((stirling.heat * 1000 / 300) / 10D) + "%"); + + int limiter = stirling.progress * 26 / stirling.processingTime; + String bar = EnumChatFormatting.GREEN + "[ "; + for(int i = 0; i < 25; i++) { + if(i == limiter) { + bar += EnumChatFormatting.RESET; + } + + bar += "▏"; + } + + bar += EnumChatFormatting.GREEN + " ]"; + + text.add(bar); + + for(int i = 0; i < 3; i++) { + if(stirling.slots[i] != null) { + text.add((i == 0 ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + stirling.slots[i].getDisplayName() + (stirling.slots[i].stackSize > 1 ? " x" + stirling.slots[i].stackSize : "")); + } + } + + if(stirling.heat > 300) { + text.add("&[" + (BobMathUtil.getBlink() ? 0xff0000 : 0xffff00) + "&]! ! ! OVERSPEED ! ! !"); + } + + if(!stirling.hasBlade) { + text.add("&[" + 0xff0000 + "&]Blade missing!"); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java index 54fab6acb..d7191f58b 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; diff --git a/src/main/java/com/hbm/blocks/machine/MachineStirling.java b/src/main/java/com/hbm/blocks/machine/MachineStirling.java index aaab916fa..800b7f361 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStirling.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStirling.java @@ -78,8 +78,9 @@ public class MachineStirling extends BlockDummyable implements ILookOverlay, ITo return false; TileEntityStirling stirling = (TileEntityStirling)world.getTileEntity(pos[0], pos[1], pos[2]); + int meta = stirling.getGeatMeta(); - if(!stirling.hasCog && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gear_large) { + if(!stirling.hasCog && player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.gear_large && player.getHeldItem().getItemDamage() == meta) { player.getHeldItem().stackSize--; stirling.hasCog = true; stirling.markDirty(); @@ -155,20 +156,21 @@ public class MachineStirling extends BlockDummyable implements ILookOverlay, ITo return; TileEntityStirling stirling = (TileEntityStirling) te; + int maxHeat = stirling.maxHeat(); List text = new ArrayList(); text.add(stirling.heat + "TU/t"); text.add((stirling.hasCog ? stirling.powerBuffer : 0) + "HE/t"); - double percent = (double) stirling.heat / 300D; + double percent = (double) stirling.heat / (double) maxHeat; int color = ((int) (0xFF - 0xFF * percent)) << 16 | ((int)(0xFF * percent) << 8); if(percent > 1D) color = 0xff0000; - text.add("&[" + color + "&]" + ((stirling.heat * 1000 / 300) / 10D) + "%"); + text.add("&[" + color + "&]" + ((stirling.heat * 1000 / maxHeat) / 10D) + "%"); - if(stirling.heat > 300) { + if(stirling.heat > maxHeat) { text.add("&[" + (BobMathUtil.getBlink() ? 0xff0000 : 0xffff00) + "&]! ! ! OVERSPEED ! ! !"); } diff --git a/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java new file mode 100644 index 000000000..9e1dd5283 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineTeleanchor.java @@ -0,0 +1,32 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockBase; +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.util.IIcon; + +public class MachineTeleanchor extends BlockBase { + + @SideOnly(Side.CLIENT) private IIcon iconTop; + + public MachineTeleanchor() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":tele_anchor_top"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":tele_anchor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return side == 1 ? this.iconTop : this.blockIcon; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java b/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java index 645f3fe18..ac7db1bec 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTeleporter.java @@ -22,9 +22,8 @@ import net.minecraft.world.World; public class MachineTeleporter extends BlockContainer { - @SideOnly(Side.CLIENT) - private IIcon iconTop; - private IIcon iconBottom; + @SideOnly(Side.CLIENT) private IIcon iconTop; + @SideOnly(Side.CLIENT) private IIcon iconBottom; @Override @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/blocks/machine/MachineTurbine.java b/src/main/java/com/hbm/blocks/machine/MachineTurbine.java index 6a1c25eae..a28b911f9 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTurbine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTurbine.java @@ -1,7 +1,9 @@ package com.hbm.blocks.machine; +import java.util.List; import java.util.Random; +import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -23,7 +25,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class MachineTurbine extends BlockContainer { +public class MachineTurbine extends BlockContainer implements ITooltipProvider { private final Random field_149933_a = new Random(); @SideOnly(Side.CLIENT) @@ -123,4 +125,8 @@ public class MachineTurbine extends BlockContainer { super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java index c7da8fe6c..f84d206df 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java +++ b/src/main/java/com/hbm/blocks/machine/MachineTurbofan.java @@ -7,7 +7,7 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandler; import com.hbm.interfaces.IMultiblock; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityDummy; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java index a1a99bc8d..ebed34c7b 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ILookOverlay; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.rbmk.TileEntityHeatex; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKHeater; diff --git a/src/main/java/com/hbm/blocks/network/BlockCable.java b/src/main/java/com/hbm/blocks/network/BlockCable.java index ffc7c7f36..92fc65684 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCable.java +++ b/src/main/java/com/hbm/blocks/network/BlockCable.java @@ -1,7 +1,6 @@ package com.hbm.blocks.network; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.test.TestConductor; import com.hbm.lib.Library; import com.hbm.tileentity.network.TileEntityCableBaseNT; @@ -23,7 +22,8 @@ public class BlockCable extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityCableBaseNT(); } - + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDClassic = RenderingRegistry.getNextAvailableRenderId(); @Override @@ -32,7 +32,7 @@ public class BlockCable extends BlockContainer { if(this == ModBlocks.red_cable_classic) return renderIDClassic; - return TestConductor.renderID; + return renderID; } @Override diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyor.java b/src/main/java/com/hbm/blocks/network/BlockConveyor.java index b4e6afad0..eb22da046 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyor.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyor.java @@ -1,157 +1,8 @@ package com.hbm.blocks.network; -import com.hbm.entity.item.EntityMovingItem; -import com.hbm.lib.RefStrings; - -import api.hbm.conveyor.IConveyorBelt; -import cpw.mods.fml.client.registry.RenderingRegistry; -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.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class BlockConveyor extends Block implements IConveyorBelt { - - @SideOnly(Side.CLIENT) - protected IIcon sideIcon; +public class BlockConveyor extends BlockConveyorBendable { public BlockConveyor() { - super(Material.iron); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - super.registerBlockIcons(iconRegister); - this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int metadata) { - - if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) - return this.sideIcon; - if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) - return this.sideIcon; - - return super.getIcon(side, metadata); - } - - @Override - public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { - - ForgeDirection dir = getTravelDirection(world, x, y, z, itemPos, speed); - //snapping point - Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); - //snapping point + speed - Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); - //delta to get to that point - Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); - double len = motion.lengthVector(); - //the effective destination towards "dest" after taking speed into consideration - Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); - return ret; - } - - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { - return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - } - - @Override - public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); - - itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); - itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); - - double posX = x + 0.5; - double posZ = z + 0.5; - - if(dir.offsetX != 0) { - posX = itemPos.xCoord; - } - if(dir.offsetZ != 0) { - posZ = itemPos.zCoord; - } - - return Vec3.createVectorHelper(posX, y + 0.25, posZ); - } - - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { - - if(!world.isRemote) { - - if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { - - EntityMovingItem item = new EntityMovingItem(world); - item.setItemStack(((EntityItem) entity).getEntityItem().copy()); - Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); - Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); - item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); - world.spawnEntityInWorld(item); - - entity.setDead(); - } - } - } - - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - if(i == 1) { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } + super(); } } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java new file mode 100644 index 000000000..66ade2dda --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorBase.java @@ -0,0 +1,157 @@ +package com.hbm.blocks.network; + +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; + +import api.hbm.conveyor.IConveyorBelt; +import cpw.mods.fml.client.registry.RenderingRegistry; +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.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class BlockConveyorBase extends Block implements IConveyorBelt { + + @SideOnly(Side.CLIENT) + protected IIcon sideIcon; + + public BlockConveyorBase() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + return super.getIcon(side, metadata); + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + //snapping point + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + //snapping point + speed + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); + //delta to get to that point + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + //the effective destination towards "dest" after taking speed into consideration + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; + } + + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { + return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); + + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + + double posX = x + 0.5; + double posZ = z + 0.5; + + if(dir.offsetX != 0) { + posX = itemPos.xCoord; + } + if(dir.offsetZ != 0) { + posZ = itemPos.zCoord; + } + + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + + if(!world.isRemote) { + + if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { + + EntityMovingItem item = new EntityMovingItem(world); + item.setItemStack(((EntityItem) entity).getEntityItem().copy()); + Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); + item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); + world.spawnEntityInWorld(item); + + entity.setDead(); + } + } + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if(i == 0) { + world.setBlockMetadataWithNotify(x, y, z, 2, 2); + } + if(i == 1) { + world.setBlockMetadataWithNotify(x, y, z, 5, 2); + } + if(i == 2) { + world.setBlockMetadataWithNotify(x, y, z, 3, 2); + } + if(i == 3) { + world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java b/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java new file mode 100644 index 000000000..201a6432a --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorBendable.java @@ -0,0 +1,112 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class BlockConveyorBendable extends BlockConveyorBase implements IToolable { + + @SideOnly(Side.CLIENT) protected IIcon curveLeft; + @SideOnly(Side.CLIENT) protected IIcon curveRight; + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.curveLeft = iconRegister.registerIcon(this.getTextureName() + "_curve_left"); + this.curveRight = iconRegister.registerIcon(this.getTextureName() + "_curve_right"); + } + + protected int getPathDirection(int meta) { + + if(meta >= 6 && meta <= 9) return 1; + if(meta >= 10 && meta <= 13) return 2; + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + int dir = getPathDirection(metadata); + + if(dir > 0 && side > 1) + return this.sideIcon; + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + if(dir == 1) return this.curveLeft; + if(dir == 2) return this.curveRight; + + return super.getIcon(side, metadata); + } + + @Override + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { + + int meta = world.getBlockMetadata(x, y, z); + int dir = getPathDirection(meta); + meta -= dir * 4; + + ForgeDirection primary = ForgeDirection.getOrientation(meta); + + if(dir > 0) { + dir--; + double ix = x + 0.5; + double iz = z + 0.5; + ForgeDirection secondary = primary.getRotation(ForgeDirection.UP); + + ix -= -primary.offsetX * 0.5 + secondary.offsetX * (0.5 - dir); + iz -= -primary.offsetZ * 0.5 + secondary.offsetZ * (0.5 - dir); + + double dX = Math.abs(itemPos.xCoord - ix); + double dZ = Math.abs(itemPos.zCoord - iz); + + if(dX + dZ >= 1) { + + if(dir == 0) + return secondary.getOpposite(); + else + return secondary; + } + } + + return primary; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) + return false; + int meta = world.getBlockMetadata(x, y, z); + int newMeta = meta; + + int dir = getPathDirection(meta); + + if(!player.isSneaking()) { + if(meta > 9) meta -= 8; + if(meta > 5) meta -= 4; + newMeta = ForgeDirection.getOrientation(meta).getRotation(ForgeDirection.UP).ordinal() + dir * 4; + } else { + + if(dir < 2) + newMeta += 4; + else + newMeta -= 8; + } + + world.setBlockMetadataWithNotify(x, y, z, newMeta, 3); + + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java b/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java index 9f55eed3e..e61ff37f0 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorChute.java @@ -12,7 +12,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorChute extends BlockConveyor { +public class BlockConveyorChute extends BlockConveyorBase { @Override public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { @@ -28,7 +28,7 @@ public class BlockConveyorChute extends BlockConveyor { } @Override - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { Block below = world.getBlock(x, y - 1, z); if(below instanceof IConveyorBelt || below instanceof IEnterableBlock || itemPos.yCoord > y + 0.25) { diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java new file mode 100644 index 000000000..04c9052a4 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorClassic.java @@ -0,0 +1,154 @@ +package com.hbm.blocks.network; + +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; + +import api.hbm.conveyor.IConveyorBelt; +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.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockConveyorClassic extends Block implements IConveyorBelt { + + @SideOnly(Side.CLIENT) + protected IIcon sideIcon; + + public BlockConveyorClassic() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + + if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) + return this.sideIcon; + if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) + return this.sideIcon; + + return super.getIcon(side, metadata); + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + + ForgeDirection dir = getTravelDirection(world, x, y, z, itemPos, speed); + //snapping point + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + //snapping point + speed + Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); + //delta to get to that point + Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); + double len = motion.lengthVector(); + //the effective destination towards "dest" after taking speed into consideration + Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); + return ret; + } + + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + + double posX = x + 0.5; + double posZ = z + 0.5; + + if(dir.offsetX != 0) { + posX = itemPos.xCoord; + } + if(dir.offsetZ != 0) { + posZ = itemPos.zCoord; + } + + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + + if(!world.isRemote) { + + if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { + + EntityMovingItem item = new EntityMovingItem(world); + item.setItemStack(((EntityItem) entity).getEntityItem().copy()); + Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); + item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); + world.spawnEntityInWorld(item); + + entity.setDead(); + } + } + } + + @Override + public int getRenderType() { + return BlockConveyorBase.renderID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if(i == 0) { + world.setBlockMetadataWithNotify(x, y, z, 2, 2); + } + if(i == 1) { + world.setBlockMetadataWithNotify(x, y, z, 5, 2); + } + if(i == 2) { + world.setBlockMetadataWithNotify(x, y, z, 3, 2); + } + if(i == 3) { + world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java b/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java index b83cb95cb..b81e237b6 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorDouble.java @@ -5,12 +5,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorDouble extends BlockConveyor { +public class BlockConveyorDouble extends BlockConveyorBendable { @Override public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java index 6bea6da24..a2dfa5de1 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorLift.java @@ -1,6 +1,7 @@ package com.hbm.blocks.network; import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -10,13 +11,13 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorLift extends BlockConveyor { +public class BlockConveyorLift extends BlockConveyorBase { @Override - public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos, double speed) { + public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(!top) { return ForgeDirection.DOWN; @@ -29,7 +30,7 @@ public class BlockConveyorLift extends BlockConveyor { public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(!top) { return Vec3.createVectorHelper(x + 0.5, itemPos.yCoord, z + 0.5); @@ -42,7 +43,7 @@ public class BlockConveyorLift extends BlockConveyor { public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(top) this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); @@ -54,7 +55,7 @@ public class BlockConveyorLift extends BlockConveyor { public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { boolean bottom = !(world.getBlock(x, y - 1, z) instanceof IConveyorBelt); - boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom; + boolean top = !(world.getBlock(x, y + 1, z) instanceof IConveyorBelt) && !bottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); if(top) return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.5, z + 1); diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java b/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java index 06327a90d..69ed40980 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyorTriple.java @@ -5,12 +5,12 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyorTriple extends BlockConveyor { +public class BlockConveyorTriple extends BlockConveyorBendable { @Override public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { - ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 25da7bb68..1e8ea027f 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -110,7 +110,7 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl TileEntityDiode diode = (TileEntityDiode) te; List text = new ArrayList(); - text.add("Max.: " + BobMathUtil.getShortNumber(diode.getMaxPower()) + "HE/pulse"); + text.add("Max.: " + BobMathUtil.getShortNumber(diode.getMaxPower()) + "HE/t"); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -168,6 +168,9 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl private boolean recursionBrake = false; private long subBuffer; + private long contingent = 0; + private long lastTransfer = 0; + private int pulses = 0; @Override public long transferPower(long power) { @@ -175,9 +178,20 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl if(recursionBrake) return power; + pulses++; + + if(lastTransfer != worldObj.getTotalWorldTime()) { + lastTransfer = worldObj.getTotalWorldTime(); + contingent = getMaxPower(); + pulses = 0; + } + + if(contingent <= 0 || pulses > 10) + return power; + //this part turns "maxPower" from a glorified transfer weight into an actual transfer cap - long overShoot = Math.max(0, power - getMaxPower()); - power = Math.min(power, getMaxPower()); + long overShoot = Math.max(0, power - contingent); + power = Math.min(power, contingent); recursionBrake = true; this.subBuffer = power; @@ -186,6 +200,9 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); long ret = this.subBuffer; + long sent = power - ret; + contingent -= sent; + this.subBuffer = 0; recursionBrake = false; diff --git a/src/main/java/com/hbm/blocks/network/CraneRouter.java b/src/main/java/com/hbm/blocks/network/CraneRouter.java new file mode 100644 index 000000000..06dc1769f --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/CraneRouter.java @@ -0,0 +1,204 @@ +package com.hbm.blocks.network; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.entity.item.EntityMovingItem; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IConveyorPackage; +import api.hbm.conveyor.IEnterableBlock; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnterableBlock { + + @SideOnly(Side.CLIENT) protected IIcon iconOverlay; + + public CraneRouter() { + super(Material.iron); + this.setBlockTextureName(RefStrings.MODID + ":crane_in"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityCraneRouter(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconOverlay = iconRegister.registerIcon(RefStrings.MODID + ":crane_router_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return RenderBlockMultipass.currentPass == 0 ? this.blockIcon : this.iconOverlay; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } else { + return false; + } + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + + if(RenderBlockMultipass.currentPass == 0) + return 0xffffff; + + switch(RenderBlockMultipass.currentPass - 1) { + case 0: return 0xff0000; + case 1: return 0xff8000; + case 2: return 0xffff00; + case 3: return 0x00ff00; + case 4: return 0x0080ff; + case 5: return 0x8000ff; + default: return 0xffffff; + } + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + /* + * arg arg arg spongeboy me bob i have fooled the system that only allows one tint per pass by disabling all rendered sides except one and rendering multiple passes arg arg arg + */ + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + + if(RenderBlockMultipass.currentPass == 0) + return true; + + return side == RenderBlockMultipass.currentPass - 1; + } + + @Override + public int getPasses() { + return 7; + } + + @Override + public boolean canItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + return true; + } + + @Override + public void onItemEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + TileEntityCraneRouter router = (TileEntityCraneRouter) world.getTileEntity(x, y, z); + ItemStack stack = entity.getItemStack(); + + List validDirs = new ArrayList(); + + //check filters for all sides + for(int side = 0; side < 6; side++) { + + ModulePatternMatcher matcher = router.patterns[side]; + int mode = router.modes[side]; + + //if the side is disabled or wildcard, skip + if(mode == router.MODE_NONE || mode == router.MODE_WILDCARD) + continue; + + boolean matchesFilter = false; + + for(int slot = 0; slot < 5; slot++) { + ItemStack filter = router.slots[side * 5 + slot]; + + if(filter == null) + continue; + + //the filter kicks in so long as one entry matches + if(matcher.isValidForFilter(filter, slot, stack)) { + matchesFilter = true; + break; + } + } + + //add dir if matches with whitelist on or doesn't match with blacklist on + if((mode == router.MODE_WHITELIST && matchesFilter) || (mode == router.MODE_BLACKLIST && !matchesFilter)) { + validDirs.add(ForgeDirection.getOrientation(side)); + } + } + + //if no valid dirs have yet been found, use wildcard + if(validDirs.isEmpty()) { + for(int side = 0; side < 6; side++) { + if(router.modes[side] == router.MODE_WILDCARD) { + validDirs.add(ForgeDirection.getOrientation(side)); + } + } + } + + if(validDirs.isEmpty()) { + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + return; + } + + int i = world.rand.nextInt(validDirs.size()); + sendOnRoute(world, x, y, z, entity, validDirs.get(i)); + } + + protected void sendOnRoute(World world, int x, int y, int z, IConveyorItem item, ForgeDirection dir) { + + IConveyorBelt belt = null; + Block block = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + + if(block instanceof IConveyorBelt) { + belt = (IConveyorBelt) block; + } + + if(belt != null) { + EntityMovingItem moving = new EntityMovingItem(world); + Vec3 pos = Vec3.createVectorHelper(x + 0.5 + dir.offsetX * 0.55, y + 0.5 + dir.offsetY * 0.55, z + 0.5 + dir.offsetZ * 0.55); + Vec3 snap = belt.getClosestSnappingPosition(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, pos); + moving.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + moving.setItemStack(item.getItemStack()); + world.spawnEntityInWorld(moving); + } else { + world.spawnEntityInWorld(new EntityItem(world, x + 0.5 + dir.offsetX * 0.55, y + 0.5 + dir.offsetY * 0.55, z + 0.5 + dir.offsetZ * 0.55, item.getItemStack())); + } + } + + @Override + public boolean canPackageEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorPackage entity) { + return false; + } + + @Override + public void onPackageEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorPackage entity) { } +} diff --git a/src/main/java/com/hbm/blocks/siege/SiegeShield.java b/src/main/java/com/hbm/blocks/siege/SiegeShield.java index 32bdf2827..3080671bb 100644 --- a/src/main/java/com/hbm/blocks/siege/SiegeShield.java +++ b/src/main/java/com/hbm/blocks/siege/SiegeShield.java @@ -19,7 +19,7 @@ public class SiegeShield extends SiegeBase { @Override public void updateTick(World world, int x, int y, int z, Random rand) { - if(SiegeOrchestrator.siegeMobCount > SiegeOrchestrator.getExpansionThreshold(world) || !SiegeOrchestrator.enableBaseSpawning(world)) + if(SiegeOrchestrator.siegeMobCount > SiegeOrchestrator.getExpansionThreshold(world) || !SiegeOrchestrator.enableBaseSpawning(world) || !SiegeOrchestrator.siegeEnabled(world)) return; int succ = 0; diff --git a/src/main/java/com/hbm/blocks/test/TestBB.java b/src/main/java/com/hbm/blocks/test/TestBB.java deleted file mode 100644 index 573cc0804..000000000 --- a/src/main/java/com/hbm/blocks/test/TestBB.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.blocks.test; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; - -public class TestBB extends Block { - - public TestBB(Material mat) { - super(mat); - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestConductor.java b/src/main/java/com/hbm/blocks/test/TestConductor.java deleted file mode 100644 index 45c2684b0..000000000 --- a/src/main/java/com/hbm/blocks/test/TestConductor.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hbm.blocks.test; - -import com.hbm.interfaces.Untested; -import com.hbm.tileentity.network.TileEntityCableBaseNT; - -import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -/** - * Powered by satan energy! - * @author hbm - */ -@Untested -public class TestConductor extends BlockContainer { - - public TestConductor(Material p_i45386_1_) { - super(p_i45386_1_); - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityCableBaseNT(); - } - - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - - @Override - public int getRenderType() { - return renderID; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestContainer.java b/src/main/java/com/hbm/blocks/test/TestContainer.java deleted file mode 100644 index 304beec6d..000000000 --- a/src/main/java/com/hbm/blocks/test/TestContainer.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.hbm.blocks.test; - -import static net.minecraftforge.common.util.ForgeDirection.DOWN; - -import java.util.Iterator; -import java.util.Random; - -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.deco.TileEntityTestContainer; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockChest; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.passive.EntityOcelot; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryLargeChest; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class TestContainer extends BlockChest { - - public TestContainer(int p_i45397_1_) { - super(p_i45397_1_); - } - - private final Random field_149955_b = new Random(); - - //Aktiviert durch: Platzieren. Bewirkt: Rotation des Blockes in Blickrichtung - @Override - public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_) - { - Block block = p_149689_1_.getBlock(p_149689_2_, p_149689_3_, p_149689_4_ - 1); - Block block1 = p_149689_1_.getBlock(p_149689_2_, p_149689_3_, p_149689_4_ + 1); - Block block2 = p_149689_1_.getBlock(p_149689_2_ - 1, p_149689_3_, p_149689_4_); - Block block3 = p_149689_1_.getBlock(p_149689_2_ + 1, p_149689_3_, p_149689_4_); - byte b0 = 0; - int l = MathHelper.floor_double(p_149689_5_.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if (l == 0) - { - b0 = 2; - } - - if (l == 1) - { - b0 = 5; - } - - if (l == 2) - { - b0 = 3; - } - - if (l == 3) - { - b0 = 4; - } - - if (block != this && block1 != this && block2 != this && block3 != this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - else - { - if ((block == this || block1 == this) && (b0 == 4 || b0 == 5)) - { - if (block == this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_ - 1, b0, 3); - } - else - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_ + 1, b0, 3); - } - - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - - if ((block2 == this || block3 == this) && (b0 == 2 || b0 == 3)) - { - if (block2 == this) - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_ - 1, p_149689_3_, p_149689_4_, b0, 3); - } - else - { - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_ + 1, p_149689_3_, p_149689_4_, b0, 3); - } - - p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, b0, 3); - } - } - - if (p_149689_6_.hasDisplayName()) - { - ((TileEntityTestContainer)p_149689_1_.getTileEntity(p_149689_2_, p_149689_3_, p_149689_4_)).func_145976_a(p_149689_6_.getDisplayName()); - } - } - - //Aktiviert durch: Blockupdate. Bewirkt: Verbinden zweier Kisten - @Override - public void onNeighborBlockChange(World p_149695_1_, int p_149695_2_, int p_149695_3_, int p_149695_4_, Block p_149695_5_) - { - super.onNeighborBlockChange(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, p_149695_5_); - TileEntityTestContainer tileentitychest = (TileEntityTestContainer)p_149695_1_.getTileEntity(p_149695_2_, p_149695_3_, p_149695_4_); - - if (tileentitychest != null) - { - tileentitychest.updateContainingBlockInfo(); - } - } - - //Aktiviert durch: Zerst�rung. Bewirkt: Droppt alle in ihm befindlichen Items - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - TileEntityTestContainer tileentitychest = (TileEntityTestContainer)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if (tileentitychest != null) - { - for (int i1 = 0; i1 < tileentitychest.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentitychest.getStackInSlot(i1); - - if (itemstack != null) - { - float f = this.field_149955_b.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; - EntityItem entityitem; - - for (float f2 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; p_149749_1_.spawnEntityInWorld(entityitem)) - { - int j1 = this.field_149955_b.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149955_b.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149955_b.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149955_b.nextGaussian() * f3; - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - - //Allgemeine Inventarfunktion - @Override - public IInventory func_149951_m(World p_149951_1_, int p_149951_2_, int p_149951_3_, int p_149951_4_) - { - Object object = p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_); - - if (object == null) - { - return null; - } - else if (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_, DOWN)) - { - return null; - } - else if (func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_)) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_ - 1, p_149951_3_, p_149951_4_) == this && (p_149951_1_.isSideSolid(p_149951_2_ - 1, p_149951_3_ + 1, p_149951_4_, DOWN) || func_149953_o(p_149951_1_, p_149951_2_ - 1, p_149951_3_, p_149951_4_))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_ + 1, p_149951_3_, p_149951_4_) == this && (p_149951_1_.isSideSolid(p_149951_2_ + 1, p_149951_3_ + 1, p_149951_4_, DOWN) || func_149953_o(p_149951_1_, p_149951_2_ + 1, p_149951_3_, p_149951_4_))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ - 1) == this && (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_ - 1, DOWN) || func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_ - 1))) - { - return null; - } - else if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ + 1) == this && (p_149951_1_.isSideSolid(p_149951_2_, p_149951_3_ + 1, p_149951_4_ + 1, DOWN) || func_149953_o(p_149951_1_, p_149951_2_, p_149951_3_, p_149951_4_ + 1))) - { - return null; - } - else - { - if (p_149951_1_.getBlock(p_149951_2_ - 1, p_149951_3_, p_149951_4_) == this) - { - object = new InventoryLargeChest("container.testContainer", (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_ - 1, p_149951_3_, p_149951_4_), (IInventory)object); - } - - if (p_149951_1_.getBlock(p_149951_2_ + 1, p_149951_3_, p_149951_4_) == this) - { - object = new InventoryLargeChest("container.testContainer", (IInventory)object, (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_ + 1, p_149951_3_, p_149951_4_)); - } - - if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ - 1) == this) - { - object = new InventoryLargeChest("container.testContainer", (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_ - 1), (IInventory)object); - } - - if (p_149951_1_.getBlock(p_149951_2_, p_149951_3_, p_149951_4_ + 1) == this) - { - object = new InventoryLargeChest("container.testContainer", (IInventory)object, (TileEntityTestContainer)p_149951_1_.getTileEntity(p_149951_2_, p_149951_3_, p_149951_4_ + 1)); - } - - return (IInventory)object; - } - } - - //Bewirkt, dass sich Katzen draufsetzen - private static boolean func_149953_o(World p_149953_0_, int p_149953_1_, int p_149953_2_, int p_149953_3_) - { - Iterator iterator = p_149953_0_.getEntitiesWithinAABB(EntityOcelot.class, AxisAlignedBB.getBoundingBox(p_149953_1_, p_149953_2_ + 1, p_149953_3_, p_149953_1_ + 1, p_149953_2_ + 2, p_149953_3_ + 1)).iterator(); - EntityOcelot entityocelot; - - do - { - if (!iterator.hasNext()) - { - return false; - } - - Entity entity = (Entity)iterator.next(); - entityocelot = (EntityOcelot)entity; - } - while (!entityocelot.isSitting()); - - return true; - } - - //Erzeugt ein neues Tileentity - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) - { - TileEntityTestContainer tileentitychest = new TileEntityTestContainer(); - return tileentitychest; - } - - //Registriert das Inventaricon - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.blockIcon = p_149651_1_.registerIcon(RefStrings.MODID + ":test_container"); - } -} diff --git a/src/main/java/com/hbm/blocks/test/TestEventTester.java b/src/main/java/com/hbm/blocks/test/TestEventTester.java index 83bbe5a63..04e66efa2 100644 --- a/src/main/java/com/hbm/blocks/test/TestEventTester.java +++ b/src/main/java/com/hbm/blocks/test/TestEventTester.java @@ -8,6 +8,9 @@ import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; import com.hbm.entity.effect.EntityNukeCloudSmall; +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.enchantment.EnchantmentProtection; @@ -395,10 +398,8 @@ public class TestEventTester extends Block { ex.doExplosionB(false); }*/ - if(!worldObj.isRemote) { - - worldObj.spawnEntityInWorld(EntityNukeCloudSmall.statFacBale(worldObj, par2, par3 + 5, par4, 100, 0)); - } + + FMLNetworkHandler.openGui(par5EntityPlayer, MainRegistry.instance, -1, par1World, par2, par3, par4); return true; } diff --git a/src/main/java/com/hbm/blocks/test/TestRotationTester.java b/src/main/java/com/hbm/blocks/test/TestRotationTester.java deleted file mode 100644 index 76e29c5b3..000000000 --- a/src/main/java/com/hbm/blocks/test/TestRotationTester.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.hbm.blocks.test; - -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.deco.TileEntityRotationTester; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class TestRotationTester extends BlockContainer { - - public TestRotationTester(Material p_i45394_1_) { - super(p_i45394_1_); - } - - @Override - public int getRenderType(){ - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - - @Override - public TileEntity createNewTileEntity(World var1, int var2) { - return new TileEntityRotationTester(); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconregister) { - this.blockIcon = iconregister.registerIcon(RefStrings.MODID + ":test_render"); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - } - -} diff --git a/src/main/java/com/hbm/blocks/test/TestTicker.java b/src/main/java/com/hbm/blocks/test/TestTicker.java deleted file mode 100644 index c2e434ae8..000000000 --- a/src/main/java/com/hbm/blocks/test/TestTicker.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.hbm.blocks.test; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.world.World; - -public class TestTicker extends Block { - - public TestTicker(Material p_i45394_1_) { - super(p_i45394_1_); - this.setTickRandomly(true); - } - - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - - if(GeneralConfig.enableVirus) { - if(world.getBlock(x + 1, y, z) != ModBlocks.test_ticker) { - world.setBlock(x + 1, y, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y + 1, z) != ModBlocks.test_ticker) { - world.setBlock(x, y + 1, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y, z + 1) != ModBlocks.test_ticker) { - world.setBlock(x, y, z + 1, ModBlocks.test_ticker); - } - - if(world.getBlock(x - 1, y, z) != ModBlocks.test_ticker) { - world.setBlock(x - 1, y, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y - 1, z) != ModBlocks.test_ticker) { - world.setBlock(x, y - 1, z, ModBlocks.test_ticker); - } - - if(world.getBlock(x, y, z - 1) != ModBlocks.test_ticker) { - world.setBlock(x, y, z - 1, ModBlocks.test_ticker); - } - } - } -} diff --git a/src/main/java/com/hbm/blocks/turret/TurretArty.java b/src/main/java/com/hbm/blocks/turret/TurretArty.java index b23775fa1..cf4fef31e 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretArty.java +++ b/src/main/java/com/hbm/blocks/turret/TurretArty.java @@ -20,8 +20,7 @@ public class TurretArty extends BlockDummyable { if(meta >= 12) return new TileEntityTurretArty(); - - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretBrandon.java b/src/main/java/com/hbm/blocks/turret/TurretBrandon.java index ace62a7bb..173bd2a83 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretBrandon.java +++ b/src/main/java/com/hbm/blocks/turret/TurretBrandon.java @@ -22,7 +22,7 @@ public class TurretBrandon extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretBrandon(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretChekhov.java b/src/main/java/com/hbm/blocks/turret/TurretChekhov.java index 3ccb43269..5bc73f004 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretChekhov.java +++ b/src/main/java/com/hbm/blocks/turret/TurretChekhov.java @@ -26,10 +26,7 @@ public class TurretChekhov extends BlockDummyable { if(meta >= 12) return new TileEntityTurretChekhov(); - if(meta >= 6) - return new TileEntityProxyCombo(true, true, false); - - return null; + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretFriendly.java b/src/main/java/com/hbm/blocks/turret/TurretFriendly.java index 6a50de4fe..2918d4826 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretFriendly.java +++ b/src/main/java/com/hbm/blocks/turret/TurretFriendly.java @@ -25,7 +25,7 @@ public class TurretFriendly extends BlockDummyable { if(meta >= 12) return new TileEntityTurretFriendly(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretFritz.java b/src/main/java/com/hbm/blocks/turret/TurretFritz.java index 1a35c02eb..e3686656a 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretFritz.java +++ b/src/main/java/com/hbm/blocks/turret/TurretFritz.java @@ -22,7 +22,7 @@ public class TurretFritz extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretFritz(); - return new TileEntityProxyCombo(true, true, true); + return new TileEntityProxyCombo().inventory().power().fluid(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java b/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java index f75837099..18ea44e7a 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java +++ b/src/main/java/com/hbm/blocks/turret/TurretHIMARS.java @@ -20,8 +20,7 @@ public class TurretHIMARS extends BlockDummyable { if(meta >= 12) return new TileEntityTurretHIMARS(); - - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretHoward.java b/src/main/java/com/hbm/blocks/turret/TurretHoward.java index 685fcd339..fd26fb693 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretHoward.java +++ b/src/main/java/com/hbm/blocks/turret/TurretHoward.java @@ -25,7 +25,7 @@ public class TurretHoward extends BlockDummyable { if(meta >= 12) return new TileEntityTurretHoward(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretJeremy.java b/src/main/java/com/hbm/blocks/turret/TurretJeremy.java index 94a5f5a69..167164d16 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretJeremy.java +++ b/src/main/java/com/hbm/blocks/turret/TurretJeremy.java @@ -25,7 +25,7 @@ public class TurretJeremy extends BlockDummyable { if(meta >= 12) return new TileEntityTurretJeremy(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java b/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java index 33937ce33..26b36167d 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java +++ b/src/main/java/com/hbm/blocks/turret/TurretMaxwell.java @@ -22,7 +22,7 @@ public class TurretMaxwell extends TurretBaseNT { if(meta >= 12) return new TileEntityTurretMaxwell(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/blocks/turret/TurretRichard.java b/src/main/java/com/hbm/blocks/turret/TurretRichard.java index b3cbd0715..5526d06b2 100644 --- a/src/main/java/com/hbm/blocks/turret/TurretRichard.java +++ b/src/main/java/com/hbm/blocks/turret/TurretRichard.java @@ -25,7 +25,7 @@ public class TurretRichard extends BlockDummyable { if(meta >= 12) return new TileEntityTurretRichard(); - return new TileEntityProxyCombo(true, true, false); + return new TileEntityProxyCombo().inventory().power(); } @Override diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java new file mode 100644 index 000000000..ea28801d5 --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -0,0 +1,37 @@ +package com.hbm.commands; + +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.util.ChatBuilder; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public class CommandReloadRecipes extends CommandBase { + + @Override + public String getCommandName() { + return "ntmreload"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmreload"; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + try { + SerializableRecipe.initialize(); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reload complete :)")); + } catch(Exception ex) { + sender.addChatMessage(ChatBuilder.start("----------------------------------").color(EnumChatFormatting.GRAY).flush()); + sender.addChatMessage(ChatBuilder.start("An error has occoured during loading, consult the log for details.").color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start(ex.getLocalizedMessage()).color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start(ex.getStackTrace()[0].toString()).color(EnumChatFormatting.RED).flush()); + sender.addChatMessage(ChatBuilder.start("----------------------------------").color(EnumChatFormatting.GRAY).flush()); + throw ex; + } + } +} diff --git a/src/main/java/com/hbm/config/CommonConfig.java b/src/main/java/com/hbm/config/CommonConfig.java index 2cbbab121..57495b68a 100644 --- a/src/main/java/com/hbm/config/CommonConfig.java +++ b/src/main/java/com/hbm/config/CommonConfig.java @@ -21,6 +21,7 @@ public class CommonConfig { public static final String CATEGORY_MOBS = "12_mobs"; public static final String CATEGORY_RADIATION = "13_radiation"; public static final String CATEGORY_HAZARD = "14_hazard"; + public static final String CATEGORY_STRUCTURES = "15_structures"; public static final String CATEGORY_528 = "528"; public static final String CATEGORY_LBSM = "LESS BULLSHIT MODE"; diff --git a/src/main/java/com/hbm/config/FalloutConfigJSON.java b/src/main/java/com/hbm/config/FalloutConfigJSON.java index 869138164..4232fc527 100644 --- a/src/main/java/com/hbm/config/FalloutConfigJSON.java +++ b/src/main/java/com/hbm/config/FalloutConfigJSON.java @@ -104,10 +104,6 @@ public class FalloutConfigJSON { entries.add(new FalloutEntry() .mB(Blocks.mossy_cobblestone) .prim(new Triplet(Blocks.coal_ore, 0, 1))); - entries.add(new FalloutEntry() - .mB(Blocks.coal_ore) - .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) - .c(0.2)); entries.add(new FalloutEntry() .mB(Blocks.coal_ore) .prim(new Triplet(Blocks.diamond_ore, 0, 3), new Triplet(Blocks.emerald_ore, 0, 2)) diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 44c05fa3c..ade474aa7 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -4,6 +4,8 @@ import net.minecraftforge.common.config.Configuration; public class GeneralConfig { + public static boolean enableThermosPreventer = true; + public static boolean enableDebugMode = true; public static boolean enableMycelium = false; public static boolean enablePlutoniumOre = false; @@ -12,7 +14,6 @@ public class GeneralConfig { public static boolean enableMines = true; public static boolean enableRad = true; public static boolean enableNITAN = true; - public static boolean enableNukeClouds = true; public static boolean enableBomberShortMode = false; public static boolean enableVaults = true; public static boolean enableCataclysm = false; @@ -25,6 +26,7 @@ public class GeneralConfig { public static boolean enableRenderDistCheck = true; public static boolean enableCustomDashKeybind = false; public static boolean enableReEval = true; + public static boolean enableSilentCompStackErrors = true; public static int hintPos = 0; public static boolean enable528 = false; @@ -53,29 +55,30 @@ public class GeneralConfig { public static void loadFromConfig(Configuration config) { final String CATEGORY_GENERAL = CommonConfig.CATEGORY_GENERAL; - enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false).getBoolean(false); - enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false).getBoolean(false); - enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false).getBoolean(false); - enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true).getBoolean(true); - enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true).getBoolean(true); - enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true).getBoolean(true); - enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true).getBoolean(true); - enableNITAN = config.get(CATEGORY_GENERAL, "1.07_enableNITANChestSpawn", true).getBoolean(true); - enableNukeClouds = config.get(CATEGORY_GENERAL, "1.08_enableMushroomClouds", true).getBoolean(true); - enableBomberShortMode = config.get(CATEGORY_GENERAL, "1.14_enableBomberShortMode", false).getBoolean(false); - enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true).getBoolean(true); - enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false).getBoolean(false); - enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false).getBoolean(false); - enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false).getBoolean(false); - enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true).getBoolean(true); - enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false).getBoolean(false); - enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true).getBoolean(true); - enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false).getBoolean(false); - enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true).getBoolean(true); - enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false).getBoolean(false); - enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true).getBoolean(true); + enableThermosPreventer = config.get(CATEGORY_GENERAL, "0.00_crashOnThermos", true, "When set to true, will prevent the mod to launch on Thermos servers. Only disable this if you understand what \"tileentities.yml\" is, and how it severely cripples the mod.").getBoolean(true); + enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); + enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); + enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); + enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true, "Allows structures and dungeons to spawn").getBoolean(true); + enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true, "Allows NTM ores to generate in modded dimensions").getBoolean(true); + enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true, "Allows landmines to generate").getBoolean(true); + enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true, "Allows radiation hotspots to generate").getBoolean(true); + enableNITAN = config.get(CATEGORY_GENERAL, "1.07_enableNITANChestSpawn", true, "Allows chests to spawn at specific coordinates full of powders").getBoolean(true); + enableBomberShortMode = config.get(CATEGORY_GENERAL, "1.14_enableBomberShortMode", false, "Has bomber planes spawn in closer to the target for use with smaller render distances").getBoolean(false); + enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true, "Allows locked safes to spawn").getBoolean(true); + enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false, "Causes satellites to fall whenever a mob dies").getBoolean(false); + enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false, "Logs uses of the detonator, nuclear explosions, missile launches, grenades, etc.").getBoolean(false); + enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false, "Allows tainted mobs to spread taint").getBoolean(false); + enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true, "Prevents new system guns to be fired").getBoolean(true); + enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false, "Allows virus blocks to spread").getBoolean(false); + enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true, "Shows custom crosshairs when an NTM gun is being held").getBoolean(true); + enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false, "Enable old reflector oredict name (\"plateDenseLead\") instead of new \"plateTungCar\"").getBoolean(false); + enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true, "Check invalid render distances (over 16, without OptiFine) and fix it").getBoolean(true); + enableCustomDashKeybind = config.get(CATEGORY_GENERAL, "1.26_enableCustomDashKeybind", false, "Enable custom dash keybind instead of shift").getBoolean(false); + enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); + enableSilentCompStackErrors = config.get(CATEGORY_GENERAL, "1.28_enableSilentCompStackErrors", false, "Enabling this will disable log spam created by unregistered items in ComparableStack instances.").getBoolean(false); - hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.27_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); + hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.29_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); final String CATEGORY_528 = CommonConfig.CATEGORY_528; diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java new file mode 100644 index 000000000..2f22d7281 --- /dev/null +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -0,0 +1,37 @@ +package com.hbm.config; + +import com.hbm.main.MainRegistry; + +import net.minecraftforge.common.config.Configuration; + +public class StructureConfig { + + public static boolean enableStructures = true; + + public static int structureMinChunks = 8; + public static int structureMaxChunks = 24; + + public static double lootAmountFactor = 1D; + + public static void loadFromConfig(Configuration config) { + + final String CATEGORY_STRUCTURES = CommonConfig.CATEGORY_STRUCTURES; + enableStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Switch for whether structures using the MapGenStructure system spawn.", true); + + structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8); + structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24); + + lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); + + structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); + structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); + + if(structureMinChunks > structureMaxChunks) { + MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); + MainRegistry.logger.error(String.format("Errored values will default back to %1$d and %2$d respectively, PLEASE REVIEW CONFIGURATION DESCRIPTION BEFORE MEDDLING WITH VALUES!", 8, 24)); + structureMinChunks = 8; + structureMaxChunks = 24; + } + + } +} diff --git a/src/main/java/com/hbm/config/ToolConfig.java b/src/main/java/com/hbm/config/ToolConfig.java index fd03a0fe7..16ffc3216 100644 --- a/src/main/java/com/hbm/config/ToolConfig.java +++ b/src/main/java/com/hbm/config/ToolConfig.java @@ -26,15 +26,15 @@ public class ToolConfig { recursiveStone = CommonConfig.createConfigBool(config, CATEGORY_TOOLS, "11.01_recursionStone", "Determines whether veinminer can break stone", false); recursiveNetherrack = CommonConfig.createConfigBool(config, CATEGORY_TOOLS, "11.02_recursionNetherrack", "Determines whether veinminer can break netherrack", false); - abilityHammer = config.get(CATEGORY_TOOLS, "11.03_hammerAbility", true).getBoolean(true); - abilityVein = config.get(CATEGORY_TOOLS, "11.04_abilityVein", true).getBoolean(true); - abilityLuck = config.get(CATEGORY_TOOLS, "11.05_abilityLuck", true).getBoolean(true); - abilitySilk = config.get(CATEGORY_TOOLS, "11.06_abilitySilk", true).getBoolean(true); - abilityFurnace = config.get(CATEGORY_TOOLS, "11.07_abilityFurnace", true).getBoolean(true); - abilityShredder = config.get(CATEGORY_TOOLS, "11.08_abilityShredder", true).getBoolean(true); - abilityCentrifuge = config.get(CATEGORY_TOOLS, "11.09_abilityCentrifuge", true).getBoolean(true); - abilityCrystallizer = config.get(CATEGORY_TOOLS, "11.10_abilityCrystallizer", true).getBoolean(true); - abilityMercury = config.get(CATEGORY_TOOLS, "11.11_abilityMercury", true).getBoolean(true); - abilityExplosion = config.get(CATEGORY_TOOLS, "11.12_abilityExplosion", true).getBoolean(true); + abilityHammer = config.get(CATEGORY_TOOLS, "11.03_hammerAbility", true, "Allows AoE ability").getBoolean(true); + abilityVein = config.get(CATEGORY_TOOLS, "11.04_abilityVein", true, "Allows veinminer ability").getBoolean(true); + abilityLuck = config.get(CATEGORY_TOOLS, "11.05_abilityLuck", true, "Allow luck (fortune) ability").getBoolean(true); + abilitySilk = config.get(CATEGORY_TOOLS, "11.06_abilitySilk", true, "Allow silk touch ability").getBoolean(true); + abilityFurnace = config.get(CATEGORY_TOOLS, "11.07_abilityFurnace", true, "Allow auto-smelter ability").getBoolean(true); + abilityShredder = config.get(CATEGORY_TOOLS, "11.08_abilityShredder", true, "Allow auto-shredder ability").getBoolean(true); + abilityCentrifuge = config.get(CATEGORY_TOOLS, "11.09_abilityCentrifuge", true, "Allow auto-centrifuge ability").getBoolean(true); + abilityCrystallizer = config.get(CATEGORY_TOOLS, "11.10_abilityCrystallizer", true, "Allow auto-crystallizer ability").getBoolean(true); + abilityMercury = config.get(CATEGORY_TOOLS, "11.11_abilityMercury", true, "Allow mercury touch ability (digging redstone gives mercury)").getBoolean(true); + abilityExplosion = config.get(CATEGORY_TOOLS, "11.12_abilityExplosion", true, "Allow explosion ability").getBoolean(true); } } diff --git a/src/main/java/com/hbm/config/VersatileConfig.java b/src/main/java/com/hbm/config/VersatileConfig.java index 851211b76..eae8519d9 100644 --- a/src/main/java/com/hbm/config/VersatileConfig.java +++ b/src/main/java/com/hbm/config/VersatileConfig.java @@ -1,5 +1,7 @@ package com.hbm.config; +import java.util.ArrayList; + import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; @@ -33,7 +35,9 @@ public class VersatileConfig { if(PotionConfig.potionSickness == 2) duration *= 12; - entity.addPotionEffect(new PotionEffect(HbmPotion.potionsickness.id, duration * 20)); + PotionEffect eff = new PotionEffect(HbmPotion.potionsickness.id, duration * 20); + eff.setCurativeItems(new ArrayList()); + entity.addPotionEffect(eff); } public static boolean hasPotionSickness(EntityLivingBase entity) { diff --git a/src/main/java/com/hbm/crafting/MineralRecipes.java b/src/main/java/com/hbm/crafting/MineralRecipes.java index 752b13e54..e0a7f7179 100644 --- a/src/main/java/com/hbm/crafting/MineralRecipes.java +++ b/src/main/java/com/hbm/crafting/MineralRecipes.java @@ -5,6 +5,8 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPelletDepleted.DepletedRTGMaterial; import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; +import com.hbm.main.CraftingManager; + import static com.hbm.inventory.OreDictManager.*; import cpw.mods.fml.common.registry.GameRegistry; @@ -95,17 +97,17 @@ public class MineralRecipes { addBillet(ModItems.billet_cobalt, ModItems.ingot_cobalt, ModItems.nugget_cobalt); addBillet(ModItems.billet_co60, ModItems.ingot_co60, ModItems.nugget_co60); - addBillet(ModItems.billet_sr90, ModItems.ingot_sr90, ModItems.nugget_sr90, "nuggetStrontium90", "tinySr90"); - addBillet(ModItems.billet_uranium, ModItems.ingot_uranium, ModItems.nugget_uranium, "nuggetUranium"); - addBillet(ModItems.billet_u233, ModItems.ingot_u233, ModItems.nugget_u233, "nuggetUranium233", "tinyU233"); - addBillet(ModItems.billet_u235, ModItems.ingot_u235, ModItems.nugget_u235, "nuggetUranium235", "tinyU235"); - addBillet(ModItems.billet_u238, ModItems.ingot_u238, ModItems.nugget_u238, "nuggetUranium238", "tinyU238"); - addBillet(ModItems.billet_th232, ModItems.ingot_th232, ModItems.nugget_th232, "nuggetThorium232", "tinyTh232"); - addBillet(ModItems.billet_plutonium, ModItems.ingot_plutonium, ModItems.nugget_plutonium, "nuggetPlutonium"); - addBillet(ModItems.billet_pu238, ModItems.ingot_pu238, ModItems.nugget_pu238, "nuggetPlutonium238", "tinyPu238"); - addBillet(ModItems.billet_pu239, ModItems.ingot_pu239, ModItems.nugget_pu239, "nuggetPlutonium239", "tinyPu239"); - addBillet(ModItems.billet_pu240, ModItems.ingot_pu240, ModItems.nugget_pu240, "nuggetPlutonium240", "tinyPu240"); - addBillet(ModItems.billet_pu241, ModItems.ingot_pu241, ModItems.nugget_pu241, "nuggetPlutonium241", "tinyPu241"); + addBillet(ModItems.billet_sr90, ModItems.ingot_sr90, ModItems.nugget_sr90, SR90.allNuggets()); + addBillet(ModItems.billet_uranium, ModItems.ingot_uranium, ModItems.nugget_uranium, U.allNuggets()); + addBillet(ModItems.billet_u233, ModItems.ingot_u233, ModItems.nugget_u233, U233.allNuggets()); + addBillet(ModItems.billet_u235, ModItems.ingot_u235, ModItems.nugget_u235, U235.allNuggets()); + addBillet(ModItems.billet_u238, ModItems.ingot_u238, ModItems.nugget_u238, U238.allNuggets()); + addBillet(ModItems.billet_th232, ModItems.ingot_th232, ModItems.nugget_th232, TH232.allNuggets()); + addBillet(ModItems.billet_plutonium, ModItems.ingot_plutonium, ModItems.nugget_plutonium, PU.allNuggets()); + addBillet(ModItems.billet_pu238, ModItems.ingot_pu238, ModItems.nugget_pu238, PU238.allNuggets()); + addBillet(ModItems.billet_pu239, ModItems.ingot_pu239, ModItems.nugget_pu239, PU239.allNuggets()); + addBillet(ModItems.billet_pu240, ModItems.ingot_pu240, ModItems.nugget_pu240, PU240.allNuggets()); + addBillet(ModItems.billet_pu241, ModItems.ingot_pu241, ModItems.nugget_pu241, PU241.allNuggets()); addBillet(ModItems.billet_pu_mix, ModItems.ingot_pu_mix, ModItems.nugget_pu_mix); addBillet(ModItems.billet_am241, ModItems.ingot_am241, ModItems.nugget_am241, AM241.allNuggets()); addBillet(ModItems.billet_am242, ModItems.ingot_am242, ModItems.nugget_am242, AM242.allNuggets()); @@ -115,8 +117,8 @@ public class MineralRecipes { addBillet(ModItems.billet_technetium, ModItems.ingot_technetium, ModItems.nugget_technetium, TC99.allNuggets()); addBillet(ModItems.billet_au198, ModItems.ingot_au198, ModItems.nugget_au198, AU198.allNuggets()); addBillet(ModItems.billet_pb209, ModItems.ingot_pb209, ModItems.nugget_pb209, PB209.allNuggets()); //and so forth - addBillet(ModItems.billet_ra226, ModItems.ingot_ra226, ModItems.nugget_ra226, "nuggetRa226"); - addBillet(ModItems.billet_actinium, ModItems.ingot_actinium, ModItems.nugget_actinium, "nuggetActinium227", "tinyAc227"); + addBillet(ModItems.billet_ra226, ModItems.ingot_ra226, ModItems.nugget_ra226, RA226.allNuggets()); + addBillet(ModItems.billet_actinium, ModItems.ingot_actinium, ModItems.nugget_actinium, AC227.allNuggets()); addBillet(ModItems.billet_schrabidium, ModItems.ingot_schrabidium, ModItems.nugget_schrabidium, "nuggetSchrabidium"); addBillet(ModItems.billet_solinium, ModItems.ingot_solinium, ModItems.nugget_solinium, "nuggetSolinium"); addBillet(ModItems.billet_gh336, ModItems.ingot_gh336, ModItems.nugget_gh336, GH336.allNuggets()); @@ -432,6 +434,8 @@ public class MineralRecipes { GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_pu_mix, 1), new Object[] { "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu239", "tinyPu240", "tinyPu240", "tinyPu240" })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_am_mix, 1), new Object[] { "nuggetAmericium241", "nuggetAmericium241", "nuggetAmericium241", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242", "nuggetAmericium242" })); GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ModItems.ingot_am_mix, 1), new Object[] { "tinyAm241", "tinyAm241", "tinyAm241", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242", "tinyAm242" })); + + CraftingManager.addShapelessAuto(new ItemStack(ModItems.ball_fireclay, 4), new Object[] { Items.clay_ball, Items.clay_ball, Items.clay_ball, AL.dust() }); } //Bundled 1/9 recipes diff --git a/src/main/java/com/hbm/crafting/PowderRecipes.java b/src/main/java/com/hbm/crafting/PowderRecipes.java index 2c554ef88..c1c872e9f 100644 --- a/src/main/java/com/hbm/crafting/PowderRecipes.java +++ b/src/main/java/com/hbm/crafting/PowderRecipes.java @@ -49,17 +49,17 @@ public class PowderRecipes { CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_desh_ready, 1), new Object[] { ModItems.powder_desh_mix, ModItems.ingot_mercury, ModItems.ingot_mercury, COAL.dust() }); //Metal powders - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_magnetized_tungsten, 1), new Object[] { W.dust(), SA326.nugget() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_tcalloy, 1), new Object[] { STEEL.dust(), TC99.nugget() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 2), new Object[] { IRON.dust(), COAL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 1), new Object[] { IRON.dust(), COAL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); } } diff --git a/src/main/java/com/hbm/crafting/SmeltingRecipes.java b/src/main/java/com/hbm/crafting/SmeltingRecipes.java index 69ad39366..202457866 100644 --- a/src/main/java/com/hbm/crafting/SmeltingRecipes.java +++ b/src/main/java/com/hbm/crafting/SmeltingRecipes.java @@ -110,6 +110,7 @@ public class SmeltingRecipes { GameRegistry.addSmelting(ModItems.rag_damp, new ItemStack(ModItems.rag), 0.1F); GameRegistry.addSmelting(ModItems.rag_piss, new ItemStack(ModItems.rag), 0.1F); GameRegistry.addSmelting(DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.TOBACCO), DictFrame.fromOne(ModItems.plant_item, EnumPlantType.TOBACCO), 0.1F); + GameRegistry.addSmelting(ModItems.ball_fireclay, new ItemStack(ModItems.ingot_firebrick), 0.1F); //GameRegistry.addSmelting(Items.bone, new ItemStack(Items.slime_ball, 3), 0.0F); //GameRegistry.addSmelting(new ItemStack(Items.dye, 1, 15), new ItemStack(Items.slime_ball, 1), 0.0F); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index b170fe58a..1657bec8b 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -10,6 +10,7 @@ import com.hbm.items.machine.ItemBattery; import com.hbm.items.tool.ItemModMinecart; import com.hbm.items.tool.ItemModMinecart.EnumCartBase; import com.hbm.items.tool.ItemModMinecart.EnumMinecart; +import com.hbm.items.tool.ItemToolAbilityFueled; import com.hbm.main.CraftingManager; import net.minecraft.init.Blocks; @@ -78,13 +79,7 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.mese_pickaxe, 1), new Object[] { " SD", "APS", "FA ", 'S', ModItems.blades_desh, 'D', ModItems.powder_dineutronium, 'A', ModItems.plate_paa, 'P', ModItems.chlorophyte_pickaxe, 'F', ModItems.shimmer_handle }); //Chainsaws - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.DIESEL.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.DIESEL_CRACK.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.PETROIL.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.PETROIL_LEADED.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.GASOLINE.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.GASOLINE_LEADED.getDict(1000) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.chainsaw, 1), new Object[] { " H", "BBP", " C", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', Fluids.BIOFUEL.getDict(1000) }); + CraftingManager.addRecipeAuto(ItemToolAbilityFueled.getEmptyTool(ModItems.chainsaw), new Object[] { "CCH", "BBP", "CCE", 'H', ModItems.hull_small_steel, 'B', ModItems.blades_steel, 'P', ModItems.piston_selenium, 'C', ModBlocks.chain, 'E', ModItems.canister_empty }); //Misc CraftingManager.addRecipeAuto(new ItemStack(ModItems.euphemium_stopper, 1), new Object[] { "I", "S", "S", 'I', EUPH.ingot(), 'S', KEY_STICK }); diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 9a8291b1e..d5e80cfa2 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -87,6 +87,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver_nightmare, 1), new Object[] { "SEM", " RW", 'S', STEEL.plate(), 'W', KEY_PLANKS, 'R', ModItems.wire_aluminium, 'E', ModItems.powder_power, 'M', ModItems.mechanism_revolver_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_revolver_nightmare2, 1), new Object[] { "SSM", "RRW", 'S', OreDictManager.getReflector(), 'W', W.ingot(), 'R', ModItems.wire_gold, 'M', ModItems.mechanism_special }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_bio_revolver, 1), new Object[] { "SSM", "BTW", 'S', STEEL.plate(), 'M', ModItems.mechanism_revolver_2, 'B', B.ingot(), 'T', ModItems.bolt_tungsten, 'W', KEY_LOG }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_chemthrower, 1), new Object[] { "RWC", "HHT", "RLC", 'R', RUBBER.ingot(), 'W', ModItems.wrench, 'C', CU.plate(), 'H', ModItems.hull_small_steel, 'T', ModItems.tank_steel, 'L', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_fatman, 1), new Object[] { "SSI", "IIM", "WPH", 'S', STEEL.plate(), 'I', STEEL.ingot(), 'W', ModItems.wire_aluminium, 'H', ModItems.hull_small_steel, 'P', Item.getItemFromBlock(Blocks.piston), 'M', ModItems.mechanism_launcher_2 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_mirv, 1), new Object[] { "LLL", "WFW", "SSS", 'S', STEEL.plate(), 'L', PB.plate(), 'W', ModItems.wire_gold, 'F', ModItems.gun_fatman }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_proto, 1), new Object[] { "LLL", "WFW", "SSS", 'S', ModItems.plate_polymer, 'L', ModItems.plate_desh, 'W', ModItems.wire_tungsten, 'F', ModItems.gun_fatman }); @@ -281,6 +282,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 3), new Object[] { " P ", "NSN", " P ", 'P', PU239.nugget(), 'N', OreDictManager.getReflector(), 'S', new ItemStack(ModItems.ammo_arty, 1, 0) }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 6), new Object[] { "DSD", "SCS", "DSD", 'D', OreDictManager.getReflector(), 'S', new ItemStack(ModItems.ammo_arty, 1, 3), 'C', ModBlocks.det_cord }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.ammo_arty, 1, 4), new Object[] { new ItemStack(ModItems.ammo_arty, 1, 2), ModItems.boy_bullet, ModItems.boy_target, ModItems.boy_shielding, ModItems.circuit_red_copper, ModItems.ducttape }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_arty, 1, 8), new Object[] { " I ", " S ", "CCC", 'C', ModItems.cordite, 'I', ModItems.sphere_steel, 'S', ModItems.hull_small_steel }); //DGK Belts CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_dgk, 1), new Object[] { "LLL", "GGG", "CCC", 'L', PB.plate(), 'G', ModItems.ballistite, 'C', CU.ingot() }); diff --git a/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java b/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java new file mode 100644 index 000000000..0dc724a49 --- /dev/null +++ b/src/main/java/com/hbm/crafting/handlers/CargoShellCraftingHandler.java @@ -0,0 +1,81 @@ +package com.hbm.crafting.handlers; + +import com.hbm.items.ModItems; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class CargoShellCraftingHandler implements IRecipe { + + @Override + public boolean matches(InventoryCrafting inventory, World world) { + + int itemCount = 0; + int shellCount = 0; + + for(int i = 0; i < 9; i++) { + ItemStack stack = inventory.getStackInRowAndColumn(i % 3, i / 3); + + if(stack != null) { + + if(stack.getItem().hasContainerItem(stack) || !stack.getItem().doesContainerItemLeaveCraftingGrid(stack)) + return false; + + itemCount++; + + if(stack.getItem() == ModItems.ammo_arty && stack.getItemDamage() == 8 && !stack.hasTagCompound()) { + shellCount++; + } + } + } + + return itemCount == 2 && shellCount == 1; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inventory) { + + ItemStack shell = null; + ItemStack cargo = null; + + for(int i = 0; i < 9; i++) { + ItemStack stack = inventory.getStackInRowAndColumn(i % 3, i / 3); + + if(stack == null) + continue; + + if(stack.getItem() == ModItems.ammo_arty && stack.getItemDamage() == 8 && !stack.hasTagCompound()) { + ItemStack copy = stack.copy(); + copy.stackSize = 1; + shell = copy; + } else { + ItemStack copy = stack.copy(); + copy.stackSize = 1; + cargo = copy; + } + } + + if(shell == null || cargo == null) + return null; + + if(!shell.hasTagCompound()) + shell.stackTagCompound = new NBTTagCompound(); + + shell.stackTagCompound.setTag("cargo", cargo.writeToNBT(new NBTTagCompound())); + + return shell; + } + + @Override + public int getRecipeSize() { + return 9; + } + + @Override + public ItemStack getRecipeOutput() { + return new ItemStack(ModItems.ammo_shell, 1, 8); + } +} diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 9f9c0db4b..94e046a6c 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -203,9 +203,12 @@ public class EntityMappings { addEntity(EntityMinecartSemtex.class, "entity_ntm_cart_semtex", 250, false); addEntity(EntityNukeTorex.class, "entity_effect_torex", 250, false); addEntity(EntityArtilleryShell.class, "entity_artillery_shell", 1000); + addEntity(EntityArtilleryRocket.class, "entity_himars", 1000); addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntitySPV.class, "entity_self_propelled_vehicle_mark_1", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); + addEntity(EntitySawblade.class, "entity_stray_saw", 1000); + addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); addMob(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); addMob(EntityTaintedCreeper.class, "entity_mob_tainted_creeper", 0x813b9b, 0xd71fdd); diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 3ad54fc6e..5d3c29352 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -36,7 +36,8 @@ public class EntityNukeTorex extends Entity { public void onUpdate() { this.ticksExisted++; - int maxAge = 90 * 20; + double s = this.getScale(); + int maxAge = (int) (90 * 20 * s); if(worldObj.isRemote) { @@ -49,19 +50,21 @@ public class EntityNukeTorex extends Entity { for(int i = 0; i < toSpawn; i++) { double y = posY + rand.nextGaussian() - 3; //this.ticksExisted < 60 ? this.posY + this.coreHeight : posY + rand.nextGaussian() - 3; Cloudlet cloud = new Cloudlet(posX + rand.nextGaussian() * range, y, posZ + rand.nextGaussian() * range, (float)(rand.nextDouble() * 2D * Math.PI), 0); - cloud.setScale(1F + this.ticksExisted * 0.001F, 5F); + cloud.setScale(1F + this.ticksExisted * 0.001F * (float) s, 5F * (float) s); cloudlets.add(cloud); } } - int cloudCount = ticksExisted * 3; if(ticksExisted < 200) { + + int cloudCount = ticksExisted * 3; + for(int i = 0; i < cloudCount; i++) { Vec3 vec = Vec3.createVectorHelper((ticksExisted + rand.nextDouble()) * 2, 0, 0); float rot = (float) (Math.PI * 2 * rand.nextDouble()); vec.rotateAroundY(rot); this.cloudlets.add(new Cloudlet(vec.xCoord + posX, worldObj.getHeightValue((int) (vec.xCoord + posX) + 1, (int) (vec.zCoord + posZ)), vec.zCoord + posZ, rot, 0) - .setScale(5F, 2F) + .setScale(5F * (float) s, 2F * (float) s) .setMotion(0)); } } @@ -69,13 +72,12 @@ public class EntityNukeTorex extends Entity { for(Cloudlet cloud : cloudlets) { cloud.update(); } - - coreHeight += 0.15; - torusWidth += 0.05; + coreHeight += 0.15 * s; + torusWidth += 0.05 * s; rollerSize = torusWidth * 0.35; convectionHeight = coreHeight + rollerSize; - int maxHeat = 50; + int maxHeat = (int) (50 * s); heat = maxHeat - Math.pow((maxHeat * this.ticksExisted) / maxAge, 1); cloudlets.removeIf(x -> x.isDead); @@ -95,6 +97,20 @@ public class EntityNukeTorex extends Entity { return 1.0D; } + + public double getScale() { + return 1.0D; + } + + public double getSaturation() { + double d = (double) this.ticksExisted / (double) this.getMaxAge(); + return 1D - (d * d * d * d); + } + + public int getMaxAge() { + double s = this.getScale(); + return (int) (90 * 20 * s); + } public class Cloudlet { diff --git a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java index 779696bba..fb97632ae 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java @@ -70,6 +70,12 @@ public abstract class EntityMovingConveyorObject extends Entity { } if(!worldObj.isRemote) { + + ticksExisted++; + + if(this.ticksExisted <= 5) { + return; + } int blockX = (int) Math.floor(posX); int blockY = (int) Math.floor(posY); diff --git a/src/main/java/com/hbm/entity/item/EntityMovingPackage.java b/src/main/java/com/hbm/entity/item/EntityMovingPackage.java index 210b3ad5f..adbf4a5b6 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingPackage.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingPackage.java @@ -6,9 +6,11 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.conveyor.IConveyorPackage; import api.hbm.conveyor.IEnterableBlock; 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.DamageSource; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,6 +35,36 @@ public class EntityMovingPackage extends EntityMovingConveyorObject implements I return contents; } + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + + for(ItemStack stack : contents) { + if(!player.inventory.addItemStackToInventory(stack.copy())) { + worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack)); + } + } + + this.setDead(); + } + + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + + if(!worldObj.isRemote) { + this.setDead(); + + for(ItemStack stack : contents) { + worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack)); + } + } + return true; + } + @Override public void enterBlock(IEnterableBlock enterable, BlockPos pos, ForgeDirection dir) { diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java index 427321413..31771102d 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionNT.java @@ -26,7 +26,6 @@ public class EntityNukeExplosionNT extends Entity { if(!worldObj.isRemote) { if(this.explosion == null || this.explosion.isDone()) { - System.out.println(this.ticksExisted + " explosion done."); this.setDead(); return; } diff --git a/src/main/java/com/hbm/entity/mob/EntityFBI.java b/src/main/java/com/hbm/entity/mob/EntityFBI.java index fbbd5e6e6..f0ec89070 100644 --- a/src/main/java/com/hbm/entity/mob/EntityFBI.java +++ b/src/main/java/com/hbm/entity/mob/EntityFBI.java @@ -158,7 +158,7 @@ public class EntityFBI extends EntityMob implements IRangedAttackMob { canDestroy.add(ModBlocks.machine_press); canDestroy.add(ModBlocks.machine_epress); canDestroy.add(ModBlocks.dummy_block_assembler); - canDestroy.add(ModBlocks.dummy_block_chemplant); + canDestroy.add(ModBlocks.machine_chemplant); canDestroy.add(ModBlocks.machine_crystallizer); canDestroy.add(ModBlocks.machine_turbine); canDestroy.add(ModBlocks.machine_large_turbine); diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java new file mode 100644 index 000000000..5f906b878 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -0,0 +1,218 @@ +package com.hbm.entity.projectile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.entity.logic.IChunkLoader; +import com.hbm.entity.projectile.rocketbehavior.IRocketSteeringBehavior; +import com.hbm.entity.projectile.rocketbehavior.IRocketTargetingBehavior; +import com.hbm.entity.projectile.rocketbehavior.RocketSteeringBallisticArc; +import com.hbm.entity.projectile.rocketbehavior.RocketTargetingPredictive; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; +import com.hbm.main.MainRegistry; + +import api.hbm.entity.IRadarDetectable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; + +public class EntityArtilleryRocket extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { + + private Ticket loaderTicket; + + //TODO: find satisfying solution for when an entity is unloaded and reloaded, possibly a custom entity lookup using persistent UUIDs + public Entity targetEntity = null; + public Vec3 lastTargetPos; + + public IRocketTargetingBehavior targeting; + public IRocketSteeringBehavior steering; + + public EntityArtilleryRocket(World world) { + super(world); + this.ignoreFrustumCheck = true; + + this.targeting = new RocketTargetingPredictive(); + this.steering = new RocketSteeringBallisticArc(); + } + + @Override + protected void entityInit() { + init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); + this.dataWatcher.addObject(10, new Integer(0)); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + public EntityArtilleryRocket setType(int type) { + this.dataWatcher.updateObject(10, type); + return this; + } + + public HIMARSRocket getType() { + try { + return ItemAmmoHIMARS.itemTypes[this.dataWatcher.getWatchableObjectInt(10)]; + } catch(Exception ex) { + return ItemAmmoHIMARS.itemTypes[0]; + } + } + + public EntityArtilleryRocket setTarget(Entity target) { + this.targetEntity = target; + setTarget(target.posX, target.posY - target.yOffset + target.height / 2D, target.posZ); + return this; + } + + public EntityArtilleryRocket setTarget(double x, double y, double z) { + this.lastTargetPos = Vec3.createVectorHelper(x, y, z); + return this; + } + + public Vec3 getLastTarget() { + return this.lastTargetPos; + } + + @Override + public void onUpdate() { + + if(worldObj.isRemote) { + this.lastTickPosX = this.posX; + this.lastTickPosY = this.posY; + this.lastTickPosZ = this.posZ; + } + + super.onUpdate(); + + if(!worldObj.isRemote) { + + if(this.targetEntity == null) { + Vec3 delta = Vec3.createVectorHelper(this.lastTargetPos.xCoord - this.posX, this.lastTargetPos.yCoord - this.posY, this.lastTargetPos.zCoord - this.posZ); + if(delta.lengthVector() <= 15D) { + this.targeting = null; + this.steering = null; + } + } + + if(this.targeting != null && this.targetEntity != null) this.targeting.recalculateTargetPosition(this, this.targetEntity); + if(this.steering != null) this.steering.adjustCourse(this, 25D, 15D); + + loadNeighboringChunks((int)Math.floor(posX / 16D), (int)Math.floor(posZ / 16D)); + this.getType().onUpdate(this); + } else { + + Vec3 v = Vec3.createVectorHelper(lastTickPosX - posX, lastTickPosY - posY, lastTickPosZ - posZ); + double velocity = v.lengthVector(); + v = v.normalize(); + + int offset = 6; + if(velocity > 1) for(int i = offset; i < velocity + offset; i++) MainRegistry.proxy.spawnParticle(posX + v.xCoord * i, posY + v.yCoord * i, posZ + v.zCoord * i, "exKerosene", null); + } + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(!worldObj.isRemote) { + this.getType().onImpact(this, mop); + } + } + + @Override + public void init(Ticket ticket) { + if(!worldObj.isRemote && ticket != null) { + if(loaderTicket == null) { + loaderTicket = ticket; + loaderTicket.bindEntity(this); + loaderTicket.getModData(); + } + ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); + } + } + + List loadedChunks = new ArrayList(); + + public void loadNeighboringChunks(int newChunkX, int newChunkZ) { + if(!worldObj.isRemote && loaderTicket != null) { + + clearChunkLoader(); + + loadedChunks.clear(); + + int minX = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int maxX = Math.max(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int minZ = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int maxZ = Math.max(newChunkZ, newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D)); + + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + loadedChunks.add(new ChunkCoordIntPair(x, z)); + } + } + + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.forceChunk(loaderTicket, chunk); + } + } + } + + public void killAndClear() { + this.setDead(); + this.clearChunkLoader(); + } + + public void clearChunkLoader() { + if(!worldObj.isRemote && loaderTicket != null) { + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.unforceChunk(loaderTicket, chunk); + } + } + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + + nbt.setDouble("targetX", this.lastTargetPos.xCoord); + nbt.setDouble("targetY", this.lastTargetPos.yCoord); + nbt.setDouble("targetZ", this.lastTargetPos.zCoord); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + + this.lastTargetPos = Vec3.createVectorHelper(nbt.getDouble("targetX"), nbt.getDouble("targetY"), nbt.getDouble("targetZ")); + } + + @Override + protected float getAirDrag() { + return 1.0F; + } + + @Override + public double getGravityVelocity() { + return this.steering != null ? 0D : 0.01D; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.ARTILLERY; + } + + @Override + public int approachNum() { + return 0; // + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java index 8e66e0b47..b7a4c3e80 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java @@ -11,9 +11,12 @@ import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; @@ -43,9 +46,12 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa private boolean shouldWhistle = false; private boolean didWhistle = false; + private ItemStack cargo = null; + public EntityArtilleryShell(World world) { super(world); this.ignoreFrustumCheck = true; + this.setSize(0.5F, 0.5F); } @Override @@ -133,6 +139,10 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa } else { this.setPosition(this.posX, this.posY, this.posZ); } + + if(Vec3.createVectorHelper(this.syncPosX - this.posX, this.syncPosY - this.posY, this.syncPosZ - this.posZ).lengthVector() < 0.2) { + worldObj.spawnParticle("smoke", posX, posY + 0.5, posZ, 0.0, 0.1, 0.0); + } } } @@ -210,22 +220,30 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); + nbt.setInteger("type", this.dataWatcher.getWatchableObjectInt(10)); nbt.setBoolean("shouldWhistle", this.shouldWhistle); nbt.setBoolean("didWhistle", this.didWhistle); nbt.setDouble("targetX", this.targetX); nbt.setDouble("targetY", this.targetY); nbt.setDouble("targetZ", this.targetZ); + + if(this.cargo != null) + nbt.setTag("cargo", this.cargo.writeToNBT(new NBTTagCompound())); } @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); + this.dataWatcher.updateObject(10, nbt.getInteger("type")); this.shouldWhistle = nbt.getBoolean("shouldWhistle"); this.didWhistle = nbt.getBoolean("didWhistle"); this.targetX = nbt.getDouble("targetX"); this.targetY = nbt.getDouble("targetY"); this.targetZ = nbt.getDouble("targetZ"); + + NBTTagCompound compound = nbt.getCompoundTag("cargo"); + this.setCargo(ItemStack.loadItemStackFromNBT(compound)); } @Override @@ -238,6 +256,39 @@ public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoa return 9.81 * 0.05; } + @Override + protected int groundDespawn() { + return cargo != null ? 0 : 1200; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canAttackWithItem() { + return true; + } + + public void setCargo(ItemStack stack) { + this.cargo = stack; + } + + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + if(this.cargo != null) { + player.inventory.addItemStackToInventory(this.cargo.copy()); + player.inventoryContainer.detectAndSendChanges(); + } + this.setDead(); + } + + return false; + } + @Override public RadarTargetType getTargetType() { return RadarTargetType.ARTILLERY; diff --git a/src/main/java/com/hbm/entity/projectile/EntityChemical.java b/src/main/java/com/hbm/entity/projectile/EntityChemical.java new file mode 100644 index 000000000..ea7f07050 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityChemical.java @@ -0,0 +1,475 @@ +package com.hbm.entity.projectile; + +import java.awt.Color; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.extprop.HbmLivingProps; +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Corrosive; +import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FT_Poison; +import com.hbm.inventory.fluid.trait.FT_VentRadiation; +import com.hbm.lib.ModDamageSource; +import com.hbm.main.MainRegistry; +import com.hbm.util.ArmorUtil; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.EnchantmentUtil; +import com.hbm.util.ContaminationUtil.ContaminationType; +import com.hbm.util.ContaminationUtil.HazardType; +import com.hbm.util.EntityDamageUtil; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class EntityChemical extends EntityThrowableNT { + + /* + * TYPE INFO: + * + * if ANTIMATTER: ignore all other traits, become a gamme beam with no gravity + * if HOT: set fire and deal extra fire damage, scaling with the temperature + * if COLD: freeze, duration scaling with temperature, assuming COMBUSTIBLE does not apply + * if GAS: short range with the spread going up + * if EVAP: same as gas + * if LIQUID: if EVAP doesn't apply, create a narrow spray with long range affected by gravity + * if COMBUSTIBLE: auto-ignite + * if FLAMMABLE: if GAS or EVAP apply, do the same as COMBUSTIBLE, otherwise create a neutral spray that adds the "soaked" effect + * if CORROSIVE: apply extra acid damage, poison effect as well as armor degradation + */ + + public EntityChemical(World world) { + super(world); + this.ignoreFrustumCheck = true; + } + + public EntityChemical(World world, EntityLivingBase thrower) { + super(world, thrower); + this.ignoreFrustumCheck = true; + } + + @Override + protected void entityInit() { + this.dataWatcher.addObject(10, new Integer(0)); + } + + public EntityChemical setFluid(FluidType fluid) { + this.dataWatcher.updateObject(10, fluid.getID()); + return this; + } + + public FluidType getType() { + return Fluids.fromID(this.dataWatcher.getWatchableObjectInt(10)); + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + + if(this.ticksExisted > this.getMaxAge()) { + this.setDead(); + } + + FluidType type = this.getType(); + + if(type.hasTrait(Fluids.GASEOUS.getClass()) || type.hasTrait(Fluids.EVAP.getClass())) { + + double intensity = 1D - (double) this.ticksExisted / (double) this.getMaxAge(); + List affected = worldObj.getEntitiesWithinAABBExcludingEntity(this.thrower, this.boundingBox.expand(intensity * 2.5, intensity * 2.5, intensity * 2.5)); + + for(Entity e : affected) { + this.affect(e, intensity); + } + } + + } else { + + ChemicalStyle style = getStyle(); + + if(style == ChemicalStyle.LIQUID) { + + FluidType type = getType(); + Color color = new Color(type.getColor()); + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "colordust"); + data.setDouble("posX", posX); + data.setDouble("posY", posY); + data.setDouble("posZ", posZ); + data.setDouble("mX", motionX + worldObj.rand.nextGaussian() * 0.05); + data.setDouble("mY", motionY - 0.2 + worldObj.rand.nextGaussian() * 0.05); + data.setDouble("mZ", motionZ + worldObj.rand.nextGaussian() * 0.05); + data.setFloat("r", color.getRed() / 255F); + data.setFloat("g", color.getGreen() / 255F); + data.setFloat("b", color.getBlue() / 255F); + MainRegistry.proxy.effectNT(data); + } + + if(style == ChemicalStyle.BURNING) { + + double motion = Math.min(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector(), 0.1); + + for(double d = 0; d < motion; d += 0.0625) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "vanillaExt"); + nbt.setString("mode", "flame"); + nbt.setDouble("posX", (this.lastTickPosX - this.posX) * d + this.posX); + nbt.setDouble("posY", (this.lastTickPosY - this.posY) * d + this.posY); + nbt.setDouble("posZ", (this.lastTickPosZ - this.posZ) * d + this.posZ); + MainRegistry.proxy.effectNT(nbt); + } + } + } + super.onUpdate(); + } + + protected void affect(Entity e, double intensity) { + + ChemicalStyle style = getStyle(); + FluidType type = getType(); + EntityLivingBase living = e instanceof EntityLivingBase ? (EntityLivingBase) e : null; + + if(style == ChemicalStyle.LIQUID || style == ChemicalStyle.BURNING) //ignore range penalty for liquids + intensity = 1D; + + if(style == ChemicalStyle.AMAT) { + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, ModDamageSource.radiation, 1F); + if(living != null) { + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, 50F * (float) intensity); + return; + } + } + + if(type.temperature >= 100) { + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_boil), 5F + (type.temperature - 100) * 0.02F); //5 damage at 100°C with one extra damage every 50°C + + if(type.temperature >= 500) { + e.setFire(10); //afterburn for 10 seconds + } + } + + if(style == ChemicalStyle.LIQUID || style == ChemicalStyle.GAS) { + if(type.temperature < -20) { + if(living != null) { //only living things are affected + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_cryolator), 5F + (type.temperature + 20) * -0.05F); //5 damage at -20°C with one extra damage every -20°C + living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); + living.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 100, 4)); + } + } + + if(type.hasTrait(Fluids.DELICIOUS.getClass())) { + if(living != null && living.isEntityAlive()) { + living.heal(2F * (float) intensity); + } + } + } + + if(style == ChemicalStyle.LIQUID) { + + if(type.hasTrait(FT_Flammable.class)) { + if(living != null) { + HbmLivingProps.setOil(living, 300); //doused in oil for 15 seconds + } + } + } + + if(this.isExtinguishing()) { + e.extinguish(); + } + + if(style == ChemicalStyle.BURNING) { + FT_Combustible trait = type.getTrait(FT_Combustible.class); + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_flamethrower), 2F + (trait != null ? (trait.getCombustionEnergy() / 100_000F) : 0)); + e.setFire(5); + } + + if(style == ChemicalStyle.GASFLAME) { + FT_Flammable flammable = type.getTrait(FT_Flammable.class); + FT_Combustible combustible = type.getTrait(FT_Combustible.class); + + float heat = Math.max(flammable != null ? flammable.getHeatEnergy() / 50_000F : 0, combustible != null ? combustible.getCombustionEnergy() / 100_000F : 0); + heat *= intensity; + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_flamethrower), (2F + heat) * (float) intensity); + e.setFire((int) Math.ceil(5 * intensity)); + } + + if(type.hasTrait(FT_Corrosive.class)) { + FT_Corrosive trait = type.getTrait(FT_Corrosive.class); + EntityDamageUtil.attackEntityFromIgnoreIFrame(e, getDamage(ModDamageSource.s_acid), trait.getRating() / 20F); + + if(living != null) { + for(int i = 0; i < 4; i++) { + ArmorUtil.damageSuit(living, i, trait.getRating() / 5); + } + } + } + + if(type.hasTrait(FT_VentRadiation.class)) { + FT_VentRadiation trait = type.getTrait(FT_VentRadiation.class); + if(living != null) { + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, trait.getRadPerMB() * 5); + } + ChunkRadiationManager.proxy.incrementRad(worldObj, (int) Math.floor(e.posX), (int) Math.floor(e.posY), (int) Math.floor(e.posZ), trait.getRadPerMB() * 5); + } + + if(type.hasTrait(FT_Poison.class)) { + FT_Poison trait = type.getTrait(FT_Poison.class); + + if(living != null) { + living.addPotionEffect(new PotionEffect(trait.isWithering() ? Potion.wither.id : Potion.poison.id, (int) (5 * 20 * intensity))); + } + } + + if(type == Fluids.XPJUICE) { + + if(e instanceof EntityPlayer) { + EnchantmentUtil.addExperience((EntityPlayer) e, 1, false); + this.setDead(); + } + } + + if(type == Fluids.ENDERJUICE) { + this.teleportRandomly(e); + } + } + + protected boolean isExtinguishing() { + return this.getStyle() == ChemicalStyle.LIQUID && this.getType().temperature < 50 && !this.getType().hasTrait(FT_Flammable.class); + } + + protected DamageSource getDamage(String name) { + + if(thrower != null) { + return new EntityDamageSourceIndirect(name, this, thrower); + } else { + return new DamageSource(name); + } + } + + //terribly copy-pasted from EntityEnderman.class + protected boolean teleportRandomly(Entity e) { + double x = this.posX + (this.rand.nextDouble() - 0.5D) * 64.0D; + double y = this.posY + (double) (this.rand.nextInt(64) - 32); + double z = this.posZ + (this.rand.nextDouble() - 0.5D) * 64.0D; + return this.teleportTo(e, x, y, z); + } + + protected boolean teleportTo(Entity e, double x, double y, double z) { + + double targetX = e.posX; + double targetY = e.posY; + double targetZ = e.posZ; + e.posX = x; + e.posY = y; + e.posZ = z; + boolean flag = false; + int i = MathHelper.floor_double(e.posX); + int j = MathHelper.floor_double(e.posY); + int k = MathHelper.floor_double(e.posZ); + + if(e.worldObj.blockExists(i, j, k)) { + boolean flag1 = false; + + while(!flag1 && j > 0) { + Block block = e.worldObj.getBlock(i, j - 1, k); + + if(block.getMaterial().blocksMovement()) { + flag1 = true; + } else { + --e.posY; + --j; + } + } + + if(flag1) { + e.setPosition(e.posX, e.posY, e.posZ); + + if(e.worldObj.getCollidingBoundingBoxes(e, e.boundingBox).isEmpty() && !e.worldObj.isAnyLiquid(e.boundingBox)) { + flag = true; + } + } + } + + if(!flag) { + e.setPosition(targetX, targetY, targetZ); + return false; + } else { + short short1 = 128; + + for(int l = 0; l < short1; ++l) { + double d6 = (double) l / ((double) short1 - 1.0D); + float f = (this.rand.nextFloat() - 0.5F) * 0.2F; + float f1 = (this.rand.nextFloat() - 0.5F) * 0.2F; + float f2 = (this.rand.nextFloat() - 0.5F) * 0.2F; + double d7 = targetX + (e.posX - targetX) * d6 + (this.rand.nextDouble() - 0.5D) * (double) e.width * 2.0D; + double d8 = targetY + (e.posY - targetY) * d6 + this.rand.nextDouble() * (double) e.height; + double d9 = targetZ + (e.posZ - targetZ) * d6 + (this.rand.nextDouble() - 0.5D) * (double) e.width * 2.0D; + e.worldObj.spawnParticle("portal", d7, d8, d9, (double) f, (double) f1, (double) f2); + } + + e.worldObj.playSoundEffect(targetX, targetY, targetZ, "mob.endermen.portal", 1.0F, 1.0F); + e.playSound("mob.endermen.portal", 1.0F, 1.0F); + return true; + } + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(!worldObj.isRemote) { + + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + this.affect(mop.entityHit, 1D - (double) this.ticksExisted / (double) this.getMaxAge()); + } + + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + + FluidType type = getType(); + + if(type.hasTrait(FT_VentRadiation.class)) { + FT_VentRadiation trait = type.getTrait(FT_VentRadiation.class); + ChunkRadiationManager.proxy.incrementRad(worldObj, mop.blockX, mop.blockY, mop.blockZ, trait.getRadPerMB() * 5); + } + + ChemicalStyle style = getStyle(); + + if(style == ChemicalStyle.BURNING || style == ChemicalStyle.GASFLAME) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + Block fire = type == Fluids.BALEFIRE ? ModBlocks.balefire : Blocks.fire; + + if(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isAir(worldObj, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { + worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, fire); + } + } + } + + if(this.isExtinguishing()) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + if(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) == Blocks.fire) { + worldObj.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, Blocks.air); + } + } + } + + this.setDead(); + } + } + } + + @Override + protected float getAirDrag() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 1F; + if(type == ChemicalStyle.GAS) return 0.95F; + + return 0.99F; + } + + @Override + protected float getWaterDrag() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 1F; + if(type == ChemicalStyle.GAS) return 1F; + + return 0.8F; + } + + public int getMaxAge() { + + switch(this.getStyle()) { + case AMAT: return 100; + case BURNING:return 600; + case GAS: return 60; + case GASFLAME: return 20; + case LIQUID: return 600; + default: return 100; + } + } + + @Override + public double getGravityVelocity() { + + ChemicalStyle type = getStyle(); + + if(type == ChemicalStyle.AMAT) return 0D; + if(type == ChemicalStyle.GAS) return 0D; + if(type == ChemicalStyle.GASFLAME) return -0.01D; + + return 0.03D; + } + + public ChemicalStyle getStyle() { + return getStyleFromType(this.getType()); + } + + public static ChemicalStyle getStyleFromType(FluidType type) { + + if(type.isAntimatter()) { + return ChemicalStyle.AMAT; + } + + if(type.hasTrait(Fluids.GASEOUS.getClass()) || type.hasTrait(Fluids.EVAP.getClass())) { + + if(type.hasTrait(FT_Flammable.class) || type.hasTrait(FT_Combustible.class)) { + return ChemicalStyle.GASFLAME; + } else { + return ChemicalStyle.GAS; + } + } + + if(type.hasTrait(Fluids.LIQUID.getClass())) { + + if(type.hasTrait(FT_Combustible.class)) { + return ChemicalStyle.BURNING; + } else { + return ChemicalStyle.LIQUID; + } + } + + return ChemicalStyle.NULL; + } + + /** + * The general type of the chemical, determines rendering and movement + */ + public static enum ChemicalStyle { + AMAT, //renders as beam + LIQUID, //no renderer, fluid particles + GAS, //renders as particles + GASFLAME, //renders as fire particles + BURNING, //no renderer, fire particles + NULL + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityCog.java b/src/main/java/com/hbm/entity/projectile/EntityCog.java index 9019f4c45..84c27bb77 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityCog.java +++ b/src/main/java/com/hbm/entity/projectile/EntityCog.java @@ -13,27 +13,13 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class EntityCog extends EntityThrowableNT { - - private int turnProgress; - private double syncPosX; - private double syncPosY; - private double syncPosZ; - private double syncYaw; - private double syncPitch; - @SideOnly(Side.CLIENT) - private double velocityX; - @SideOnly(Side.CLIENT) - private double velocityY; - @SideOnly(Side.CLIENT) - private double velocityZ; +public class EntityCog extends EntityThrowableInterp { public EntityCog(World world) { super(world); @@ -49,6 +35,7 @@ public class EntityCog extends EntityThrowableNT { protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(10, new Integer(0)); + this.dataWatcher.addObject(11, new Integer(0)); } public EntityCog setOrientation(int rot) { @@ -56,16 +43,25 @@ public class EntityCog extends EntityThrowableNT { return this; } + public EntityCog setMeta(int meta) { + this.dataWatcher.updateObject(11, meta); + return this; + } + public int getOrientation() { return this.dataWatcher.getWatchableObjectInt(10); } + + public int getMeta() { + return this.dataWatcher.getWatchableObjectInt(11); + } @Override public boolean interactFirst(EntityPlayer player) { if(!worldObj.isRemote) { - if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.gear_large))) + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.gear_large, 1, this.getMeta()))) this.setDead(); player.inventoryContainer.detectAndSendChanges(); @@ -135,41 +131,9 @@ public class EntityCog extends EntityThrowableNT { if(orientation >= 6 && !this.inGround) { this.dataWatcher.updateObject(10, orientation - 6); } - super.onUpdate(); - } else { - if(this.turnProgress > 0) { - double interpX = this.posX + (this.syncPosX - this.posX) / (double) this.turnProgress; - double interpY = this.posY + (this.syncPosY - this.posY) / (double) this.turnProgress; - double interpZ = this.posZ + (this.syncPosZ - this.posZ) / (double) this.turnProgress; - double d = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); - this.rotationYaw = (float) ((double) this.rotationYaw + d / (double) this.turnProgress); - this.rotationPitch = (float)((double)this.rotationPitch + (this.syncPitch - (double)this.rotationPitch) / (double)this.turnProgress); - --this.turnProgress; - this.setPosition(interpX, interpY, interpZ); - } else { - this.setPosition(this.posX, this.posY, this.posZ); - } } - } - - @SideOnly(Side.CLIENT) - public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { - this.velocityX = this.motionX = p_70016_1_; - this.velocityY = this.motionY = p_70016_3_; - this.velocityZ = this.motionZ = p_70016_5_; - } - - @SideOnly(Side.CLIENT) - public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int theNumberThree) { - this.syncPosX = x; - this.syncPosY = y; - this.syncPosZ = z; - this.syncYaw = yaw; - this.syncPitch = pitch; - this.turnProgress = theNumberThree; - this.motionX = this.velocityX; - this.motionY = this.velocityY; - this.motionZ = this.velocityZ; + + super.onUpdate(); } @Override @@ -187,4 +151,18 @@ public class EntityCog extends EntityThrowableNT { protected int groundDespawn() { return 0; } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("rot", this.getOrientation()); + nbt.setInteger("meta", this.getMeta()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setOrientation(nbt.getInteger("rot")); + this.setMeta(nbt.getInteger("meta")); + } } diff --git a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java new file mode 100644 index 000000000..9d4a3b592 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java @@ -0,0 +1,161 @@ +package com.hbm.entity.projectile; + +import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class EntitySawblade extends EntityThrowableInterp { + + public EntitySawblade(World world) { + super(world); + this.setSize(1F, 1F); + } + + public EntitySawblade(World world, double x, double y, double z) { + super(world, x, y, z); + this.setSize(1F, 1F); + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(10, new Integer(0)); + this.dataWatcher.addObject(11, new Integer(0)); + } + + public EntitySawblade setOrientation(int rot) { + this.dataWatcher.updateObject(10, rot); + return this; + } + + public int getOrientation() { + return this.dataWatcher.getWatchableObjectInt(10); + } + + public int getMeta() { + return this.dataWatcher.getWatchableObjectInt(11); + } + + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.sawblade))) + this.setDead(); + + player.inventoryContainer.detectAndSendChanges(); + } + + return false; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.ENTITY && mop.entityHit.isEntityAlive()) { + Entity e = mop.entityHit; + e.attackEntityFrom(ModDamageSource.rubble, 1000); + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { + NBTTagCompound vdat = new NBTTagCompound(); + vdat.setString("type", "giblets"); + vdat.setInteger("ent", e.getEntityId()); + vdat.setInteger("cDiv", 5); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + } + } + + if(this.ticksExisted > 1 && worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { + + int orientation = this.dataWatcher.getWatchableObjectInt(10); + + if(orientation < 6) { + + if(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector() < 0.75) { + this.dataWatcher.updateObject(10, orientation + 6); + orientation += 6; + } else { + ForgeDirection side = ForgeDirection.getOrientation(mop.sideHit); + this.motionX *= 1 - (Math.abs(side.offsetX) * 2); + this.motionY *= 1 - (Math.abs(side.offsetY) * 2); + this.motionZ *= 1 - (Math.abs(side.offsetZ) * 2); + worldObj.createExplosion(this, posX, posY, posZ, 3F, false); + + if(worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getExplosionResistance(this) < 50) { + worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); + } + } + } + + if(orientation >= 6) { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.inGround = true; + } + } + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + int orientation = this.dataWatcher.getWatchableObjectInt(10); + if(orientation >= 6 && !this.inGround) { + this.dataWatcher.updateObject(10, orientation - 6); + } + } + + super.onUpdate(); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + @Override + public double getGravityVelocity() { + return inGround ? 0 : 0.03D; + } + + @Override + protected int groundDespawn() { + return 0; + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("rot", this.getOrientation()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setOrientation(nbt.getInteger("rot")); + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java new file mode 100644 index 000000000..08c860a57 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableInterp.java @@ -0,0 +1,78 @@ +package com.hbm.entity.projectile; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public abstract class EntityThrowableInterp extends EntityThrowableNT { + + private int turnProgress; + private double syncPosX; + private double syncPosY; + private double syncPosZ; + private double syncYaw; + private double syncPitch; + @SideOnly(Side.CLIENT) + private double velocityX; + @SideOnly(Side.CLIENT) + private double velocityY; + @SideOnly(Side.CLIENT) + private double velocityZ; + + public EntityThrowableInterp(World world) { + super(world); + } + + public EntityThrowableInterp(World world, double x, double y, double z) { + super(world, x, y, z); + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + super.onUpdate(); + } else { + if(this.turnProgress > 0) { + double interpX = this.posX + (this.syncPosX - this.posX) / (double) this.turnProgress; + double interpY = this.posY + (this.syncPosY - this.posY) / (double) this.turnProgress; + double interpZ = this.posZ + (this.syncPosZ - this.posZ) / (double) this.turnProgress; + double d = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); + this.rotationYaw = (float) ((double) this.rotationYaw + d / (double) this.turnProgress); + this.rotationPitch = (float)((double)this.rotationPitch + (this.syncPitch - (double)this.rotationPitch) / (double)this.turnProgress); + --this.turnProgress; + this.setPosition(interpX, interpY, interpZ); + } else { + this.setPosition(this.posX, this.posY, this.posZ); + } + } + } + + @SideOnly(Side.CLIENT) + public void setVelocity(double velX, double velY, double velZ) { + this.velocityX = this.motionX = velX; + this.velocityY = this.motionY = velY; + this.velocityZ = this.motionZ = velZ; + } + + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int theNumberThree) { + this.syncPosX = x; + this.syncPosY = y; + this.syncPosZ = z; + this.syncYaw = yaw; + this.syncPitch = pitch; + this.turnProgress = theNumberThree + approachNum(); + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + /** + * @return a number added to the basic "3" of the approach progress value. Larger numbers make the approach smoother, but lagging behind the true value more. + */ + public int approachNum() { + return 0; + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index cfbfabc17..608f999d5 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -30,7 +30,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { private Block stuckBlock; protected boolean inGround; public int throwableShake; - private EntityLivingBase thrower; + protected EntityLivingBase thrower; private String throwerName; private int ticksInGround; private int ticksInAir; @@ -140,109 +140,128 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { } return; - } + + } else { - this.inGround = false; - this.motionX *= (double) (this.rand.nextFloat() * 0.2F); - this.motionY *= (double) (this.rand.nextFloat() * 0.2F); - this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); - this.ticksInGround = 0; - this.ticksInAir = 0; + this.inGround = false; + this.motionX *= (double) (this.rand.nextFloat() * 0.2F); + this.motionY *= (double) (this.rand.nextFloat() * 0.2F); + this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); + this.ticksInGround = 0; + this.ticksInAir = 0; + } + } else { ++this.ticksInAir; - } - - Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - Vec3 nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - MovingObjectPosition mop = this.worldObj.rayTraceBlocks(pos, nextPos); - pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - - if(mop != null) { - nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); - } - - if(!this.worldObj.isRemote) { - - Entity hitEntity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double nearest = 0.0D; - EntityLivingBase thrower = this.getThrower(); - - for(int j = 0; j < list.size(); ++j) { - Entity entity = (Entity) list.get(j); - - if(entity.canBeCollidedWith() && (entity != thrower || this.ticksInAir >= 5)) { - double hitbox = 0.3F; - AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); - MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); - - if(hitMop != null) { - double dist = pos.distanceTo(hitMop.hitVec); - - if(dist < nearest || nearest == 0.0D) { - hitEntity = entity; - nearest = dist; + + Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition mop = this.worldObj.rayTraceBlocks(pos, nextPos); + pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if(mop != null) { + nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + } + + if(!this.worldObj.isRemote) { + + Entity hitEntity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double nearest = 0.0D; + EntityLivingBase thrower = this.getThrower(); + + for(int j = 0; j < list.size(); ++j) { + Entity entity = (Entity) list.get(j); + + if(entity.canBeCollidedWith() && (entity != thrower || this.ticksInAir >= 5)) { + double hitbox = 0.3F; + AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); + MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); + + if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + + if(dist < nearest || nearest == 0.0D) { + hitEntity = entity; + nearest = dist; + } } } } + + if(hitEntity != null) { + mop = new MovingObjectPosition(hitEntity); + } } - - if(hitEntity != null) { - mop = new MovingObjectPosition(hitEntity); + + if(mop != null) { + if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) == Blocks.portal) { + this.setInPortal(); + } else { + this.onImpact(mop); + } } - } - - if(mop != null) { - if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) == Blocks.portal) { - this.setInPortal(); - } else { - this.onImpact(mop); + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + + float hyp = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + for(this.rotationPitch = (float) (Math.atan2(this.motionY, (double) hyp) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; } - } - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - - float hyp = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); - - for(this.rotationPitch = (float) (Math.atan2(this.motionY, (double) hyp) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { - ; - } - - while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { - this.prevRotationPitch += 360.0F; - } - - while(this.rotationYaw - this.prevRotationYaw < -180.0F) { - this.prevRotationYaw -= 360.0F; - } - - while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { - this.prevRotationYaw += 360.0F; - } - - this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; - this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; - float drag = this.getAirDrag(); - double gravity = this.getGravityVelocity(); - - if(this.isInWater()) { - for(int i = 0; i < 4; ++i) { - float f = 0.25F; - this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double) f, this.posY - this.motionY * (double) f, this.posZ - this.motionZ * (double) f, this.motionX, this.motionY, this.motionZ); + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float drag = this.getAirDrag(); + double gravity = this.getGravityVelocity(); + + if(this.isInWater()) { + for(int i = 0; i < 4; ++i) { + float f = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double) f, this.posY - this.motionY * (double) f, this.posZ - this.motionZ * (double) f, this.motionX, this.motionY, this.motionZ); + } + + drag = this.getWaterDrag(); + } + + this.motionX *= (double) drag; + this.motionY *= (double) drag; + this.motionZ *= (double) drag; + this.motionY -= gravity; + this.setPosition(this.posX, this.posY, this.posZ); - drag = this.getWaterDrag(); } - - this.motionX *= (double) drag; - this.motionY *= (double) drag; - this.motionZ *= (double) drag; - this.motionY -= gravity; - this.setPosition(this.posX, this.posY, this.posZ); + } + + public boolean alowMultiImpact() { + return false; //TODO + } + + public void getStuck(int x, int y, int z) { + this.stuckBlockX = x; + this.stuckBlockY = y; + this.stuckBlockZ = z; + this.stuckBlock = worldObj.getBlock(x, y, z); + this.inGround = true; + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; } public double getGravityVelocity() { diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java new file mode 100644 index 000000000..659bc5fa0 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketSteeringBehavior.java @@ -0,0 +1,9 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +public interface IRocketSteeringBehavior { + + /** Modifies the motion to steer towards the set target. */ + public void adjustCourse(EntityArtilleryRocket rocket, double speed, double turnSpeed); +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java new file mode 100644 index 000000000..43a46df7a --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/IRocketTargetingBehavior.java @@ -0,0 +1,11 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; + +public interface IRocketTargetingBehavior { + + /** Recalculates the position that should be steered towards. */ + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target); +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java new file mode 100644 index 000000000..6a045d021 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketSteeringBallisticArc.java @@ -0,0 +1,87 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.util.Vec3; + +public class RocketSteeringBallisticArc implements IRocketSteeringBehavior { + + @Override + public void adjustCourse(EntityArtilleryRocket rocket, double speed, double maxTurn) { + + double turnSpeed = 45; + + Vec3 direction = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ).normalize(); + double horizontalMomentum = Math.sqrt(rocket.motionX * rocket.motionX + rocket.motionZ * rocket.motionZ); + Vec3 targetPos = rocket.getLastTarget(); + double deltaX = targetPos.xCoord - rocket.posX; + double deltaZ = targetPos.zCoord - rocket.posZ; + double horizontalDelta = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ); + double stepsRequired = horizontalDelta / horizontalMomentum; + Vec3 target = Vec3.createVectorHelper(targetPos.xCoord - rocket.posX, targetPos.yCoord - rocket.posY, targetPos.zCoord - rocket.posZ).normalize(); + + /* the entity's angles lack precision and i lack the nerve to figure out how they're oriented */ + double rocketYaw = yaw(direction); + double rocketPitch = pitch(direction); + double targetYaw = yaw(target); + double targetPitch = pitch(target); + + boolean debug = false; + + if(debug) { + System.out.println("=== INITIAL ==="); + System.out.println("Rocket Yaw: " + rocketYaw); + System.out.println("Rocket Pitch: " + rocketPitch); + System.out.println("Target Yaw: " + targetYaw); + System.out.println("Target Pitch: " + targetPitch); + } + + turnSpeed = Math.min(maxTurn, turnSpeed / stepsRequired); + + /* ...and then we just cheat */ + if(stepsRequired <= 1) { + turnSpeed = 180D; + } + + /*if(stepsRequired > 1) { + targetPitch = rocketPitch + ((targetPitch - rocketPitch) / stepsRequired); + }*/ + + if(debug) { + System.out.println("=== ADJUSTED ==="); + System.out.println("Target Pitch: " + targetPitch); + } + + /* shortest delta of α < 180° */ + double deltaYaw = ((targetYaw - rocketYaw) + 180D) % 360D - 180D; + double deltaPitch = ((targetPitch - rocketPitch) + 180D) % 360D - 180D; + + double turnYaw = Math.min(Math.abs(deltaYaw), turnSpeed) * Math.signum(deltaYaw); + double turnPitch = Math.min(Math.abs(deltaPitch), turnSpeed) * Math.signum(deltaPitch); + + if(debug) { + System.out.println("=== RESULTS ==="); + System.out.println("Delta Yaw: " + deltaYaw); + System.out.println("Delta Pitch: " + deltaPitch); + System.out.println("Turn Yaw: " + turnYaw); + System.out.println("Turn Pitch: " + turnPitch); + } + + Vec3 velocity = Vec3.createVectorHelper(speed, 0, 0); + velocity.rotateAroundZ((float) -Math.toRadians(rocketPitch + turnPitch)); + velocity.rotateAroundY((float) Math.toRadians(rocketYaw + turnYaw + 90)); + + rocket.motionX = velocity.xCoord; + rocket.motionY = velocity.yCoord; + rocket.motionZ = velocity.zCoord; + } + + private static double yaw(Vec3 vec) { + boolean pos = vec.zCoord >= 0; + return Math.toDegrees(Math.atan(vec.xCoord / vec.zCoord)) + (pos ? 180 : 0); + } + + private static double pitch(Vec3 vec) { + return Math.toDegrees(Math.atan(vec.yCoord / Math.sqrt(vec.xCoord * vec.xCoord + vec.zCoord * vec.zCoord))); + } +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java new file mode 100644 index 000000000..a5ca5e90f --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingPredictive.java @@ -0,0 +1,61 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; + +/** + * Basic implementation of predictive targeting. + * My current best guess for "smart" targeting + * Keeps a buffer of the last second's velocity values and generates a predicted target based on the average speed. + * @author hbm + */ +public class RocketTargetingPredictive implements IRocketTargetingBehavior { + + /* + * unlikely to work for things that move extremely erratically and quickly, + * but there's barely any cases where that would apply. + * a single second of prediction is good enough at long distances where there's + * still room for error, like player vehicles or ICBMs. + */ + private double[][] targetMotion = new double[20][3]; + + @Override + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target) { + + Vec3 speed = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ); + Vec3 delta = Vec3.createVectorHelper(target.posX - rocket.posX, target.posY - rocket.posY, target.posZ - rocket.posZ); + double eta = delta.lengthVector() - speed.lengthVector(); + + /* initialize with the values we already know */ + double motionX = target.motionX; + double motionY = target.motionY; + double motionZ = target.motionZ; + + /* shift the buffer and add the older values */ + for(int i = 1; i < 20; i++) { + targetMotion[i - 1] = targetMotion[i]; + motionX += targetMotion[i][0]; + motionY += targetMotion[i][1]; + motionZ += targetMotion[i][2]; + } + + /* push the new values to the buffer for future use */ + targetMotion[19][0] = target.motionX; + targetMotion[19][1] = target.motionY; + targetMotion[19][2] = target.motionZ; + + if(eta <= 1) { + rocket.setTarget(target.posX, target.posY - target.yOffset + target.height * 0.5D, target.posZ); + return; + } + + /* generate averages and predict a new position */ + double predX = target.posX + (motionX / 20D) * eta; + double predY = target.posY - target.yOffset + target.height * 0.5D + (motionY / 20D) * eta; + double predZ = target.posZ + (motionZ / 20D) * eta; + + rocket.setTarget(predX, predY, predZ); + } +} diff --git a/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java new file mode 100644 index 000000000..6d180fd6e --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/rocketbehavior/RocketTargetingSimple.java @@ -0,0 +1,17 @@ +package com.hbm.entity.projectile.rocketbehavior; + +import com.hbm.entity.projectile.EntityArtilleryRocket; + +import net.minecraft.entity.Entity; + +/** + * "Stupid targeting for rockets, they move straight towards the target's current position" + * @author hbm + */ +public class RocketTargetingSimple implements IRocketTargetingBehavior { + + @Override + public void recalculateTargetPosition(EntityArtilleryRocket rocket, Entity target) { + rocket.setTarget(target.posX, target.posY - target.yOffset + target.height * 0.5D, target.posZ); + } +} diff --git a/src/main/java/com/hbm/explosion/ExplosionBalefire.java b/src/main/java/com/hbm/explosion/ExplosionBalefire.java index 73acb4de8..9df326909 100644 --- a/src/main/java/com/hbm/explosion/ExplosionBalefire.java +++ b/src/main/java/com/hbm/explosion/ExplosionBalefire.java @@ -45,7 +45,7 @@ public class ExplosionBalefire lastposZ = nbt.getInteger(name + "lastposZ"); radius = nbt.getInteger(name + "radius"); radius2 = nbt.getInteger(name + "radius2"); - n = nbt.getInteger(name + "n"); + n = Math.max(nbt.getInteger(name + "n"), 1); //prevents invalid read operation nlimit = nbt.getInteger(name + "nlimit"); shell = nbt.getInteger(name + "shell"); leg = nbt.getInteger(name + "leg"); @@ -66,11 +66,16 @@ public class ExplosionBalefire this.nlimit = this.radius2 * 4; } - public boolean update() - { + public boolean update() { + + if(n == 0) return true; + breakColumn(this.lastposX, this.lastposZ); this.shell = (int) Math.floor((Math.sqrt(n) + 1) / 2); int shell2 = this.shell * 2; + + if(shell2 == 0) return true; + this.leg = (int) Math.floor((this.n - (shell2 - 1) * (shell2 - 1)) / shell2); this.element = (this.n - (shell2 - 1) * (shell2 - 1)) - shell2 * this.leg - this.shell + 1; this.lastposX = this.leg == 0 ? this.shell : this.leg == 1 ? -this.element : this.leg == 2 ? -this.shell : this.element; diff --git a/src/main/java/com/hbm/explosion/ExplosionChaos.java b/src/main/java/com/hbm/explosion/ExplosionChaos.java index 6f9ceaaa1..31067b6c8 100644 --- a/src/main/java/com/hbm/explosion/ExplosionChaos.java +++ b/src/main/java/com/hbm/explosion/ExplosionChaos.java @@ -19,6 +19,7 @@ import com.hbm.entity.projectile.EntityRainbow; import com.hbm.entity.projectile.EntityRocket; import com.hbm.entity.projectile.EntityRubble; import com.hbm.entity.projectile.EntitySchrab; +import com.hbm.interfaces.Spaghetti; import com.hbm.lib.ModDamageSource; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry; @@ -42,6 +43,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Spaghetti("no") public class ExplosionChaos { private final static Random random = new Random(); diff --git a/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java b/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java index 4f9c2498e..0e0139b60 100644 --- a/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java +++ b/src/main/java/com/hbm/explosion/nt/Mark5Ausf2.java @@ -89,7 +89,6 @@ public class Mark5Ausf2 implements IExplosionLogic { System.out.println(seg.rays.length); } }*/ - System.out.println("STOP"); } @Override @@ -109,7 +108,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.processBow = 0; this.processRing = 0; this.phase = 1; - System.out.println("Ending phase 0"); } private void processRays(int amount) { @@ -196,7 +194,6 @@ public class Mark5Ausf2 implements IExplosionLogic { if(this.phase == 1 && this.buffer.isEmpty()) { this.phase = 2; - System.out.println("Ending phase 1"); return; } @@ -218,7 +215,6 @@ public class Mark5Ausf2 implements IExplosionLogic { if(this.buffer.isEmpty()) { this.phase = 2; - System.out.println("Ending phase 1"); } } @@ -315,9 +311,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.segments = this.repopulatedSegments; this.repopulatedSegments = null; - System.out.println("Ending phase 2"); - - System.out.println("Initialized with" + segments.length + " segments!"); /*for(HorizontalSegment seg : segments) { @@ -332,7 +325,6 @@ public class Mark5Ausf2 implements IExplosionLogic { this.phase = 0; if(!didYouDoLiterallyAnything) { - System.out.println("Done!"); this.isDone = true; } } diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 72d76ec0f..bdc929c6e 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -10,6 +10,8 @@ import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.PlayerInformPacket; +import com.hbm.util.ChatBuilder; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; @@ -19,8 +21,10 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; @@ -43,6 +47,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { private float radBuf; private int bombTimer; private int contagion; + private int oil; private List contamination = new ArrayList(); public HbmLivingProps(EntityLivingBase entity) { @@ -174,6 +179,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { } public static void incrementDigamma(EntityLivingBase entity, float digamma) { + + if(entity instanceof EntityDuck) + digamma = 0.0F; + HbmLivingProps data = getData(entity); float dRad = getDigamma(entity) + digamma; @@ -206,6 +215,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { if(RadiationConfig.disableAsbestos) return; setAsbestos(entity, getAsbestos(entity) + asbestos); incrementFibrosis(entity, asbestos); + + if(entity instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.asbestos").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); + } } @@ -229,6 +242,10 @@ public class HbmLivingProps implements IExtendedEntityProperties { if(RadiationConfig.disableCoal) return; setBlackLung(entity, getBlackLung(entity) + blacklung); incrementFibrosis(entity, blacklung); + + if(entity instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation("info.coaldust").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_GAS_HAZARD, 3000), (EntityPlayerMP) entity); + } } /// PULMONARY FIBROSIS /// @@ -269,6 +286,15 @@ public class HbmLivingProps implements IExtendedEntityProperties { public static void setContagion(EntityLivingBase entity, int contageon) { getData(entity).contagion = contageon; } + + /// OIL /// + public static int getOil(EntityLivingBase entity) { + return getData(entity).oil; + } + + public static void setOil(EntityLivingBase entity, int oil) { + getData(entity).oil = oil; + } @Override public void init(Entity entity, World world) { } @@ -285,6 +311,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { props.setInteger("hfr_contagion", contagion); props.setInteger("hfr_blacklung", blacklung); props.setInteger("hfr_fibrosis", fibrosis); + props.setInteger("hfr_oil", oil); props.setInteger("hfr_cont_count", this.contamination.size()); @@ -308,6 +335,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { contagion = props.getInteger("hfr_contagion"); blacklung = props.getInteger("hfr_blacklung"); fibrosis = props.getInteger("hfr_fibrosis"); + oil = props.getInteger("hfr_oil"); int cont = props.getInteger("hfr_cont_count"); diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 78c037158..1b78ce031 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -94,6 +94,7 @@ public class EntityEffectHandler { handleRadiation(entity); handleDigamma(entity); handleLungDisease(entity); + handleOil(entity); handleDashing(entity); handlePlinking(entity); @@ -426,6 +427,29 @@ public class EntityEffectHandler { } } + private static void handleOil(EntityLivingBase entity) { + int oil = HbmLivingProps.getOil(entity); + + if(oil > 0) { + + if(entity.isBurning()) { + HbmLivingProps.setOil(entity, 0); + entity.worldObj.newExplosion(null, entity.posX, entity.posY + entity.height / 2, entity.posZ, 3F, false, true); + } else { + HbmLivingProps.setOil(entity, oil - 1); + } + + if(entity.ticksExisted % 5 == 0) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "sweat"); + nbt.setInteger("count", 1); + nbt.setInteger("block", Block.getIdFromBlock(Blocks.coal_block)); + nbt.setInteger("entity", entity.getEntityId()); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + } + } + } + private static void handleDashing(Entity entity) { //AAAAAAAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEEE diff --git a/src/main/java/com/hbm/handler/FuelHandler.java b/src/main/java/com/hbm/handler/FuelHandler.java index d55bc7284..e7651a481 100644 --- a/src/main/java/com/hbm/handler/FuelHandler.java +++ b/src/main/java/com/hbm/handler/FuelHandler.java @@ -22,34 +22,21 @@ public class FuelHandler implements IFuelHandler { if(fuel.getItem().equals(ModItems.solid_fuel_presto_triplet_bf)) return single * 2000; if(fuel.getItem().equals(ModItems.rocket_fuel)) return single * 32; - if(fuel.getItem().equals(ModItems.biomass)) - return 800; - if(fuel.getItem().equals(ModItems.biomass_compressed)) - return 2400; - if(fuel.getItem().equals(ModItems.powder_coal)) - return 1600; - if(fuel.getItem().equals(ModItems.scrap)) - return 800; - if(fuel.getItem().equals(ModItems.dust)) - return 400; - if(fuel.getItem().equals(ModItems.powder_fire)) - return 6400; - if(fuel.getItem().equals(Item.getItemFromBlock(ModBlocks.block_scrap))) - return 4000; - if(fuel.getItem() == ModItems.lignite) - return 1200; - if(fuel.getItem() == ModItems.powder_lignite) - return 1200; - if(fuel.getItem() == ModItems.briquette_lignite) - return 1600; - if(fuel.getItem() == ModItems.coke) - return 3200; - if(fuel.getItem() == ModItems.book_guide) - return 800; - if(fuel.getItem() == ModItems.coal_infernal) - return 4800; - if(fuel.getItem() == ModItems.crystal_coal) - return 6400; + if(fuel.getItem().equals(ModItems.biomass)) return 800; + if(fuel.getItem().equals(ModItems.biomass_compressed)) return 2400; + if(fuel.getItem().equals(ModItems.powder_coal)) return 1600; + if(fuel.getItem().equals(ModItems.scrap)) return 800; + if(fuel.getItem().equals(ModItems.dust)) return 400; + if(fuel.getItem().equals(ModItems.powder_fire)) return 6400; + if(fuel.getItem().equals(Item.getItemFromBlock(ModBlocks.block_scrap))) return 4000; + if(fuel.getItem() == ModItems.lignite) return 1200; + if(fuel.getItem() == ModItems.powder_lignite) return 1200; + if(fuel.getItem() == ModItems.briquette_lignite) return 1600; + if(fuel.getItem() == ModItems.coke) return 3200; + if(fuel.getItem() == ModItems.book_guide) return 800; + if(fuel.getItem() == ModItems.coal_infernal) return 4800; + if(fuel.getItem() == ModItems.crystal_coal) return 6400; + if(fuel.getItem() == ModItems.powder_sawdust) return 100; return 0; } diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index 3c52cf260..a2524ec75 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -17,6 +17,7 @@ import com.hbm.tileentity.machine.oil.*; import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.turret.*; +import com.hbm.wiaj.GuiWorldInAJar; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -421,13 +422,6 @@ public class GUIHandler implements IGuiHandler { return null; } - case ModBlocks.guiID_cel_prime: { - if(entity instanceof TileEntityCelPrime) { - return new ContainerCelPrime(player.inventory, (TileEntityCelPrime) entity); - } - return null; - } - case ModBlocks.guiID_machine_selenium: { if(entity instanceof TileEntityMachineSeleniumEngine) { return new ContainerMachineSelenium(player.inventory, (TileEntityMachineSeleniumEngine) entity); @@ -1233,13 +1227,6 @@ public class GUIHandler implements IGuiHandler { return null; } - case ModBlocks.guiID_cel_prime: { - if(entity instanceof TileEntityCelPrime) { - return new GUICelPrime(player.inventory, (TileEntityCelPrime) entity); - } - return null; - } - case ModBlocks.guiID_machine_selenium: { if(entity instanceof TileEntityMachineSeleniumEngine) { return new GUIMachineSelenium(player.inventory, (TileEntityMachineSeleniumEngine) entity); diff --git a/src/main/java/com/hbm/handler/ToolAbility.java b/src/main/java/com/hbm/handler/ToolAbility.java index 77eb41b7d..60bdb43d5 100644 --- a/src/main/java/com/hbm/handler/ToolAbility.java +++ b/src/main/java/com/hbm/handler/ToolAbility.java @@ -22,6 +22,7 @@ import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; @@ -29,8 +30,9 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public abstract class ToolAbility { - - public abstract void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool); + + //how to potentially save this: cancel the event/operation so that ItemInWorldManager's harvest method falls short, then recreate it with a more sensible structure + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { return false; } public abstract String getName(); public abstract String getFullName(); public abstract String getExtension(); @@ -47,14 +49,14 @@ public abstract class ToolAbility { private Set pos = new HashSet(); @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { Block b = world.getBlock(x, y, z); if(b == Blocks.stone && !ToolConfig.recursiveStone) - return; + return false; if(b == Blocks.netherrack && !ToolConfig.recursiveNetherrack) - return; + return false; List indices = Arrays.asList(new Integer[] {0, 1, 2, 3, 4, 5}); Collections.shuffle(indices); @@ -71,6 +73,7 @@ public abstract class ToolAbility { case 5: breakExtra(world, x, y, z - 1, x, y, z, player, tool, 0); break; } } + return false; } private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemAbility tool, int depth) { @@ -161,7 +164,7 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { for(int a = x - range; a <= x + range; a++) { for(int b = y - range; b <= y + range; b++) { @@ -174,6 +177,8 @@ public abstract class ToolAbility { } } } + + return false; } @Override @@ -200,21 +205,20 @@ public abstract class ToolAbility { public static class SilkAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - //if the tool is already enchanted, do nothing if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null) - return; + return false; - //add enchantment ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); - block.harvestBlock(world, player, x, y, z, meta); + + if(player instanceof EntityPlayerMP) + IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + return true; } @Override @@ -247,21 +251,20 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { - //if the tool is already enchanted, do nothing if(EnchantmentHelper.getFortuneModifier(player) > 0 || player.getHeldItem() == null) - return; + return false; - //add enchantment ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, luck); - block.harvestBlock(world, player, x, y, z, meta); + + if(player instanceof EntityPlayerMP) + IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + return true; } @Override @@ -288,10 +291,12 @@ public abstract class ToolAbility { public static class SmelterAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { List drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + boolean doesSmelt = false; + for(int i = 0; i < drops.size(); i++) { ItemStack stack = drops.get(i).copy(); ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(stack); @@ -300,14 +305,19 @@ public abstract class ToolAbility { result = result.copy(); result.stackSize *= stack.stackSize; drops.set(i, result); + doesSmelt = true; } } - world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + if(doesSmelt) { + world.setBlockToAir(x, y, z); + player.getHeldItem().damageItem(1, player); + + for(ItemStack stack : drops) + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + } - for(ItemStack stack : drops) - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + return false; } @Override @@ -334,7 +344,7 @@ public abstract class ToolAbility { public static class ShredderAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -348,6 +358,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -374,7 +386,7 @@ public abstract class ToolAbility { public static class CentrifugeAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -392,6 +404,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy())); } } + + return false; } @Override @@ -418,7 +432,7 @@ public abstract class ToolAbility { public static class CrystallizerAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -432,6 +446,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -458,7 +474,7 @@ public abstract class ToolAbility { public static class MercuryAbility extends ToolAbility { @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { //a band-aid on a gaping wound if(block == Blocks.lit_redstone_ore) @@ -476,6 +492,8 @@ public abstract class ToolAbility { world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); player.getHeldItem().damageItem(1, player); } + + return false; } @Override @@ -508,7 +526,7 @@ public abstract class ToolAbility { } @Override - public void onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { ExplosionNT ex = new ExplosionNT(player.worldObj, player, x + 0.5, y + 0.5, z + 0.5, strength); ex.addAttrib(ExAttrib.ALLDROP); @@ -518,6 +536,8 @@ public abstract class ToolAbility { ex.doExplosionB(false); player.worldObj.createExplosion(player, x + 0.5, y + 0.5, z + 0.5, 0.1F, false); + + return true; } @Override diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index f047cee32..5b52257b3 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -29,6 +29,26 @@ import net.minecraft.potion.PotionEffect; public class GunEnergyFactory { + public static GunConfiguration getChemConfig() { + + GunConfiguration config = new GunConfiguration(); + config.rateOfFire = 1; + config.gunMode = GunConfiguration.MODE_NORMAL; + config.firingMode = GunConfiguration.FIRE_AUTO; + config.allowsInfinity = false; + config.ammoCap = 3_000; + config.durability = 90_000; + config.reloadType = GunConfiguration.RELOAD_FULL; + config.crosshair = Crosshair.CIRCLE; + + config.name = "Chemical Thrower"; + config.manufacturer = "Langford Research Laboratories"; + + config.config = new ArrayList(); + + return config; + } + public static GunConfiguration getEMPConfig() { GunConfiguration config = new GunConfiguration(); diff --git a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java new file mode 100644 index 000000000..7a99d4349 --- /dev/null +++ b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java @@ -0,0 +1,81 @@ +package com.hbm.handler.imc; + +import java.util.ArrayList; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.util.Tuple.Triplet; + +import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +/** + * @author UFFR + */ + +public class IMCBlastFurnace extends IMCHandler { + public static final ArrayList> buffer = new ArrayList<>(); + + @Override + public void process(IMCMessage message) { + + final NBTTagCompound data = message.getNBTValue(); + final NBTTagCompound outputData = data.getCompoundTag("output"); + final ItemStack output = ItemStack.loadItemStackFromNBT(outputData); + + if(output == null) { + printError(message, "Output stack could not be read!"); + return; + } + + final Object input1; + final Object input2; + + switch(data.getString("inputType1")) { + case "ore": + input1 = data.getString("input1"); + break; + + case "orelist": + final NBTTagList list = data.getTagList("input1", 8); + final ArrayList ores = new ArrayList(list.tagCount()); + for(int i = 0; i < list.tagCount(); i++) + ores.add(list.getStringTagAt(i)); + input1 = ores; + break; + + case "itemstack": + input1 = new ComparableStack(ItemStack.loadItemStackFromNBT(data.getCompoundTag("input1"))); + break; + + default: + printError(message, "Unhandled input type!"); + return; + } + + switch(data.getString("inputType2")) { + case "ore": + input2 = data.getString("input2"); + break; + + case "orelist": + final NBTTagList list = data.getTagList("input2", 9); + final ArrayList ores = new ArrayList(list.tagCount()); + for(int i = 0; i < list.tagCount(); i++) + ores.add(list.getStringTagAt(i)); + input2 = ores; + break; + + case "itemstack": + input2 = new ComparableStack(ItemStack.loadItemStackFromNBT(data.getCompoundTag("input2"))); + break; + + default: + printError(message, "Unhandled input type!"); + return; + } + + buffer.add(new Triplet(input1, input2, output)); + } +} diff --git a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java index 940ab24bd..24456f70f 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java +++ b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java @@ -3,6 +3,8 @@ package com.hbm.handler.imc; import java.util.HashMap; import com.hbm.inventory.RecipesCommon; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; @@ -10,7 +12,7 @@ import net.minecraft.nbt.NBTTagCompound; public class IMCCentrifuge extends IMCHandler { - public static HashMap buffer = new HashMap(); + public static HashMap buffer = new HashMap(); @Override public void process(IMCMessage message) { @@ -40,7 +42,7 @@ public class IMCCentrifuge extends IMCHandler { String dict = data.getString("oredict"); if(!dict.isEmpty()) { - buffer.put(dict, outs); + buffer.put(new OreDictStack(dict), outs); } else { this.printError(message, "Input stack could not be read!"); } diff --git a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java index f52b39083..c7514eb9b 100644 --- a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java @@ -5,8 +5,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import com.hbm.inventory.gui.GUITestDiFurnace; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.inventory.recipes.MachineRecipes; import codechicken.nei.NEIServerUtils; @@ -17,48 +19,44 @@ import net.minecraft.item.ItemStack; public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { - public static ArrayList fuels; + public static ArrayList fuels; - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe - { - PositionedStack input1; + public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { + PositionedStack input1; PositionedStack input2; - PositionedStack result; - - public SmeltingSet(ItemStack input1, ItemStack input2, ItemStack result) { - input1.stackSize = 1; - input2.stackSize = 1; - this.input1 = new PositionedStack(input1, 75, 7); - this.input2 = new PositionedStack(input2, 75, 43); - this.result = new PositionedStack(result, 129, 25); - } + PositionedStack result; - @Override + public SmeltingSet(List list, List list2, ItemStack result) { + this.input1 = new PositionedStack(list, 75, 7); + this.input2 = new PositionedStack(list2, 75, 43); + this.result = new PositionedStack(result, 129, 25); + } + + @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] {input1, input2})); - } + return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] { input1, input2 })); + } - @Override + @Override public PositionedStack getOtherStack() { - return fuels.get((cycleticks / 48) % fuels.size()).stack; - } + return fuels.get((cycleticks / 48) % fuels.size()).stack; + } - @Override + @Override public PositionedStack getResult() { - return result; - } - } + return result; + } + } - public static class Fuel - { - public Fuel(ItemStack ingred) { - - this.stack = new PositionedStack(ingred, 3, 25, false); - } + public static class Fuel { + public Fuel(ItemStack ingred) { + + this.stack = new PositionedStack(ingred, 3, 25, false); + } + + public PositionedStack stack; + } - public PositionedStack stack; - } - @Override public String getRecipeName() { return "Blast Furnace"; @@ -68,13 +66,13 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { public String getGuiTexture() { return GUITestDiFurnace.texture.toString(); } - + @Override public void loadCraftingRecipes(String outputId, Object... results) { - if ((outputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + if((outputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } else { super.loadCraftingRecipes(outputId, results); @@ -83,16 +81,16 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { @Override public void loadCraftingRecipes(ItemStack result) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue(), result)) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + if(NEIServerUtils.areStacksSameType(recipe.getValue(), result)) + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } @Override public void loadUsageRecipes(String inputId, Object... ingredients) { - if ((inputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { + if((inputId.equals("alloysmelting")) && getClass() == AlloyFurnaceRecipeHandler.class) { loadCraftingRecipes("alloysmelting", new Object[0]); } else { super.loadUsageRecipes(inputId, ingredients); @@ -101,41 +99,43 @@ public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { @Override public void loadUsageRecipes(ItemStack ingredient) { - Map recipes = MachineRecipes.instance().getAlloyRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey()[0]) || NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey()[1])) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey()[0], (ItemStack)recipe.getKey()[1], (ItemStack)recipe.getValue())); + Map[], ItemStack> recipes = BlastFurnaceRecipes.getRecipesForNEI(); + for(Entry[], ItemStack> recipe : recipes.entrySet()) { + List combined = new ArrayList(); + combined.addAll(recipe.getKey()[0]); + combined.addAll(recipe.getKey()[1]); + for(ItemStack combinedStack : combined) + if(NEIServerUtils.areStacksSameType(ingredient, combinedStack) || NEIServerUtils.areStacksSameType(ingredient, combinedStack)) + this.arecipes.add(new SmeltingSet(recipe.getKey()[0], recipe.getKey()[1], recipe.getValue())); } } - @Override - public Class getGuiClass() { - return GUITestDiFurnace.class; - } - - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(96, 25, 24, 18), "alloysmelting")); - } + @Override + public Class getGuiClass() { + return GUITestDiFurnace.class; + } - @Override - public void drawExtras(int recipe) { - drawProgressBar(57, 26, 176, 0, 14, 14, 48, 7); - - drawProgressBar(96, 24, 176, 14, 24, 16, 48, 0); + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(96, 25, 24, 18), "alloysmelting")); + } - drawProgressBar(39, 7, 201, 0, 16, 52, 480, 7); - } + @Override + public void drawExtras(int recipe) { + drawProgressBar(57, 26, 176, 0, 14, 14, 48, 7); - @Override - public TemplateRecipeHandler newInstance() { - if (fuels == null || fuels.isEmpty()) - fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getAlloyFuels()) - { - fuels.add(new Fuel(i)); - } - return super.newInstance(); - } + drawProgressBar(96, 24, 176, 14, 24, 16, 48, 0); + drawProgressBar(39, 7, 201, 0, 16, 52, 480, 7); + } + + @Override + public TemplateRecipeHandler newInstance() { + if(fuels == null || fuels.isEmpty()) + fuels = new ArrayList(); + for(ItemStack i : MachineRecipes.instance().getAlloyFuels()) { + fuels.add(new Fuel(i)); + } + return super.newInstance(); + } } diff --git a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java index 7a58813cd..ab15345f9 100644 --- a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java @@ -19,55 +19,53 @@ import net.minecraft.item.ItemStack; public class CentrifugeRecipeHandler extends TemplateRecipeHandler { - public static ArrayList fuels; + public static ArrayList fuels; - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe - { - PositionedStack input; - PositionedStack result1; - PositionedStack result2; - PositionedStack result3; - PositionedStack result4; - - public RecipeSet(Object input, ItemStack[] results) { - this.input = new PositionedStack(input, 21, 6); - this.result1 = new PositionedStack(results[0], 129, 6); - this.result2 = new PositionedStack(results[1], 147, 6); - this.result3 = new PositionedStack(results[2], 129, 42); - this.result4 = new PositionedStack(results[3], 147, 42); - } + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + PositionedStack input; + PositionedStack result1; + PositionedStack result2; + PositionedStack result3; + PositionedStack result4; - @Override + public RecipeSet(Object input, ItemStack[] results) { + this.input = new PositionedStack(input, 21, 6); + this.result1 = new PositionedStack(results[0], 129, 6); + this.result2 = new PositionedStack(results[1], 147, 6); + this.result3 = new PositionedStack(results[2], 129, 42); + this.result4 = new PositionedStack(results[3], 147, 42); + } + + @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(input)); - } + return getCycledIngredients(cycleticks / 48, Arrays.asList(input)); + } - @Override + @Override public List getOtherStacks() { - List stacks = new ArrayList(); - stacks.add(fuels.get((cycleticks / 48) % fuels.size()).stack); - stacks.add(result2); - stacks.add(result3); - stacks.add(result4); - return stacks; - } + List stacks = new ArrayList(); + stacks.add(fuels.get((cycleticks / 48) % fuels.size()).stack); + stacks.add(result2); + stacks.add(result3); + stacks.add(result4); + return stacks; + } - @Override + @Override public PositionedStack getResult() { - return result1; - } - } + return result1; + } + } - public static class Fuel - { - public Fuel(ItemStack ingred) { - - this.stack = new PositionedStack(ingred, 21, 42, false); - } + public static class Fuel { + public Fuel(ItemStack ingred) { + + this.stack = new PositionedStack(ingred, 21, 42, false); + } + + public PositionedStack stack; + } - public PositionedStack stack; - } - @Override public String getRecipeName() { return "Centrifuge"; @@ -78,33 +76,32 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { return GUIMachineCentrifuge.texture.toString(); } - @Override - public Class getGuiClass() { - return GUIMachineCentrifuge.class; - } + @Override + public Class getGuiClass() { + return GUIMachineCentrifuge.class; + } + + @Override + public TemplateRecipeHandler newInstance() { + if(fuels == null || fuels.isEmpty()) + fuels = new ArrayList(); + for(ItemStack i : MachineRecipes.instance().getBatteries()) { + fuels.add(new Fuel(i)); + } + return super.newInstance(); + } - @Override - public TemplateRecipeHandler newInstance() { - if (fuels == null || fuels.isEmpty()) - fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getBatteries()) - { - fuels.add(new Fuel(i)); - } - return super.newInstance(); - } - @Override public void loadCraftingRecipes(String outputId, Object... results) { - - if ((outputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { + + if((outputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { Map recipes = CentrifugeRecipes.getRecipes(); - - for (Map.Entry recipe : recipes.entrySet()) { + + for(Map.Entry recipe : recipes.entrySet()) { this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); } - + } else { super.loadCraftingRecipes(outputId, results); } @@ -116,22 +113,20 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { Map recipes = CentrifugeRecipes.getRecipes(); for(Map.Entry recipe : recipes.entrySet()) { - - if(NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[0], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[1], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[2], result) || - NEIServerUtils.areStacksSameType((ItemStack)recipe.getValue()[3], result)) + + if(NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[0], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[1], result) + || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[2], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[3], result)) this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); } } @Override public void loadUsageRecipes(String inputId, Object... ingredients) { - - if ((inputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { - + + if((inputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { + loadCraftingRecipes("centrifugeprocessing", new Object[0]); - + } else { super.loadUsageRecipes(inputId, ingredients); } @@ -142,37 +137,32 @@ public class CentrifugeRecipeHandler extends TemplateRecipeHandler { Map recipes = CentrifugeRecipes.getRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - - if(recipe.getKey() instanceof ItemStack) { + for(Map.Entry recipe : recipes.entrySet()) { + if(recipe.getKey() instanceof List) { - if (NEIServerUtils.areStacksSameType(ingredient, (ItemStack)recipe.getKey())) - this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); - - } else if (recipe.getKey() instanceof ArrayList) { - - for(Object o : (ArrayList)recipe.getKey()) { - ItemStack stack = (ItemStack)o; + for(Object o : (List) recipe.getKey()) { + ItemStack stack = (ItemStack) o; - if (NEIServerUtils.areStacksSameType(ingredient, stack)) + if(NEIServerUtils.areStacksSameType(ingredient, stack)) { this.arecipes.add(new RecipeSet(stack, RecipesCommon.objectToStackArray(recipe.getValue()))); + } } } } } - @Override - public void drawExtras(int recipe) { - drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - - drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); + @Override + public void drawExtras(int recipe) { + drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); - } - - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(56, 5, 54, 54), "centrifugeprocessing")); - } + drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); + + drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(56, 5, 54, 54), "centrifugeprocessing")); + } } diff --git a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java new file mode 100644 index 000000000..c0cf58b60 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java @@ -0,0 +1,76 @@ +package com.hbm.handler.nei; + +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; + +import codechicken.nei.PositionedStack; +import codechicken.nei.guihook.GuiContainerManager; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.item.ItemStack; + +public class ChunkyHandler extends TemplateRecipeHandler { + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + ItemStack stack; + + public RecipeSet(ItemStack stack) { + this.stack = stack.copy(); + this.stack.stackSize = 1; + } + + @Override + public PositionedStack getResult() { + return null; + } + } + + @Override + public String getRecipeName() { + return ""; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + this.arecipes.add(new RecipeSet(result)); + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + this.arecipes.add(new RecipeSet(ingredient)); + } + + @Override + public void drawExtras(int recipe) { + RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); + drawTexturedModalRect(145, 0, 20, 20, 20, 20); + GL11.glPushMatrix(); + GL11.glTranslated(83, 50, 0); + double scale = 5D; + GL11.glScaled(scale, scale, scale); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glTranslated(-8, -8, 0); + GuiContainerManager.drawItem(0, 0, rec.stack); + GL11.glPopMatrix(); + RenderHelper.enableGUIStandardItemLighting(); + + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + + int w = 83; + String top = "The same thing but in big"; + String bottom = "so you can really stare at it"; + font.drawString(top, w - font.getStringWidth(top) / 2, 100, 0x404040); + font.drawString(bottom, w - font.getStringWidth(bottom) / 2, 110, 0x404040); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java new file mode 100644 index 000000000..1f2d9a359 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java @@ -0,0 +1,152 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleAlloyingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + List inputs = new ArrayList(); + PositionedStack template; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(CrucibleRecipe recipe) { + List inputs = new ArrayList(); + List outputs = new ArrayList(); + for(MaterialStack stack : recipe.input) inputs.add(ItemScraps.create(stack)); + for(MaterialStack stack : recipe.output) outputs.add(ItemScraps.create(stack)); + + this.template = new PositionedStack(new ItemStack(ModItems.crucible_template, 1, recipe.getId()), 75, 6); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < inputs.size(); i++) { + PositionedStack pos = new PositionedStack(inputs.get(i), 12 + (i % 3) * 18, 6 + (i / 3) * 18); + this.inputs.add(pos); + } + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, inputs); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.addAll(inputs); + other.add(crucible); + other.add(template); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Alloying"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleAlloying")) { + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + if(result.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(result.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.output) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleAlloying")) { + loadCraftingRecipes("ntmCrucibleAlloying", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + if(ingredient.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(ingredient.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.input) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleAlloying")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java new file mode 100644 index 000000000..e8e630024 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java @@ -0,0 +1,124 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.items.machine.ItemMold; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleCastingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack mold; + PositionedStack basin; + PositionedStack output; + + public RecipeSet(ItemStack[] stacks) { + this.input = new PositionedStack(stacks[0].copy(), 48, 24); + this.mold = new PositionedStack(stacks[1].copy(), 75, 6); + this.basin = new PositionedStack(stacks[2].copy(), 75, 42); + //through reasons i cannot explain, stacks[3]'s stack size does not survive until this point. + ItemStack o = ItemMold.moldById.get(stacks[1].getItemDamage()).getOutput(Mats.matById.get(stacks[0].getItemDamage())); + this.output = new PositionedStack(o.copy(), 102, 24); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input, mold, basin)); + } + + @Override + public PositionedStack getResult() { + return output; + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(mold); + other.add(basin); + other.add(output); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Casting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_foundry.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleFoundry")) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[3], result)) { + this.arecipes.add(new RecipeSet(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleFoundry")) { + loadCraftingRecipes("ntmCrucibleFoundry", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + + for(int i = 0; i < 3; i++) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[i], ingredient)) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleFoundry")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java new file mode 100644 index 000000000..b6af31dc1 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java @@ -0,0 +1,130 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleSmeltingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(AStack input, List outputs) { + this.input = new PositionedStack(input.extractForNEI(), 48, 24); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input)); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(crucible); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Smelting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible_smelting.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleSmelting")) { + + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + + for(ItemStack stack : recipe.getValue()) { + + if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleSmelting")) { + loadCraftingRecipes("ntmCrucibleSmelting", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + if(recipe.getKey().matchesRecipe(ingredient, true)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleSmelting")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index 96a1c667e..dda5d9b04 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -177,13 +177,8 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { @Override public void loadTransferRects() { transferRectsGui = new LinkedList(); - //guiGui = new LinkedList>(); - transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getKey())); - //transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), key)); - //guiGui.add(GUIMachineAssembler.class); RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - //RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); } public abstract String getKey(); diff --git a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java index 00e0ed6a2..444489abc 100644 --- a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java @@ -198,7 +198,7 @@ public class SILEXRecipeHandler extends TemplateRecipeHandler { String am = ((int)(rec.produced * 10D) / 10D) + "x"; fontRenderer.drawString(am, 52 - fontRenderer.getStringWidth(am) / 2, 43, 0x404040); - String wavelength = (rec.crystalStrength == EnumWavelengths.NULL) ? EnumChatFormatting.WHITE+"N/A" : rec.crystalStrength.textColor + I18nUtil.resolveKey(rec.crystalStrength.name); + String wavelength = (rec.crystalStrength == EnumWavelengths.NULL) ? EnumChatFormatting.WHITE + "N/A" : rec.crystalStrength.textColor + I18nUtil.resolveKey(rec.crystalStrength.name); fontRenderer.drawString(wavelength, (33 - fontRenderer.getStringWidth(wavelength) / 2), 8, 0x404040); diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index 9bca608eb..b09ca07a9 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -180,6 +180,10 @@ public class HazardRegistry { HazardSystem.register(egg_balefire_shard, makeData(RADIATION, bf * nugget)); HazardSystem.register(egg_balefire, makeData(RADIATION, bf * ingot)); + HazardSystem.register(solid_fuel_bf, makeData(RADIATION, 1000)); //roughly the amount of the balefire shard diluted in 250mB of rocket fuel + HazardSystem.register(solid_fuel_presto_bf, makeData(RADIATION, 2000)); + HazardSystem.register(solid_fuel_presto_triplet_bf, makeData(RADIATION, 6000)); + HazardSystem.register(nuclear_waste_long, makeData(RADIATION, 5F)); HazardSystem.register(nuclear_waste_long_tiny, makeData(RADIATION, 0.5F)); HazardSystem.register(nuclear_waste_short, makeData().addEntry(RADIATION, 30F).addEntry(HOT, 5F)); diff --git a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java b/src/main/java/com/hbm/interfaces/IPartiallyFillable.java deleted file mode 100644 index 57ebd39a4..000000000 --- a/src/main/java/com/hbm/interfaces/IPartiallyFillable.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hbm.interfaces; - -import com.hbm.inventory.fluid.FluidType; - -import net.minecraft.item.ItemStack; - -public interface IPartiallyFillable { - - public FluidType getType(ItemStack stack); - - public int getFill(ItemStack stack); - - public void setFill(ItemStack stack, int fill); - - public int getMaxFill(ItemStack stack); - - public int getLoadSpeed(ItemStack stack); - - public int getUnloadSpeed(ItemStack stack); - -} diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 67858355b..b98001f39 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -9,6 +9,7 @@ import java.util.List; import static com.hbm.items.ModItems.*; import static com.hbm.blocks.ModBlocks.*; import static com.hbm.inventory.OreDictManager.DictFrame.*; +import static com.hbm.inventory.OreNames.*; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.BlockEnums.EnumStoneType; @@ -17,6 +18,7 @@ import com.hbm.hazard.HazardData; import com.hbm.hazard.HazardEntry; import com.hbm.hazard.HazardRegistry; import com.hbm.hazard.HazardSystem; +import com.hbm.inventory.material.MatDistribution; import com.hbm.items.ItemEnums.EnumCokeType; import com.hbm.items.ItemEnums.EnumTarType; import com.hbm.main.MainRegistry; @@ -82,23 +84,6 @@ public class OreDictManager { public static final String KEY_TOOL_CHEMISTRYSET = "ntmchemistryset"; public static final String KEY_CIRCUIT_BISMUTH = "circuitVersatile"; - - /* - * PREFIXES - */ - public static final String ANY = "any"; - public static final String NUGGET = "nugget"; - public static final String TINY = "tiny"; - public static final String INGOT = "ingot"; - public static final String DUSTTINY = "dustTiny"; - public static final String DUST = "dust"; - public static final String GEM = "gem"; - public static final String CRYSTAL = "crystal"; - public static final String PLATE = "plate"; - public static final String BILLET = "billet"; - public static final String BLOCK = "block"; - public static final String ORE = "ore"; - public static final String ORENETHER = "oreNether"; /* * MATERIALS @@ -185,6 +170,7 @@ public class OreDictManager { public static final DictFrame DESH = new DictFrame("WorkersAlloy"); public static final DictFrame STAR = new DictFrame("Starmetal"); public static final DictFrame BIGMT = new DictFrame("Saturnite"); + public static final DictFrame FERRO = new DictFrame("Ferrouranium"); public static final DictFrame EUPH = new DictFrame("Euphemium"); public static final DictFrame DNT = new DictFrame("Dineutronium"); public static final DictFrame FIBER = new DictFrame("Fiberglass"); @@ -353,6 +339,7 @@ public class OreDictManager { DESH .nugget(nugget_desh) .ingot(ingot_desh) .dust(powder_desh) .block(block_desh); STAR .ingot(ingot_starmetal) .block(block_starmetal) .ore(ore_meteor_starmetal); BIGMT .ingot(ingot_saturnite) .plate(plate_saturnite); + FERRO .ingot(ingot_ferrouranium); EUPH .nugget(nugget_euphemium) .ingot(ingot_euphemium) .dust(powder_euphemium) .block(block_euphemium); DNT .nugget(nugget_dineutronium) .ingot(ingot_dineutronium) .dust(powder_dineutronium) .block(block_dineutronium); FIBER .ingot(ingot_fiberglass) .block(block_fiberglass); @@ -492,6 +479,8 @@ public class OreDictManager { OreDictionary.registerOre("blockGlassLime", glass_trinitite); OreDictionary.registerOre("blockGlassRed", glass_polonium); OreDictionary.registerOre("blockGlassBlack", glass_ash); + + MatDistribution.register(); //TEMP } public static String getReflector() { @@ -526,7 +515,7 @@ public class OreDictManager { } public static class DictFrame { - String[] mats; + public String[] mats; float hazMult = 1.0F; List hazards = new ArrayList(); diff --git a/src/main/java/com/hbm/inventory/OreNames.java b/src/main/java/com/hbm/inventory/OreNames.java new file mode 100644 index 000000000..ab7653b78 --- /dev/null +++ b/src/main/java/com/hbm/inventory/OreNames.java @@ -0,0 +1,21 @@ +package com.hbm.inventory; + +public class OreNames { + + /* + * PREFIXES + */ + public static final String ANY = "any"; + public static final String NUGGET = "nugget"; + public static final String TINY = "tiny"; + public static final String INGOT = "ingot"; + public static final String DUSTTINY = "dustTiny"; + public static final String DUST = "dust"; + public static final String GEM = "gem"; + public static final String CRYSTAL = "crystal"; + public static final String PLATE = "plate"; + public static final String BILLET = "billet"; + public static final String BLOCK = "block"; + public static final String ORE = "ore"; + public static final String ORENETHER = "oreNether"; +} diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 2dde250f4..f26af74e1 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -4,10 +4,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.hbm.config.GeneralConfig; +import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import net.minecraft.block.Block; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -155,7 +156,6 @@ public class RecipesCommon { } public ItemStack toStack() { - return new ItemStack(item, stacksize, meta); } @@ -180,17 +180,21 @@ public class RecipesCommon { public int hashCode() { if(item == null) { - MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); - Thread.currentThread().dumpStack(); - item = Items.stick; + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack has a null item! This is a serious issue!"); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } String name = Item.itemRegistry.getNameForObject(item); if(name == null) { - MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen?"); - Thread.currentThread().dumpStack(); - item = Items.stick; //we know sticks have a name, so sure, why not + if(!GeneralConfig.enableSilentCompStackErrors) { + MainRegistry.logger.error("ComparableStack holds an item that does not seem to be registered. How does that even happen? This error can be turned off with the config . Item name: " + item.getUnlocalizedName()); + Thread.currentThread().dumpStack(); + } + item = ModItems.nothing; } final int prime = 31; @@ -203,21 +207,21 @@ public class RecipesCommon { @Override public boolean equals(Object obj) { - if (this == obj) + if(this == obj) return true; - if (obj == null) + if(obj == null) return false; - if (getClass() != obj.getClass()) + if(getClass() != obj.getClass()) return false; ComparableStack other = (ComparableStack) obj; - if (item == null) { - if (other.item != null) + if(item == null) { + if(other.item != null) return false; - } else if (!item.equals(other.item)) + } else if(!item.equals(other.item)) return false; - if (meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) + if(meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) return false; - if (stacksize != other.stacksize) + if(stacksize != other.stacksize) return false; return true; } @@ -331,7 +335,7 @@ public class RecipesCommon { } public static class OreDictStack extends AStack { - + public String name; public OreDictStack(String name) { @@ -411,6 +415,35 @@ public class RecipesCommon { return ores; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + this.stacksize; + return result; + } + + @Override + public boolean equals(Object obj) { + if(this == obj) + return true; + if(obj == null) + return false; + if(getClass() != obj.getClass()) + return false; + OreDictStack other = (OreDictStack) obj; + if(name == null) { + if(other.name != null) + return false; + } else if(!name.equals(other.name)) { + return false; + } + if(this.stacksize != other.stacksize) + return false; + return true; + } } public static class MetaBlock { diff --git a/src/main/java/com/hbm/inventory/SlotNonRetarded.java b/src/main/java/com/hbm/inventory/SlotNonRetarded.java new file mode 100644 index 000000000..c2d81ed61 --- /dev/null +++ b/src/main/java/com/hbm/inventory/SlotNonRetarded.java @@ -0,0 +1,24 @@ +package com.hbm.inventory; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +/** + * Because vanilla slots have severe mental disabilities that prevent them from working as expected. + * @author hbm + */ +public class SlotNonRetarded extends Slot { + + public SlotNonRetarded(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + /** + * Dear mojang: Why wasn't that the standard to begin with? What do IInventories have isItemValidForSlot when by default nothing fucking uses it? + */ + @Override + public boolean isItemValid(ItemStack stack) { + return inventory.isItemValidForSlot(this.slotNumber, stack); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java index 44293e339..f8da90d3d 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerArmorTable.java @@ -2,7 +2,10 @@ package com.hbm.inventory.container; import com.hbm.handler.ArmorModHandler; import com.hbm.items.armor.ItemArmorMod; +import com.hbm.util.InventoryUtil; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -12,6 +15,7 @@ import net.minecraft.inventory.InventoryCraftResult; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; public class ContainerArmorTable extends Container { @@ -19,17 +23,18 @@ public class ContainerArmorTable extends Container { public IInventory armor = new InventoryCraftResult(); public ContainerArmorTable(InventoryPlayer inventory) { + EntityPlayer player = inventory.player; - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.helmet_only, 26, 27)); // helmet only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.plate_only, 62, 27)); // chestplate only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.legs_only, 98, 27)); // leggins only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.boots_only, 134, 45)); // boots only - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.servos, 134, 81)); //servos/frame - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.cladding, 98, 99)); //radiation cladding - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.kevlar, 62, 99)); //kevlar/sapi/(ERA? :) ) - this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.extra, 26, 99)); //special parts + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.helmet_only, 26 + 22, 27)); // helmet only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.plate_only, 62 + 22, 27)); // chestplate only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.legs_only, 98 + 22, 27)); // leggins only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.boots_only, 134 + 22, 45)); // boots only + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.servos, 134 + 22, 81)); //servos/frame + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.cladding, 98 + 22, 99)); //radiation cladding + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.kevlar, 62 + 22, 99)); //kevlar/sapi/(ERA? :) ) + this.addSlotToContainer(new UpgradeSlot(upgrades, ArmorModHandler.extra, 26 + 22, 99)); //special parts - this.addSlotToContainer(new Slot(armor, 0, 44, 63) { + this.addSlotToContainer(new Slot(armor, 0, 44 + 22, 63) { @Override public boolean isItemValid(ItemStack stack) { @@ -72,17 +77,36 @@ public class ContainerArmorTable extends Container { } }); - for(int i = 0; i < 3; i++) - { - for(int j = 0; j < 9; j++) - { - this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 56)); - } + //player armor slots for easy accessibility + for(int i = 0; i < 4; ++i) { + final int k = i; + this.addSlotToContainer(new Slot(inventory, inventory.getSizeInventory() - 1 - i, -17 + 22, 36 + i * 18) { + + public int getSlotStackLimit() { + return 1; + } + + public boolean isItemValid(ItemStack stack) { + if(stack == null) + return false; + return stack.getItem().isValidArmor(stack, k, player); + } + + @SideOnly(Side.CLIENT) + public IIcon getBackgroundIconIndex() { + return ItemArmor.func_94602_b(k); + } + }); } - for(int i = 0; i < 9; i++) - { - this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142 + 56)); + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18 + 22, 84 + i * 18 + 56)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18 + 22, 142 + 56)); } this.onCraftMatrixChanged(this.upgrades); @@ -97,17 +121,17 @@ public class ContainerArmorTable extends Container { public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); - + if(var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); if(par2 <= 8) { - if(!this.mergeItemStack(var5, 9, this.inventorySlots.size(), true)) { - return null; - } else { - var4.onPickupFromSlot(p_82846_1_, var5); - } + if(par2 != 8 || !InventoryUtil.mergeItemStack(this.inventorySlots, var5, 9, 13, false)) + if(!this.mergeItemStack(var5, 13, this.inventorySlots.size(), true)) + return null; + + var4.onPickupFromSlot(p_82846_1_, var5); } else { if(var5.getItem() instanceof ItemArmor) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java b/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java new file mode 100644 index 000000000..2ef4b9ba0 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneRouter.java @@ -0,0 +1,86 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotPattern; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCraneRouter extends Container { + + private TileEntityCraneRouter router; + + public ContainerCraneRouter(InventoryPlayer invPlayer, TileEntityCraneRouter router) { + this.router = router; + + for(int j = 0; j < 2; j++) { + for(int i = 0; i < 3; i++) { + for(int k = 0; k < 5; k++) { + this.addSlotToContainer(new SlotPattern(router, k + j * 15 + i * 5, 34 + k * 18 + j * 98, 17 + i * 26)); + } + } + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 47 + j * 18, 119 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 47 + i * 18, 177)); + } + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + if(index < 0 || index >= 30) { + return super.slotClick(index, button, mode, player); + } + + Slot slot = this.getSlot(index); + + ItemStack ret = null; + ItemStack held = player.inventory.getItemStack(); + + if(slot.getHasStack()) + ret = slot.getStack().copy(); + + if(button == 1 && mode == 0 && slot.getHasStack()) { + router.nextMode(index); + return ret; + + } else { + + slot.putStack(held != null ? held.copy() : null); + + if(slot.getHasStack()) { + slot.getStack().stackSize = 1; + } + + slot.onSlotChanged(); + router.initPattern(slot.getStack(), index); + + return ret; + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return router.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java b/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java index 75f2bf242..56a0ad217 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneUnboxer.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; public class ContainerCraneUnboxer extends Container { @@ -36,6 +37,35 @@ public class ContainerCraneUnboxer extends Container { } } + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= unboxer.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, unboxer.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else if(!this.mergeItemStack(var5, 0, unboxer.getSizeInventory(), false)) { + return null; + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + + var4.onPickupFromSlot(p_82846_1_, var5); + } + + return var3; + } + @Override public boolean canInteractWith(EntityPlayer player) { return unboxer.isUseableByPlayer(player); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java new file mode 100644 index 000000000..5061bb4a6 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -0,0 +1,75 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.tileentity.machine.TileEntityCrucible; +import com.hbm.util.InventoryUtil; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCrucible extends Container { + + protected TileEntityCrucible crucible; + + public ContainerCrucible(InventoryPlayer invPlayer, TileEntityCrucible crucible) { + this.crucible = crucible; + + //template + this.addSlotToContainer(new SlotNonRetarded(crucible, 0, 107, 81)); + + //input + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 3; j++) { + this.addSlotToContainer(new SlotNonRetarded(crucible, j + i * 3 + 1, 107 + j * 18, 18 + i * 18)); + } + } + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 132 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 190)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack originalStack = slot.getStack(); + stack = originalStack.copy(); + + if(index <= 9) { + if(!this.mergeItemStack(originalStack, 10, this.inventorySlots.size(), true)) { + return null; + } + + slot.onSlotChange(originalStack, stack); + + } else if(!InventoryUtil.mergeItemStack(this.inventorySlots, originalStack, 0, 10, false)) { + return null; + } + + if(originalStack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return crucible.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java index de6d70b11..fb5047708 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineOilWell.java @@ -53,16 +53,22 @@ public class ContainerMachineOilWell extends Container { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - if(par2 <= 5) { - if(!this.mergeItemStack(var5, 6, this.inventorySlots.size(), true)) { + if(par2 <= 7) { + if(!this.mergeItemStack(var5, 8, this.inventorySlots.size(), true)) { return null; } - } else if(!this.mergeItemStack(var5, 0, 2, false)) { + } else { if(var5.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(var5, 5, 8, true)) { return null; } + } else { + if(!this.mergeItemStack(var5, 0, 2, false)) { + if(!this.mergeItemStack(var5, 3, 4, false)) { + return null; + } + } } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java b/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java index 63c0ededf..d20200a80 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java +++ b/src/main/java/com/hbm/inventory/container/ContainerRBMKStorage.java @@ -33,7 +33,7 @@ public class ContainerRBMKStorage extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + public ItemStack transferStackInSlot(EntityPlayer player, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); @@ -41,7 +41,7 @@ public class ContainerRBMKStorage extends Container { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - if(par2 == 0) { + if(par2 < 12) { if(!this.mergeItemStack(var5, rbmk.getSizeInventory(), this.inventorySlots.size(), true)) { return null; } diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index f56402f22..594444144 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -2,14 +2,23 @@ package com.hbm.inventory.fluid; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map.Entry; + +import org.lwjgl.input.Keyboard; + import java.util.Set; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.*; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.lib.RefStrings; import com.hbm.render.util.EnumSymbol; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -37,6 +46,7 @@ public class FluidType { public static final double DEFAULT_HEATCAP = 0.01D; public static final double DEFAULT_COMPRESSION = 1D; + // v v v this entire system is a pain in the ass to work with. i'd much rather define state transitions and heat values manually. /** How hot this fluid is. Simple enough. */ public int temperature = ROOM_TEMPERATURE; /** How much heat energy each mB requires to be heated by 1°C. Total heat energy = heatCap * delta-T. */ @@ -45,7 +55,8 @@ public class FluidType { public double compression = DEFAULT_COMPRESSION; public Set containers = new HashSet(); - public List traits = new ArrayList(); + private HashMap, FluidTrait> traits = new HashMap(); + //public List enumTraits = new ArrayList(); private ResourceLocation texture; @@ -91,9 +102,22 @@ public class FluidType { return this; } - public FluidType addTraits(FluidTrait... traits) { - Collections.addAll(this.traits, traits); + /*public FluidType addTraits(EnumFluidTrait... traits) { + Collections.addAll(this.enumTraits, traits); return this; + }*/ + + public FluidType addTraits(FluidTrait... traits) { + for(FluidTrait trait : traits) this.traits.put(trait.getClass(), trait); + return this; + } + + public boolean hasTrait(Class trait) { + return this.traits.containsKey(trait); + } + + public T getTrait(Class trait) { //generics, yeah! + return (T) this.traits.get(trait); } public int getID() { @@ -125,19 +149,19 @@ public class FluidType { return this.temperature >= 100; } public boolean isCorrosive() { - return this.traits.contains(FluidTrait.CORROSIVE) || this.traits.contains(FluidTrait.CORROSIVE_2); + return this.traits.containsKey(FT_Corrosive.class); } public boolean isAntimatter() { - return this.traits.contains(FluidTrait.AMAT); + return this.traits.containsKey(FT_Amat.class); } public boolean hasNoContainer() { - return this.traits.contains(FluidTrait.NO_CONTAINER); + return this.traits.containsKey(FT_NoContainer.class); } public boolean hasNoID() { - return this.traits.contains(FluidTrait.NO_ID); + return this.traits.containsKey(FT_NoID.class); } public boolean needsLeadContainer() { - return this.traits.contains(FluidTrait.LEAD_CONTAINER); + return this.traits.containsKey(FT_LeadContainer.class); } /** @@ -165,19 +189,39 @@ public class FluidType { public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { } //public void onFluidTransmit(FluidNetwork net) { } + @SideOnly(Side.CLIENT) public void addInfo(List info) { if(temperature != ROOM_TEMPERATURE) { if(temperature < 0) info.add(EnumChatFormatting.BLUE + "" + temperature + "°C"); if(temperature > 0) info.add(EnumChatFormatting.RED + "" + temperature + "°C"); } - if(isAntimatter()) info.add(EnumChatFormatting.DARK_RED + "Antimatter"); + /*if(isAntimatter()) info.add(EnumChatFormatting.DARK_RED + "Antimatter"); - if(traits.contains(FluidTrait.CORROSIVE_2)) info.add(EnumChatFormatting.GOLD + "Strongly Corrosive"); - else if(traits.contains(FluidTrait.CORROSIVE)) info.add(EnumChatFormatting.YELLOW + "Corrosive"); + if(enumTraits.contains(EnumFluidTrait.CORROSIVE_2)) info.add(EnumChatFormatting.GOLD + "Strongly Corrosive"); + else if(enumTraits.contains(EnumFluidTrait.CORROSIVE)) info.add(EnumChatFormatting.YELLOW + "Corrosive"); - if(traits.contains(FluidTrait.NO_CONTAINER)) info.add(EnumChatFormatting.RED + "Cannot be stored in any universal tank"); - if(traits.contains(FluidTrait.LEAD_CONTAINER)) info.add(EnumChatFormatting.YELLOW + "Requires hazardous material tank to hold"); + if(enumTraits.contains(EnumFluidTrait.NO_CONTAINER)) info.add(EnumChatFormatting.RED + "Cannot be stored in any universal tank"); + if(enumTraits.contains(EnumFluidTrait.LEAD_CONTAINER)) info.add(EnumChatFormatting.YELLOW + "Requires hazardous material tank to hold");*/ + + List hidden = new ArrayList(); + + for(Entry, FluidTrait> entry : this.traits.entrySet()) { + entry.getValue().addInfo(info); + entry.getValue().addInfoHidden(hidden); + } + + if(!hidden.isEmpty()) { + + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { + info.addAll(hidden); + } else { + + info.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" + + EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" + + EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "> to display more info"); + } + } /*info.add(""); info.add(EnumChatFormatting.RED + "[DEBUG]"); @@ -190,7 +234,8 @@ public class FluidType { /** * Metadata for describing how the fluid acts, like being corrosive, not having fluid IDs or being only stored in certain containers. */ - public static enum FluidTrait { + /*@Deprecated + public static enum EnumFluidTrait { LIQUID, GASEOUS, PETROCHEMICAL, @@ -200,7 +245,7 @@ public class FluidType { NO_CONTAINER, LEAD_CONTAINER, NO_ID; - } + }*/ public static enum ExtContainer { CANISTER diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 7592f4a0e..a19fceb49 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -5,9 +5,11 @@ import java.util.HashMap; import java.util.List; import com.hbm.inventory.fluid.FluidType.ExtContainer; -import com.hbm.inventory.fluid.FluidType.FluidTrait; -import com.hbm.inventory.fluid.types.*; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.trait.*; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.render.util.EnumSymbol; public class Fluids { @@ -95,6 +97,16 @@ public class Fluids { private static final HashMap idMapping = new HashMap(); private static final HashMap nameMapping = new HashMap(); protected static final List metaOrder = new ArrayList(); + + public static final FT_Liquid LIQUID = new FT_Liquid(); + public static final FT_Gaseous_ART EVAP = new FT_Gaseous_ART(); + public static final FT_Gaseous GASEOUS = new FT_Gaseous(); + public static final FT_Plasma PLASMA = new FT_Plasma(); + public static final FT_Amat ANTI = new FT_Amat(); + public static final FT_LeadContainer LEADCON = new FT_LeadContainer(); + public static final FT_NoContainer NOCON = new FT_NoContainer(); + public static final FT_NoID NOID = new FT_NoID(); + public static final FT_Delicious DELICIOUS = new FT_Delicious(); public static void init() { @@ -111,85 +123,85 @@ public class Fluids { * You may screw with metaOrder as much as you like, as long as you keep all fluids in the list exactly once. */ - NONE = new FluidType( "NONE", 0x888888, 0, 0, 0, EnumSymbol.NONE); - WATER = new FluidType( "WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE); - STEAM = new Gas( "STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).setCompression(0.01D); - HOTSTEAM = new Gas( "HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).setCompression(0.1D); - SUPERHOTSTEAM = new Gas( "SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).setCompression(1D); - ULTRAHOTSTEAM = new Gas( "ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).setCompression(10D); - COOLANT = new FluidType( "COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).setHeatCap(0.25D); - LAVA = new FluidType( "LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200); - DEUTERIUM = new CombustibleGas( "DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); - TRITIUM = new CombustibleGas( "TRITIUM", 0x000099, 3, 4, 0, EnumSymbol.RADIATION).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); - OIL = new Oil( "OIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER); - HOTOIL = new Oil( "HOTOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350); - HEAVYOIL = new Oil( "HEAVYOIL", 0x141312, 2, 1, 0, EnumSymbol.NONE).addContainers(0x513F39, ExtContainer.CANISTER); - BITUMEN = new Petrochemical( "BITUMEN", 0x1f2426, 2, 0, 0, EnumSymbol.NONE).addContainers(0x5A5877, ExtContainer.CANISTER); - SMEAR = new Oil( "SMEAR", 0x190f01, 2, 1, 0, EnumSymbol.NONE).setHeatEnergy(50_000).addContainers(0x624F3B, ExtContainer.CANISTER); - HEATINGOIL = new Fuel( "HEATINGOIL", 0x211806, 2, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.LOW, 100_000).setHeatEnergy(150_000).addContainers(0x694235, ExtContainer.CANISTER); - RECLAIMED = new Fuel( "RECLAIMED", 0x332b22, 2, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.LOW, 200_000).setHeatEnergy(100_000).addContainers(0xF65723, ExtContainer.CANISTER); - PETROIL = new Fuel( "PETROIL", 0x44413d, 1, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 300_000).setHeatEnergy(125_000).addContainers(0x2369F6, ExtContainer.CANISTER); - LUBRICANT = new Petrochemical( "LUBRICANT", 0x606060, 2, 1, 0, EnumSymbol.NONE).addContainers(0xF1CC05, ExtContainer.CANISTER); - NAPHTHA = new Oil( "NAPHTHA", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER); - DIESEL = new Fuel( "DIESEL", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 500_000).setHeatEnergy(200_000).addContainers(0xFF2C2C, ExtContainer.CANISTER); - LIGHTOIL = new Oil( "LIGHTOIL", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER); - KEROSENE = new Fuel( "KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.AERO, 1_250_000).setHeatEnergy(300_000).addContainers(0xFF377D, ExtContainer.CANISTER); - GAS = new FlammableOilGas( "GAS", 0xfffeed, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(10_000); - PETROLEUM = new FlammableOilGas( "PETROLEUM", 0x7cb7c9, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(25_000); - LPG = new Fuel( "LPG", 0x4747EA, 1, 3, 1, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 450_000).setHeatEnergy(200_000); - BIOGAS = new FlammableOilGas( "BIOGAS", 0xbfd37c, 1, 4, 1, EnumSymbol.NONE).setHeatEnergy(25_000); - BIOFUEL = new Fuel( "BIOFUEL", 0xeef274, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 400_000).setHeatEnergy(150_000).addContainers(0x9EB623, ExtContainer.CANISTER); - NITAN = new Fuel( "NITAN", 0x8018ad, 2, 4, 1, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 5_000_000).setHeatEnergy(2_000_000).addContainers(0x6B238C, ExtContainer.CANISTER); - UF6 = new RadioactiveGas( "UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - PUF6 = new RadioactiveGas( "PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - SAS3 = new FluidType( "SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(FluidTrait.CORROSIVE); - SCHRABIDIC = new FluidType( "SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE_2); - AMAT = new Antimatter( "AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER); - ASCHRAB = new Antimatter( "ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER); - ACID = new FluidType( "ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(FluidTrait.CORROSIVE); - WATZ = new FluidType( "WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE_2); - CRYOGEL = new FluidType( "CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170); - HYDROGEN = new FluidTypeCombustible( "HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000).addTraits(FluidTrait.LIQUID); - OXYGEN = new FluidType( "OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC); - XENON = new Gas( "XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT); - BALEFIRE = new FluidType( "BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(FluidTrait.CORROSIVE); - MERCURY = new FluidType( "MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE); - PAIN = new FluidType( "PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(FluidTrait.CORROSIVE); - WASTEFLUID = new RadioactiveLiquid( "WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); - WASTEGAS = new RadioactiveGas( "WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); - GASOLINE = new Fuel( "GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_000_000).setHeatEnergy(400_000).addContainers(0x2F7747, ExtContainer.CANISTER); - COALGAS = new Fuel( "COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 150_000).setHeatEnergy(75_000).addContainers(0x2E155F, ExtContainer.CANISTER); - SPENTSTEAM = new Gas( "SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).addTraits(FluidTrait.NO_CONTAINER).setCompression(1D); - FRACKSOL = new Petrochemical( "FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE).addContainers(0x4F887F, ExtContainer.CANISTER); - PLASMA_DT = new FluidType( "PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_HD = new FluidType( "PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_HT = new FluidType( "PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_XM = new FluidType( "PLASMA_XM", 0xC6A5FF, 0, 4, 1, EnumSymbol.RADIATION).setTemp(4250).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - PLASMA_BF = new FluidType( "PLASMA_BF", 0xA7F1A3, 4, 5, 4, EnumSymbol.ANTIMATTER).setTemp(8500).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - CARBONDIOXIDE = new Gas( "CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT); - PLASMA_DH3 = new FluidType( "PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); - HELIUM3 = new Gas( "HELIUM3", 0xFCF0C4, 3, 4, 0, EnumSymbol.ASPHYXIANT); - DEATH = new FluidType( "DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(FluidTrait.CORROSIVE_2, FluidTrait.LEAD_CONTAINER); - ETHANOL = new Fuel( "ETHANOL", 0xe0ffff, 2, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 200_000).setHeatEnergy(75_000).addContainers(0xEAFFF3, ExtContainer.CANISTER); - HEAVYWATER = new FluidType( "HEAVYWATER", 0x00a0b0, 1, 0, 0, EnumSymbol.NONE); - CRACKOIL = new Oil( "CRACKOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE); - COALOIL = new Oil( "COALOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE); - HOTCRACKOIL = new Oil( "HOTCRACKOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350); - NAPHTHA_CRACK = new Oil( "NAPHTHA_CRACK", 0x595744, 2, 1, 0, EnumSymbol.NONE); - LIGHTOIL_CRACK = new Oil( "LIGHTOIL_CRACK", 0x8c7451, 1, 2, 0, EnumSymbol.NONE); - DIESEL_CRACK = new Fuel( "DIESEL_CRACK", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 450_000).setHeatEnergy(200_000); - AROMATICS = new Oil( "AROMATICS", 0x68A09A, 1, 4, 1, EnumSymbol.NONE); - UNSATURATEDS = new Oil( "UNSATURATEDS", 0x628FAE, 1, 4, 1, EnumSymbol.NONE); - SALIENT = new FluidType( "SALIENT", 0x457F2D, 0, 0, 0, EnumSymbol.NONE); - XPJUICE = new FluidType( "XPJUICE", 0xBBFF09, 0, 0, 0, EnumSymbol.NONE); - ENDERJUICE = new FluidType( "ENDERJUICE", 0x127766, 0, 0, 0, EnumSymbol.NONE); - PETROIL_LEADED = new Fuel( "PETROIL_LEADED", 0x44413d, 1, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 450_000).setHeatEnergy(((FluidTypeFlammable)PETROIL).getHeatEnergy()).addContainers(0x2331F6, ExtContainer.CANISTER); - GASOLINE_LEADED = new Fuel( "GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_500_000).setHeatEnergy(((FluidTypeFlammable)GASOLINE).getHeatEnergy()).addContainers(0x2F775A, ExtContainer.CANISTER); - COALGAS_LEADED = new Fuel( "COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 250_000).setHeatEnergy(((FluidTypeFlammable)COALGAS).getHeatEnergy()).addContainers(0x1E155F, ExtContainer.CANISTER); - SULFURIC_ACID = new FluidType( "SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE); - COOLANT_HOT = new FluidType( "COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(COOLANT.heatCap); - MUG = new FluidType( "MUG", 0x4B2D28, 0, 0, 0, EnumSymbol.NONE).setHeatCap(1D); - MUG_HOT = new FluidType(78, "MUG_HOT", 0x6B2A20, 0, 0, 0, EnumSymbol.NONE).setHeatCap(MUG.heatCap).setTemp(500); + NONE = new FluidType("NONE", 0x888888, 0, 0, 0, EnumSymbol.NONE); + WATER = new FluidType("WATER", 0x3333FF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + STEAM = new FluidType("STEAM", 0xe5e5e5, 3, 0, 0, EnumSymbol.NONE).setTemp(100).setCompression(0.01D).addTraits(GASEOUS); + HOTSTEAM = new FluidType("HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300).setCompression(0.1D).addTraits(GASEOUS); + SUPERHOTSTEAM = new FluidType("SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450).setCompression(1D).addTraits(GASEOUS); + ULTRAHOTSTEAM = new FluidType("ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600).setCompression(10D).addTraits(GASEOUS); + COOLANT = new FluidType("COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).setHeatCap(0.25D).addTraits(LIQUID); + LAVA = new FluidType("LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200).addTraits(LIQUID); + DEUTERIUM = new FluidType("DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), GASEOUS); + TRITIUM = new FluidType("TRITIUM", 0x000099, 3, 4, 0, EnumSymbol.RADIATION).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), GASEOUS, new FT_VentRadiation(0.001F)); + OIL = new FluidType("OIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + HOTOIL = new FluidType("HOTOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350).addTraits(new FT_Flammable(10_000), LIQUID); + HEAVYOIL = new FluidType("HEAVYOIL", 0x141312, 2, 1, 0, EnumSymbol.NONE).addContainers(0x513F39, ExtContainer.CANISTER).addTraits(new FT_Flammable(50_000), new FT_Combustible(FuelGrade.LOW, 25_000), LIQUID); + BITUMEN = new FluidType("BITUMEN", 0x1f2426, 2, 0, 0, EnumSymbol.NONE).addContainers(0x5A5877, ExtContainer.CANISTER).addTraits(LIQUID); + SMEAR = new FluidType("SMEAR", 0x190f01, 2, 1, 0, EnumSymbol.NONE).addContainers(0x624F3B, ExtContainer.CANISTER).addTraits(new FT_Flammable(50_000), LIQUID); + HEATINGOIL = new FluidType("HEATINGOIL", 0x211806, 2, 2, 0, EnumSymbol.NONE).addContainers(0x694235, ExtContainer.CANISTER).addTraits(new FT_Flammable(150_000), new FT_Combustible(FuelGrade.LOW, 100_000), LIQUID); + RECLAIMED = new FluidType("RECLAIMED", 0x332b22, 2, 2, 0, EnumSymbol.NONE).addContainers(0xF65723, ExtContainer.CANISTER).addTraits(new FT_Flammable(100_000), new FT_Combustible(FuelGrade.LOW, 200_000), LIQUID); + PETROIL = new FluidType("PETROIL", 0x44413d, 1, 3, 0, EnumSymbol.NONE).addContainers(0x2369F6, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 300_000), LIQUID); + LUBRICANT = new FluidType("LUBRICANT", 0x606060, 2, 1, 0, EnumSymbol.NONE).addContainers(0xF1CC05, ExtContainer.CANISTER).addTraits(LIQUID); + NAPHTHA = new FluidType("NAPHTHA", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 200_000), LIQUID); + DIESEL = new FluidType("DIESEL", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF2C2C, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 500_000), LIQUID); + LIGHTOIL = new FluidType("LIGHTOIL", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.MEDIUM, 500_000), LIQUID); + KEROSENE = new FluidType("KEROSENE", 0xffa5d2, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF377D, ExtContainer.CANISTER).addTraits(new FT_Flammable(300_000), new FT_Combustible(FuelGrade.AERO, 1_250_000), LIQUID); + GAS = new FluidType("GAS", 0xfffeed, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(10_000), GASEOUS); + PETROLEUM = new FluidType("PETROLEUM", 0x7cb7c9, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); + LPG = new FluidType("LPG", 0x4747EA, 1, 3, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); + BIOGAS = new FluidType("BIOGAS", 0xbfd37c, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), GASEOUS); + BIOFUEL = new FluidType("BIOFUEL", 0xeef274, 1, 2, 0, EnumSymbol.NONE).addContainers(0x9EB623, ExtContainer.CANISTER).addTraits(new FT_Flammable(150_000), new FT_Combustible(FuelGrade.HIGH, 400_000), LIQUID); + NITAN = new FluidType("NITAN", 0x8018ad, 2, 4, 1, EnumSymbol.NONE).addContainers(0x6B238C, ExtContainer.CANISTER).addTraits(new FT_Flammable(2_000_000), new FT_Combustible(FuelGrade.HIGH, 5_000_000), LIQUID); + UF6 = new FluidType("UF6", 0xD1CEBE, 4, 0, 2, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.2F), new FT_Corrosive(15), GASEOUS); + PUF6 = new FluidType("PUF6", 0x4C4C4C, 4, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.1F), new FT_Corrosive(15), GASEOUS); + SAS3 = new FluidType("SAS3", 0x4ffffc, 5, 0, 4, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(30), LIQUID); + SCHRABIDIC = new FluidType("SCHRABIDIC", 0x006B6B, 5, 0, 5, EnumSymbol.ACID).addTraits(new FT_VentRadiation(1F), new FT_Corrosive(75), new FT_Poison(true, 2), LIQUID); + AMAT = new FluidType("AMAT", 0x010101, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); + ASCHRAB = new FluidType("ASCHRAB", 0xb50000, 5, 0, 5, EnumSymbol.ANTIMATTER).addTraits(ANTI, GASEOUS); + ACID = new FluidType("ACID", 0xfff7aa, 3, 0, 3, EnumSymbol.OXIDIZER).addTraits(new FT_Corrosive(40), LIQUID); + WATZ = new FluidType("WATZ", 0x86653E, 4, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(60), new FT_VentRadiation(0.1F), LIQUID); + CRYOGEL = new FluidType("CRYOGEL", 0x32ffff, 2, 0, 0, EnumSymbol.CROYGENIC).setTemp(-170).addTraits(LIQUID); + HYDROGEN = new FluidType("HYDROGEN", 0x4286f4, 3, 4, 0, EnumSymbol.CROYGENIC).setTemp(-260).addTraits(new FT_Flammable(5_000), new FT_Combustible(FuelGrade.HIGH, 10_000), LIQUID, EVAP); + OXYGEN = new FluidType("OXYGEN", 0x98bdf9, 3, 0, 0, EnumSymbol.CROYGENIC).setTemp(-100).addTraits(LIQUID, EVAP); + XENON = new FluidType("XENON", 0xba45e8, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + BALEFIRE = new FluidType("BALEFIRE", 0x28e02e, 4, 4, 3, EnumSymbol.RADIATION).setTemp(1500).addTraits(new FT_Corrosive(50), new FT_Flammable(1_000_000), new FT_Combustible(FuelGrade.HIGH, 2_500_000), LIQUID); + MERCURY = new FluidType("MERCURY", 0x808080, 2, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, new FT_Poison(false, 2)); + PAIN = new FluidType("PAIN", 0x938541, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(30), new FT_Poison(true, 2), LIQUID); + WASTEFLUID = new FluidType("WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, LIQUID); + WASTEGAS = new FluidType("WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).addTraits(new FT_VentRadiation(0.5F), NOCON, GASEOUS); + GASOLINE = new FluidType("GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F7747, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_000_000), LIQUID); + COALGAS = new FluidType("COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 150_000), LIQUID); + SPENTSTEAM = new FluidType("SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).setCompression(1D).addTraits(NOCON, GASEOUS); + FRACKSOL = new FluidType("FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addContainers(0x4F887F, ExtContainer.CANISTER).addTraits(new FT_Corrosive(15), new FT_Poison(false, 0), LIQUID); + PLASMA_DT = new FluidType("PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(NOCON, NOID, PLASMA); + PLASMA_HD = new FluidType("PLASMA_HD", 0xF0ADF4, 0, 4, 0, EnumSymbol.RADIATION).setTemp(2500).addTraits(NOCON, NOID, PLASMA); + PLASMA_HT = new FluidType("PLASMA_HT", 0xD1ABF2, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3000).addTraits(NOCON, NOID, PLASMA); + PLASMA_XM = new FluidType("PLASMA_XM", 0xC6A5FF, 0, 4, 1, EnumSymbol.RADIATION).setTemp(4250).addTraits(NOCON, NOID, PLASMA); + PLASMA_BF = new FluidType("PLASMA_BF", 0xA7F1A3, 4, 5, 4, EnumSymbol.ANTIMATTER).setTemp(8500).addTraits(NOCON, NOID, PLASMA); + CARBONDIOXIDE = new FluidType("CARBONDIOXIDE", 0x404040, 3, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + PLASMA_DH3 = new FluidType("PLASMA_DH3", 0xFF83AA, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3480).addTraits(NOCON, NOID, PLASMA); + HELIUM3 = new FluidType("HELIUM3", 0xFCF0C4, 3, 4, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + DEATH = new FluidType("DEATH", 0x717A88, 2, 0, 1, EnumSymbol.ACID).setTemp(300).addTraits(new FT_Corrosive(80), new FT_Poison(true, 4), LEADCON, LIQUID); + ETHANOL = new FluidType("ETHANOL", 0xe0ffff, 2, 3, 0, EnumSymbol.NONE).addContainers(0xEAFFF3, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.HIGH, 200_000), LIQUID); + HEAVYWATER = new FluidType("HEAVYWATER", 0x00a0b0, 1, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + CRACKOIL = new FluidType("CRACKOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + COALOIL = new FluidType("COALOIL", 0x020202, 2, 1, 0, EnumSymbol.NONE).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + HOTCRACKOIL = new FluidType("HOTCRACKOIL", 0x300900, 2, 3, 0, EnumSymbol.NONE).setTemp(350).addContainers(0x424242, ExtContainer.CANISTER).addTraits(new FT_Flammable(10_000), LIQUID); + NAPHTHA_CRACK = new FluidType("NAPHTHA_CRACK", 0x595744, 2, 1, 0, EnumSymbol.NONE).addContainers(0x5F6D44, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 200_000), LIQUID); + LIGHTOIL_CRACK = new FluidType("LIGHTOIL_CRACK", 0x8c7451, 1, 2, 0, EnumSymbol.NONE).addContainers(0xB46B52, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.MEDIUM, 500_000), LIQUID); + DIESEL_CRACK = new FluidType("DIESEL_CRACK", 0xf2eed5, 1, 2, 0, EnumSymbol.NONE).addContainers(0xFF2C2C, ExtContainer.CANISTER).addTraits(new FT_Flammable(200_000), new FT_Combustible(FuelGrade.HIGH, 450_000), LIQUID); + AROMATICS = new FluidType("AROMATICS", 0x68A09A, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(25_000), LIQUID); + UNSATURATEDS = new FluidType("UNSATURATEDS", 0x628FAE, 1, 4, 1, EnumSymbol.NONE).addTraits(new FT_Flammable(1_000_000), GASEOUS); //acetylene burns as hot as satan's asshole + SALIENT = new FluidType("SALIENT", 0x457F2D, 0, 0, 0, EnumSymbol.NONE).addTraits(DELICIOUS, LIQUID); + XPJUICE = new FluidType("XPJUICE", 0xBBFF09, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); + ENDERJUICE = new FluidType("ENDERJUICE", 0x127766, 0, 0, 0, EnumSymbol.NONE).addTraits(DELICIOUS, LIQUID); + PETROIL_LEADED = new FluidType("PETROIL_LEADED", 0x44413d, 1, 3, 0, EnumSymbol.NONE).addContainers(0x2331F6, ExtContainer.CANISTER).addTraits(new FT_Flammable(125_000), new FT_Combustible(FuelGrade.MEDIUM, 450_000), LIQUID); + GASOLINE_LEADED = new FluidType("GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x2F775A, ExtContainer.CANISTER).addTraits(new FT_Flammable(400_000), new FT_Combustible(FuelGrade.HIGH, 1_500_000), LIQUID); + COALGAS_LEADED = new FluidType("COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).addContainers(0x1E155F, ExtContainer.CANISTER).addTraits(new FT_Flammable(75_000), new FT_Combustible(FuelGrade.MEDIUM, 250_000), LIQUID); + SULFURIC_ACID = new FluidType("SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(new FT_Corrosive(50), LIQUID); + COOLANT_HOT = new FluidType("COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(COOLANT.heatCap).addTraits(LIQUID); + MUG = new FluidType("MUG", 0x4B2D28, 0, 0, 0, EnumSymbol.NONE).setHeatCap(1D).addTraits(DELICIOUS, LIQUID); + MUG_HOT = new FluidType(78, "MUG_HOT", 0x6B2A20, 0, 0, 0, EnumSymbol.NONE).setHeatCap(MUG.heatCap).setTemp(500).addTraits(DELICIOUS, LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ @@ -289,6 +301,32 @@ public class Fluids { metaOrder.add(PLASMA_DH3); metaOrder.add(PLASMA_XM); metaOrder.add(PLASMA_BF); + + double eff_steam_boil = 1.0D; + double eff_steam_heatex = 0.25D; + + WATER.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex) + .addStep(200, 1, STEAM, 100) + .addStep(220, 1, HOTSTEAM, 10) + .addStep(238, 1, SUPERHOTSTEAM, 1) + .addStep(2500, 10, ULTRAHOTSTEAM, 1)); + + STEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(2, 10, HOTSTEAM, 1)); + HOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(18, 10, SUPERHOTSTEAM, 1)); + SUPERHOTSTEAM.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, eff_steam_boil).setEff(HeatingType.HEATEXCHANGER, eff_steam_heatex).addStep(120, 10, ULTRAHOTSTEAM, 1)); + + double eff_steam_turbine = 1.0D; + double eff_steam_cool = 0.5D; + STEAM.addTraits(new FT_Coolable(SPENTSTEAM, 100, 1, 200).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + HOTSTEAM.addTraits(new FT_Coolable(STEAM, 1, 10, 2).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + SUPERHOTSTEAM.addTraits(new FT_Coolable(HOTSTEAM, 1, 10, 18).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + ULTRAHOTSTEAM.addTraits(new FT_Coolable(SUPERHOTSTEAM, 1, 10, 120).setEff(CoolingType.TURBINE, eff_steam_turbine).setEff(CoolingType.HEATEXCHANGER, eff_steam_cool)); + + OIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTOIL, 1)); + CRACKOIL.addTraits(new FT_Heatable().setEff(HeatingType.BOILER, 1.0D).setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(10, 1, HOTCRACKOIL, 1)); + + HOTOIL.addTraits(new FT_Coolable(OIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + HOTCRACKOIL.addTraits(new FT_Coolable(CRACKOIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java new file mode 100644 index 000000000..8228afc44 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderFillableItem.java @@ -0,0 +1,72 @@ +package com.hbm.inventory.fluid.tank; + +import com.hbm.handler.ArmorModHandler; +import com.hbm.inventory.fluid.FluidType; + +import api.hbm.fluid.IFillableItem; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; + +public class FluidLoaderFillableItem extends FluidLoadingHandler { + + @Override + public boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank) { + return fill(slots[in], tank); + } + + public boolean fill(ItemStack stack, FluidTank tank) { + + if(stack == null) + return false; + + FluidType type = tank.getTankType(); + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + + if(mod != null && mod.getItem() instanceof IFillableItem) { + fill(mod, tank); + } + } + } + + if(!(stack.getItem() instanceof IFillableItem)) return false; + + IFillableItem fillable = (IFillableItem) stack.getItem(); + + if(fillable.acceptsFluid(type, stack)) { + tank.setFill(fillable.tryFill(type, tank.getFill(), stack)); + } + + return true; + } + + @Override + public boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank) { + return empty(slots[in], tank); + } + + public boolean empty(ItemStack stack, FluidTank tank) { + + FluidType type = tank.getTankType(); + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + + if(mod != null && mod.getItem() instanceof IFillableItem) { + empty(mod, tank); + } + } + } + + if(!(stack.getItem() instanceof IFillableItem)) return false; + + IFillableItem fillable = (IFillableItem) stack.getItem(); + + if(fillable.providesFluid(type, stack)) { + tank.setFill(tank.getFill() + fillable.tryEmpty(type, tank.getMaxFill() - tank.getFill(), stack)); + } + + return tank.getFill() == tank.getMaxFill(); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java new file mode 100644 index 000000000..d4c784396 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoaderStandard.java @@ -0,0 +1,90 @@ +package com.hbm.inventory.fluid.tank; + +import com.hbm.inventory.FluidContainerRegistry; +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.item.ItemStack; + +public class FluidLoaderStandard extends FluidLoadingHandler { + + @Override + public boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank) { + + if(slots[in] == null) + return true; + + FluidType type = tank.getTankType(); + ItemStack full = FluidContainerRegistry.getFullContainer(slots[in], type); + + if(full != null && slots[in] != null && tank.getFill() - FluidContainerRegistry.getFluidContent(full, type) >= 0) { + + ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); + + if(slots[out] == null) { + + tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); + slots[out] = full.copy(); + slots[in].stackSize--; + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + } else if(slots[out] != null && slots[out].getItem() == fullContainer.getItem() && slots[out].getItemDamage() == fullContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { + + tank.setFill(tank.getFill() - FluidContainerRegistry.getFluidContent(full, type)); + slots[in].stackSize--; + + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + slots[out].stackSize++; + } + } + + return false; + } + + @Override + public boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank) { + + if(slots[in] == null) + return true; + + FluidType type = tank.getTankType(); + int amount = FluidContainerRegistry.getFluidContent(slots[in], type); + + if(amount > 0 && tank.getFill() + amount <= tank.maxFluid) { + + ItemStack emptyContainer = FluidContainerRegistry.getEmptyContainer(slots[in]); + + if(slots[out] == null) { + + tank.setFill(tank.getFill() + amount); + slots[out] = emptyContainer; + + slots[in].stackSize--; + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + } else if(slots[out] != null && (emptyContainer == null || (slots[out].getItem() == emptyContainer.getItem() && slots[out].getItemDamage() == emptyContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()))) { + + tank.setFill(tank.getFill() + amount); + slots[in].stackSize--; + + if(slots[in].stackSize <= 0) { + slots[in] = null; + } + + if(emptyContainer != null) { + slots[out].stackSize++; + } + } + + return true; + } + + return false; + } + +} diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java new file mode 100644 index 000000000..f07c803b9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidLoadingHandler.java @@ -0,0 +1,9 @@ +package com.hbm.inventory.fluid.tank; + +import net.minecraft.item.ItemStack; + +public abstract class FluidLoadingHandler { + + public abstract boolean fillItem(ItemStack[] slots, int in, int out, FluidTank tank); + public abstract boolean emptyItem(ItemStack[] slots, int in, int out, FluidTank tank); +} diff --git a/src/main/java/com/hbm/inventory/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java similarity index 55% rename from src/main/java/com/hbm/inventory/FluidTank.java rename to src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index e426df201..074dfdd5e 100644 --- a/src/main/java/com/hbm/inventory/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -1,17 +1,14 @@ -package com.hbm.inventory; +package com.hbm.inventory.fluid.tank; import java.util.ArrayList; import java.util.List; import org.lwjgl.opengl.GL11; -import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.gui.GuiInfoContainer; import com.hbm.items.ModItems; -import com.hbm.items.armor.ItemArmorMod; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEFluidPacket; @@ -20,13 +17,19 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; public class FluidTank { + public static final List loadingHandlers = new ArrayList(); + + static { + loadingHandlers.add(new FluidLoaderStandard()); + loadingHandlers.add(new FluidLoaderFillableItem()); + } + FluidType type; int fluid; int maxFluid; @@ -52,7 +55,6 @@ public class FluidTank { } public FluidType getTankType() { - return type; } @@ -93,144 +95,73 @@ public class FluidTank { //Fills tank from canisters public boolean loadTank(int in, int out, ItemStack[] slots) { - FluidType inType = Fluids.NONE; - if(slots[in] != null) { - - //TODO: add IPartiallyFillable case for unloading, useful for infinite tanks so they don't need to be hardcoded - - inType = FluidContainerRegistry.getFluidType(slots[in]); - - if(slots[in].getItem() == ModItems.fluid_barrel_infinite && type != Fluids.NONE) { - this.fluid = this.maxFluid; - return true; - } - - if(slots[in].getItem() == ModItems.inf_water && this.type == Fluids.WATER) { - this.fluid += 50; - if(this.fluid > this.maxFluid) - this.fluid = this.maxFluid; - return true; - } - - if(slots[in].getItem() == ModItems.inf_water_mk2 && this.type == Fluids.WATER) { - this.fluid += 500; - if(this.fluid > this.maxFluid) - this.fluid = this.maxFluid; - return true; - } - - if(FluidContainerRegistry.getFluidContent(slots[in], type) <= 0) - return false; - } else { + if(slots[in] == null) return false; - } - if(slots[in] != null && inType.getName().equals(type.getName()) && fluid + FluidContainerRegistry.getFluidContent(slots[in], type) <= maxFluid) { - - ItemStack emptyContainer = FluidContainerRegistry.getEmptyContainer(slots[in]); - - if(slots[out] == null) { - fluid += FluidContainerRegistry.getFluidContent(slots[in], type); - slots[out] = emptyContainer; - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } else if(slots[out] != null && (emptyContainer == null || (slots[out].getItem() == emptyContainer.getItem() && slots[out].getItemDamage() == emptyContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()))) { - fluid += FluidContainerRegistry.getFluidContent(slots[in], type); - - if(emptyContainer != null) - slots[out].stackSize++; - - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } - + if(slots[in].getItem() == ModItems.fluid_barrel_infinite && type != Fluids.NONE) { + this.fluid = this.maxFluid; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water && this.type == Fluids.WATER) { + this.fluid += 50; + if(this.fluid > this.maxFluid) + this.fluid = this.maxFluid; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water_mk2 && this.type == Fluids.WATER) { + this.fluid += 500; + if(this.fluid > this.maxFluid) + this.fluid = this.maxFluid; return true; } - return false; + int prev = this.getFill(); + + for(FluidLoadingHandler handler : loadingHandlers) { + if(handler.emptyItem(slots, in, out, this)) { + break; + } + } + + return this.getFill() > prev; } //Fills canisters from tank - public void unloadTank(int in, int out, ItemStack[] slots) { - - ItemStack full = null; - if(slots[in] != null) { - - ItemStack partial = slots[in]; - - if(partial.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(partial)) { - - partial = ArmorModHandler.pryMods(partial)[ArmorModHandler.plate_only]; - - if(partial == null) - partial = slots[in]; - } - - if(partial.getItem() instanceof IPartiallyFillable) { - IPartiallyFillable fillable = (IPartiallyFillable)partial.getItem(); - int speed = fillable.getLoadSpeed(partial); - - if(fillable.getType(partial) == this.type && speed > 0) { - - int toLoad = Math.min(this.fluid, speed); - int fill = fillable.getFill(partial); - toLoad = Math.min(toLoad, fillable.getMaxFill(partial) - fill); - - if(toLoad > 0) { - this.fluid -= toLoad; - fillable.setFill(partial, fill + toLoad); - } - } - - if(slots[in].getItem() instanceof ItemArmor && partial.getItem() instanceof ItemArmorMod) { - ArmorModHandler.applyMod(slots[in], partial); - } - - return; - } - - if(slots[in].getItem() == ModItems.fluid_barrel_infinite) { - this.fluid = 0; - return; - } - - if(slots[in].getItem() == ModItems.inf_water && type == Fluids.WATER) { - this.fluid -= 50; - if(this.fluid < 0) - this.fluid = 0; - return; - } - - if(slots[in].getItem() == ModItems.inf_water_mk2 && type == Fluids.WATER) { - this.fluid -= 500; - if(this.fluid < 0) - this.fluid = 0; - return; - } - - full = FluidContainerRegistry.getFullContainer(slots[in], type); - } - if(full == null) - return; + public boolean unloadTank(int in, int out, ItemStack[] slots) { - if(slots[in] != null && fluid - FluidContainerRegistry.getFluidContent(full, type) >= 0) { - ItemStack fullContainer = FluidContainerRegistry.getFullContainer(slots[in], type); - if(slots[out] == null) { - fluid -= FluidContainerRegistry.getFluidContent(full, type); - slots[out] = full.copy(); - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - } else if(slots[out] != null && slots[out].getItem() == fullContainer.getItem() && slots[out].getItemDamage() == fullContainer.getItemDamage() && slots[out].stackSize < slots[out].getMaxStackSize()) { - fluid -= FluidContainerRegistry.getFluidContent(full, type); - slots[in].stackSize--; - if(slots[in].stackSize <= 0) - slots[in] = null; - slots[out].stackSize++; + if(slots[in] == null) + return false; + + if(slots[in].getItem() == ModItems.fluid_barrel_infinite) { + this.fluid = 0; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water && type == Fluids.WATER) { + this.fluid -= 50; + if(this.fluid < 0) + this.fluid = 0; + return true; + } + + if(slots[in].getItem() == ModItems.inf_water_mk2 && type == Fluids.WATER) { + this.fluid -= 500; + if(this.fluid < 0) + this.fluid = 0; + return true; + } + + int prev = this.getFill(); + + for(FluidLoadingHandler handler : loadingHandlers) { + if(handler.fillItem(slots, in, out, this)) { + break; } } + + return this.getFill() < prev; } public boolean setType(int in, ItemStack[] slots) { diff --git a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java similarity index 73% rename from src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java rename to src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java index 449d4b673..2c6480099 100644 --- a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeCombustible.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Combustible.java @@ -1,26 +1,19 @@ -package com.hbm.inventory.fluid.types; +package com.hbm.inventory.fluid.trait; import java.util.List; -import com.hbm.render.util.EnumSymbol; import com.hbm.util.BobMathUtil; import net.minecraft.util.EnumChatFormatting; -/** Because updating all the combustion engines and adding values by hand fucking sucks */ -public class FluidTypeCombustible extends FluidTypeFlammable { +public class FT_Combustible extends FluidTrait { protected FuelGrade fuelGrade; protected long combustionEnergy; - public FluidTypeCombustible(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - } - - public FluidTypeCombustible setCombustionEnergy(FuelGrade grade, long energy) { + public FT_Combustible(FuelGrade grade, long energy) { this.fuelGrade = grade; this.combustionEnergy = energy; - return this; } @Override 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 new file mode 100644 index 000000000..25bd1488d --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Coolable.java @@ -0,0 +1,59 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.HashMap; +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Coolable extends FluidTrait { + + protected HashMap efficiency = new HashMap(); + + public final FluidType coolsTo; + public int amountReq; + public int amountProduced; + public final int heatEnergy; + + public FT_Coolable(FluidType type, int req, int prod, int heat) { + this.coolsTo = type; + this.amountReq = req; + this.amountProduced = prod; + this.heatEnergy = heat; + } + + public FT_Coolable setEff(CoolingType type, double eff) { + efficiency.put(type, eff); + return this; + } + + public double getEfficiency(CoolingType type) { + Double eff = this.efficiency.get(type); + return eff != null ? eff : 0.0D; + } + + @Override + public void addInfoHidden(List info) { + for(CoolingType type : CoolingType.values()) { + + double eff = getEfficiency(type); + + if(eff > 0) { + info.add(EnumChatFormatting.AQUA + "[" + type.name + "]"); + info.add(EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + } + } + } + + public static enum CoolingType { + TURBINE("Turbine Steam"), + HEATEXCHANGER("Coolable"); + + public String name; + + private CoolingType(String name) { + this.name = name; + } + } +} 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 new file mode 100644 index 000000000..4e0354033 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Corrosive.java @@ -0,0 +1,32 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Corrosive extends FluidTrait { + + /* 0-100 */ + private int rating; + + public FT_Corrosive(int rating) { + this.rating = rating; + } + + public int getRating() { + return rating; + } + + public boolean isHighlyCorrosive() { + return rating > 50; + } + + @Override + public void addInfo(List info) { + + if(isHighlyCorrosive()) + info.add(EnumChatFormatting.GOLD + "[Strongly Corrosive]"); + else + info.add(EnumChatFormatting.YELLOW + "[Corrosive]"); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java similarity index 50% rename from src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java rename to src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java index 37bf5e8e0..c2b582ae5 100644 --- a/src/main/java/com/hbm/inventory/fluid/types/FluidTypeFlammable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Flammable.java @@ -1,32 +1,24 @@ -package com.hbm.inventory.fluid.types; +package com.hbm.inventory.fluid.trait; import java.util.List; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; import com.hbm.util.BobMathUtil; import net.minecraft.util.EnumChatFormatting; -/** If it burns, it needs to be an instance of this class. */ -public class FluidTypeFlammable extends FluidType { +public class FT_Flammable extends FluidTrait { /** How much heat energy (usually translates into HE 1:1) 1000mB hold */ - protected long energy; + private long energy; - public FluidTypeFlammable(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - } - - public FluidTypeFlammable setHeatEnergy(long energy) { + public FT_Flammable(long energy) { this.energy = energy; - return this; } public long getHeatEnergy() { return this.energy; } - + @Override public void addInfo(List info) { super.addInfo(info); @@ -34,6 +26,6 @@ public class FluidTypeFlammable extends FluidType { info.add(EnumChatFormatting.YELLOW + "[Flammable]"); if(energy > 0) - info.add(EnumChatFormatting.YELLOW + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "HE " + EnumChatFormatting.YELLOW + "per bucket"); + info.add(EnumChatFormatting.YELLOW + "Provides " + EnumChatFormatting.RED + "" + BobMathUtil.getShortNumber(energy) + "TU " + EnumChatFormatting.YELLOW + "per bucket"); } } 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 new file mode 100644 index 000000000..e01169076 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -0,0 +1,74 @@ +package com.hbm.inventory.fluid.trait; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.util.EnumChatFormatting; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class FT_Heatable extends FluidTrait { + + protected List steps = new ArrayList(); + protected HashMap efficiency = new HashMap(); + + /** Add in ascending order, lowest heat required goes first! */ + public FT_Heatable addStep(int heat, int req, FluidType type, int prod) { + steps.add(new HeatingStep(req, heat, type, prod)); + return this; + } + + /** sets efficiency for different types of heating, main difference is with water */ + public FT_Heatable setEff(HeatingType type, double eff) { + efficiency.put(type, eff); + return this; + } + + public double getEfficiency(HeatingType type) { + Double eff = this.efficiency.get(type); + return eff != null ? eff : 0.0D; + } + + public HeatingStep getFirstStep() { + return this.steps.get(0); + } + + @Override + public void addInfoHidden(List info) { + for(HeatingType type : HeatingType.values()) { + + double eff = getEfficiency(type); + + if(eff > 0) { + info.add(EnumChatFormatting.AQUA + "[" + type.name + "]"); + info.add(EnumChatFormatting.AQUA + "Efficiency: " + ((int) (eff * 100D)) + "%"); + } + } + } + + public static class HeatingStep { + public final int amountReq; + public final int heatReq; + public final FluidType typeProduced; + public final int amountProduced; + + public HeatingStep(int req, int heat, FluidType type, int prod) { + this.amountReq = req; + this.heatReq = heat; + this.typeProduced = type; + this.amountProduced = prod; + } + } + + public static enum HeatingType { + BOILER("Boilable"), + HEATEXCHANGER("Heatable"); + + public String name; + + private HeatingType(String name) { + this.name = name; + } + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java new file mode 100644 index 000000000..a8154c1f5 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Poison.java @@ -0,0 +1,29 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_Poison extends FluidTrait { + + protected boolean withering = false; + protected int level = 0; + + public FT_Poison(boolean withering, int level) { + this.withering = withering; + this.level = level; + } + + public boolean isWithering() { + return this.withering; + } + + public int getLevel() { + return this.level; + } + + @Override + public void addInfoHidden(List info) { + info.add(EnumChatFormatting.GREEN + "[Toxic Fumes]"); + } +} 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 new file mode 100644 index 000000000..64c4c5072 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_VentRadiation.java @@ -0,0 +1,24 @@ +package com.hbm.inventory.fluid.trait; + +import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.inventory.fluid.tank.FluidTank; + +import net.minecraft.world.World; + +public class FT_VentRadiation extends FluidTrait { + + float radPerMB = 0; + + public FT_VentRadiation(float rad) { + this.radPerMB = rad; + } + + public float getRadPerMB() { + return this.radPerMB; + } + + @Override + public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { + ChunkRadiationManager.proxy.incrementRad(world, x, y, z, overflowAmount * radPerMB); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java new file mode 100644 index 000000000..128e945b0 --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -0,0 +1,17 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +import com.hbm.inventory.fluid.tank.FluidTank; + +import net.minecraft.world.World; + +public abstract class FluidTrait { + + /** Important information that should always be displayed */ + public void addInfo(List info) { } + /* General names of simple traits which are displayed when holding shift */ + public void addInfoHidden(List info) { } + + public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java new file mode 100644 index 000000000..8afc8ee8f --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTraitSimple.java @@ -0,0 +1,47 @@ +package com.hbm.inventory.fluid.trait; + +import java.util.List; + +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]"); + } + } + + public static class FT_Gaseous_ART extends FluidTrait { } //at room temperature, for cryogenic hydrogen for example + + public static class FT_Liquid extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.BLUE + "[Liquid]"); + } + } + + public static class FT_Plasma extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.LIGHT_PURPLE + "[Plasma]"); + } + } + + public static class FT_Amat extends FluidTrait { + @Override public void addInfo(List info) { + info.add(EnumChatFormatting.DARK_RED + "[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]"); + } + } + public static class FT_Delicious extends FluidTrait { + @Override public void addInfoHidden(List info) { + info.add(EnumChatFormatting.DARK_GREEN + "[Delicious]"); + }} + + public static class FT_NoID extends FluidTrait { } + public static class FT_NoContainer extends FluidTrait { } +} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java b/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java deleted file mode 100644 index a077efc53..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Antimatter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Antimatter extends FluidType { - - public Antimatter(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.AMAT); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java b/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java deleted file mode 100644 index b260f0fe1..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/CombustibleGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class CombustibleGas extends FluidTypeCombustible { - - public CombustibleGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java b/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java deleted file mode 100644 index 0216a9029..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/FlammableGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class FlammableGas extends FluidTypeFlammable { - - public FlammableGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java b/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java deleted file mode 100644 index d7909ffda..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/FlammableOilGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class FlammableOilGas extends FlammableGas { - - public FlammableOilGas(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Fuel.java b/src/main/java/com/hbm/inventory/fluid/types/Fuel.java deleted file mode 100644 index d37c3fa20..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Fuel.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class Fuel extends FluidTypeCombustible { - - public Fuel(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Gas.java b/src/main/java/com/hbm/inventory/fluid/types/Gas.java deleted file mode 100644 index 103492c6a..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Gas.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Gas extends FluidType { - - public Gas(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Oil.java b/src/main/java/com/hbm/inventory/fluid/types/Oil.java deleted file mode 100644 index 915895d89..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Oil.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class Oil extends FluidTypeFlammable { - - public Oil(String compat, int color, int p, int f, int r, EnumSymbol symbol) { - super(compat, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java b/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java deleted file mode 100644 index ec6258ae8..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/Petrochemical.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -public class Petrochemical extends FluidType { - - public Petrochemical(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID, FluidTrait.PETROCHEMICAL); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java b/src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java deleted file mode 100644 index e8610c54e..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveFluid.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.handler.radiation.ChunkRadiationManager; -import com.hbm.inventory.FluidTank; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.render.util.EnumSymbol; - -import net.minecraft.world.World; - -public class RadioactiveFluid extends FluidType { - - float radPerMB = 0; - - public RadioactiveFluid(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - } - - public RadioactiveFluid setRadiation(float rad) { - this.radPerMB = rad; - return this; - } - - @Override - public void onFluidRelease(World world, int x, int y, int z, FluidTank tank, int overflowAmount) { - ChunkRadiationManager.proxy.incrementRad(world, x, y, z, overflowAmount * radPerMB); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java b/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java deleted file mode 100644 index e3b29124b..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveGas.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class RadioactiveGas extends RadioactiveFluid { - - public RadioactiveGas(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.GASEOUS); - } -} diff --git a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java b/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java deleted file mode 100644 index f867ab9f0..000000000 --- a/src/main/java/com/hbm/inventory/fluid/types/RadioactiveLiquid.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hbm.inventory.fluid.types; - -import com.hbm.render.util.EnumSymbol; - -public class RadioactiveLiquid extends RadioactiveFluid { - - public RadioactiveLiquid(String name, int color, int p, int f, int r, EnumSymbol symbol) { - super(name, color, p, f, r, symbol); - this.addTraits(FluidTrait.LIQUID); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java b/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java index 0e9ccc27e..35f522588 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSBase.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSBase; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSBase; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java b/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java index 522a3da4e..036b610a4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSEmitter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSEmitter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSEmitter; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java b/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java index c3717774b..6a6ff3757 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAMSLimiter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerAMSLimiter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityAMSLimiter; diff --git a/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java b/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java index 3713846e4..e255586cf 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java +++ b/src/main/java/com/hbm/inventory/gui/GUIArmorTable.java @@ -24,7 +24,7 @@ public class GUIArmorTable extends GuiInfoContainer { public GUIArmorTable(InventoryPlayer player) { super(new ContainerArmorTable(player)); - this.xSize = 176; + this.xSize = 176 + 22; this.ySize = 222; guiLeft = (this.width - this.xSize) / 2; @@ -62,8 +62,9 @@ public class GUIArmorTable extends GuiInfoContainer { protected void drawGuiContainerForegroundLayer(int mX, int mY) { - this.fontRendererObj.drawString(I18n.format("container.armorTable"), 28, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + String name = I18n.format("container.armorTable"); + this.fontRendererObj.drawString(name, (this.xSize - 22) / 2 - this.fontRendererObj.getStringWidth(name) / 2 + 22, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8 + 22, this.ySize - 96 + 2, 4210752); } protected void drawGuiContainerBackgroundLayer(float inter, int mX, int mY) { @@ -71,20 +72,21 @@ public class GUIArmorTable extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(texture); - this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize); + this.drawTexturedModalRect(guiLeft + 22, guiTop, 0, 0, this.xSize - 22, this.ySize); + this.drawTexturedModalRect(guiLeft, guiTop + 31, 176, 96, 22, 100); ItemStack armor = this.inventorySlots.getSlot(8).getStack(); if(armor != null) { if(armor.getItem() instanceof ItemArmor) - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 74, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 74, 22, 22); else - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 52, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 52, 22, 22); } else { if(System.currentTimeMillis() % 1000 < 500) - this.drawTexturedModalRect(guiLeft + 41, guiTop + 60, 176, 52, 22, 22); + this.drawTexturedModalRect(guiLeft + 41 + 22, guiTop + 60, 176, 52, 22, 22); } for(int i = 0; i < 8; i++) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java index e197a1d3b..4b52a4f29 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerBarrel; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUICore.java b/src/main/java/com/hbm/inventory/gui/GUICore.java index 7e54f413a..f10382b55 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICore.java +++ b/src/main/java/com/hbm/inventory/gui/GUICore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCore; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index f775e92c9..26ad8879d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -4,8 +4,8 @@ import org.apache.commons.lang3.math.NumberUtils; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreEmitter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; @@ -24,29 +24,29 @@ public class GUICoreEmitter extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/dfc/gui_emitter.png"); private TileEntityCoreEmitter emitter; - private GuiTextField field; - + private GuiTextField field; + public GUICoreEmitter(InventoryPlayer invPlayer, TileEntityCoreEmitter tedf) { super(new ContainerCoreEmitter(invPlayer, tedf)); emitter = tedf; - + this.xSize = 176; this.ySize = 166; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); - this.field.setTextColor(-1); - this.field.setDisabledTextColour(-1); - this.field.setEnableBackgroundDrawing(false); - this.field.setMaxStringLength(3); - this.field.setText(String.valueOf(emitter.watts)); + Keyboard.enableRepeatEvents(true); + this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); + this.field.setTextColor(-1); + this.field.setDisabledTextColour(-1); + this.field.setEnableBackgroundDrawing(false); + this.field.setMaxStringLength(3); + this.field.setText(String.valueOf(emitter.watts)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -54,38 +54,38 @@ public class GUICoreEmitter extends GuiInfoContainer { emitter.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 17, 16, 52); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 17, 16, 52, emitter.power, emitter.maxPower); } - + protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); this.field.mouseClicked(x, y, i); - if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - - if(NumberUtils.isNumber(field.getText())) { - int j = MathHelper.clamp_int((int)Double.parseDouble(field.getText()), 1, 100); - field.setText(j + ""); - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); - } - } + if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - if(guiLeft + 133 <= x && guiLeft + 133 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { + if(NumberUtils.isNumber(field.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(field.getText()), 1, 100); + field.setText(j + ""); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); + } + } + + if(guiLeft + 133 <= x && guiLeft + 133 + 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(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); - } + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); + } } @Override - protected void drawGuiContainerForegroundLayer( int i, int j) { + protected void drawGuiContainerForegroundLayer(int i, int j) { String name = I18n.format(this.emitter.getInventoryName()); this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - + this.fontRendererObj.drawString("Output: " + BobMathUtil.getShortNumber(emitter.prev) + "Spk", 50, 30, 0xFF7F7F); - + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -99,19 +99,19 @@ public class GUICoreEmitter extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 133, guiTop + 52, 192, 0, 18, 18); drawTexturedModalRect(guiLeft + 53, guiTop + 45, 210, 0, emitter.watts * 34 / 100, 4); - + int i = (int) emitter.getPowerScaled(52); drawTexturedModalRect(guiLeft + 26, guiTop + 69 - i, 176, 52 - i, 16, i); - + this.field.drawTextBox(); emitter.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); } - + protected void keyTyped(char p_73869_1_, int p_73869_2_) { - + if(this.field.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - + } else { super.keyTyped(p_73869_1_, p_73869_2_); } diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java b/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java index 74896f066..53de30586 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreInjector.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreInjector; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCoreInjector; diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java b/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java index e099104d9..bd849a217 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreReceiver.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCoreReceiver; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityCoreReceiver; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java index 276f606b9..e2faf5fa4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneBoxer.java @@ -27,11 +27,6 @@ public class GUICraneBoxer extends GuiInfoContainer { this.xSize = 176; this.ySize = 185; } - - @Override - public void drawScreen(int x, int y, float interp) { - super.drawScreen(x, y, interp); - } @Override protected void mouseClicked(int x, int y, int i) { diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java new file mode 100644 index 000000000..f378237df --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java @@ -0,0 +1,132 @@ +package com.hbm.inventory.gui; + +import java.util.Arrays; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCraneRouter; +import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.tileentity.network.TileEntityCraneRouter; + +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.inventory.Slot; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUICraneRouter extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crane_router.png"); + private TileEntityCraneRouter router; + + public GUICraneRouter(InventoryPlayer invPlayer, TileEntityCraneRouter tedf) { + super(new ContainerCraneRouter(invPlayer, tedf)); + router = tedf; + + this.xSize = 256; + this.ySize = 201; + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + + if(guiLeft + 7 + j * 222 <= x && guiLeft + 7 + j * 222 + 18 > x && guiTop + 16 + k * 26 < y && guiTop + 16 + k * 26 + 18 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("toggle", j * 3 + k); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, router.xCoord, router.yCoord, router.zCoord)); + } + } + } + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + + if(guiLeft + 7 + j * 222 <= x && guiLeft + 7 + j * 222 + 18 > x && guiTop + 16 + k * 26 < y && guiTop + 16 + k * 26 + 18 >= y) { + + String[] text = new String[2]; + int index = j * 3 + k; + + switch(router.modes[index]) { + case 0: text = new String[] { "OFF" }; break; + case 1: text[0] = "WHITELIST"; text[1] = "Route if filter matches"; break; + case 2: text[0] = "BLACKLIST"; text[1] = "Route if filter doesn't match"; break; + case 3: text[0] = "WILDCARD"; text[1] = "Route if no other route is valid"; break; + } + + this.func_146283_a(Arrays.asList(text), x, y); + } + } + } + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 0; i < 30; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + ModulePatternMatcher matcher = router.patterns[i / 5]; + int index = i % 5; + + if(this.isMouseOverSlot(slot, x, y) && matcher.modes[index] != null) { + + String label = EnumChatFormatting.YELLOW + ""; + + switch(matcher.modes[index]) { + case "exact": label += "Item and meta match"; break; + case "wildcard": label += "Item matches"; break; + default: label += "Ore dict key matches: " + matcher.modes[index]; break; + } + + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label}), x, y - 30); + } + } + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.router.hasCustomInventoryName() ? this.router.getInventoryName() : I18n.format(this.router.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8 + 39, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, 256, 93); + drawTexturedModalRect(guiLeft + 39, guiTop + 93, 39, 93, 176, 108); + + for(int j = 0; j < 2; j++) { + for(int k = 0; k < 3; k++) { + int index = j * 3 + k; + int mode = router.modes[index]; + drawTexturedModalRect(guiLeft + 7 + j * 222, guiTop + 16 + k * 26, 238, 93 + mode * 18, 18, 18); + } + } + + if(Keyboard.isKeyDown(Keyboard.KEY_LMENU)) + for(int i = 0; i < this.inventorySlots.inventorySlots.size(); i++) { + Slot s = this.inventorySlots.getSlot(i); + + this.fontRendererObj.drawStringWithShadow(i + "", guiLeft + s.xDisplayPosition + 2, guiTop + s.yDisplayPosition, 0xffffff); + this.fontRendererObj.drawStringWithShadow(s.getSlotIndex() + "", guiLeft + s.xDisplayPosition + 2, guiTop + s.yDisplayPosition + 8, 0xff8080); + } + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICrucible.java b/src/main/java/com/hbm/inventory/gui/GUICrucible.java new file mode 100644 index 000000000..aa1893b21 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUICrucible.java @@ -0,0 +1,118 @@ +package com.hbm.inventory.gui; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityCrucible; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUICrucible extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_crucible.png"); + private TileEntityCrucible crucible; + + public GUICrucible(InventoryPlayer invPlayer, TileEntityCrucible tedf) { + super(new ContainerCrucible(invPlayer, tedf)); + crucible = tedf; + + this.xSize = 176; + this.ySize = 214; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + drawStackInfo(crucible.wasteStack, x, y, 16, 17); + drawStackInfo(crucible.recipeStack, x, y, 61, 17); + + this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 81, 34, 7, x, y, new String[] { String.format("%,d", crucible.progress) + " / " + String.format("%,d", crucible.processTime) + "TU" }); + this.drawCustomInfoStat(x, y, guiLeft + 125, guiTop + 90, 34, 7, x, y, new String[] { String.format("%,d", crucible.heat) + " / " + String.format("%,d", crucible.maxHeat) + "TU" }); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.crucible.hasCustomInventoryName() ? this.crucible.getInventoryName() : I18n.format(this.crucible.getInventoryName()); + + 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); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int pGauge = crucible.progress * 33 / crucible.processTime; + if(pGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 82, 176, 0, pGauge, 5); + int hGauge = crucible.heat * 33 / crucible.maxHeat; + if(hGauge > 0) drawTexturedModalRect(guiLeft + 126, guiTop + 91, 176, 5, hGauge, 5); + + if(!crucible.recipeStack.isEmpty()) drawStack(crucible.recipeStack, crucible.recipeZCapacity, 62, 97); + if(!crucible.wasteStack.isEmpty()) drawStack(crucible.wasteStack, crucible.wasteZCapacity, 17, 97); + } + + protected void drawStackInfo(List stack, int mouseX, int mouseY, int x, int y) { + + List list = new ArrayList(); + + if(stack.isEmpty()) + list.add(EnumChatFormatting.RED + "Empty"); + + for(MaterialStack sta : stack) { + list.add(EnumChatFormatting.YELLOW + sta.material.names[0] + ": " + Mats.formatAmount(sta.amount)); + } + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + x, guiTop + y, 36, 81, mouseX, mouseY, list); + } + + protected void drawStack(List stack, int capacity, int x, int y) { + + if(stack.isEmpty()) return; + + int lastHeight = 0; + int lastQuant = 0; + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + + for(MaterialStack sta : stack) { + + int targetHeight = (lastQuant + sta.amount) * 79 / capacity; + + if(lastHeight == targetHeight) continue; //skip draw calls that would be 0 pixels high + + int offset = sta.material.smeltable == SmeltingBehavior.ADDITIVE ? 34 : 0; //additives use a differnt texture + + int hex = sta.material.moltenColor; + //hex = 0xC18336; + Color color = new Color(hex); + GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + drawTexturedModalRect(guiLeft + x, guiTop + y - targetHeight, 176 + offset, 89 - targetHeight, 34, targetHeight - lastHeight); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1F, 1F, 1F, 0.3F); + drawTexturedModalRect(guiLeft + x, guiTop + y - targetHeight, 176 + offset, 89 - targetHeight, 34, targetHeight - lastHeight); + GL11.glDisable(GL11.GL_BLEND); + + lastQuant += sta.amount; + lastHeight = targetHeight; + } + + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor3f(255, 255, 255); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java index 0fa0b39bb..e9b03cea8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrystallizer.java @@ -2,7 +2,6 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCrystallizer; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java index 3aa6b4939..92899dc15 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerFWatzCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityFWatzCore; diff --git a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java index f930ad471..66ee4be51 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFirebox.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFirebox.java @@ -48,7 +48,7 @@ public class GUIFirebox extends GuiInfoContainer { } this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 27, 71, 7, x, y, new String[] { String.format("%,d", firebox.heatEnergy) + " / " + String.format("%,d", firebox.maxHeatEnergy) + "TU" }); - this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { firebox.burnHeat + "TU/s", (firebox.burnTime / 20) + "s" }); + this.drawCustomInfoStat(x, y, guiLeft + 80, guiTop + 36, 71, 7, x, y, new String[] { firebox.burnHeat + "TU/t", (firebox.burnTime / 20) + "s" }); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java b/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java index cad0be5e6..a7dcb6eb8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFurnaceSteel.java @@ -32,7 +32,6 @@ public class GUIFurnaceSteel extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 17 + 18 * i, 70, 7, x, y, new String[] { String.format("%,d", furnace.progress[i]) + " / " + String.format("%,d", furnace.processTime) + "TU" }); this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 26 + 18 * i, 70, 7, x, y, new String[] { "Bonus: " + furnace.bonus[i] + "%" }); } - //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 44, 71, 7, x, y, new String[] { (furnace.burnTime / 20) + "s" }); this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 18, 9, 50, x, y, new String[] { String.format("%,d", furnace.heat) + " / " + String.format("%,d", furnace.maxHeat) + "TU" }); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java b/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java index ab2a46985..92515e83d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIIGenerator.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerIGenerator; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineIGenerator; diff --git a/src/main/java/com/hbm/inventory/gui/GUIITER.java b/src/main/java/com/hbm/inventory/gui/GUIITER.java index 4bf14fce3..afce8ac71 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIITER.java +++ b/src/main/java/com/hbm/inventory/gui/GUIITER.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerITER; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java b/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java index 102e5ac01..80757c69b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java +++ b/src/main/java/com/hbm/inventory/gui/GUILiquefactor.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerLiquefactor; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.oil.TileEntityMachineLiquefactor; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java index 8ea6d2891..5b2e00658 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java @@ -39,11 +39,10 @@ public class GUIMachineBattery extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 62, guiTop + 69 - 52, 52, 52, battery.power, battery.getMaxPower()); - long delta = battery.log[19] - battery.log[0]; - String deltaText = BobMathUtil.getShortNumber(Math.abs(delta)) + "HE/s"; + String deltaText = BobMathUtil.getShortNumber(Math.abs(battery.delta)) + "HE/s"; - if(delta > 0) deltaText = EnumChatFormatting.GREEN + "+" + deltaText; - else if(delta < 0) deltaText = EnumChatFormatting.RED + "-" + deltaText; + if(battery.delta > 0) deltaText = EnumChatFormatting.GREEN + "+" + deltaText; + else if(battery.delta < 0) deltaText = EnumChatFormatting.RED + "-" + deltaText; else deltaText = EnumChatFormatting.YELLOW + "+" + deltaText; String[] info = { BobMathUtil.getShortNumber(battery.power) + "/" + BobMathUtil.getShortNumber(battery.getMaxPower()) + "HE", deltaText }; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java index 63228567a..0360424f2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBoiler.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineBoiler; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineBoiler; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java index 2ee4be877..3fd16c846 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBoilerElectric.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineBoilerElectric; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineBoilerElectric; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java index f50281ce6..47369d642 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCMBFactory.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCMBFactory; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCMBFactory; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java index 0f63fb550..24b1cf2ae 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCoal.java @@ -7,7 +7,6 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCoal; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineCoal; @@ -71,27 +70,25 @@ public class GUIMachineCoal extends GuiInfoContainer { drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); //It's as horrifying as it is functional. - TileEntityMachineCoal dud = diFurnace; - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineCoal) - dud = (TileEntityMachineCoal) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); + diFurnace = (TileEntityMachineCoal) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - if(dud.power > 0) { - int i = (int)dud.getPowerScaled(52); + if(diFurnace.power > 0) { + int i = (int)diFurnace.getPowerScaled(52); drawTexturedModalRect(guiLeft + 152, guiTop + 69 - i, 176, 52 - i, 16, i); } - if(dud.burnTime > 0) + if(diFurnace.burnTime > 0) { drawTexturedModalRect(guiLeft + 79, guiTop + 34, 208, 0, 18, 18); } - if(dud.tank.getFill() <= 0) + if(diFurnace.tank.getFill() <= 0) this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 32, 16, 16, 6); this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); - dud.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); + diFurnace.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java index 00c096038..533f600c0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCompactLauncher.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerCompactLauncher; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.lib.RefStrings; import com.hbm.render.util.MissileMultipart; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java index 1937020a4..7488de6b0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCyclotron.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineCyclotron; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java index 6ea316099..d1c34d7ad 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineDiesel.java @@ -7,10 +7,10 @@ import java.util.Map.Entry; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineDiesel; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineDiesel; import com.hbm.util.BobMathUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java index eb56115a9..1f97b7216 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineElectricFurnace.java @@ -7,6 +7,7 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerElectricFurnace; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineElectricFurnace; @@ -57,24 +58,19 @@ public class GUIMachineElectricFurnace extends GuiInfoContainer { //if initial ZE is still present, it'll be used instead //works so that container packets can still be used //efficiency! - TileEntityMachineElectricFurnace fs = null; - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineElectricFurnace) - fs = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - else - fs = diFurnace; + diFurnace = (TileEntityMachineElectricFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - if(fs.hasPower()) { + if(diFurnace.hasPower()) { int i = (int)diFurnace.getPowerScaled(52); drawTexturedModalRect(guiLeft + 20, guiTop + 69 - i, 200, 52 - i, 16, i); } - if(diFurnace.canProcess() && diFurnace.hasPower()) - { + if(diFurnace.getWorldObj().getBlock(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) == ModBlocks.machine_electric_furnace_on) { drawTexturedModalRect(guiLeft + 56, guiTop + 35, 176, 0, 16, 16); } - int j1 = fs.getProgressScaled(24); + int j1 = diFurnace.getProgressScaled(24); drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 17, j1 + 1, 17); this.drawInfoPanel(guiLeft + 151, guiTop + 19, 8, 8, 8); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java index 5563d0a20..358322623 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineFluidTank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineFluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java index 8577cbbcd..b5b853cd7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGasCent.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineGasCent; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineGasCent; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java index 06a29102d..abcc30b6e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGasFlare.java @@ -3,7 +3,7 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineGasFlare; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; @@ -79,7 +79,7 @@ public class GUIMachineGasFlare extends GuiInfoContainer { if(flare.isOn) drawTexturedModalRect(guiLeft + 79, guiTop + 15, 176, 0, 35, 10); if(flare.doesBurn) drawTexturedModalRect(guiLeft + 79, guiTop + 49, 176, 10, 35, 14); - if(flare.isOn && flare.doesBurn && flare.tank.getFill() > 0 && flare.tank.getTankType() instanceof FluidTypeFlammable) + if(flare.isOn && flare.doesBurn && flare.tank.getFill() > 0 && flare.tank.getTankType().hasTrait(FT_Flammable.class)) drawTexturedModalRect(guiLeft + 88, guiTop + 29, 176, 24, 18, 18); flare.tank.renderTank(guiLeft + 35, guiTop + 69, this.zLevel, 16, 52); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java index ed98ce875..486fbabdc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineGenerator.java @@ -7,8 +7,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerGenerator; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineGenerator; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java b/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java index bc3a2e2aa..b3ab1c226 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineInserter.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineInserter; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineInserter; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java index ab0299c1a..d0b12175a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineLargeTurbine.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineLargeTurbine; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineLargeTurbine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java index 9cdf56b0b..fbe7f393a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineLaunchTable.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerLaunchTable; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile.PartSize; import com.hbm.lib.RefStrings; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java index cb978f349..facd91088 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineOilWell.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineOilWell; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.oil.TileEntityOilDrillBase; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java index e2831808a..b5d02932a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePuF6Tank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerPuF6Tank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.storage.TileEntityMachinePuF6Tank; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java index e88f586eb..c0eb74cc4 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRefinery.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineRefinery; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java index 764c269f7..4a52718ec 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java @@ -6,10 +6,10 @@ import java.util.Map.Entry; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineSelenium; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineDiesel; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java index d5ee1d33e..d4603404a 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbine.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMachineTurbine; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineTurbine; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java b/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java index f9bffb001..e9ae176dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineUF6Tank.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerUF6Tank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.storage.TileEntityMachineUF6Tank; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java index a8aab0b0a..d0d5194dc 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMiningLaser.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMiningLaser; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java index 1d7fad6de..661f5681d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java +++ b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java @@ -21,8 +21,8 @@ public class GUINukeFstbmb extends GuiInfoContainer { public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/weapon/fstbmbSchematic.png"); private TileEntityNukeBalefire bomb; - private GuiTextField timer; - + private GuiTextField timer; + public GUINukeFstbmb(InventoryPlayer invPlayer, TileEntityNukeBalefire bomb) { super(new ContainerNukeFstbmb(invPlayer, bomb)); this.bomb = bomb; @@ -30,89 +30,88 @@ public class GUINukeFstbmb extends GuiInfoContainer { this.xSize = 176; this.ySize = 222; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); - this.timer.setTextColor(0xff0000); - this.timer.setDisabledTextColour(0x800000); - this.timer.setEnableBackgroundDrawing(false); - this.timer.setMaxStringLength(3); - this.timer.setText(String.valueOf(bomb.timer / 20)); + Keyboard.enableRepeatEvents(true); + this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); + this.timer.setTextColor(0xff0000); + this.timer.setDisabledTextColour(0x800000); + this.timer.setEnableBackgroundDrawing(false); + this.timer.setMaxStringLength(3); + this.timer.setText(String.valueOf(bomb.timer / 20)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); } protected void mouseClicked(int x, int y, int i) { - super.mouseClicked(x, y, i); - this.timer.mouseClicked(x, y, i); - + super.mouseClicked(x, y, i); + this.timer.mouseClicked(x, y, i); if(!bomb.started) { - if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { - - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); - } + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { + + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); + } } - } - + } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - + String name = this.bomb.hasCustomInventoryName() ? this.bomb.getInventoryName() : I18n.format(this.bomb.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); - + if(bomb.hasBattery()) { String timer = bomb.getMinutes() + ":" + bomb.getSeconds(); double scale = 0.75; GL11.glScaled(scale, scale, scale); - this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1/scale)), (int) (95.5 * (1/scale)), 0xff0000); + this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1 / scale)), (int) (95.5 * (1 / scale)), 0xff0000); - GL11.glScaled(1/scale, 1/scale, 1/scale); + GL11.glScaled(1 / scale, 1 / scale, 1 / scale); } } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + if(bomb.hasEgg()) drawTexturedModalRect(guiLeft + 19, guiTop + 90, 176, 0, 30, 16); - + int battery = bomb.getBattery(); - + if(battery == 1) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 176, 16, 18, 10); else if(battery == 2) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 194, 16, 18, 10); - + if(bomb.started) drawTexturedModalRect(guiLeft + 142, guiTop + 35, 176, 26, 18, 18); - - this.timer.drawTextBox(); - } - - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - - if (this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - if(NumberUtils.isNumber(timer.getText())) { - int j = MathHelper.clamp_int(Integer.parseInt(timer.getText()), 1, 999); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); - } - - } else { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } + this.timer.drawTextBox(); + } + + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + + if(this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + + if(NumberUtils.isNumber(timer.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(timer.getText()), 1, 999); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); + } + + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java index 1316841cf..222174de0 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIOilburner.java +++ b/src/main/java/com/hbm/inventory/gui/GUIOilburner.java @@ -3,7 +3,7 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerOilburner; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.lib.RefStrings; import com.hbm.packet.NBTControlPacket; import com.hbm.packet.PacketDispatcher; @@ -35,8 +35,8 @@ public class GUIOilburner extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 116, guiTop + 17, 16, 52, x, y, new String[] { String.format("%,d", Math.min(diFurnace.heatEnergy, diFurnace.maxHeatEnergy)) + " / " + String.format("%,d", diFurnace.maxHeatEnergy) + "TU" }); - if(diFurnace.tank.getTankType() instanceof FluidTypeFlammable) { - this.drawCustomInfoStat(x, y, guiLeft + 79, guiTop + 34, 18, 18, x, y, new String[] { "10mB/t", (int)(((FluidTypeFlammable)diFurnace.tank.getTankType()).getHeatEnergy() / 1000) * 10 + "TU/t" }); + if(diFurnace.tank.getTankType().hasTrait(FT_Flammable.class)) { + this.drawCustomInfoStat(x, y, guiLeft + 79, guiTop + 34, 18, 18, x, y, new String[] { "10mB/t", (int)(diFurnace.tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() / 1000) * 10 + "TU/t" }); } diFurnace.tank.renderTankInfo(this, x, y, guiLeft + 44, guiTop + 17, 16, 52); @@ -75,7 +75,7 @@ public class GUIOilburner extends GuiInfoContainer { if(diFurnace.isOn) { drawTexturedModalRect(guiLeft + 70, guiTop + 54, 210, 0, 35, 14); - if(diFurnace.tank.getFill() > 0 && diFurnace.tank.getTankType() instanceof FluidTypeFlammable) { + if(diFurnace.tank.getFill() > 0 && diFurnace.tank.getTankType().hasTrait(FT_Flammable.class)) { drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 0, 18, 18); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java b/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java index 3397ec832..a292c9fc2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPlasmaHeater.java @@ -2,9 +2,9 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerMicrowave; import com.hbm.inventory.container.ContainerPlasmaHeater; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java b/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java index c9b621ef1..1a1dfd1e2 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRadiolysis.java @@ -4,8 +4,8 @@ import java.util.List; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerRadiolysis; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemRTGPellet; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineRadiolysis; diff --git a/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java b/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java index b5f36f45a..a12ad1119 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java +++ b/src/main/java/com/hbm/inventory/gui/GUIReactorMultiblock.java @@ -2,10 +2,10 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerReactorMultiblock; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index d0041b0e7..b83b18a14 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -13,12 +13,14 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; +import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemStamp; import com.hbm.items.machine.ItemStamp.StampType; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import com.hbm.packet.ItemFolderPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.util.I18nUtil; @@ -88,6 +90,11 @@ public class GUIScreenTemplateFolder extends GuiScreen { ChemRecipe chem = ChemplantRecipes.recipes.get(i); allStacks.add(new ItemStack(ModItems.chemistry_template, 1, chem.getId())); } + + // Crucible Templates + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + allStacks.add(new ItemStack(ModItems.crucible_template, 1, CrucibleRecipes.recipes.get(i).getId())); + } } else { for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) { @@ -117,11 +124,22 @@ public class GUIScreenTemplateFolder extends GuiScreen { sub = sub.toLowerCase(); + outer: for(ItemStack stack : allStacks) { - if(stack.getDisplayName().toLowerCase().contains(sub)) { - stacks.add(stack); - } else if(stack.getItem() == ModItems.fluid_identifier) { + for(Object o : stack.getTooltip(MainRegistry.proxy.me(), true)) { + + if(o instanceof String) { + String text = (String) o; + + if(text.toLowerCase().contains(sub)) { + stacks.add(stack); + continue outer; + } + } + } + + if(stack.getItem() == ModItems.fluid_identifier) { FluidType fluid = Fluids.fromID(stack.getItemDamage()); if(I18nUtil.resolveKey(fluid.getUnlocalizedName()).toLowerCase().contains(sub)) { @@ -290,19 +308,21 @@ public class GUIScreenTemplateFolder extends GuiScreen { public void drawIcon(boolean b) { try { - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)240 / 1.0F, (float)240 / 1.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) 240 / 1.0F, (float) 240 / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); if(stack != null) { if(stack.getItem() == ModItems.assembly_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), AssemblerRecipes.getOutputFromTempate(stack), xPos + 1, yPos + 1); else if(stack.getItem() == ModItems.chemistry_template) itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), new ItemStack(ModItems.chemistry_icon, 1, stack.getItemDamage()), xPos + 1, yPos + 1); + else if(stack.getItem() == ModItems.crucible_template) + itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon, xPos + 1, yPos + 1); else itemRender.renderItemAndEffectIntoGUI(fontRendererObj, mc.getTextureManager(), stack, xPos + 1, yPos + 1); } - GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_LIGHTING); } catch(Exception x) { } } diff --git a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java index 31ee4f315..d6f2ccda9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java +++ b/src/main/java/com/hbm/inventory/gui/GUISoyuzLauncher.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerSoyuzLauncher; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.PacketDispatcher; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java b/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java index 214431e27..7fb4700fa 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretFritz.java @@ -1,6 +1,6 @@ package com.hbm.inventory.gui; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; import com.hbm.tileentity.turret.TileEntityTurretFritz; diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java index eef8d19bb..1458112b9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretHIMARS.java @@ -1,8 +1,13 @@ package com.hbm.inventory.gui; import com.hbm.lib.RefStrings; +import com.hbm.packet.AuxButtonPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.turret.TileEntityTurretBaseNT; +import com.hbm.tileentity.turret.TileEntityTurretHIMARS; +import com.hbm.util.I18nUtil; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; @@ -14,6 +19,35 @@ public class GUITurretHIMARS extends GUITurretBase { super(invPlayer, tedf); } + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + TileEntityTurretHIMARS arty = (TileEntityTurretHIMARS) turret; + String mode = arty.mode == arty.MODE_AUTO ? "artillery" : "manual"; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 151, guiTop + 16, 18, 18, mouseX, mouseY, I18nUtil.resolveKeyArray("turret.arty." + mode)); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 16 < y && guiTop + 16 + 18 >= y) { + + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(turret.xCoord, turret.yCoord, turret.zCoord, 0, 5)); + return; + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int mX, int mY) { + super.drawGuiContainerBackgroundLayer(p_146976_1_, mX, mY); + + short mode = ((TileEntityTurretHIMARS)turret).mode; + if(mode == TileEntityTurretHIMARS.MODE_MANUAL) drawTexturedModalRect(guiLeft + 151, guiTop + 16, 210, 0, 18, 18); + } + @Override protected ResourceLocation getTexture() { return texture; diff --git a/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java b/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java index 535427cda..2ed9d628d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java +++ b/src/main/java/com/hbm/inventory/gui/GUIWatzCore.java @@ -2,8 +2,8 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerWatzCore; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityWatzCore; diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index bc473af93..46836a484 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -150,8 +150,8 @@ public abstract class GuiInfoContainer extends GuiContainer { minY = this.height - height - 6; } - this.zLevel = 300.0F; - itemRender.zLevel = 300.0F; + this.zLevel = 400.0F; + itemRender.zLevel = 400.0F; //int j1 = -267386864; int colorBg = 0xF0100010; this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); @@ -193,6 +193,7 @@ public abstract class GuiInfoContainer extends GuiContainer { this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); } + GL11.glEnable(GL11.GL_DEPTH_TEST); itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY); itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY, null); RenderHelper.disableStandardItemLighting(); diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java new file mode 100644 index 000000000..196848068 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -0,0 +1,104 @@ +package com.hbm.inventory.material; + +import static com.hbm.inventory.material.Mats.*; +import static com.hbm.inventory.material.MaterialShapes.*; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class MatDistribution { + + public static void register() { + //vanilla crap + registerOre("stone", MAT_STONE, BLOCK.q(1)); + registerOre("cobblestone", MAT_STONE, BLOCK.q(1)); + registerEntry(Blocks.obsidian, MAT_OBSIDIAN, BLOCK.q(1)); + registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); + registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); + registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); + registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); + + //castables + registerEntry(ModItems.blade_titanium, MAT_TITANIUM, INGOT.q(2)); + registerEntry(ModItems.blade_tungsten, MAT_TUNGSTEN, INGOT.q(2)); + registerEntry(ModItems.blades_gold, MAT_GOLD, INGOT.q(4)); + registerEntry(ModItems.blades_aluminium, MAT_ALUMINIUM, INGOT.q(4)); + registerEntry(ModItems.blades_iron, MAT_IRON, INGOT.q(4)); + registerEntry(ModItems.blades_steel, MAT_STEEL, INGOT.q(4)); + registerEntry(ModItems.blades_titanium, MAT_TITANIUM, INGOT.q(4)); + registerEntry(ModItems.blades_advanced_alloy, MAT_ALLOY, INGOT.q(4)); + registerEntry(ModItems.blades_combine_steel, MAT_CMB, INGOT.q(4)); + registerEntry(ModItems.blades_schrabidium, MAT_SCHRABIDIUM, INGOT.q(4)); + registerEntry(ModItems.stamp_stone_flat, MAT_STONE, INGOT.q(3)); + registerEntry(ModItems.stamp_iron_flat, MAT_IRON, INGOT.q(3)); + registerEntry(ModItems.stamp_steel_flat, MAT_STEEL, INGOT.q(3)); + registerEntry(ModItems.stamp_titanium_flat, MAT_TITANIUM, INGOT.q(3)); + registerEntry(ModItems.stamp_obsidian_flat, MAT_OBSIDIAN, INGOT.q(3)); + registerEntry(ModItems.stamp_schrabidium_flat, MAT_SCHRABIDIUM, INGOT.q(3)); + registerEntry(ModItems.hull_small_steel, MAT_STEEL, INGOT.q(2)); + registerEntry(ModItems.hull_small_aluminium, MAT_ALUMINIUM, INGOT.q(2)); + registerEntry(ModItems.hull_big_steel, MAT_STEEL, INGOT.q(6)); + registerEntry(ModItems.hull_big_aluminium, MAT_ALUMINIUM, INGOT.q(6)); + registerEntry(ModItems.hull_big_titanium, MAT_TITANIUM, INGOT.q(6)); + registerEntry(ModItems.pipes_steel, MAT_STEEL, BLOCK.q(3)); + + //actual ores + registerOre(OreDictManager.COAL.ore(), MAT_COAL, GEM.q(4), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(2), MAT_TITANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.U.ore(), MAT_URANIUM, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TH232.ore(), MAT_THORIUM, INGOT.q(2), MAT_URANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TI.ore(), MAT_TITANIUM, INGOT.q(2), MAT_IRON, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CU.ore(), MAT_COPPER, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.W.ore(), MAT_TUNGSTEN, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.AL.ore(), MAT_ALUMINIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.PB.ore(), MAT_LEAD, INGOT.q(2), MAT_GOLD, NUGGET.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.BE.ore(), MAT_BERYLLIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CO.ore(), MAT_COBALT, INGOT.q(1), MAT_STONE, QUART.q(1)); + } + + public static void registerEntry(Object key, Object... matDef) { + ComparableStack comp = null; + + if(key instanceof Item) comp = new ComparableStack((Item) key); + if(key instanceof Block) comp = new ComparableStack((Block) key); + if(key instanceof ItemStack) comp = new ComparableStack((ItemStack) key); + + if(comp == null) return; + if(matDef.length % 2 == 1) return; + + List stacks = new ArrayList(); + + for(int i = 0; i < matDef.length; i += 2) { + stacks.add(new MaterialStack((NTMMaterial) matDef[i], (int) matDef[i + 1])); + } + + if(stacks.isEmpty()) return; + + materialEntries.put(comp, stacks); + } + + public static void registerOre(String key, Object... matDef) { + if(matDef.length % 2 == 1) return; + + List stacks = new ArrayList(); + + for(int i = 0; i < matDef.length; i += 2) { + stacks.add(new MaterialStack((NTMMaterial) matDef[i], (int) matDef[i + 1])); + } + + if(stacks.isEmpty()) return; + + materialOreEntries.put(key, stacks); + } +} diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java new file mode 100644 index 000000000..6235c5670 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -0,0 +1,37 @@ +package com.hbm.inventory.material; + +public enum MaterialShapes { + + QUANTUM(1), // 1/72 of an ingot, allows the ingot to be divisible through 2, 4, 6, 8, 9, 12, 24 and 36 + NUGGET(8, "nugget"), + DUSTTINY(NUGGET.quantity, "dustTiny"), + WIRE(9), + BILLET(NUGGET.quantity * 6, "billet"), + INGOT(NUGGET.quantity * 9, "ingot"), + GEM(INGOT.quantity, "gem"), + CRYSTAL(INGOT.quantity, "crystal"), + DUST(INGOT.quantity, "dust"), + PLATE(INGOT.quantity, "plate"), + QUART(162), + BLOCK(INGOT.quantity * 9, "block"); + + private int quantity; + String[] prefixes; + + private MaterialShapes(int quantity, String... prefixes) { + this.quantity = quantity; + this.prefixes = prefixes; + + for(String prefix : prefixes) { + Mats.prefixByName.put(prefix, this); + } + } + + public int q(int amount) { + return this.quantity * amount; + } + + public int q(int unitsUsed, int itemsProduced) { //eg rails: INOGT.q(6, 16) since the recipe uses 6 ton ingots producing 16 individual rail blocks + return this.quantity * unitsUsed / itemsProduced; + } +} diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java new file mode 100644 index 000000000..4ede40047 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -0,0 +1,210 @@ +package com.hbm.inventory.material; + +import static com.hbm.inventory.OreDictManager.*; +import static com.hbm.inventory.material.MaterialShapes.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.OreDictManager.DictFrame; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; + +/* with every new rewrite, optimization and improvement, the code becomes more gregian */ + +/** + * Defines materials that wrap around DictFrames to more accurately describe that material. + * Direct uses are the crucible and possibly item auto-gen, depending on what traits are set. + * @author hbm + */ +public class Mats { + + public static List orderedList = new ArrayList(); + public static HashMap prefixByName = new HashMap(); + public static HashMap matById = new HashMap(); + public static HashMap matByName = new HashMap(); + //public static HashMap matRemap = new HashMap(); + public static HashMap> materialEntries = new HashMap(); + public static HashMap> materialOreEntries = new HashMap(); + + /* + * ItemStacks are saved with their metadata being truncated to a short, so the max meta is 32767 + * Format for elements: Atomic number *100, plus the last two digits of the mass number. Mass number is 0 for generic/undefined/mixed materials. + * Vanilla numbers are in vanilla space (0-29), basic alloys use alloy space (30-99) + */ + + /* Vanilla Space, up to 30 materials, */ + public static final int _VS = 0; + /* Alloy Space, up to 70 materials. Use >20_000 as an extension.*/ + public static final int _AS = 30; + + //Vanilla and vanilla-like + public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23).omitAutoGen(); + public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434).omitAutoGen(); + public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0x715444); + public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0x3B3B3B); + public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0x71645C); + public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0x725644); + public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0x666666); + public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); + public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); + public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0xFF1000).omitAutoGen(); + public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x3D234D).omitAutoGen(); + + //Radioactive + public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U233 = makeSmeltable(9233, U233, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U235 = makeSmeltable(9235, U235, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U238 = makeSmeltable(9238, U238, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_THORIUM = makeSmeltable(9032, TH232, 0xBF825F).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0x78817E).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_RGP = makeSmeltable(9401, PURG, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU238 = makeSmeltable(9438, PU238, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU239 = makeSmeltable(9439, PU239, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU240 = makeSmeltable(9440, PU240, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_PU241 = makeSmeltable(9441, PU241, 0x78817E).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_RGA = makeSmeltable(9501, AMRG, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_AM241 = makeSmeltable(9541, AM241, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_AM242 = makeSmeltable(9542, AM242, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_NEPTUNIUM = makeSmeltable(9337, NP237, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_POLONIUM = makeSmeltable(8410, PO210, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TECHNIETIUM = makeSmeltable(4399, TC99, 0xCADFDF).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0xE9FAF6).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ACTINIUM = makeSmeltable(8927, AC227, 0).setShapes(NUGGET, BILLET, INGOT); + public static final NTMMaterial MAT_CO60 = makeSmeltable(2760, CO60, 0).setShapes(NUGGET, BILLET, INGOT, DUST); + public static final NTMMaterial MAT_AU198 = makeSmeltable(7998, AU198, 0).setShapes(NUGGET, BILLET, INGOT, DUST); + public static final NTMMaterial MAT_PB209 = makeSmeltable(8209, PB209, 0).setShapes(NUGGET, BILLET, INGOT, DUST); + public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0x32FFFF).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_SOLINIUM = makeSmeltable(12627, SA327, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_SCHRABIDATE = makeSmeltable(12600, SBD, 0).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SCHRARANIUM = makeSmeltable(12601, SRN, 0).setShapes(INGOT, BLOCK); + public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(12836, GH336, 0).setShapes(NUGGET, BILLET, INGOT, BLOCK); + + //Base metals + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x977474).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0x646470).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0xB200FF).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x558080).setShapes(NUGGET, INGOT); + public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0xA89B74).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0xD576B1).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0xAE9572).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0x8F72AE).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0xAD72AE).setShapes(DUSTTINY, INGOT, DUST, BLOCK); + + //Alloys + public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0x4A4A4A).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xE44C0F).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF7318).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x376373).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0x4DA3AF).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xA5A5D3).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0x9CA6A6).setShapes(INGOT, DUST); + public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0x6B6B8B).setShapes(INGOT); + public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 8, MAGTUNG, 0x22A2A2).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 9, CMB, 0x6F6FB4).setShapes(INGOT, DUST, PLATE, BLOCK); + + public static NTMMaterial make(int id, DictFrame dict) { + return new NTMMaterial(id, dict); + } + + public static NTMMaterial makeSmeltable(int id, DictFrame dict, int color) { + return new NTMMaterial(id, dict).smeltable(SmeltingBehavior.SMELTABLE).setMoltenColor(color); + } + + public static NTMMaterial makeAdditive(int id, DictFrame dict, int color) { + return new NTMMaterial(id, dict).smeltable(SmeltingBehavior.ADDITIVE).setMoltenColor(color); + } + + public static DictFrame df(String string) { + return new DictFrame(string); + } + + /** will not respect stacksizes - all stacks will be treated as a singular */ + public static List getMaterialsFromItem(ItemStack stack) { + List list = new ArrayList(); + List names = ItemStackUtil.getOreDictNames(stack); + + if(!names.isEmpty()) { + outer: + for(String name : names) { + + List oreEntries = materialOreEntries.get(name); + + if(oreEntries != null) { + list.addAll(oreEntries); + break outer; + } + + for(Entry prefixEntry : prefixByName.entrySet()) { + String prefix = prefixEntry.getKey(); + + if(name.startsWith(prefix)) { + String materialName = name.substring(prefix.length()); + NTMMaterial material = matByName.get(materialName); + + if(material != null) { + list.add(new MaterialStack(material, prefixEntry.getValue().q(1))); + break outer; + } + } + } + } + } + + List entries = materialEntries.get(new ComparableStack(stack).makeSingular()); + + if(entries != null) { + list.addAll(entries); + } + + if(stack.getItem() == ModItems.scraps) { + list.add(ItemScraps.getMats(stack)); + } + + return list; + } + + public static class MaterialStack { + //final fields to prevent accidental changing + public final NTMMaterial material; + public int amount; + + public MaterialStack(NTMMaterial material, int amount) { + this.material = material; + this.amount = amount; + } + + public MaterialStack copy() { + return new MaterialStack(material, amount); + } + } + + public static String formatAmount(int amount) { + String format = ""; + + int blocks = amount / BLOCK.q(1); + amount -= BLOCK.q(blocks); + int ingots = amount / INGOT.q(1); + amount -= INGOT.q(ingots); + int nuggets = amount / NUGGET.q(1); + amount -= NUGGET.q(nuggets); + int quanta = amount; + + if(blocks > 0) format += blocks + " Blocks "; + if(ingots > 0) format += ingots + " Ingots "; + if(nuggets > 0) format += nuggets + " Nuggets "; + if(quanta > 0) format += quanta + " Quanta "; + + return format.trim(); + } +} diff --git a/src/main/java/com/hbm/inventory/material/NTMMaterial.java b/src/main/java/com/hbm/inventory/material/NTMMaterial.java new file mode 100644 index 000000000..6883f4384 --- /dev/null +++ b/src/main/java/com/hbm/inventory/material/NTMMaterial.java @@ -0,0 +1,63 @@ +package com.hbm.inventory.material; + +import com.hbm.inventory.OreDictManager.DictFrame; + +/** + * Encapsulates most materials that are currently listed as DictFrames, even vanilla ones. + * @author hbm + * + */ +public class NTMMaterial { + + public final int id; + public String[] names; + public MaterialShapes[] shapes = new MaterialShapes[0]; + public boolean omitItemGen = false; + public SmeltingBehavior smeltable = SmeltingBehavior.NOT_SMELTABLE; + public int solidColor = 0xFF4A00; //TODO + public int moltenColor = 0xFF4A00; + + public NTMMaterial(int id, DictFrame dict) { + + this.names = dict.mats; + this.id = id; + + for(String name : dict.mats) { + Mats.matByName.put(name, this); + } + + Mats.orderedList.add(this); + Mats.matById.put(id, this); + } + + /** Shapes for autogen */ + public NTMMaterial setShapes(MaterialShapes... shapes) { + this.shapes = shapes; + return this; + } + + /** Turn off autogen for this material, use this for vanilla stuff */ + public NTMMaterial omitAutoGen() { + this.omitItemGen = true; + return this; + } + + /** Defines smelting behavior */ + public NTMMaterial smeltable(SmeltingBehavior behavior) { + this.smeltable = behavior; + return this; + } + + public NTMMaterial setMoltenColor(int color) { + this.moltenColor = color; + return this; + } + + public static enum SmeltingBehavior { + NOT_SMELTABLE, //anything that can't be smelted or otherwise doesn't belong in a smelter, like diamond + VAPORIZES, //can't be smelted because the material would skadoodle + BREAKS, //can't be smelted because the material doesn't survive the temperatures + SMELTABLE, //metal, mostly + ADDITIVE //stuff like coal which isn't smeltable but can be put in a crucible anyway + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index d4024e82d..32e0180c0 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -63,7 +63,6 @@ public class AssemblerRecipes { for(File file : files) { if(file.getName().equals("hbmAssembler.json")) { - config = file; } } @@ -285,7 +284,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.machine_well, 1), new AStack[] {new ComparableStack(ModBlocks.steel_scaffold, 20), new ComparableStack(ModBlocks.steel_beam, 8), new ComparableStack(ModItems.tank_steel, 2), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.pipes_steel, 3), new ComparableStack(ModItems.drill_titanium, 1), new ComparableStack(ModItems.wire_red_copper, 6), },250); makeRecipe(new ComparableStack(ModBlocks.machine_pumpjack, 1), new AStack[] {new ComparableStack(ModBlocks.steel_scaffold, 8), new OreDictStack(STEEL.block(), 8), new ComparableStack(ModItems.pipes_steel, 4), new ComparableStack(ModItems.tank_steel, 4), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(STEEL.plate(), 16), new OreDictStack(AL.plate(), 6), new ComparableStack(ModItems.drill_titanium, 1), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.wire_red_copper, 8), },400); makeRecipe(new ComparableStack(ModBlocks.machine_flare, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 12), new OreDictStack(IRON.ingot(), 12), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.tank_steel, 1), new ComparableStack(ModBlocks.deco_pipe_quad, 8), new ComparableStack(ModItems.hull_small_steel, 4), new ComparableStack(ModItems.thermo_element, 3), },200); - makeRecipe(new ComparableStack(ModBlocks.machine_refinery, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate(), 20), new OreDictStack(CU.plate(), 16), new ComparableStack(ModItems.hull_big_steel, 6), new ComparableStack(ModItems.pipes_steel, 2), new ComparableStack(ModItems.coil_tungsten, 8), new ComparableStack(ModItems.wire_red_copper, 8), new ComparableStack(ModItems.circuit_copper, 2), new ComparableStack(ModItems.circuit_red_copper, 1), new ComparableStack(ModItems.plate_polymer, 8), },350); + makeRecipe(new ComparableStack(ModBlocks.machine_refinery, 1), new AStack[] {new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 16), new ComparableStack(ModItems.hull_big_steel, 6), new ComparableStack(ModItems.pipes_steel, 2), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit_red_copper, 1) },350); makeRecipe(new ComparableStack(ModBlocks.machine_epress, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.pipes_steel, 1), new ComparableStack(ModItems.bolt_tungsten, 4), new ComparableStack(ModItems.coil_copper, 2), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit_copper, 1), new ComparableStack(ModItems.canister_full, 1, Fluids.LUBRICANT.getID()), },160); makeRecipe(new ComparableStack(ModBlocks.machine_chemplant, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.plate(), 6), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.hull_big_steel, 1), new ComparableStack(ModItems.coil_tungsten, 3), new ComparableStack(ModItems.circuit_copper, 2), new ComparableStack(ModItems.circuit_red_copper, 1), new ComparableStack(ModItems.plate_polymer, 8), },200); makeRecipe(new ComparableStack(ModBlocks.machine_crystallizer, 1), new AStack[] {new ComparableStack(ModItems.hull_big_steel, 4), new ComparableStack(ModItems.pipes_steel, 1), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.blades_advanced_alloy, 2), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(TI.plate(), 16), new ComparableStack(Blocks.glass, 4), new ComparableStack(ModItems.circuit_gold, 1), },400); @@ -396,7 +395,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.ams_limiter, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 6), new OreDictStack(STEEL.plate(), 24), new ComparableStack(ModBlocks.steel_scaffold, 20), new ComparableStack(ModItems.crystal_diamond, 1)}, 600); makeRecipe(new ComparableStack(ModBlocks.ams_emitter, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 24), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModBlocks.steel_scaffold, 40), new ComparableStack(ModItems.crystal_redstone, 5), new ComparableStack(ModBlocks.machine_lithium_battery)}, 600); makeRecipe(new ComparableStack(ModBlocks.ams_base, 1), new AStack[] {new ComparableStack(ModItems.board_copper, 12), new OreDictStack(STEEL.plate(), 28), new ComparableStack(ModBlocks.steel_scaffold, 30), new ComparableStack(ModBlocks.steel_grate, 8), new ComparableStack(ModBlocks.barrel_steel, 2)}, 600); - makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.plate_polymer, 24), new ComparableStack(ModItems.magnetron, 10), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); + makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.plate(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.plate_polymer, 24), new ComparableStack(ModItems.magnetron, 10), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); makeRecipe(new ComparableStack(ModBlocks.machine_forcefield, 1), new AStack[] {new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit_targeting_tier5, 1), new ComparableStack(ModBlocks.machine_transformer, 1), },1000); makeRecipe(new ComparableStack(ModItems.mp_thruster_10_kerosene, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModBlocks.deco_pipe_quad, 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4), },100); makeRecipe(new ComparableStack(ModItems.mp_thruster_10_solid, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.coil_tungsten, 1), new OreDictStack(DURA.ingot(), 4), new OreDictStack(STEEL.plate(), 4), },100); @@ -751,6 +750,35 @@ public class AssemblerRecipes { new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); + makeRecipe(new ComparableStack(ModBlocks.turret_himars, 1), new AStack[] { + new ComparableStack(ModBlocks.machine_battery, 1), + new OreDictStack(STEEL.ingot(), 128), + new OreDictStack(DURA.ingot(), 64), + new OreDictStack(ANY_PLASTIC.ingot(), 64), + new ComparableStack(ModItems.motor_desh, 5), + new ComparableStack(ModItems.circuit_targeting_tier4, 3), + new ComparableStack(ModItems.mechanism_launcher_2, 5), + new ComparableStack(ModBlocks.machine_radar, 1), + new ComparableStack(ModItems.crt_display, 1) + }, 300); + + makeRecipe(new ComparableStack(ModItems.ammo_himars, 1, 0), new AStack[] { + new OreDictStack(STEEL.plate(), 24), + new OreDictStack(ANY_PLASTIC.ingot(), 12), + new OreDictStack(ANY_SMOKELESS.dust(), 48), + new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 6), + new ComparableStack(ModItems.circuit_copper, 6), + new ComparableStack(ModItems.wire_gold, 12) + }, 100); + + makeRecipe(new ComparableStack(ModItems.ammo_himars, 1, 1), new AStack[] { + new OreDictStack(STEEL.plate(), 24), + new OreDictStack(ANY_PLASTIC.ingot(), 6), + new OreDictStack(ANY_SMOKELESS.dust(), 36), + new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), + new ComparableStack(ModItems.circuit_red_copper, 2), + new ComparableStack(ModItems.wire_gold, 8) + }, 100); makeRecipe(new ComparableStack(ModBlocks.machine_silex, 1), new AStack[] { new ComparableStack(Blocks.glass, 12), @@ -1345,17 +1373,6 @@ public class AssemblerRecipes { value.add(((ComparableStack)o).toStack()); } else if(o instanceof OreDictStack) { - - /*List list = new ArrayList(); - OreDictStack oreStack = (OreDictStack)o; - List ores = OreDictionary.getOres(oreStack.name); - - for(ItemStack ore : ores) { - ItemStack copy = ore.copy(); - copy.stackSize = oreStack.stacksize; - list.add(copy); - }*/ - value.add(((OreDictStack)o).extractForNEI()); } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java new file mode 100644 index 000000000..4657e1175 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -0,0 +1,172 @@ +package com.hbm.inventory.recipes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.CheckForNull; + +import static com.hbm.inventory.OreDictManager.*; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.GeneralConfig; +import com.hbm.handler.imc.IMCBlastFurnace; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.util.Tuple.Triplet; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Magic! + * + * @author UFFR + */ +public class BlastFurnaceRecipes { + + private static final ArrayList> blastFurnaceRecipes = new ArrayList>(); + private static final ArrayList hiddenRecipes = new ArrayList(); + + private static void addRecipe(Object in1, Object in2, ItemStack out) { + blastFurnaceRecipes.add(new Triplet(in1, in2, out)); + } + + static { + addRecipe(IRON, COAL, new ItemStack(ModItems.ingot_steel, 2)); + addRecipe(IRON, ANY_COKE, new ItemStack(ModItems.ingot_steel, 2)); + addRecipe(CU, REDSTONE, new ItemStack(ModItems.ingot_red_copper, 2)); + addRecipe(STEEL, MINGRADE, new ItemStack(ModItems.ingot_advanced_alloy, 2)); + addRecipe(W, COAL, new ItemStack(ModItems.neutron_reflector, 2)); + addRecipe(W, ANY_COKE, new ItemStack(ModItems.neutron_reflector, 2)); + addRecipe(new ComparableStack(ModItems.canister_full, 1, Fluids.GASOLINE.getID()), "slimeball", new ItemStack(ModItems.canister_napalm)); + //addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); + addRecipe(W, SA326.nugget(), new ItemStack(ModItems.ingot_magnetized_tungsten)); + addRecipe(STEEL, TC99.nugget(), new ItemStack(ModItems.ingot_tcalloy)); + addRecipe(GOLD.plate(), ModItems.plate_mixed, new ItemStack(ModItems.plate_paa, 2)); + addRecipe(BIGMT, ModItems.powder_meteorite, new ItemStack(ModItems.ingot_starmetal, 2)); + addRecipe(CO, ModBlocks.block_meteor, new ItemStack(ModItems.ingot_meteorite)); + addRecipe(ModItems.meteorite_sword_hardened, CO, new ItemStack(ModItems.meteorite_sword_alloyed)); + addRecipe(ModBlocks.block_meteor, CO, new ItemStack(ModItems.ingot_meteorite)); + + if(GeneralConfig.enableLBSMSimpleChemsitry) + addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID())); + + if(!IMCBlastFurnace.buffer.isEmpty()) { + blastFurnaceRecipes.addAll(IMCBlastFurnace.buffer); + MainRegistry.logger.info("Fetched " + IMCBlastFurnace.buffer.size() + " IMC blast furnace recipes!"); + IMCBlastFurnace.buffer.clear(); + } + + hiddenRecipes.add(new ItemStack(ModItems.meteorite_sword_alloyed)); + } + + @CheckForNull + public static ItemStack getOutput(ItemStack in1, ItemStack in2) { + for(Triplet recipe : blastFurnaceRecipes) { + final AStack[] recipeItem1 = getRecipeStacks(recipe.getX()); + final AStack[] recipeItem2 = getRecipeStacks(recipe.getY()); + + if((doStacksMatch(recipeItem1, in1) && doStacksMatch(recipeItem2, in2)) || (doStacksMatch(recipeItem2, in1) && doStacksMatch(recipeItem1, in2))) + return recipe.getZ().copy(); + else + continue; + } + return null; + } + + private static boolean doStacksMatch(AStack[] recipe, ItemStack in) { + boolean flag = false; + byte i = 0; + while(!flag && i < recipe.length) { + flag = recipe[i].matchesRecipe(in, true); + i++; + } + return flag; + } + + private static AStack[] getRecipeStacks(Object in) { + final AStack[] recipeItem1; + if(in instanceof DictFrame) { + DictFrame recipeItem = (DictFrame) in; + recipeItem1 = new AStack[] { new OreDictStack(recipeItem.ingot()), new OreDictStack(recipeItem.dust()), new OreDictStack(recipeItem.plate()), new OreDictStack(recipeItem.gem()) }; + } else if(in instanceof AStack) + recipeItem1 = new AStack[] { (AStack) in }; + else if(in instanceof String) + recipeItem1 = new AStack[] { new OreDictStack((String) in) }; + else if(in instanceof Block) + recipeItem1 = new AStack[] { new ComparableStack((Block) in) }; + else if(in instanceof List) { + List oreList = (List) in; + recipeItem1 = new AStack[oreList.size()]; + for(int i = 0; i < oreList.size(); i++) + recipeItem1[i] = new OreDictStack((String) oreList.get(i)); + } else + recipeItem1 = new AStack[] { new ComparableStack((Item) in) }; + + return recipeItem1; + } + + public static Map[], ItemStack> getRecipesForNEI() { + final HashMap[], ItemStack> recipes = new HashMap<>(); + + for(Triplet recipe : blastFurnaceRecipes) { + if(!hiddenRecipes.contains(recipe.getZ())) { + final ItemStack nothing = new ItemStack(ModItems.nothing).setStackDisplayName("If you're reading this, an error has occured! Check the console."); + final List in1 = new ArrayList(); + final List in2 = new ArrayList(); + in1.add(nothing); + in2.add(nothing); + + for(AStack stack : getRecipeStacks(recipe.getX())) { + if(stack.extractForNEI().isEmpty()) + continue; + else { + in1.remove(nothing); + in1.addAll(stack.extractForNEI()); + break; + } + } + if(in1.contains(nothing)) { + MainRegistry.logger.error("Blast furnace cannot compile recipes for NEI: apparent nonexistent item #1 in recipe for item: " + recipe.getZ().getDisplayName()); + } + for(AStack stack : getRecipeStacks(recipe.getY())) { + if(stack.extractForNEI().isEmpty()) { + continue; + } else { + in2.remove(nothing); + in2.addAll(stack.extractForNEI()); + break; + } + } + if(in2.contains(nothing)) { + MainRegistry.logger.error("Blast furnace cannot compile recipes for NEI: apparent nonexistent item #2 in recipe for item: " + recipe.getZ().getDisplayName()); + } + + final List[] inputs = new List[2]; + inputs[0] = in1; + inputs[1] = in2; + recipes.put(inputs, recipe.getZ()); + } + } + return ImmutableMap.copyOf(recipes); + } + + public static List> getRecipes() { + + final List> subRecipes = new ArrayList<>(); + for(Triplet recipe : blastFurnaceRecipes) + subRecipes.add(new Triplet(getRecipeStacks(recipe.getX()), getRecipeStacks(recipe.getY()), recipe.getZ())); + return ImmutableList.copyOf(subRecipes); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index a48ff6e2f..8d34db3dc 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,15 +1,23 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.inventory.RecipesCommon; +import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; @@ -18,11 +26,12 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class CentrifugeRecipes { +public class CentrifugeRecipes extends SerializableRecipe { - private static HashMap recipes = new HashMap(); - - public static void register() { + private static HashMap recipes = new HashMap(); + + @Override + public void registerDefaults() { boolean lbs = GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCentrifuge; @@ -128,79 +137,79 @@ public class CentrifugeRecipes { new ItemStack(ModItems.dust, 1), new ItemStack(ModItems.dust, 1) }); - recipes.put("oreCoal", new ItemStack[] { + recipes.put(new OreDictStack("oreCoal"), new ItemStack[] { new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreLignite", new ItemStack[] { + recipes.put(new OreDictStack("oreLignite"), new ItemStack[] { new ItemStack(ModItems.powder_lignite, 2), new ItemStack(ModItems.powder_lignite, 2), new ItemStack(ModItems.powder_lignite, 2), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreIron", new ItemStack[] { + recipes.put(new OreDictStack("oreIron"), new ItemStack[] { new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreGold", new ItemStack[] { + recipes.put(new OreDictStack("oreGold"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_gold, 2) : new ItemStack(ModItems.powder_gold, 1), new ItemStack(ModItems.powder_gold, 1), lbs ? new ItemStack(ModItems.nugget_bismuth, 1) : new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreDiamond", new ItemStack[] { + recipes.put(new OreDictStack("oreDiamond"), new ItemStack[] { new ItemStack(ModItems.powder_diamond, 1), new ItemStack(ModItems.powder_diamond, 1), new ItemStack(ModItems.powder_diamond, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreEmerald", new ItemStack[] { + recipes.put(new OreDictStack("oreEmerald"), new ItemStack[] { new ItemStack(ModItems.powder_emerald, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreTitanium", new ItemStack[] { + recipes.put(new OreDictStack("oreTitanium"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_titanium, 2) : new ItemStack(ModItems.powder_titanium, 1), lbs ? new ItemStack(ModItems.powder_titanium, 2) : new ItemStack(ModItems.powder_titanium, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreQuartz", new ItemStack[] { + recipes.put(new OreDictStack("oreQuartz"), new ItemStack[] { new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_lithium_tiny, 1), new ItemStack(Blocks.netherrack, 1) }); - recipes.put("oreTungsten", new ItemStack[] { + recipes.put(new OreDictStack("oreTungsten"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_tungsten, 2) : new ItemStack(ModItems.powder_tungsten, 1), new ItemStack(ModItems.powder_tungsten, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreCopper", new ItemStack[] { + recipes.put(new OreDictStack("oreCopper"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_copper, 2) : new ItemStack(ModItems.powder_copper, 1), new ItemStack(ModItems.powder_copper, 1), new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreAluminum", new ItemStack[] { + recipes.put(new OreDictStack("oreAluminum"), new ItemStack[] { new ItemStack(ModItems.powder_aluminium, 1), new ItemStack(ModItems.powder_aluminium, 1), new ItemStack(ModItems.powder_iron, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreLead", new ItemStack[] { + recipes.put(new OreDictStack("oreLead"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_lead, 2) : new ItemStack(ModItems.powder_lead, 1), lbs ? new ItemStack(ModItems.nugget_bismuth, 1) : new ItemStack(ModItems.powder_lead, 1), new ItemStack(ModItems.powder_gold, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreSchrabidium", new ItemStack[] { + recipes.put(new OreDictStack("oreSchrabidium"), new ItemStack[] { new ItemStack(ModItems.powder_schrabidium, 1), new ItemStack(ModItems.powder_schrabidium, 1), new ItemStack(ModItems.nugget_solinium, 1), @@ -212,31 +221,31 @@ public class CentrifugeRecipes { new ItemStack(ModItems.nugget_zirconium, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("orePlutonium", new ItemStack[] { + recipes.put(new OreDictStack("orePlutonium"), new ItemStack[] { new ItemStack(ModItems.powder_plutonium, 1), new ItemStack(ModItems.powder_plutonium, 1), new ItemStack(ModItems.nugget_polonium, 3), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreUranium", new ItemStack[] { + recipes.put(new OreDictStack("oreUranium"), new ItemStack[] { lbs ? new ItemStack(ModItems.powder_uranium, 2) : new ItemStack(ModItems.powder_uranium, 1), lbs ? new ItemStack(ModItems.nugget_technetium, 2) : new ItemStack(ModItems.powder_uranium, 1), lbs ? new ItemStack(ModItems.nugget_ra226, 2) : new ItemStack(ModItems.nugget_ra226, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreThorium", new ItemStack[] { + recipes.put(new OreDictStack("oreThorium"), new ItemStack[] { new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_thorium, 1), new ItemStack(ModItems.powder_uranium, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreBeryllium", new ItemStack[] { + recipes.put(new OreDictStack("oreBeryllium"), new ItemStack[] { new ItemStack(ModItems.powder_beryllium, 1), new ItemStack(ModItems.powder_beryllium, 1), new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); - recipes.put("oreRedstone", new ItemStack[] { + recipes.put(new OreDictStack("oreRedstone"), new ItemStack[] { new ItemStack(Items.redstone, 3), new ItemStack(Items.redstone, 3), lbs ? new ItemStack(ModItems.ingot_mercury, 3) : new ItemStack(ModItems.ingot_mercury, 1), @@ -248,7 +257,7 @@ public class CentrifugeRecipes { new ItemStack(ModItems.powder_nitan_mix, 1), new ItemStack(Blocks.end_stone, 1) }); - recipes.put("oreLapis", new ItemStack[] { + recipes.put(new OreDictStack("oreLapis"), new ItemStack[] { new ItemStack(ModItems.powder_lapis, 3), new ItemStack(ModItems.powder_lapis, 3), new ItemStack(ModItems.powder_cobalt_tiny, 1), @@ -272,7 +281,7 @@ public class CentrifugeRecipes { new ItemStack(ModItems.ingot_phosphorus), new ItemStack(Blocks.netherrack) }); - recipes.put("oreCobalt", new ItemStack[] { + recipes.put(new OreDictStack("oreCobalt"), new ItemStack[] { new ItemStack(ModItems.powder_cobalt, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_copper, 1), @@ -290,7 +299,7 @@ public class CentrifugeRecipes { ItemStack qItem = quartz.get(0).copy(); qItem.stackSize = 2; - recipes.put("oreCertusQuartz", new ItemStack[] { + recipes.put(new OreDictStack("oreCertusQuartz"), new ItemStack[] { qItem.copy(), qItem.copy(), qItem.copy(), @@ -327,8 +336,10 @@ public class CentrifugeRecipes { recipes.put(new ComparableStack(ModItems.crystal_lithium), new ItemStack[] { new ItemStack(ModItems.powder_lithium, 2), new ItemStack(ModItems.powder_lithium, 2), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.fluorite, 1) }); recipes.put(new ComparableStack(ModItems.crystal_starmetal), new ItemStack[] { new ItemStack(ModItems.powder_dura_steel, 3), new ItemStack(ModItems.powder_cobalt, 3), new ItemStack(ModItems.powder_astatine, 2), new ItemStack(ModItems.ingot_mercury, 5) }); recipes.put(new ComparableStack(ModItems.crystal_cobalt), new ItemStack[] { new ItemStack(ModItems.powder_cobalt, 2), new ItemStack(ModItems.powder_iron, 3), new ItemStack(ModItems.powder_copper, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); - - + } + + @Override + public void registerPost() { if(!IMCCentrifuge.buffer.isEmpty()) { recipes.putAll(IMCCentrifuge.buffer); @@ -342,17 +353,15 @@ public class CentrifugeRecipes { if(stack == null || stack.getItem() == null) return null; - ComparableStack comp = new ComparableStack(stack.getItem(), 1, stack.getItemDamage()); + ComparableStack comp = new ComparableStack(stack).makeSingular(); if(recipes.containsKey(comp)) return RecipesCommon.copyStackArray(recipes.get(comp)); - String[] dictKeys = comp.getDictKeys(); - - for(String key : dictKeys) { - - if(recipes.containsKey(key)) - return RecipesCommon.copyStackArray(recipes.get(key)); + for(Entry entry : recipes.entrySet()) { + if(entry.getKey().isApplicable(stack)) { + return RecipesCommon.copyStackArray(entry.getValue()); + } } return null; @@ -362,16 +371,55 @@ public class CentrifugeRecipes { Map recipes = new HashMap(); - for(Entry entry : CentrifugeRecipes.recipes.entrySet()) { - - if(entry.getKey() instanceof String) { - List ingredients = OreDictionary.getOres((String)entry.getKey()); - recipes.put(ingredients, entry.getValue()); - } else { - recipes.put(((ComparableStack)entry.getKey()).toStack(), entry.getValue()); - } + for(Entry entry : CentrifugeRecipes.recipes.entrySet()) { + recipes.put(entry.getKey().extractForNEI(), entry.getValue()); } return recipes; } + + @Override + public String getFileName() { + return "hbmCentrifuge.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + AStack in = this.readAStack(obj.get("input").getAsJsonArray()); + ItemStack[] out = this.readItemStackArray((JsonArray) obj.get("output")); + this.recipes.put(in, out); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + try { + Entry entry = (Entry) recipe; + writer.name("input"); + this.writeAStack(entry.getKey(), writer); + writer.name("output").beginArray(); + for(ItemStack stack : entry.getValue()) { + this.writeItemStack(stack, writer); + } + writer.endArray(); + } catch(Exception ex) { + MainRegistry.logger.error(ex); + ex.printStackTrace(); + } + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public String getComment() { + return "Outputs have to be an array of four item stacks. The centrifuge can't handle recipes with a smaller output as of now."; + } } diff --git a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java index bb3cc2522..6144d31bf 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java @@ -142,38 +142,6 @@ public class ChemplantRecipes extends SerializableRecipe { new OreDictStack(S.dust(), 2)) .inputFluids(new FluidStack(Fluids.ACID, 2000)) .outputFluids(new FluidStack(Fluids.SAS3, 1000))); - recipes.add(new ChemRecipe(50, "DYN_SCHRAB", 1200) - .inputItems( - new ComparableStack(ModItems.dynosphere_desh_charged, 3), - new OreDictStack(U.ingot()), - new ComparableStack(ModItems.catalyst_clay, 8)) - .outputItems( - new ItemStack(ModItems.ingot_schrabidium), - new ItemStack(ModItems.powder_desh, 12), - new ItemStack(ModItems.powder_desh_mix, 12)) - .outputFluids(new FluidStack(Fluids.WATZ, 50))); - recipes.add(new ChemRecipe(51, "DYN_EUPH", 3600) - .inputItems( - new ComparableStack(ModItems.dynosphere_schrabidium_charged, 1), - new OreDictStack(PU.ingot()), - new ComparableStack(ModItems.catalyst_clay, 16), - new OreDictStack(EUPH.ingot())) - .outputItems( - new ItemStack(ModItems.nugget_euphemium, 12), - new ItemStack(ModItems.powder_schrabidium, 4), - new ItemStack(ModItems.powder_power, 4)) - .outputFluids(new FluidStack(Fluids.WATZ, 100))); - recipes.add(new ChemRecipe(52, "DYN_DNT", 6000) - .inputItems( - new ComparableStack(ModItems.dynosphere_euphemium_charged, 2), - new ComparableStack(ModItems.powder_spark_mix), - new ComparableStack(ModItems.ingot_starmetal), - new ComparableStack(ModItems.catalyst_clay, 32)) - .outputItems( - new ItemStack(ModItems.ingot_dineutronium), - new ItemStack(ModItems.powder_euphemium, 8), - new ItemStack(ModItems.powder_nitan_mix, 8)) - .outputFluids(new FluidStack(Fluids.WATZ, 150))); recipes.add(new ChemRecipe(53, "CORDITE", 40) .inputItems( new OreDictStack(KNO.dust(), 2), diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java new file mode 100644 index 000000000..47928e085 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -0,0 +1,214 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.google.gson.JsonElement; +import com.google.gson.stream.JsonWriter; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.items.machine.ItemScraps; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class CrucibleRecipes extends SerializableRecipe { + + public static HashMap indexMapping = new HashMap(); + public static List recipes = new ArrayList(); + + /* + * IMPORTANT: crucibles do not have stack size checks for the recipe's result, meaning that they can overflow if the resulting stacks are + * bigger than the input stacks, so make sure that material doesn't "expand". very few things do that IRL when alloying anyway. + */ + + @Override + public void registerDefaults() { + + int n = MaterialShapes.NUGGET.q(1); + int i = MaterialShapes.INGOT.q(1); + + recipes.add(new CrucibleRecipe(0, "crucible.steel", 1, new ItemStack(ModItems.ingot_steel)) + .inputs(new MaterialStack(Mats.MAT_IRON, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_STEEL, n))); + + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 2, new ItemStack(ModItems.ingot_red_copper)) + .inputs(new MaterialStack(Mats.MAT_COPPER, n), new MaterialStack(Mats.MAT_REDSTONE, n)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, n * 2))); + + recipes.add(new CrucibleRecipe(2, "crucible.aa", 2, new ItemStack(ModItems.ingot_advanced_alloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n), new MaterialStack(Mats.MAT_MINGRADE, n)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, n * 2))); + + recipes.add(new CrucibleRecipe(3, "crucible.hss", 4, new ItemStack(ModItems.ingot_dura_steel)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_TUNGSTEN, n), new MaterialStack(Mats.MAT_COBALT, n)) + .outputs(new MaterialStack(Mats.MAT_DURA, n * 4))); + + recipes.add(new CrucibleRecipe(4, "crucible.ferro", 3, new ItemStack(ModItems.ingot_ferrouranium)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_U238, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_FERRO, n * 3))); + + recipes.add(new CrucibleRecipe(5, "crucible.tcalloy", 9, new ItemStack(ModItems.ingot_tcalloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_TECHNIETIUM, n), new MaterialStack(Mats.MAT_COAL, n * 4)) + .outputs(new MaterialStack(Mats.MAT_TCALLOY, i))); + + registerMoldsForNEI(); + } + + public static class CrucibleRecipe { + public MaterialStack[] input; + public MaterialStack[] output; + private int id; + private String name; + public int frequency = 1; + public ItemStack icon; + + public CrucibleRecipe(int id, String name, int frequency, ItemStack icon) { + this.id = id; + this.name = name; + this.frequency = frequency; + this.icon = icon; + + if(!indexMapping.containsKey(id)) { + indexMapping.put(id, this); + } else { + throw new IllegalStateException("Crucible recipe " + name + " has been registered with duplicate id " + id + " used by " + indexMapping.get(id).name + "!"); + } + } + + public CrucibleRecipe inputs(MaterialStack... input) { + this.input = input; + return this; + } + + public CrucibleRecipe outputs(MaterialStack... output) { + this.output = output; + return this; + } + + public int getId() { + return this.id; + } + + public String getName() { + return this.name; + } + + public int getInputAmount() { + + int content = 0; + + for(MaterialStack stack : input) { + content += stack.amount; + } + + return content; + } + } + + @Override + public String getFileName() { + return "hbmCrucible.json"; + } + + @Override + public Object getRecipeObject() { + return this.recipes; + } + + @Override + public String getComment() { + return "/// under construction ///"; + } + + @Override + public void readRecipe(JsonElement recipe) { + + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + + } + + @Override + public void deleteRecipes() { + this.indexMapping.clear(); + this.recipes.clear(); + } + + /** Returns a map containing all recipes where an item becomes a liquid material in the crucible. */ + public static HashMap> getSmeltingRecipes() { + HashMap> map = new HashMap(); + + for(NTMMaterial material : Mats.orderedList) { + for(MaterialShapes shape : MaterialShapes.values()) { + //TODO: buffer these + + String name = shape.toString().toLowerCase() + material.names[0]; + List ores = OreDictionary.getOres(name); + + if(!ores.isEmpty()) { + List stacks = new ArrayList(); + stacks.add(ItemScraps.create(new MaterialStack(material, shape.q(1)))); + map.put(new OreDictStack(name), stacks); + } + } + } + + for(Entry> entry : Mats.materialOreEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(new OreDictStack(entry.getKey()), stacks); + } + + for(Entry> entry : Mats.materialEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(entry.getKey().copy(), stacks); + } + + return map; + } + + public static List moldRecipes = new ArrayList(); + + public static void registerMoldsForNEI() { + + for(NTMMaterial material : Mats.orderedList) { + + if(material.smeltable != SmeltingBehavior.SMELTABLE) + continue; + + for(Mold mold : ItemMold.molds) { + ItemStack out = mold.getOutput(material); + if(out != null) { + ItemStack scrap = ItemScraps.create(new MaterialStack(material, mold.getCost())); + ItemStack shape = new ItemStack(ModItems.mold, 1, mold.id); + ItemStack basin = new ItemStack(mold.size == 0 ? ModBlocks.foundry_mold : mold.size == 1 ? ModBlocks.foundry_basin : Blocks.fire); + ItemStack[] entry = new ItemStack[] {scrap, shape, basin, out}; + moldRecipes.add(entry); + } + } + } + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index db41eb8e0..d552e73d6 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -1,112 +1,110 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.util.Tuple.Pair; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -public class CyclotronRecipes { - - //i could have used classes for this, oh bother - private static HashMap lithium = new HashMap(); - private static HashMap beryllium = new HashMap(); - private static HashMap carbon = new HashMap(); - private static HashMap copper = new HashMap(); - private static HashMap plutonium = new HashMap(); - private static HashMap liAmat = new HashMap(); - private static HashMap beAmat = new HashMap(); - private static HashMap caAmat = new HashMap(); - private static HashMap coAmat = new HashMap(); - private static HashMap plAmat = new HashMap(); +public class CyclotronRecipes extends SerializableRecipe { - public static void register() { + public static HashMap, Pair> recipes = new HashMap(); + + @Override + public void registerDefaults() { /// LITHIUM START /// int liA = 50; - makeRecipe(lithium, liAmat, "dustLithium", new ItemStack(ModItems.powder_beryllium), liA); - makeRecipe(lithium, liAmat, "dustBeryllium", new ItemStack(ModItems.powder_boron), liA); - makeRecipe(lithium, liAmat, "dustBoron", new ItemStack(ModItems.powder_coal), liA); - makeRecipe(lithium, liAmat, "dustNetherQuartz", new ItemStack(ModItems.powder_fire), liA); - makeRecipe(lithium, liAmat, "dustPhosphorus", new ItemStack(ModItems.sulfur), liA); - makeRecipe(lithium, liAmat, "dustIron", new ItemStack(ModItems.powder_cobalt), liA); - makeRecipe(lithium, liAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_zirconium), liA); - makeRecipe(lithium, liAmat, "dustGold", new ItemStack(ModItems.ingot_mercury), liA); - makeRecipe(lithium, liAmat, "dustPolonium", new ItemStack(ModItems.powder_astatine), liA); - makeRecipe(lithium, liAmat, "dustLanthanium", new ItemStack(ModItems.powder_cerium), liA); - makeRecipe(lithium, liAmat, "dustActinium", new ItemStack(ModItems.powder_thorium), liA); - makeRecipe(lithium, liAmat, "dustUranium", new ItemStack(ModItems.powder_neptunium), liA); - makeRecipe(lithium, liAmat, "dustNeptunium", new ItemStack(ModItems.powder_plutonium), liA); - makeRecipe(lithium, liAmat, new ComparableStack(ModItems.powder_reiium), new ItemStack(ModItems.powder_weidanium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustLithium"), new ItemStack(ModItems.powder_beryllium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustBeryllium"), new ItemStack(ModItems.powder_boron), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustBoron"), new ItemStack(ModItems.powder_coal), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustNetherQuartz"), new ItemStack(ModItems.powder_fire), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustPhosphorus"), new ItemStack(ModItems.sulfur), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustIron"), new ItemStack(ModItems.powder_cobalt), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_zirconium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustGold"), new ItemStack(ModItems.ingot_mercury), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustPolonium"), new ItemStack(ModItems.powder_astatine), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustLanthanium"), new ItemStack(ModItems.powder_cerium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustActinium"), new ItemStack(ModItems.powder_thorium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustUranium"), new ItemStack(ModItems.powder_neptunium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new OreDictStack("dustNeptunium"), new ItemStack(ModItems.powder_plutonium), liA); + makeRecipe(new ComparableStack(ModItems.part_lithium), new ComparableStack(ModItems.powder_reiium), new ItemStack(ModItems.powder_weidanium), liA); /// LITHIUM END /// /// BERYLLIUM START /// int beA = 25; - makeRecipe(beryllium, beAmat, "dustLithium", new ItemStack(ModItems.powder_boron), beA); - makeRecipe(beryllium, beAmat, "dustNetherQuartz", new ItemStack(ModItems.sulfur), beA); - makeRecipe(beryllium, beAmat, "dustTitanium", new ItemStack(ModItems.powder_iron), beA); - makeRecipe(beryllium, beAmat, "dustCobalt", new ItemStack(ModItems.powder_copper), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_niobium), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_cerium), new ItemStack(ModItems.powder_neodymium), beA); - makeRecipe(beryllium, beAmat, "dustThorium", new ItemStack(ModItems.powder_uranium), beA); - makeRecipe(beryllium, beAmat, new ComparableStack(ModItems.powder_weidanium), new ItemStack(ModItems.powder_australium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustLithium"), new ItemStack(ModItems.powder_boron), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustNetherQuartz"), new ItemStack(ModItems.sulfur), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_iron), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustCobalt"), new ItemStack(ModItems.powder_copper), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_niobium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_cerium), new ItemStack(ModItems.powder_neodymium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustThorium"), new ItemStack(ModItems.powder_uranium), beA); + makeRecipe(new ComparableStack(ModItems.part_beryllium), new ComparableStack(ModItems.powder_weidanium), new ItemStack(ModItems.powder_australium), beA); /// BERYLLIUM END /// /// CARBON START /// int caA = 10; - makeRecipe(carbon, caAmat, "dustBoron", new ItemStack(ModItems.powder_aluminium), caA); - makeRecipe(carbon, caAmat, "dustSulfur", new ItemStack(ModItems.powder_titanium), caA); - makeRecipe(carbon, caAmat, "dustTitanium", new ItemStack(ModItems.powder_cobalt), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_lanthanium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_neodymium), new ItemStack(ModItems.powder_gold), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.ingot_mercury), new ItemStack(ModItems.powder_polonium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_lead), new ItemStack(ModItems.powder_ra226),caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_astatine), new ItemStack(ModItems.powder_actinium), caA); - makeRecipe(carbon, caAmat, new ComparableStack(ModItems.powder_australium), new ItemStack(ModItems.powder_verticium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustBoron"), new ItemStack(ModItems.powder_aluminium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustSulfur"), new ItemStack(ModItems.powder_titanium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_cobalt), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_lanthanium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_neodymium), new ItemStack(ModItems.powder_gold), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.ingot_mercury), new ItemStack(ModItems.powder_polonium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_lead), new ItemStack(ModItems.powder_ra226),caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_astatine), new ItemStack(ModItems.powder_actinium), caA); + makeRecipe(new ComparableStack(ModItems.part_carbon), new ComparableStack(ModItems.powder_australium), new ItemStack(ModItems.powder_verticium), caA); /// CARBON END /// /// COPPER START /// int coA = 15; - makeRecipe(copper, coAmat, "dustBeryllium", new ItemStack(ModItems.powder_quartz), coA); - makeRecipe(copper, coAmat, "dustCoal", new ItemStack(ModItems.powder_bromine), coA); - makeRecipe(copper, coAmat, "dustTitanium", new ItemStack(ModItems.powder_strontium), coA); - makeRecipe(copper, coAmat, "dustIron", new ItemStack(ModItems.powder_niobium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_bromine), new ItemStack(ModItems.powder_iodine), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_neodymium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_niobium), new ItemStack(ModItems.powder_caesium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_iodine), new ItemStack(ModItems.powder_polonium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_actinium), coA); - makeRecipe(copper, coAmat, "dustGold", new ItemStack(ModItems.powder_uranium), coA); - makeRecipe(copper, coAmat, new ComparableStack(ModItems.powder_verticium), new ItemStack(ModItems.powder_unobtainium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustBeryllium"), new ItemStack(ModItems.powder_quartz), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustCoal"), new ItemStack(ModItems.powder_bromine), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustTitanium"), new ItemStack(ModItems.powder_strontium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustIron"), new ItemStack(ModItems.powder_niobium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_bromine), new ItemStack(ModItems.powder_iodine), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_strontium), new ItemStack(ModItems.powder_neodymium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_niobium), new ItemStack(ModItems.powder_caesium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_iodine), new ItemStack(ModItems.powder_polonium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_caesium), new ItemStack(ModItems.powder_actinium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new OreDictStack("dustGold"), new ItemStack(ModItems.powder_uranium), coA); + makeRecipe(new ComparableStack(ModItems.part_copper), new ComparableStack(ModItems.powder_verticium), new ItemStack(ModItems.powder_unobtainium), coA); /// COPPER END /// /// PLUTONIUM START /// int plA = 100; - makeRecipe(plutonium, plAmat, "dustPhosphorus", new ItemStack(ModItems.powder_tennessine), plA); - makeRecipe(plutonium, plAmat, "dustPlutonium", new ItemStack(ModItems.powder_tennessine), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.powder_tennessine), new ItemStack(ModItems.powder_reiium), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.pellet_charged), new ItemStack(ModItems.nugget_schrabidium), 1000); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.powder_unobtainium), new ItemStack(ModItems.powder_daffergon), plA); - makeRecipe(plutonium, plAmat, new ComparableStack(ModItems.cell_antimatter), new ItemStack(ModItems.cell_anti_schrabidium), 0); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new OreDictStack("dustPhosphorus"), new ItemStack(ModItems.powder_tennessine), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new OreDictStack("dustPlutonium"), new ItemStack(ModItems.powder_tennessine), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.powder_tennessine), new ItemStack(ModItems.powder_reiium), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.pellet_charged), new ItemStack(ModItems.nugget_schrabidium), 1000); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.powder_unobtainium), new ItemStack(ModItems.powder_daffergon), plA); + makeRecipe(new ComparableStack(ModItems.part_plutonium), new ComparableStack(ModItems.cell_antimatter), new ItemStack(ModItems.cell_anti_schrabidium), 0); /// PLUTONIUM END /// ///TODO: fictional elements } - private static void makeRecipe(HashMap map, HashMap aMap, Object in, ItemStack out, int amat) { - map.put(in, out); - aMap.put(in, amat); + private static void makeRecipe(ComparableStack part, AStack in, ItemStack out, int amat) { + recipes.put(new Pair(part, in), new Pair(out, amat)); } public static Object[] getOutput(ItemStack stack, ItemStack box) { @@ -114,74 +112,101 @@ public class CyclotronRecipes { if(stack == null || stack.getItem() == null || box == null) return null; - HashMap pool = null; - HashMap aPool = null; + ComparableStack boxStack = new ComparableStack(box).makeSingular(); + ComparableStack comp = new ComparableStack(stack).makeSingular(); - if(box.getItem() == ModItems.part_lithium) { - pool = lithium; - aPool = liAmat; - } else if(box.getItem() == ModItems.part_beryllium) { - pool = beryllium; - aPool = beAmat; - } else if(box.getItem() == ModItems.part_carbon) { - pool = carbon; - aPool = caAmat; - } else if(box.getItem() == ModItems.part_copper) { - pool = copper; - aPool = coAmat; - } else if(box.getItem() == ModItems.part_plutonium) { - pool = plutonium; - aPool = plAmat; + //boo hoo we iterate over a hash map, cry me a river + for(Entry, Pair> entry : recipes.entrySet()) { + + if(entry.getKey().getKey().isApplicable(boxStack) && entry.getKey().getValue().isApplicable(comp)) { + return new Object[] { entry.getValue().getKey().copy(), entry.getValue().getValue() }; + } } - if(pool == null) - return null; + //there's literally 0 reason why this doesn't work yet it refuses, fuck this - ComparableStack comp = new ComparableStack(stack.getItem(), 1, stack.getItemDamage()); + /*Pair output = recipes.get(new Pair(boxStack, comp)); - if(pool.containsKey(comp)) - return new Object[] {pool.get(comp).copy(), aPool.get(comp)}; - - String[] dictKeys = comp.getDictKeys(); - - for(String key : dictKeys) { - - if(pool.containsKey(key)) - return new Object[] {pool.get(key).copy(), aPool.get(key)}; + if(output != null) { + return new Object[] { output.getKey().copy(), output.getValue() }; } + for(String name : ItemStackUtil.getOreDictNames(stack)) { + OreDictStack ods = new OreDictStack(name); + output = recipes.get(new Pair(new ComparableStack(ModItems.part_beryllium), new OreDictStack("dustCobalt"))); + + if(output != null) { + return new Object[] { output.getKey().copy(), output.getValue() }; + } + }*/ + return null; } public static Map getRecipes() { - Map recipes = new HashMap(); - - addRecipes(recipes, lithium, ModItems.part_lithium); - addRecipes(recipes, beryllium, ModItems.part_beryllium); - addRecipes(recipes, carbon, ModItems.part_carbon); - addRecipes(recipes, copper, ModItems.part_copper); - addRecipes(recipes, plutonium, ModItems.part_plutonium); + Map map = new HashMap(); - return recipes; - } - - private static void addRecipes(Map recipes, HashMap map, Item part) { - - for(Entry entry : map.entrySet()) { + for(Entry, Pair> entry : recipes.entrySet()) { + List stack = entry.getKey().getValue().extractForNEI(); - if(entry.getKey() instanceof ComparableStack) { - - recipes.put(new ItemStack[] { new ItemStack(part), ((ComparableStack) entry.getKey()).toStack() }, entry.getValue()); - - } else if(entry.getKey() instanceof String) { - - List ores = OreDictionary.getOres((String) entry.getKey()); - - for(ItemStack ore : ores) { - recipes.put(new ItemStack[] { new ItemStack(part), ore }, entry.getValue()); - } + for(ItemStack ingredient : stack) { + map.put(new ItemStack[] { entry.getKey().getKey().toStack(), ingredient }, entry.getValue().getKey()); } } + + return map; + } + + @Override + public String getFileName() { + return "hbmCyclotron.json"; + } + + @Override + public Object getRecipeObject() { + return this.recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonArray particle = ((JsonObject)recipe).get("particle").getAsJsonArray(); + JsonArray input = ((JsonObject)recipe).get("input").getAsJsonArray(); + JsonArray output = ((JsonObject)recipe).get("output").getAsJsonArray(); + int antimatter = ((JsonObject)recipe).get("antimatter").getAsInt(); + ItemStack partStack = this.readItemStack(particle); + AStack inStack = this.readAStack(input); + ItemStack outStack = this.readItemStack(output); + + this.recipes.put(new Pair(new ComparableStack(partStack), inStack), new Pair(outStack, antimatter)); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + try{ + Entry, Pair> rec = (Entry, Pair>) recipe; + + writer.name("particle"); + this.writeItemStack(rec.getKey().getKey().toStack(), writer); + writer.name("input"); + this.writeAStack(rec.getKey().getValue(), writer); + writer.name("output"); + this.writeItemStack(rec.getValue().getKey(), writer); + writer.name("antimatter").value(rec.getValue().getValue()); + + } catch(Exception ex) { + MainRegistry.logger.error(ex); + ex.printStackTrace(); + } + } + + @Override + public void deleteRecipes() { + this.recipes.clear(); + } + + @Override + public String getComment() { + return "The particle item, while being an input, has to be defined as an item stack without ore dictionary support."; } } diff --git a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java index 0c1f679c9..e0694e1ae 100644 --- a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java @@ -218,6 +218,7 @@ public class HadronRecipes extends SerializableRecipe { writer.endArray(); } + @Override public String getComment() { return "Rules: Both in- and output stacks cannot be null. Stacksizes are set to 1 for all stacks."; } diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index 39268a32f..4152a9c40 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -2,22 +2,14 @@ package com.hbm.inventory.recipes; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.FluidContainer; import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; -import com.hbm.items.weapon.ItemGunBase; -import com.hbm.main.MainRegistry; -import com.hbm.util.EnchantmentUtil; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -26,161 +18,21 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; //TODO: clean this shit up -@Spaghetti("everything") +@Spaghetti("i cannot sleep well at night knowing that this class still exists") public class MachineRecipes { - public MachineRecipes() { - - } - public static MachineRecipes instance() { return new MachineRecipes(); } - - public static ItemStack getFurnaceProcessingResult(ItemStack item, ItemStack item2) { - return getFurnaceOutput(item, item2); - } - - @Spaghetti("i am an affront to god and i desire to be cremated") - public static ItemStack getFurnaceOutput(ItemStack item, ItemStack item2) { - - if(item == null || item2 == null) - return null; - - if (GeneralConfig.enableDebugMode) { - if (item.getItem() == Items.iron_ingot && item2.getItem() == Items.quartz - || item.getItem() == Items.quartz && item2.getItem() == Items.iron_ingot) { - return new ItemStack(ModBlocks.test_render, 1); - } - } - - if (mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, "gemCoal") - || mODE(item, "gemCoal") && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"})) { - return new ItemStack(ModItems.neutron_reflector, 2); - } - - if (mODE(item, new String[] {"ingotIron", "dustIron"}) && mODE(item2, new String[] {"gemCoal", "dustCoal"}) - || mODE(item, new String[] {"gemCoal", "dustCoal"}) && mODE(item2, new String[] {"ingotIron", "dustIron"})) { - return new ItemStack(ModItems.ingot_steel, 2); - } - - if (mODE(item, new String[] {"ingotCopper", "dustCopper"}) && item2.getItem() == Items.redstone - || item.getItem() == Items.redstone && mODE(item2, new String[] {"ingotCopper", "dustCopper"})) { - return new ItemStack(ModItems.ingot_red_copper, 2); - } - - if (item.getItem() == ModItems.canister_full && item.getItemDamage() == Fluids.DIESEL.getID() && item2.getItem() == Items.slime_ball - || item.getItem() == Items.slime_ball && item2.getItem() == ModItems.canister_full && item2.getItemDamage() == Fluids.DIESEL.getID()) { - return new ItemStack(ModItems.canister_napalm, 1); - } - - if (mODE(item, new String[] {"ingotMingrade", "dustMingrade"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"}) - || mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotMingrade", "dustMingrade"})) { - return new ItemStack(ModItems.ingot_advanced_alloy, 2); - } - - if (mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, "nuggetSchrabidium") - || mODE(item, "nuggetSchrabidium") && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"})) { - return new ItemStack(ModItems.ingot_magnetized_tungsten, 1); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"nuggetTechnetium99", "tinyTc99"}) - || mODE(item, new String[] {"nuggetTechnetium99", "tinyTc99"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_tcalloy, 1); - } - - if (item.getItem() == ModItems.plate_mixed && mODE(item2, "plateGold") - || mODE(item, "plateGold") && item2.getItem() == ModItems.plate_mixed) { - return new ItemStack(ModItems.plate_paa, 2); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotTungsten", "dustTungsten"}) - || mODE(item, new String[] {"ingotTungsten", "dustTungsten"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_dura_steel, 2); - } - - if (mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && mODE(item2, new String[] {"ingotSteel", "dustSteel"})) { - return new ItemStack(ModItems.ingot_dura_steel, 2); - } - - if (mODE(item, new String[] {"ingotSaturnite", "dustSaturnite"}) && item2.getItem() == ModItems.powder_meteorite - || item.getItem() == ModItems.powder_meteorite && mODE(item2, new String[] {"ingotSaturnite", "dustSaturnite"})) { - return new ItemStack(ModItems.ingot_starmetal, 2); - } - - if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleAlloy) { - if(mODE(item, new String[] { "gemCoal", "dustCoal" }) && item2.getItem() == ModItems.canister_empty - || item.getItem() == ModItems.canister_empty && mODE(item2, new String[] { "gemCoal", "dustCoal" })) { - return new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID()); - } - - if(item.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor_cobble) && mODE(item2, new String[] { "ingotSteel", "dustSteel" }) - || mODE(item, new String[] { "ingotSteel", "dustSteel" }) && item2.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor_cobble)) { - return new ItemStack(ModItems.ingot_meteorite); - } - } - - if (item.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor) && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && item2.getItem() == Item.getItemFromBlock(ModBlocks.block_meteor)) { - return new ItemStack(ModItems.ingot_meteorite); - } - - if (mODE(item, "ingotUranium238") && mODE(item2, new String[] {"ingotSteel", "dustSteel"}) - || mODE(item, new String[] {"ingotSteel", "dustSteel"}) && mODE(item2, "ingotUranium238")) { - return new ItemStack(ModItems.ingot_ferrouranium, 2); - } - - if (item.getItem() == ModItems.meteorite_sword_hardened && mODE(item2, new String[] {"ingotCobalt", "dustCobalt"}) - || mODE(item, new String[] {"ingotCobalt", "dustCobalt"}) && item2.getItem() == ModItems.meteorite_sword_hardened) { - return new ItemStack(ModItems.meteorite_sword_alloyed, 1); - } - - if(item.getItem() instanceof ItemGunBase && item2.getItem() == Items.enchanted_book) { - - ItemStack result = item.copy(); - - Map mapright = EnchantmentHelper.getEnchantments(item2); - Iterator itr = mapright.keySet().iterator(); - - while (itr.hasNext()) { - - int i = ((Integer)itr.next()).intValue(); - int j = ((Integer)mapright.get(Integer.valueOf(i))).intValue(); - Enchantment e = Enchantment.enchantmentsList[i]; - - EnchantmentUtil.removeEnchantment(result, e); - EnchantmentUtil.addEnchantment(result, e, j); - } - - return result; - } - - return null; - } //return: FluidType, amount produced, amount required, heat required (°C * 100) public static Object[] getBoilerOutput(FluidType type) { - if(type == Fluids.WATER) return new Object[] { Fluids.STEAM, 500, 5, 10000 }; - if(type == Fluids.STEAM) return new Object[] { Fluids.HOTSTEAM, 5, 50, 30000 }; - if(type == Fluids.HOTSTEAM) return new Object[] { Fluids.SUPERHOTSTEAM, 5, 50, 45000 }; if(type == Fluids.OIL) return new Object[] { Fluids.HOTOIL, 5, 5, 35000 }; if(type == Fluids.CRACKOIL) return new Object[] { Fluids.HOTCRACKOIL, 5, 5, 35000 }; return null; } - - //return: FluidType, amount produced, amount required, HE produced - public static Object[] getTurbineOutput(FluidType type) { - - if(type == Fluids.STEAM) return new Object[] { Fluids.SPENTSTEAM, 5, 500, 50 }; - if(type == Fluids.HOTSTEAM) return new Object[] { Fluids.STEAM, 50, 5, 100 }; - if(type == Fluids.SUPERHOTSTEAM) return new Object[] { Fluids.HOTSTEAM, 50, 5, 150 }; - if(type == Fluids.ULTRAHOTSTEAM) return new Object[] { Fluids.SUPERHOTSTEAM, 50, 5, 250 }; - - return null; - } public static ItemStack getCyclotronOutput(ItemStack part, ItemStack item) { @@ -402,54 +254,6 @@ public class MachineRecipes { return null; } - public Map getAlloyRecipes() { - Map recipes = new HashMap(); - - if (GeneralConfig.enableDebugMode) { - recipes.put(new ItemStack[] { new ItemStack(Items.iron_ingot), new ItemStack(Items.quartz) }, - new ItemStack(Item.getItemFromBlock(ModBlocks.test_render))); - } - try { - recipes.put(new ItemStack[] { new ItemStack(Items.iron_ingot), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(Items.iron_ingot), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_tungsten), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_tungsten), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_copper), new ItemStack(Items.redstone) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_copper), new ItemStack(Items.redstone)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_red_copper), new ItemStack(ModItems.ingot_steel) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_red_copper), new ItemStack(ModItems.ingot_steel)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.canister_full, 1, Fluids.DIESEL.getID()), new ItemStack(Items.slime_ball) }, - getFurnaceOutput(new ItemStack(ModItems.canister_full, 1, Fluids.DIESEL.getID()), new ItemStack(Items.slime_ball)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_tungsten), new ItemStack(ModItems.nugget_schrabidium) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_tungsten), new ItemStack(ModItems.nugget_schrabidium)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.plate_mixed), new ItemStack(ModItems.plate_gold) }, - getFurnaceOutput(new ItemStack(ModItems.plate_mixed), new ItemStack(ModItems.plate_gold)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_tungsten) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_tungsten)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_cobalt) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_cobalt)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_saturnite), new ItemStack(ModItems.powder_meteorite) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_saturnite), new ItemStack(ModItems.powder_meteorite)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.nugget_technetium) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.nugget_technetium)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_cobalt), new ItemStack(ModBlocks.block_meteor) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_cobalt), new ItemStack(ModBlocks.block_meteor)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_u238) }, - getFurnaceOutput(new ItemStack(ModItems.ingot_steel), new ItemStack(ModItems.ingot_u238)).copy()); - - if(GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleAlloy) { - recipes.put(new ItemStack[] { new ItemStack(ModItems.canister_empty), new ItemStack(Items.coal) }, - getFurnaceOutput(new ItemStack(ModItems.canister_empty), new ItemStack(Items.coal)).copy()); - recipes.put(new ItemStack[] { new ItemStack(ModBlocks.block_meteor_cobble), new ItemStack(ModItems.ingot_steel) }, - getFurnaceOutput(new ItemStack(ModBlocks.block_meteor_cobble), new ItemStack(ModItems.ingot_steel)).copy()); - } - - } catch (Exception x) { - MainRegistry.logger.error("Unable to register alloy recipes for NEI!"); - } - return recipes; - } - public ArrayList getAlloyFuels() { ArrayList fuels = new ArrayList(); fuels.add(new ItemStack(Items.coal)); @@ -465,20 +269,8 @@ public class MachineRecipes { fuels.add(new ItemStack(ModItems.powder_coal)); return fuels; } - - public ArrayList getCentrifugeFuels() { - ArrayList fuels = new ArrayList(); - fuels.add(new ItemStack(Items.coal)); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.coal_block))); - fuels.add(new ItemStack(Items.lava_bucket)); - fuels.add(new ItemStack(Items.redstone)); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.redstone_block))); - fuels.add(new ItemStack(Item.getItemFromBlock(Blocks.netherrack))); - fuels.add(new ItemStack(Items.blaze_rod)); - fuels.add(new ItemStack(Items.blaze_powder)); - return fuels; - } + @Spaghetti("why did i do this?") public Map getCyclotronRecipes() { Map recipes = new HashMap(); Item part = ModItems.part_lithium; @@ -796,240 +588,9 @@ public class MachineRecipes { return recipes; } - //keep this - //like in a museum or something - //this is a testament of my incompetence - //look at it - //look at how horrifying it is - //children, never do this - /*public class ShredderRecipe { - - public ItemStack input; - public ItemStack output; - - public void registerEverythingImSrs() { - - String[] names = OreDictionary.getOreNames(); - List stacks = new ArrayList(); - - for(int i = 0; i < names.length; i++) { - stacks.addAll(OreDictionary.getOres(names[i])); - } - - for(int i = 0; i < stacks.size(); i++) { - - int[] ids = OreDictionary.getOreIDs(stacks.get(i)); - - List oreNames = new ArrayList(); - - for(int j = 0; j < ids.length; j++) { - oreNames.add(OreDictionary.getOreName(ids[j])); - } - - theWholeThing.add(new DictCouple(stacks.get(i), oreNames)); - } - - MainRegistry.logger.info("Added " + theWholeThing.size() + " elements from the Ore Dict!"); - } - - public boolean doesExist(ItemStack stack) { - - for(DictCouple dic : theWholeThing) { - if(dic.item.getItem() == stack.getItem() && dic.item.getItemDamage() == stack.getItemDamage()) - return true; - } - - return false; - } - - public void addRecipes() { - - // Not very efficient, I know, but at least it works AND it's - // somewhat smart! - - for(int i = 0; i < theWholeThing.size(); i++) - { - for(int j = 0; j < theWholeThing.get(i).list.size(); j++) - { - String s = theWholeThing.get(i).list.get(j); - - if (s.length() > 5 && s.substring(0, 5).equals("ingot")) { - ItemStack stack = canFindDustByName(s.substring(5)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, stack); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 3 && s.substring(0, 3).equals("ore")) { - ItemStack stack = canFindDustByName(s.substring(3)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 2, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 5 && s.substring(0, 5).equals("block")) { - ItemStack stack = canFindDustByName(s.substring(5)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 9, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 3 && s.substring(0, 3).equals("gem")) { - ItemStack stack = canFindDustByName(s.substring(3)); - if (stack != null) { - setRecipe(theWholeThing.get(i).item, new ItemStack(stack.getItem(), 1, stack.getItemDamage())); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } else if (s.length() > 4 && s.substring(0, 4).equals("dust")) { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.dust)); - } else if (s.length() > 6 && s.substring(0, 6).equals("powder")) { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.dust)); - } else { - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - } - - if(theWholeThing.get(i).list.isEmpty()) - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - if(!theWholeThing.get(i).list.isEmpty() && theWholeThing.get(i).list.get(0).equals("Unknown")) - setRecipe(theWholeThing.get(i).item, new ItemStack(ModItems.scrap)); - } - - MainRegistry.logger.info("Added " + recipesShredder.size() + " in total."); - MainRegistry.logger.info("Added " + dustCount + " ore dust recipes."); - } - - public ItemStack canFindDustByName(String s) { - - for(DictCouple d : theWholeThing) - { - for(String s1 : d.list) - { - if(s1.length() > 4 && s1.substring(0, 4).equals("dust") && s1.substring(4).equals(s)) - { - dustCount++; - return d.item; - } - } - } - - return null; - } - - public void setRecipe(ItemStack inp, ItemStack outp) { - ShredderRecipe recipe = new ShredderRecipe(); - - recipe.input = inp; - recipe.output = outp; - - recipesShredder.add(recipe); - } - - public void overridePreSetRecipe(ItemStack inp, ItemStack outp) { - - boolean flag = false; - - for(int i = 0; i < recipesShredder.size(); i++) - { - if(recipesShredder.get(i) != null && - recipesShredder.get(i).input != null && - recipesShredder.get(i).output != null && - inp != null && - outp != null && - recipesShredder.get(i).input.getItem() == inp.getItem() && - recipesShredder.get(i).input.getItemDamage() == inp.getItemDamage()) { - recipesShredder.get(i).output = outp; - flag = true; - } - } - - if(!flag) { - ShredderRecipe rec = new ShredderRecipe(); - rec.input = inp; - rec.output = outp; - recipesShredder.add(rec); - } - } - - public void removeDuplicates() { - List newList = new ArrayList(); - - for(ShredderRecipe piv : recipesShredder) - { - boolean flag = false; - - if(newList.size() == 0) - { - newList.add(piv); - } else { - for(ShredderRecipe rec : newList) { - if(piv != null && rec != null && piv.input != null && rec.input != null && rec.input.getItem() != null && piv.input.getItem() != null && rec.input.getItemDamage() == piv.input.getItemDamage() && rec.input.getItem() == piv.input.getItem()) - flag = true; - if(piv == null || rec == null || piv.input == null || rec.input == null) - flag = true; - } - } - - if(!flag) - { - newList.add(piv); - } - } - } - - public void PrintRecipes() { - - MainRegistry.logger.debug("TWT: " + theWholeThing.size() + ", REC: " + recipesShredder.size()); - } - } - - public static class DictCouple { - - public ItemStack item; - public List list; - - public DictCouple(ItemStack item, List list) { - this.item = item; - this.list = list; - } - - public static List findWithStack(ItemStack stack) { - for(DictCouple couple : theWholeThing) { - if(couple.item == stack); - return couple.list; - } - - return null; - } - } - - public static List recipesShredder = new ArrayList(); - public static List theWholeThing = new ArrayList(); - public static int dustCount = 0; - - public static ItemStack getShredderResult(ItemStack stack) { - for(ShredderRecipe rec : recipesShredder) - { - if(stack != null && - rec.input.getItem() == stack.getItem() && - rec.input.getItemDamage() == stack.getItemDamage()) - return rec.output.copy(); - } - - return new ItemStack(ModItems.scrap); - } - - public Map getShredderRecipes() { - Map recipes = new HashMap(); - - for(int i = 0; i < MachineRecipes.recipesShredder.size(); i++) { - if(MachineRecipes.recipesShredder.get(i) != null && MachineRecipes.recipesShredder.get(i).output.getItem() != ModItems.scrap) - recipes.put(MachineRecipes.recipesShredder.get(i).input, getShredderResult(MachineRecipes.recipesShredder.get(i).input)); - } - - return recipes; - }*/ + /* + * this is the smoldering crater where once the 2016 shredder recipe code was + */ public Map getCMBRecipes() { Map recipes = new HashMap(); diff --git a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java index 3cb813da8..ada0f7399 100644 --- a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java @@ -42,7 +42,7 @@ public class MagicRecipes { recipes.add(new MagicRecipe(new ItemStack(ModItems.rod_of_discord), new ComparableStack(Items.ender_pearl), new ComparableStack(Items.blaze_rod), new ComparableStack(ModItems.nugget_euphemium))); recipes.add(new MagicRecipe(new ItemStack(ModItems.balefire_and_steel), new OreDictStack("ingotSteel"), new ComparableStack(ModItems.egg_balefire_shard))); recipes.add(new MagicRecipe(new ItemStack(ModItems.mysteryshovel), new ComparableStack(Items.iron_shovel), new ComparableStack(Items.bone), new ComparableStack(ModItems.ingot_starmetal), new ComparableStack(ModItems.ducttape))); - recipes.add(new MagicRecipe(new ItemStack(ModItems.ingot_electronium), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged), new ComparableStack(ModItems.dynosphere_dineutronium_charged))); + recipes.add(new MagicRecipe(new ItemStack(ModItems.ingot_electronium), new ComparableStack(ModItems.pellet_charged), new ComparableStack(ModItems.pellet_charged), new ComparableStack(ModItems.ingot_dineutronium), new ComparableStack(ModItems.ingot_dineutronium))); recipes.add(new MagicRecipe(new ItemStack(ModItems.ammo_44_pip), new ComparableStack(ModItems.ammo_44), diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index d1ac38a06..4006b2b51 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -1,13 +1,19 @@ package com.hbm.inventory.recipes; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.interfaces.Untested; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Compat; @@ -19,12 +25,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -public class ShredderRecipes { +public class ShredderRecipes extends SerializableRecipe { public static HashMap shredderRecipes = new HashMap(); public static HashMap neiShredderRecipes; - public static void registerShredder() { + @Override + public void registerPost() { String[] names = OreDictionary.getOreNames(); @@ -106,7 +113,7 @@ public class ShredderRecipes { if(in != null) { if(in.getItem() != null) { - shredderRecipes.put(new ComparableStack(in), dust); + setRecipe(new ComparableStack(in), dust); } else { MainRegistry.logger.error("Ore dict entry '" + name + "' has a null item in its stack! How does that even happen?"); Thread.currentThread().dumpStack(); @@ -117,12 +124,11 @@ public class ShredderRecipes { Thread.currentThread().dumpStack(); } } - - public static void registerOverrides() { - /* - * Primary recipes - */ + @Override + public void registerDefaults() { + + /* Primary recipes */ ShredderRecipes.setRecipe(ModItems.scrap, new ItemStack(ModItems.dust)); ShredderRecipes.setRecipe(ModItems.dust, new ItemStack(ModItems.dust)); ShredderRecipes.setRecipe(Blocks.glowstone, new ItemStack(Items.glowstone_dust, 4)); @@ -192,9 +198,7 @@ public class ShredderRecipes { for(int i = 0; i < 5; i++) ShredderRecipes.setRecipe(new ItemStack(Items.skull, 1, i), new ItemStack(ModItems.biomass)); - /* - * Crstaly processing - */ + /* Crystal processing */ ShredderRecipes.setRecipe(ModItems.ingot_schraranium, new ItemStack(ModItems.nugget_schrabidium, 2)); ShredderRecipes.setRecipe(ModItems.crystal_coal, new ItemStack(ModItems.powder_coal, 3)); ShredderRecipes.setRecipe(ModItems.crystal_iron, new ItemStack(ModItems.powder_iron, 3)); @@ -223,9 +227,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModItems.crystal_starmetal, new ItemStack(ModItems.powder_dura_steel, 6)); ShredderRecipes.setRecipe(ModItems.crystal_cobalt, new ItemStack(ModItems.powder_cobalt, 3)); - /* - * Misc recycling - */ + /* Misc recycling */ ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModBlocks.pole_top, new ItemStack(ModItems.powder_tungsten, 4)); ShredderRecipes.setRecipe(ModBlocks.tape_recorder, new ItemStack(ModItems.powder_steel, 1)); @@ -251,9 +253,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.steel_grate, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.pipes_steel, new ItemStack(ModItems.powder_steel, 27)); - /* - * Sellafite scrapping - */ + /* Sellafite scrapping */ ShredderRecipes.setRecipe(ModBlocks.sellafield_slaked, new ItemStack(Blocks.gravel)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 0), new ItemStack(ModItems.scrap_nuclear, 1)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 1), new ItemStack(ModItems.scrap_nuclear, 2)); @@ -262,9 +262,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 4), new ItemStack(ModItems.scrap_nuclear, 7)); ShredderRecipes.setRecipe(new ItemStack(ModBlocks.sellafield, 1, 5), new ItemStack(ModItems.scrap_nuclear, 15)); - /* - * Fracking debris scrapping - */ + /* Fracking debris scrapping */ ShredderRecipes.setRecipe(ModBlocks.dirt_dead, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.dirt_oily, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.sand_dirty, new ItemStack(ModItems.scrap_oil, 1)); @@ -272,9 +270,7 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.stone_cracked, new ItemStack(ModItems.scrap_oil, 1)); ShredderRecipes.setRecipe(ModBlocks.stone_porous, new ItemStack(ModItems.scrap_oil, 1)); - /* - * Deco pipe recycling - */ + /* Deco pipe recycling */ ShredderRecipes.setRecipe(ModBlocks.deco_pipe, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_rusted, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_green, new ItemStack(ModItems.powder_steel, 1)); @@ -300,41 +296,19 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_red, new ItemStack(ModItems.powder_steel, 1)); ShredderRecipes.setRecipe(ModBlocks.deco_pipe_framed_marked, new ItemStack(ModItems.powder_steel, 1)); - /* - * Turret and ammo recycling - */ - ShredderRecipes.setRecipe(ModBlocks.turret_light, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_heavy, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_flamer, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_rocket, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_cwis, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModBlocks.turret_tau, new ItemStack(ModItems.powder_steel, 16)); - ShredderRecipes.setRecipe(ModItems.turret_light_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_heavy_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_flamer_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_rocket_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_cwis_ammo, new ItemStack(Items.gunpowder, 4)); - ShredderRecipes.setRecipe(ModItems.turret_tau_ammo, new ItemStack(ModItems.powder_uranium, 4)); - - /* - * Wool and clay scrapping - */ + /* Wool and clay scrapping */ for(int i = 0; i < 16; i++) { ShredderRecipes.setRecipe(new ItemStack(Blocks.stained_hardened_clay, 1, i), new ItemStack(Items.clay_ball, 4)); ShredderRecipes.setRecipe(new ItemStack(Blocks.wool, 1, i), new ItemStack(Items.string, 4)); } - /* - * Shredding bobbleheads - */ + /* Shredding bobbleheads */ for(int i = 0; i < BobbleType.values().length; i++) { BobbleType type = BobbleType.values()[i]; ShredderRecipes.setRecipe(new ItemStack(ModBlocks.bobblehead, 1, i), new ItemStack(ModItems.scrap_plastic, 1, type.scrap.ordinal())); } - /* - * Debris shredding - */ + /* Debris shredding */ ShredderRecipes.setRecipe(ModItems.debris_concrete, new ItemStack(ModItems.scrap_nuclear, 2)); ShredderRecipes.setRecipe(ModItems.debris_shrapnel, new ItemStack(ModItems.powder_steel_tiny, 5)); ShredderRecipes.setRecipe(ModItems.debris_exchanger, new ItemStack(ModItems.powder_steel, 3)); @@ -342,18 +316,14 @@ public class ShredderRecipes { ShredderRecipes.setRecipe(ModItems.debris_metal, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.debris_graphite, new ItemStack(ModItems.powder_coal, 1)); - /* - * GC COMPAT - */ + /* GC COMPAT */ Item gcMoonBlock = Compat.tryLoadItem(Compat.MOD_GCC, "moonBlock"); if(gcMoonBlock != null) { ShredderRecipes.setRecipe(new ItemStack(gcMoonBlock, 1, 3), new ItemStack(ModBlocks.moon_turf)); //Moon dirt ShredderRecipes.setRecipe(new ItemStack(gcMoonBlock, 1, 5), new ItemStack(ModBlocks.moon_turf)); //Moon topsoil } - /* - * AR COMPAT - */ + /* AR COMPAT */ Item arMoonTurf = Compat.tryLoadItem(Compat.MOD_AR, "turf"); if(arMoonTurf != null) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf Item arMoonTurfDark = Compat.tryLoadItem(Compat.MOD_AR, "turfDark"); @@ -396,18 +366,21 @@ public class ShredderRecipes { } public static void setRecipe(Item in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); } public static void setRecipe(Block in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); } public static void setRecipe(ItemStack in, ItemStack out) { - - shredderRecipes.put(new ComparableStack(in), out); + setRecipe(new ComparableStack(in), out); + } + + public static void setRecipe(ComparableStack in, ItemStack out) { + if(!shredderRecipes.containsKey(in)) { + shredderRecipes.put(in, out); + } } public static Map getShredderRecipes() { @@ -426,11 +399,46 @@ public class ShredderRecipes { ItemStack sta = shredderRecipes.get(new ComparableStack(stack).makeSingular()); - /*if(sta != null) - System.out.println(stack.getDisplayName() + " resulted " + sta.getDisplayName()); - else - System.out.println(stack.getDisplayName() + " resulted null");*/ - return sta == null ? new ItemStack(ModItems.scrap) : sta; } + + @Override + public String getFileName() { + return "hbmShredder.json"; + } + + @Override + public Object getRecipeObject() { + return shredderRecipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + ComparableStack comp = new ComparableStack(this.readItemStack(obj.get("input").getAsJsonArray())).makeSingular(); + ItemStack out = this.readItemStack(obj.get("output").getAsJsonArray()); + + this.shredderRecipes.put(comp, out); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + Entry entry = (Entry) recipe; + + writer.name("input"); + this.writeItemStack(entry.getKey().toStack(), writer); + writer.name("output"); + this.writeItemStack(entry.getValue(), writer); + } + + @Override + public void deleteRecipes() { + this.shredderRecipes.clear(); + this.neiShredderRecipes = null; + } + + @Override + public String getComment() { + return "Ingot/block/ore -> dust recipes are generated in post and can therefore not be changed with the config. Non-auto recipes do not use ore dict."; + } } 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 2d7f13c6f..c0e9fd2f0 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -67,6 +67,61 @@ public class AnvilRecipes { smithingRecipes.add(new AnvilSmithingRecipe(1916169, new ItemStack(ModItems.wings_murk, 1), new ComparableStack(ModItems.wings_limp), new ComparableStack(ModItems.particle_tachyon))); smithingRecipes.add(new AnvilSmithingRecipe(4, new ItemStack(ModItems.flask_infusion, 1, EnumInfusion.SHIELD.ordinal()), new ComparableStack(ModItems.gem_alexandrite), new ComparableStack(ModItems.bottle_nuka))); + smithingRecipes.add(new AnvilSmithingMold(0, new OreDictStack(GOLD.nugget()), new OreDictStack("nugget"))); + smithingRecipes.add(new AnvilSmithingMold(1, new OreDictStack(U.billet()), new OreDictStack("billet"))); + smithingRecipes.add(new AnvilSmithingMold(2, new OreDictStack(IRON.ingot()), new OreDictStack("ingot"))); + smithingRecipes.add(new AnvilSmithingMold(3, new OreDictStack(IRON.plate()), new OreDictStack("plate"))); + smithingRecipes.add(new AnvilSmithingMold(4, new ComparableStack(ModItems.wire_aluminium, 8), new ItemStack[] { + new ItemStack(ModItems.wire_advanced_alloy, 8), + new ItemStack(ModItems.wire_aluminium, 8), + new ItemStack(ModItems.wire_copper, 8), + new ItemStack(ModItems.wire_gold, 8), + new ItemStack(ModItems.wire_magnetized_tungsten, 8), + new ItemStack(ModItems.wire_red_copper, 8), + new ItemStack(ModItems.wire_schrabidium, 8), + new ItemStack(ModItems.wire_tungsten, 8) + })); + smithingRecipes.add(new AnvilSmithingMold(5, new ComparableStack(ModItems.blade_titanium), new ItemStack[] { + new ItemStack(ModItems.blade_titanium), + new ItemStack(ModItems.blade_tungsten) + })); + smithingRecipes.add(new AnvilSmithingMold(6, new ComparableStack(ModItems.blades_iron), new ItemStack[] { + new ItemStack(ModItems.blades_gold), + new ItemStack(ModItems.blades_aluminium), + new ItemStack(ModItems.blades_iron), + new ItemStack(ModItems.blades_steel), + new ItemStack(ModItems.blades_titanium), + new ItemStack(ModItems.blades_advanced_alloy), + new ItemStack(ModItems.blades_combine_steel), + new ItemStack(ModItems.blades_schrabidium) + })); + smithingRecipes.add(new AnvilSmithingMold(7, new ComparableStack(ModItems.stamp_iron_flat), new ItemStack[] { + new ItemStack(ModItems.stamp_stone_flat), + new ItemStack(ModItems.stamp_iron_flat), + new ItemStack(ModItems.stamp_steel_flat), + new ItemStack(ModItems.stamp_titanium_flat), + new ItemStack(ModItems.stamp_obsidian_flat), + new ItemStack(ModItems.stamp_schrabidium_flat) + })); + smithingRecipes.add(new AnvilSmithingMold(8, new ComparableStack(ModItems.hull_small_steel), new ItemStack[] { + new ItemStack(ModItems.hull_small_aluminium), + new ItemStack(ModItems.hull_small_steel) + })); + smithingRecipes.add(new AnvilSmithingMold(9, new ComparableStack(ModItems.hull_big_steel), new ItemStack[] { + new ItemStack(ModItems.hull_big_steel), + new ItemStack(ModItems.hull_big_aluminium), + new ItemStack(ModItems.hull_big_titanium) + })); + smithingRecipes.add(new AnvilSmithingMold(10, new OreDictStack(IRON.ingot(), 9), new OreDictStack("ingot", 9))); + smithingRecipes.add(new AnvilSmithingMold(11, new OreDictStack(IRON.plate(), 9), new OreDictStack("plate", 9))); + smithingRecipes.add(new AnvilSmithingMold(12, new OreDictStack(IRON.block()), new OreDictStack("block"))); + smithingRecipes.add(new AnvilSmithingMold(13, new ComparableStack(ModItems.pipes_steel), new ItemStack[] {new ItemStack(ModItems.pipes_steel)})); + smithingRecipes.add(new AnvilSmithingMold(14, new ComparableStack(ModItems.casing_357), new ItemStack[] {new ItemStack(ModItems.casing_357)})); + smithingRecipes.add(new AnvilSmithingMold(15, new ComparableStack(ModItems.casing_44), new ItemStack[] {new ItemStack(ModItems.casing_44)})); + smithingRecipes.add(new AnvilSmithingMold(16, new ComparableStack(ModItems.casing_9), new ItemStack[] {new ItemStack(ModItems.casing_9)})); + smithingRecipes.add(new AnvilSmithingMold(17, new ComparableStack(ModItems.casing_50), new ItemStack[] {new ItemStack(ModItems.casing_50)})); + smithingRecipes.add(new AnvilSmithingMold(18, new ComparableStack(ModItems.casing_buckshot), new ItemStack[] {new ItemStack(ModItems.casing_buckshot)})); + smithingRecipes.add(new AnvilSmithingCyanideRecipe()); smithingRecipes.add(new AnvilSmithingRenameRecipe()); } @@ -187,6 +242,15 @@ public class AnvilRecipes { new OreDictStack(CU.ingot(), 8) }, new AnvilOutput(new ItemStack(ModBlocks.heater_oilburner))).setTier(3)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(ANY_PLASTIC.ingot(), 4), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(STEEL.plate(), 8), + new ComparableStack(ModItems.coil_tungsten, 8), + new ComparableStack(ModItems.circuit_copper, 1) + }, new AnvilOutput(new ItemStack(ModBlocks.heater_electric))).setTier(3)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(Blocks.stonebrick, 16), @@ -202,9 +266,41 @@ public class AnvilRecipes { new OreDictStack(STEEL.plate(), 6), new OreDictStack(CU.ingot(), 8), new ComparableStack(ModItems.coil_copper, 4), - new ComparableStack(ModItems.gear_large, 1) + new ComparableStack(ModItems.gear_large, 1, 0) }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(STEEL.plate(), 16), + new OreDictStack(BE.ingot(), 6), + new OreDictStack(CU.ingot(), 8), + new ComparableStack(ModItems.coil_gold, 16), + new ComparableStack(ModItems.gear_large, 1, 1) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_stirling_steel))).setTier(2)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(KEY_PLANKS, 16), + new OreDictStack(STEEL.plate(), 6), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(IRON.ingot(), 4), + new ComparableStack(ModItems.sawblade) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_sawmill))).setTier(2)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new ComparableStack(ModItems.ingot_firebrick, 20), + new OreDictStack(CU.ingot(), 8), + new OreDictStack(STEEL.plate(), 8) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_crucible))).setTier(2)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new AStack[] { + new OreDictStack(STEEL.ingot(), 4), + new OreDictStack(CU.plate(), 16), + new ComparableStack(ModItems.plate_polymer, 8) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_boiler))).setTier(2)); + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), @@ -484,6 +580,18 @@ public class AnvilRecipes { new AnvilOutput(new ItemStack(ModItems.ingot_tcalloy, 1), 0.25F) } ).setTier(3)); + + constructionRecipes.add(new AnvilConstructionRecipe( + new ComparableStack(ModBlocks.deco_computer), + new AnvilOutput[] { + new AnvilOutput(new ItemStack(ModItems.crt_display, 1)), + new AnvilOutput(new ItemStack(ModItems.scrap, 3)), + new AnvilOutput(new ItemStack(ModItems.wire_copper, 4)), + new AnvilOutput(new ItemStack(ModItems.circuit_red_copper, 1), 0.25F), + new AnvilOutput(new ItemStack(ModItems.circuit_copper, 2)) + + } + ).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( new ComparableStack(ModItems.circuit_raw), diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java index c1ebe933f..5b1db63d5 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingCyanideRecipe.java @@ -1,6 +1,5 @@ package com.hbm.inventory.recipes.anvil; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java index 31642ef4f..c3cb7f520 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingHotRecipe.java @@ -3,7 +3,6 @@ package com.hbm.inventory.recipes.anvil; import java.util.Arrays; import java.util.List; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.items.special.ItemHot; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java new file mode 100644 index 000000000..899e1725c --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingMold.java @@ -0,0 +1,61 @@ +package com.hbm.inventory.recipes.anvil; + +import java.util.List; + +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.items.ModItems; +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; + +public class AnvilSmithingMold extends AnvilSmithingRecipe { + + OreDictStack matchesPrefix; + ItemStack[] matchesStack; + + public AnvilSmithingMold(int meta, AStack demo, Object o) { + super(1, new ItemStack(ModItems.mold, 1, meta), demo, new ComparableStack(ModItems.mold_base)); + + if(o instanceof OreDictStack) + matchesPrefix = (OreDictStack) o; + if(o instanceof ItemStack[]) + matchesStack = (ItemStack[]) o; + } + + @Override + public boolean matches(ItemStack left, ItemStack right) { + if(!doesStackMatch(right, this.right)) return false; + + if(matchesPrefix != null && left.stackSize == matchesPrefix.stacksize) { + List names = ItemStackUtil.getOreDictNames(left); + + for(String name : names) { + if(name.startsWith(matchesPrefix.name)) { + return true; + } + } + } + + if(matchesStack != null) { + + for(ItemStack stack : matchesStack) { + if(left.getItem() == stack.getItem() && left.getItemDamage() == stack.getItemDamage() && left.stackSize == stack.stackSize) { + return true; + } + } + } + + return false; + } + + @Override + public int matchesInt(ItemStack left, ItemStack right) { + return matches(left, right) ? 0 : -1; + } + + public int amountConsumed(int index, boolean mirrored) { + return index; + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java index 9677efdc9..566434ce6 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRecipe.java @@ -3,7 +3,6 @@ package com.hbm.inventory.recipes.anvil; import java.util.List; import com.hbm.config.GeneralConfig; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.AStack; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java index 3bb25ab6c..2817e8d0b 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilSmithingRenameRecipe.java @@ -1,6 +1,5 @@ package com.hbm.inventory.recipes.anvil; -import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.RecipesCommon.ComparableStack; import net.minecraft.init.Items; diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 06bafbfef..2b53ced81 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -27,6 +27,7 @@ import com.hbm.main.MainRegistry; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +//the anti-spaghetti. this class provides so much functionality and saves so much time, i just love you, SerializableRecipe <3 public abstract class SerializableRecipe { public static final Gson gson = new Gson(); @@ -37,7 +38,11 @@ public abstract class SerializableRecipe { */ public static void registerAllHandlers() { + recipeHandlers.add(new ShredderRecipes()); recipeHandlers.add(new ChemplantRecipes()); + recipeHandlers.add(new CrucibleRecipes()); + recipeHandlers.add(new CentrifugeRecipes()); + recipeHandlers.add(new CyclotronRecipes()); recipeHandlers.add(new HadronRecipes()); recipeHandlers.add(new FuelPoolRecipes()); } @@ -55,6 +60,8 @@ public abstract class SerializableRecipe { for(SerializableRecipe recipe : recipeHandlers) { + recipe.deleteRecipes(); + File recFile = new File(recDir.getAbsolutePath() + File.separatorChar + recipe.getFileName()); if(recFile.exists() && recFile.isFile()) { MainRegistry.logger.info("Reading recipe file " + recFile.getName()); @@ -67,6 +74,8 @@ public abstract class SerializableRecipe { MainRegistry.logger.info("Writing template file " + recTemplate.getName()); recipe.writeTemplateFile(recTemplate); } + + recipe.registerPost(); } MainRegistry.logger.info("Finished recipe init!"); @@ -89,7 +98,9 @@ public abstract class SerializableRecipe { public abstract void registerDefaults(); /** Deletes all existing recipes, currenly unused */ public abstract void deleteRecipes(); - + /** A routine called after registering all recipes, whether it's a template or not. Good for IMC functionality. */ + public void registerPost() { } + /** Returns a string to be printed as info at the top of the JSON file */ public String getComment() { return null; } @@ -159,7 +170,7 @@ public abstract class SerializableRecipe { int stacksize = array.size() > 2 ? array.get(2).getAsInt() : 1; if("item".equals(type)) { Item item = (Item) Item.itemRegistry.getObject(array.get(1).getAsString()); - int meta = array.size() > 3 ? array.get(3).getAsInt() : 2; + int meta = array.size() > 3 ? array.get(3).getAsInt() : 0; return new ComparableStack(item, stacksize, meta); } if("dict".equals(type)) { diff --git a/src/main/java/com/hbm/items/IHeldSoundProvider.java b/src/main/java/com/hbm/items/IHeldSoundProvider.java new file mode 100644 index 000000000..3549e6df4 --- /dev/null +++ b/src/main/java/com/hbm/items/IHeldSoundProvider.java @@ -0,0 +1,5 @@ +package com.hbm.items; + +public interface IHeldSoundProvider { + +} diff --git a/src/main/java/com/hbm/items/ISyncButtons.java b/src/main/java/com/hbm/items/ISyncButtons.java new file mode 100644 index 000000000..e06e3e78c --- /dev/null +++ b/src/main/java/com/hbm/items/ISyncButtons.java @@ -0,0 +1,11 @@ +package com.hbm.items; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.MouseEvent; + +public interface ISyncButtons { + + public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate); + public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate); +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 644d22bb5..857530a39 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -147,6 +147,7 @@ public class ModItems { public static Item ingot_c4; public static Item ingot_boron; public static Item ingot_graphite; + public static Item ingot_firebrick; public static Item ingot_smore; public static Item ingot_gh336; @@ -495,6 +496,7 @@ public class ModItems { public static Item powder_magic; public static Item powder_cloud; public static Item powder_balefire; + public static Item powder_sawdust; public static Item fragment_neodymium; public static Item fragment_cobalt; @@ -636,8 +638,9 @@ public class ModItems { public static Item pellet_coal; public static Item ring_starmetal; public static Item flywheel_beryllium; - + public static Item gear_large; + public static Item sawblade; public static Item toothpicks; public static Item ducttape; @@ -739,6 +742,10 @@ public class ModItems { public static Item blades_schrabidium; public static Item blades_desh; + public static Item mold_base; + public static Item mold; + public static Item scraps; + public static Item part_lithium; public static Item part_beryllium; public static Item part_carbon; @@ -870,25 +877,25 @@ public class ModItems { public static Item canister_empty; public static Item canister_full; - public static Item canister_smear; - public static Item canister_canola; - public static Item canister_oil; - public static Item canister_fuel; - public static Item canister_kerosene; - public static Item canister_reoil; - public static Item canister_petroil; + @Deprecated public static Item canister_smear; + @Deprecated public static Item canister_canola; + @Deprecated public static Item canister_oil; + @Deprecated public static Item canister_fuel; + @Deprecated public static Item canister_kerosene; + @Deprecated public static Item canister_reoil; + @Deprecated public static Item canister_petroil; public static Item canister_napalm; - public static Item canister_gasoline; - public static Item canister_NITAN; - public static Item canister_fracksol; + @Deprecated public static Item canister_gasoline; + @Deprecated public static Item canister_NITAN; + @Deprecated public static Item canister_fracksol; - public static Item canister_heavyoil; - public static Item canister_bitumen; - public static Item canister_heatingoil; - public static Item canister_naphtha; - public static Item canister_lightoil; - public static Item canister_biofuel; - public static Item canister_ethanol; + @Deprecated public static Item canister_heavyoil; + @Deprecated public static Item canister_bitumen; + @Deprecated public static Item canister_heatingoil; + @Deprecated public static Item canister_naphtha; + @Deprecated public static Item canister_lightoil; + @Deprecated public static Item canister_biofuel; + @Deprecated public static Item canister_ethanol; public static Item gas_empty; public static Item gas_full; @@ -924,6 +931,7 @@ public class ModItems { public static Item radaway_flush; public static Item radx; public static Item siox; + public static Item pill_herbal; public static Item pirfenidone; public static Item xanax; public static Item fmn; @@ -1204,6 +1212,7 @@ public class ModItems { public static Item ballistite; public static Item ball_dynamite; public static Item ball_tnt; + public static Item ball_fireclay; public static Item pellet_cluster; public static Item powder_fire; @@ -1244,6 +1253,7 @@ public class ModItems { public static Item assembly_template; public static Item chemistry_template; public static Item chemistry_icon; + public static Item crucible_template; public static Item fluid_identifier; public static Item fluid_identifier_multi; public static Item fluid_icon; @@ -1577,6 +1587,7 @@ public class ModItems { public static Item ammo_shell_w9; public static Item ammo_dgk; public static Item ammo_arty; + public static Item ammo_himars; public static Item ammo_nuke; public static Item ammo_nuke_low; public static Item ammo_nuke_high; @@ -1659,6 +1670,7 @@ public class ModItems { //public static Item gun_mirv_ammo; public static Item gun_bf; public static Item gun_bf_ammo; + public static Item gun_chemthrower; public static Item gun_mp40; //public static Item gun_mp40_ammo; public static Item gun_thompson; @@ -1917,13 +1929,14 @@ public class ModItems { public static Item screwdriver_desh; public static Item hand_drill; public static Item hand_drill_desh; + public static Item wrench_archineer; public static Item chemistry_set; public static Item chemistry_set_boron; public static Item overfuse; public static Item arc_electrode; public static Item arc_electrode_burnt; public static Item arc_electrode_desh; - public static Item dynosphere_base; + /*public static Item dynosphere_base; public static Item dynosphere_desh; public static Item dynosphere_desh_charged; public static Item dynosphere_schrabidium; @@ -1931,12 +1944,12 @@ public class ModItems { public static Item dynosphere_euphemium; public static Item dynosphere_euphemium_charged; public static Item dynosphere_dineutronium; - public static Item dynosphere_dineutronium_charged; + public static Item dynosphere_dineutronium_charged;*/ public static Item tank_waste; - public static Item factory_core_titanium; - public static Item factory_core_advanced; + /*public static Item factory_core_titanium; + public static Item factory_core_advanced;*/ public static Item upgrade_template; public static Item upgrade_speed_1; @@ -2304,6 +2317,10 @@ public class ModItems { public static Item wand_s; public static Item wand_d; + public static Item structure_single; + public static Item structure_solid; + public static Item structure_pattern; + public static Item rod_of_discord; public static Item cape_test; @@ -2391,6 +2408,7 @@ public class ModItems { public static Item crate_caller; public static Item bomb_caller; public static Item meteor_remote; + public static Item anchor_remote; public static Item remote; //public static Item turret_control; public static Item turret_chip; @@ -2413,13 +2431,7 @@ public class ModItems { public static Item mech_key; - public static Item turret_light_ammo; - public static Item turret_heavy_ammo; - public static Item turret_rocket_ammo; - public static Item turret_flamer_ammo; - public static Item turret_tau_ammo; public static Item turret_spitfire_ammo; - public static Item turret_cwis_ammo; public static Item turret_cheapo_ammo; public static Item bucket_mud; @@ -2630,6 +2642,7 @@ public class ModItems { ingot_cobalt = new Item().setUnlocalizedName("ingot_cobalt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_cobalt"); ingot_boron = new Item().setUnlocalizedName("ingot_boron").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_boron"); ingot_graphite = new Item().setUnlocalizedName("ingot_graphite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_graphite"); + ingot_firebrick = new Item().setUnlocalizedName("ingot_firebrick").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_firebrick"); ingot_smore = new ItemFood(10, 20F, false).setUnlocalizedName("ingot_smore").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_smore"); sulfur = new Item().setUnlocalizedName("sulfur").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":sulfur"); @@ -3007,6 +3020,7 @@ public class ModItems { powder_magic = new Item().setUnlocalizedName("powder_magic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_magic"); powder_cloud = new Item().setUnlocalizedName("powder_cloud").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_cloud"); powder_balefire = new Item().setUnlocalizedName("powder_balefire").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_balefire"); + powder_sawdust = new Item().setUnlocalizedName("powder_sawdust").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_sawdust"); powder_coltan_ore = new Item().setUnlocalizedName("powder_coltan_ore").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_coltan_ore"); powder_coltan = new Item().setUnlocalizedName("powder_coltan").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_coltan"); powder_tektite = new Item().setUnlocalizedName("powder_tektite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_tektite"); @@ -3064,7 +3078,8 @@ public class ModItems { deuterium_filter = new Item().setUnlocalizedName("deuterium_filter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":deuterium_filter"); parts_legendary = new ItemEnumMulti(EnumLegendaryType.class, false, true).setUnlocalizedName("parts_legendary").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":parts_legendary"); - gear_large = new Item().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); + gear_large = new ItemGear().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); + sawblade = new Item().setUnlocalizedName("sawblade").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":sawblade"); cap_aluminium = new Item().setUnlocalizedName("cap_aluminium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":cap_aluminium"); hull_small_steel = new Item().setUnlocalizedName("hull_small_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":hull_small_steel"); @@ -3334,6 +3349,10 @@ public class ModItems { blades_schrabidium = new ItemBlades(2000).setUnlocalizedName("blades_schrabidium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":blades_schrabidium"); blades_desh = new ItemBlades(0).setUnlocalizedName("blades_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":blades_desh"); + mold_base = new Item().setUnlocalizedName("mold_base").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":mold_base"); + mold = new ItemMold().setUnlocalizedName("mold").setCreativeTab(MainRegistry.controlTab); + scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":scraps"); + part_lithium = new Item().setUnlocalizedName("part_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_lithium"); part_beryllium = new Item().setUnlocalizedName("part_beryllium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_beryllium"); part_carbon = new Item().setUnlocalizedName("part_carbon").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_carbon"); @@ -3433,6 +3452,7 @@ public class ModItems { med_bag = new ItemSyringe().setUnlocalizedName("med_bag").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":med_bag"); radx = new ItemPill(0).setUnlocalizedName("radx").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":radx"); siox = new ItemPill(0).setUnlocalizedName("siox").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":siox"); + pill_herbal = new ItemPill(0).setUnlocalizedName("pill_herbal").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":pill_herbal"); pirfenidone = new ItemPill(0).setUnlocalizedName("pirfenidone").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":pirfenidone"); xanax = new ItemPill(0).setUnlocalizedName("xanax").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":xanax_2"); fmn = new ItemPill(0).setUnlocalizedName("fmn").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":tablet"); @@ -3581,8 +3601,8 @@ public class ModItems { coin_maskman = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_maskman").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_maskman"); coin_worm = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_worm").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_worm"); coin_ufo = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("coin_ufo").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":coin_ufo"); - coin_siege = new ItemSiegeCoin().setUnlocalizedName("coin_siege").setCreativeTab(MainRegistry.consumableTab); - source = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("source").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":source"); + coin_siege = new ItemSiegeCoin().setUnlocalizedName("coin_siege").setCreativeTab(null); + source = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("source").setCreativeTab(null).setTextureName(RefStrings.MODID + ":source"); recycled_ground = new Item().setUnlocalizedName("recycled_ground").setCreativeTab(null).setTextureName(RefStrings.MODID + ":recycled_ground"); recycled_rock = new Item().setUnlocalizedName("recycled_rock").setCreativeTab(null).setTextureName(RefStrings.MODID + ":recycled_rock"); @@ -3978,6 +3998,7 @@ public class ModItems { ballistite = new Item().setUnlocalizedName("ballistite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ballistite"); ball_dynamite = new Item().setUnlocalizedName("ball_dynamite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_dynamite"); ball_tnt = new Item().setUnlocalizedName("ball_tnt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_tnt"); + ball_fireclay = new Item().setUnlocalizedName("ball_fireclay").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ball_fireclay"); pellet_gas = new ItemCustomLore().setUnlocalizedName("pellet_gas").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellet_gas"); magnetron = new ItemCustomLore().setUnlocalizedName("magnetron").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":magnetron_alt"); pellet_buckshot = new Item().setUnlocalizedName("pellet_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_lead"); @@ -4320,6 +4341,7 @@ public class ModItems { ammo_shell_w9 = new ItemAmmo().setUnlocalizedName("ammo_shell_w9"); ammo_dgk = new ItemAmmo().setUnlocalizedName("ammo_dgk"); ammo_arty = new ItemAmmoArty().setUnlocalizedName("ammo_arty"); + ammo_himars = new ItemAmmoHIMARS().setUnlocalizedName("ammo_himars"); ammo_nuke = new ItemAmmo().setUnlocalizedName("ammo_nuke"); ammo_nuke_low = new ItemAmmo().setUnlocalizedName("ammo_nuke_low"); ammo_nuke_high = new ItemAmmo().setUnlocalizedName("ammo_nuke_high"); @@ -4402,6 +4424,7 @@ public class ModItems { gun_mirv = new ItemGunBase(GunFatmanFactory.getMIRVConfig()).setUnlocalizedName("gun_mirv").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_mirv"); gun_bf_ammo = new Item().setUnlocalizedName("gun_bf_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_bf_ammo"); gun_bf = new ItemGunBase(GunFatmanFactory.getBELConfig()).setUnlocalizedName("gun_bf").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_bf"); + gun_chemthrower = new ItemGunChemthrower().setUnlocalizedName("gun_chemthrower").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_fatman"); //gun_mp40_ammo = new Item().setUnlocalizedName("gun_mp40_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":gun_mp40_ammo"); gun_mp40 = new ItemGunBase(Gun9mmFactory.getMP40Config()).setUnlocalizedName("gun_mp40").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_mp40"); gun_thompson = new ItemGunBase(Gun9mmFactory.getThompsonConfig()).setUnlocalizedName("gun_thompson").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_thompson"); @@ -4665,6 +4688,7 @@ public class ModItems { screwdriver_desh = new ItemTooling(ToolType.SCREWDRIVER, 0).setUnlocalizedName("screwdriver_desh"); hand_drill = new ItemTooling(ToolType.HAND_DRILL, 100).setUnlocalizedName("hand_drill"); hand_drill_desh = new ItemTooling(ToolType.HAND_DRILL, 0).setUnlocalizedName("hand_drill_desh"); + wrench_archineer = new ItemToolingWeapon(ToolType.WRENCH, 1000, 12F).setUnlocalizedName("wrench_archineer").setTextureName(RefStrings.MODID + ":wrench_archineer_hd"); chemistry_set = new ItemCraftingDegradation(100).setUnlocalizedName("chemistry_set"); chemistry_set_boron = new ItemCraftingDegradation(0).setUnlocalizedName("chemistry_set_boron"); overfuse = new ItemCustomLore().setUnlocalizedName("overfuse").setMaxStackSize(1).setFull3D().setTextureName(RefStrings.MODID + ":overfuse"); @@ -4672,19 +4696,6 @@ public class ModItems { arc_electrode_burnt = new Item().setUnlocalizedName("arc_electrode_burnt").setMaxStackSize(1).setFull3D().setTextureName(RefStrings.MODID + ":arc_electrode_burnt"); arc_electrode_desh = new ItemCustomLore().setUnlocalizedName("arc_electrode_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setFull3D().setTextureName(RefStrings.MODID + ":arc_electrode_desh"); - dynosphere_base = new Item().setUnlocalizedName("dynosphere_base").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_base"); - dynosphere_desh = new ItemBattery(1000000L, 10000L, 0).setUnlocalizedName("dynosphere_desh").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_desh"); - dynosphere_desh_charged = new Item().setUnlocalizedName("dynosphere_desh_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_desh_charged"); - dynosphere_schrabidium = new ItemBattery(100000000L, 500000L, 0).setUnlocalizedName("dynosphere_schrabidium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_schrabidium"); - dynosphere_schrabidium_charged = new Item().setUnlocalizedName("dynosphere_schrabidium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_schrabidium_charged"); - dynosphere_euphemium = new ItemBattery(10000000000L, 25000000L, 0).setUnlocalizedName("dynosphere_euphemium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_euphemium"); - dynosphere_euphemium_charged = new Item().setUnlocalizedName("dynosphere_euphemium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_euphemium_charged"); - dynosphere_dineutronium = new ItemBattery(1000000000000L, 1250000000L, 0).setUnlocalizedName("dynosphere_dineutronium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_dineutronium"); - dynosphere_dineutronium_charged = new Item().setUnlocalizedName("dynosphere_dineutronium_charged").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":dynosphere_dineutronium_charged"); - - factory_core_titanium = new ItemBattery(7040000, 1000, 0).setUnlocalizedName("factory_core_titanium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":factory_core_titanium"); - factory_core_advanced = new ItemBattery(4160000, 1000, 0).setUnlocalizedName("factory_core_advanced").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":factory_core_advanced"); - ams_focus_blank = new Item().setUnlocalizedName("ams_focus_blank").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_blank"); ams_focus_limiter = new ItemCustomLore().setUnlocalizedName("ams_focus_limiter").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_limiter"); ams_focus_booster = new ItemCustomLore().setUnlocalizedName("ams_focus_booster").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":ams_focus_booster"); @@ -4735,6 +4746,10 @@ public class ModItems { wand = new ItemWand().setUnlocalizedName("wand_k").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand"); wand_s = new ItemWandS().setUnlocalizedName("wand_s").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_s"); wand_d = new ItemWandD().setUnlocalizedName("wand_d").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":wand_d"); + + structure_single = new ItemStructureSingle().setUnlocalizedName("structure_single").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_single"); + structure_solid = new ItemStructureSolid().setUnlocalizedName("structure_solid").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_solid"); + structure_pattern = new ItemStructurePattern().setUnlocalizedName("structure_pattern").setMaxStackSize(1).setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":structure_pattern"); rod_of_discord = new ItemDiscord().setUnlocalizedName("rod_of_discord").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setFull3D().setTextureName(RefStrings.MODID + ":rod_of_discord"); @@ -4815,6 +4830,7 @@ public class ModItems { crate_caller = new ItemCrateCaller().setUnlocalizedName("crate_caller").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":crate_caller"); bomb_caller = new ItemBombCaller().setUnlocalizedName("bomb_caller").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":bomb_caller"); meteor_remote = new ItemMeteorRemote().setUnlocalizedName("meteor_remote").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":meteor_remote"); + anchor_remote = new ItemAnchorRemote().setUnlocalizedName("anchor_remote").setMaxStackSize(1).setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":anchor_remote"); spawn_chopper = new ItemChopper().setUnlocalizedName("chopper").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":chopper"); spawn_worm = new ItemChopper().setUnlocalizedName("spawn_worm").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":spawn_worm"); spawn_ufo = new ItemChopper().setUnlocalizedName("spawn_ufo").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":spawn_ufo"); @@ -4846,13 +4862,7 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); - turret_light_ammo = new ItemTurretAmmo(ModBlocks.turret_light, 100).setUnlocalizedName("turret_light_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_light_ammo"); - turret_heavy_ammo = new ItemTurretAmmo(ModBlocks.turret_heavy, 25).setUnlocalizedName("turret_heavy_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_heavy_ammo"); - turret_rocket_ammo = new ItemTurretAmmo(ModBlocks.turret_rocket, 8).setUnlocalizedName("turret_rocket_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_rocket_ammo"); - turret_flamer_ammo = new ItemTurretAmmo(ModBlocks.turret_flamer, 200).setUnlocalizedName("turret_flamer_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_flamer_ammo"); - turret_tau_ammo = new ItemTurretAmmo(ModBlocks.turret_tau, 100).setUnlocalizedName("turret_tau_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_tau_ammo"); turret_spitfire_ammo = new ItemTurretAmmo(ModBlocks.turret_spitfire, 2).setUnlocalizedName("turret_spitfire_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":turret_spitfire_ammo"); - turret_cwis_ammo = new ItemTurretAmmo(ModBlocks.turret_cwis, 250).setUnlocalizedName("turret_cwis_ammo").setCreativeTab(null).setTextureName(RefStrings.MODID + ":turret_cwis_ammo"); turret_cheapo_ammo = new ItemTurretAmmo(ModBlocks.turret_cheapo, 100).setUnlocalizedName("turret_cheapo_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":turret_cheapo_ammo"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); @@ -4862,6 +4872,7 @@ public class ModItems { assembly_template = new ItemAssemblyTemplate().setUnlocalizedName("assembly_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":assembly_template"); chemistry_template = new ItemChemistryTemplate().setUnlocalizedName("chemistry_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":chemistry_template"); chemistry_icon = new ItemChemistryIcon().setUnlocalizedName("chemistry_icon").setMaxStackSize(1).setCreativeTab(null); + crucible_template = new ItemCrucibleTemplate().setUnlocalizedName("crucible_template").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":crucible_template"); fluid_identifier = new ItemFluidIdentifier().setUnlocalizedName("fluid_identifier").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier"); fluid_identifier_multi = new ItemFluidIDMulti().setUnlocalizedName("fluid_identifier_multi").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":fluid_identifier_multi"); fluid_icon = new ItemFluidIcon().setUnlocalizedName("fluid_icon").setCreativeTab(null).setTextureName(RefStrings.MODID + ":fluid_icon"); @@ -5004,7 +5015,7 @@ public class ModItems { ArmorMaterial aMatDesh = EnumHelper.addArmorMaterial("HBM_DESH", 150, new int[] { 3, 8, 6, 3 }, 0); aMatDesh.customCraftingMaterial = ModItems.ingot_desh; - steamsuit_helmet = new ArmorDesh(aMatDesh, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).setThreshold(5F).setMod(0.8F) + steamsuit_helmet = new ArmorDesh(aMatDesh, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).setThreshold(5F).setMod(0.8F) .setFireproof(true) .setHasHardLanding(true) .addEffect(new PotionEffect(Potion.digSpeed.id, 20, 4)) @@ -5013,22 +5024,22 @@ public class ModItems { .addResistance("fall", 0) .hides(EnumPlayerPart.HAT) .setUnlocalizedName("steamsuit_helmet").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_helmet"); - steamsuit_plate = new ArmorDesh(aMatDesh, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_plate"); - steamsuit_legs = new ArmorDesh(aMatDesh, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_legs"); - steamsuit_boots = new ArmorDesh(aMatDesh, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 360000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_boots"); + steamsuit_plate = new ArmorDesh(aMatDesh, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_plate"); + steamsuit_legs = new ArmorDesh(aMatDesh, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_legs"); + steamsuit_boots = new ArmorDesh(aMatDesh, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.STEAM, 64_000, 500, 50, 1).cloneStats((ArmorFSB) steamsuit_helmet).setUnlocalizedName("steamsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":steamsuit_boots"); ArmorMaterial aMatDiesel = EnumHelper.addArmorMaterial("HBM_BNUUY", 150, new int[] { 3, 8, 6, 3 }, 0); aMatDiesel.customCraftingMaterial = ModItems.plate_copper; - dieselsuit_helmet = new ArmorDiesel(aMatDiesel, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).setThreshold(2F).setMod(0.7F) + dieselsuit_helmet = new ArmorDiesel(aMatDiesel, 2, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).setThreshold(2F).setMod(0.7F) .addEffect(new PotionEffect(Potion.moveSpeed.id, 20, 2)) .addEffect(new PotionEffect(Potion.jump.id, 20, 2)) .enableThermalSight(true) .enableVATS(true) .addResistance("fall", 0) .setUnlocalizedName("dieselsuit_helmet").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_helmet"); - dieselsuit_plate = new ArmorDiesel(aMatDiesel, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_plate"); - dieselsuit_legs = new ArmorDiesel(aMatDiesel, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_legs"); - dieselsuit_boots = new ArmorDiesel(aMatDiesel, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 360000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_boots"); + dieselsuit_plate = new ArmorDiesel(aMatDiesel, 2, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_plate").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_plate"); + dieselsuit_legs = new ArmorDiesel(aMatDiesel, 2, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_legs"); + dieselsuit_boots = new ArmorDiesel(aMatDiesel, 2, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", Fluids.DIESEL, 64_000, 500, 50, 1).cloneStats((ArmorFSB) dieselsuit_helmet).setUnlocalizedName("dieselsuit_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":dieselsuit_boots"); ArmorMaterial aMatAJR = EnumHelper.addArmorMaterial("HBM_T45AJR", 150, new int[] { 3, 8, 6, 3 }, 100); aMatAJR.customCraftingMaterial = ModItems.plate_armor_ajr; @@ -5178,7 +5189,8 @@ public class ModItems { jackt = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt").setTextureName(RefStrings.MODID + ":jackt"); jackt2 = new ModArmor(MainRegistry.aMatSteel, 7, 1).setUnlocalizedName("jackt2").setTextureName(RefStrings.MODID + ":jackt2"); - chainsaw = new ItemToolAbility(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE) + chainsaw = new ItemChainsaw(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE, 5000, 1, 250, + Fluids.DIESEL, Fluids.DIESEL_CRACK, Fluids.KEROSENE, Fluids.BIOFUEL, Fluids.GASOLINE, Fluids.GASOLINE_LEADED, Fluids.PETROIL, Fluids.PETROIL_LEADED, Fluids.COALGAS, Fluids.COALGAS_LEADED) .addBreakAbility(new ToolAbility.SilkAbility()) .addBreakAbility(new ToolAbility.RecursionAbility(5)) .addHitAbility(new WeaponAbility.ChainsawAbility(4)) @@ -5797,6 +5809,7 @@ public class ModItems { GameRegistry.registerItem(ingot_cobalt, ingot_cobalt.getUnlocalizedName()); GameRegistry.registerItem(ingot_boron, ingot_boron.getUnlocalizedName()); GameRegistry.registerItem(ingot_graphite, ingot_graphite.getUnlocalizedName()); + GameRegistry.registerItem(ingot_firebrick, ingot_firebrick.getUnlocalizedName()); GameRegistry.registerItem(ingot_dura_steel, ingot_dura_steel.getUnlocalizedName()); GameRegistry.registerItem(ingot_polymer, ingot_polymer.getUnlocalizedName()); GameRegistry.registerItem(ingot_bakelite, ingot_bakelite.getUnlocalizedName()); @@ -6011,6 +6024,7 @@ public class ModItems { GameRegistry.registerItem(powder_asbestos, powder_asbestos.getUnlocalizedName()); GameRegistry.registerItem(powder_magic, powder_magic.getUnlocalizedName()); GameRegistry.registerItem(powder_cloud, powder_cloud.getUnlocalizedName()); + GameRegistry.registerItem(powder_sawdust, powder_sawdust.getUnlocalizedName()); GameRegistry.registerItem(powder_balefire, powder_balefire.getUnlocalizedName()); GameRegistry.registerItem(powder_semtex_mix, powder_semtex_mix.getUnlocalizedName()); GameRegistry.registerItem(powder_desh_mix, powder_desh_mix.getUnlocalizedName()); @@ -6037,6 +6051,7 @@ public class ModItems { GameRegistry.registerItem(ballistite, ballistite.getUnlocalizedName()); GameRegistry.registerItem(ball_dynamite, ball_dynamite.getUnlocalizedName()); GameRegistry.registerItem(ball_tnt, ball_tnt.getUnlocalizedName()); + GameRegistry.registerItem(ball_fireclay, ball_fireclay.getUnlocalizedName()); //Crystals GameRegistry.registerItem(crystal_coal, crystal_coal.getUnlocalizedName()); @@ -6236,6 +6251,7 @@ public class ModItems { GameRegistry.registerItem(part_generic, part_generic.getUnlocalizedName()); GameRegistry.registerItem(parts_legendary, parts_legendary.getUnlocalizedName()); GameRegistry.registerItem(gear_large, gear_large.getUnlocalizedName()); + GameRegistry.registerItem(sawblade, sawblade.getUnlocalizedName()); //Plant Products GameRegistry.registerItem(plant_item, plant_item.getUnlocalizedName()); @@ -6581,19 +6597,6 @@ public class ModItems { GameRegistry.registerItem(fusion_core, fusion_core.getUnlocalizedName()); GameRegistry.registerItem(energy_core, energy_core.getUnlocalizedName()); GameRegistry.registerItem(fusion_core_infinite, fusion_core_infinite.getUnlocalizedName()); - GameRegistry.registerItem(factory_core_titanium, factory_core_titanium.getUnlocalizedName()); - GameRegistry.registerItem(factory_core_advanced, factory_core_advanced.getUnlocalizedName()); - - //Dynospheres - GameRegistry.registerItem(dynosphere_base, dynosphere_base.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_desh, dynosphere_desh.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_desh_charged, dynosphere_desh_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_schrabidium, dynosphere_schrabidium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_schrabidium_charged, dynosphere_schrabidium_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_euphemium, dynosphere_euphemium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_euphemium_charged, dynosphere_euphemium_charged.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_dineutronium, dynosphere_dineutronium.getUnlocalizedName()); - GameRegistry.registerItem(dynosphere_dineutronium_charged, dynosphere_dineutronium_charged.getUnlocalizedName()); //Folders GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); @@ -6640,6 +6643,11 @@ public class ModItems { GameRegistry.registerItem(stamp_9, stamp_9.getUnlocalizedName()); GameRegistry.registerItem(stamp_50, stamp_50.getUnlocalizedName()); + //Molds + GameRegistry.registerItem(mold_base, mold_base.getUnlocalizedName()); + GameRegistry.registerItem(mold, mold.getUnlocalizedName()); + GameRegistry.registerItem(scraps, scraps.getUnlocalizedName()); + //Machine Upgrades GameRegistry.registerItem(upgrade_template, upgrade_template.getUnlocalizedName()); GameRegistry.registerItem(upgrade_speed_1, upgrade_speed_1.getUnlocalizedName()); @@ -6682,6 +6690,7 @@ public class ModItems { GameRegistry.registerItem(assembly_template, assembly_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_template, chemistry_template.getUnlocalizedName()); GameRegistry.registerItem(chemistry_icon, chemistry_icon.getUnlocalizedName()); + GameRegistry.registerItem(crucible_template, crucible_template.getUnlocalizedName()); //Machine Items GameRegistry.registerItem(fuse, fuse.getUnlocalizedName()); @@ -7211,6 +7220,7 @@ public class ModItems { GameRegistry.registerItem(gun_proto, gun_proto.getUnlocalizedName()); GameRegistry.registerItem(gun_mirv, gun_mirv.getUnlocalizedName()); GameRegistry.registerItem(gun_bf, gun_bf.getUnlocalizedName()); + GameRegistry.registerItem(gun_chemthrower, gun_chemthrower.getUnlocalizedName()); GameRegistry.registerItem(gun_mp40, gun_mp40.getUnlocalizedName()); GameRegistry.registerItem(gun_thompson, gun_thompson.getUnlocalizedName()); GameRegistry.registerItem(gun_uzi, gun_uzi.getUnlocalizedName()); @@ -7433,6 +7443,7 @@ public class ModItems { GameRegistry.registerItem(ammo_shell_w9, ammo_shell_w9.getUnlocalizedName()); GameRegistry.registerItem(ammo_dgk, ammo_dgk.getUnlocalizedName()); GameRegistry.registerItem(ammo_arty, ammo_arty.getUnlocalizedName()); + GameRegistry.registerItem(ammo_himars, ammo_himars.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke, ammo_nuke.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_low, ammo_nuke_low.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_high, ammo_nuke_high.getUnlocalizedName()); @@ -7450,13 +7461,7 @@ public class ModItems { GameRegistry.registerItem(ammo_folly_du, ammo_folly_du.getUnlocalizedName()); //Turret Ammo - GameRegistry.registerItem(turret_light_ammo, turret_light_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_heavy_ammo, turret_heavy_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_rocket_ammo, turret_rocket_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_flamer_ammo, turret_flamer_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_tau_ammo, turret_tau_ammo.getUnlocalizedName()); GameRegistry.registerItem(turret_spitfire_ammo, turret_spitfire_ammo.getUnlocalizedName()); - GameRegistry.registerItem(turret_cwis_ammo, turret_cwis_ammo.getUnlocalizedName()); GameRegistry.registerItem(turret_cheapo_ammo, turret_cheapo_ammo.getUnlocalizedName()); //-C-l-i-p-s- Magazines @@ -7625,6 +7630,7 @@ public class ModItems { GameRegistry.registerItem(balefire_and_steel, balefire_and_steel.getUnlocalizedName()); GameRegistry.registerItem(crowbar, crowbar.getUnlocalizedName()); GameRegistry.registerItem(wrench, wrench.getUnlocalizedName()); + GameRegistry.registerItem(wrench_archineer, wrench_archineer.getUnlocalizedName()); GameRegistry.registerItem(wrench_flipped, wrench_flipped.getUnlocalizedName()); GameRegistry.registerItem(memespoon, memespoon.getUnlocalizedName()); GameRegistry.registerItem(saw, saw.getUnlocalizedName()); @@ -7685,6 +7691,7 @@ public class ModItems { GameRegistry.registerItem(radaway_flush, radaway_flush.getUnlocalizedName()); GameRegistry.registerItem(radx, radx.getUnlocalizedName()); GameRegistry.registerItem(siox, siox.getUnlocalizedName()); + GameRegistry.registerItem(pill_herbal, pill_herbal.getUnlocalizedName()); GameRegistry.registerItem(pirfenidone, pirfenidone.getUnlocalizedName()); GameRegistry.registerItem(pill_iodine, pill_iodine.getUnlocalizedName()); GameRegistry.registerItem(xanax, xanax.getUnlocalizedName()); @@ -8015,6 +8022,7 @@ public class ModItems { GameRegistry.registerItem(crate_caller, crate_caller.getUnlocalizedName()); GameRegistry.registerItem(bomb_caller, bomb_caller.getUnlocalizedName()); GameRegistry.registerItem(meteor_remote, meteor_remote.getUnlocalizedName()); + GameRegistry.registerItem(anchor_remote, anchor_remote.getUnlocalizedName()); GameRegistry.registerItem(defuser, defuser.getUnlocalizedName()); GameRegistry.registerItem(reacher, reacher.getUnlocalizedName()); GameRegistry.registerItem(bismuth_tool, bismuth_tool.getUnlocalizedName()); @@ -8107,6 +8115,9 @@ public class ModItems { GameRegistry.registerItem(wand, wand.getUnlocalizedName()); GameRegistry.registerItem(wand_s, wand_s.getUnlocalizedName()); GameRegistry.registerItem(wand_d, wand_d.getUnlocalizedName()); + GameRegistry.registerItem(structure_single, structure_single.getUnlocalizedName()); + GameRegistry.registerItem(structure_solid, structure_solid.getUnlocalizedName()); + GameRegistry.registerItem(structure_pattern, structure_pattern.getUnlocalizedName()); GameRegistry.registerItem(rod_of_discord, rod_of_discord.getUnlocalizedName()); //GameRegistry.registerItem(analyzer, analyzer.getUnlocalizedName()); //GameRegistry.registerItem(remote, remote.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorDiesel.java b/src/main/java/com/hbm/items/armor/ArmorDiesel.java index d3cb53dc4..fa133eaf6 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDiesel.java +++ b/src/main/java/com/hbm/items/armor/ArmorDiesel.java @@ -4,6 +4,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.hbm.handler.ArmorModHandler; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; @@ -63,4 +64,9 @@ public class ArmorDiesel extends ArmorFSBFueled { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == Fluids.DIESEL || type == Fluids.DIESEL_CRACK; + } } diff --git a/src/main/java/com/hbm/items/armor/ArmorFSB.java b/src/main/java/com/hbm/items/armor/ArmorFSB.java index 5da09df69..73f20974c 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSB.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSB.java @@ -433,7 +433,7 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { if(!chestplate.effects.isEmpty()) { for(PotionEffect i : chestplate.effects) { - player.addPotionEffect(new PotionEffect(i.getPotionID(), i.getDuration(), i.getAmplifier(), i.getIsAmbient())); + player.addPotionEffect(new PotionEffect(i.getPotionID(), i.getDuration(), i.getAmplifier(), true)); } } diff --git a/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java b/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java index 7c4a3d885..5f444165e 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSBFueled.java @@ -2,11 +2,11 @@ package com.hbm.items.armor; import java.util.List; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.FluidType; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +14,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { +public class ArmorFSBFueled extends ArmorFSB implements IFillableItem { FluidType fuelType; public int maxFuel = 1; @@ -31,12 +31,6 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { this.maxFuel = maxFuel; } - @Override - public FluidType getType(ItemStack stack) { - return this.fuelType; - } - - @Override public int getFill(ItemStack stack) { if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); @@ -47,7 +41,6 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { return stack.stackTagCompound.getInteger("fuel"); } - @Override public void setFill(ItemStack stack, int fill) { if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); @@ -56,17 +49,14 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { stack.stackTagCompound.setInteger("fuel", fill); } - @Override public int getMaxFill(ItemStack stack) { return this.maxFuel; } - @Override public int getLoadSpeed(ItemStack stack) { return this.fillRate; } - @Override public int getUnloadSpeed(ItemStack stack) { return 0; } @@ -86,7 +76,7 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { super.onArmorTick(world, player, stack); - if(this.drain > 0 && ArmorFSB.hasFSBArmor(player) && !player.capabilities.isCreativeMode) { + if(this.drain > 0 && ArmorFSB.hasFSBArmor(player) && !player.capabilities.isCreativeMode && world.getTotalWorldTime() % 10 == 0) { this.setFill(stack, Math.max(this.getFill(stack) - this.drain, 0)); } } @@ -106,4 +96,32 @@ public class ArmorFSBFueled extends ArmorFSB implements IPartiallyFillable { public double getDurabilityForDisplay(ItemStack stack) { return 1 - (double) getFill(stack) / (double) getMaxFill(stack); } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == this.fuelType; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int toFill = Math.min(amount, this.fillRate); + toFill = Math.min(toFill, this.maxFuel - this.getFill(stack)); + this.setFill(stack, this.getFill(stack) + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + return 0; + } } diff --git a/src/main/java/com/hbm/items/armor/JetpackBase.java b/src/main/java/com/hbm/items/armor/JetpackBase.java index c701fecc5..c036d3ad6 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBase.java +++ b/src/main/java/com/hbm/items/armor/JetpackBase.java @@ -3,12 +3,12 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.FluidType; import com.hbm.render.model.ModelJetPack; import com.hbm.util.ArmorUtil; import com.hbm.util.I18nUtil; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; @@ -24,7 +24,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderPlayerEvent; -public abstract class JetpackBase extends ItemArmorMod implements IPartiallyFillable { +public abstract class JetpackBase extends ItemArmorMod implements IFillableItem { private ModelJetPack model; public FluidType fuel; @@ -138,33 +138,43 @@ public abstract class JetpackBase extends ItemArmorMod implements IPartiallyFill } - @Override - public FluidType getType(ItemStack stack) { - return fuel; - } - - @Override - public int getFill(ItemStack stack) { - return this.getFuel(stack); - } - - @Override - public void setFill(ItemStack stack, int fill) { - this.setFuel(stack, fill); - } - - @Override public int getMaxFill(ItemStack stack) { return this.maxFuel; } - @Override public int getLoadSpeed(ItemStack stack) { return 10; } @Override - public int getUnloadSpeed(ItemStack stack) { + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == this.fuel; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int fill = this.getFuel(stack); + int req = maxFuel - fill; + + int toFill = Math.min(amount, req); + //toFill = Math.min(toFill, getLoadSpeed(stack)); + + this.setFuel(stack, fill + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; } } diff --git a/src/main/java/com/hbm/items/block/ItemBlockBase.java b/src/main/java/com/hbm/items/block/ItemBlockBase.java index a38a2199d..04823443b 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockBase.java +++ b/src/main/java/com/hbm/items/block/ItemBlockBase.java @@ -4,7 +4,9 @@ import java.util.List; import com.hbm.blocks.BlockEnumMulti; import com.hbm.blocks.IBlockMulti; +import com.hbm.blocks.IPersistentInfoProvider; import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; @@ -14,6 +16,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; public class ItemBlockBase extends ItemBlock { @@ -48,10 +51,15 @@ public class ItemBlockBase extends ItemBlock { } @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { if(field_150939_a instanceof ITooltipProvider) { - ((ITooltipProvider) field_150939_a).addInformation(itemstack, player, list, bool); + ((ITooltipProvider) field_150939_a).addInformation(stack, player, list, bool); + } + + if(field_150939_a instanceof IPersistentInfoProvider && stack.hasTagCompound() && stack.getTagCompound().hasKey(IPersistentNBT.NBT_PERSISTENT_KEY)) { + NBTTagCompound data = stack.getTagCompound().getCompoundTag(IPersistentNBT.NBT_PERSISTENT_KEY); + ((IPersistentInfoProvider) field_150939_a).addInformation(stack, data, player, list, bool); } } diff --git a/src/main/java/com/hbm/items/block/ItemBlockLore.java b/src/main/java/com/hbm/items/block/ItemBlockLore.java index c83b5293b..1d7fb0c1e 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockLore.java +++ b/src/main/java/com/hbm/items/block/ItemBlockLore.java @@ -12,7 +12,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -public class ItemBlockLore extends ItemBlock { +public class ItemBlockLore extends ItemBlockBase { public ItemBlockLore(Block p_i45328_1_) { super(p_i45328_1_); @@ -20,6 +20,7 @@ public class ItemBlockLore extends ItemBlock { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + super.addInformation(itemstack, player, list, bool); if(this.field_150939_a instanceof RedBarrel) { list.add("Static fluid barrel"); @@ -96,13 +97,6 @@ public class ItemBlockLore extends ItemBlock { list.add(""); list.add("i added an item for a joke that isn't even here, what am i, stupid? can't even tell the difference between gravel and a gavel, how did i not forget how to breathe yet?"); } - - if(this.field_150939_a == ModBlocks.turret_cwis) { - list.add("Hmmm today I will use an anti-missile turret agains mobs"); - list.add(""); - list.add("Why does it not work???"); - list.add("bob pls fix"); - } } @Override diff --git a/src/main/java/com/hbm/items/block/ItemModSlab.java b/src/main/java/com/hbm/items/block/ItemModSlab.java new file mode 100644 index 000000000..a562c28f2 --- /dev/null +++ b/src/main/java/com/hbm/items/block/ItemModSlab.java @@ -0,0 +1,28 @@ +package com.hbm.items.block; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockSlab; +import net.minecraft.item.ItemSlab; + +public class ItemModSlab extends ItemSlab { + + public ItemModSlab(Block block) { + super(block, shittyFuckingHackSingle(block), shittyFuckingHackDouble(block), shittyFuckingHackDouble(block) == block); + } + + public static BlockSlab shittyFuckingHackSingle(Block b) { + if(b == ModBlocks.concrete_slab || b == ModBlocks.concrete_double_slab) return (BlockSlab) ModBlocks.concrete_slab; + if(b == ModBlocks.concrete_brick_slab || b == ModBlocks.concrete_brick_double_slab) return (BlockSlab) ModBlocks.concrete_brick_slab; + if(b == ModBlocks.brick_slab || b == ModBlocks.brick_double_slab) return (BlockSlab) ModBlocks.brick_slab; + return null; + } + + public static BlockSlab shittyFuckingHackDouble(Block b) { + if(b == ModBlocks.concrete_slab || b == ModBlocks.concrete_double_slab) return (BlockSlab) ModBlocks.concrete_double_slab; + if(b == ModBlocks.concrete_brick_slab || b == ModBlocks.concrete_brick_double_slab) return (BlockSlab) ModBlocks.concrete_brick_double_slab; + if(b == ModBlocks.brick_slab || b == ModBlocks.brick_double_slab) return (BlockSlab) ModBlocks.brick_double_slab; + return null; + } +} diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index e66f898c0..661661140 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -45,7 +45,7 @@ public class ItemLemon extends ItemFood { if(this == ModItems.med_ipecac) { list.add("Bitter juice that will cause your stomach"); - list.add("to forcefully eject it's contents."); + list.add("to forcefully eject its contents."); } if(this == ModItems.med_ptsd) { diff --git a/src/main/java/com/hbm/items/food/ItemPill.java b/src/main/java/com/hbm/items/food/ItemPill.java index 5ddbf2feb..f531ddb55 100644 --- a/src/main/java/com/hbm/items/food/ItemPill.java +++ b/src/main/java/com/hbm/items/food/ItemPill.java @@ -1,5 +1,6 @@ package com.hbm.items.food; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -56,6 +57,23 @@ public class ItemPill extends ItemFood { HbmLivingProps.setAsbestos(player, 0); HbmLivingProps.setBlackLung(player, Math.min(HbmLivingProps.getBlackLung(player), HbmLivingProps.maxBlacklung / 5)); } + + if(this == ModItems.pill_herbal) { + float fibrosis = HbmLivingProps.getFibrosis(player); + HbmLivingProps.setFibrosis(player, (int) Math.min(fibrosis, 37800)); + HbmLivingProps.setAsbestos(player, 0); + HbmLivingProps.setBlackLung(player, Math.min(HbmLivingProps.getBlackLung(player), HbmLivingProps.maxBlacklung / 5)); + HbmLivingProps.incrementRadiation(player, -100F); + + player.addPotionEffect(new PotionEffect(Potion.confusion.id, 10 * 20, 0)); + player.addPotionEffect(new PotionEffect(Potion.weakness.id, 10 * 60 * 20, 2)); + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 10 * 60 * 20, 2)); + player.addPotionEffect(new PotionEffect(Potion.poison.id, 5 * 20, 2)); + + PotionEffect eff = new PotionEffect(HbmPotion.potionsickness.id, 10 * 60 * 20); + eff.setCurativeItems(new ArrayList()); + player.addPotionEffect(eff); + } if(this == ModItems.xanax) { float digamma = HbmLivingProps.getDigamma(player); @@ -103,6 +121,10 @@ public class ItemPill extends ItemFood { if(this == ModItems.siox) { list.add("Reverses mesothelioma with the power of Asbestos!"); } + if(this == ModItems.pill_herbal) { + list.add("Effective treatment against lung disease and mild radiation poisoning"); + list.add("Comes with side effects"); + } if(this == ModItems.xanax) { list.add("Removes 500mDRX"); } diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index 427ad2767..4f0fda9a7 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -17,9 +17,9 @@ import net.minecraft.nbt.NBTTagCompound; public class ItemBattery extends Item implements IBatteryItem { - private long maxCharge; - private long chargeRate; - private long dischargeRate; + protected long maxCharge; + protected long chargeRate; + protected long dischargeRate; public ItemBattery(long dura, long chargeRate, long dischargeRate) { this.maxCharge = dura; @@ -33,7 +33,7 @@ public class ItemBattery extends Item implements IBatteryItem { if(itemstack.hasTagCompound()) charge = getCharge(itemstack); - if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.factory_core_titanium && itemstack.getItem() != ModItems.factory_core_advanced && itemstack.getItem() != ModItems.energy_core && itemstack.getItem() != ModItems.dynosphere_desh && itemstack.getItem() != ModItems.dynosphere_schrabidium && itemstack.getItem() != ModItems.dynosphere_euphemium && itemstack.getItem() != ModItems.dynosphere_dineutronium) { + if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); } else { String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); @@ -51,7 +51,7 @@ public class ItemBattery extends Item implements IBatteryItem { return EnumRarity.rare; } - if(this == ModItems.fusion_core || this == ModItems.factory_core_titanium || this == ModItems.factory_core_advanced || this == ModItems.energy_core || this == ModItems.dynosphere_desh || this == ModItems.dynosphere_schrabidium || this == ModItems.dynosphere_euphemium || this == ModItems.dynosphere_dineutronium) { + if(this == ModItems.fusion_core || this == ModItems.energy_core) { return EnumRarity.uncommon; } diff --git a/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java new file mode 100644 index 000000000..4d062b85b --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemCrucibleTemplate.java @@ -0,0 +1,54 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.EnumChatFormatting; + +public class ItemCrucibleTemplate extends Item { + + public ItemCrucibleTemplate() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) { + list.add(new ItemStack(item, 1, CrucibleRecipes.recipes.get(i).getId())); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + CrucibleRecipe recipe = CrucibleRecipes.indexMapping.get(stack.getItemDamage()); + + if(recipe == null) { + return; + } + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); + for(MaterialStack out : recipe.output) { + list.add(out.material.names[0] + ": " + Mats.formatAmount(out.amount)); + } + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_in_p")); + + for(MaterialStack in : recipe.input) { + list.add(in.material.names[0] + ": " + Mats.formatAmount(in.amount)); + } + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemGear.java b/src/main/java/com/hbm/items/machine/ItemGear.java new file mode 100644 index 000000000..63c32b7ed --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemGear.java @@ -0,0 +1,31 @@ +package com.hbm.items.machine; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemGear extends Item { + + public ItemGear() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for(int i = 0; i < 2; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return this.getUnlocalizedName() + (stack.getItemDamage() == 1 ? "_steel" : ""); + } + +} diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java new file mode 100644 index 000000000..1743aca29 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -0,0 +1,322 @@ +package com.hbm.items.machine; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.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.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraftforge.oredict.OreDictionary; + +public class ItemMold extends Item { + + public static List molds = new ArrayList(); //molds in "pretty" order, variable between versions + public static HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage + + public HashMap blockOverrides = new HashMap(); + + public ItemMold() { + + this.setHasSubtypes(true); + this.setMaxDamage(0); + + blockOverrides.put(Mats.MAT_STONE, new ItemStack(Blocks.stone)); + blockOverrides.put(Mats.MAT_OBSIDIAN, new ItemStack(Blocks.obsidian)); + + int S = 0; + int L = 1; + registerMold(new MoldShape( 0, S, "nugget", MaterialShapes.NUGGET)); + registerMold(new MoldShape( 1, S, "billet", MaterialShapes.BILLET)); + registerMold(new MoldShape( 2, S, "ingot", MaterialShapes.INGOT)); + registerMold(new MoldShape( 3, S, "plate", MaterialShapes.PLATE)); + registerMold(new MoldWire( 4, S, "wire")); + + registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(3), + Mats.MAT_TITANIUM, new ItemStack(ModItems.blade_titanium), + Mats.MAT_TUNGSTEN, new ItemStack(ModItems.blade_tungsten))); + + registerMold(new MoldMulti( 6, S, "blades", MaterialShapes.INGOT.q(4), + Mats.MAT_GOLD, new ItemStack(ModItems.blades_gold), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.blades_aluminium), + Mats.MAT_IRON, new ItemStack(ModItems.blades_iron), + Mats.MAT_STEEL, new ItemStack(ModItems.blades_steel), + Mats.MAT_TITANIUM, new ItemStack(ModItems.blades_titanium), + Mats.MAT_ALLOY, new ItemStack(ModItems.blades_advanced_alloy), + Mats.MAT_CMB, new ItemStack(ModItems.blades_combine_steel), + Mats.MAT_SCHRABIDIUM, new ItemStack(ModItems.blades_schrabidium))); + + registerMold(new MoldMulti( 7, S, "stamp", MaterialShapes.INGOT.q(4), + Mats.MAT_STONE, new ItemStack(ModItems.stamp_stone_flat), + Mats.MAT_IRON, new ItemStack(ModItems.stamp_iron_flat), + Mats.MAT_STEEL, new ItemStack(ModItems.stamp_steel_flat), + Mats.MAT_TITANIUM, new ItemStack(ModItems.stamp_titanium_flat), + Mats.MAT_OBSIDIAN, new ItemStack(ModItems.stamp_obsidian_flat), + Mats.MAT_SCHRABIDIUM, new ItemStack(ModItems.stamp_schrabidium_flat))); + + registerMold(new MoldMulti( 8, S, "hull_small", MaterialShapes.INGOT.q(2), + Mats.MAT_STEEL, new ItemStack(ModItems.hull_small_steel), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.hull_small_aluminium))); + + registerMold(new MoldMulti( 9, L, "hull_big", MaterialShapes.INGOT.q(6), + Mats.MAT_STEEL, new ItemStack(ModItems.hull_big_steel), + Mats.MAT_ALUMINIUM, new ItemStack(ModItems.hull_big_aluminium), + Mats.MAT_TITANIUM, new ItemStack(ModItems.hull_big_titanium))); + + registerMold(new MoldShape( 10, L, "ingots", MaterialShapes.INGOT, 9)); + registerMold(new MoldShape( 11, L, "plates", MaterialShapes.PLATE, 9)); + registerMold(new MoldBlock( 12, L, "block", MaterialShapes.BLOCK)); + registerMold(new MoldSingle( 13, L, "pipes", new ItemStack(ModItems.pipes_steel), Mats.MAT_STEEL, MaterialShapes.BLOCK.q(3))); + + registerMold(new MoldSingle( 14, S, "c357", new ItemStack(ModItems.casing_357), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 15, S, "c44", new ItemStack(ModItems.casing_44), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 16, S, "c9", new ItemStack(ModItems.casing_9), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 17, S, "c50", new ItemStack(ModItems.casing_50), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 18, S, "cbuckshot", new ItemStack(ModItems.casing_buckshot), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + } + + public void registerMold(Mold mold) { + this.molds.add(mold); + this.moldById.put(mold.id, mold); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < molds.size(); i++) { + Mold mold = molds.get(i); + list.add(new ItemStack(item, 1, mold.id)); + } + } + + protected IIcon[] icons; + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + + icons = new IIcon[molds.size()]; + + for(int i = 0; i < molds.size(); i++) { + Mold mold = molds.get(i); + this.icons[i] = reg.registerIcon(RefStrings.MODID + ":mold_" + mold.name); + } + } + + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + Mold mold = this.moldById.get(meta); + if(mold != null) + return this.icons[mold.order]; + + return this.icons[0]; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + Mold mold = getMold(stack); + list.add(EnumChatFormatting.YELLOW + mold.getTitle()); + + if(mold.size == 0) list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey(ModBlocks.foundry_mold.getUnlocalizedName() + ".name")); + if(mold.size == 1) list.add(EnumChatFormatting.RED + I18nUtil.resolveKey(ModBlocks.foundry_basin.getUnlocalizedName() + ".name")); + } + + public Mold getMold(ItemStack stack) { + Mold mold = moldById.get(stack.getItemDamage()); + return mold != null ? mold : molds.get(0); + } + + public static int nextOrder = 0; + + public abstract class Mold { + public int order; + public int id; + public int size; + public String name; + + public Mold(int id, int size, String name) { + this.order = nextOrder++; + this.id = id; + this.size = size; + this.name = name; + } + + public abstract ItemStack getOutput(NTMMaterial mat); + public abstract int getCost(); + public abstract String getTitle(); + } + + public class MoldShape extends Mold { + + public MaterialShapes shape; + public int amount; + + public MoldShape(int id, int size, String name, MaterialShapes shape) { + this(id, size, name, shape, 1); + } + + public MoldShape(int id, int size, String name, MaterialShapes shape, int amount) { + super(id, size, name); + this.shape = shape; + this.amount = amount; + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + for(String name : mat.names) { + String od = shape.name().toLowerCase() + name; + List ores = OreDictionary.getOres(od); + if(!ores.isEmpty()) { + ItemStack copy = ores.get(0); + copy.stackSize = this.amount; + return copy; + } + } + + return null; + } + + @Override + public int getCost() { + return shape.q(amount); + } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + shape.name().toLowerCase()) + " x" + amount; + } + } + + public class MoldBlock extends MoldShape { + + public MoldBlock(int id, int size, String name, MaterialShapes shape) { + super(id, size, name, shape); + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + ItemStack override = blockOverrides.get(mat); + + if(override != null) + return override.copy(); + + return super.getOutput(mat); + } + } + + public class MoldWire extends Mold { + + public MoldWire(int id, int size, String name) { + super(id, size, name); + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + + if(mat == Mats.MAT_ALUMINIUM) return new ItemStack(ModItems.wire_aluminium, 8); + if(mat == Mats.MAT_ALLOY) return new ItemStack(ModItems.wire_advanced_alloy, 8); + if(mat == Mats.MAT_COPPER) return new ItemStack(ModItems.wire_copper, 8); + if(mat == Mats.MAT_GOLD) return new ItemStack(ModItems.wire_gold, 8); + if(mat == Mats.MAT_MAGTUNG) return new ItemStack(ModItems.wire_magnetized_tungsten, 8); + if(mat == Mats.MAT_MINGRADE) return new ItemStack(ModItems.wire_red_copper, 8); + if(mat == Mats.MAT_SCHRABIDIUM) return new ItemStack(ModItems.wire_schrabidium, 8); + if(mat == Mats.MAT_TUNGSTEN) return new ItemStack(ModItems.wire_tungsten, 8); + return null; + } + + @Override + public int getCost() { + return MaterialShapes.WIRE.q(8); + } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + MaterialShapes.WIRE.name().toLowerCase()) + " x8"; + } + } + + /* because why not */ + public class MoldSingle extends Mold { + + public ItemStack out; + public NTMMaterial mat; + public int amount; + + public MoldSingle(int id, int size, String name, ItemStack out, NTMMaterial mat, int amount) { + super(id, size, name); + this.out = out; + this.mat = mat; + this.amount = amount; + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + return this.mat == mat ? out.copy() : null; + } + + @Override + public int getCost() { + return amount; + } + + @Override + public String getTitle() { + return out.getDisplayName() + " x" + this.out.stackSize; + } + } + + /* not so graceful but it does the job and it does it well */ + public class MoldMulti extends Mold { + + public HashMap map = new HashMap(); + public int amount; + public int stacksize; + + public MoldMulti(int id, int size, String name, int amount, Object... inputs) { + super(id, size, name); + this.amount = amount; + + for(int i = 0; i < inputs.length; i += 2) { + map.put((NTMMaterial) inputs[i], (ItemStack) inputs[i + 1]); + + if(i == 0) stacksize = (((ItemStack) inputs[i + 1])).stackSize; + } + } + + @Override + public ItemStack getOutput(NTMMaterial mat) { + ItemStack out = this.map.get(mat); + + if(out != null) + return out.copy(); + + return out; + } + + @Override + public int getCost() { + return amount; + } + + @Override + public String getTitle() { + return I18nUtil.resolveKey("shape." + name) + " x" + this.stacksize; + } + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 557892236..fa33d32ed 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -8,9 +8,6 @@ import com.hbm.tileentity.machine.rbmk.IRBMKFluxReceiver.NType; import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.util.I18nUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/items/machine/ItemScraps.java b/src/main/java/com/hbm/items/machine/ItemScraps.java new file mode 100644 index 000000000..dad82669d --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemScraps.java @@ -0,0 +1,78 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.inventory.material.NTMMaterial; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemScraps extends Item { + + public ItemScraps() { + this.setHasSubtypes(true); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(NTMMaterial mat : Mats.orderedList) { + list.add(new ItemStack(item, 1, mat.id)); + } + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + MaterialStack contents = getMats(stack); + + if(contents != null) { + list.add(contents.material.names[0] + ", " + Mats.formatAmount(contents.amount)); + } + } + + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int layer) { + + NTMMaterial mat = Mats.matById.get(stack.getItemDamage()); + + if(mat != null) { + return mat.moltenColor; + } + + return 0xffffff; + } + + public static MaterialStack getMats(ItemStack stack) { + + if(stack.getItem() != ModItems.scraps) return null; + + NTMMaterial mat = Mats.matById.get(stack.getItemDamage()); + if(mat == null) return null; + + int amount = MaterialShapes.INGOT.q(1); + + if(stack.hasTagCompound()) { + amount = stack.getTagCompound().getInteger("amount"); + } + + return new MaterialStack(mat, amount); + } + + public static ItemStack create(MaterialStack stack) { + if(stack.material == null) + return new ItemStack(ModItems.nothing); //why do i bother adding checks for fucking everything when they don't work + ItemStack scrap = new ItemStack(ModItems.scraps, 1, stack.material.id); + scrap.stackTagCompound = new NBTTagCompound(); + scrap.stackTagCompound.setInteger("amount", stack.amount); + return scrap; + } +} diff --git a/src/main/java/com/hbm/items/special/ItemSyringe.java b/src/main/java/com/hbm/items/special/ItemSyringe.java index b14fddcd3..d50a57074 100644 --- a/src/main/java/com/hbm/items/special/ItemSyringe.java +++ b/src/main/java/com/hbm/items/special/ItemSyringe.java @@ -6,13 +6,13 @@ import java.util.Random; import com.hbm.config.VersatileConfig; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.ArmorModHandler; -import com.hbm.interfaces.IPartiallyFillable; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemGunBase; import com.hbm.lib.ModDamageSource; import com.hbm.potion.HbmPotion; +import api.hbm.fluid.IFillableItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.EntityLivingBase; @@ -279,16 +279,15 @@ public class ItemSyringe extends Item { jetpack = ArmorModHandler.pryMods(jetpack)[ArmorModHandler.plate_only]; } - if(jetpack == null || !(jetpack.getItem() instanceof IPartiallyFillable)) + if(jetpack == null || !(jetpack.getItem() instanceof IFillableItem)) return stack; - IPartiallyFillable fillable = (IPartiallyFillable) jetpack.getItem(); + IFillableItem fillable = (IFillableItem) jetpack.getItem(); - if(fillable.getType(jetpack) != Fluids.KEROSENE) + if(!fillable.acceptsFluid(Fluids.KEROSENE, jetpack)) return stack; - int fill = Math.min(fillable.getFill(jetpack) + 1000, fillable.getMaxFill(jetpack)); - fillable.setFill(jetpack, fill); + fillable.tryFill(Fluids.KEROSENE, 1000, jetpack); if(jetpack.getItem() != player.inventory.armorInventory[2].getItem()) ArmorModHandler.applyMod(player.inventory.armorInventory[2], jetpack); diff --git a/src/main/java/com/hbm/items/tool/IItemAbility.java b/src/main/java/com/hbm/items/tool/IItemAbility.java index 00f5cefab..ca8a33b4b 100644 --- a/src/main/java/com/hbm/items/tool/IItemAbility.java +++ b/src/main/java/com/hbm/items/tool/IItemAbility.java @@ -86,4 +86,52 @@ public interface IItemAbility { Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit)); } } + + public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) { + + Block block = world.getBlock(x, y, z); + int l = world.getBlockMetadata(x, y, z); + world.playAuxSFXAtEntity(player, 2001, x, y, z, Block.getIdFromBlock(block) + (world.getBlockMetadata(x, y, z) << 12)); + boolean flag = false; + + if(player.capabilities.isCreativeMode) { + flag = removeBlock(world, x, y, z, false, player); + player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); + } else { + ItemStack itemstack = player.getCurrentEquippedItem(); + boolean flag1 = block.canHarvestBlock(player, l); + + if(itemstack != null) { + itemstack.func_150999_a(world, block, x, y, z, player); + + if(itemstack.stackSize == 0) { + player.destroyCurrentEquippedItem(); + } + } + + flag = removeBlock(world, x, y, z, flag1, player); + if(flag && flag1) { + block.harvestBlock(world, player, x, y, z, l); + } + } + + /* + * // Drop experience if (!player.capabilities.isCreativeMode && flag && + * event != null) { block.dropXpOnBlockBreak(world, x, y, z, + * event.getExpToDrop()); } + */ + } + + public static boolean removeBlock(World world, int x, int y, int z, boolean canHarvest, EntityPlayerMP player) { + Block block = world.getBlock(x, y, z); + int l = world.getBlockMetadata(x, y, z); + block.onBlockHarvested(world, x, y, z, l, player); + boolean flag = block.removedByPlayer(world, player, x, y, z, canHarvest); + + if(flag) { + block.onBlockDestroyedByPlayer(world, x, y, z, l); + } + + return flag; + } } diff --git a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java b/src/main/java/com/hbm/items/tool/ItemAnalyzer.java index 64a7856f3..7fa9b84ff 100644 --- a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java +++ b/src/main/java/com/hbm/items/tool/ItemAnalyzer.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidDuct; -import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.tileentity.network.TileEntityPylon; diff --git a/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java new file mode 100644 index 000000000..9fb384f23 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemAnchorRemote.java @@ -0,0 +1,105 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBattery; +import com.hbm.util.BobMathUtil; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class ItemAnchorRemote extends ItemBattery { + + public ItemAnchorRemote() { + super(1_000_000, 10_000, 0); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + + long charge = maxCharge; + + if(itemstack.hasTagCompound()) + charge = getCharge(itemstack); + + if(itemstack.getItem() != ModItems.fusion_core && itemstack.getItem() != ModItems.energy_core) { + list.add("Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); + } else { + String charge1 = BobMathUtil.getShortNumber((charge * 100) / this.maxCharge); + list.add("Charge: " + charge1 + "%"); + list.add("(" + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE)"); + } + + list.add("Charge rate: " + BobMathUtil.getShortNumber(chargeRate) + "HE/t"); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + if(world.getBlock(x, y, z) == ModBlocks.teleanchor) { + + if(!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + + return true; + } + + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(player.isSneaking() || world.isRemote) { + return stack; + } + + if(!stack.hasTagCompound()) { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + return stack; + } + + if(this.getCharge(stack) < 10_000) { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + return stack; + } + + int x = stack.stackTagCompound.getInteger("x"); + int y = stack.stackTagCompound.getInteger("y"); + int z = stack.stackTagCompound.getInteger("z"); + + world.getChunkProvider().loadChunk(x >> 4, z >> 4); + + if(world.getBlock(x, y, z) == ModBlocks.teleanchor) { + + if(player.isRiding()) { + player.mountEntity(null); + } + + world.newExplosion(player, x + 0.5, y + 1 + player.height / 2, z + 0.5, 2F, false, false); + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.setPositionAndUpdate(x + 0.5, y + 1, z + 0.5); + //world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.fallDistance = 0.0F; + + for(int i = 0; i < 32; ++i) { + world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); + } + + this.dischargeBattery(stack, 10_000); + + } else { + world.playSoundAtEntity(player, "random.orb", 0.25F, 0.75F); + } + + return stack; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemChainsaw.java b/src/main/java/com/hbm/items/tool/ItemChainsaw.java new file mode 100644 index 000000000..a2d4dfb38 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemChainsaw.java @@ -0,0 +1,35 @@ +package com.hbm.items.tool; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.IHeldSoundProvider; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemChainsaw extends ItemToolAbilityFueled implements IHeldSoundProvider { + + public ItemChainsaw(float damage, double movement, ToolMaterial material, EnumToolType type, int maxFuel, int consumption, int fillRate, FluidType... acceptedFuels) { + super(damage, movement, material, type, maxFuel, consumption, fillRate, acceptedFuels); + } + + @Override + public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { + + if(!(entityLiving instanceof EntityPlayerMP)) + return false; + + if(stack.getItemDamage() >= stack.getMaxDamage()) + return false; + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "anim"); + nbt.setString("mode", "sSwing"); + PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + + return false; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java b/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java index b69f70150..fed462479 100644 --- a/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java +++ b/src/main/java/com/hbm/items/tool/ItemDesignatorArtyRange.java @@ -2,10 +2,9 @@ package com.hbm.items.tool; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.turret.TurretArty; +import com.hbm.blocks.BlockDummyable; import com.hbm.lib.Library; -import com.hbm.tileentity.turret.TileEntityTurretArty; +import com.hbm.tileentity.turret.TileEntityTurretBaseArtillery; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -38,15 +37,15 @@ public class ItemDesignatorArtyRange extends Item { Block b = world.getBlock(x, y, z); - if(b == ModBlocks.turret_arty) { - int pos[] = ((TurretArty) b).findCore(world, x, y, z); + if(b instanceof BlockDummyable) { + int pos[] = ((BlockDummyable) b).findCore(world, x, y, z); if(pos == null) return false; TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - if(te instanceof TileEntityTurretArty) { + if(te instanceof TileEntityTurretBaseArtillery) { if(world.isRemote) return true; @@ -79,12 +78,10 @@ public class ItemDesignatorArtyRange extends Item { if(!world.isRemote) { TileEntity te = world.getTileEntity(stack.stackTagCompound.getInteger("x"), stack.stackTagCompound.getInteger("y"), stack.stackTagCompound.getInteger("z")); - if(te instanceof TileEntityTurretArty) { - TileEntityTurretArty arty = (TileEntityTurretArty) te; - if(arty.mode == arty.MODE_MANUAL) { - arty.enqueueTarget(x + 0.5, y + 0.5, z + 0.5); - world.playSoundAtEntity(player, "hbm:item.techBoop", 1.0F, 1.0F); - } + if(te instanceof TileEntityTurretBaseArtillery) { + TileEntityTurretBaseArtillery arty = (TileEntityTurretBaseArtillery) te; + arty.enqueueTarget(x + 0.5, y + 0.5, z + 0.5); + world.playSoundAtEntity(player, "hbm:item.techBoop", 1.0F, 1.0F); } } diff --git a/src/main/java/com/hbm/items/tool/ItemDiscord.java b/src/main/java/com/hbm/items/tool/ItemDiscord.java index bb29d102e..75f8893de 100644 --- a/src/main/java/com/hbm/items/tool/ItemDiscord.java +++ b/src/main/java/com/hbm/items/tool/ItemDiscord.java @@ -14,33 +14,33 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class ItemDiscord extends Item { - + @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - + MovingObjectPosition pos = Library.rayTrace(player, 100, 1); - + if(pos.typeOfHit == MovingObjectType.BLOCK) { if(!world.isRemote) { - - if(player.isRiding()) - player.mountEntity(null); - - ForgeDirection dir = ForgeDirection.getOrientation(pos.sideHit); - world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); - - player.setPositionAndUpdate(pos.hitVec.xCoord + dir.offsetX, pos.hitVec.yCoord + dir.offsetY - 1, pos.hitVec.zCoord + dir.offsetZ); - - world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); - player.fallDistance = 0.0F; + if(player.isRiding()) + player.mountEntity(null); + + ForgeDirection dir = ForgeDirection.getOrientation(pos.sideHit); + + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + + player.setPositionAndUpdate(pos.hitVec.xCoord + dir.offsetX, pos.hitVec.yCoord + dir.offsetY - 1, pos.hitVec.zCoord + dir.offsetZ); + + world.playSoundEffect(player.posX, player.posY, player.posZ, "mob.endermen.portal", 1.0F, 1.0F); + player.fallDistance = 0.0F; } - for (int i = 0; i < 32; ++i) - world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); + for(int i = 0; i < 32; ++i) + world.spawnParticle("portal", player.posX, player.posY + player.getRNG().nextDouble() * 2.0D, player.posZ, player.getRNG().nextGaussian(), 0.0D, player.getRNG().nextGaussian()); } - + return stack; } diff --git a/src/main/java/com/hbm/items/tool/ItemModBucket.java b/src/main/java/com/hbm/items/tool/ItemModBucket.java index 33c5b7c4b..86caf2476 100644 --- a/src/main/java/com/hbm/items/tool/ItemModBucket.java +++ b/src/main/java/com/hbm/items/tool/ItemModBucket.java @@ -1,12 +1,56 @@ package com.hbm.items.tool; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemBucket; +import net.minecraft.world.World; public class ItemModBucket extends ItemBucket { + + protected int overrideFluidMeta = 0; + protected Block containedFluid; - public ItemModBucket(Block p_i45331_1_) { - super(p_i45331_1_); + public ItemModBucket(Block fluid) { + super(fluid); + this.containedFluid = fluid; + } + + public ItemModBucket(Block fluid, int meta) { + this(fluid); + this.overrideFluidMeta = meta; + } + + @Override + public boolean tryPlaceContainedLiquid(World world, int x, int y, int z) { + + if(this.containedFluid == Blocks.air) { + return false; + } else { + Material material = world.getBlock(x, y, z).getMaterial(); + boolean flag = !material.isSolid(); + + if(!world.isAirBlock(x, y, z) && !flag) { + return false; + } else { + if(world.provider.isHellWorld && this.containedFluid == Blocks.flowing_water) { + world.playSoundEffect((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), "random.fizz", 0.5F, + 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + for(int l = 0; l < 8; ++l) { + world.spawnParticle("largesmoke", (double) x + Math.random(), (double) y + Math.random(), (double) z + Math.random(), 0.0D, 0.0D, 0.0D); + } + } else { + if(!world.isRemote && flag && !material.isLiquid()) { + world.func_147480_a(x, y, z, true); + } + + world.setBlock(x, y, z, this.containedFluid, overrideFluidMeta, 3); + } + + return true; + } + } } } diff --git a/src/main/java/com/hbm/items/tool/ItemOilDetector.java b/src/main/java/com/hbm/items/tool/ItemOilDetector.java index ce1c5fa0c..45d41af10 100644 --- a/src/main/java/com/hbm/items/tool/ItemOilDetector.java +++ b/src/main/java/com/hbm/items/tool/ItemOilDetector.java @@ -3,13 +3,16 @@ package com.hbm.items.tool; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.PlayerInformPacket; +import com.hbm.util.ChatBuilder; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -77,17 +80,17 @@ public class ItemOilDetector extends Item { oil = true; if(!world.isRemote) { - + if(direct) { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".bullseye").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.DARK_GREEN))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".bullseye").color(EnumChatFormatting.DARK_GREEN).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } else if(oil) { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".detected").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GOLD))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".detected").color(EnumChatFormatting.GOLD).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } else { - player.addChatMessage(new ChatComponentTranslation(this.getUnlocalizedName() + ".noOil").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("").nextTranslation(this.getUnlocalizedName() + ".noOil").color(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_DETONATOR), (EntityPlayerMP) player); } } - world.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); + world.playSoundAtEntity(player, "hbm:item.techBleep", 1.0F, 1.0F); player.swingItem(); diff --git a/src/main/java/com/hbm/items/tool/ItemStructurePattern.java b/src/main/java/com/hbm/items/tool/ItemStructurePattern.java new file mode 100644 index 000000000..9fa41ace7 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructurePattern.java @@ -0,0 +1,56 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructurePattern extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print all "); + list.add(EnumChatFormatting.YELLOW + "lines for the current selection with blocks and metadata."); + } + + @Override + protected boolean dualUse() { + return true; + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int savedX = stack.stackTagCompound.getInteger("x"); + int savedY = stack.stackTagCompound.getInteger("y"); + int savedZ = stack.stackTagCompound.getInteger("z"); + + int minX = Math.min(savedX, x) - pos.getX(); + int minY = Math.min(savedY, y) - pos.getY(); + int minZ = Math.min(savedZ, z) - pos.getZ(); + int maxX = Math.max(savedX, x) - pos.getX(); + int maxY = Math.max(savedY, y) - pos.getY(); + int maxZ = Math.max(savedZ, z) - pos.getZ(); + + for(int ix = minX; ix <= maxX; ix++) { + for(int iy = minX; iy <= maxY; iy++) { + for(int iz = minX; iz <= maxZ; iz++) { + + Block b = world.getBlock(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ()); + int meta = world.getBlockMetadata(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ()); + + System.out.println("this.placeBlockAtCurrentPosition(world, " + b.getUnlocalizedName() + ", " + meta + ", " + ix + ", " + iy + ", " + iz + ", box)"); + } + } + } + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureSingle.java b/src/main/java/com/hbm/items/tool/ItemStructureSingle.java new file mode 100644 index 000000000..b35974d32 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureSingle.java @@ -0,0 +1,37 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructureSingle extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print exactly one "); + list.add(EnumChatFormatting.YELLOW + "line with the targted block and metadata"); + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int ix = x - pos.getX(); + int iy = y - pos.getX(); + int iz = z - pos.getX(); + + Block b = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + + System.out.println("this.placeBlockAtCurrentPosition(world, " + b.getUnlocalizedName() + ", " + meta + ", " + x + ", " + y + ", " + z + ", box)"); + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureSolid.java b/src/main/java/com/hbm/items/tool/ItemStructureSolid.java new file mode 100644 index 000000000..8267f96b8 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureSolid.java @@ -0,0 +1,45 @@ +package com.hbm.items.tool; + +import java.util.List; + +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemStructureSolid extends ItemStructureTool { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + super.addInformation(stack, player, list, ext); + list.add(EnumChatFormatting.YELLOW + "Click to print a "); + list.add(EnumChatFormatting.YELLOW + "line with wildcard block and metadata."); + } + + @Override + protected boolean dualUse() { + return true; + } + + @Override + protected void doTheThing(ItemStack stack, World world, int x, int y, int z) { + + BlockPos pos = this.getAnchor(stack); + if(pos == null) return; + + int savedX = stack.stackTagCompound.getInteger("x"); + int savedY = stack.stackTagCompound.getInteger("y"); + int savedZ = stack.stackTagCompound.getInteger("z"); + + int minX = Math.min(savedX, x) - pos.getX(); + int minY = Math.min(savedY, y) - pos.getY(); + int minZ = Math.min(savedZ, z) - pos.getZ(); + int maxX = Math.max(savedX, x) - pos.getX(); + int maxY = Math.max(savedY, y) - pos.getY(); + int maxZ = Math.max(savedZ, z) - pos.getZ(); + + System.out.println("this.fillWithMetadataBlocks(world, box, " + minX + ", " + minY + ", " + minZ + ", " + maxX + ", " + maxY + ", " + maxZ + ", , , Blocks.air, 0, false)"); + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemStructureTool.java b/src/main/java/com/hbm/items/tool/ItemStructureTool.java new file mode 100644 index 000000000..c72f6a392 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemStructureTool.java @@ -0,0 +1,116 @@ +package com.hbm.items.tool; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ModBlocks; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public abstract class ItemStructureTool extends Item implements ILookOverlay { + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + BlockPos anchor = this.getAnchor(stack); + + if(anchor == null) { + list.add(EnumChatFormatting.RED + "No anchor set! Right click an anchor to get started."); + } + } + + public static BlockPos getAnchor(ItemStack stack) { + + if(!stack.hasTagCompound()) { + return null; + } + + return new BlockPos(stack.stackTagCompound.getInteger("anchorX"), stack.stackTagCompound.getInteger("anchorY"), stack.stackTagCompound.getInteger("anchorZ")); + } + + public static void setAnchor(ItemStack stack, int x, int y, int z) { + + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("anchorX", x); + stack.stackTagCompound.setInteger("anchorY", y); + stack.stackTagCompound.setInteger("anchorZ", z); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + Block b = world.getBlock(x, y, z); + + if(b == ModBlocks.structure_anchor) { + this.setAnchor(stack, x, y, z); + return true; + } + + if(this.getAnchor(stack) == null) { + return false; + } + + if(!this.dualUse()) { + this.doTheThing(stack, world, x, y, z); + } else { + + if(!stack.stackTagCompound.hasKey("x")) { + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + } else { + this.doTheThing(stack, world, x, y, z); + stack.stackTagCompound.removeTag("x"); + stack.stackTagCompound.removeTag("y"); + stack.stackTagCompound.removeTag("z"); + } + } + + return true; + } + + protected boolean dualUse() { + return false; + } + + protected abstract void doTheThing(ItemStack stack, World world, int x, int y, int z); + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + ItemStack stack = Minecraft.getMinecraft().thePlayer.getHeldItem(); + List text = new ArrayList(); + + BlockPos anchor = getAnchor(stack); + + if(anchor == null) { + text.add(EnumChatFormatting.RED + "No Anchor"); + } else { + + int dX = x - anchor.getX(); + int dY = y - anchor.getY(); + int dZ = z - anchor.getZ(); + text.add(EnumChatFormatting.YELLOW + "Position: " + dX + " / " + dY + " / " + dZ); + + if(this.dualUse() && stack.stackTagCompound.hasKey("x")) { + int sX = Math.abs(x - stack.stackTagCompound.getInteger("x")) + 1; + int sY = Math.abs(y - stack.stackTagCompound.getInteger("y")) + 1; + int sZ = Math.abs(z - stack.stackTagCompound.getInteger("z")) + 1; + text.add(EnumChatFormatting.GOLD + "Selection: " + sX + " / " + sY + " / " + sZ); + } + } + + ILookOverlay.printGeneric(event, this.getItemStackDisplayName(stack), 0xffff00, 0x404000, text); + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index c6b7e4276..8497d24ce 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -130,11 +130,16 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc int meta = world.getBlockMetadata(x, y, z); if(!world.isRemote && canHarvestBlock(block, stack) && this.getCurrentAbility(stack) != null && canOperate(stack)) - this.getCurrentAbility(stack).onDig(world, x, y, z, player, block, meta, this); + return this.getCurrentAbility(stack).onDig(world, x, y, z, player, block, meta, this); return false; } + @Override + public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase player) { + return super.onBlockDestroyed(stack, world, block, x, y, z, player); + } + @Override public float getDigSpeed(ItemStack stack, Block block, int meta) { @@ -269,7 +274,7 @@ public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRoc stack.stackTagCompound.setInteger("ability", ability); } - protected boolean canOperate(ItemStack stack) { + public boolean canOperate(ItemStack stack) { return true; } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java new file mode 100644 index 000000000..fd116a9b0 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityFueled.java @@ -0,0 +1,124 @@ +package com.hbm.items.tool; + +import java.util.HashSet; +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.util.I18nUtil; + +import api.hbm.fluid.IFillableItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; + +public class ItemToolAbilityFueled extends ItemToolAbility implements IFillableItem { + + protected int fillRate; + protected int consumption; + protected int maxFuel; + protected HashSet acceptedFuels = new HashSet(); + + public ItemToolAbilityFueled(float damage, double movement, ToolMaterial material, EnumToolType type, int maxFuel, int consumption, int fillRate, FluidType... acceptedFuels) { + super(damage, movement, material, type); + this.maxFuel = maxFuel; + this.consumption = consumption; + this.fillRate = fillRate; + this.setMaxDamage(1); + for(FluidType fuel : acceptedFuels) this.acceptedFuels.add(fuel); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + list.add(EnumChatFormatting.GOLD + "Fuel: " + this.getFill(stack) + "/" + this.maxFuel + "mB"); + + for(FluidType type : acceptedFuels) { + list.add(EnumChatFormatting.YELLOW + "- " + I18nUtil.resolveKey(type.getUnlocalizedName())); + } + + super.addInformation(stack, player, list, ext); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getFill(stack) < maxFuel; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getFill(stack) / (double) maxFuel; + } + + @Override + public boolean canOperate(ItemStack stack) { + return getFill(stack) >= this.consumption; + } + + @Override + public void setDamage(ItemStack stack, int damage) { + this.setFill(stack, Math.max(this.getFill(stack) - damage * consumption, 0)); + } + + @Override + public boolean isDamageable() { + return true; + } + + public int getFill(ItemStack stack) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + setFill(stack, maxFuel); + return maxFuel; + } + + return stack.stackTagCompound.getInteger("fuel"); + } + + public void setFill(ItemStack stack, int fill) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("fuel", fill); + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return this.acceptedFuels.contains(type); + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + int toFill = Math.min(amount, this.fillRate); + toFill = Math.min(toFill, this.maxFuel - this.getFill(stack)); + this.setFill(stack, this.getFill(stack) + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return false; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + return amount; + } + + public static ItemStack getEmptyTool(Item item) { + ItemToolAbilityFueled tool = (ItemToolAbilityFueled) item; + ItemStack stack = new ItemStack(item); + tool.setFill(stack, 0); + return stack; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java index 275184d0f..80fb5fa87 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java @@ -26,94 +26,90 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - public void chargeBattery(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", i); - } - } - } + public void chargeBattery(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } @Override - public void setCharge(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", i); - } - } - } + public void setCharge(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } @Override - public void dischargeBattery(ItemStack stack, long i) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", this.maxPower - i); - } - - if(stack.stackTagCompound.getLong("charge") < 0) - stack.stackTagCompound.setLong("charge", 0); - } - } + public void dischargeBattery(ItemStack stack, long i) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", this.maxPower - i); + } + + if(stack.stackTagCompound.getLong("charge") < 0) + stack.stackTagCompound.setLong("charge", 0); + } + } @Override - public long getCharge(ItemStack stack) { - if(stack.getItem() instanceof ItemToolAbilityPower) { - if(stack.hasTagCompound()) { - return stack.stackTagCompound.getLong("charge"); - } else { - stack.stackTagCompound = new NBTTagCompound(); - stack.stackTagCompound.setLong("charge", ((ItemToolAbilityPower)stack.getItem()).maxPower); - return stack.stackTagCompound.getLong("charge"); - } - } - - return 0; - } - - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - - list.add("Charge: " + BobMathUtil.getShortNumber(getCharge(stack)) + " / " + BobMathUtil.getShortNumber(maxPower)); - - super.addInformation(stack, player, list, ext); - } + public long getCharge(ItemStack stack) { + if(stack.getItem() instanceof ItemToolAbilityPower) { + if(stack.hasTagCompound()) { + return stack.stackTagCompound.getLong("charge"); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", ((ItemToolAbilityPower) stack.getItem()).maxPower); + return stack.stackTagCompound.getLong("charge"); + } + } + + return 0; + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + list.add("Charge: " + BobMathUtil.getShortNumber(getCharge(stack)) + " / " + BobMathUtil.getShortNumber(maxPower)); + super.addInformation(stack, player, list, ext); + } @Override - public boolean showDurabilityBar(ItemStack stack) { - - return getCharge(stack) < maxPower; - } + public boolean showDurabilityBar(ItemStack stack) { + return getCharge(stack) < maxPower; + } @Override - public double getDurabilityForDisplay(ItemStack stack) { - - return 1 - (double)getCharge(stack) / (double)maxPower; - } + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getCharge(stack) / (double) maxPower; + } @Override - protected boolean canOperate(ItemStack stack) { - - return getCharge(stack) >= this.consumption; - } + public boolean canOperate(ItemStack stack) { + return getCharge(stack) >= this.consumption; + } @Override - public long getMaxCharge() { - return maxPower; - } + public long getMaxCharge() { + return maxPower; + } @Override - public long getChargeRate() { - return chargeRate; - } + public long getChargeRate() { + return chargeRate; + } @Override public long getDischargeRate() { @@ -121,13 +117,12 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - public void setDamage(ItemStack stack, int damage) - { - this.dischargeBattery(stack, damage * consumption); - } + public void setDamage(ItemStack stack, int damage) { + this.dischargeBattery(stack, damage * consumption); + } @Override - public boolean isDamageable() { - return true; - } + public boolean isDamageable() { + return true; + } } diff --git a/src/main/java/com/hbm/items/tool/ItemTooling.java b/src/main/java/com/hbm/items/tool/ItemTooling.java index 8131a076a..f0c4119da 100644 --- a/src/main/java/com/hbm/items/tool/ItemTooling.java +++ b/src/main/java/com/hbm/items/tool/ItemTooling.java @@ -6,13 +6,12 @@ import api.hbm.block.IToolable; import api.hbm.block.IToolable.ToolType; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemTooling extends ItemCraftingDegradation { - ToolType type; + protected ToolType type; public ItemTooling(ToolType type, int durability) { super(durability); diff --git a/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java b/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java new file mode 100644 index 000000000..58e5e2cd6 --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemToolingWeapon.java @@ -0,0 +1,57 @@ +package com.hbm.items.tool; + +import com.google.common.collect.Multimap; +import com.hbm.items.ModItems; + +import api.hbm.block.IToolable.ToolType; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class ItemToolingWeapon extends ItemTooling { + + protected float damage = 0; + + public ItemToolingWeapon(ToolType type, int durability, float damage) { + super(type, durability); + this.damage = damage; + } + + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase entity, EntityLivingBase player) { + + World world = player.worldObj; + + if(this == ModItems.wrench) { + + Vec3 vec = player.getLookVec(); + + double dX = vec.xCoord * 0.5; + double dY = vec.yCoord * 0.5; + double dZ = vec.zCoord * 0.5; + + entity.motionX += dX; + entity.motionY += dY; + entity.motionZ += dZ; + world.playSoundAtEntity(entity, "random.anvil_land", 3.0F, 0.75F); + } + + return false; + } + + @Override + public Multimap getAttributeModifiers(ItemStack stack) { + + Multimap multimap = super.getAttributeModifiers(stack); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", damage, 0)); + + if(this == ModItems.wrench) { + multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Wrench modifier", -0.1, 1)); + } + + return multimap; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 527f6d5cf..69fdac079 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -8,6 +8,7 @@ import com.hbm.entity.mob.siege.EntitySiegeTunneler; import com.hbm.items.ModItems; import com.hbm.items.special.ItemKitCustom; import com.hbm.lib.Library; +import com.hbm.world.feature.OilSpot; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; @@ -31,9 +32,11 @@ public class ItemWandD extends Item { if(pos != null) { - EntityNukeTorex torex = new EntityNukeTorex(world); + OilSpot.generateOilSpot(world, pos.blockX, pos.blockZ, 20, 500); + + /*EntityNukeTorex torex = new EntityNukeTorex(world); torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); - world.spawnEntityInWorld(torex); + world.spawnEntityInWorld(torex);*/ /*EntitySiegeTunneler tunneler = new EntitySiegeTunneler(world); tunneler.setPosition(pos.blockX, pos.blockY + 1, pos.blockZ); diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 803b44ed5..29ef557c4 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -38,11 +38,12 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; public class ItemAmmoArty extends Item { - public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; - public static ArtilleryShell[] shellTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; + public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 9 /* <<< */ ]; + //public static ArtilleryShell[] shellTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; /* item types */ public final int NORMAL = 0; public final int CLASSIC = 1; @@ -52,6 +53,7 @@ public class ItemAmmoArty extends Item { public final int PHOSPHORUS = 5; public final int MINI_NUKE_MULTI = 6; public final int PHOSPHORUS_MULTI = 7; + public final int CARGO = 8; /* non-item shell types */ public ItemAmmoArty() { @@ -71,6 +73,7 @@ public class ItemAmmoArty extends Item { list.add(new ItemStack(item, 1, MINI_NUKE)); list.add(new ItemStack(item, 1, MINI_NUKE_MULTI)); list.add(new ItemStack(item, 1, NUKE)); + list.add(new ItemStack(item, 1, CARGO)); } @Override @@ -118,10 +121,20 @@ public class ItemAmmoArty extends Item { list.add(r + "(that is the best skull and crossbones"); list.add(r + "minecraft's unicode has to offer)"); break; + case CARGO: + + if(stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { + ItemStack cargo = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("cargo")); + list.add(y + cargo.getDisplayName()); + } else { + list.add(r + "Empty"); + } + break; } } - + private IIcon[] icons = new IIcon[itemTypes.length]; + private IIcon iconCargo; @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister reg) { @@ -131,6 +144,18 @@ public class ItemAmmoArty extends Item { for(int i = 0; i < icons.length; i++) { this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + itemTypes[i].name); } + + this.iconCargo = reg.registerIcon(RefStrings.MODID + ":ammo_arty_cargo_full"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + + if(stack.getItemDamage() == CARGO && stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { + return this.iconCargo; + } + + return this.getIconFromDamage(stack.getItemDamage()); } @Override @@ -204,12 +229,12 @@ public class ItemAmmoArty extends Item { private void init() { /* STANDARD SHELLS */ - this.shellTypes[NORMAL] = this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); }}; - this.shellTypes[CLASSIC] = this.itemTypes[CLASSIC] = new ArtilleryShell("ammo_arty_classic") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 5F, false); }}; - this.shellTypes[EXPLOSIVE] = this.itemTypes[EXPLOSIVE] = new ArtilleryShell("ammo_arty_he") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 3F, true); }}; + this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); }}; + this.itemTypes[CLASSIC] = new ArtilleryShell("ammo_arty_classic") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 5F, false); }}; + this.itemTypes[EXPLOSIVE] = new ArtilleryShell("ammo_arty_he") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 15F, 3F, true); }}; /* MINI NUKE */ - this.shellTypes[MINI_NUKE] = this.itemTypes[MINI_NUKE] = new ArtilleryShell("ammo_arty_mini_nuke") { + this.itemTypes[MINI_NUKE] = new ArtilleryShell("ammo_arty_mini_nuke") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { shell.killAndClear(); Vec3 vec = Vec3.createVectorHelper(shell.motionX, shell.motionY, shell.motionZ).normalize(); @@ -218,7 +243,7 @@ public class ItemAmmoArty extends Item { }; /* FULL NUKE */ - this.shellTypes[NUKE] = this.itemTypes[NUKE] = new ArtilleryShell("ammo_arty_nuke") { + this.itemTypes[NUKE] = new ArtilleryShell("ammo_arty_nuke") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { shell.worldObj.spawnEntityInWorld(EntityNukeExplosionMK4.statFac(shell.worldObj, BombConfig.missileRadius, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord)); EntityNukeCloudSmall entity2 = new EntityNukeCloudSmall(shell.worldObj, 1000, BombConfig.missileRadius * 0.005F); @@ -231,7 +256,7 @@ public class ItemAmmoArty extends Item { }; /* PHOSPHORUS */ - this.shellTypes[PHOSPHORUS] = this.itemTypes[PHOSPHORUS] = new ArtilleryShell("ammo_arty_phosphorus") { + this.itemTypes[PHOSPHORUS] = new ArtilleryShell("ammo_arty_phosphorus") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); shell.worldObj.playSoundEffect(shell.posX, shell.posY, shell.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + shell.worldObj.rand.nextFloat() * 0.2F); @@ -259,13 +284,21 @@ public class ItemAmmoArty extends Item { } }; + /* THIS DOOFUS */ + this.itemTypes[CARGO] = new ArtilleryShell("ammo_arty_cargo") { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { + if(mop.typeOfHit == MovingObjectType.BLOCK) { + shell.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + shell.getStuck(mop.blockX, mop.blockY, mop.blockZ); + } + }}; + /* CLUSTER SHELLS */ - this.shellTypes[PHOSPHORUS_MULTI] = this.itemTypes[PHOSPHORUS_MULTI] = new ArtilleryShell("ammo_arty_phosphorus_multi") { - public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.shellTypes[PHOSPHORUS].onImpact(shell, mop); } + this.itemTypes[PHOSPHORUS_MULTI] = new ArtilleryShell("ammo_arty_phosphorus_multi") { + public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.itemTypes[PHOSPHORUS].onImpact(shell, mop); } public void onUpdate(EntityArtilleryShell shell) { standardCluster(shell, PHOSPHORUS, 10, 300, 5); } }; - this.shellTypes[MINI_NUKE_MULTI] = this.itemTypes[MINI_NUKE_MULTI] = new ArtilleryShell("ammo_arty_mini_nuke_multi") { - public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.shellTypes[MINI_NUKE].onImpact(shell, mop); } + this.itemTypes[MINI_NUKE_MULTI] = new ArtilleryShell("ammo_arty_mini_nuke_multi") { + public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.itemTypes[MINI_NUKE].onImpact(shell, mop); } public void onUpdate(EntityArtilleryShell shell) { standardCluster(shell, MINI_NUKE, 5, 300, 5); } }; } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java new file mode 100644 index 000000000..0a76f7cd9 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -0,0 +1,89 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.entity.projectile.EntityArtilleryRocket; +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; +import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; +import com.hbm.explosion.vanillant.standard.EntityProcessorStandard; +import com.hbm.explosion.vanillant.standard.ExplosionEffectStandard; +import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; + +public class ItemAmmoHIMARS extends Item { + + public static HIMARSRocket[] itemTypes = new HIMARSRocket[ /* >>> */ 2 /* <<< */ ]; + + public final int SMALL = 0; + public final int LARGE = 1; + + public ItemAmmoHIMARS() { + this.setHasSubtypes(true); + this.setCreativeTab(MainRegistry.weaponTab); + this.setTextureName(RefStrings.MODID + ":ammo_rocket"); + this.setMaxStackSize(1); + init(); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + list.add(new ItemStack(item, 1, SMALL)); + list.add(new ItemStack(item, 1, LARGE)); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return "item.ammo_himars_" + itemTypes[Math.abs(stack.getItemDamage()) % itemTypes.length].name; + } + + public abstract class HIMARSRocket { + + public final String name; + public final ResourceLocation texture; + public final int amount; + public final int modelType; /* 0 = sixfold/standard ; 1 = single */ + + public HIMARSRocket(String name, String texture, int type, int amount) { + this.name = name; + this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + texture + ".png"); + this.amount = amount; + this.modelType = type; + } + + public abstract void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop); + public void onUpdate(EntityArtilleryRocket rocket) { } + } + + public static void standardExplosion(EntityArtilleryRocket rocket, MovingObjectPosition mop, float size, float rangeMod, boolean breaksBlocks) { + rocket.worldObj.playSoundEffect(rocket.posX, rocket.posY, rocket.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rocket.worldObj.rand.nextFloat() * 0.2F); + Vec3 vec = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ).normalize(); + ExplosionVNT xnt = new ExplosionVNT(rocket.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, size); + if(breaksBlocks) { + xnt.setBlockAllocator(new BlockAllocatorStandard(48)); + xnt.setBlockProcessor(new BlockProcessorStandard().setNoDrop()); + } + xnt.setEntityProcessor(new EntityProcessorStandard().withRangeMod(rangeMod)); + xnt.setPlayerProcessor(new PlayerProcessorStandard()); + xnt.setSFX(new ExplosionEffectStandard()); + xnt.explode(); + rocket.killAndClear(); + } + + private void init() { + /* STANDARD ROCKETS */ + this.itemTypes[SMALL] = new HIMARSRocket("standard", "himars_standard", 0, 6) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 25F, 3F, true); }}; + this.itemTypes[LARGE] = new HIMARSRocket("single", "himars_single", 1, 1) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 50F, 5F, true); }}; + } +} diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/ItemGunBase.java index 2c6946a9d..5966161ca 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBase.java @@ -786,7 +786,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD { int dura = ItemGunBase.getItemWear(stack) * 50 / gcfg.durability; - RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count, max, dura, showammo); + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, new ItemStack(ammo), count, max, dura, showammo); if(gun.altConfig != null && gun.altConfig.reloadType == GunConfiguration.RELOAD_NONE) { Item oldAmmo = ammo; @@ -794,7 +794,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD { if(ammo != oldAmmo) { count = ItemGunBase.getBeltSize(player, ammo); - RenderScreenOverlay.renderAmmoAlt(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count); + RenderScreenOverlay.renderAmmoAlt(event.resolution, Minecraft.getMinecraft().ingameGUI, new ItemStack(ammo), count); } } } diff --git a/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java new file mode 100644 index 000000000..04f029d2a --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemGunChemthrower.java @@ -0,0 +1,225 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.config.GeneralConfig; +import com.hbm.entity.projectile.EntityChemical; +import com.hbm.handler.GunConfiguration; +import com.hbm.handler.guncfg.GunEnergyFactory; +import com.hbm.interfaces.IHoldableWeapon; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.packet.GunAnimationPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.render.util.RenderScreenOverlay; +import com.hbm.render.util.RenderScreenOverlay.Crosshair; + +import api.hbm.fluid.IFillableItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class ItemGunChemthrower extends ItemGunBase implements IFillableItem { + + public ItemGunChemthrower() { + super(GunEnergyFactory.getChemConfig()); + } + + @Override + protected void fire(ItemStack stack, World world, EntityPlayer player) { + + if(!hasAmmo(stack, player, true)) + return; + + int bullets = 1; + + for(int i = 0; i < bullets; i++) { + spawnProjectile(world, player, stack, 0); + } + + useUpAmmo(player, stack, true); + player.inventoryContainer.detectAndSendChanges(); + + int wear = (int) Math.ceil(10 / (1F + EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, stack))); + setItemWear(stack, getItemWear(stack) + wear); + + //world.playSoundAtEntity(player, mainConfig.firingSound, 1.0F, mainConfig.firingPitch); + } + + @Override + public boolean hasAmmo(ItemStack stack, EntityPlayer player, boolean main) { + return getMag(stack) >= 0 + this.getConsumption(stack); + } + + @Override + public void useUpAmmo(EntityPlayer player, ItemStack stack, boolean main) { + + if(!main && altConfig == null) + return; + + GunConfiguration config = mainConfig; + + if(!main) + config = altConfig; + + if(hasInfinity(stack, config)) + return; + + + if(config.reloadType != mainConfig.RELOAD_NONE) { + setMag(stack, getMag(stack) - this.getConsumption(stack)); + } else { + player.inventory.consumeInventoryItem(getBeltType(player, stack, main)); + } + } + + @Override + public boolean canReload(ItemStack stack, World world, EntityPlayer player) { + return false; + } + + protected void spawnProjectile(World world, EntityPlayer player, ItemStack stack, int config) { + + //spawn fluid projectile + + EntityChemical chem = new EntityChemical(world, player); + chem.setFluid(this.getFluidType(stack)); + world.spawnEntityInWorld(chem); + + if(player instanceof EntityPlayerMP) + PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.CYCLE.ordinal()), (EntityPlayerMP) player); + } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + list.add("Ammo: " + getMag(stack) + " / " + mainConfig.ammoCap + "mB"); + + list.add("Ammo Type: " + I18n.format(this.getFluidType(stack).getUnlocalizedName())); + + int dura = mainConfig.durability - getItemWear(stack); + + if(dura < 0) + dura = 0; + + list.add("Durability: " + dura + " / " + mainConfig.durability); + list.add(""); + list.add("Name: " + mainConfig.name); + list.add("Manufacturer: " + mainConfig.manufacturer); + + if(!mainConfig.comment.isEmpty()) { + list.add(""); + for(String s : mainConfig.comment) + list.add(EnumChatFormatting.ITALIC + s); + } + + if(GeneralConfig.enableExtendedLogging) { + list.add(""); + list.add("Type: " + getMagType(stack)); + list.add("Is Reloading: " + getIsReloading(stack)); + list.add("Reload Cycle: " + getReloadCycle(stack)); + list.add("RoF Cooldown: " + getDelay(stack)); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { + + ItemGunBase gun = ((ItemGunBase)stack.getItem()); + GunConfiguration gcfg = gun.mainConfig; + + if(type == ElementType.HOTBAR) { + + FluidType fluid = this.getFluidType(stack); + + ItemStack ammo = ItemFluidIcon.make(fluid, 1); + + int count = ItemGunBase.getMag(stack); + int max = gcfg.ammoCap; + boolean showammo = gcfg.showAmmo; + + int dura = ItemGunBase.getItemWear(stack) * 50 / gcfg.durability; + + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo, count, max, dura, showammo); + } + + if(type == ElementType.CROSSHAIRS && GeneralConfig.enableCrosshairs) { + + event.setCanceled(true); + + if(!(gcfg.hasSights && player.isSneaking())) + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair()); + else + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, Crosshair.NONE); + } + } + + @Override + protected void reload2(ItemStack stack, World world, EntityPlayer player) { + this.setIsReloading(stack, false); + } + + public FluidType getFluidType(ItemStack stack) { + return Fluids.fromID(this.getMagType(stack)); + } + + public int getConsumption(ItemStack stack) { + return 3; + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return getFluidType(stack) == type || this.getMag(stack) == 0; + } + + public static final int transferSpeed = 50; + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + if(!acceptsFluid(type, stack)) + return amount; + + if(this.getMag(stack) == 0) + this.setMagType(stack, type.getID()); + + int fill = this.getMag(stack); + int req = this.mainConfig.ammoCap - fill; + + int toFill = Math.min(amount, req); + toFill = Math.min(toFill, transferSpeed); + + this.setMag(stack, fill + toFill); + + return amount - toFill; + } + + @Override + public boolean providesFluid(FluidType type, ItemStack stack) { + return getFluidType(stack) == type; + } + + @Override + public int tryEmpty(FluidType type, int amount, ItemStack stack) { + + int fill = this.getMag(stack); + int toUnload = Math.min(fill, amount); + toUnload = Math.min(toUnload, transferSpeed); + + this.setMag(stack, fill - toUnload); + + return toUnload; + } +} diff --git a/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java b/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java new file mode 100644 index 000000000..a9847e544 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemPlasmaSpear.java @@ -0,0 +1,173 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ISyncButtons; +import com.hbm.lib.ModDamageSource; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import api.hbm.fluid.IFillableItem; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EntityDamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.client.event.MouseEvent; + +public class ItemPlasmaSpear extends Item implements IFillableItem, ISyncButtons { + + public static final int maxFuel = 3_000; + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getFill(stack) < maxFuel; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1 - (double) getFill(stack) / (double) maxFuel; + } + + public int getFill(ItemStack stack) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + setFill(stack, maxFuel); + return maxFuel; + } + + return stack.stackTagCompound.getInteger("fuel"); + } + + public void setFill(ItemStack stack, int fill) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setInteger("fuel", fill); + } + + public static ItemStack getEmptyTool(Item item) { + ItemPlasmaSpear tool = (ItemPlasmaSpear) item; + ItemStack stack = new ItemStack(item); + tool.setFill(stack, 0); + return stack; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + if(world.isRemote) return stack; + + if(!stack.hasTagCompound()) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setBoolean("melee", !stack.stackTagCompound.getBoolean("melee")); + world.playSoundAtEntity(player, "random.orb", 0.25F, 1.25F); + + return stack; + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + + if(stack.hasTagCompound() && !stack.stackTagCompound.getBoolean("melee")) { + return true; //cancel hitting, it's ranged + } + + return false; + } + + @Override + public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { + + if(!(entityLiving instanceof EntityPlayerMP)) + return false; + + if(getFill(stack) <= 0) + return false; + + if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { + return true; //cancel hitting, it's ranged + } + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("type", "anim"); + nbt.setString("mode", "lSwing"); + PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + + return false; + } + + @Override + public boolean canReceiveMouse(EntityPlayer player, ItemStack stack, MouseEvent event, int button, boolean buttonstate) { + + if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("melee")) { + return false; + } + + if(button == 0) { + event.setCanceled(true); + return true; + } + + return false; + } + + @Override + public void receiveMouse(EntityPlayer player, ItemStack stack, int button, boolean buttonstate) { + Vec3 start = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight() - player.yOffset, player.posZ); + Vec3 look = player.getLookVec(); + Vec3 end = start.addVector(look.xCoord * 100, look.yCoord * 100, look.zCoord * 100); + + List targets = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, AxisAlignedBB.getBoundingBox( + Math.min(start.xCoord, end.xCoord), + Math.min(start.yCoord, end.yCoord), + Math.min(start.zCoord, end.zCoord), + Math.max(start.xCoord, end.xCoord), + Math.max(start.yCoord, end.yCoord), + Math.max(start.zCoord, end.zCoord) + )); + + for(Entity target : targets) { + + AxisAlignedBB aabb = target.boundingBox; + MovingObjectPosition hitMop = aabb.calculateIntercept(start, end); + + if(hitMop != null) { + target.attackEntityFrom(new EntityDamageSource(ModDamageSource.s_laser, player).setDamageBypassesArmor(), 15F); + } + } + } + + @Override + public boolean acceptsFluid(FluidType type, ItemStack stack) { + return type == Fluids.SCHRABIDIC; + } + + @Override + public int tryFill(FluidType type, int amount, ItemStack stack) { + + int fill = this.getFill(stack); + int toFill = this.maxFuel - fill; + toFill = Math.min(toFill, amount); + toFill = Math.min(toFill, 10); + + this.setFill(stack, fill + toFill); + + return amount - toFill; + } + + @Override public boolean providesFluid(FluidType type, ItemStack stack) { return false; } + @Override public int tryEmpty(FluidType type, int amount, ItemStack stack) { return 0; } +} diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index 242f67ceb..17cbe32fe 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -1,6 +1,6 @@ package com.hbm.lib; -import java.util.Random; +import java.util.HashMap; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; @@ -9,6 +9,10 @@ import com.hbm.items.machine.ItemBreedingRod.*; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.util.WeightedRandomChestContent; public class HbmChestContents { @@ -335,4 +339,65 @@ public class HbmChestContents { new WeightedRandomChestContent(ModItems.warhead_mirv, 0, 1, 1, 1), new WeightedRandomChestContent(ModItems.battery_schrabidium_cell, 0, 1, 1, 1), new WeightedRandomChestContent(ModItems.powder_nitan_mix, 0, 16, 32, 1) }; + + public static WeightedRandomChestContent[] officeTrash = new WeightedRandomChestContent[] { + //Meta, Min amount, Max amount, Weight + new WeightedRandomChestContent(Items.paper, 0, 1, 12, 10), + new WeightedRandomChestContent(Items.book, 0, 1, 3, 4), + new WeightedRandomChestContent(ModItems.twinkie, 0, 1, 2, 6), + new WeightedRandomChestContent(ModItems.coffee, 0, 1, 1, 4), + new WeightedRandomChestContent(ModItems.flame_politics, 0, 1, 1, 2), + new WeightedRandomChestContent(ModItems.ring_pull, 0, 1, 1, 4), + new WeightedRandomChestContent(ModItems.can_empty, 0, 1, 1, 2), + new WeightedRandomChestContent(ModItems.can_creature, 0, 1, 2, 2), + new WeightedRandomChestContent(ModItems.can_smart, 0, 1, 3, 2), + new WeightedRandomChestContent(ModItems.can_mrsugar, 0, 1, 2, 2), + new WeightedRandomChestContent(ModItems.book_guide, 3, 1, 1, 1), + new WeightedRandomChestContent(Item.getItemFromBlock(ModBlocks.deco_computer), 0, 1, 1, 1)}; + + /** Nowhere else to put this and this seems like the most fitting place **/ + public static ItemStack genetateBook(String key) { + + String author = resolve("book.lore." + key + ".author"); + String title = resolve("book.lore." + key + ".title"); + + ItemStack book = new ItemStack(Items.written_book); + book.stackTagCompound = new NBTTagCompound(); + book.stackTagCompound.setString("author", author); + book.stackTagCompound.setString("title", title); + NBTTagList nbt = new NBTTagList(); + + for(byte i = 1; i <= 50; i++) { + String unloc = "book.lore." + key + ".page" + i; + String page = resolve(unloc); + + if(page.equals(unloc)) + break; + else + nbt.appendTag(new NBTTagString(page)); + } + + book.stackTagCompound.setTag("pages", nbt); + + return book; + } + + private static String resolve(String key) { + String result = books.get(key); + return result != null ? result : key; + } + + private static HashMap books = new HashMap(); + + static { + books.put("book.lore.office0.title", "Letter of Resignation"); + books.put("book.lore.office0.author", "Kosma"); + books.put("book.lore.office0.page1", "Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and"); + books.put("book.lore.office0.page2", "it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass."); + books.put("book.lore.office0.page3", "I'm not coming back on Friday. Just send the paycheck."); + books.put("book.lore.office1.title", "Note"); + books.put("book.lore.office1.author", "Jonas"); + books.put("book.lore.office1.page1", null); + books.put("book.lore.office2.page2", null); + } } diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 242899b3e..4f2c9444f 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,8 +1,11 @@ package com.hbm.lib; -import com.hbm.world.worldgen.ComponentNTMFeatures; import com.hbm.world.worldgen.MapGenNTMFeatures; import com.hbm.world.worldgen.NTMWorldGenerator; +import com.hbm.world.worldgen.components.CivilianFeatures.*; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.OfficeFeatures.*; +import com.hbm.world.worldgen.components.RuinFeatures.*; import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; @@ -19,7 +22,7 @@ public class HbmWorld { //MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE"); //MapGenStructureIO.func_143031_a(StructureComponentTest.class, "HFR_COMPONENT"); MapGenStructureIO.registerStructure(MapGenNTMFeatures.Start.class, "NTMFeatures"); - ComponentNTMFeatures.registerNTMFeatures(); + registerNTMFeatures(); registerWorldGen(new HbmWorldGen(), 1); registerWorldGen(new NTMWorldGenerator(), 1); //Ideally, move everything over from HbmWorldGen to NTMWorldGenerator @@ -29,4 +32,21 @@ public class HbmWorld { public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability); } + + /** Register structures in MapGenStructureIO */ + public static void registerNTMFeatures() { + MapGenStructureIO.func_143031_a(NTMHouse1.class, "NTMHouse1"); + MapGenStructureIO.func_143031_a(NTMHouse2.class, "NTMHouse2"); + MapGenStructureIO.func_143031_a(NTMLab1.class, "NTMLab1"); + MapGenStructureIO.func_143031_a(NTMLab2.class, "NTMLab2"); + MapGenStructureIO.func_143031_a(NTMWorkshop1.class, "NTMWorkshop1"); + MapGenStructureIO.func_143031_a(NTMRuin1.class, "NTMRuin1"); + MapGenStructureIO.func_143031_a(NTMRuin2.class, "NTMRuin2"); + MapGenStructureIO.func_143031_a(NTMRuin3.class, "NTMRuin3"); + MapGenStructureIO.func_143031_a(NTMRuin4.class, "NTMRuin4"); + //aggggggggggg + MapGenStructureIO.func_143031_a(BasicHelipad.class, "NTMBasicHelipad"); + MapGenStructureIO.func_143031_a(RadioShack.class, "NTMRadioShack"); + MapGenStructureIO.func_143031_a(LargeOffice.class, "NTMLargeOffice"); + } } diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 6e13476dc..d9926e148 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -164,10 +164,8 @@ public class Library { return true; if((tileentity != null && (tileentity instanceof IFluidAcceptor || tileentity instanceof IFluidSource)) || - world.getBlock(x, y, z) == ModBlocks.dummy_port_flare || world.getBlock(x, y, z) == ModBlocks.dummy_port_fluidtank || world.getBlock(x, y, z) == ModBlocks.dummy_port_refinery || - world.getBlock(x, y, z) == ModBlocks.dummy_port_pumpjack || world.getBlock(x, y, z) == ModBlocks.dummy_port_turbofan || world.getBlock(x, y, z) == ModBlocks.reactor_hatch || world.getBlock(x, y, z) == ModBlocks.reactor_conductor || @@ -300,12 +298,12 @@ public class Library { return player.worldObj.func_147447_a(vec3, vec32, false, false, true); } - public static MovingObjectPosition rayTrace(EntityPlayer player, double length, float interpolation, boolean liquids, boolean entity, boolean allowZeroLength) { + public static MovingObjectPosition rayTrace(EntityPlayer player, double length, float interpolation, boolean allowLiquids, boolean disallowNonCollidingBlocks, boolean mopOnMiss) { Vec3 vec3 = getPosition(interpolation, player); vec3.yCoord += player.eyeHeight; Vec3 vec31 = player.getLook(interpolation); Vec3 vec32 = vec3.addVector(vec31.xCoord * length, vec31.yCoord * length, vec31.zCoord * length); - return player.worldObj.func_147447_a(vec3, vec32, liquids, entity, allowZeroLength); + return player.worldObj.func_147447_a(vec3, vec32, allowLiquids, disallowNonCollidingBlocks, mopOnMiss); } public static Vec3 getPosition(float interpolation, EntityPlayer player) { @@ -355,15 +353,6 @@ public class Library { power -= toCharge; battery.chargeBattery(slots[index], toCharge); - - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_desh && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_desh_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_schrabidium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_schrabidium_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_euphemium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_euphemium_charged); - if(slots[index] != null && slots[index].getItem() == ModItems.dynosphere_dineutronium && battery.getCharge(slots[index]) >= battery.getMaxCharge()) - slots[index] = new ItemStack(ModItems.dynosphere_dineutronium_charged); } return power; @@ -423,11 +412,6 @@ public class Library { { tileentity = worldObj.getTileEntity(((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetX, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetY, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetZ); } - //Gas Flare - if(block == ModBlocks.dummy_port_flare) - { - tileentity = worldObj.getTileEntity(((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetX, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetY, ((TileEntityDummy)worldObj.getTileEntity(x, y, z)).targetZ); - } //Turbofan if(block == ModBlocks.dummy_port_turbofan) { diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index 0c5e3ba5a..a477d929c 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -65,6 +65,8 @@ public class ModDamageSource extends DamageSource { public static final String s_immolator = "plasma"; public static final String s_cryolator = "ice"; public static final String s_laser = "laser"; + public static final String s_boil = "boil"; + public static final String s_acid = "acidPlayer"; public ModDamageSource(String p_i1566_1_) { super(p_i1566_1_); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 34aaffcb1..4b6627a13 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4312)"; + public static final String VERSION = "1.0.27 BETA (4389)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 87d1d7dde..dedc6be3e 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -139,7 +139,6 @@ public class ClientProxy extends ServerProxy { //test crap ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestRender.class, new RenderTestRender()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestBombAdvanced.class, new RenderTestBombAdvanced()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRotationTester.class, new RenderRotationTester()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityObjTester.class, new RendererObjTester()); //deco ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecoPoleSatelliteReceiver.class, new RenderPoleSatelliteReceiver()); @@ -262,7 +261,14 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceSteel.class, new RenderFurnaceSteel()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterOilburner.class, new RenderOilburner()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterElectric.class, new RenderElectricHeater()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStirling.class, new RenderStirling()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySawmill.class, new RenderSawmill()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrucible.class, new RenderCrucible()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeatBoiler.class, new RenderBoiler()); + //Foundry + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry()); //AMS ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSEmitter.class, new RenderAMSEmitter()); @@ -340,7 +346,9 @@ public class ClientProxy extends ServerProxy { Object renderer = iterator.next(); if(renderer instanceof IItemRendererProvider) { IItemRendererProvider prov = (IItemRendererProvider) renderer; - MinecraftForgeClient.registerItemRenderer(prov.getItemForRenderer(), prov.getRenderer()); + for(Item item : prov.getItemsForRenderer()) { + MinecraftForgeClient.registerItemRenderer(item, prov.getRenderer()); + } } } @@ -372,11 +380,11 @@ public class ClientProxy extends ServerProxy { //test crap - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_container), new ItemRenderTestContainer()); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_bomb_advanced), new ItemRenderTestBombAdvanced()); //templates MinecraftForgeClient.registerItemRenderer(ModItems.assembly_template, new ItemRenderTemplate()); MinecraftForgeClient.registerItemRenderer(ModItems.chemistry_template, new ItemRenderTemplate()); + MinecraftForgeClient.registerItemRenderer(ModItems.crucible_template, new ItemRenderTemplate()); //hot stuff MinecraftForgeClient.registerItemRenderer(ModItems.ingot_steel_dusted, new ItemRendererHot()); MinecraftForgeClient.registerItemRenderer(ModItems.ingot_chainsteel, new ItemRendererHot()); @@ -408,6 +416,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.diamond_gavel, new ItemRenderGavel()); MinecraftForgeClient.registerItemRenderer(ModItems.mese_gavel, new ItemRenderGavel()); MinecraftForgeClient.registerItemRenderer(ModItems.crucible, new ItemRenderCrucible()); + MinecraftForgeClient.registerItemRenderer(ModItems.chainsaw, new ItemRenderChainsaw()); //guns MinecraftForgeClient.registerItemRenderer(ModItems.gun_rpg, new ItemRenderRpg()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_karl, new ItemRenderRpg()); @@ -489,6 +498,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.detonator_laser, new ItemRenderDetonatorLaser()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_spas12, new ItemRenderWeaponSpas12()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_glass_cannon, new ItemRenderWeaponGlass()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_chemthrower, new ItemRenderWeaponChemthrower()); //multitool MinecraftForgeClient.registerItemRenderer(ModItems.multitool_dig, new ItemRenderMultitool()); MinecraftForgeClient.registerItemRenderer(ModItems.multitool_silk, new ItemRenderMultitool()); @@ -552,7 +562,10 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityRBMKDebris.class, new RenderRBMKDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); + RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryRocket.class, new RenderArtilleryRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); + RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); + RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); //grenades RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeGeneric.class, new RenderSnowball(ModItems.grenade_generic)); RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeStrong.class, new RenderSnowball(ModItems.grenade_strong)); @@ -732,7 +745,14 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderBlockSideRotation()); RenderingRegistry.registerBlockHandler(new RenderDiode()); RenderingRegistry.registerBlockHandler(new RenderBoxDuct()); + RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer)); + RenderingRegistry.registerBlockHandler(new RenderFoundryBasin()); + RenderingRegistry.registerBlockHandler(new RenderFoundryMold()); + RenderingRegistry.registerBlockHandler(new RenderFoundryChannel()); + RenderingRegistry.registerBlockHandler(new RenderFoundryTank()); + RenderingRegistry.registerBlockHandler(new RenderFoundryOutlet()); + RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite)); RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4)); @@ -1134,6 +1154,14 @@ public class ClientProxy extends ServerProxy { fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); } + + if("colordust".equals(data.getString("mode"))) { + + Block b = Blocks.wool; + fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); + fx.setRBGColorF(data.getFloat("r"), data.getFloat("g"), data.getFloat("b")); + ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); + } if(fx != null) { @@ -1602,6 +1630,7 @@ public class ClientProxy extends ServerProxy { if("anim".equals(type)) { + /* crucible deploy */ if("crucible".equals(data.getString("mode")) && player.getHeldItem() != null) { BusAnimation animation = new BusAnimation() @@ -1613,6 +1642,7 @@ public class ClientProxy extends ServerProxy { HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } + /* crucible swing */ if("cSwing".equals(data.getString("mode"))) { if(HbmAnimations.getRelevantTransformation("SWING_ROT")[0] == 0) { @@ -1634,6 +1664,51 @@ public class ClientProxy extends ServerProxy { HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); } } + + /* chainsaw swing */ + if("sSwing".equals(data.getString("mode")) || "lSwing".equals(data.getString("mode"))) { //temp for lance + + int forward = 150; + int sideways = 100; + int retire = 200; + + if(HbmAnimations.getRelevantAnim() == null) { + + BusAnimation animation = new BusAnimation() + .addBus("SWING_ROT", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(0, 0, 90, forward)) + .addKeyframe(new BusAnimationKeyframe(45, 0, 90, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))) + .addBus("SWING_TRANS", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(0, 0, 3, forward)) + .addKeyframe(new BusAnimationKeyframe(2, 0, 2, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))); + + + HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + + } else { + + double[] rot = HbmAnimations.getRelevantTransformation("SWING_ROT"); + double[] trans = HbmAnimations.getRelevantTransformation("SWING_TRANS"); + + if(System.currentTimeMillis() - HbmAnimations.getRelevantAnim().startMillis < 50) return; + + BusAnimation animation = new BusAnimation() + .addBus("SWING_ROT", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(rot[0], rot[1], rot[2], 0)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 90, forward)) + .addKeyframe(new BusAnimationKeyframe(45, 0, 90, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))) + .addBus("SWING_TRANS", new BusAnimationSequence() + .addKeyframe(new BusAnimationKeyframe(trans[0], trans[1], trans[2], 0)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 3, forward)) + .addKeyframe(new BusAnimationKeyframe(2, 0, 2, sideways)) + .addKeyframe(new BusAnimationKeyframe(0, 0, 0, retire))); + + HbmAnimations.hotbar[player.inventory.currentItem] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + } + } } if("tau".equals(type)) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 87b8ca254..6b1bbd525 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockGenericStairs; +import com.hbm.blocks.generic.BlockMultiSlab; import com.hbm.blocks.generic.BlockNTMFlower.EnumFlowerType; import com.hbm.config.GeneralConfig; import com.hbm.crafting.*; @@ -56,14 +58,23 @@ public class CraftingManager { GameRegistry.addRecipe(new RBMKFuelCraftingHandler()); GameRegistry.addRecipe(new MKUCraftingHandler()); GameRegistry.addRecipe(new ToolboxCraftingHandler()); + GameRegistry.addRecipe(new CargoShellCraftingHandler()); //TODO: find out what this actually did RecipeSorter.register("hbm:rbmk", RBMKFuelCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:toolbox", ToolboxCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); + RecipeSorter.register("hbm:cargo", CargoShellCraftingHandler.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); RecipeSorter.register("hbm:mku", MKUCraftingHandler.class, RecipeSorter.Category.SHAPED, "after:minecraft:shaped before:minecraft:shapeless"); } public static void AddCraftingRec() { + + for(Object[] array : BlockMultiSlab.recipeGen) { + addRecipeAuto(new ItemStack((Block) array[1], 6, (int) array[2]), new Object[] { "###", '#', (Block) array[0] }); + } + for(Object[] array : BlockGenericStairs.recipeGen) { + addRecipeAuto(new ItemStack((Block) array[2], 4), new Object[] { "# ", "## ", "###", '#', new ItemStack((Block) array[0], 1, (int) array[1]) }); + } addRecipeAuto(new ItemStack(ModItems.redstone_sword, 1), new Object[] { "R", "R", "S", 'R', REDSTONE.block(), 'S', KEY_STICK }); addRecipeAuto(new ItemStack(ModItems.big_sword, 1), new Object[] { "QIQ", "QIQ", "GSG", 'G', Items.gold_ingot, 'S', KEY_STICK, 'I', Items.iron_ingot, 'Q', Items.quartz}); @@ -199,7 +210,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.sphere_steel, 1), new Object[] { "PIP", "I I", "PIP", 'P', STEEL.plate(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.pedestal_steel, 1), new Object[] { "P P", "P P", "III", 'P', STEEL.plate(), 'I', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.lemon, 1), new Object[] { " D ", "DSD", " D ", 'D', KEY_YELLOW, 'S', "stone" }); - addRecipeAuto(new ItemStack(ModItems.blade_titanium, 4), new Object[] { "TP", "TP", "TT", 'P', TI.plate(), 'T', TI.ingot() }); + addRecipeAuto(new ItemStack(ModItems.blade_titanium, 2), new Object[] { "TP", "TP", "TT", 'P', TI.plate(), 'T', TI.ingot() }); addRecipeAuto(new ItemStack(ModItems.turbine_titanium, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_titanium, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.rotor_steel, 3), new Object[] { "CCC", "SSS", "CCC", 'C', ModItems.coil_gold, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModItems.generator_steel, 1), new Object[] { "RRR", "CCC", "SSS", 'C', ModItems.coil_gold_torus, 'S', STEEL.ingot(), 'R', ModItems.rotor_steel }); @@ -209,14 +220,17 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.shimmer_sledge, 1), new Object[] { "H", "G", "G", 'G', ModItems.shimmer_handle, 'H', ModItems.shimmer_head }); addRecipeAuto(new ItemStack(ModItems.shimmer_axe, 1), new Object[] { "H", "G", "G", 'G', ModItems.shimmer_handle, 'H', ModItems.shimmer_axe_head }); addRecipeAuto(new ItemStack(ModItems.definitelyfood, 1), new Object[] { "DDD", "SDS", "DDD", 'D', Blocks.dirt, 'S', STEEL.plate() }); - addRecipeAuto(new ItemStack(ModItems.blade_tungsten, 2), new Object[] { "IP", "TP", "TI", 'P', TI.plate(), 'T', TI.ingot(), 'I', W.ingot() }); addRecipeAuto(new ItemStack(ModItems.turbine_tungsten, 1), new Object[] { "BBB", "BSB", "BBB", 'B', ModItems.blade_tungsten, 'S', DURA.ingot() }); addRecipeAuto(new ItemStack(ModItems.ring_starmetal, 1), new Object[] { " S ", "S S", " S ", 'S', STAR.ingot() }); addRecipeAuto(new ItemStack(ModItems.flywheel_beryllium, 1), new Object[] { "BBB", "BTB", "BBB", 'B', BE.block(), 'T', ModItems.bolt_compound }); - + + addShapelessAuto(new ItemStack(ModItems.powder_poison), new Object[] { DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.NIGHTSHADE) }); + addShapelessAuto(new ItemStack(ModItems.syringe_metal_stimpak), new Object[] { ModItems.syringe_metal_empty, Items.carrot, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); //xander root and broc flower + addShapelessAuto(new ItemStack(ModItems.pill_herbal), new Object[] { COAL.dust(), Items.poisonous_potato, Items.nether_wart, DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.FOXGLOVE) }); addShapelessAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 1), new Object[] { Items.string, Items.string, Items.string }); addRecipeAuto(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.ROPE, 4), new Object[] { "W", "W", "W", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); addRecipeAuto(new ItemStack(ModItems.rag, 16), new Object[] { "WW", "WW", 'W', DictFrame.fromOne(ModBlocks.plant_flower, EnumFlowerType.WEED) }); + addRecipeAuto(new ItemStack(Items.paper, 3), new Object[] { "SSS", 'S', ModItems.powder_sawdust }); ItemStack infinity = new ItemStack(Items.enchanted_book); EnchantmentUtil.addEnchantment(infinity, Enchantment.infinity, 1); @@ -295,8 +309,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.muffler, 1), new Object[] { "III", "IWI", "III", 'I', ModItems.plate_polymer, 'W', Blocks.wool }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); addRecipeAuto(new ItemStack(ModItems.arc_electrode, 1), new Object[] { "C", "T", "C", 'C', GRAPHITE.ingot(), 'T', ModItems.bolt_tungsten }); addRecipeAuto(new ItemStack(ModItems.arc_electrode_desh, 1), new Object[] { "C", "T", "C", 'C', DESH.dust(), 'T', ModItems.arc_electrode }); @@ -591,13 +605,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.inf_water, 1), new Object[] { "222", "131", "222", '1', Items.water_bucket, '2', AL.plate(), '3', DIAMOND.gem() }); addRecipeAuto(new ItemStack(ModItems.inf_water_mk2, 1), new Object[] { "BPB", "PTP", "BPB", 'B', ModItems.inf_water, 'P', ModBlocks.fluid_duct, 'T', ModItems.tank_steel }); - - addRecipeAuto(new ItemStack(ModItems.dynosphere_base), new Object[] { "RPR", "PBP", "RPR", 'R', MINGRADE.dust(), 'P', STEEL.plate(), 'B', REDSTONE.block() }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_desh), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_desh_mix, 'P', DESH.ingot(), 'B', ModItems.dynosphere_base }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_schrabidium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_power, 'P', SA326.ingot(), 'B', ModItems.dynosphere_desh_charged }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_euphemium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_nitan_mix, 'P', EUPH.ingot(), 'B', ModItems.dynosphere_schrabidium_charged }); - addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.dynosphere_dineutronium), new Object[] { "RPR", "PBP", "RPR", 'R', ModItems.powder_spark_mix, 'P', DNT.ingot(), 'B', ModItems.dynosphere_euphemium_charged }); - //not so Temporary Crappy Recipes addRecipeAuto(new ItemStack(ModItems.piston_selenium, 1), new Object[] { "SSS", "STS", " D ", 'S', STEEL.plate(), 'T', W.ingot(), 'D', ModItems.bolt_dura_steel }); addShapelessAuto(new ItemStack(ModItems.catalyst_clay), new Object[] { IRON.dust(), Items.clay_ball }); @@ -672,6 +679,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.assembly_template, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.chemistry_template, 1, OreDictionary.WILDCARD_VALUE) }); + addShapelessAuto(new ItemStack(Items.paper, 1), new Object[] { new ItemStack(ModItems.crucible_template, 1, OreDictionary.WILDCARD_VALUE) }); addShapelessAuto(new ItemStack(Items.slime_ball, 16), new Object[] { new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.dye, 1, 15), Fluids.SULFURIC_ACID.getDict(1000) }); for(int i = 1; i < Fluids.getAll().length; ++i) { @@ -719,7 +727,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.sand_lead, 8), new Object[] { "sand", "sand", "sand", "sand", "sand", "sand", "sand", "sand", PB.dust() }); addShapelessAuto(new ItemStack(ModBlocks.sand_quartz, 1), new Object[] { "sand", "sand", NETHERQUARTZ.dust(), NETHERQUARTZ.dust() }); - addRecipeAuto(new ItemStack(ModItems.rune_blank, 1), new Object[] { "PSP", "SDS", "PSP", 'P', ModItems.powder_magic, 'S', STAR.ingot(), 'D', ModItems.dynosphere_dineutronium_charged }); + addRecipeAuto(new ItemStack(ModItems.rune_blank, 1), new Object[] { "PSP", "SDS", "PSP", 'P', ModItems.powder_magic, 'S', STAR.ingot(), 'D', KEY_CIRCUIT_BISMUTH }); addShapelessAuto(new ItemStack(ModItems.rune_isa, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity_counter_resonant }); addShapelessAuto(new ItemStack(ModItems.rune_dagaz, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity }); addShapelessAuto(new ItemStack(ModItems.rune_hagalaz, 1), new Object[] { ModItems.rune_blank, ModItems.powder_spark_mix, ModItems.singularity_super_heated }); @@ -899,6 +907,9 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.charger, 16), new Object[] { "G", "S", "C", 'G', Blocks.glowstone, 'S', STEEL.block(), 'C', ModItems.coil_copper_torus }); addRecipeAuto(new ItemStack(ModBlocks.press_preheater), new Object[] { "CCC", "SLS", "TST", 'C', ModItems.board_copper, 'S', Blocks.stone, 'L', Fluids.LAVA.getDict(1000), 'T', W.ingot() }); addRecipeAuto(new ItemStack(ModItems.fluid_identifier_multi), new Object[] { "D", "C", "P", 'D', "dye", 'C', ModItems.circuit_aluminium, 'P', ANY_PLASTIC.ingot() }); + + addShapelessAuto(ItemBattery.getEmptyBattery(ModItems.anchor_remote), new Object[] { DIAMOND.gem(), ModItems.ducttape, ModItems.circuit_red_copper }); + addRecipeAuto(new ItemStack(ModBlocks.teleanchor), new Object[] { "ODO", "EAE", "ODO", 'O', Blocks.obsidian, 'D', DIAMOND.gem(), 'E', ModItems.powder_magic, 'A', ModItems.gem_alexandrite }); addShapelessAuto(new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_RESTORED.ordinal()), new Object[] { new ItemStack(ModItems.holotape_image, 1, EnumHoloImage.HOLO_DIGAMMA.ordinal()), KEY_TOOL_SCREWDRIVER, ModItems.ducttape, ModItems.armor_polish }); addShapelessAuto(new ItemStack(ModItems.holotape_damaged), new Object[] { DictFrame.fromOne(ModItems.holotape_image, EnumHoloImage.HOLO_RESTORED), ModBlocks.muffler, ModItems.crt_display, ModItems.gem_alexandrite /* placeholder for amplifier */ }); @@ -940,6 +951,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.crane_boxer), new Object[] { "WWW", "WPW", "CCC", 'W', KEY_PLANKS, 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'C', ModBlocks.conveyor }); addRecipeAuto(new ItemStack(ModBlocks.crane_unboxer), new Object[] { "WWW", "WPW", "CCC", 'W', KEY_STICK, 'P', Items.shears, 'C', ModBlocks.conveyor }); + addRecipeAuto(new ItemStack(ModBlocks.crane_router), new Object[] { "PIP", "ICI", "PIP", 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'I', ModItems.plate_polymer, 'C', ModItems.circuit_copper }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1), new Object[] { ModItems.ingot_chainsteel, ASBESTOS.ingot(), ModItems.gem_alexandrite }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER1, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2) }); @@ -947,7 +959,18 @@ public class CraftingManager { addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER2, 3), new Object[] { DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER3) }); addShapelessAuto(DictFrame.fromOne(ModItems.parts_legendary, EnumLegendaryType.TIER3), new Object[] { ModItems.ingot_chainsteel, ModItems.ingot_smore, ModItems.gem_alexandrite, ModItems.gem_alexandrite, ModItems.gem_alexandrite }); - addRecipeAuto(new ItemStack(ModItems.gear_large, 1), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); + addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 0), new Object[] { "III", "ICI", "III", 'I', IRON.plate(), 'C', CU.ingot()}); + addRecipeAuto(new ItemStack(ModItems.gear_large, 1, 1), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', TI.ingot()}); + addRecipeAuto(new ItemStack(ModItems.sawblade), new Object[] { "III", "ICI", "III", 'I', STEEL.plate(), 'C', IRON.ingot()}); + + addRecipeAuto(new ItemStack(ModBlocks.foundry_basin), new Object[] { "B B", "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_mold), new Object[] { "B B", "BSB", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_channel, 4), new Object[] { "B B", " S ", 'B', ModItems.ingot_firebrick, 'S', Blocks.stone_slab }); + addRecipeAuto(new ItemStack(ModBlocks.foundry_tank), new Object[] { "B B", "I I", "BSB", 'B', ModItems.ingot_firebrick, 'I', STEEL.ingot(), 'S', Blocks.stone_slab }); + addShapelessAuto(new ItemStack(ModBlocks.foundry_outlet), new Object[] { ModBlocks.foundry_channel, STEEL.plate() }); + addRecipeAuto(new ItemStack(ModItems.mold_base), new Object[] { " B ", "BIB", " B ", 'B', ModItems.ingot_firebrick, 'I', IRON.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.brick_fire), new Object[] { "BB", "BB", 'B', ModItems.ingot_firebrick }); + addShapelessAuto(new ItemStack(ModItems.ingot_firebrick, 4), new Object[] { ModBlocks.brick_fire }); addShapelessAuto(new ItemStack(ModItems.upgrade_5g), new Object[] { ModItems.upgrade_template, ModItems.gem_alexandrite }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e3320f138..2c083f13f 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -42,13 +42,13 @@ import org.apache.logging.log4j.Logger; import com.google.common.collect.ImmutableList; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockMotherOfAllOres; +import com.hbm.commands.CommandReloadRecipes; import com.hbm.config.*; import com.hbm.creativetabs.*; import com.hbm.entity.EntityMappings; import com.hbm.entity.grenade.*; import com.hbm.entity.logic.*; import com.hbm.entity.mob.siege.*; -import com.hbm.entity.qic.EntitySPV; import com.hbm.handler.*; import com.hbm.handler.imc.*; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -70,6 +70,7 @@ import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.machine.*; import com.hbm.tileentity.machine.rbmk.RBMKDials; import com.hbm.util.ArmorUtil; +import com.hbm.util.SuicideThreadDump; import com.hbm.world.feature.*; import com.hbm.world.generator.CellularDungeonFactory; @@ -83,7 +84,6 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; @@ -744,6 +744,7 @@ public class MainRegistry { BobmazonOfferFactory.init(); OreDictManager.registerOres(); + IMCHandler.registerHandler("blastfurnace", new IMCBlastFurnace()); IMCHandler.registerHandler("crystallizer", new IMCCrystallizer()); IMCHandler.registerHandler("centrifuge", new IMCCentrifuge()); } @@ -767,16 +768,10 @@ public class MainRegistry { @EventHandler public static void PostLoad(FMLPostInitializationEvent PostEvent) { - ShredderRecipes.registerShredder(); - ShredderRecipes.registerOverrides(); CrystallizerRecipes.register(); - CentrifugeRecipes.register(); TileEntityNukeFurnace.registerFuels(); BreederRecipes.registerRecipes(); AssemblerRecipes.loadRecipes(); - //ChemplantRecipes.register(); moved to SerializableRecipe - CyclotronRecipes.register(); - //HadronRecipes.register(); moved to SerializableRecipe MagicRecipes.register(); SILEXRecipes.register(); AnvilRecipes.register(); @@ -814,6 +809,8 @@ public class MainRegistry { new OreCave(ModBlocks.stone_resource, 0).setThreshold(1.5D).setRangeMult(20).setYLevel(30).setMaxRange(20).withFluid(ModBlocks.sulfuric_acid_block); //sulfur new OreCave(ModBlocks.stone_resource, 1).setThreshold(1.75D).setRangeMult(20).setYLevel(25).setMaxRange(20); //asbestos //new OreLayer(Blocks.coal_ore, 0.2F).setThreshold(4).setRangeMult(3).setYLevel(70); + + SuicideThreadDump.register(); } @EventHandler @@ -849,6 +846,7 @@ public class MainRegistry { World world = event.getServer().getEntityWorld(); RBMKDials.createDials(world); SiegeOrchestrator.createGameRules(world); + event.registerServerCommand(new CommandReloadRecipes()); } private void loadConfig(FMLPreInitializationEvent event) { @@ -865,6 +863,19 @@ public class MainRegistry { ToolConfig.loadFromConfig(config); WeaponConfig.loadFromConfig(config); MobConfig.loadFromConfig(config); + StructureConfig.loadFromConfig(config); + + try { + if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.Thermos") != null) { + throw new IllegalStateException("The mod tried to start on a Thermos server and therefore stopped. To allow the server to start on Thermos, change the appropriate " + + "config entry (0.00 in hbm.cfg). This was done because, by default, Thermos " + + "uses a so-called \"optimization\" feature that reduces tile ticking a lot, which will inevitably break a lot of machines. Most people aren't even aware " + + "of this, and start blaming random mods for all their stuff breaking. In order to adjust or even disable this feature, edit \"tileentities.yml\" in your " + + "Thermos install folder. If you believe that crashing the server until a config option is changed is annoying, then I would agree, but it's still preferable " + + "over wasting hours trying to fix an issue that is really just an \"intended feature\" added by Thermos itself, and not a bug in the mod. You'll have to " + + "change Thermos' config anyway so that extra change in NTM's config can't be that big of a burden."); + } + } catch(ClassNotFoundException e) { } config.save(); } @@ -915,6 +926,56 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.sellafield_core"); ignoreMappings.add("hbm:tile.fusion_core"); ignoreMappings.add("hbm:tile.machine_telelinker"); + ignoreMappings.add("hbm:item.dynosphere_base"); + ignoreMappings.add("hbm:item.dynosphere_desh"); + ignoreMappings.add("hbm:item.dynosphere_desh_charged"); + ignoreMappings.add("hbm:item.dynosphere_schrabidium"); + ignoreMappings.add("hbm:item.dynosphere_schrabidium_charged"); + ignoreMappings.add("hbm:item.dynosphere_euphemium"); + ignoreMappings.add("hbm:item.dynosphere_euphemium_charged"); + ignoreMappings.add("hbm:item.dynosphere_dineutronium"); + ignoreMappings.add("hbm:item.dynosphere_dineutronium_charged"); + ignoreMappings.add("hbm:item.factory_core_titanium"); + ignoreMappings.add("hbm:item.factory_core_advanced"); + ignoreMappings.add("hbm:tile.factory_titanium_core"); + ignoreMappings.add("hbm:tile.factory_advanced_core"); + ignoreMappings.add("hbm:tile.factory_titanium_conductor"); + ignoreMappings.add("hbm:tile.factory_advanced_conductor"); + ignoreMappings.add("hbm:tile.factory_titanium_furnace"); + ignoreMappings.add("hbm:tile.factory_advanced_furnace"); + ignoreMappings.add("hbm:tile.turret_light"); + ignoreMappings.add("hbm:tile.turret_heavy"); + ignoreMappings.add("hbm:tile.turret_rocket"); + ignoreMappings.add("hbm:tile.turret_flamer"); + ignoreMappings.add("hbm:tile.turret_tau"); + ignoreMappings.add("hbm:tile.turret_cwis"); + ignoreMappings.add("hbm:item.turret_light_ammo"); + ignoreMappings.add("hbm:item.turret_heavy_ammo"); + ignoreMappings.add("hbm:item.turret_rocket_ammo"); + ignoreMappings.add("hbm:item.turret_flamer_ammo"); + ignoreMappings.add("hbm:item.turret_tau_ammo"); + ignoreMappings.add("hbm:item.turret_cwis_ammo"); + ignoreMappings.add("hbm:tile.cel_prime"); + ignoreMappings.add("hbm:tile.cel_prime_terminal"); + ignoreMappings.add("hbm:tile.cel_prime_battery"); + ignoreMappings.add("hbm:tile.cel_prime_port"); + ignoreMappings.add("hbm:tile.cel_prime_tanks"); + ignoreMappings.add("hbm:tile.rf_cable"); + ignoreMappings.add("hbm:tile.test_container"); + ignoreMappings.add("hbm:tile.test_bb_bork"); + ignoreMappings.add("hbm:tile.test_bb_inf"); + ignoreMappings.add("hbm:tile.test_missile"); + ignoreMappings.add("hbm:tile.rotation_tester"); + ignoreMappings.add("hbm:tile.test_ticker"); + ignoreMappings.add("hbm:tile.dummy_block_flare"); + ignoreMappings.add("hbm:tile.dummy_port_flare"); + ignoreMappings.add("hbm:tile.dummy_block_chemplant"); + ignoreMappings.add("hbm:tile.dummy_port_chemplant"); + ignoreMappings.add("hbm:tile.dummy_block_pumpjack"); + ignoreMappings.add("hbm:tile.dummy_port_pumpjack"); + ignoreMappings.add("hbm:tile.dummy_block_radgen"); + ignoreMappings.add("hbm:tile.dummy_port_radgen"); + ignoreMappings.add("hbm:tile.test_conductor"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index f0f346ffc..177ec8055 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -1336,7 +1336,7 @@ public class ModEventHandler { private static final String hash = "41eb77f138ce350932e33b6b26b233df9aad0c0c80c6a49cb9a54ddd8fae3f83"; - @SubscribeEvent + //@SubscribeEvent public void onClickSign(PlayerInteractEvent event) { int x = event.x; diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index ca1f2767e..9f713ec5c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1,9 +1,11 @@ package com.hbm.main; +import java.lang.reflect.Method; import java.util.List; import java.util.Random; import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import com.hbm.blocks.ILookOverlay; @@ -23,6 +25,7 @@ import com.hbm.interfaces.IItemHUD; import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; +import com.hbm.items.ISyncButtons; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; @@ -34,6 +37,7 @@ import com.hbm.lib.RefStrings; import com.hbm.packet.AuxButtonPacket; import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.SyncButtonsPacket; import com.hbm.render.anim.HbmAnimations; import com.hbm.render.anim.HbmAnimations.Animation; import com.hbm.render.block.ct.CTStitchReceiver; @@ -55,6 +59,9 @@ import com.hbm.tileentity.machine.TileEntityNukeFurnace; import com.hbm.util.I18nUtil; import com.hbm.util.ItemStackUtil; import com.hbm.util.LoggingUtil; +import com.hbm.wiaj.GuiWorldInAJar; +import com.hbm.wiaj.cannery.CanneryBase; +import com.hbm.wiaj.cannery.Jars; import com.hbm.util.ArmorRegistry; import com.hbm.util.ArmorUtil; import com.hbm.util.ArmorRegistry.HazardClass; @@ -66,18 +73,20 @@ import api.hbm.item.IClickReceiver; import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; @@ -85,6 +94,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; +import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; @@ -145,8 +155,14 @@ public class ModEventHandlerClient { World world = mc.theWorld; MovingObjectPosition mop = mc.objectMouseOver; - if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK && world.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILookOverlay) { - ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK ) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ILookOverlay) { + ((ILookOverlay) player.getHeldItem().getItem()).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + + } else if(world.getBlock(mop.blockX, mop.blockY, mop.blockZ) instanceof ILookOverlay) { + ((ILookOverlay) world.getBlock(mop.blockX, mop.blockY, mop.blockZ)).printHook(event, world, mop.blockX, mop.blockY, mop.blockZ); + } } /*if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { @@ -420,6 +436,14 @@ public class ModEventHandlerClient { item.startActionClient(player.getHeldItem(), player.worldObj, player, false); } } + + if(held instanceof ISyncButtons) { + ISyncButtons rec = (ISyncButtons) held; + + if(rec.canReceiveMouse(player, player.getHeldItem(), event, event.button, event.buttonstate)) { + PacketDispatcher.wrapper.sendToServer(new SyncButtonsPacket(event.buttonstate, event.button)); + } + } } } @@ -612,6 +636,20 @@ public class ModEventHandlerClient { if(entry.entry == EnumEntryType.MULT) list.add(EnumChatFormatting.GOLD + "Adds multiplier " + entry.value + " to the custom nuke stage " + entry.type); } + + CanneryBase cannery = Jars.canneries.get(comp); + if(cannery != null) { + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("cannery.f1")); + } + + /*ItemStack copy = stack.copy(); + List materials = Mats.getMaterialsFromItem(copy); + + if(!materials.isEmpty()) { + for(MaterialStack mat : materials) { + list.add(EnumChatFormatting.DARK_PURPLE + mat.material.names[0] + ": " + Mats.formatAmount(mat.amount * stack.stackSize)); + } + }*/ } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); @@ -721,6 +759,40 @@ public class ModEventHandlerClient { MainRegistry.proxy.displayTooltip(EnumChatFormatting.RED + "Your mask has no filter!", MainRegistry.proxy.ID_FILTER); } } + + if(mc.currentScreen instanceof GuiContainer && Keyboard.isKeyDown(Keyboard.KEY_F1)) { + + ScaledResolution scaledresolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / mc.displayWidth; + int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1; + + GuiContainer container = (GuiContainer) mc.currentScreen; + + for(Object o : container.inventorySlots.inventorySlots) { + Slot slot = (Slot) o; + + if(slot.getHasStack()) { + try { + Method isMouseOverSlot = ReflectionHelper.findMethod(GuiContainer.class, container, new String[] {"func_146981_a", "isMouseOverSlot"}, Slot.class, int.class, int.class); + + if((boolean) isMouseOverSlot.invoke(container, slot, mouseX, mouseY)) { + + ComparableStack comp = new ComparableStack(slot.getStack()).makeSingular(); + CanneryBase cannery = Jars.canneries.get(comp); + + if(cannery != null) { + FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getName(), cannery.getIcon())); + } + + break; + } + + } catch(Exception ex) { } + } + } + } } @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 0b79f4212..b00972255 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -14,8 +14,9 @@ import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.IHighlightHandler; import codechicken.nei.api.ItemInfo.Layout; +import codechicken.nei.recipe.ICraftingHandler; +import codechicken.nei.recipe.IUsageHandler; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; @@ -25,66 +26,42 @@ public class NEIConfig implements IConfigureNEI { @Override public void loadConfig() { - API.registerRecipeHandler(new AlloyFurnaceRecipeHandler()); - API.registerUsageHandler(new AlloyFurnaceRecipeHandler()); - API.registerRecipeHandler(new CentrifugeRecipeHandler()); - API.registerUsageHandler(new CentrifugeRecipeHandler()); - API.registerRecipeHandler(new GasCentrifugeRecipeHandler()); - API.registerUsageHandler(new GasCentrifugeRecipeHandler()); - API.registerRecipeHandler(new BreederRecipeHandler()); - API.registerUsageHandler(new BreederRecipeHandler()); - API.registerRecipeHandler(new ShredderRecipeHandler()); - API.registerUsageHandler(new ShredderRecipeHandler()); - API.registerRecipeHandler(new CMBFurnaceRecipeHandler()); - API.registerUsageHandler(new CMBFurnaceRecipeHandler()); - API.registerRecipeHandler(new CyclotronRecipeHandler()); - API.registerUsageHandler(new CyclotronRecipeHandler()); - API.registerRecipeHandler(new AssemblerRecipeHandler()); - API.registerUsageHandler(new AssemblerRecipeHandler()); - API.registerRecipeHandler(new RefineryRecipeHandler()); - API.registerUsageHandler(new RefineryRecipeHandler()); - API.registerRecipeHandler(new BoilerRecipeHandler()); - API.registerUsageHandler(new BoilerRecipeHandler()); - API.registerRecipeHandler(new ChemplantRecipeHandler()); - API.registerUsageHandler(new ChemplantRecipeHandler()); - API.registerRecipeHandler(new FluidRecipeHandler()); - API.registerUsageHandler(new FluidRecipeHandler()); - API.registerRecipeHandler(new PressRecipeHandler()); - API.registerUsageHandler(new PressRecipeHandler()); - API.registerRecipeHandler(new CrystallizerRecipeHandler()); - API.registerUsageHandler(new CrystallizerRecipeHandler()); - API.registerRecipeHandler(new BookRecipeHandler()); - API.registerUsageHandler(new BookRecipeHandler()); - API.registerRecipeHandler(new FusionRecipeHandler()); - API.registerUsageHandler(new FusionRecipeHandler()); - API.registerRecipeHandler(new HadronRecipeHandler()); - API.registerUsageHandler(new HadronRecipeHandler()); - API.registerRecipeHandler(new SILEXRecipeHandler()); - API.registerUsageHandler(new SILEXRecipeHandler()); - API.registerRecipeHandler(new SmithingRecipeHandler()); - API.registerUsageHandler(new SmithingRecipeHandler()); - API.registerRecipeHandler(new AnvilRecipeHandler()); - API.registerUsageHandler(new AnvilRecipeHandler()); - API.registerRecipeHandler(new FuelPoolHandler()); - API.registerUsageHandler(new FuelPoolHandler()); - API.registerRecipeHandler(new RadiolysisRecipeHandler()); - API.registerUsageHandler(new RadiolysisRecipeHandler()); + registerHandler(new AlloyFurnaceRecipeHandler()); + registerHandler(new CentrifugeRecipeHandler()); + registerHandler(new GasCentrifugeRecipeHandler()); + registerHandler(new BreederRecipeHandler()); + registerHandler(new ShredderRecipeHandler()); + registerHandler(new CMBFurnaceRecipeHandler()); + registerHandler(new CyclotronRecipeHandler()); + registerHandler(new AssemblerRecipeHandler()); + registerHandler(new RefineryRecipeHandler()); + registerHandler(new BoilerRecipeHandler()); + registerHandler(new ChemplantRecipeHandler()); + registerHandler(new FluidRecipeHandler()); + registerHandler(new PressRecipeHandler()); + registerHandler(new CrystallizerRecipeHandler()); + registerHandler(new BookRecipeHandler()); + registerHandler(new FusionRecipeHandler()); + registerHandler(new HadronRecipeHandler()); + registerHandler(new SILEXRecipeHandler()); + registerHandler(new SmithingRecipeHandler()); + registerHandler(new AnvilRecipeHandler()); + registerHandler(new FuelPoolHandler()); + registerHandler(new RadiolysisRecipeHandler()); + registerHandler(new CrucibleSmeltingHandler()); + registerHandler(new CrucibleAlloyingHandler()); + registerHandler(new CrucibleCastingHandler()); + registerHandler(new ChunkyHandler()); //universal boyes - API.registerRecipeHandler(new ZirnoxRecipeHandler()); - API.registerUsageHandler(new ZirnoxRecipeHandler()); + registerHandler(new ZirnoxRecipeHandler()); if(VersatileConfig.rtgDecay()) { - API.registerRecipeHandler(new RTGRecipeHandler()); - API.registerUsageHandler(new RTGRecipeHandler()); + registerHandler(new RTGRecipeHandler()); } - API.registerRecipeHandler(new LiquefactionHandler()); - API.registerUsageHandler(new LiquefactionHandler()); - API.registerRecipeHandler(new SolidificationHandler()); - API.registerUsageHandler(new SolidificationHandler()); - API.registerRecipeHandler(new CrackingHandler()); - API.registerUsageHandler(new CrackingHandler()); - API.registerRecipeHandler(new FractioningHandler()); - API.registerUsageHandler(new FractioningHandler()); + registerHandler(new LiquefactionHandler()); + registerHandler(new SolidificationHandler()); + registerHandler(new CrackingHandler()); + registerHandler(new FractioningHandler()); //Some things are even beyond my control...or are they? API.hideItem(ItemBattery.getEmptyBattery(ModItems.memory)); @@ -102,8 +79,11 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModBlocks.statue_elb_f)); API.hideItem(new ItemStack(ModBlocks.cheater_virus)); API.hideItem(new ItemStack(ModBlocks.cheater_virus_seed)); + API.hideItem(new ItemStack(ModBlocks.transission_hatch)); API.hideItem(new ItemStack(ModItems.euphemium_kit)); API.hideItem(new ItemStack(ModItems.bobmazon_hidden)); + API.hideItem(new ItemStack(ModItems.coin_siege)); + API.hideItem(new ItemStack(ModItems.source)); if(MainRegistry.polaroidID != 11) { API.hideItem(new ItemStack(ModItems.book_secret)); API.hideItem(new ItemStack(ModItems.book_of_)); @@ -111,33 +91,25 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModItems.ams_core_thingy)); } API.hideItem(new ItemStack(ModBlocks.dummy_block_assembler)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_chemplant)); API.hideItem(new ItemStack(ModBlocks.dummy_block_drill)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_flare)); API.hideItem(new ItemStack(ModBlocks.dummy_block_fluidtank)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_pumpjack)); API.hideItem(new ItemStack(ModBlocks.dummy_block_refinery)); API.hideItem(new ItemStack(ModBlocks.dummy_block_turbofan)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_base)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_emitter)); API.hideItem(new ItemStack(ModBlocks.dummy_block_ams_limiter)); - API.hideItem(new ItemStack(ModBlocks.dummy_block_radgen)); API.hideItem(new ItemStack(ModBlocks.dummy_block_vault)); API.hideItem(new ItemStack(ModBlocks.dummy_block_blast)); API.hideItem(new ItemStack(ModBlocks.dummy_block_uf6)); API.hideItem(new ItemStack(ModBlocks.dummy_block_puf6)); API.hideItem(new ItemStack(ModBlocks.dummy_port_assembler)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_chemplant)); API.hideItem(new ItemStack(ModBlocks.dummy_port_drill)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_flare)); API.hideItem(new ItemStack(ModBlocks.dummy_port_fluidtank)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_pumpjack)); API.hideItem(new ItemStack(ModBlocks.dummy_port_refinery)); API.hideItem(new ItemStack(ModBlocks.dummy_port_turbofan)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_base)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_emitter)); API.hideItem(new ItemStack(ModBlocks.dummy_port_ams_limiter)); - API.hideItem(new ItemStack(ModBlocks.dummy_port_radgen)); API.hideItem(new ItemStack(ModBlocks.dummy_port_compact_launcher)); API.hideItem(new ItemStack(ModBlocks.dummy_port_launch_table)); API.hideItem(new ItemStack(ModBlocks.dummy_plate_compact_launcher)); @@ -175,6 +147,11 @@ public class NEIConfig implements IConfigureNEI { }); } + + public static void registerHandler(Object o) { + API.registerRecipeHandler((ICraftingHandler) o); + API.registerUsageHandler((IUsageHandler) o); + } @Override public String getName() { diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index f0d4128a2..b2ff87ce0 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -60,9 +60,14 @@ public class ResourceManager { //Heaters public static final IModelCustom heater_firebox = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj")); public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")); + public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false); //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); + public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); + public static final IModelCustom crucible_heat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/crucible.obj")); + public static final IModelCustom boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler.obj")); + public static final IModelCustom boiler_burst = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler_burst.obj")); //Furnaces public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj")); @@ -141,7 +146,7 @@ public class ResourceManager { public static final IModelCustom tank = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tank.obj")); //Centrifuge - public static final IModelCustom centrifuge_new = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/centrifuge_new.obj")); + public static final IModelCustom centrifuge = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/centrifuge.obj")); public static final IModelCustom gascent = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/gascent.obj")); public static final IModelCustom silex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/silex.obj")); public static final IModelCustom fel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fel.obj")); @@ -379,9 +384,14 @@ public class ResourceManager { //Heaters public static final ResourceLocation heater_firebox_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/firebox.png"); public static final ResourceLocation heater_oilburner_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/oilburner.png"); + public static final ResourceLocation heater_electric_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/electric_heater.png"); //Heat Engines public static final ResourceLocation stirling_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling.png"); + public static final ResourceLocation stirling_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/stirling_steel.png"); + public static final ResourceLocation sawmill_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/sawmill.png"); + public static final ResourceLocation crucible_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/crucible_heat.png"); + public static final ResourceLocation boiler_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/boiler.png"); //Furnaces public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png"); @@ -462,7 +472,7 @@ public class ResourceManager { public static final ResourceLocation puf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/PUF6Tank.png"); //Centrifuge - public static final ResourceLocation centrifuge_new_tex = new ResourceLocation(RefStrings.MODID, "textures/models/centrifuge_new.png"); + public static final ResourceLocation centrifuge_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/centrifuge.png"); public static final ResourceLocation gascent_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/gascent.png"); public static final ResourceLocation fel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fel.png"); public static final ResourceLocation silex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/silex.png"); @@ -654,6 +664,7 @@ public class ResourceManager { public static final IModelCustom pch = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/pch.obj")); public static final IModelCustom gavel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/gavel.obj")); public static final IModelCustom crucible = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/crucible.obj")); + public static final IModelCustom chainsaw = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chainsaw.obj"), false); public static final IModelCustom brimstone = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/brimstone.obj")); public static final IModelCustom hk69 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/hk69.obj")); @@ -683,6 +694,7 @@ public class ResourceManager { public static final IModelCustom nightmare_dark = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/nightmare_dark.obj")); public static final IModelCustom glass_cannon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/glass_cannon.obj")); public static final IModelCustom bio_revolver = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/bio_revolver.obj")); + public static final IModelCustom chemthrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chemthrower.obj")).asDisplayList(); public static final IModelCustom lance = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lance.obj")); @@ -721,6 +733,7 @@ public class ResourceManager { public static final ResourceLocation crucible_hilt = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_hilt.png"); public static final ResourceLocation crucible_guard = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_guard.png"); public static final ResourceLocation crucible_blade = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/crucible_blade.png"); + public static final ResourceLocation chainsaw_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/chainsaw.png"); public static final ResourceLocation brimstone_tex = new ResourceLocation(RefStrings.MODID, "textures/models/brimstone.png"); public static final ResourceLocation hk69_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/hk69.png"); @@ -760,6 +773,7 @@ public class ResourceManager { public static final ResourceLocation spas_12_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/spas-12.png"); public static final ResourceLocation glass_cannon_panel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/glass_cannon_panel.png"); public static final ResourceLocation bio_revolver_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/bio_revolver.png"); + public static final ResourceLocation chemthrower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/chemthrower.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); @@ -1240,6 +1254,8 @@ public class ResourceManager { public static final IModelCustom pipe_quad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_quad.obj")); public static final IModelCustom pipe_frame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_frame.obj")); + public static final IModelCustom deco_computer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/puter.obj")); + public static final IModelCustom rbmk_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_element.obj")); public static final IModelCustom rbmk_reflector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_reflector.obj")); public static final IModelCustom rbmk_rods = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_rods.obj")); diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 9d4696405..47aadfd5a 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -26,6 +26,7 @@ public class ServerProxy { public static final int ID_DETONATOR = 6; public static final int ID_FLUID_ID = 7; public static final int ID_GUN_MODE = 8; + public static final int ID_GAS_HAZARD = 9; public void registerRenderInfo() { } public void registerTileEntitySpecialRenderer() { } diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java index bde47b864..5a5d4e514 100644 --- a/src/main/java/com/hbm/module/ModulePatternMatcher.java +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -133,6 +133,8 @@ public class ModulePatternMatcher { for(int i = 0; i < modes.length; i++) { if(nbt.hasKey("mode" + i)) { modes[i] = nbt.getString("mode" + i); + } else { + modes[i] = null; } } } diff --git a/src/main/java/com/hbm/packet/ItemFolderPacket.java b/src/main/java/com/hbm/packet/ItemFolderPacket.java index 14b9671b2..d585db46b 100644 --- a/src/main/java/com/hbm/packet/ItemFolderPacket.java +++ b/src/main/java/com/hbm/packet/ItemFolderPacket.java @@ -6,6 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; import com.hbm.items.machine.ItemChemistryTemplate; +import com.hbm.items.machine.ItemCrucibleTemplate; import com.hbm.items.machine.ItemFluidIdentifier; import com.hbm.util.InventoryUtil; @@ -85,6 +86,10 @@ public class ItemFolderPacket implements IMessage { tryMakeItem(p, stack, Items.paper, "dye"); return null; } + if(stack.getItem() instanceof ItemCrucibleTemplate) { + tryMakeItem(p, stack, Items.paper, "dye"); + return null; + } if(stack.getItem() instanceof ItemCassette) { tryMakeItem(p, stack, ModItems.plate_polymer, "plateSteel"); return null; diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 26b8fe391..f426fca8b 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -101,6 +101,8 @@ public class PacketDispatcher { wrapper.registerMessage(ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.Handler.class, ExplosionVanillaNewTechnologyCompressedAffectedBlockPositionDataForClientEffectsAndParticleHandlingPacket.class, i++, Side.CLIENT); //Packet to send NBT data from clients to the serverside held item wrapper.registerMessage(NBTItemControlPacket.Handler.class, NBTItemControlPacket.class, i++, Side.SERVER); + //sends a button press to the held item, assuming it is an ISyncButtons + wrapper.registerMessage(SyncButtonsPacket.Handler.class, SyncButtonsPacket.class, i++, Side.SERVER); } } diff --git a/src/main/java/com/hbm/packet/SyncButtonsPacket.java b/src/main/java/com/hbm/packet/SyncButtonsPacket.java new file mode 100644 index 000000000..b460a4141 --- /dev/null +++ b/src/main/java/com/hbm/packet/SyncButtonsPacket.java @@ -0,0 +1,56 @@ +package com.hbm.packet; + +import com.hbm.items.ISyncButtons; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; + +public class SyncButtonsPacket implements IMessage { + + boolean state; + int button; + + public SyncButtonsPacket() { } + + public SyncButtonsPacket(boolean s, int b) { + state = s; + button = b; + } + + @Override + public void fromBytes(ByteBuf buf) { + state = buf.readBoolean(); + button = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(state); + buf.writeInt(button); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(SyncButtonsPacket m, MessageContext ctx) { + + if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) + return null; + + EntityPlayer p = ctx.getServerHandler().playerEntity; + + if(p.getHeldItem() != null && p.getHeldItem().getItem() instanceof ISyncButtons) { + + ISyncButtons item = (ISyncButtons)p.getHeldItem().getItem(); + item.receiveMouse(p, p.getHeldItem(), m.button, m.state); + } + + return null; + } + } +} diff --git a/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java new file mode 100644 index 000000000..769c53838 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBlockDecoModel.java @@ -0,0 +1,92 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.render.util.ObjUtil; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.model.IModelCustom; +import net.minecraftforge.client.model.obj.WavefrontObject; + +public class RenderBlockDecoModel implements ISimpleBlockRenderingHandler { + + private int renderID; + private IModelCustom model; + + public RenderBlockDecoModel(int renderType, IModelCustom IModelCustom) { + renderID = renderType; + model = IModelCustom; + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + GL11.glPushMatrix(); + Tessellator tessellator = Tessellator.instance; + IIcon iicon = block.getIcon(0, metadata); + tessellator.setColorOpaque_F(1, 1, 1); + + if(renderer.hasOverrideBlockTexture()) { + iicon = renderer.overrideBlockTexture; + } + + GL11.glRotated(-15, 0, 1, 0); + tessellator.startDrawingQuads(); + ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, modelId, false); + + tessellator.draw(); + + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int meta = world.getBlockMetadata(x, y, z); + IIcon iicon = block.getIcon(0, meta & 12); + tessellator.setColorOpaque_F(1, 1, 1); + + if(renderer.hasOverrideBlockTexture()) { + iicon = renderer.overrideBlockTexture; + } + + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + + float rotation = 0; + + switch(meta & 3) { + default: //North + rotation = (float) Math.PI; break; + case 1: //South + break; + case 2: //West + rotation = 1.5F * (float) Math.PI;break; + case 3: //East + rotation = 0.5F * (float) Math.PI; break; + } + + tessellator.addTranslation(x + 0.5F, y + 0.5F, z + 0.5F); + ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, rotation, true); + tessellator.addTranslation(-x - 0.5F, -y - 0.5F, -z - 0.5F); + + return false; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return this.renderID; + } + +} diff --git a/src/main/java/com/hbm/render/block/RenderBlocksFixed.java b/src/main/java/com/hbm/render/block/RenderBlocksFixed.java new file mode 100644 index 000000000..6194a36c6 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBlocksFixed.java @@ -0,0 +1,15 @@ +package com.hbm.render.block; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderBlocksFixed extends RenderBlocks { + + public RenderBlocksFixed() { + super(); + } + + public RenderBlocksFixed(IBlockAccess world) { + super(world); + } +} diff --git a/src/main/java/com/hbm/render/block/RenderCable.java b/src/main/java/com/hbm/render/block/RenderCable.java index 5b3b823c9..62683e60a 100644 --- a/src/main/java/com/hbm/render/block/RenderCable.java +++ b/src/main/java/com/hbm/render/block/RenderCable.java @@ -2,7 +2,7 @@ package com.hbm.render.block; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.test.TestConductor; +import com.hbm.blocks.network.BlockCable; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; import com.hbm.render.util.ObjUtil; @@ -94,6 +94,6 @@ public class RenderCable implements ISimpleBlockRenderingHandler { @Override public int getRenderId() { - return TestConductor.renderID; + return BlockCable.renderID; } } diff --git a/src/main/java/com/hbm/render/block/RenderConveyor.java b/src/main/java/com/hbm/render/block/RenderConveyor.java index 72922766a..c3f876c3c 100644 --- a/src/main/java/com/hbm/render/block/RenderConveyor.java +++ b/src/main/java/com/hbm/render/block/RenderConveyor.java @@ -23,27 +23,10 @@ public class RenderConveyor implements ISimpleBlockRenderingHandler { renderer.setRenderBounds( 0D, 0D, 0D, 1D, 0.25D, 1D); meta = 2; - - if(meta == 2) { - renderer.uvRotateTop = 3; - renderer.uvRotateBottom = 0; - renderer.uvRotateWest = 3; - } - if(meta == 3) { - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 3; - renderer.uvRotateEast = 3; - } - if(meta == 4) { - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 1; - renderer.uvRotateSouth = 3; - } - if(meta == 5) { - renderer.uvRotateTop = 2; - renderer.uvRotateBottom = 2; - renderer.uvRotateNorth = 3; - } + + renderer.uvRotateTop = 3; + renderer.uvRotateBottom = 0; + renderer.uvRotateWest = 3; tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); @@ -88,26 +71,31 @@ public class RenderConveyor implements ISimpleBlockRenderingHandler { tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); tessellator.setColorOpaque_F(1, 1, 1); + + boolean bent = meta > 5; + + if(meta > 9) meta -= 8; + if(meta > 5) meta -= 4; if(meta == 2) { renderer.uvRotateTop = 3; renderer.uvRotateBottom = 0; - renderer.uvRotateWest = 3; + if(!bent) renderer.uvRotateWest = 3; } if(meta == 3) { renderer.uvRotateTop = 0; renderer.uvRotateBottom = 3; - renderer.uvRotateEast = 3; + if(!bent) renderer.uvRotateEast = 3; } if(meta == 4) { renderer.uvRotateTop = 1; renderer.uvRotateBottom = 1; - renderer.uvRotateSouth = 3; + if(!bent) renderer.uvRotateSouth = 3; } if(meta == 5) { renderer.uvRotateTop = 2; renderer.uvRotateBottom = 2; - renderer.uvRotateNorth = 3; + if(!bent) renderer.uvRotateNorth = 3; } renderer.setRenderBounds((double) 0, 0.0D, (double) 0, (double) 1, 0.25D, (double) 1); diff --git a/src/main/java/com/hbm/render/block/RenderConveyorLift.java b/src/main/java/com/hbm/render/block/RenderConveyorLift.java index badb6ee35..bc604fad2 100644 --- a/src/main/java/com/hbm/render/block/RenderConveyorLift.java +++ b/src/main/java/com/hbm/render/block/RenderConveyorLift.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.network.BlockConveyorLift; import api.hbm.conveyor.IConveyorBelt; +import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; @@ -74,7 +75,7 @@ public class RenderConveyorLift implements ISimpleBlockRenderingHandler { if(y < 255) { Block above = world.getBlock(x, y + 1, z); - isTop = !(above instanceof IConveyorBelt) && !isBottom; + isTop = !(above instanceof IConveyorBelt) && !isBottom && !(world.getBlock(x, y + 1, z) instanceof IEnterableBlock); } double minOuter = 0.0; diff --git a/src/main/java/com/hbm/render/block/RenderFoundryBasin.java b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java new file mode 100644 index 000000000..342ec7838 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryBasin.java @@ -0,0 +1,106 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryBasin; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryBasin implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryBasin basin = (FoundryBasin) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + basin.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryBasin basin = (FoundryBasin) block; + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryBasin.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderFoundryChannel.java b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java new file mode 100644 index 000000000..666373832 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryChannel.java @@ -0,0 +1,405 @@ +package com.hbm.render.block; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryChannel; +import com.hbm.lib.Library; +import com.hbm.tileentity.machine.TileEntityFoundryChannel; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryChannel implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + double height = 0.5D; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + FoundryChannel channel = (FoundryChannel) block; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + + //center + renderer.setRenderBounds(0.375D, 0D, 0.375D, 0.625D, 0.125D, 0.625D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, 0.125D, 0.6875D); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + //pos X bottom + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, 0.125D, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + //pos X + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 1D, height, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + //neg x bottom + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, 0.125D, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + //neg x + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0D, 0D, 0.625D, 0.375D, height, 0.6875D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + + //pos Z bottom + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, 0.125D, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + //pos z + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.375D, height, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 0.6875D, height, 1D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + //neg z bottom + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.6875D, 0.125D, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + //neg z + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.375D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + renderer.setRenderBounds(0.625D, 0D, 0D, 0.6875D, height, 0.375D); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + int fullBright = 240; + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryChannel channel = (FoundryChannel) block; + + TileEntity te = world.getTileEntity(x, y, z); + TileEntityFoundryChannel tile = null; + + if(te instanceof TileEntityFoundryChannel) { + tile = (TileEntityFoundryChannel) te; + } + + boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; + double level = doRender ? tile.amount * 0.25D / tile.getCapacity() : 0; + Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + if(color != null) { + double brightener = 0.7D; + int nr = (int) (255D - (255D - color.getRed()) * brightener); + int ng = (int) (255D - (255D - color.getGreen()) * brightener); + int nb = (int) (255D - (255D - color.getBlue()) * brightener); + + color = new Color(nr, ng, nb); + } + + boolean posX = channel.canConnectTo(world, x, y, z, Library.POS_X); + boolean negX = channel.canConnectTo(world, x, y, z, Library.NEG_X); + boolean posZ = channel.canConnectTo(world, x, y, z, Library.POS_Z); + boolean negZ = channel.canConnectTo(world, x, y, z, Library.NEG_Z); + + double height = 0.5D; + + renderer.setRenderBounds(0.375D, 0D, 0.375D, 0.625D, 0.125D, 0.625D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + if(doRender) { + renderer.setRenderBounds(0.375D, 0.125D, 0.375D, 0.625D, 0.125D + level, 0.625D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); + } + + if(posX) { + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.625D, 0D, 0.3125D, 1D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 1D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.625D, 0.125D, 0.3125D, 1D, 0.125D + level, 0.6875D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceXPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); + } + + } else { + renderer.setRenderBounds(0.625, 0D, 0.3125D, 0.6875D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + } + + if(negX) { + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, 0.125D, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0D, 0D, 0.3125D, 0.375D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0D, 0D, 0.625D, 0.375D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0D, 0.125D, 0.3125D, 0.375D, 0.125D + level, 0.6875D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceXNeg(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.375D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + } + + if(posZ) { + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, 0.125D, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.375D, height, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0.625D, 0.6875D, height, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.3125D, 0.125D, 0.625D, 0.6875D, 0.125D + level, 1D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceZPos(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.625D, 0.6875D, height, 0.6875D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceZPos(block, x, y, z, channel.iconSide); + } + + if(negZ) { + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.6875D, 0.125D, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, channel.iconBottom); + + renderer.setRenderBounds(0.3125D, 0D, 0D, 0.375D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceXPos(block, x, y, z, channel.iconInner); + + renderer.setRenderBounds(0.625D, 0D, 0D, 0.6875D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXNeg(block, x, y, z, channel.iconInner); + renderer.renderFaceXPos(block, x, y, z, channel.iconSide); + + if(doRender) { + renderer.setRenderBounds(0.3125D, 0.125D, 0D, 0.6875D, 0.125D + level, 0.375D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, channel.iconLava); + renderer.renderFaceZNeg(block, x, y, z, channel.iconLava); + tessellator.setBrightness(brightness); + } + + } else { + renderer.setRenderBounds(0.3125D, 0D, 0.3125D, 0.6875D, height, 0.375D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, channel.iconTop); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZNeg(block, x, y, z, channel.iconSide); + renderer.renderFaceZPos(block, x, y, z, channel.iconInner); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryChannel.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderFoundryMold.java b/src/main/java/com/hbm/render/block/RenderFoundryMold.java new file mode 100644 index 000000000..5958ba8e5 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryMold.java @@ -0,0 +1,106 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryMold; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryMold implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryMold basin = (FoundryMold) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + basin.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryMold mold = (FoundryMold) block; + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, mold.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, mold.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, mold.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, mold.iconSide); + renderer.renderFaceXNeg(block, x, y, z, mold.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, mold.iconInner); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, mold.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, mold.iconSide); + renderer.renderFaceZNeg(block, x, y, z, mold.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, mold.iconInner); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, mold.iconInner); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryMold.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java new file mode 100644 index 000000000..743ba6306 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryOutlet.java @@ -0,0 +1,226 @@ +package com.hbm.render.block; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.FoundryOutlet; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryOutlet implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + double bot = 0.0D; + double top = 0.5D; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + FoundryOutlet outlet = (FoundryOutlet) block; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + + renderer.setRenderBounds(0.3125D, bot, 0D, 0.6875D, top, 0.375D); + + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + + tessellator.setNormal(1F, 0F, 0F); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + double bot = 0.0D; + double top = 0.5D; + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryOutlet outlet = (FoundryOutlet) block; + int meta = world.getBlockMetadata(x, y, z); + TileEntityFoundryOutlet tile = (TileEntityFoundryOutlet) world.getTileEntity(x, y, z); + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + tessellator.setBrightness(brightness); + + if(meta == 4) { + renderer.setRenderBounds(0.625D, bot, 0.3125D, 1D, top, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.3125D, outlet.iconInner); + renderer.field_152631_f = true; + renderer.renderFaceZNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); + renderer.field_152631_f = false; + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.96875D, 0.0625, 0.375D, 0.96875D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.9375D, 0.0625, 0.375D, 0.9375D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } + } + + if(meta == 5) { + renderer.setRenderBounds(0D, bot, 0.3125D, 0.375D, top, 0.6875D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.3125D, outlet.iconInner); + renderer.field_152631_f = true; + renderer.renderFaceZNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.3125D, outlet.iconInner); + renderer.field_152631_f = false; + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.03125D, 0.0625, 0.375D, 0.03125D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.0625D, 0.0625, 0.375D, 0.0625D, top, 0.625D); + renderer.renderFaceXPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceXNeg(block, x, y, z, outlet.iconLock); + } + } + + if(meta == 2) { + renderer.setRenderBounds(0.3125D, bot, 0.625D, 0.6875D, top, 1D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625, 0.96875D, 0.625D, top, 0.96875D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.9375D, 0.625D, top, 0.9375D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } + } + + if(meta == 3) { + renderer.setRenderBounds(0.3125D, bot, 0D, 0.6875D, top, 0.375D); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, outlet.iconTop); + renderer.renderFaceYPos(block, x, y - 0.375D, z, outlet.iconBottom); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.field_152631_f = true; + renderer.renderFaceXPos(block, x, y, z, outlet.iconSide); + renderer.renderFaceXPos(block, x - 0.3125D, y, z, outlet.iconInner); + renderer.field_152631_f = false; + renderer.renderFaceXNeg(block, x, y, z, outlet.iconSide); + renderer.renderFaceXNeg(block, x + 0.3125D, y, z, outlet.iconInner); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFront); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFront); + + if(tile.filter != null) { + renderer.setRenderBounds(0.375D, 0.0625D, 0.03125, 0.625D, top, 0.03125D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconFilter); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconFilter); + } + + if(tile.isClosed()) { + renderer.setRenderBounds(0.375D, 0.0625, 0.0625D, 0.625D, top, 0.0625D); + renderer.renderFaceZPos(block, x, y, z, outlet.iconLock); + renderer.renderFaceZNeg(block, x, y, z, outlet.iconLock); + } + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryOutlet.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/RenderFoundryTank.java b/src/main/java/com/hbm/render/block/RenderFoundryTank.java new file mode 100644 index 000000000..9d0863248 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderFoundryTank.java @@ -0,0 +1,201 @@ +package com.hbm.render.block; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.FoundryTank; +import com.hbm.tileentity.machine.TileEntityFoundryTank; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class RenderFoundryTank implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + FoundryTank basin = (FoundryTank) block; + double x = 0; + double y = 0; + double z = 0; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0F, 1F, 0F); + renderer.renderFaceYPos(block, x, y, z, basin.iconTop); + renderer.renderFaceYPos(block, x, y - 0.875D, z, basin.iconBottom); + tessellator.setNormal(0F, -1F, 0F); + renderer.renderFaceYNeg(block, x, y, z, basin.iconBottom); + tessellator.setNormal(1F, 0F, 0F); + renderer.renderFaceXPos(block, x, y, z, basin.iconSide); + renderer.renderFaceXPos(block, x - 0.875D, y, z, basin.iconInner); + tessellator.setNormal(-1F, 0F, 0F); + renderer.renderFaceXNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceXNeg(block, x + 0.875D, y, z, basin.iconInner); + tessellator.setNormal(0F, 0F, 1F); + renderer.renderFaceZPos(block, x, y, z, basin.iconSide); + renderer.renderFaceZPos(block, x, y, z - 0.875D, basin.iconInner); + tessellator.setNormal(0F, 0F, -1F); + renderer.renderFaceZNeg(block, x, y, z, basin.iconSide); + renderer.renderFaceZNeg(block, x, y, z + 0.875D, basin.iconInner); + tessellator.draw(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + int colorMult = block.colorMultiplier(world, x, y, z); + float r = (float) (colorMult >> 16 & 255) / 255.0F; + float g = (float) (colorMult >> 8 & 255) / 255.0F; + float b = (float) (colorMult & 255) / 255.0F; + + float mulBottom = 0.5F; + float mulTop = 1.0F; + float mulZ = 0.8F; + float mulX = 0.6F; + + int brightness = block.getMixedBrightnessForBlock(world, x, y, z); + int fullBright = 240; + tessellator.setBrightness(brightness); + + if(EntityRenderer.anaglyphEnable) { + float aR = (r * 30.0F + g * 59.0F + b * 11.0F) / 100.0F; + float aG = (r * 30.0F + g * 70.0F) / 100.0F; + float aB = (r * 30.0F + b * 70.0F) / 100.0F; + r = aR; + g = aG; + b = aB; + } + + FoundryTank tank = (FoundryTank) block; + + TileEntity te = world.getTileEntity(x, y, z); + TileEntityFoundryTank tile = null; + + if(te instanceof TileEntityFoundryTank) { + tile = (TileEntityFoundryTank) te; + } + + boolean conPosX = world.getBlock(x + 1, y, z) == ModBlocks.foundry_tank; + boolean conNegX = world.getBlock(x - 1, y, z) == ModBlocks.foundry_tank; + boolean conPosZ = world.getBlock(x, y, z + 1) == ModBlocks.foundry_tank; + boolean conNegZ = world.getBlock(x, y, z - 1) == ModBlocks.foundry_tank; + boolean conPosY = world.getBlock(x, y + 1, z) == ModBlocks.foundry_tank; + boolean conNegY = world.getBlock(x, y - 1, z) == ModBlocks.foundry_tank; + + boolean doRender = tile != null ? (tile.amount > 0 && tile.type != null) : false; + double max = 0.75D + (conNegY ? 0.125D : 0) + (conPosY ? 0.125D : 0); + double level = doRender ? tile.amount * max / tile.getCapacity() : 0; + Color color = doRender ? new Color(tile.type.moltenColor).brighter() : null; + + if(color != null) { + double brightener = 0.7D; + int nr = (int) (255D - (255D - color.getRed()) * brightener); + int ng = (int) (255D - (255D - color.getGreen()) * brightener); + int nb = (int) (255D - (255D - color.getBlue()) * brightener); + + color = new Color(nr, ng, nb); + } + + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 1D); + + if(!conNegY) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 0.125D, 1D); + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconBottom); + tessellator.setColorOpaque_F(r * mulBottom, g * mulBottom, b * mulBottom); + renderer.renderFaceYNeg(block, x, y, z, tank.iconBottom); + } + + if(!conPosX) { + renderer.setRenderBounds(0.875D, 0D, 0D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegX) { + renderer.setRenderBounds(0D, 0D, 0D, 0.125D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceXNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conPosZ) { + renderer.setRenderBounds(0D, 0D, 0.875D, 1D, 1D, 1D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + renderer.renderFaceZNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(!conNegZ) { + renderer.setRenderBounds(0D, 0D, 0D, 1D, 1D, 0.125D); + tessellator.setColorOpaque_F(r * mulZ, g * mulZ, b * mulZ); + renderer.renderFaceZPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + renderer.renderFaceZNeg(block, x, y, z, conNegY ? tank.iconSideUpper : tank.iconSide); + + tessellator.setColorOpaque_F(r * mulX, g * mulX, b * mulX); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, conPosY ? tank.iconBottom : tank.iconInner); + + tessellator.setColorOpaque_F(r * mulTop, g * mulTop, b * mulTop); + renderer.renderFaceYPos(block, x, y, z, tank.iconTop); + } + + if(doRender) { + double height = conNegY ? 0D : 0.125D; + renderer.setRenderBounds(0D, height, 0D, 1D, height + level, 1D); + tessellator.setColorOpaque_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + tessellator.setBrightness(fullBright); + renderer.renderFaceYPos(block, x, y, z, tank.iconLava); + if(conPosX) renderer.renderFaceXPos(block, x, y, z, tank.iconLava); + if(conNegX) renderer.renderFaceXNeg(block, x, y, z, tank.iconLava); + if(conPosZ) renderer.renderFaceZPos(block, x, y, z, tank.iconLava); + if(conNegZ) renderer.renderFaceZNeg(block, x, y, z, tank.iconLava); + tessellator.setBrightness(brightness); + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return FoundryTank.renderID; + } +} diff --git a/src/main/java/com/hbm/render/block/ct/CT.java b/src/main/java/com/hbm/render/block/ct/CT.java index f9448160a..6e3bf5ca5 100644 --- a/src/main/java/com/hbm/render/block/ct/CT.java +++ b/src/main/java/com/hbm/render/block/ct/CT.java @@ -1,8 +1,5 @@ package com.hbm.render.block.ct; -import java.util.ArrayList; -import java.util.List; - import cpw.mods.fml.client.registry.RenderingRegistry; public class CT { diff --git a/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java b/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java index be89c4ef2..e6b661bdc 100644 --- a/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java +++ b/src/main/java/com/hbm/render/block/ct/CTStitchReceiver.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.util.IIcon; -import net.minecraftforge.client.event.TextureStitchEvent; public class CTStitchReceiver { diff --git a/src/main/java/com/hbm/render/block/ct/IBlockCT.java b/src/main/java/com/hbm/render/block/ct/IBlockCT.java index 58453e4ee..a7896f433 100644 --- a/src/main/java/com/hbm/render/block/ct/IBlockCT.java +++ b/src/main/java/com/hbm/render/block/ct/IBlockCT.java @@ -3,7 +3,6 @@ package com.hbm.render.block.ct; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; public interface IBlockCT { diff --git a/src/main/java/com/hbm/render/block/ct/IconCT.java b/src/main/java/com/hbm/render/block/ct/IconCT.java index dd66acd29..2145bdd72 100644 --- a/src/main/java/com/hbm/render/block/ct/IconCT.java +++ b/src/main/java/com/hbm/render/block/ct/IconCT.java @@ -1,6 +1,5 @@ package com.hbm.render.block.ct; -import static com.hbm.render.block.ct.CT.*; import net.minecraft.util.IIcon; public class IconCT implements IIcon { diff --git a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java index 5d44aa9b4..e59c4a6b5 100644 --- a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java +++ b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java @@ -2,7 +2,6 @@ package com.hbm.render.block.ct; import org.lwjgl.opengl.GL11; -import com.hbm.blocks.ModBlocks; import com.hbm.main.MainRegistry; import com.hbm.render.block.ct.CTContext.CTFace; diff --git a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java index 49702b541..28c2aec96 100644 --- a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java +++ b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java @@ -32,10 +32,12 @@ public class RenderMovingItem extends Render { if(!(stack.getItem() instanceof ItemBlock)) { GL11.glRotatef(90F, 1.0F, 0.0F, 0.0F); GL11.glTranslated(0.0, -0.1875, 0.0); + + if(!this.renderManager.options.fancyGraphics) + GL11.glTranslated(0.0, 0.0625, 0.0); } EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, stack); - //dummy.getEntityItem().stackSize = 1; dummy.hoverStart = 0.0F; RenderItem.renderInFrame = true; diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java new file mode 100644 index 000000000..0b4b3d2d4 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryRocket.java @@ -0,0 +1,47 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.entity.projectile.EntityArtilleryRocket; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderArtilleryRocket extends Render { + + @Override + public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1 - 90, 0.0F, 0.0F, 1.0F); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90, 1, 0, 0); + + this.bindEntityTexture(entity); + + boolean fog = GL11.glIsEnabled(GL11.GL_FOG); + + if(fog) GL11.glDisable(GL11.GL_FOG); + GL11.glShadeModel(GL11.GL_SMOOTH); + EntityArtilleryRocket rocket = (EntityArtilleryRocket) entity; + HIMARSRocket type = rocket.getType(); + if(type.modelType == 0) ResourceManager.turret_himars.renderPart("RocketStandard"); + if(type.modelType == 1) ResourceManager.turret_himars.renderPart("RocketSingle"); + GL11.glShadeModel(GL11.GL_FLAT); + if(fog) GL11.glEnable(GL11.GL_FOG); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + EntityArtilleryRocket rocket = (EntityArtilleryRocket) entity; + return ItemAmmoHIMARS.itemTypes[rocket.getDataWatcher().getWatchableObjectInt(10)].texture; + } +} diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java b/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java new file mode 100644 index 000000000..fc6fa00af --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderChemical.java @@ -0,0 +1,170 @@ +package com.hbm.render.entity.projectile; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.entity.projectile.EntityChemical; +import com.hbm.entity.projectile.EntityChemical.ChemicalStyle; +import com.hbm.lib.RefStrings; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; + +public class RenderChemical extends Render { + + private static ResourceLocation gas = new ResourceLocation(RefStrings.MODID + ":textures/particle/particle_base.png"); + + @Override + public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + EntityChemical chem = (EntityChemical) entity; + ChemicalStyle style = chem.getStyle(); + + if(style == ChemicalStyle.AMAT) + renderAmatBeam(chem, f1); + + if(style == ChemicalStyle.GAS) { + this.bindEntityTexture(chem); + renderGasCloud(chem, f1); + } + + if(style == ChemicalStyle.GASFLAME) { + this.bindEntityTexture(chem); + renderGasFire(chem, f1); + } + + GL11.glPopMatrix(); + } + + private void renderGasFire(EntityChemical chem, float interp) { + + float exp = (float) (chem.ticksExisted + interp) / (float) chem.getMaxAge(); + double size = 0.0 + exp * 2; + Color color = Color.getHSBColor(Math.max((60 - exp * 100) / 360F, 0.0F), 1 - exp * 0.25F, 1 - exp * 0.5F); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + + Tessellator tess = Tessellator.instance; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + tess.startDrawingQuads(); + tess.setNormal(0.0F, 1.0F, 0.0F); + tess.setColorRGBA_I(color.getRGB(), (int) Math.max(255 * (1 - exp), 0)); + tess.addVertexWithUV(-size, -size, 0.0D, 1, 1); + tess.addVertexWithUV(size, -size, 0.0D, 0, 1); + tess.addVertexWithUV(size, size, 0.0D, 0, 0); + tess.addVertexWithUV(-size, size, 0.0D, 1, 0); + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.1F); + } + + private void renderGasCloud(EntityChemical chem, float interp) { + + double exp = (double) (chem.ticksExisted + interp) / (double) chem.getMaxAge(); + double size = 0.0 + exp * 10; + int color = chem.getType().getColor(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + + Tessellator tess = Tessellator.instance; + GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + tess.startDrawingQuads(); + tess.setNormal(0.0F, 1.0F, 0.0F); + tess.setColorRGBA_I(color, (int) Math.max(127 * (1 - exp), 0)); + tess.addVertexWithUV(-size, -size, 0.0D, 1, 1); + tess.addVertexWithUV(size, -size, 0.0D, 0, 1); + tess.addVertexWithUV(size, size, 0.0D, 0, 0); + tess.addVertexWithUV(-size, size, 0.0D, 1, 0); + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.1F); + } + + private void renderAmatBeam(EntityChemical chem, float interp) { + + float yaw = chem.prevRotationYaw + (chem.rotationYaw - chem.prevRotationYaw) * interp; + float pitch = chem.prevRotationPitch + (chem.rotationPitch - chem.prevRotationPitch) * interp; + GL11.glRotatef(yaw, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-pitch - 90, 1.0F, 0.0F, 0.0F); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glDepthMask(false); + + double length = Vec3.createVectorHelper(chem.motionX, chem.motionY, chem.motionZ).lengthVector() * (chem.ticksExisted + interp) * 0.75; + double size = 0.0625; + float o = 0.2F; + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, -size); + tess.addVertex(size, 0, -size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, -size); + tess.addVertex(-size, length, -size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, size); + tess.addVertex(size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, size); + tess.addVertex(-size, length, size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(-size, 0, -size); + tess.addVertex(-size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(-size, length, size); + tess.addVertex(-size, length, -size); + + tess.setColorRGBA_F(1F, 1F, 1F, o); + tess.addVertex(size, 0, -size); + tess.addVertex(size, 0, size); + tess.setColorRGBA_F(1F, 1F, 1F, 0.0F); + tess.addVertex(size, length, size); + tess.addVertex(size, length, -size); + + tess.draw(); + + GL11.glDepthMask(true); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return gas; + } +} diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderCog.java b/src/main/java/com/hbm/render/entity/projectile/RenderCog.java index bc2edc193..39e98038e 100644 --- a/src/main/java/com/hbm/render/entity/projectile/RenderCog.java +++ b/src/main/java/com/hbm/render/entity/projectile/RenderCog.java @@ -15,7 +15,7 @@ public class RenderCog extends Render { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - + int orientation = cog.getDataWatcher().getWatchableObjectInt(10); switch(orientation % 6) { case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; @@ -42,6 +42,11 @@ public class RenderCog extends Render { @Override protected ResourceLocation getEntityTexture(Entity entity) { - return ResourceManager.stirling_tex; + int meta = entity.getDataWatcher().getWatchableObjectInt(11); + + if(meta == 0) + return ResourceManager.stirling_tex; + else + return ResourceManager.stirling_steel_tex; } } diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java new file mode 100644 index 000000000..b12cb4594 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java @@ -0,0 +1,47 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderSawblade extends Render { + + @Override + public void doRender(Entity cog, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + int orientation = cog.getDataWatcher().getWatchableObjectInt(10); + switch(orientation % 6) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + GL11.glTranslated(0, 0, -1); + + + if(orientation < 6) { + GL11.glRotated(System.currentTimeMillis() % (360 * 5) / 3D, 0.0D, 0.0D, -1.0D); + } + + GL11.glTranslated(0, -1.375, 0); + + this.bindEntityTexture(cog); + ResourceManager.sawmill.renderPart("Blade"); + + GL11.glPopMatrix(); + + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ResourceManager.sawmill_tex; + } +} diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index dab7c2a35..717ec9cd5 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -7,6 +7,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; import com.hbm.items.ModItems; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.ResourceManager; import com.hbm.render.tileentity.RenderBobble; import com.hbm.render.tileentity.RenderDemonLamp; @@ -52,26 +54,6 @@ public class ItemRenderLibrary { GL11.glShadeModel(GL11.GL_FLAT); }}); - renderers.put(Item.getItemFromBlock(ModBlocks.machine_centrifuge), new ItemRenderBase() { - public void renderInventory() { - GL11.glTranslated(0, -4, 0); - GL11.glScaled(4.5, 4.5, 4.5); - } - public void renderCommon() { - bindTexture(ResourceManager.centrifuge_new_tex); ResourceManager.centrifuge_new.renderAll(); - }}); - - renderers.put(Item.getItemFromBlock(ModBlocks.machine_gascent), new ItemRenderBase() { - public void renderInventory() { - GL11.glTranslated(0, -4, 0); - GL11.glScaled(3.5, 3.5, 3.5); - } - public void renderCommon() { - GL11.glShadeModel(GL11.GL_SMOOTH); - bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); - GL11.glShadeModel(GL11.GL_FLAT); - }}); - renderers.put(Item.getItemFromBlock(ModBlocks.iter), new ItemRenderBase() { public void renderInventory() { GL11.glTranslated(0, -1, 0); @@ -1352,10 +1334,60 @@ public class ItemRenderLibrary { } public void renderCommonWithStack(ItemStack item) { GL11.glTranslated(0, 0, -0.875); - bindTexture(ResourceManager.stirling_tex); + + if(item.getItemDamage() == 0) + bindTexture(ResourceManager.stirling_tex); + else + bindTexture(ResourceManager.stirling_steel_tex); ResourceManager.stirling.renderPart("Cog"); }}); + renderers.put(ModItems.sawblade, new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -7, 0); + GL11.glScaled(6, 6, 6); + GL11.glRotated(-45, 0, 1, 0); + GL11.glRotated(30, 1, 0, 0); + GL11.glTranslated(0, 1.375, 0); + GL11.glRotated(System.currentTimeMillis() % 3600 * 0.2F, 0, 0, 1); + GL11.glTranslated(0, -1.375, 0); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(0, 0, -0.875); + bindTexture(ResourceManager.sawmill_tex); + ResourceManager.sawmill.renderPart("Blade"); + }}); + + renderers.put(ModItems.ammo_himars, new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -2, 0); + double scale = 2.75D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(System.currentTimeMillis() % 3600 / 10D, 0, 1, 0); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(0, 1.5, 0); + GL11.glRotated(-45, 0, 1, 0); + GL11.glRotated(90, 1, 0, 0); + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[item.getItemDamage()]; + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(type.texture); + if(type.modelType == 0) { + GL11.glTranslated(0.75, 0, 0); + ResourceManager.turret_himars.renderPart("RocketStandard"); + GL11.glTranslated(-1.5, 0, 0); + GL11.glTranslated(0, -3.375D, 0); + ResourceManager.turret_himars.renderPart("TubeStandard"); + } else { + GL11.glTranslated(0.75, 0, 0); + ResourceManager.turret_himars.renderPart("RocketSingle"); + GL11.glTranslated(-1.5, 0, 0); + GL11.glTranslated(0, -3.375D, 0); + ResourceManager.turret_himars.renderPart("TubeSingle"); + } + GL11.glShadeModel(GL11.GL_FLAT); + }}); + //hi there! it seems you are trying to register a new item renderer, most likely for a tile entity. //please refer to the comment at the start of the file on how to do this without adding to this gigantic pile of feces. } diff --git a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java b/src/main/java/com/hbm/render/item/ItemRenderTemplate.java index c52c324a0..fcfe550a6 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderTemplate.java +++ b/src/main/java/com/hbm/render/item/ItemRenderTemplate.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.AssemblerRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.render.util.RenderItemStack; @@ -28,6 +29,9 @@ public class ItemRenderTemplate implements IItemRenderer { if(stack.getItem() == ModItems.chemistry_template) this.currentItem = new ItemStack(ModItems.chemistry_icon, 1, stack.getItemDamage()); + if(stack.getItem() == ModItems.crucible_template) + this.currentItem = CrucibleRecipes.indexMapping.get(stack.getItemDamage()).icon; + if(this.currentItem != null) { return true; } diff --git a/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java b/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java deleted file mode 100644 index 57e75111d..000000000 --- a/src/main/java/com/hbm/render/item/block/ItemRenderTestContainer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.hbm.render.item.block; - -import com.hbm.tileentity.deco.TileEntityTestContainer; - -import net.minecraft.client.model.ModelChest; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.IItemRenderer; - -public class ItemRenderTestContainer implements IItemRenderer { - - private ModelChest chestModel; - - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return true; - } - - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, - ItemRendererHelper helper) { - return true; - } - - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - TileEntityRendererDispatcher.instance.renderTileEntityAt(new TileEntityTestContainer(), 0.0D, 0.0D, 0.0D, 0.0F); - } - -} diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java new file mode 100644 index 000000000..2f3aecabe --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderChainsaw.java @@ -0,0 +1,131 @@ +package com.hbm.render.item.weapon; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemToolAbilityFueled; +import com.hbm.items.weapon.ItemGunBase; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; + +public class ItemRenderChainsaw implements IItemRenderer { + + public ItemRenderChainsaw() { } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + + return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + + GL11.glEnable(GL11.GL_CULL_FACE); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.chainsaw_tex); + + switch(type) { + + case EQUIPPED_FIRST_PERSON: + + player.isSwingInProgress = false; + + double s0 = 0.35D; + GL11.glTranslated(0.5, 0.25, -0.25F); + GL11.glRotated(45, 0, 0, 1); + GL11.glRotated(80, 0, 1, 0); + GL11.glScaled(s0, s0, s0); + + if(!player.isBlocking()) { + double[] sRot = HbmAnimations.getRelevantTransformation("SWING_ROT"); + double[] sTrans = HbmAnimations.getRelevantTransformation("SWING_TRANS"); + GL11.glTranslated(sTrans[0], sTrans[1], sTrans[2]); + GL11.glRotated(sRot[2], 0, 0, 1); + GL11.glRotated(sRot[1], 0, 1, 0); + GL11.glRotated(sRot[0], 1, 0, 0); + } + + break; + + case EQUIPPED: + + double scale = -0.375D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(85, 0, 1, 0); + GL11.glRotated(135D, 1.0D, 0.0D, 0.0D); + GL11.glTranslated(-0.125, -2.0, 1.75); + + break; + + case ENTITY: + + double s1 = 0.5D; + GL11.glScaled(s1, s1, s1); + break; + + case INVENTORY: + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + + double s = 4D; + GL11.glTranslated(8, 10, 0); + GL11.glRotated(-90, 0, 1, 0); + GL11.glRotated(-135, 1, 0, 0); + GL11.glScaled(s, s, -s); + + break; + + default: break; + } + + ResourceManager.chainsaw.renderPart("Saw"); + + for(int i = 0; i < 20; i++) { + + double run = ((ItemToolAbilityFueled) item.getItem()).canOperate(item) ? System.currentTimeMillis() % 100D * 0.25D / 100D : 0.0625D; + double forward = i * 0.25 + (run) - 2.0625; + + GL11.glPushMatrix(); + + GL11.glTranslated(0, 0, 1.9375); + GL11.glTranslated(0, 0.375, 0.5625); + double angle = MathHelper.clamp_double(forward, 0, 0.25 * Math.PI); + GL11.glRotated(angle * 180D / (Math.PI * 0.25), 1, 0, 0); + GL11.glTranslated(0, -0.375, -0.5625); + if(forward < 0) GL11.glTranslated(0, 0, forward); + if(forward > Math.PI * 0.25) GL11.glTranslated(0, 0, forward - Math.PI * 0.25); + ResourceManager.chainsaw.renderPart("Tooth"); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java new file mode 100644 index 000000000..4996d353e --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderWeaponChemthrower.java @@ -0,0 +1,105 @@ +package com.hbm.render.item.weapon; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.ItemGunChemthrower; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public class ItemRenderWeaponChemthrower implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch(type) { + case EQUIPPED: + case EQUIPPED_FIRST_PERSON: + case ENTITY: + case INVENTORY: + return true; + default: return false; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + + return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + + GL11.glPushMatrix(); + + GL11.glEnable(GL11.GL_CULL_FACE); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.chemthrower_tex); + + switch(type) { + + case EQUIPPED_FIRST_PERSON: + + double s0 = 0.25D; + GL11.glRotated(25, 0, 0, 1); + GL11.glTranslated(1.0, 0.0, 0.0); + GL11.glRotated(170, 0, 1, 0); + GL11.glScaled(s0, s0, s0); + + break; + + case EQUIPPED: + + double scale = 0.25D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(100, 0, 1, 0); + GL11.glRotated(-10, 1, 0, 0); + GL11.glRotated(10, 0, 0, 1); + GL11.glTranslatef(-0.25F, -2.5F, 1.75F); + + break; + + case ENTITY: + + double s1 = 0.25D; + GL11.glScaled(s1, s1, s1); + + break; + + case INVENTORY: + + GL11.glEnable(GL11.GL_LIGHTING); + + double s = 1.5D; + GL11.glTranslated(9, 9, 0); + GL11.glRotated(180, 1, 0, 0); + GL11.glRotated(45, 0, 0, -1); + GL11.glScaled(s, s, -s); + + break; + + default: break; + } + + ItemGunChemthrower chem = (ItemGunChemthrower) item.getItem(); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + ResourceManager.chemthrower.renderPart("Gun"); + ResourceManager.chemthrower.renderPart("Hose"); + ResourceManager.chemthrower.renderPart("Nozzle"); + + GL11.glTranslated(0, 0.875, 1.75); + double d = (double) chem.getMag(item) / (double) chem.mainConfig.ammoCap; + GL11.glRotated(135 - d * 270, 1, 0, 0); + GL11.glTranslated(0, -0.875, -1.75); + + ResourceManager.chemthrower.renderPart("Gauge"); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java b/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java index f4fab219a..00396c683 100644 --- a/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java +++ b/src/main/java/com/hbm/render/tileentity/IItemRendererProvider.java @@ -6,5 +6,10 @@ import net.minecraftforge.client.IItemRenderer; public interface IItemRendererProvider { public Item getItemForRenderer(); + + public default Item[] getItemsForRenderer() { + return new Item[] { this.getItemForRenderer() }; + } + public IItemRenderer getRenderer(); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java index 940bf6431..b03698a8b 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java @@ -3,26 +3,18 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; -import com.hbm.render.util.RenderItemStack; import com.hbm.tileentity.machine.TileEntityMachineAssembler; -import com.hbm.tileentity.machine.TileEntityMachinePress; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.AdvancedModelLoader; -import net.minecraftforge.client.model.IModelCustom; public class RenderAssembler extends TileEntitySpecialRenderer { @@ -93,6 +85,7 @@ public class RenderAssembler extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); + RenderHelper.enableStandardItemLighting(); renderSlider(tileEntity, x, y, z, f); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderBoiler.java b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java new file mode 100644 index 000000000..ac8af5573 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderBoiler.java @@ -0,0 +1,78 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityHeatBoiler; + +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; + +public class RenderBoiler 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); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.boiler_tex); + TileEntityHeatBoiler boiler = (TileEntityHeatBoiler) tile; + if(!boiler.hasExploded) { + + if(boiler.tanks[1].getFill() > boiler.tanks[1].getMaxFill() * 0.9) { + double sine = Math.sin(System.currentTimeMillis() / 50D % (Math.PI * 2)); + sine *= 0.01D; + GL11.glScaled(1 - sine, 1 + sine, 1 - sine); + } + + GL11.glEnable(GL11.GL_CULL_FACE); + ResourceManager.boiler.renderAll(); + } else { + GL11.glDisable(GL11.GL_CULL_FACE); + ResourceManager.boiler_burst.renderAll(); + GL11.glEnable(GL11.GL_CULL_FACE); + } + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_boiler); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -3, 0); + GL11.glScaled(3, 3, 3); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotatef(90, 0F, 1F, 0F); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.boiler_tex); + if(item.getItemDamage() == 1) + ResourceManager.boiler_burst.renderAll(); + else + ResourceManager.boiler.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java b/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java index 107d64cb6..d0dfaa210 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCentrifuge.java @@ -2,45 +2,84 @@ 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.TileEntityMachineCentrifuge; import com.hbm.tileentity.machine.TileEntityMachineGasCent; 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; -public class RenderCentrifuge extends TileEntitySpecialRenderer { +public class RenderCentrifuge extends TileEntitySpecialRenderer implements IItemRendererProvider { @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5D, y, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); - switch(tileEntity.getBlockMetadata() - 10) { // (: + switch(tileEntity.getBlockMetadata() - 10) { case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; } + GL11.glShadeModel(GL11.GL_SMOOTH); + if(tileEntity instanceof TileEntityMachineCentrifuge) { - bindTexture(ResourceManager.centrifuge_new_tex); - ResourceManager.centrifuge_new.renderAll(); + bindTexture(ResourceManager.centrifuge_tex); + ResourceManager.centrifuge.renderAll(); } if(tileEntity instanceof TileEntityMachineGasCent) { GL11.glRotatef(180, 0F, 1F, 0F); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); ResourceManager.gascent.renderPart("Flag"); - GL11.glShadeModel(GL11.GL_FLAT); } - + + GL11.glShadeModel(GL11.GL_FLAT); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glPopMatrix(); } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_centrifuge); + } + + @Override + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.machine_centrifuge), + Item.getItemFromBlock(ModBlocks.machine_gascent) + }; + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -4, 0); + GL11.glScaled(3.5, 3.5, 3.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glShadeModel(GL11.GL_SMOOTH); + if(item.getItem() == Item.getItemFromBlock(ModBlocks.machine_gascent)) { + bindTexture(ResourceManager.gascent_tex); ResourceManager.gascent.renderPart("Centrifuge"); + } else { + bindTexture(ResourceManager.centrifuge_tex); ResourceManager.centrifuge.renderAll(); + } + GL11.glShadeModel(GL11.GL_FLAT); + } + }; + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java new file mode 100644 index 000000000..abaacf24c --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -0,0 +1,94 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.lib.RefStrings; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityCrucible; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; + +public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRendererProvider { + + public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava.png"); + + @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.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + } + + bindTexture(ResourceManager.crucible_tex); + ResourceManager.crucible_heat.renderAll(); + + TileEntityCrucible crucible = (TileEntityCrucible) tile; + + if(!crucible.recipeStack.isEmpty() || !crucible.wasteStack.isEmpty()) { + int totalCap = crucible.recipeZCapacity + crucible.wasteZCapacity; + int totalMass = 0; + + for(MaterialStack stack : crucible.recipeStack) totalMass += stack.amount; + for(MaterialStack stack : crucible.wasteStack) totalMass += stack.amount; + + double level = ((double) totalMass / (double) totalCap) * 0.875D; + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + bindTexture(lava); + Tessellator tess = Tessellator.instance; + tess.setNormal(0F, 1F, 0F); + tess.startDrawingQuads(); + tess.addVertexWithUV(-1, 0.5 + level, -1, 0, 0); + tess.addVertexWithUV(-1, 0.5 + level, 1, 0, 1); + tess.addVertexWithUV(1, 0.5 + level, 1, 1, 1); + tess.addVertexWithUV(1, 0.5 + level, -1, 1, 0); + tess.draw(); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_crucible); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -1.5, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommon() { + bindTexture(ResourceManager.crucible_tex); + ResourceManager.crucible_heat.renderAll(); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java b/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java new file mode 100644 index 000000000..9ae8998cf --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderElectricHeater.java @@ -0,0 +1,55 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; + +import 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; + +public class RenderElectricHeater 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.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + } + + bindTexture(ResourceManager.heater_electric_tex); + ResourceManager.heater_electric.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.heater_electric); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glScaled(3, 3, 3); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glTranslated(-0.5, 0, 0); + bindTexture(ResourceManager.heater_electric_tex); + ResourceManager.heater_electric.renderAll(); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderFEL.java b/src/main/java/com/hbm/render/tileentity/RenderFEL.java index 9d888457f..dbf119500 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFEL.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFEL.java @@ -49,8 +49,8 @@ public class RenderFEL extends TileEntitySpecialRenderer { int length = fel.distance - 3; GL11.glTranslated(0, 1.5, -1.5); if(fel.power > fel.powerReq * Math.pow(2, fel.mode.ordinal()) && fel.isOn && !(fel.mode == EnumWavelengths.NULL) && length > 0) { - BeamPronter.prontBeam(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); - BeamPronter.prontBeam(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(tileEntity.getWorldObj().getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(tileEntity.getWorldObj().getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java index 1ace84964..a1c420293 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java @@ -5,12 +5,14 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class RenderFENSU extends TileEntitySpecialRenderer { +public class RenderFENSU extends TileEntitySpecialRenderer implements ITileActorRenderer { @Override public void renderTileEntityAt(TileEntity te, double x, double y, double z, float f) { @@ -59,4 +61,58 @@ public class RenderFENSU extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + float lastSpin = data.getFloat("lastSpin"); + float spin = data.getFloat("spin"); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.fensu_tex); + ResourceManager.fensu.renderPart("Base"); + + float rot = lastSpin + (spin - lastSpin) * interp; + + GL11.glTranslated(0, 2.5, 0); + GL11.glRotated(rot, 1, 0, 0); + GL11.glTranslated(0, -2.5, 0); + ResourceManager.fensu.renderPart("Disc"); + ResourceManager.fensu.renderPart("Lights"); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + float lastSpin = 0; + float spin = data.getFloat("spin"); + float speed = data.getFloat("speed"); + + lastSpin = spin; + spin += speed; + + if(spin >= 360) { + lastSpin -= 360; + spin -= 360; + } + + data.setFloat("lastSpin", lastSpin); + data.setFloat("spin", spin); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java b/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java index 239ef1ee9..2966ec618 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFluidTank.java @@ -5,15 +5,19 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.render.util.DiamondPronter; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; 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; @@ -37,12 +41,9 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.tank_tex); ResourceManager.fluidtank.renderPart("Frame"); - - String s = "NONE"; - if(tileEntity instanceof TileEntityMachineFluidTank) - s = ((TileEntityMachineFluidTank) tileEntity).tank.getTankType().getName(); - - bindTexture(new ResourceLocation(RefStrings.MODID, "textures/models/tank/tank_" + s + ".png")); + + TileEntityMachineFluidTank tank = (TileEntityMachineFluidTank) tileEntity; + bindTexture(new ResourceLocation(RefStrings.MODID, getTextureFromType(tank.tank.getTankType()))); ResourceManager.fluidtank.renderPart("Tank"); GL11.glShadeModel(GL11.GL_FLAT); @@ -70,6 +71,15 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glPopMatrix(); RenderHelper.enableStandardItemLighting(); } + + public String getTextureFromType(FluidType type) { + String s = type.getName(); + + if(type.isAntimatter() || (type.hasTrait(FT_Corrosive.class) && type.getTrait(FT_Corrosive.class).isHighlyCorrosive())) + s = "DANGER"; + + return "textures/models/tank/tank_" + s + ".png"; + } @Override public Item getItemForRenderer() { @@ -85,12 +95,19 @@ public class RenderFluidTank extends TileEntitySpecialRenderer implements IItemR GL11.glTranslated(0, -2, 0); GL11.glScaled(3.5, 3.5, 3.5); } - public void renderCommon() { + public void renderCommonWithStack(ItemStack item) { GL11.glRotated(90, 0, 1, 0); GL11.glScaled(0.75, 0.75, 0.75); GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.tank_tex); ResourceManager.fluidtank.renderPart("Frame"); - bindTexture(ResourceManager.tank_label_tex); ResourceManager.fluidtank.renderPart("Tank"); + + FluidTank tank = new FluidTank(Fluids.NONE, 0, 0); + if(item.hasTagCompound() && item.getTagCompound().hasKey(IPersistentNBT.NBT_PERSISTENT_KEY)) { + tank.readFromNBT(item.getTagCompound().getCompoundTag(IPersistentNBT.NBT_PERSISTENT_KEY), "tank"); + } + + bindTexture(new ResourceLocation(RefStrings.MODID, getTextureFromType(tank.getTankType()))); + ResourceManager.fluidtank.renderPart("Tank"); GL11.glShadeModel(GL11.GL_FLAT); }}; } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java new file mode 100644 index 000000000..0976d9c12 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -0,0 +1,137 @@ +package com.hbm.render.tileentity; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.IRenderFoundry; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.ForgeHooksClient; + +public class RenderFoundry extends TileEntitySpecialRenderer { + + public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava_gray.png"); + + private void drawItem(ItemStack stack, double height) { + GL11.glPushMatrix(); + RenderItem render = new RenderItem(); + GL11.glTranslated(0.125D, height, 0.125D); + + double scale = 0.0625D * 12D / 16D; + GL11.glScaled(scale, scale, scale); + + GL11.glRotated(90, 1, 0, 0); + RenderHelper.enableGUIStandardItemLighting(); + if(!ForgeHooksClient.renderInventoryItem(RenderBlocks.getInstance(), Minecraft.getMinecraft().getTextureManager(), stack, true, 0.0F, 1.0F, 0.0F)) { + render.renderItemIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, 0, 0); + } + GL11.glPopMatrix(); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + + private void drawBlock(ItemStack stack, IRenderFoundry foundry) { + Tessellator tess = Tessellator.instance; + Block b = ((ItemBlock)stack.getItem()).field_150939_a; + IIcon icon = b.getIcon(1, stack.getItemDamage()); + bindTexture(TextureMap.locationBlocksTexture); + + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); + double h = foundry.outHeight(); + tess.addVertexWithUV(foundry.minX(), h, foundry.minZ(), icon.getMinU(), icon.getMaxV()); + tess.addVertexWithUV(foundry.minX(), h, foundry.maxZ(), icon.getMaxU(), icon.getMaxV()); + tess.addVertexWithUV(foundry.maxX(), h, foundry.maxZ(), icon.getMaxU(), icon.getMinV()); + tess.addVertexWithUV(foundry.maxX(), h, foundry.minZ(), icon.getMinU(), icon.getMinV()); + tess.draw(); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + IRenderFoundry foundry = (IRenderFoundry) tile; + Tessellator tess = Tessellator.instance; + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + if(foundry instanceof IInventory) { + IInventory inv = (IInventory) foundry; + ItemStack mold = inv.getStackInSlot(0); + + if(mold != null) { + drawItem(mold, foundry.moldHeight()); + } + ItemStack out = inv.getStackInSlot(1); + + if(out != null) { + if(out.getItem() instanceof ItemBlock) { + drawBlock(out, foundry); + } else { + drawItem(out, foundry.outHeight()); + } + } + } + + if(foundry.shouldRender()) { + + this.bindTexture(lava); + + int hex = foundry.getMat().moltenColor; + Color color = new Color(hex); + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + tess.startDrawingQuads(); + tess.setNormal(0F, 1F, 0F); + tess.setColorRGBA_F(1F, 1F, 1F, 0.3F); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.minX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.maxX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.maxZ(), foundry.maxZ(), foundry.minX()); + tess.addVertexWithUV(foundry.maxX(), foundry.getLevel(), foundry.minZ(), foundry.minZ(), foundry.minX()); + tess.draw(); + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + + GL11.glDepthMask(true); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderSawmill.java b/src/main/java/com/hbm/render/tileentity/RenderSawmill.java new file mode 100644 index 000000000..e6a66cfa1 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderSawmill.java @@ -0,0 +1,89 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntitySawmill; + +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; + +public class RenderSawmill 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.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntitySawmill sawmill = (TileEntitySawmill) tile; + + float rot = sawmill.lastSpin + (sawmill.spin - sawmill.lastSpin) * interp; + renderCommon(rot, sawmill.hasBlade); + + GL11.glPopMatrix(); + } + + private void renderCommon(float rot, boolean hasBlade) { + + bindTexture(ResourceManager.sawmill_tex); + ResourceManager.sawmill.renderPart("Main"); + + if(hasBlade) { + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.375, 0); + GL11.glRotatef(-rot * 2, 0, 0, 1); + GL11.glTranslated(0, -1.375, 0); + ResourceManager.sawmill.renderPart("Blade"); + GL11.glPopMatrix(); + } + + GL11.glPushMatrix(); + GL11.glTranslated(0.5625, 1.375, 0); + GL11.glRotatef(rot, 0, 0, 1); + GL11.glTranslated(-0.5625, -1.375, 0); + ResourceManager.sawmill.renderPart("GearLeft"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(-0.5625, 1.375, 0); + GL11.glRotatef(-rot, 0, 0, 1); + GL11.glTranslated(0.5625, -1.375, 0); + ResourceManager.sawmill.renderPart("GearRight"); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_sawmill); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -1.5, 0); + GL11.glScaled(3.25, 3.25, 3.25); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glRotatef(90, 0F, 1F, 0F); + boolean cog = item.getItemDamage() != 1; + RenderSawmill.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog); + }}; + } + +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index c45420249..38699104c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -7,14 +7,18 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityStirling; +import com.hbm.wiaj.actors.ITileActorRenderer; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; -public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider { +public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider, ITileActorRenderer { @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -33,14 +37,18 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe TileEntityStirling stirling = (TileEntityStirling) tile; float rot = stirling.lastSpin + (stirling.spin - stirling.lastSpin) * interp; - renderCommon(rot, stirling.hasCog); + renderCommon(rot, stirling.hasCog, stirling.getGeatMeta()); GL11.glPopMatrix(); } - private void renderCommon(float rot, boolean hasCog) { + private void renderCommon(float rot, boolean hasCog, int type) { - bindTexture(ResourceManager.stirling_tex); + if(type == 0) + bindTexture(ResourceManager.stirling_tex); + else + bindTexture(ResourceManager.stirling_steel_tex); + ResourceManager.stirling.renderPart("Base"); if(hasCog) { @@ -62,12 +70,25 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe GL11.glTranslated(Math.sin(rot * Math.PI / 90D) * 0.25 + 0.125, 0, 0); ResourceManager.stirling.renderPart("Piston"); } + + @Override + protected void bindTexture(ResourceLocation tex) { + Minecraft.getMinecraft().getTextureManager().bindTexture(tex); + } @Override public Item getItemForRenderer() { return Item.getItemFromBlock(ModBlocks.machine_stirling); } + @Override + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.machine_stirling), + Item.getItemFromBlock(ModBlocks.machine_stirling_steel) + }; + } + @Override public IItemRenderer getRenderer() { return new ItemRenderBase( ) { @@ -78,7 +99,52 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe public void renderCommonWithStack(ItemStack item) { GL11.glRotatef(90, 0F, 1F, 0F); boolean cog = item.getItemDamage() != 1; - RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog); + RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog, item.getItem() == Item.getItemFromBlock(ModBlocks.machine_stirling) ? 0 : 1); }}; } + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + int type = data.getInteger("type"); + boolean hasCog = data.getBoolean("hasCog"); + float lastSpin = data.getFloat("lastSpin"); + float spin = data.getFloat("spin"); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + renderCommon(lastSpin + (spin - lastSpin) * interp, hasCog, type); + + GL11.glPopMatrix(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + float lastSpin = 0; + float spin = data.getFloat("spin"); + float speed = data.getFloat("speed"); + + lastSpin = spin; + spin += speed; + + if(spin >= 360) { + lastSpin -= 360; + spin -= 360; + } + + data.setFloat("lastSpin", lastSpin); + data.setFloat("spin", spin); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java index 0e4de4cd2..8acb27dac 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretHIMARS.java @@ -3,6 +3,8 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.turret.TileEntityTurretHIMARS; @@ -38,16 +40,36 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt ResourceManager.turret_himars.renderPart("Carriage"); GL11.glTranslated(0, 2.25, 2); - GL11.glRotated(pitch + 15, 1, 0, 0); + GL11.glRotated(pitch, 1, 0, 0); GL11.glTranslated(0, -2.25, -2); ResourceManager.turret_himars.renderPart("Launcher"); - //GL11.glTranslated(0, 0, -5 + (System.currentTimeMillis() / 1000D) % 5D); + + double barrel = turret.lastCrane + (turret.crane - turret.lastCrane) * interp; + double length = -5D; + GL11.glTranslated(0, 0, barrel * length); ResourceManager.turret_himars.renderPart("Crane"); - bindTexture(ResourceManager.himars_standard_tex); - ResourceManager.turret_himars.renderPart("TubeStandard"); - ResourceManager.turret_himars.renderPart("CapStandard1"); - ResourceManager.turret_himars.renderPart("CapStandard2"); - ResourceManager.turret_himars.renderPart("CapStandard4"); + + if(turret.typeLoaded >= 0) { + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[turret.typeLoaded]; + + if(type.modelType == 0) { + bindTexture(ResourceManager.himars_standard_tex); + ResourceManager.turret_himars.renderPart("TubeStandard"); + + for(int i = 0; i < turret.ammo; i++) { + ResourceManager.turret_himars.renderPart("CapStandard" + (5 - i + 1)); + } + } + + if(type.modelType == 1) { + bindTexture(ResourceManager.himars_single_tex); + ResourceManager.turret_himars.renderPart("TubeSingle"); + + if(turret.hasAmmo()) { + ResourceManager.turret_himars.renderPart("CapSingle"); + } + } + } GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); @@ -68,6 +90,7 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt public void renderCommonWithStack(ItemStack item) { GL11.glRotatef(-90, 0F, 1F, 0F); GL11.glScaled(0.5, 0.5, 0.5); + GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.turret_arty_tex); ResourceManager.turret_arty.renderPart("Base"); bindTexture(ResourceManager.turret_himars_tex); @@ -76,6 +99,7 @@ public class RenderTurretHIMARS extends TileEntitySpecialRenderer implements IIt ResourceManager.turret_himars.renderPart("Crane"); bindTexture(ResourceManager.himars_standard_tex); ResourceManager.turret_himars.renderPart("TubeStandard"); + GL11.glShadeModel(GL11.GL_FLAT); }}; } } diff --git a/src/main/java/com/hbm/render/tileentity/RendererObjTester.java b/src/main/java/com/hbm/render/tileentity/RendererObjTester.java index 53dcfb817..4658a45ee 100644 --- a/src/main/java/com/hbm/render/tileentity/RendererObjTester.java +++ b/src/main/java/com/hbm/render/tileentity/RendererObjTester.java @@ -10,6 +10,7 @@ import org.lwjgl.opengl.GL12; import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.util.BeamPronter; +import com.hbm.render.util.HorsePronter; import com.hbm.render.util.RenderMiscEffects; import com.hbm.render.util.BeamPronter.EnumBeamType; import com.hbm.render.util.BeamPronter.EnumWaveType; @@ -39,7 +40,30 @@ public class RendererObjTester extends TileEntitySpecialRenderer { } @Override - public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + + this.bindTexture(HorsePronter.tex_demohorse); + HorsePronter.reset(); + //HorsePronter.pose(HorsePronter.id_lfl, 0, System.currentTimeMillis() % 360 / 10D, 0); + double r = 60; + HorsePronter.pose(HorsePronter.id_body, 0, -r, 0); + HorsePronter.pose(HorsePronter.id_tail, 0, 45, 90); + HorsePronter.pose(HorsePronter.id_lbl, 0, -90 + r, 35); + HorsePronter.pose(HorsePronter.id_rbl, 0, -90 + r, -35); + HorsePronter.pose(HorsePronter.id_lfl, 0, r - 10, 5); + HorsePronter.pose(HorsePronter.id_rfl, 0, r - 10, -5); + HorsePronter.pose(HorsePronter.id_head, 0, r, 0); + HorsePronter.enableHorn(); + HorsePronter.pront(); + + GL11.glPopMatrix(); + } + + + public void renderTileEntityAt2(TileEntity tileEntity, double x, double y, double z, float f) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); diff --git a/src/main/java/com/hbm/render/util/BeamPronter.java b/src/main/java/com/hbm/render/util/BeamPronter.java index bdf1f4826..27a065534 100644 --- a/src/main/java/com/hbm/render/util/BeamPronter.java +++ b/src/main/java/com/hbm/render/util/BeamPronter.java @@ -17,11 +17,18 @@ public class BeamPronter { public static enum EnumBeamType { SOLID, LINE } + + private static boolean depthMask = false; + public static void prontBeamwithDepth(Vec3 skeleton, EnumWaveType wave, EnumBeamType beam, int outerColor, int innerColor, int start, int segments, float size, int layers, float thickness) { + depthMask = true; + prontBeam(skeleton, wave, beam, outerColor, innerColor, start, segments, size, layers, thickness); + depthMask = false; + } public static void prontBeam(Vec3 skeleton, EnumWaveType wave, EnumBeamType beam, int outerColor, int innerColor, int start, int segments, float size, int layers, float thickness) { GL11.glPushMatrix(); - GL11.glDepthMask(false); + GL11.glDepthMask(depthMask); float sYaw = (float) (Math.atan2(skeleton.xCoord, skeleton.zCoord) * 180F / Math.PI); float sqrt = MathHelper.sqrt_double(skeleton.xCoord * skeleton.xCoord + skeleton.zCoord * skeleton.zCoord); diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java new file mode 100644 index 000000000..e47629125 --- /dev/null +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -0,0 +1,123 @@ +package com.hbm.render.util; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.render.loader.HFRWavefrontObject; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; +import net.minecraftforge.client.model.IModelCustom; + +public class HorsePronter { + + public static final IModelCustom horse = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/horse.obj"), false).asDisplayList(); + + public static final ResourceLocation tex_demohorse = new ResourceLocation(RefStrings.MODID, "textures/models/horse/horse_demo.png"); + + private static Vec3[] pose = new Vec3[] { + Vec3.createVectorHelper(0, 0, 0), //head + Vec3.createVectorHelper(0, 0, 0), //left front leg + Vec3.createVectorHelper(0, 0, 0), //right front leg + Vec3.createVectorHelper(0, 0, 0), //left back leg + Vec3.createVectorHelper(0, 0, 0), //right back leg + Vec3.createVectorHelper(0, 0, 0), //tail + Vec3.createVectorHelper(0, 0, 0), //body + Vec3.createVectorHelper(0, 0, 0) //body offset + }; + + private static Vec3[] offsets = new Vec3[] { + Vec3.createVectorHelper(0, 1.125, 0.375), //head + Vec3.createVectorHelper(0.125, 0.75, 0.3125), //left front leg + Vec3.createVectorHelper(-0.125, 0.75, 0.3125), //right front leg + Vec3.createVectorHelper(0.125, 0.75, -0.25), //left back leg + Vec3.createVectorHelper(-0.125, 0.75, -0.25), //right back leg + Vec3.createVectorHelper(0, 1.125, -0.4375), //tail + Vec3.createVectorHelper(0, 0, 0), //body + Vec3.createVectorHelper(0, 0, 0) //body offset + }; + + public static final int id_head = 0; + public static final int id_lfl = 1; + public static final int id_rfl = 2; + public static final int id_lbl = 3; + public static final int id_rbl = 4; + public static final int id_tail = 5; + public static final int id_body = 6; + public static final int id_position = 7; + + private static boolean wings = false; + private static boolean horn = false; + private static boolean maleSnoot = false; + + public static void reset() { + + wings = false; + horn = false; + + for(Vec3 angles : pose) { + angles.xCoord = 0; + angles.yCoord = 0; + angles.zCoord = 0; + } + } + + public static void enableHorn() { horn = true; } + public static void enableWings() { wings = true; } + public static void setMaleSnoot() { maleSnoot = true; } + + public static void setAlicorn() { + enableHorn(); + enableWings(); + } + + public static void pose(int id, double yaw, double pitch, double roll) { + pose[id].xCoord = yaw; + pose[id].yCoord = pitch; + pose[id].zCoord = roll; + } + + public static void pront() { + + GL11.glPushMatrix(); + doTransforms(id_body); + + horse.renderPart("Body"); + + if(horn) { + renderWithTransform(id_head, "Head", "Mane", maleSnoot ? "NoseMale" : "NoseFemale", "HornPointy"); + } else { + renderWithTransform(id_head, "Head", "Mane", maleSnoot ? "NoseMale" : "NoseFemale"); + } + + renderWithTransform(id_lfl, "LeftFrontLeg"); + renderWithTransform(id_rfl, "RightFrontLeg"); + renderWithTransform(id_lbl, "LeftBackLeg"); + renderWithTransform(id_rbl, "RightBackLeg"); + renderWithTransform(id_tail, "Tail"); + + if(wings) { + horse.renderPart("LeftWing"); + horse.renderPart("RightWing"); + } + + GL11.glPopMatrix(); + } + + private static void doTransforms(int id) { + Vec3 rotation = pose[id]; + Vec3 offset = offsets[id]; + GL11.glTranslated(offset.xCoord, offset.yCoord, offset.zCoord); + GL11.glRotated(rotation.xCoord, 0, 1, 0); + GL11.glRotated(rotation.yCoord, 1, 0, 0); + GL11.glRotated(rotation.zCoord, 0, 0, 1); //TODO: check pitch and roll axis + GL11.glTranslated(-offset.xCoord, -offset.yCoord, -offset.zCoord); + } + + private static void renderWithTransform(int id, String... parts) { + GL11.glPushMatrix(); + doTransforms(id); + for(String part : parts) horse.renderPart(part); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java index 168311b29..d2ea47b0f 100644 --- a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java +++ b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java @@ -26,7 +26,7 @@ public class RenderAccessoryUtility { private static ResourceLocation nostalgia = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia.png"); private static ResourceLocation nostalgia2 = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeNostalgia2.png"); private static ResourceLocation sam = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeSam.png"); - private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy.png"); + private static ResourceLocation hoboy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeHoboy_mk3.png"); private static ResourceLocation master = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMaster.png"); private static ResourceLocation mek = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeMek.png"); private static ResourceLocation zippy = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeZippySqrl.png"); diff --git a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java index 1816841ff..3b49e22d8 100644 --- a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java +++ b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java @@ -117,7 +117,7 @@ public class RenderScreenOverlay { Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - public static void renderAmmo(ScaledResolution resolution, Gui gui, Item ammo, int count, int max, int dura, boolean renderCount) { + public static void renderAmmo(ScaledResolution resolution, Gui gui, ItemStack ammo, int count, int max, int dura, boolean renderCount) { GL11.glPushMatrix(); @@ -138,7 +138,7 @@ public class RenderScreenOverlay { GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); - itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(ammo), pX, pZ); + itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), ammo, pX, pZ); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); @@ -146,7 +146,7 @@ public class RenderScreenOverlay { Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - public static void renderAmmoAlt(ScaledResolution resolution, Gui gui, Item ammo, int count) { + public static void renderAmmoAlt(ScaledResolution resolution, Gui gui, ItemStack ammo, int count) { GL11.glPushMatrix(); @@ -162,7 +162,7 @@ public class RenderScreenOverlay { GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); - itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(ammo), pX, pZ); + itemRenderer.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), ammo, pX, pZ); RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); diff --git a/src/main/java/com/hbm/saveddata/satellites/Satellite.java b/src/main/java/com/hbm/saveddata/satellites/Satellite.java index c552b802c..70c65e0ac 100644 --- a/src/main/java/com/hbm/saveddata/satellites/Satellite.java +++ b/src/main/java/com/hbm/saveddata/satellites/Satellite.java @@ -50,11 +50,17 @@ public abstract class Satellite { registerSatellite(SatelliteLunarMiner.class, ModItems.sat_lunar_miner); registerSatellite(SatelliteHorizons.class, ModItems.sat_gerald); } - - private static void registerSatellite(Class sat, Item item) { - satellites.add(sat); - itemToClass.put(item, sat); + /** + * Register satellite. + * @param sat - Satellite class + * @param item - Satellite item (which will be placed in a rocket) + */ + public static void registerSatellite(Class sat, Item item) { + if(!itemToClass.containsKey(item) && !itemToClass.containsValue(sat)) { + satellites.add(sat); + itemToClass.put(item, sat); + } } public static void orbit(World world, int id, int freq, double x, double y, double z) { diff --git a/src/main/java/com/hbm/tileentity/IPersistentNBT.java b/src/main/java/com/hbm/tileentity/IPersistentNBT.java new file mode 100644 index 000000000..77f698de4 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/IPersistentNBT.java @@ -0,0 +1,51 @@ +package com.hbm.tileentity; + +import java.util.ArrayList; + +import com.hbm.util.CompatExternal; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public interface IPersistentNBT { + + public static final String NBT_PERSISTENT_KEY = "persistent"; + + public void writeNBT(NBTTagCompound nbt); + public void readNBT(NBTTagCompound nbt); + + public default ArrayList getDrops(Block b) { + ArrayList list = new ArrayList(); + ItemStack stack = new ItemStack(b); + NBTTagCompound data = new NBTTagCompound(); + writeNBT(data); + if(!data.hasNoTags()) + stack.stackTagCompound = data; + list.add(stack); + return list; + } + + public static ArrayList getDrops(World world, int x, int y, int z, Block b) { + + TileEntity tile = CompatExternal.getCoreFromPos(world, x, y, z); + + if(tile instanceof IPersistentNBT) { + return ((IPersistentNBT) tile).getDrops(b); + } + + return new ArrayList(); + } + + public static void restoreData(World world, int x, int y, int z, ItemStack stack) { + try { + if(!stack.hasTagCompound()) return; + IPersistentNBT tile = (IPersistentNBT) world.getTileEntity(x, y, z); + tile.readNBT(stack.stackTagCompound); + } catch(Exception ex) { + ex.printStackTrace(); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 9642a6399..b98da7dd4 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -32,9 +32,7 @@ public class TileMappings { put(TileEntityTestBombAdvanced.class, "tilentity_testbombadvanced"); put(TileEntityDiFurnace.class, "tilentity_diFurnace"); put(TileEntityTestNuke.class, "tilentity_testnuke"); - put(TileEntityRotationTester.class, "tilentity_rotationtester"); put(TileEntityTestRender.class, "tilentity_testrenderer"); - put(TileEntityTestContainer.class, "tilentity_testcontainer"); put(TileEntityObjTester.class, "tilentity_objtester"); put(TileEntityMachineCentrifuge.class, "tileentity_centrifuge"); put(TileEntityNukeMan.class, "tileentity_nukeman"); @@ -59,8 +57,6 @@ public class TileMappings { put(TileEntityDecoBlockAltW.class, "tileentity_deco_w"); put(TileEntityDecoBlockAltG.class, "tileentity_deco_g"); put(TileEntityDecoBlockAltF.class, "tileentity_deco_f"); - put(TileEntityCoreTitanium.class, "tileentity_core_titanium"); - put(TileEntityCoreAdvanced.class, "tileentity_core_advanced"); put(TileEntityCrashedBomb.class, "tileentity_crashed_balefire"); put(TileEntityConverterHeRf.class, "tileentity_converter_herf"); put(TileEntityConverterRfHe.class, "tileentity_converter_rfhe"); @@ -248,9 +244,20 @@ public class TileMappings { private static void putMachines() { put(TileEntityHeaterFirebox.class, "tileentity_firebox"); put(TileEntityHeaterOilburner.class, "tileentity_oilburner"); + put(TileEntityHeaterElectric.class, "tileentity_electric_heater"); put(TileEntityFurnaceIron.class, "tileentity_furnace_iron"); put(TileEntityFurnaceSteel.class, "tileentity_furnace_steel"); put(TileEntityStirling.class, "tileentity_stirling"); + put(TileEntitySawmill.class, "tileentity_sawmill"); + put(TileEntityCrucible.class, "tileentity_crucible"); + put(TileEntityHeatBoiler.class, "tileentity_heat_boiler"); + + put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); + put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); + put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); + put(TileEntityFoundryTank.class, "tileentity_foundry_tank"); + put(TileEntityFoundryOutlet.class, "tileentity_foundry_outlet"); + put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter"); put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); put(TileEntityMachineRadiolysis.class, "tileentity_radiolysis"); @@ -325,6 +332,7 @@ public class TileMappings { put(TileEntityCraneExtractor.class, "tileentity_extractor"); put(TileEntityCraneBoxer.class, "tileentity_boxer"); put(TileEntityCraneUnboxer.class, "tileentity_unboxer"); + put(TileEntityCraneRouter.class, "tileentity_router"); } private static void put(Class clazz, String... names) { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index cbe1fac9c..4dcd051a4 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -7,9 +7,9 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.handler.MissileStruct; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index a001e3748..ed6d1216d 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -7,9 +7,9 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.handler.MissileStruct; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissile; import com.hbm.items.weapon.ItemMissile; diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java b/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java deleted file mode 100644 index f4e23a0b2..000000000 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityRotationTester.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hbm.tileentity.deco; - -import net.minecraft.tileentity.TileEntity; - -public class TileEntityRotationTester extends TileEntity { - - @Override - public int getBlockMetadata() - { - if (this.blockMetadata == -1) - { - this.blockMetadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); - } - - return this.blockMetadata; - } - -} diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java b/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java deleted file mode 100644 index 3fde6ab7a..000000000 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityTestContainer.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.hbm.tileentity.deco; - -import com.hbm.blocks.test.TestContainer; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockChest; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntityChest; - -public class TileEntityTestContainer extends TileEntityChest { - - private String customName; - - private ItemStack[] chestContents = new ItemStack[9]; - - private int cachedChestType; - - public TileEntityTestContainer adjacentChestZNeg; - public TileEntityTestContainer adjacentChestXPos; - public TileEntityTestContainer adjacentChestXNeg; - public TileEntityTestContainer adjacentChestZPos; - - @Override - public String getInventoryName() - { - return this.hasCustomInventoryName() ? this.customName : "container.testContainer"; - } - - @Override - public boolean hasCustomInventoryName() - { - return this.customName != null && this.customName.length() > 0; - } - - @Override - public void func_145976_a(String p_145976_1_) - { - this.customName = p_145976_1_; - } - - @Override - public void readFromNBT(NBTTagCompound p_145839_1_) - { - super.readFromNBT(p_145839_1_); - NBTTagList nbttaglist = p_145839_1_.getTagList("Items", 10); - this.chestContents = new ItemStack[this.getSizeInventory()]; - - if (p_145839_1_.hasKey("TestContainer", 8)) - { - this.customName = p_145839_1_.getString("TestContainer"); - } - - for (int i = 0; i < nbttaglist.tagCount(); ++i) - { - NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.chestContents.length) - { - this.chestContents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound p_145841_1_) - { - super.writeToNBT(p_145841_1_); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.chestContents.length; ++i) - { - if (this.chestContents[i] != null) - { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - nbttagcompound1.setByte("Slot", (byte)i); - this.chestContents[i].writeToNBT(nbttagcompound1); - nbttaglist.appendTag(nbttagcompound1); - } - } - - p_145841_1_.setTag("Items", nbttaglist); - - if (this.hasCustomInventoryName()) - { - p_145841_1_.setString("TestContainer", this.customName); - } - } - - private void func_145978_a(TileEntityTestContainer p_145978_1_, int p_145978_2_) - { - if (p_145978_1_.isInvalid()) - { - this.adjacentChestChecked = false; - } - else if (this.adjacentChestChecked) - { - switch (p_145978_2_) - { - case 0: - if (this.adjacentChestZPos != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 1: - if (this.adjacentChestXNeg != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 2: - if (this.adjacentChestZNeg != p_145978_1_) - { - this.adjacentChestChecked = false; - } - - break; - case 3: - if (this.adjacentChestXPos != p_145978_1_) - { - this.adjacentChestChecked = false; - } - } - } - } - - @Override - public void checkForAdjacentChests() - { - if (!this.adjacentChestChecked) - { - this.adjacentChestChecked = true; - this.adjacentChestZNeg = null; - this.adjacentChestXPos = null; - this.adjacentChestXNeg = null; - this.adjacentChestZPos = null; - - if (this.func_145977_a(this.xCoord - 1, this.yCoord, this.zCoord)) - { - this.adjacentChestXNeg = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord - 1, this.yCoord, this.zCoord); - } - - if (this.func_145977_a(this.xCoord + 1, this.yCoord, this.zCoord)) - { - this.adjacentChestXPos = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord + 1, this.yCoord, this.zCoord); - } - - if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord - 1)) - { - this.adjacentChestZNeg = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord - 1); - } - - if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord + 1)) - { - this.adjacentChestZPos = (TileEntityTestContainer)this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord + 1); - } - - if (this.adjacentChestZNeg != null) - { - this.adjacentChestZNeg.func_145978_a(this, 0); - } - - if (this.adjacentChestZPos != null) - { - this.adjacentChestZPos.func_145978_a(this, 2); - } - - if (this.adjacentChestXPos != null) - { - this.adjacentChestXPos.func_145978_a(this, 1); - } - - if (this.adjacentChestXNeg != null) - { - this.adjacentChestXNeg.func_145978_a(this, 3); - } - } - } - - private boolean func_145977_a(int p_145977_1_, int p_145977_2_, int p_145977_3_) - { - if (this.worldObj == null) - { - return false; - } - else - { - Block block = this.worldObj.getBlock(p_145977_1_, p_145977_2_, p_145977_3_); - return block instanceof TestContainer && ((TestContainer)block).field_149956_a == this.func_145980_j(); - } - } - - @Override - public int func_145980_j() - { - if (this.cachedChestType == -1) - { - if (this.worldObj == null || !(this.getBlockType() instanceof TestContainer)) - { - return 0; - } - - this.cachedChestType = ((BlockChest)this.getBlockType()).field_149956_a; - } - - return this.cachedChestType; - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java new file mode 100644 index 000000000..cae2f1e93 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/IRenderFoundry.java @@ -0,0 +1,21 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.NTMMaterial; + +public interface IRenderFoundry { + + /** Returns whether a molten metal layer should be rendered in the TESR */ + public boolean shouldRender(); + /** Returns the Y-offset of the molten metal layer */ + public double getLevel(); + /** Returns the NTM Mat used, mainly for the color */ + public NTMMaterial getMat(); + + /* Return size constraints for the rectangle */ + public double minX(); + public double maxX(); + public double minZ(); + public double maxZ(); + public double moldHeight(); + public double outHeight(); +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java index 21748df64..ac27f077c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSBase.java @@ -6,9 +6,9 @@ import java.util.Random; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCatalyst; import com.hbm.items.machine.ItemSatChip; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java index ce834f238..7a3107643 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSEmitter.java @@ -7,9 +7,9 @@ import java.util.Random; import com.hbm.explosion.ExplosionLarge; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java index 519396d26..817398684 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityAMSLimiter.java @@ -5,9 +5,9 @@ import java.util.Random; import com.hbm.explosion.ExplosionLarge; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 29634935e..80a35fdeb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -7,10 +7,11 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.lib.Library; import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; @@ -53,33 +54,35 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc if(!worldObj.isRemote) { - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - //some funky crashfixing for unlikely cases - if(outs == null) { - tanks[0].setTankType(Fluids.STEAM); - tanks[1].setTankType(Fluids.SPENTSTEAM); - outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); + boolean operational = false; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE); //100% efficiency + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int ops = Math.min(inputOps, outputOps); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + operational = ops > 0; + } } - tanks[1].setTankType((FluidType) outs[0]); + //if(this.tanks[1].getFill() > 0) System.out.println(this.tanks[1].getTankType().name()); - int processMax = (int) Math.ceil(tanks[0].getFill() / (Integer)outs[2]); //the maximum amount of cycles total - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += (Integer)outs[3] * cycles; + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); this.sendPower(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir); for(BlockPos pos : this.getConPos()) { - this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); //TODO: there's no directions for this yet because idc + this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); } @@ -88,7 +91,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc turnTimer--; - if(cycles > 0) + if(operational) turnTimer = 25; this.fillFluidInit(tanks[1].getTankType()); @@ -282,4 +285,9 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 71df52462..fbaf20204 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; @@ -163,4 +163,9 @@ public class TileEntityCondenser extends TileEntity implements IFluidAcceptor, I public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks [0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index 1a38dbc3b..9df3a1fb7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -4,9 +4,9 @@ import java.util.List; import com.hbm.entity.effect.EntityCloudFleijaRainbow; import com.hbm.entity.logic.EntityNukeExplosionMK3; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCatalyst; import com.hbm.lib.Library; @@ -27,6 +27,7 @@ public class TileEntityCore extends TileEntityMachineBase { public int heat; public int color; public FluidTank[] tanks; + private boolean lastTickValid = false; public TileEntityCore() { super(3); @@ -45,7 +46,15 @@ public class TileEntityCore extends TileEntityMachineBase { if(!worldObj.isRemote) { - if(heat > 0 && heat >= field) { + int chunkX = xCoord << 4; + int chunkZ = zCoord << 4; + + lastTickValid = worldObj.getChunkProvider().chunkExists(chunkX + 1, chunkZ + 1) && + worldObj.getChunkProvider().chunkExists(chunkX + 1, chunkZ - 1) && + worldObj.getChunkProvider().chunkExists(chunkX - 1, chunkZ + 1) && + worldObj.getChunkProvider().chunkExists(chunkX - 1, chunkZ - 1); + + if(lastTickValid && heat > 0 && heat >= field) { int fill = tanks[0].getFill() + tanks[1].getFill(); int max = tanks[0].getMaxFill() + tanks[1].getMaxFill(); @@ -87,7 +96,11 @@ public class TileEntityCore extends TileEntityMachineBase { networkPack(data, 250); heat = 0; - field = 0; + + if(lastTickValid && field > 0) { + field -= 1; + } + this.markDirty(); } else { @@ -139,6 +152,9 @@ public class TileEntityCore extends TileEntityMachineBase { public boolean isReady() { + if(!lastTickValid) + return false; + if(getCore() == 0) return false; @@ -241,6 +257,7 @@ public class TileEntityCore extends TileEntityMachineBase { tanks[0].readFromNBT(nbt, "fuel1"); tanks[1].readFromNBT(nbt, "fuel2"); + this.field = nbt.getInteger("field"); } @Override @@ -249,6 +266,7 @@ public class TileEntityCore extends TileEntityMachineBase { tanks[0].writeToNBT(nbt, "fuel1"); tanks[1].writeToNBT(nbt, "fuel2"); + nbt.setInteger("field", this.field); } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java deleted file mode 100644 index 27e1b8b90..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreAdvanced.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IFactory; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemBattery; -import com.hbm.tileentity.TileEntityLoadedBase; - -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyUser; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityCoreAdvanced extends TileEntityLoadedBase implements ISidedInventory, IFactory, IEnergyUser { - - public int progress = 0; - public long power = 0; - public int soundCycle = 0; - public final static int processTime = 100; - public final static int maxPower = (int)((ItemBattery)ModItems.factory_core_advanced).getMaxCharge(); - private ItemStack slots[]; - - private String customName; - - public TileEntityCoreAdvanced() { - slots = new ItemStack[27]; - } - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.factoryAdvanced"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; - } - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return true; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[0]; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return false; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.progress = nbt.getShort("cookTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setShort("cookTime", (short) progress); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Override - public boolean isStructureValid(World world) { - if(world.getBlock(this.xCoord, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_core && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull && - (world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_conductor || world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull) && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull && - (world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_conductor || world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull) && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_advanced_hull) - { - return true; - } - return false; - } - - @Override - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } - - @Override - public int getProgressScaled(int i) { - return (progress * i) / processTime; - } - - @Override - public boolean isProcessable(ItemStack item) { - if(item != null) - { - return FurnaceRecipes.smelting().getSmeltingResult(item) != null; - } else { - return false; - } - } - - @Override - public void updateEntity() { } - - @Override - public void setPower(long i) { } - - @Override - public long getPower() { - return power; - } - @Override - public long getMaxPower() { - return maxPower; - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index a4b621ec0..4aca127f2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -3,9 +3,9 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.TileEntityMachineBase; @@ -292,7 +292,12 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne @Override public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tank}; + return new FluidTank[] { tank }; + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; } // do some opencomputer stuff diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index 82e1f9fac..94f8f7540 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidStandardReceiver; @@ -182,6 +182,11 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } // do some opencomputer stuff @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 905e328b2..b7822bf84 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.block.ILaserable; @@ -178,6 +178,11 @@ public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEn return new FluidTank[] { tank }; } + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + // do some opencomputer stuff @Override public String getComponentName() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index 1ec967d45..d66736845 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -65,7 +65,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I if(te instanceof TileEntityCore) { TileEntityCore core = (TileEntityCore)te; - core.field = watts; + core.field = Math.max(core.field, watts); this.power -= demand; beam = i; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java deleted file mode 100644 index 1af5b3cfd..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreTitanium.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IFactory; -import com.hbm.interfaces.Spaghetti; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemBattery; -import com.hbm.tileentity.TileEntityLoadedBase; - -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyUser; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityCoreTitanium extends TileEntityLoadedBase implements ISidedInventory, IFactory, IEnergyUser { - - public int progress = 0; - public long power = 0; - public int soundCycle = 0; - public final static int processTime = 200; - public final static int maxPower = (int)((ItemBattery)ModItems.factory_core_titanium).getMaxCharge(); - private ItemStack slots[]; - - private String customName; - - public TileEntityCoreTitanium() { - slots = new ItemStack[23]; - } - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.factoryTitanium"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; - } - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return true; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[0]; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return false; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.progress = nbt.getShort("cookTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setShort("cookTime", (short) progress); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Spaghetti("2016 bobcode *shudders*") - @Override - public boolean isStructureValid(World world) { - if(world.getBlock(this.xCoord, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_core && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull && - (world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_conductor || world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull) && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord - 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_furnace && - world.getBlock(this.xCoord + 1, this.yCoord, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull && - (world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_conductor || world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull) && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull && - world.getBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) == ModBlocks.factory_titanium_hull) - { - return true; - } - return false; - } - - @Override - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } - - @Override - public int getProgressScaled(int i) { - return (progress * i) / processTime; - } - - @Override - public boolean isProcessable(ItemStack item) { - if(item != null) - { - return FurnaceRecipes.smelting().getSmeltingResult(item) != null; - } else { - return false; - } - } - - @Override - public void updateEntity() { } - - @Override - public void setPower(long i) { } - - @Override - public long getPower() { - return power; - } - @Override - public long getMaxPower() { - return maxPower; - } - -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java new file mode 100644 index 000000000..91a84d522 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -0,0 +1,468 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.container.ContainerCrucible; +import com.hbm.inventory.gui.GUICrucible; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CrucibleUtil; + +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCrucible extends TileEntityMachineBase implements IGUIProvider { + + public int heat; + public static final int maxHeat = 100_000; + public int progress; + public static final int processTime = 20_000; + public static final double diffusion = 0.25D; + + //because eclipse's auto complete is dumb as a fucking rock, it's now called "ZCapacity" so it's listed AFTER the actual stacks in the auto complete list. + //also martin i know you read these: no i will not switch to intellij after using eclipse for 8 years. + public final int recipeZCapacity = MaterialShapes.BLOCK.q(16); + public final int wasteZCapacity = MaterialShapes.BLOCK.q(16); + public List recipeStack = new ArrayList(); + public List wasteStack = new ArrayList(); + + public TileEntityCrucible() { + super(10); + } + + @Override + public String getName() { + return "container.machineCrucible"; + } + + @Override + public int getInventoryStackLimit() { + return 1; //prevents clogging + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + tryPullHeat(); + + /* collect items */ + if(worldObj.getTotalWorldTime() % 5 == 0) { + List list = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 0.5, zCoord - 0.5, xCoord + 1.5, yCoord + 1, zCoord + 1.5)); + + for(EntityItem item : list) { + ItemStack stack = item.getEntityItem(); + if(this.isItemSmeltable(stack)) { + + for(int i = 1; i < 10; i++) { + if(slots[i] == null) { + + if(stack.stackSize == 1) { + slots[i] = stack.copy(); + item.setDead(); + break; + } else { + slots[i] = stack.copy(); + slots[i].stackSize = 1; + stack.stackSize--; + } + + this.markChanged(); + } + } + } + } + } + + int totalCap = recipeZCapacity + wasteZCapacity; + int totalMass = 0; + + for(MaterialStack stack : recipeStack) totalMass += stack.amount; + for(MaterialStack stack : wasteStack) totalMass += stack.amount; + + double level = ((double) totalMass / (double) totalCap) * 0.875D; + + List living = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5 + level, zCoord + 0.5).expand(1, 0, 1)); + for(EntityLivingBase entity : living) { + entity.attackEntityFrom(DamageSource.lava, 5F); + entity.setFire(5); + } + + /* smelt items from buffer */ + if(!trySmelt()) { + this.progress = 0; + } + + tryRecipe(); + + /* pour wasste stack */ + if(!this.wasteStack.isEmpty()) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, this.wasteStack, MaterialShapes.NUGGET.q(1), impact); + } + + /* pour recipe stack */ + if(!this.recipeStack.isEmpty()) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + List toCast = new ArrayList(); + + CrucibleRecipe recipe = this.getLoadedRecipe(); + //if no recipe is loaded, everything from the recipe stack will be drainable + if(recipe == null) { + toCast.addAll(this.recipeStack); + } else { + + for(MaterialStack stack : this.recipeStack) { + for(MaterialStack output : recipe.output) { + if(stack.material == output.material) { + toCast.add(stack); + break; + } + } + } + } + + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + CrucibleUtil.pourFullStack(worldObj, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord + 0.25D, zCoord + 0.5D + dir.offsetZ * 1.875D, 6, true, toCast, MaterialShapes.NUGGET.q(1), impact); + } + + /* clean up stacks */ + this.recipeStack.removeIf(o -> o.amount <= 0); + this.wasteStack.removeIf(x -> x.amount <= 0); + + /* sync */ + NBTTagCompound data = new NBTTagCompound(); + int[] rec = new int[recipeStack.size() * 2]; + int[] was = new int[wasteStack.size() * 2]; + for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } + for(int i = 0; i < wasteStack.size(); i++) { MaterialStack sta = wasteStack.get(i); was[i * 2] = sta.material.id; was[i * 2 + 1] = sta.amount; } + data.setIntArray("rec", rec); + data.setIntArray("was", was); + data.setInteger("progress", progress); + data.setInteger("heat", heat); + this.networkPack(data, 25); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + + this.recipeStack.clear(); + this.wasteStack.clear(); + + int[] rec = nbt.getIntArray("rec"); + for(int i = 0; i < rec.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); + } + + int[] was = nbt.getIntArray("was"); + for(int i = 0; i < was.length / 2; i++) { + wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + } + + this.progress = nbt.getInteger("progress"); + this.heat = nbt.getInteger("heat"); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + int[] rec = nbt.getIntArray("rec"); + for(int i = 0; i < rec.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); + } + + int[] was = nbt.getIntArray("was"); + for(int i = 0; i < was.length / 2; i++) { + wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + } + + this.progress = nbt.getInteger("progress"); + this.heat = nbt.getInteger("heat"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + int[] rec = new int[recipeStack.size() * 2]; + int[] was = new int[wasteStack.size() * 2]; + for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } + for(int i = 0; i < wasteStack.size(); i++) { MaterialStack sta = wasteStack.get(i); was[i * 2] = sta.material.id; was[i * 2 + 1] = sta.amount; } + nbt.setIntArray("rec", rec); + nbt.setIntArray("was", was); + nbt.setInteger("progress", progress); + nbt.setInteger("heat", heat); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int diff = source.getHeatStored() - this.heat; + + if(diff == 0) { + return; + } + + if(diff > 0) { + diff = (int) Math.ceil(diff * diffusion); + source.useUpHeat(diff); + this.heat += diff; + if(this.heat > this.maxHeat) + this.heat = this.maxHeat; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); + } + + protected boolean trySmelt() { + + if(this.heat < maxHeat / 2) return false; + + int slot = this.getFirstSmeltableSlot(); + if(slot == -1) return false; + + int delta = this.heat - (maxHeat / 2); + delta *= 0.05; + + this.progress += delta; + this.heat -= delta; + + if(this.progress >= processTime) { + this.progress = 0; + + List materials = Mats.getMaterialsFromItem(slots[slot]); + CrucibleRecipe recipe = getLoadedRecipe(); + + for(MaterialStack material : materials) { + boolean mainStack = recipe != null && (getQuantaFromType(recipe.input, material.material) > 0 || getQuantaFromType(recipe.output, material.material) > 0); + + if(mainStack) { + this.addToStack(this.recipeStack, material); + } else { + this.addToStack(this.wasteStack, material); + } + } + + this.decrStackSize(slot, 1); + } + + return true; + } + + protected void tryRecipe() { + CrucibleRecipe recipe = this.getLoadedRecipe(); + + if(recipe == null) return; + if(worldObj.getTotalWorldTime() % recipe.frequency > 0) return; + + for(MaterialStack stack : recipe.input) { + if(getQuantaFromType(this.recipeStack, stack.material) < stack.amount) return; + } + + for(MaterialStack stack : this.recipeStack) { + stack.amount -= getQuantaFromType(recipe.input, stack.material); + } + + outer: + for(MaterialStack out : recipe.output) { + + for(MaterialStack stack : this.recipeStack) { + if(stack.material == out.material) { + stack.amount += out.amount; + continue outer; + } + } + + this.recipeStack.add(out.copy()); + } + } + + protected int getFirstSmeltableSlot() { + + for(int i = 1; i < 10; i++) { + + ItemStack stack = slots[i]; + + if(stack != null && isItemSmeltable(stack)) { + return i; + } + } + + return -1; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + + if(i == 0) { + return stack.getItem() == ModItems.crucible_template; + } + + return isItemSmeltable(stack); + } + + public boolean isItemSmeltable(ItemStack stack) { + + List materials = Mats.getMaterialsFromItem(stack); + + //if there's no materials in there at all, don't smelt + if(materials.isEmpty()) + return false; + + CrucibleRecipe recipe = getLoadedRecipe(); + + //needs to be true, will always be true if there's no recipe loaded + boolean matchesRecipe = recipe == null; + + //the amount of material in the entire recipe input + int recipeContent = recipe != null ? recipe.getInputAmount() : 0; + //the total amount of the current waste stack, used for simulation + int recipeAmount = getQuantaFromType(this.recipeStack, null); + int wasteAmount = getQuantaFromType(this.wasteStack, null); + + for(MaterialStack mat : materials) { + //if no recipe is loaded, everything will land in the waste stack + int recipeInputRequired = recipe != null ? getQuantaFromType(recipe.input, mat.material) : 0; + + //this allows pouring the ouput material back into the crucible + if(recipe != null && getQuantaFromType(recipe.output, mat.material) > 0) { + recipeAmount += mat.amount; + matchesRecipe = true; + continue; + } + + if(recipeInputRequired == 0) { + //if this type isn't required by the recipe, add it to the waste stack + wasteAmount += mat.amount; + } else { + + //the maximum is the recipe's ratio scaled up to the recipe stack's capacity + int matMaximum = recipeInputRequired * this.recipeZCapacity / recipeContent; + int amountStored = getQuantaFromType(recipeStack, mat.material); + + matchesRecipe = true; + + recipeAmount += mat.amount; + + //if the amount of that input would exceed the amount dictated by the recipe, return false + if(recipe != null && amountStored + mat.amount > matMaximum) + return false; + } + } + + //if the amount doesn't exceed the capacity and the recipe matches (or isn't null), return true + return recipeAmount <= this.recipeZCapacity && wasteAmount <= this.wasteZCapacity && matchesRecipe; + } + + public void addToStack(List stack, MaterialStack matStack) { + + for(MaterialStack mat : stack) { + if(mat.material == matStack.material) { + mat.amount += matStack.amount; + return; + } + } + + stack.add(matStack.copy()); + } + + public CrucibleRecipe getLoadedRecipe() { + + if(slots[0] != null && slots[0].getItem() == ModItems.crucible_template) { + return CrucibleRecipes.indexMapping.get(slots[0].getItemDamage()); + } + + return null; + } + + /* "Arrays and Lists don't have a common ancestor" my fucking ass */ + public int getQuantaFromType(MaterialStack[] stacks, NTMMaterial mat) { + for(MaterialStack stack : stacks) { + if(mat == null || stack.material == mat) { + return stack.amount; + } + } + return 0; + } + + public int getQuantaFromType(List stacks, NTMMaterial mat) { + int sum = 0; + for(MaterialStack stack : stacks) { + if(stack.material == mat) { + return stack.amount; + } + if(mat == null) { + sum += stack.amount; + } + } + return sum; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCrucible(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICrucible(player.inventory, this); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 2, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 1e9386e0a..e01421730 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.TileEntityMachineBase; @@ -187,4 +187,9 @@ public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implemen public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java index aaba4b26d..cdbb17d91 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumTower.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index 279812b36..1117c9c65 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.MachineDiFurnace; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPellet; import com.hbm.util.RTGUtil; @@ -19,18 +19,18 @@ import net.minecraft.tileentity.TileEntity; public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { private ItemStack slots[]; - + public int dualCookTime; public int dualPower; public static final int maxPower = 12800; public static final int processingSpeed = 400; - - private static final int[] slots_top = new int[] {0}; - private static final int[] slots_bottom = new int[] {3}; - private static final int[] slots_side = new int[] {1}; - + + private static final int[] slots_top = new int[] { 0 }; + private static final int[] slots_bottom = new int[] { 3 }; + private static final int[] slots_side = new int[] { 1 }; + private String customName; - + public TileEntityDiFurnace() { slots = new ItemStack[4]; } @@ -47,21 +47,19 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { @Override public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { + if(slots[i] != null) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } else { - return null; + return null; } } @Override public void setInventorySlotContents(int i, ItemStack itemStack) { slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { itemStack.stackSize = getInventoryStackLimit(); } } @@ -75,7 +73,7 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @@ -87,41 +85,42 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { @Override public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { + if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) { return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + } else { + return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64; } } - - //You scrubs aren't needed for anything (right now) + + // You scrubs aren't needed for anything (right now) @Override - public void openInventory() {} + public void openInventory() { + } + @Override - public void closeInventory() {} + public void closeInventory() { + } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - if(i == 3) - { + if(i == 3) { return false; } - + return true; } - + public boolean hasItemPower(ItemStack itemStack) { return getItemPower(itemStack) > 0; } - + + //TODO: replace this terribleness private static int getItemPower(ItemStack itemStack) { - if(itemStack == null) - { + if(itemStack == null) { return 0; - }else{ + } else { Item item = itemStack.getItem(); - + if(item == Items.coal) return 200; if(item == Item.getItemFromBlock(Blocks.coal_block)) return 2000; if(item == Items.lava_bucket) return 12800; @@ -133,78 +132,70 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { if(item == ModItems.briquette_lignite) return 200; if(item == ModItems.coke) return 400; if(item == ModItems.solid_fuel) return 400; - + return 0; } } - + @Override public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { + if(slots[i] != null) { + if(slots[i].stackSize <= j) { ItemStack itemStack = slots[i]; slots[i] = null; return itemStack; } ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { + if(slots[i].stackSize == 0) { slots[i] = null; } - + return itemStack1; } else { return null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - + this.dualPower = nbt.getInteger("powerTime"); this.dualCookTime = nbt.getShort("cookTime"); slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { + + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { + if(b0 >= 0 && b0 < slots.length) { slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("powerTime", dualPower); nbt.setShort("cookTime", (short) dualCookTime); NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { + + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); + nbt1.setByte("slot", (byte) i); slots[i].writeToNBT(nbt1); list.appendTag(nbt1); } } nbt.setTag("items", list); } - + @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) - { - return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); - } + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); + } @Override public boolean canInsertItem(int i, ItemStack itemStack, int j) { @@ -215,107 +206,97 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { public boolean canExtractItem(int i, ItemStack itemStack, int j) { return true; } - + public int getDiFurnaceProgressScaled(int i) { return (dualCookTime * i) / processingSpeed; } - + public int getPowerRemainingScaled(int i) { return (dualPower * i) / maxPower; } - + public boolean canProcess() { - if(slots[0] == null || slots[1] == null) - { + if(slots[0] == null || slots[1] == null) { return false; } - ItemStack itemStack = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); - if(itemStack == null) - { + ItemStack itemStack = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); + if(itemStack == null) { return false; } - - if(slots[3] == null) - { + + if(slots[3] == null) { return true; } - + if(!slots[3].isItemEqual(itemStack)) { return false; } - + if(slots[3].stackSize < getInventoryStackLimit() && slots[3].stackSize < slots[3].getMaxStackSize()) { return true; - }else{ + } else { return slots[3].stackSize < itemStack.getMaxStackSize(); } } - + private void processItem() { if(canProcess()) { - ItemStack itemStack = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); - - if(slots[3] == null) - { + ItemStack itemStack = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); + + if(slots[3] == null) { slots[3] = itemStack.copy(); - }else if(slots[3].isItemEqual(itemStack)) { + } else if(slots[3].isItemEqual(itemStack)) { slots[3].stackSize += itemStack.stackSize; } - - for(int i = 0; i < 2; i++) - { - if(slots[i].stackSize <= 0) - { + + for(int i = 0; i < 2; i++) { + if(slots[i].stackSize <= 0) { slots[i] = new ItemStack(slots[i].getItem().setFull3D()); - }else{ + } else { slots[i].stackSize--; } - if(slots[i].stackSize <= 0) - { + if(slots[i].stackSize <= 0) { slots[i] = null; } } } } - + public boolean hasPower() { return dualPower > 0; } - + public boolean isProcessing() { return this.dualCookTime > 0; } - + @Override public void updateEntity() { this.hasPower(); boolean flag1 = false; - - if(hasPower() && isProcessing()) - { + + if(hasPower() && isProcessing()) { this.dualPower = this.dualPower - 1; - - if(this.dualPower < 0) - { + + if(this.dualPower < 0) { this.dualPower = 0; } } - if (this.hasItemPower(this.slots[2]) - && this.dualPower <= (TileEntityDiFurnace.maxPower - TileEntityDiFurnace.getItemPower(this.slots[2]))) { + if(this.hasItemPower(this.slots[2]) && this.dualPower <= (TileEntityDiFurnace.maxPower - TileEntityDiFurnace.getItemPower(this.slots[2]))) { this.dualPower += getItemPower(this.slots[2]); - if (this.slots[2] != null) { + if(this.slots[2] != null) { flag1 = true; this.slots[2].stackSize--; - if (this.slots[2].stackSize == 0) { + if(this.slots[2].stackSize == 0) { this.slots[2] = this.slots[2].getItem().getContainerItem(this.slots[2]); } } } - if (hasPower() && canProcess()) { + if(hasPower() && canProcess()) { dualCookTime++; - if (this.dualCookTime == TileEntityDiFurnace.processingSpeed) { + if(this.dualCookTime == TileEntityDiFurnace.processingSpeed) { this.dualCookTime = 0; this.processItem(); flag1 = true; @@ -324,30 +305,26 @@ public class TileEntityDiFurnace extends TileEntity implements ISidedInventory { dualCookTime = 0; } - if(!worldObj.isRemote) - { + if(!worldObj.isRemote) { boolean trigger = true; - - if(hasPower() && canProcess() && this.dualCookTime == 0) - { + + if(hasPower() && canProcess() && this.dualCookTime == 0) { trigger = false; } - if (this.slots[2] != null && (this.slots[2].getItem() instanceof ItemRTGPellet)) { + if(this.slots[2] != null && (this.slots[2].getItem() instanceof ItemRTGPellet)) { this.dualPower += RTGUtil.updateRTGs(slots, new int[] { 2 }); if(this.dualPower > maxPower) this.dualPower = maxPower; } - - if(trigger) - { - flag1 = true; - MachineDiFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } + + if(trigger) { + flag1 = true; + MachineDiFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } } - - if(flag1) - { + + if(flag1) { this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index 595b46434..7a1a8dbe4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.machine.MachineDiFurnaceRTG; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.util.RTGUtil; import com.hbm.tileentity.TileEntityMachineBase; @@ -25,7 +25,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase if ((slots[0] == null || slots[1] == null) && !hasPower()) return false; - ItemStack recipeResult = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); + ItemStack recipeResult = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); if (recipeResult == null) return false; else if (slots[2] == null) @@ -73,7 +73,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase private void processItem() { if(canProcess()) { - ItemStack recipeOut = MachineRecipes.getFurnaceProcessingResult(slots[0], slots[1]); + ItemStack recipeOut = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); if(slots[2] == null) slots[2] = recipeOut.copy(); else if(slots[2].isItemEqual(recipeOut)) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 0608cff46..ed9135251 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java index 629f746f7..b764fd23a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java @@ -5,9 +5,9 @@ import java.util.Random; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IReactor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -435,8 +435,14 @@ public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedI else return 0; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[1], tanks[2] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java new file mode 100644 index 000000000..9d522c1c0 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBase.java @@ -0,0 +1,145 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Base class for all foundry channel type blocks - channels, casts, basins, tanks, etc. + * Foundry type blocks can only hold one type at a time and usually either store or move it around. + * @author hbm + * + */ +public abstract class TileEntityFoundryBase extends TileEntity implements ICrucibleAcceptor { + + public NTMMaterial type; + protected NTMMaterial lastType; + public int amount; + protected int lastAmount; + + @Override + public void updateEntity() { + + if(worldObj.isRemote) { + + if(shouldClientReRender() && this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + } else { + + if(this.lastType != this.type || this.lastAmount != this.amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + this.lastType = this.type; + this.lastAmount = this.amount; + } + } + } + + /** Recommended FALSE for things that update a whole lot. TRUE if updates only happen once every few ticks. */ + protected boolean shouldClientReRender() { + return true; + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.type = Mats.matById.get(nbt.getInteger("type")); + this.amount = nbt.getInteger("amount"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + if(this.type == null) { + nbt.setInteger("type", -1); + } else { + nbt.setInteger("type", this.type.id); + } + + nbt.setInteger("amount", this.amount); + } + + public abstract int getCapacity(); + + /** + * Standard check for testing if this material stack can be added to the casting block. Checks:
+ * - type matching
+ * - amount being at max
+ */ + public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + if(this.type != null && this.type != stack.material && this.amount > 0) return false; //reject if there's already a different material + if(this.amount >= this.getCapacity()) return false; //reject if the buffer is already full + return true; + } + + /** + * Standardized adding of material via pouring or flowing. Does:
+ * - sets material to match the input + * - adds the amount, not exceeding the maximum + * - returns the amount that cannot be added + */ + public MaterialStack standardAdd(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + this.type = stack.material; + + if(stack.amount + this.amount <= this.getCapacity()) { + this.amount += stack.amount; + return null; + } + + int required = this.getCapacity() - this.amount; + this.amount = this.getCapacity(); + + stack.amount -= required; + + return stack; + } + + /** Standard check with no additional limitations added */ + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } + + /** Standard check, but with the additional limitation that the only valid source direction is UP */ + @Override + public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + if(side != ForgeDirection.UP) return false; + return this.standardCheck(world, x, y, z, side, stack); + } + + /** Standard flow, no special handling required */ + @Override + public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { + return standardAdd(world, x, y, z, side, stack); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java new file mode 100644 index 000000000..145c2159a --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryBasin.java @@ -0,0 +1,46 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryBasin extends TileEntityFoundryCastingBase implements IRenderFoundry { + + @Override + public void updateEntity() { + super.updateEntity(); + } + + @Override + public int getMoldSize() { + return 1; + } + + /* Basin can't accept sideways flowing */ + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public boolean shouldRender() { + return this.type != null && this.amount > 0; + } + + @Override + public double getLevel() { + return 0.125 + this.amount * 0.75D / this.getCapacity(); + } + + @Override + public NTMMaterial getMat() { + return this.type; + } + + @Override public double minX() { return 0.125D; } + @Override public double maxX() { return 0.875D; } + @Override public double minZ() { return 0.125D; } + @Override public double maxZ() { return 0.875D; } + @Override public double moldHeight() { return 0.13D; } + @Override public double outHeight() { return 0.875D; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java new file mode 100644 index 000000000..bf2e63a95 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryCastingBase.java @@ -0,0 +1,221 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Thank god we have a base class now. Now with documentation and as little redundant crap in the child classes as possible. + * @author hbm + * + */ +public abstract class TileEntityFoundryCastingBase extends TileEntityFoundryBase implements ISidedInventory { + + public ItemStack slots[] = new ItemStack[2]; + public int cooloff = 100; + + @Override + public void updateEntity() { + super.updateEntity(); + + if(!worldObj.isRemote) { + + if(this.amount > this.getCapacity()) { + this.amount = this.getCapacity(); + } + + if(this.amount == 0) { + this.type = null; + } + + Mold mold = this.getInstalledMold(); + + if(mold != null && this.amount == this.getCapacity() && slots[1] == null) { + cooloff--; + + if(cooloff <= 0) { + this.amount = 0; + + ItemStack out = mold.getOutput(type); + + if(out != null) { + slots[1] = out.copy(); + } + + cooloff = 200; + } + + } else { + cooloff = 200; + } + } + } + + @Override + protected boolean shouldClientReRender() { + return false; + } + + /** Checks slot 0 to see what mold type is installed. Returns null if no mold is found or an incorrect size was used. */ + public Mold getInstalledMold() { + if(slots[0] == null) return null; + + if(slots[0].getItem() == ModItems.mold) { + Mold mold = ((ItemMold) slots[0].getItem()).getMold(slots[0]); + + if(mold.size == this.getMoldSize()) + return mold; + } + + return null; + } + + /** Returns the amount of quanta this casting block can hold, depending on the installed mold or 0 if no mold is found. */ + @Override + public int getCapacity() { + Mold mold = this.getInstalledMold(); + return mold == null ? 0 : mold.getCost(); + } + + /** + * Standard check for testing if this material stack can be added to the casting block. Checks:
+ * - type matching
+ * - amount being at max
+ * - whether a mold is installed
+ * - whether the mold can accept this type + */ + public boolean standardCheck(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + if(!super.standardCheck(world, x, y, z, side, stack)) return false; //reject if base conditions are not met + if(this.slots[1] != null) return false; //reject if a freshly casted item is still present + Mold mold = this.getInstalledMold(); + if(mold == null) return false; + + return mold.getOutput(stack.material) != null; //no OD match -> no pouring + } + + /** Returns an integer determining the mold size, 0 for small molds and 1 for the basin */ + public abstract int getMoldSize(); + + @Override + public ItemStack getStackInSlotOnClosing(int i) { + if(slots[i] != null) { + ItemStack itemStack = slots[i]; + slots[i] = null; + return itemStack; + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemStack) { + slots[i] = itemStack; + if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { + itemStack.stackSize = getInventoryStackLimit(); + } + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + if(slots[slot] != null) { + if(slots[slot].stackSize <= amount) { + ItemStack itemStack = slots[slot]; + slots[slot] = null; + return itemStack; + } + ItemStack itemStack1 = slots[slot].splitStack(amount); + if(slots[slot].stackSize == 0) { + slots[slot] = null; + } + return itemStack1; + } else { + return null; + } + } + + @Override + public int getSizeInventory() { + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i) { + return slots[i]; + } + + @Override + public String getInventoryName() { + return "ntmFoundry"; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override public boolean hasCustomInventoryName() { return false; } + @Override public boolean isUseableByPlayer(EntityPlayer player) { return false; } + @Override public boolean isItemValidForSlot(int i, ItemStack stack) { return false; } + + @Override public void openInventory() { } + @Override public void closeInventory() { } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + NBTTagList list = nbt.getTagList("items", 10); + slots = new ItemStack[getSizeInventory()]; + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + NBTTagList list = new NBTTagList(); + + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte) i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + nbt.setTag("items", list); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 1 }; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) { + return false; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return slot == 1; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java new file mode 100644 index 000000000..11525880c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryChannel.java @@ -0,0 +1,102 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryChannel extends TileEntityFoundryBase { + + public int nextUpdate; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.type == null && this.amount != 0) { + this.amount = 0; + } + + nextUpdate--; + + if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + + boolean hasOp = false; + nextUpdate = worldObj.rand.nextInt(6) + 5; + + List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; + Collections.shuffle(ints); + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof ICrucibleAcceptor && b != ModBlocks.foundry_channel) { + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + + if(acc.canAcceptPartialFlow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount))) { + MaterialStack left = acc.flow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount)); + if(left == null) { + this.type = null; + this.amount = 0; + } else { + this.amount = left.amount; + } + hasOp = true; + break; + } + } + } + + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof TileEntityFoundryChannel) { + TileEntityFoundryChannel acc = (TileEntityFoundryChannel) b; + + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; + + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + //otherwise, equalize the neighbors + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } + } + } + } + } + } + } + } + + super.updateEntity(); + } + + @Override + public int getCapacity() { + return MaterialShapes.INGOT.q(1); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java new file mode 100644 index 000000000..607b1d13c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryMold.java @@ -0,0 +1,38 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.NTMMaterial; + +public class TileEntityFoundryMold extends TileEntityFoundryCastingBase implements IRenderFoundry { + + @Override + public void updateEntity() { + super.updateEntity(); + } + + @Override + public int getMoldSize() { + return 0; + } + + @Override + public boolean shouldRender() { + return this.type != null && this.amount > 0; + } + + @Override + public double getLevel() { + return 0.125 + this.amount * 0.25D / this.getCapacity(); + } + + @Override + public NTMMaterial getMat() { + return this.type; + } + + @Override public double minX() { return 0.125D; } + @Override public double maxX() { return 0.875D; } + @Override public double minZ() { return 0.125D; } + @Override public double maxZ() { return 0.875D; } + @Override public double moldHeight() { return 0.13D; } + @Override public double outHeight() { return 0.25D; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java new file mode 100644 index 000000000..484375a16 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -0,0 +1,95 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.util.CrucibleUtil; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryOutlet extends TileEntityFoundryBase { + + public NTMMaterial filter = null; + /** inverts redstone behavior, i.e. when TRUE, the outlet will be blocked by default and only open with redstone */ + public boolean invertRedstone = false; + public boolean lastClosed = false; + + /** if TRUE, prevents all fluids from flowing through the outlet and renders a small barrier */ + public boolean isClosed() { + return invertRedstone ^ this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote) { + boolean isClosed = isClosed(); + if(this.lastClosed != isClosed) { + this.lastClosed = isClosed; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + + @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } + @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } + + @Override + public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + if(filter != null && filter != stack.material) return false; + if(isClosed()) return false; + + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); + Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); + + MovingObjectPosition[] mop = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); + + if(acc == null) { + return false; + } + + return acc.canAcceptPartialPour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); + } + + @Override + public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { + + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); + Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); + + MovingObjectPosition[] mop = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); + + if(acc == null) + return stack; + + return acc.pour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); + } + + @Override + public int getCapacity() { + return 0; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.invertRedstone = nbt.getBoolean("invert"); + this.filter = Mats.matById.get((int) nbt.getShort("filter")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("invert", this.invertRedstone); + nbt.setShort("filter", this.filter == null ? -1 : (short) this.filter.id); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java new file mode 100644 index 000000000..a9c8c91c5 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryTank.java @@ -0,0 +1,117 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats.MaterialStack; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFoundryTank extends TileEntityFoundryBase { + + public int nextUpdate; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.type == null && this.amount != 0) { + this.amount = 0; + } + + nextUpdate--; + + if(nextUpdate <= 0 && this.amount > 0 && this.type != null) { + + boolean hasOp = false; + nextUpdate = worldObj.rand.nextInt(6) + 5; + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(te instanceof TileEntityFoundryTank) { + TileEntityFoundryTank tank = (TileEntityFoundryTank) te; + + if((tank.type == null || tank.type == this.type) && tank.amount < tank.getCapacity()) { + tank.type = this.type; + int toFill = Math.min(this.amount, tank.getCapacity() - tank.amount); + this.amount -= toFill; + tank.amount += toFill; + hasOp = true; + } + } + + List ints = new ArrayList() {{ add(2); add(3); add(4); add(5); }}; + Collections.shuffle(ints); + + if(!hasOp) { + + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof ICrucibleAcceptor && b != ModBlocks.foundry_channel) { + ICrucibleAcceptor acc = (ICrucibleAcceptor) b; + + if(acc.canAcceptPartialFlow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount))) { + MaterialStack left = acc.flow(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir.getOpposite(), new MaterialStack(this.type, this.amount)); + if(left == null) { + this.type = null; + this.amount = 0; + } else { + this.amount = left.amount; + } + hasOp = true; + break; + } + } + } + } + + if(!hasOp) { + for(Integer i : ints) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + TileEntity b = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + + if(b instanceof TileEntityFoundryTank) { + TileEntityFoundryTank acc = (TileEntityFoundryTank) b; + + if(acc.type == null || acc.type == this.type || acc.amount == 0) { + acc.type = this.type; + if(worldObj.rand.nextInt(5) == 0) { + //1:4 chance that the fill states are simply swapped + //this promotes faster spreading and prevents spread limits + int buf = this.amount; + this.amount = acc.amount; + acc.amount = buf; + + } else { + int diff = this.amount - acc.amount; + + if(diff > 0) { + diff /= 2; + this.amount -= diff; + acc.amount += diff; + } + } + } + } + } + } + } + } + + super.updateEntity(); + } + + @Override + public int getCapacity() { + return MaterialShapes.BLOCK.q(1); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java new file mode 100644 index 000000000..40e65db2a --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeatBoiler.java @@ -0,0 +1,298 @@ +package com.hbm.tileentity.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.interfaces.IFluidAcceptor; +import com.hbm.interfaces.IFluidSource; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.lib.Library; +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHeatBoiler extends TileEntityLoadedBase implements IFluidSource, IFluidAcceptor, INBTPacketReceiver, IFluidStandardTransceiver { + + public int heat; + public static final int maxHeat = 12_800_000; //the heat required to turn 64k of water into steam + public static final double diffusion = 0.1D; + public FluidTank[] tanks; + public List list = new ArrayList(); + public boolean hasExploded = false; + + public TileEntityHeatBoiler() { + this.tanks = new FluidTank[2]; + + this.tanks[0] = new FluidTank(Fluids.WATER, 64_000, 0); + this.tanks[1] = new FluidTank(Fluids.STEAM, 64_000 * 100, 1); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + NBTTagCompound data = new NBTTagCompound(); + + if(!this.hasExploded) { + this.setupTanks(); + this.updateConnections(); + this.tryPullHeat(); + int lastHeat = this.heat; + + data.setInteger("heat", lastHeat); + + tanks[0].writeToNBT(data, "0"); + this.tryConvert(); + tanks[1].writeToNBT(data, "1"); + + if(this.tanks[1].getFill() > 0) { + this.sendFluid(); + fillFluidInit(tanks[1].getTankType()); + } + } + + data.setBoolean("exploded", this.hasExploded); + INBTPacketReceiver.networkPack(this, data, 25); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.hasExploded = nbt.getBoolean("exploded"); + this.heat = nbt.getInteger("heat"); + this.tanks[0].readFromNBT(nbt, "0"); + this.tanks[1].readFromNBT(nbt, "1"); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int diff = source.getHeatStored() - this.heat; + + if(diff == 0) { + return; + } + + if(diff > 0) { + diff = (int) Math.ceil(diff * diffusion); + source.useUpHeat(diff); + this.heat += diff; + if(this.heat > this.maxHeat) + this.heat = this.maxHeat; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); + } + + protected void setupTanks() { + + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait.getEfficiency(HeatingType.BOILER) > 0) { + HeatingStep entry = trait.getFirstStep(); + tanks[1].setTankType(entry.typeProduced); + tanks[1].changeTankSize(tanks[0].getMaxFill() * entry.amountProduced / entry.amountReq); + return; + } + } + + tanks[0].setTankType(Fluids.NONE); + tanks[1].setTankType(Fluids.NONE); + } + + protected void tryConvert() { + + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait.getEfficiency(HeatingType.BOILER) > 0) { + + HeatingStep entry = trait.getFirstStep(); + int inputOps = this.tanks[0].getFill() / entry.amountReq; + int outputOps = (this.tanks[1].getMaxFill() - this.tanks[1].getFill()) / entry.amountProduced; + int heatOps = this.heat / entry.heatReq; + + int ops = Math.min(inputOps, Math.min(outputOps, heatOps)); + + this.tanks[0].setFill(this.tanks[0].getFill() - entry.amountReq * ops); + this.tanks[1].setFill(this.tanks[1].getFill() + entry.amountProduced * ops); + this.heat -= entry.heatReq * ops; + + if(ops > 0 && worldObj.rand.nextInt(400) == 0) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 2, zCoord + 0.5, "hbm:block.boilerGroan", 0.5F, 1.0F); + } + + if(outputOps == 0) { + this.hasExploded = true; + worldObj.newExplosion(null, xCoord + 0.5, yCoord + 2, zCoord + 0.5, 5F, false, false); + BlockDummyable.safeRem = true; + for(int x = xCoord - 1; x <= xCoord + 1; x++) { + for(int y = yCoord + 2; y <= yCoord + 3; y++) { + for(int z = zCoord - 1; z <= zCoord + 1; z++) { + worldObj.setBlockToAir(x, y, z); + } + } + } + worldObj.setBlockToAir(xCoord, yCoord + 1, zCoord); + BlockDummyable.safeRem = false; + } + } + } + } + + private void updateConnections() { + + for(DirPos pos : getConPos()) { + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + private void sendFluid() { + + for(DirPos pos : getConPos()) { + this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir().getOpposite()); + } + } + + private DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP); + return new DirPos[] { + new DirPos(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, dir), + new DirPos(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, dir.getOpposite()), + new DirPos(xCoord, yCoord + 4, zCoord, Library.POS_Y), + }; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + tanks[0].readFromNBT(nbt, "water"); + tanks[1].readFromNBT(nbt, "steam"); + heat = nbt.getInteger("heat"); + hasExploded = nbt.getBoolean("exploded"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + tanks[0].writeToNBT(nbt, "water"); + tanks[1].writeToNBT(nbt, "steam"); + nbt.setInteger("heat", heat); + nbt.setBoolean("exploded", hasExploded); + } + + @Override + public void setFluidFill(int fill, FluidType type) { + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + tank.setFill(fill); + return; + } + } + } + + @Override public void setFillForSync(int fill, int index) { } + @Override public void setTypeForSync(FluidType type, int index) { } + + @Override + public int getFluidFill(FluidType type) { + for(FluidTank tank : tanks) { + if(tank.getTankType() == type) { + return tank.getFill(); + } + } + return 0; + } + + @Override + public int getMaxFluidFill(FluidType type) { + return type == tanks[0].getTankType() ? tanks[0].getMaxFill() : 0; + } + + @Override + public void fillFluidInit(FluidType type) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP); + this.fillFluid(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, this.getTact(), type); + this.fillFluid(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, this.getTact(), type); + this.fillFluid(xCoord, yCoord + 4, zCoord, this.getTact(), type); + } + + @Override + public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { + Library.transmitFluid(x, y, z, newTact, this, worldObj, type); + } + + @Override + public boolean getTact() { + return worldObj.getTotalWorldTime() % 2 == 0; + } + + @Override + public List getFluidList(FluidType type) { + return this.list; + } + + @Override + public void clearFluidList(FluidType type) { + this.list.clear(); + } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] {tanks[1]}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tanks[0]}; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 4, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java new file mode 100644 index 000000000..7a3dacf54 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -0,0 +1,146 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; + +import api.hbm.energy.IEnergyUser; +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser, INBTPacketReceiver { + + public long power; + public int heatEnergy; + protected int setting = 0; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0) { //doesn't have to happen constantly + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + this.trySubscribe(worldObj, xCoord + dir.offsetX * 3, yCoord, zCoord + dir.offsetZ * 3, dir); + } + + this.heatEnergy *= 0.999; + + this.tryPullHeat(); + + if(setting > 0 && this.power >= this.getConsumption()) { + this.power -= this.getConsumption(); + this.heatEnergy += getHeatGen(); + } + + NBTTagCompound data = new NBTTagCompound(); + data.setByte("s", (byte) this.setting); + data.setInteger("h", this.heatEnergy); + INBTPacketReceiver.networkPack(this, data, 25); + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.setting = nbt.getByte("s"); + this.heatEnergy = nbt.getInteger("h"); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.power = nbt.getLong("power"); + this.setting = nbt.getInteger("setting"); + this.heatEnergy = nbt.getInteger("heatEnergy"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setLong("power", power); + nbt.setInteger("setting", setting); + nbt.setInteger("heatEnergy", heatEnergy); + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + this.heatEnergy += source.getHeatStored() * 0.85; + source.useUpHeat(source.getHeatStored()); + } + } + + public void toggleSetting() { + setting++; + + if(setting > 10) + setting = 0; + } + + @Override + public long getPower() { + return power; + } + + public long getConsumption() { + return (long) (Math.pow(setting, 1.4D) * 200D); + } + + @Override + public long getMaxPower() { + return getConsumption() * 20; + } + + public int getHeatGen() { + return this.setting * 100; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public int getHeatStored() { + return heatEnergy; + } + + @Override + public void useUpHeat(int heat) { + this.heatEnergy = Math.max(0, this.heatEnergy - heat); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 2, + yCoord, + zCoord - 2, + xCoord + 3, + yCoord + 1, + zCoord + 3 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java index fe444ae8c..69faf2675 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterOilburner.java @@ -2,11 +2,11 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.container.ContainerOilburner; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.gui.GUIOilburner; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -52,8 +52,8 @@ public class TileEntityHeaterOilburner extends TileEntityMachineBase implements if(this.isOn && this.heatEnergy < maxHeatEnergy) { - if(tank.getTankType() instanceof FluidTypeFlammable) { - FluidTypeFlammable type = (FluidTypeFlammable) tank.getTankType(); + if(tank.getTankType().hasTrait(FT_Flammable.class)) { + FT_Flammable type = tank.getTankType().getTrait(FT_Flammable.class); int burnRate = 10; int toBurn = Math.min(burnRate, tank.getFill()); @@ -190,4 +190,9 @@ public class TileEntityHeaterOilburner extends TileEntityMachineBase implements public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 63f66db13..aae146248 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -10,9 +10,9 @@ import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.BreederRecipes; import com.hbm.inventory.recipes.FusionRecipes; import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; @@ -272,7 +272,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser slots[1].stackSize--; - if(slots[1].stackSize <=0) + if(slots[1].stackSize <= 0) slots[1] = null; this.markDirty(); @@ -286,7 +286,16 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[] { 2, 4 }; + return new int[] { 1, 2, 4 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + + if(i == 1 && BreederRecipes.getOutput(itemStack) != null) + return true; + + return false; } private void produceByproduct() { @@ -534,4 +543,9 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java index 54411c4a3..188f0ff01 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemfac.java @@ -7,10 +7,10 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; @@ -447,4 +447,9 @@ public class TileEntityMachineAssemfac extends TileEntityMachineAssemblerBase im public int getMaxFluidFill(FluidType type) { return type == water.getTankType() ? water.getMaxFill() : 0; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index 4d266a204..7f5ffa1ac 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -167,7 +167,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen if(ingredient != null) { this.decrStackSize(i, 1); - if(ingredient.getItem().hasContainerItem(ingredient)) { + if(slots[i] == null && ingredient.getItem().hasContainerItem(ingredient)) { ItemStack container = ingredient.getItem().getContainerItem(ingredient); if(container != null && container.isItemStackDamageable() && container.getItemDamage() > container.getMaxDamage()) { @@ -269,6 +269,10 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { + + //automatically prohibit any stacked item with a container + if(stack.stackSize > 1 && stack.getItem().hasContainerItem(stack)) + return false; //only allow insertion for the nine recipe slots if(slot < 10 || slot > 18) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java index cb61bbd65..a9c4ac349 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoiler.java @@ -8,9 +8,9 @@ import com.hbm.blocks.machine.MachineBoiler; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxGaugePacket; @@ -42,8 +42,8 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento public TileEntityMachineBoiler() { slots = new ItemStack[7]; tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.WATER, 8000, 0); - tanks[1] = new FluidTank(Fluids.STEAM, 8000, 1); + tanks[0] = new FluidTank(Fluids.OIL, 8000, 0); + tanks[1] = new FluidTank(Fluids.HOTOIL, 8000, 1); } @Override @@ -207,8 +207,7 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento boolean mark = false; - if(!worldObj.isRemote) - { + if(!worldObj.isRemote) { this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1].getTankType(), this); @@ -401,4 +400,9 @@ public class TileEntityMachineBoiler extends TileEntity implements ISidedInvento public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index 00dd1f73f..4a7323227 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -8,9 +8,9 @@ import com.hbm.blocks.machine.MachineBoiler; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -48,8 +48,8 @@ public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implem public TileEntityMachineBoilerElectric() { slots = new ItemStack[7]; tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.WATER, 16000, 0); - tanks[1] = new FluidTank(Fluids.STEAM, 16000, 1); + tanks[0] = new FluidTank(Fluids.OIL, 16000, 0); + tanks[1] = new FluidTank(Fluids.HOTOIL, 16000, 1); } @Override @@ -423,4 +423,9 @@ public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implem public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java index 932d78533..c855fe8cd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCMBFactory.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -356,6 +356,11 @@ public class TileEntityMachineCMBFactory extends TileEntityLoadedBase implements @Override public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tank}; + return new FluidTank[] { tank }; + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 2fa74ea4f..fb2b83933 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -2,19 +2,17 @@ package com.hbm.tileentity.machine; import com.hbm.inventory.recipes.CentrifugeRecipes; import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.LoopedSoundPacket; -import com.hbm.packet.PacketDispatcher; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IEnergyUser; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyUser { @@ -23,6 +21,9 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public boolean isProgressing; public static final int maxPower = 100000; public static final int processingSpeed = 200; + private int audioDuration = 0; + + private AudioWrapper audio; /* * So why do we do this now? You have a funny mekanism/thermal/whatever pipe and you want to output stuff from a side @@ -132,12 +133,6 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement return this.progress > 0; } - public void networkUnpack(NBTTagCompound data) { - this.power = data.getLong("power"); - this.progress = data.getInteger("progress"); - this.isProgressing = data.getBoolean("isProgressing"); - } - @Override public void updateEntity() { @@ -160,34 +155,101 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement } else { isProgressing = false; } + + if(isProgressing) { + progress++; + + if(this.progress >= TileEntityMachineCentrifuge.processingSpeed) { + this.progress = 0; + this.processItem(); + } + } else { + progress = 0; + } NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); data.setInteger("progress", progress); data.setBoolean("isProgressing", isProgressing); this.networkPack(data, 50); - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), - new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - PacketDispatcher.wrapper.sendToAllAround(new LoopedSoundPacket(xCoord, yCoord, zCoord), - new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - } - - if(hasPower() && canProcess()) { - progress++; - - if(this.progress >= TileEntityMachineCentrifuge.processingSpeed) { - this.progress = 0; - this.processItem(); - } } else { - progress = 0; + + if(isProgressing) { + audioDuration += 2; + } else { + audioDuration -= 3; + } + + audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); + + if(audioDuration > 10) { + + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + + } else { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + } + } + + public void networkUnpack(NBTTagCompound data) { + this.power = data.getLong("power"); + this.progress = data.getInteger("progress"); + this.isProgressing = data.getBoolean("isProgressing"); + } + + public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 2.0F, 1.0F); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; } } + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + AxisAlignedBB bb = null; + @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord, + yCoord, + zCoord, + xCoord + 1, + yCoord + 4, + zCoord + 1 + ); + } + + return bb; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java index b64ef2345..d5dfb220d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemfac.java @@ -7,10 +7,10 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 7d6ac89fc..29772bafd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -6,11 +6,11 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.items.ModItems; @@ -611,4 +611,9 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index 032eff15c..83e1f78c3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -5,10 +5,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java index ddb8ca7c8..2bc550040 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java @@ -13,9 +13,9 @@ import com.hbm.blocks.machine.MachineCoal; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -343,4 +343,9 @@ public class TileEntityMachineCoal extends TileEntityLoadedBase implements ISide public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index 994332454..62e19ca68 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -380,4 +380,9 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index c148caf89..1ace1c9b0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -11,9 +11,9 @@ import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionThermo; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CyclotronRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; @@ -536,4 +536,9 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { coolant }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { amat, coolant }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index ea8611233..ea9a96922 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -5,11 +5,11 @@ import java.util.HashMap; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -152,8 +152,8 @@ public class TileEntityMachineDiesel extends TileEntityMachineBase implements IE public static long getHEFromFuel(FluidType type) { - if(type instanceof FluidTypeCombustible) { - FluidTypeCombustible fuel = (FluidTypeCombustible) type; + if(type.hasTrait(FT_Combustible.class)) { + FT_Combustible fuel = type.getTrait(FT_Combustible.class); FuelGrade grade = fuel.getGrade(); double efficiency = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0; @@ -236,4 +236,9 @@ public class TileEntityMachineDiesel extends TileEntityMachineBase implements IE public FluidTank[] getReceivingTanks() { return new FluidTank[] {tank}; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index abe14da88..fe1a11bd4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -23,6 +23,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl public static final long maxPower = 100000; public int maxProgress = 100; public int consumption = 50; + private int cooldown = 0; private static final int[] slots_io = new int[] { 0, 1, 2 }; @@ -96,7 +97,8 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } public boolean canProcess() { - if(slots[1] == null) { + + if(slots[1] == null || cooldown > 0) { return false; } ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[1]); @@ -145,9 +147,13 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl @Override public void updateEntity() { - boolean flag1 = false; + boolean markDirty = false; if(!worldObj.isRemote) { + + if(cooldown > 0) { + cooldown--; + } power = Library.chargeTEFromItems(slots, 0, power, maxPower); @@ -165,6 +171,10 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl consumption += speedLevel * 50; maxProgress += powerLevel * 10; consumption -= powerLevel * 15; + + if(!hasPower()) { + cooldown = 20; + } if(hasPower() && canProcess()) { progress++; @@ -174,7 +184,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl if(this.progress >= maxProgress) { this.progress = 0; this.processItem(); - flag1 = true; + markDirty = true; } } else { progress = 0; @@ -187,7 +197,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl } if(trigger) { - flag1 = true; + markDirty = true; MachineElectricFurnace.updateBlockState(this.progress > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } @@ -198,7 +208,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl this.networkPack(data, 50); - if(flag1) { + if(markDirty) { this.markDirty(); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 6dcf61f47..260b28c52 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -4,9 +4,9 @@ import java.util.HashMap; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.GasCentrifugeRecipes.PseudoFluidType; import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; @@ -340,6 +340,11 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java index 75753dd8c..c84b95db3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGenerator.java @@ -4,8 +4,8 @@ import java.util.Random; import com.hbm.blocks.machine.MachineGenerator; import com.hbm.explosion.ExplosionNukeGeneric; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFuelRod; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 9baafe22e..ad6a6ef74 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -2,10 +2,10 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -211,7 +211,7 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public int getPowerFromFuel() { FluidType type = tanks[1].getTankType(); - return type instanceof FluidTypeFlammable ? (int)(((FluidTypeFlammable) type).getHeatEnergy() / 1000L) : 0; + return type.hasTrait(FT_Flammable.class) ? (int)(type.getTrait(FT_Flammable.class).getHeatEnergy() / 1000L) : 0; } @Override @@ -308,4 +308,9 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0], tanks[1], tanks[2] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java index 0b002b8d0..3d2756304 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineInserter.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 16590a571..6e27ca1bf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -7,10 +7,11 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.recipes.MachineRecipes; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -70,30 +71,26 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme boolean operational = false; - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - if(outs == null) { - tanks[1].setTankType(Fluids.NONE); - } else { - tanks[1].setTankType((FluidType) outs[0]); - - int processMax = (int) Math.ceil(Math.ceil(tanks[0].getFill() / 5F) / (Integer)outs[2]); //the maximum amount of cycles based on the 20% cap - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += ((Integer)outs[3] * cycles) * 1.25; //yields a 25% power conversion bonus - - if(power > maxPower) - power = maxPower; - - if(cycles > 0) - operational = true; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE); //100% efficiency + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int cap = 6_000 / trait.amountReq; + int ops = Math.min(inputOps, Math.min(outputOps, cap)); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + operational = ops > 0; + } } + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; tanks[1].unloadTank(5, 6, slots); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java index a013fbc17..e9d41a607 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java @@ -1,14 +1,9 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.ModBlocks; -import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyGenerator; -import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index a11f0a5c4..1fdc124e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -8,10 +8,10 @@ import com.google.common.collect.Sets; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.CentrifugeRecipes; import com.hbm.inventory.recipes.CrystallizerRecipes; import com.hbm.inventory.recipes.ShredderRecipes; @@ -402,11 +402,6 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen for(int z = -range; z <= range; z++) { if(worldObj.getBlock(x + xCoord, targetY, z + zCoord).getMaterial().isLiquid()) { - /*targetX = x + xCoord; - targetZ = z + zCoord; - worldObj.func_147480_a(x + xCoord, targetY, z + zCoord, false); - beam = true;*/ - continue; } @@ -691,4 +686,9 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index 618e3a65c..ad902ff80 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.MachineITER; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index 054533238..76e67276d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -9,9 +9,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RadiolysisRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemRTGPellet; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java index 9f40cf7fd..b10b12586 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorLarge.java @@ -11,9 +11,9 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFuelRod; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java index bac764a9f..0f3e1f754 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java @@ -5,11 +5,11 @@ import java.util.HashMap; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -272,8 +272,8 @@ public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implem public static long getHEFromFuel(FluidType type) { - if(type instanceof FluidTypeCombustible) { - FluidTypeCombustible fuel = (FluidTypeCombustible) type; + if(type.hasTrait(FT_Combustible.class)) { + FT_Combustible fuel = type.getTrait(FT_Combustible.class); FuelGrade grade = fuel.getGrade(); double efficiency = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0; return (long) (fuel.getCombustionEnergy() / 1000L * efficiency); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index d21369773..b2a065e2a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -6,9 +6,11 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Coolable; +import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.lib.Library; import com.hbm.packet.AuxElectricityPacket; @@ -232,27 +234,25 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); - Object[] outs = MachineRecipes.getTurbineOutput(tanks[0].getTankType()); - - if(outs == null) { - tanks[1].setTankType(Fluids.NONE); - } else { - tanks[1].setTankType((FluidType) outs[0]); - - int processMax = 1200; //the maximum amount of cycles based on the 1.2k cycle cap (subject to change) - int processSteam = tanks[0].getFill() / (Integer)outs[2]; //the maximum amount of cycles depending on steam - int processWater = (tanks[1].getMaxFill() - tanks[1].getFill()) / (Integer)outs[1]; //the maximum amount of cycles depending on water - - int cycles = Math.min(processMax, Math.min(processSteam, processWater)); - - tanks[0].setFill(tanks[0].getFill() - (Integer)outs[2] * cycles); - tanks[1].setFill(tanks[1].getFill() + (Integer)outs[1] * cycles); - - power += (Integer)outs[3] * cycles; - - if(power > maxPower) - power = maxPower; + FluidType in = tanks[0].getTankType(); + boolean valid = false; + if(in.hasTrait(FT_Coolable.class)) { + FT_Coolable trait = in.getTrait(FT_Coolable.class); + double eff = trait.getEfficiency(CoolingType.TURBINE) * 0.85D; //small turbine is only 85% efficient + if(eff > 0) { + tanks[1].setTankType(trait.coolsTo); + int inputOps = tanks[0].getFill() / trait.amountReq; + int outputOps = (tanks[1].getMaxFill() - tanks[1].getFill()) / trait.amountProduced; + int cap = 6_000 / trait.amountReq; + int ops = Math.min(inputOps, Math.min(outputOps, cap)); + tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); + tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); + this.power += (ops * trait.heatEnergy * eff); + valid = true; + } } + if(!valid) tanks[1].setTankType(Fluids.NONE); + if(power > maxPower) power = maxPower; this.sendFluidToAll(tanks[1].getTankType(), this); @@ -363,4 +363,9 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 673c6cf69..bbba68220 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -4,12 +4,12 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.types.FluidTypeCombustible; -import com.hbm.inventory.fluid.types.FluidTypeCombustible.FuelGrade; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Combustible; +import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.ModDamageSource; @@ -115,8 +115,8 @@ public class TileEntityMachineTurbofan extends TileEntityMachineBase implements long burn = 0; int amount = 1 + this.afterburner; - if(tank.getTankType() instanceof FluidTypeCombustible && ((FluidTypeCombustible) tank.getTankType()).getGrade() == FuelGrade.AERO) { - burn = ((FluidTypeCombustible) tank.getTankType()).getCombustionEnergy() / 1_000; + if(tank.getTankType().hasTrait(FT_Combustible.class) && tank.getTankType().getTrait(FT_Combustible.class).getGrade() == FuelGrade.AERO) { + burn = tank.getTankType().getTrait(FT_Combustible.class).getCombustionEnergy() / 1_000; } int toBurn = Math.min(amount, this.tank.getFill()); @@ -403,4 +403,9 @@ public class TileEntityMachineTurbofan extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java index c4f34a662..7b6d675be 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java @@ -11,8 +11,8 @@ import com.hbm.config.MobConfig; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.interfaces.IControlReceiver; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPlateFuel; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index af1298e55..759892c38 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -16,10 +16,10 @@ import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemZirnoxBreedingRod; import com.hbm.items.machine.ItemZirnoxRod; @@ -530,6 +530,11 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF public FluidTank[] getReceivingTanks() { return new FluidTank[] { water, carbonDioxide }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam, carbonDioxide }; + } // do some opencomputer stuff @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java index cdea9c8c2..5114e3130 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.SILEXRecipes; import com.hbm.inventory.recipes.SILEXRecipes.SILEXRecipe; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java new file mode 100644 index 000000000..fc6dd4727 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -0,0 +1,274 @@ +package com.hbm.tileentity.machine; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.entity.projectile.EntitySawblade; +import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; +import com.hbm.tileentity.INBTPacketReceiver; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; +import com.hbm.util.ItemStackUtil; + +import api.hbm.tile.IHeatSource; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntitySawmill extends TileEntityMachineBase { + + public int heat; + public static final double diffusion = 0.1D; + private int warnCooldown = 0; + private int overspeed = 0; + public boolean hasBlade = true; + public int progress = 0; + public static final int processingTime = 600; + + public float spin; + public float lastSpin; + + public TileEntitySawmill() { + super(3); + } + + @Override + public String getName() { return ""; } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(hasBlade) { + tryPullHeat(); + + if(warnCooldown > 0) + warnCooldown--; + + if(heat >= 100) { + + ItemStack result = this.getOutput(slots[0]); + + if(result != null) { + progress += heat / 10; + + if(progress >= this.processingTime) { + progress = 0; + slots[0] = null; + slots[1] = result; + + if(result.getItem() != ModItems.powder_sawdust) { + float chance = result.getItem() == Items.stick ? 0.05F : 0.5F; + if(worldObj.rand.nextFloat() < chance) { + slots[2] = new ItemStack(ModItems.powder_sawdust); + } + } + + this.markDirty(); + } + + } else { + this.progress = 0; + } + + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(-1D, 0.375D, -1D, -0.875, 2.375D, 1D); + aabb = BlockDummyable.getAABBRotationOffset(aabb, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getRotation(ForgeDirection.UP)); + for(Object o : worldObj.getEntitiesWithinAABB(EntityLivingBase.class, aabb)) { + EntityLivingBase living = (EntityLivingBase) o; + living.attackEntityFrom(ModDamageSource.turbofan, 100); + } + + } else { + this.progress = 0; + } + + if(heat > 300) { + + this.overspeed++; + + if(overspeed > 60 && warnCooldown == 0) { + warnCooldown = 100; + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1, zCoord + 0.5, "hbm:block.warnOverspeed", 2.0F, 1.0F); + } + + if(overspeed > 300) { + this.hasBlade = false; + this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); + + int orientation = this.getBlockMetadata() - BlockDummyable.offset; + ForgeDirection dir = ForgeDirection.getOrientation(orientation); + EntitySawblade cog = new EntitySawblade(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + cog.motionX = rot.offsetX; + cog.motionY = 1; + cog.motionZ = rot.offsetZ; + worldObj.spawnEntityInWorld(cog); + + this.markDirty(); + } + + } else { + this.overspeed = 0; + } + } else { + this.overspeed = 0; + this.warnCooldown = 0; + } + + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("heat", heat); + data.setInteger("progress", progress); + data.setBoolean("hasBlade", hasBlade); + + NBTTagList list = new NBTTagList(); + for(int i = 0; i < slots.length; i++) { + if(slots[i] != null) { + NBTTagCompound nbt1 = new NBTTagCompound(); + nbt1.setByte("slot", (byte) i); + slots[i].writeToNBT(nbt1); + list.appendTag(nbt1); + } + } + data.setTag("items", list); + + INBTPacketReceiver.networkPack(this, data, 150); + + this.heat = 0; + + } else { + + float momentum = heat * 25F / ((float) 300); + + this.lastSpin = this.spin; + this.spin += momentum; + + if(this.spin >= 360F) { + this.spin -= 360F; + this.lastSpin -= 360F; + } + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + this.heat = nbt.getInteger("heat"); + this.progress = nbt.getInteger("progress"); + this.hasBlade = nbt.getBoolean("hasBlade"); + + NBTTagList list = nbt.getTagList("items", 10); + + slots = new ItemStack[3]; + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound nbt1 = list.getCompoundTagAt(i); + byte b0 = nbt1.getByte("slot"); + if(b0 >= 0 && b0 < slots.length) { + slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); + } + } + } + + protected void tryPullHeat() { + TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + + if(con instanceof IHeatSource) { + IHeatSource source = (IHeatSource) con; + int heatSrc = (int) (source.getHeatStored() * diffusion); + + if(heatSrc > 0) { + source.useUpHeat(heatSrc); + this.heat += heatSrc; + return; + } + } + + this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0); + } + + protected InventoryCraftingAuto craftingInventory = new InventoryCraftingAuto(1, 1); + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return i == 0 && slots[0] == null && slots[1] == null && slots[2] == null && stack.stackSize == 1 && getOutput(stack) != null; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i > 0; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {0, 1, 2}; + } + + public ItemStack getOutput(ItemStack input) { + + if(input == null) + return null; + + craftingInventory.setInventorySlotContents(0, input); + + List names = ItemStackUtil.getOreDictNames(input); + + if(names.contains("stickWood")) { + return new ItemStack(ModItems.powder_sawdust); + } + + if(names.contains("logWood")) { + for(Object o : CraftingManager.getInstance().getRecipeList()) { + IRecipe recipe = (IRecipe) o; + if(recipe.matches(craftingInventory, worldObj)) { + ItemStack out = recipe.getCraftingResult(craftingInventory); + if(out != null) { + out = out.copy(); //for good measure + out.stackSize = out.stackSize * 6 / 4; //4 planks become 6 + return out; + } + } + } + } + + if(names.contains("plankWood")) { + return new ItemStack(Items.stick, 4); + } + + return null; + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 2, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java index 7db3ce4f4..d9a9d46b1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySolarBoiler.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import api.hbm.fluid.IFluidStandardTransceiver; @@ -189,4 +189,9 @@ public class TileEntitySolarBoiler extends TileEntity implements IFluidAcceptor, public FluidTank[] getReceivingTanks() { return new FluidTank[] { water }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { water, steam }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java index 6407e568e..b4ca97203 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java @@ -7,9 +7,9 @@ import com.hbm.handler.MissileStruct; import com.hbm.entity.missile.EntitySoyuz; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index 29578af85..46b71f6bc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityCog; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; @@ -42,7 +43,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack if(warnCooldown > 0) warnCooldown--; - if(heat > 300) { + if(heat > maxHeat()) { this.overspeed++; @@ -57,7 +58,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack int orientation = this.getBlockMetadata() - BlockDummyable.offset; ForgeDirection dir = ForgeDirection.getOrientation(orientation); - EntityCog cog = new EntityCog(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); + EntityCog cog = new EntityCog(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation).setMeta(this.getGeatMeta()); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); cog.motionX = rot.offsetX; @@ -96,7 +97,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack this.heat = 0; } else { - float momentum = powerBuffer * 50F / 300F; + float momentum = powerBuffer * 50F / ((float) maxHeat()); this.lastSpin = this.spin; this.spin += momentum; @@ -108,6 +109,14 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack } } + public int getGeatMeta() { + return this.getBlockType() == ModBlocks.machine_stirling ? 0 : 1; + } + + public int maxHeat() { + return this.getBlockType() == ModBlocks.machine_stirling ? 300 : 1500; + } + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X), diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java index 126b9055f..52172bafb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStorageDrum.java @@ -8,9 +8,9 @@ import com.hbm.hazard.HazardRegistry; import com.hbm.hazard.HazardSystem; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; @@ -317,4 +317,9 @@ public class TileEntityStorageDrum extends TileEntityMachineBase implements IFlu public FluidTank[] getSendingTanks() { return new FluidTank[] { tanks[0], tanks[1] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java index f5a4b067b..2ee2f78ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.main.MainRegistry; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java index 525859f77..05849023a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java index 65352de6c..6373f69c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java @@ -11,9 +11,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.interfaces.IReactor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCapacitor; import com.hbm.items.special.WatzFuel; @@ -754,4 +754,9 @@ public class TileEntityWatzCore extends TileEntityLoadedBase implements ISidedIn public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java index 685e254a2..6d81d415e 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticCracker.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; @@ -278,4 +278,9 @@ public class TileEntityMachineCatalyticCracker extends TileEntity implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java index 3ea155659..494c8d0ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFrackingTower.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine.oil; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.world.feature.OilSpot; @@ -121,6 +121,11 @@ public class TileEntityMachineFrackingTower extends TileEntityOilDrillBase imple return new FluidTank[] { tanks[2] }; } + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + @Override public DirPos[] getConPos() { return new DirPos[] { diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java index d25f42aef..f43c3ad26 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineFractionTower.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.INBTPacketReceiver; @@ -272,4 +272,9 @@ public class TileEntityMachineFractionTower extends TileEntity implements IFluid public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 3a73f999f..6c94e3730 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -5,12 +5,13 @@ import java.util.List; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.fluid.FluidType.FluidTrait; -import com.hbm.inventory.fluid.types.FluidTypeFlammable; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Flammable; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous; +import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous_ART; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; @@ -111,9 +112,9 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements maxVent += maxVent * burn; maxBurn += maxBurn * burn; - if(!doesBurn || !(tank.getTankType() instanceof FluidTypeFlammable)) { + if(!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) { - if(tank.getTankType().traits.contains(FluidTrait.GASEOUS)) { + if(tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class)) { int eject = Math.min(maxVent, tank.getFill()); tank.setFill(tank.getFill() - eject); tank.getTankType().onFluidRelease(this, tank, eject); @@ -123,15 +124,15 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } } else { - if(tank.getTankType() instanceof FluidTypeFlammable) { + if(tank.getTankType().hasTrait(FT_Flammable.class)) { int eject = Math.min(maxBurn, tank.getFill()); tank.setFill(tank.getFill() - eject); int penalty = 2; - if(!tank.getTankType().traits.contains(FluidTrait.GASEOUS)) + if(!tank.getTankType().hasTrait(FT_Gaseous.class) && !tank.getTankType().hasTrait(FT_Gaseous_ART.class)) penalty = 10; - long powerProd = ((FluidTypeFlammable) tank.getTankType()).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB + long powerProd = tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB powerProd /= penalty; powerProd += powerProd * yield / 3; @@ -166,7 +167,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements if(isOn && tank.getFill() > 0) { - if((!doesBurn || !(tank.getTankType() instanceof FluidTypeFlammable)) && tank.getTankType().traits.contains(FluidTrait.GASEOUS)) { + if((!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) && (tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class))) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -184,7 +185,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements } - if(doesBurn && tank.getTankType() instanceof FluidTypeFlammable && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) { + if(doesBurn && tank.getTankType().hasTrait(FT_Flammable.class) && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); @@ -272,4 +273,9 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index 366052a75..e8ee4edae 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -6,10 +6,10 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.LiquefactionRecipes; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -273,4 +273,9 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen public FluidTank[] getSendingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java index f59456d9d..b52cb8fa1 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePumpjack.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine.oil; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.util.fauxpointtwelve.DirPos; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 56c436a5d..50bb2b2f1 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -8,9 +8,9 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.FluidStack; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; @@ -358,4 +358,9 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0] }; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 36fda0b9a..44f0beece 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -1,10 +1,10 @@ package com.hbm.tileentity.machine.oil; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.SolidificationRecipes; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -247,4 +247,9 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index c89ca43c4..6015322b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -7,10 +7,10 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -339,6 +339,11 @@ public abstract class TileEntityOilDrillBase extends TileEntityMachineBase imple public FluidTank[] getReceivingTanks() { return new FluidTank[0]; } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } public abstract DirPos[] getConPos(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java index 5a8eeed9e..dd5708018 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java @@ -5,9 +5,9 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 985666099..0412c865c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -8,9 +8,9 @@ import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IControlReceiver; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index ac442c39a..5931e8a59 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -10,7 +10,6 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; import com.hbm.util.I18nUtil; -import com.hbm.util.Tuple.Triplet; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -135,7 +134,7 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon case FUEL_POISON: if(col.data.hasKey("xenon")) { count++; - value += col.data.getDouble("xenon") * 100D; + value += col.data.getDouble("xenon"); } break; case FUEL_TEMP: diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java index 13c13830a..f261885ba 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -8,6 +8,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; +import cpw.mods.fml.common.Optional; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; + public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver { public RBMKColor color; @@ -121,4 +127,10 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement return data; } + + @Callback + @Optional.Method(modid = "OpenComputers") + public Object[] getColor(Context context, Arguments args) { + return new Object[] {this.color}; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java index 65219f2f8..4e0bd6850 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKCooler.java @@ -3,9 +3,9 @@ package com.hbm.tileentity.machine.rbmk; import java.util.List; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java index 44c0db5e1..f3b34b64b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -7,9 +7,9 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java index cb91c1deb..b3c7c0aa2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -2,9 +2,9 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java index 44d309f01..132d17c18 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutgasser.java @@ -8,10 +8,10 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.lib.Library; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java index 63d3aee00..e8559b8d6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index ed3c69a31..3f17d439b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -173,6 +173,8 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM if(rod.getStackInSlot(0) != null && rod.getStackInSlot(0).getItem() instanceof ItemRBMKRod) { rod.receiveFlux(stream, flux); return 0; + } else { + return flux; } } @@ -190,7 +192,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM return 0; } - //set neutrons to slow + //multiply neutron count with rod setting if(te instanceof TileEntityRBMKControl) { TileEntityRBMKControl control = (TileEntityRBMKControl)te; @@ -227,7 +229,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM int hits = 0; for(int h = 0; h <= limit; h++) { - if(!worldObj.getBlock(x, y, z).isOpaqueCube()) + if(!worldObj.getBlock(x, y + h, z).isOpaqueCube()) hits++; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java index 9ba5e8b0a..e8e284a07 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRodReaSim.java @@ -57,13 +57,4 @@ public class TileEntityRBMKRodReaSim extends TileEntityRBMKRod { public ColumnType getConsoleType() { return ColumnType.FUEL_SIM; } - - // do some opencomputer stuff - @Override - public String getComponentName() { - if (isModerated() == true) { - return "rbmk_moderated_fuel_rod_reasim"; - } - return "rbmk_fuel_rod_reasim"; - } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index e954e41d8..5a019683e 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -6,12 +6,13 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.FluidType.FluidTrait; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidStandardTransceiver; @@ -20,7 +21,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumSkyBlock; -public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcceptor, IFluidSource, IFluidStandardTransceiver { +public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IPersistentNBT { public FluidTank tank; public short mode = 0; @@ -98,7 +99,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc //for when you fill corrosive liquid into an iron tank if((b == ModBlocks.barrel_iron && tank.getTankType().isCorrosive()) || - (b == ModBlocks.barrel_steel && tank.getTankType().traits.contains(FluidTrait.CORROSIVE_2))) { + (b == ModBlocks.barrel_steel && tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).getRating() > 50)) { ItemStack[] copy = this.slots.clone(); this.slots = new ItemStack[6]; worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.barrel_corroded); @@ -220,4 +221,25 @@ public class TileEntityBarrel extends TileEntityMachineBase implements IFluidAcc public FluidTank[] getReceivingTanks() { return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + + @Override + public void writeNBT(NBTTagCompound nbt) { + if(tank.getFill() == 0) return; + NBTTagCompound data = new NBTTagCompound(); + this.tank.writeToNBT(data, "tank"); + data.setShort("mode", mode); + nbt.setTag(NBT_PERSISTENT_KEY, data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); + this.tank.readFromNBT(data, "tank"); + this.mode = data.getShort("nbt"); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 3ea4d1d0d..ed23114be 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -2,6 +2,7 @@ package com.hbm.tileentity.machine.storage; import com.hbm.blocks.machine.MachineBattery; import com.hbm.lib.Library; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IBatteryItem; @@ -21,9 +22,10 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, SimpleComponent { +public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent { public long[] log = new long[20]; + public long delta = 0; public long power = 0; //0: input only @@ -145,7 +147,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public void updateEntity() { - if(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery && !worldObj.isRemote) { + if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { long prevPower = this.power; @@ -160,22 +162,23 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setLong("power", (power + prevPower) / 2); - nbt.setShort("redLow", redLow); - nbt.setShort("redHigh", redHigh); - nbt.setByte("priority", (byte) this.priority.ordinal()); - this.networkPack(nbt, 20); - } - - if(worldObj.isRemote) { + + long avg = (power + prevPower) / 2; + this.delta = avg - this.log[0]; for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } - this.log[19] = this.power; + this.log[19] = avg; + + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setLong("power", avg); + nbt.setLong("delta", delta); + nbt.setShort("redLow", redLow); + nbt.setShort("redHigh", redHigh); + nbt.setByte("priority", (byte) this.priority.ordinal()); + this.networkPack(nbt, 20); } } @@ -226,6 +229,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public void networkUnpack(NBTTagCompound nbt) { this.power = nbt.getLong("power"); + this.delta = nbt.getLong("delta"); this.redLow = nbt.getShort("redLow"); this.redHigh = nbt.getShort("redHigh"); this.priority = ConnectionPriority.values()[nbt.getByte("priority")]; @@ -326,4 +330,23 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public Object[] getMaxEnergy(Context context, Arguments args) { return new Object[] {getMaxPower()}; } + + @Override + public void writeNBT(NBTTagCompound nbt) { + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + data.setShort("redLow", redLow); + data.setShort("redHigh", redHigh); + data.setInteger("priority", this.priority.ordinal()); + nbt.setTag(NBT_PERSISTENT_KEY, data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); + this.power = data.getLong("power"); + this.redLow = data.getShort("redLow"); + this.redHigh = data.getShort("redHigh"); + this.priority = ConnectionPriority.values()[data.getInteger("priority")]; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index b65e9ed39..541e4c9ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -131,10 +131,4 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { { return 65536.0D; } - - // override the name because when connecting the machine to opencomputers it's gonna say "ntm_energy_storage" - @Override - public String getComponentName() { - return "ntm_fensu"; - } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index a59f7cbab..7aee76459 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -6,11 +6,12 @@ import java.util.List; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.FluidType.FluidTrait; +import com.hbm.inventory.fluid.trait.FT_Corrosive; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; +import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.fluid.IFluidUser; @@ -20,7 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements IFluidContainer, IFluidSource, IFluidAcceptor, IFluidUser { +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements IFluidContainer, IFluidSource, IFluidAcceptor, IFluidUser, IPersistentNBT { public FluidTank tank; public short mode = 0; @@ -73,7 +74,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 5, true, true); } - if(tank.getTankType().traits.contains(FluidTrait.CORROSIVE_2)) { + if(tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).isHighlyCorrosive()) { worldObj.func_147480_a(xCoord, yCoord, zCoord, false); } } @@ -207,4 +208,25 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + + @Override + public void writeNBT(NBTTagCompound nbt) { + if(tank.getFill() == 0) return; + NBTTagCompound data = new NBTTagCompound(); + this.tank.writeToNBT(data, "tank"); + data.setShort("mode", mode); + nbt.setTag(NBT_PERSISTENT_KEY, data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); + this.tank.readFromNBT(data, "tank"); + this.mode = data.getShort("mode"); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java index 1dfe5dc04..e9ba00d48 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachinePuF6Tank.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java index 9a1d5db6e..9fc7a4ba2 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineUF6Tank.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.machine.storage; import com.hbm.interfaces.IFluidContainer; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java index 4308103a6..0949504e7 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java @@ -30,7 +30,7 @@ public class TileEntityConverterRfHe extends TileEntityLoadedBase implements IEn } private long subBuffer; - private boolean recursionBrake = false;; + private boolean recursionBrake = false; @Untested @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java new file mode 100644 index 000000000..68db57165 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneRouter.java @@ -0,0 +1,129 @@ +package com.hbm.tileentity.network; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerCraneRouter; +import com.hbm.inventory.gui.GUICraneRouter; +import com.hbm.module.ModulePatternMatcher; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class TileEntityCraneRouter extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { + + public ModulePatternMatcher[] patterns = new ModulePatternMatcher[6]; //why did i make six matchers??? + public int[] modes = new int[6]; + public static final int MODE_NONE = 0; + public static final int MODE_WHITELIST = 1; + public static final int MODE_BLACKLIST = 2; + public static final int MODE_WILDCARD = 3; + + public TileEntityCraneRouter() { + super(5 * 6); + + for(int i = 0; i < patterns.length; i++) { + patterns[i] = new ModulePatternMatcher(5); + } + } + + @Override + public String getName() { + return "container.craneRouter"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + NBTTagCompound data = new NBTTagCompound(); + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = new NBTTagCompound(); + patterns[i].writeToNBT(compound); + data.setTag("pattern" + i, compound); + } + data.setIntArray("modes", this.modes); + this.networkPack(data, 15); + } + } + + @Override + public void networkUnpack(NBTTagCompound data) { + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = data.getCompoundTag("pattern" + i); + patterns[i].readFromNBT(compound); + } + this.modes = data.getIntArray("modes"); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerCraneRouter(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUICraneRouter(player.inventory, this); + } + + public void nextMode(int index) { + + int matcher = index / 5; + int mIndex = index % 5; + + this.patterns[matcher].nextMode(worldObj, slots[index], mIndex); + } + + public void initPattern(ItemStack stack, int index) { + + int matcher = index / 5; + int mIndex = index % 5; + + this.patterns[matcher].initPatternSmart(worldObj, stack, mIndex); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = nbt.getCompoundTag("pattern" + i); + patterns[i].readFromNBT(compound); + } + this.modes = nbt.getIntArray("modes"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + for(int i = 0; i < patterns.length; i++) { + NBTTagCompound compound = new NBTTagCompound(); + patterns[i].writeToNBT(compound); + nbt.setTag("pattern" + i, compound); + } + nbt.setIntArray("modes", this.modes); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20; + } + + @Override + public void receiveControl(NBTTagCompound data) { + int i = data.getInteger("toggle"); + modes[i]++; + if(modes[i] > 3) + modes [i] = 0; + } +} diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 978394914..4ad7a19ee 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -18,7 +18,6 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.Item; @@ -28,7 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUIProvider { +public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implements IGUIProvider { public short mode = 0; public static final short MODE_ARTILLERY = 0; @@ -39,8 +38,6 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI public double barrelPos = 0; public double lastBarrelPos = 0; - private List targetQueue = new ArrayList(); - @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -57,15 +54,6 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI return ammoStacks; } - public void enqueueTarget(double x, double y, double z) { - - Vec3 pos = this.getTurretPos(); - Vec3 delta = Vec3.createVectorHelper(x - pos.xCoord, y - pos.yCoord, z - pos.zCoord); - if(delta.lengthVector() <= this.getDecetorRange()) { - this.targetQueue.add(Vec3.createVectorHelper(x, y, z)); - } - } - @Override protected List getAmmoList() { return new ArrayList(); @@ -132,28 +120,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI } @Override - protected void seekNewTarget() { - super.seekNewTarget(); - } - - @Override - public boolean entityInLOS(Entity e) { - - if(this.mode == this.MODE_CANNON) { - return super.entityInLOS(e); - } else { - - Vec3 pos = this.getTurretPos(); - Vec3 ent = this.getEntityPos(e); - Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); - double length = delta.lengthVector(); - - if(length < this.getDecetorGrace() || length > this.getDecetorRange() * 1.1) //the latter statement is only relevant for entities that have already been detected - return false; - - int height = worldObj.getHeightValue((int) Math.floor(e.posX), (int) Math.floor(e.posZ)); - return height < (e.posY + e.height); - } + public boolean doLOSCheck() { + return this.mode == this.MODE_CANNON; } @Override @@ -192,17 +160,17 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI return mode == MODE_CANNON ? 20D : 50D; } - public int getShellLoaded() { + public ItemStack getShellLoaded() { for(int i = 1; i < 10; i++) { if(slots[i] != null) { if(slots[i].getItem() == ModItems.ammo_arty) { - return slots[i].getItemDamage(); + return slots[i]; } } } - return -1; + return null; } public void conusmeAmmo(Item ammo) { @@ -217,7 +185,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI this.markDirty(); } - public void spawnShell(int type) { + public void spawnShell(ItemStack type) { Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); @@ -228,7 +196,15 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, (float) getV0(), 0.0F); proj.setTarget((int) tPos.xCoord, (int) tPos.yCoord, (int) tPos.zCoord); - proj.setType(type); + proj.setType(type.getItemDamage()); + + if(type.getItemDamage() == 8 && type.hasTagCompound()) { + NBTTagCompound cargo = type.stackTagCompound.getCompoundTag("cargo"); + + if(cargo != null) { + proj.setCargo(ItemStack.loadItemStackFromNBT(cargo)); + } + } if(this.mode != this.MODE_CANNON) proj.setWhistle(true); @@ -385,9 +361,9 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI if(timer % delay == 0) { - int conf = this.getShellLoaded(); + ItemStack conf = this.getShellLoaded(); - if(conf != -1) { + if(conf != null) { this.spawnShell(conf); this.conusmeAmmo(ModItems.ammo_arty); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 25.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java new file mode 100644 index 000000000..35d211872 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseArtillery.java @@ -0,0 +1,43 @@ +package com.hbm.tileentity.turret; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; + +public abstract class TileEntityTurretBaseArtillery extends TileEntityTurretBaseNT { + + protected List targetQueue = new ArrayList(); + + public void enqueueTarget(double x, double y, double z) { + + Vec3 pos = this.getTurretPos(); + Vec3 delta = Vec3.createVectorHelper(x - pos.xCoord, y - pos.yCoord, z - pos.zCoord); + if(delta.lengthVector() <= this.getDecetorRange()) { + this.targetQueue.add(Vec3.createVectorHelper(x, y, z)); + } + } + + public abstract boolean doLOSCheck(); + + @Override + public boolean entityInLOS(Entity e) { + + if(doLOSCheck()) { + return super.entityInLOS(e); + + } else { + Vec3 pos = this.getTurretPos(); + Vec3 ent = this.getEntityPos(e); + Vec3 delta = Vec3.createVectorHelper(ent.xCoord - pos.xCoord, ent.yCoord - pos.yCoord, ent.zCoord - pos.zCoord); + double length = delta.lengthVector(); + + if(length < this.getDecetorGrace() || length > this.getDecetorRange() * 1.1) //the latter statement is only relevant for entities that have already been detected + return false; + + int height = worldObj.getHeightValue((int) Math.floor(e.posX), (int) Math.floor(e.posZ)); + return height < (e.posY + e.height); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index ceb242aac..f571c4c03 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -7,9 +7,9 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.items.ModItems; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; @@ -207,4 +207,9 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 1c9a61779..6e57f56b5 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -3,9 +3,13 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; import java.util.List; +import com.hbm.entity.projectile.EntityArtilleryRocket; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretHIMARS; import com.hbm.items.ModItems; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.ItemAmmoHIMARS.HIMARSRocket; +import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; @@ -15,10 +19,22 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityTurretHIMARS extends TileEntityTurretBaseNT implements IGUIProvider { - +public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implements IGUIProvider { + + public short mode = 0; + public static final short MODE_AUTO = 0; + public static final short MODE_MANUAL = 1; + + public int typeLoaded = -1; + public int ammo = 0; + public float crane; + public float lastCrane; + @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { @@ -29,7 +45,7 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseNT implements IG ammoStacks = new ArrayList(); List list = new ArrayList(); - ModItems.ammo_arty.getSubItems(ModItems.ammo_arty, MainRegistry.weaponTab, list); + ModItems.ammo_himars.getSubItems(ModItems.ammo_himars, MainRegistry.weaponTab, list); this.ammoStacks.addAll(list); return ammoStacks; @@ -50,9 +66,301 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseNT implements IG return 1_000_000; } + @Override + public double getBarrelLength() { + return 0.5D; + } + + @Override + public double getAcceptableInaccuracy() { + return 5D; //they're guided missiles so who gives a shit + } + + @Override + public double getHeightOffset() { + return 5D; + } + + @Override + public double getDecetorRange() { + return 5000D; + } + + @Override + public double getDecetorGrace() { + return 32D; + } + + @Override + public double getTurretYawSpeed() { + return 1D; + } + + @Override + public double getTurretPitchSpeed() { + return 0.5D; + } + + @Override + public boolean doLOSCheck() { + return false; + } + + @Override + protected void alignTurret() { + + Vec3 pos = this.getTurretPos(); + + Vec3 delta = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord); + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + double targetPitch = Math.PI / 4D; + + this.turnTowardsAngle(targetPitch, targetYaw); + } + + public int getSpareRocket() { + + for(int i = 1; i < 10; i++) { + if(slots[i] != null) { + if(slots[i].getItem() == ModItems.ammo_himars) { + return slots[i].getItemDamage(); + } + } + } + + return -1; + } + + @Override + public void updateEntity() { + + this.lastCrane = this.crane; + + if(this.mode == this.MODE_MANUAL) { + if(!this.targetQueue.isEmpty()) { + this.tPos = this.targetQueue.get(0); + } + } else { + this.targetQueue.clear(); + } + + if(worldObj.isRemote) { + this.lastRotationPitch = this.rotationPitch; + this.lastRotationYaw = this.rotationYaw; + } + + this.aligned = false; + + if(!worldObj.isRemote) { + + this.updateConnections(); + + if(this.target != null && !target.isEntityAlive()) { + this.target = null; + this.stattrak++; + } + } + + if(target != null && this.mode != this.MODE_MANUAL) { + if(!this.entityInLOS(this.target)) { + this.target = null; + } + } + + if(!worldObj.isRemote) { + + if(target != null) { + this.tPos = this.getEntityPos(target); + } else { + if(this.mode != this.MODE_MANUAL) { + this.tPos = null; + } + } + } + + if(isOn() && hasPower()) { + + if(!this.hasAmmo() || this.crane > 0) { + + this.turnTowardsAngle(0, this.rotationYaw); + + if(this.aligned) { + + if(this.hasAmmo()) { + this.crane -= 0.0125F; + } else { + this.crane += 0.0125F; + + if(this.crane >= 1F && !worldObj.isRemote) { + int available = this.getSpareRocket(); + + if(available != -1) { + HIMARSRocket type = ItemAmmoHIMARS.itemTypes[available]; + this.typeLoaded = available; + this.ammo = type.amount; + this.conusmeAmmo(ModItems.ammo_himars); + } + } + } + } + + this.crane = MathHelper.clamp_float(this.crane, 0F, 1F); + + } else { + + if(tPos != null) { + this.alignTurret(); + } + } + + } else { + + this.target = null; + this.tPos = null; + } + + if(!worldObj.isRemote) { + + if(this.target != null && !target.isEntityAlive()) { + this.target = null; + this.tPos = null; + this.stattrak++; + } + + if(isOn() && hasPower()) { + searchTimer--; + + this.setPower(this.getPower() - this.getConsumption()); + + if(searchTimer <= 0) { + searchTimer = this.getDecetorInterval(); + + if(this.target == null && this.mode != this.MODE_MANUAL) + this.seekNewTarget(); + } + } else { + searchTimer = 0; + } + + if(this.aligned && crane <= 0) { + this.updateFiringTick(); + } + + this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); + + NBTTagCompound data = this.writePacket(); + this.networkPack(data, 250); + + } else { + + Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + + //this will fix the interpolation error when the turret crosses the 360° point + if(Math.abs(this.lastRotationYaw - this.rotationYaw) > Math.PI) { + + if(this.lastRotationYaw < this.rotationYaw) + this.lastRotationYaw += Math.PI * 2; + else + this.lastRotationYaw -= Math.PI * 2; + } + } + } + + @Override + protected NBTTagCompound writePacket() { + NBTTagCompound data = super.writePacket(); + data.setShort("mode", this.mode); + data.setInteger("type", this.typeLoaded); + data.setInteger("ammo", this.ammo); + return data; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + super.networkUnpack(nbt); + this.mode = nbt.getShort("mode"); + this.typeLoaded = nbt.getShort("type"); + this.ammo = nbt.getInteger("ammo"); + } + + public boolean hasAmmo() { + return this.typeLoaded >= 0 && this.ammo > 0; + } + + int timer; + @Override public void updateFiringTick() { + timer++; + + int delay = 40; + + if(timer % delay == 0) { + + if(this.hasAmmo() && this.tPos != null) { + this.spawnShell(this.typeLoaded); + this.ammo--; + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.rocketFlame", 25.0F, 1.0F); + } + + if(this.mode == this.MODE_MANUAL && !this.targetQueue.isEmpty()) { + this.targetQueue.remove(0); + this.tPos = null; + } + } + } + + public void spawnShell(int type) { + + Vec3 pos = this.getTurretPos(); + Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + + EntityArtilleryRocket proj = new EntityArtilleryRocket(worldObj); + proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); + proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 25F, 0.0F); + + if(this.target != null) + proj.setTarget(this.target); + else + proj.setTarget(tPos.xCoord, tPos.yCoord, tPos.zCoord); + + proj.setType(type); + + worldObj.spawnEntityInWorld(proj); + } + + @Override + public void handleButtonPacket(int value, int meta) { + if(meta == 5) { + this.mode++; + if(this.mode > 1) + this.mode = 0; + + this.tPos = null; + this.targetQueue.clear(); + + } else{ + super.handleButtonPacket(value, meta); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.mode = nbt.getShort("mode"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setShort("mode", this.mode); } @Override diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 99037829b..413a166ad 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -57,6 +57,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { ammoStacks.add(new ItemStack(ModItems.upgrade_overdrive_2)); ammoStacks.add(new ItemStack(ModItems.upgrade_overdrive_3)); ammoStacks.add(new ItemStack(ModItems.upgrade_5g)); + ammoStacks.add(new ItemStack(ModItems.upgrade_screm)); return ammoStacks; } @@ -143,6 +144,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { this.blackLevel = 0; this.pinkLevel = 0; this._5g = false; + this.screm = false; for(int i = 1; i < 10; i++) { if(slots[i] != null) { @@ -164,6 +166,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { if(item == ModItems.upgrade_overdrive_2) blackLevel += 2; if(item == ModItems.upgrade_overdrive_3) blackLevel += 3; if(item == ModItems.upgrade_5g) _5g = true; + if(item == ModItems.upgrade_screm) screm = true; } } } @@ -180,6 +183,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { int blackLevel; int pinkLevel; boolean _5g; + boolean screm; int checkDelay; @@ -206,7 +210,10 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT { vdat.setInteger("ent", this.target.getEntityId()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ), new TargetPoint(this.target.dimension, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ, 150)); - worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + if(this.screm) + worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "hbm:block.screm", 20.0F, 1.0F); + else + worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } this.power -= demand; diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java new file mode 100644 index 000000000..00d1425ee --- /dev/null +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -0,0 +1,128 @@ +package com.hbm.util; + +import java.util.ArrayList; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.machine.TileEntityDummy; + +import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidUser; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +/** + * EXTERNAL COMPATIBILITY CLASS - DO NOT CHANGE METHOD NAMES/PARAMS ONCE CREATED + * Is there a smarter way to do this? Most likely. Is there an easier one? Probably not. + * @author hbm + */ +public class CompatExternal { + + /** + * Gets the tile entity at that pos. If the tile entity is an mk1 or mk2 dummy, it will return the core instead. + * This method will be updated in the event that other multiblock systems or dummies are added to retrain the intended functionality. + * @return the core tile entity if the given position holds a dummy, the tile entity at that position if it doesn't or null if there is no tile entity + */ + public static TileEntity getCoreFromPos(World world, int x, int y, int z) { + + Block b = world.getBlock(x, y, z); + + //if the block at that pos is a Dummyable, use the mk2's system to find the core + if(b instanceof BlockDummyable) { + BlockDummyable dummy = (BlockDummyable) b; + int[] pos = dummy.findCore(world, x, y, z); + + if(pos != null) { + return world.getTileEntity(pos[0], pos[1], pos[2]); + } + } + + TileEntity tile = world.getTileEntity(x, y, z); + + //if the tile at that pos is an old dummy tile, use mk1 + if(tile instanceof TileEntityDummy) { + TileEntityDummy dummy = (TileEntityDummy) tile; + return world.getTileEntity(dummy.targetX, dummy.targetY, dummy.targetZ); + } + + //otherwise, return the tile at that position whihc could be null + return tile; + } + + /** + * Returns the numeric value of the buffered energy held by that tile entity. Current implementation relies on IEnergyUser. + * @param tile + * @return power + */ + public static long getBufferedPowerFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getPower(); + } + + return 0L; + } + + /** + * Returns the numeric value of the energy capacity of this tile entity. Current implementation relies on IEnergyUser. + * @param tile + * @return max power + */ + public static long getMaxPowerFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getMaxPower(); + } + + return 0L; + } + + /** + * Returns the ordinal of the energy priority from the supplied tile entity. 0 = low, 1 = normal, 2 = high. Returns -1 if not applicable. + * @param tile + * @return priority + */ + public static int getEnergyPriorityFromTile(TileEntity tile) { + + if(tile instanceof IEnergyUser) { + return ((IEnergyUser) tile).getPriority().ordinal(); + } + + return -1; + } + + /** + * Returns a list of tank definitions from the supplied tile entity. Uses IFluidUser, if the tile is incompatible it returns an empty list. + * @param tile + * @return an ArrayList of Object arrays with each array representing a fluid tank.
+ * [0]: STRING - unlocalized name of the fluid, simply use I18n to get the translated name
+ * [1]: INT - the unique ID of this fluid
+ * [2]: INT - the hexadecimal color of this fluid
+ * [3]: INT - the amount of fluid in this tank in millibuckets
+ * [4]: INT - the capacity of this tank in millibuckets + */ + public static ArrayList getFluidInfoFromTile(TileEntity tile) { + ArrayList list = new ArrayList(); + + if(!(tile instanceof IFluidUser)) { + return list; + } + + IFluidUser container = (IFluidUser) tile; + + for(FluidTank tank : container.getAllTanks()) { + FluidType type = tank.getTankType(); + list.add(new Object[] { + type.getName(), + type.getID(), + type.getColor(), + tank.getFill(), + tank.getMaxFill() + }); + } + + return list; + } +} diff --git a/src/main/java/com/hbm/util/CrucibleUtil.java b/src/main/java/com/hbm/util/CrucibleUtil.java new file mode 100644 index 000000000..e5d06cdbd --- /dev/null +++ b/src/main/java/com/hbm/util/CrucibleUtil.java @@ -0,0 +1,169 @@ +package com.hbm.util; + +import java.util.List; + +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; + +import api.hbm.block.ICrucibleAcceptor; +import net.minecraft.block.Block; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class CrucibleUtil { + + /** + * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the leftover material, just like ICrucibleAcceptor's pour. + * The method directly modifies the original stack, so be careful and make a copy beforehand if you don't want that. + * Pass an empty Vec3 instance in order to get the impact position of the stream. + */ + public static MaterialStack pourSingleStack(World world, double x, double y, double z, double range, boolean safe, MaterialStack stack, int quanta, Vec3 impactPosHolder) { + + + Vec3 start = Vec3.createVectorHelper(x, y, z); + Vec3 end = Vec3.createVectorHelper(x, y - range, z); + + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); + MovingObjectPosition mop = mopHolder[0]; + + if(acc == null) { + spill(mop, safe, stack, quanta, impactPosHolder); + return stack; + } + + MaterialStack ret = tryPourStack(world, acc, mop, stack, impactPosHolder); + + if(ret != null) { + return ret; + } + + spill(mop, safe, stack, quanta, impactPosHolder); + return stack; + } + + /** + * Standard pouring, casting a hitscan straight down at the given coordinates with the given range. Returns the materialStack that has been removed. + * The method doesn't make copies of the MaterialStacks in the list, so the materials being subtracted or outright removed will apply to the original list. + * Pass an empty Vec3 instance in order to get the impact position of the stream. + */ + public static MaterialStack pourFullStack(World world, double x, double y, double z, double range, boolean safe, List stacks, int quanta, Vec3 impactPosHolder) { + + if(stacks.isEmpty()) return null; + + Vec3 start = Vec3.createVectorHelper(x, y, z); + Vec3 end = Vec3.createVectorHelper(x, y - range, z); + + MovingObjectPosition[] mopHolder = new MovingObjectPosition[1]; + ICrucibleAcceptor acc = getPouringTarget(world, start, end, mopHolder); + MovingObjectPosition mop = mopHolder[0]; + + if(acc == null) { + return spill(mop, safe, stacks, quanta, impactPosHolder); + } + + for(MaterialStack stack : stacks) { + + int amountToPour = Math.min(stack.amount, quanta); + MaterialStack toPour = new MaterialStack(stack.material, amountToPour); + MaterialStack left = tryPourStack(world, acc, mop, toPour, impactPosHolder); + + if(left != null) { + stack.amount -= (amountToPour - left.amount); + return new MaterialStack(stack.material, stack.amount - left.amount); + } + } + + return spill(mop, safe, stacks, quanta, impactPosHolder); + } + + /** + * Tries to pour the stack onto the supplied crucible acceptor instance. Also features our friend the Vec3 dummy, which will be filled with the stream's impact position. + * Returns whatever is left of the stack when successful or null when unsuccessful (potential spillage). + */ + public static MaterialStack tryPourStack(World world, ICrucibleAcceptor acc, MovingObjectPosition mop, MaterialStack stack, Vec3 impactPosHolder) { + Vec3 hit = mop.hitVec; + + if(stack.material.smeltable != SmeltingBehavior.SMELTABLE) { + return null; + } + + if(acc.canAcceptPartialPour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack)) { + MaterialStack left = acc.pour(world, mop.blockX, mop.blockY, mop.blockZ, hit.xCoord, hit.yCoord, hit.zCoord, ForgeDirection.getOrientation(mop.sideHit), stack); + if(left == null) { + left = new MaterialStack(stack.material, 0); + } + + impactPosHolder.xCoord = hit.xCoord; + impactPosHolder.yCoord = hit.yCoord; + impactPosHolder.zCoord = hit.zCoord; + + return left; + } + + return null; + } + + /** + * Uses hitscan to find the target of the pour, from start (the top) to end (the bottom). Pass a single cell MOP array to get the reference of the MOP for later use. + * Now we're thinking with reference types. + */ + public static ICrucibleAcceptor getPouringTarget(World world, Vec3 start, Vec3 end, MovingObjectPosition[] mopHolder) { + + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); + + if(mopHolder != null) { + mopHolder[0] = mop; + } + + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { + return null; + } + + Block b = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + + if(!(b instanceof ICrucibleAcceptor)) { + return null; + } + + return (ICrucibleAcceptor) b; + } + + /** + * Regular spillage routine but accepts a stack list instead of a stack. simply uses the first available stack from the list. Assumes list is not empty. + */ + public static MaterialStack spill(MovingObjectPosition mop, boolean safe, List stacks, int quanta, Vec3 impactPos) { + //simply use the first available material + MaterialStack top = stacks.get(0); + MaterialStack ret = spill(mop, safe, top, quanta, impactPos); + //remove all stacks with no content + stacks.removeIf(o -> o.amount <= 0); + + return ret; + } + + /** + * The routine used for then there is no valid crucible acceptor found. Will NOP with safe mode on. Returns the MaterialStack that was lost. + */ + public static MaterialStack spill(MovingObjectPosition mop, boolean safe, MaterialStack stack, int quanta, Vec3 impactPos) { + + //do nothing if safe mode is on + if(safe) { + return null; + } + + MaterialStack toWaste = new MaterialStack(stack.material, Math.min(stack.amount, quanta)); + stack.amount -= toWaste.amount; + + //if there is a vec3 reference, set the impact coordinates + if(impactPos != null && mop != null) { + impactPos.xCoord = mop.hitVec.xCoord; + impactPos.yCoord = mop.hitVec.yCoord; + impactPos.zCoord = mop.hitVec.zCoord; + } + + return toWaste; + } +} diff --git a/src/main/java/com/hbm/util/HeatUtil.java b/src/main/java/com/hbm/util/HeatUtil.java index 711d3bc6b..cf9434c45 100644 --- a/src/main/java/com/hbm/util/HeatUtil.java +++ b/src/main/java/com/hbm/util/HeatUtil.java @@ -1,7 +1,7 @@ package com.hbm.util; -import com.hbm.inventory.FluidTank; import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.tank.FluidTank; public class HeatUtil { diff --git a/src/main/java/com/hbm/util/I18nUtil.java b/src/main/java/com/hbm/util/I18nUtil.java index 6476684a2..a4460f6d9 100644 --- a/src/main/java/com/hbm/util/I18nUtil.java +++ b/src/main/java/com/hbm/util/I18nUtil.java @@ -3,9 +3,12 @@ package com.hbm.util; import java.util.ArrayList; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; +@SideOnly(Side.CLIENT) public class I18nUtil { /** @@ -14,6 +17,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String resolveKey(String s, Object... args) { return I18n.format(s, args); } @@ -24,6 +28,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String[] resolveKeyArray(String s, Object... args) { return resolveKey(s, args).split("\\$"); } @@ -35,6 +40,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreakWithParagraphs(FontRenderer fontRenderer, String text, int width) { String[] paragraphs = text.split("\\$"); @@ -54,6 +60,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreak(FontRenderer fontRenderer, String text, int width) { List lines = new ArrayList(); diff --git a/src/main/java/com/hbm/util/InventoryUtil.java b/src/main/java/com/hbm/util/InventoryUtil.java index 8132c728a..492ce36f2 100644 --- a/src/main/java/com/hbm/util/InventoryUtil.java +++ b/src/main/java/com/hbm/util/InventoryUtil.java @@ -448,6 +448,15 @@ public class InventoryUtil { return true; } + /** + * A fixed re-implementation of the original Container.mergeItemStack that repects stack size and slot restrictions. + * @param slots + * @param stack + * @param start + * @param end + * @param reverse + * @return + */ public static boolean mergeItemStack(List slots, ItemStack stack, int start, int end, boolean reverse) { boolean success = false; diff --git a/src/main/java/com/hbm/util/ItemStackUtil.java b/src/main/java/com/hbm/util/ItemStackUtil.java index ea4c1b843..c90042a4a 100644 --- a/src/main/java/com/hbm/util/ItemStackUtil.java +++ b/src/main/java/com/hbm/util/ItemStackUtil.java @@ -139,22 +139,12 @@ public class ItemStackUtil { return stacks; } - //private static HashMap> buffered = new HashMap(); - /** * Returns a List of all ore dict names for this stack. Stack cannot be null, list is empty when there are no ore dict entries. * @param stack * @return */ public static List getOreDictNames(ItemStack stack) { - - /*ÜComparableStack comp = new ComparableStack(stack).makeSingular(); - - List buff = buffered.get(comp); - - if(buff != null) - return buff;*/ - List list = new ArrayList(); int ids[] = OreDictionary.getOreIDs(stack); @@ -162,7 +152,6 @@ public class ItemStackUtil { list.add(OreDictionary.getOreName(i)); } - //buffered.put(comp, new ArrayList(list)); return list; } } diff --git a/src/main/java/com/hbm/util/SuicideThreadDump.java b/src/main/java/com/hbm/util/SuicideThreadDump.java new file mode 100644 index 000000000..39ad116a2 --- /dev/null +++ b/src/main/java/com/hbm/util/SuicideThreadDump.java @@ -0,0 +1,85 @@ +package com.hbm.util; + +import java.lang.management.ManagementFactory; +import java.lang.management.MonitorInfo; +import java.lang.management.ThreadInfo; + +import org.apache.logging.log4j.Level; + +import com.hbm.main.MainRegistry; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.FMLLaunchHandler; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.client.ClientCommandHandler; + +public class SuicideThreadDump extends CommandBase { + + public static void register() { + if(FMLLaunchHandler.side() != Side.CLIENT) return; + ClientCommandHandler handler = ClientCommandHandler.instance; + handler.registerCommand(new SuicideThreadDump()); + } + + @Override + public String getCommandName() { + return "dumpthreadsandcrashgame"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/dumpthreadsandcrashgame [dump/crash]"; + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return sender instanceof EntityPlayer; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + + if(args.length != 1 || !(args[0].equals("dump") || args[0].equals("crash"))) { + throw new CommandException("Requires argument \"dump\" or \"crash\"!"); + } + + ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); + + for(ThreadInfo thread : threads) { + dumpThread(thread); + } + + if(args[0].equals("crash")) { + FMLCommonHandler.instance().exitJava(0, true); + } + } + + private static void dumpThread(ThreadInfo info) { + + MainRegistry.logger.log(Level.FATAL, "==========================================="); + MainRegistry.logger.log(Level.FATAL, "Thread: " + info.getThreadName() + " PID: " + info.getThreadId()); + MainRegistry.logger.log(Level.FATAL, "Suspended: " + info.isSuspended()); + MainRegistry.logger.log(Level.FATAL, "Blocked: " + info.getBlockedTime() + "ms, " + info.getBlockedCount() + "x"); + MainRegistry.logger.log(Level.FATAL, "Runs Native: " + info.isInNative()); + MainRegistry.logger.log(Level.FATAL, "State: " + info.getThreadState().name()); + MainRegistry.logger.log(Level.FATAL, "-------------------------------------------"); + + if(info.getLockedMonitors().length != 0) { + MainRegistry.logger.log(Level.FATAL, "Following locks found:"); + for(MonitorInfo monitor : info.getLockedMonitors()) { + MainRegistry.logger.log(Level.FATAL, "- " + monitor.getLockedStackFrame()); + } + MainRegistry.logger.log(Level.FATAL, "-------------------------------------------"); + } + + MainRegistry.logger.log(Level.FATAL, "Stacktrace:"); + for(StackTraceElement line : info.getStackTrace()) { + MainRegistry.logger.log(Level.FATAL, "- " + line); + } + MainRegistry.logger.log(Level.FATAL, "==========================================="); + } +} diff --git a/src/main/java/com/hbm/wiaj/FauxWorld.java b/src/main/java/com/hbm/wiaj/FauxWorld.java new file mode 100644 index 000000000..583770d8d --- /dev/null +++ b/src/main/java/com/hbm/wiaj/FauxWorld.java @@ -0,0 +1,34 @@ +package com.hbm.wiaj; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.profiler.Profiler; +import net.minecraft.world.World; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.WorldSettings; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.storage.SaveHandlerMP; + +@SideOnly(Side.CLIENT) +public class FauxWorld extends World { + + public FauxWorld(String p_i45368_2_, WorldProvider p_i45368_3_, WorldSettings p_i45368_4_, Profiler p_i45368_5_) { + super(new SaveHandlerMP(), "FauxWorld", p_i45368_3_, p_i45368_4_, p_i45368_5_); + } + + @Override + protected IChunkProvider createChunkProvider() { + return null; + } + + @Override + protected int func_152379_p() { + return 0; + } + + @Override + public Entity getEntityByID(int id) { + return null; + } +} diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java new file mode 100644 index 000000000..a6403503b --- /dev/null +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -0,0 +1,435 @@ +package com.hbm.wiaj; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ISpecialActor; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; +import com.hbm.wiaj.cannery.*; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +//krass +public class GuiWorldInAJar extends GuiScreen { + + private static final ResourceLocation guiUtil = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_utility.png"); + + RenderBlocks renderer; + JarScript jarScript; + ItemStack icon; + ActorFancyPanel titlePanel; + CanneryBase[] seeAlso; + ActorFancyPanel[] seeAlsoTitles; + + public GuiWorldInAJar(JarScript script, String title, ItemStack icon, CanneryBase... seeAlso) { + super(); + this.fontRendererObj = Minecraft.getMinecraft().fontRenderer; + + this.jarScript = script; + this.icon = icon; + this.seeAlso = seeAlso; + this.renderer = new RenderBlocks(jarScript.world); + this.renderer.enableAO = true; + + this.titlePanel = new ActorFancyPanel(fontRendererObj, 40, 27, new Object[][] {{I18nUtil.resolveKey(title)}}, 0).setColors(CanneryBase.colorGold).setOrientation(Orientation.LEFT); + + /*WorldInAJar world = new WorldInAJar(15, 15, 15); + + testScript = new JarScript(world); + JarScene startingScene = new JarScene(testScript); + + for(int y = 0; y < 15; y++) { + for(int x = 0; x < 15; x++) { + for(int z = 0; z < 15; z++) { + + if(y == 14) { + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); + continue; + } + + if(y > 0) { + if(x == 0 || x == 14 || z == 0 || z == 14) { + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.glass_boron)); + continue; + } + } + + if(y == 0) { + if(x == 0 || x == 14 || z == 0 || z == 14) { + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.concrete_colored, 6)); + } else { + startingScene.add(new ActionSetBlock(x, y, z, ModBlocks.concrete_colored, 0)); + } + } + } + } + startingScene.add(new ActionWait(1)); + } + + startingScene.add(new ActionWait(10)); + startingScene.add(new ActionSetBlock(2, 1, 2, ModBlocks.fallout, 0)); + startingScene.add(new ActionWait(10)); + startingScene.add(new ActionSetBlock(4, 1, 4, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 5, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 6, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 7, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 8, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 9, ModBlocks.conveyor, 2)); + startingScene.add(new ActionSetBlock(4, 1, 10, ModBlocks.conveyor, 6)); + startingScene.add(new ActionSetBlock(5, 1, 10, ModBlocks.conveyor, 4)); + + startingScene.add(new ActionWait(5)); + startingScene.add(new ActionRotateBy(90, 0, 10)); + + JarScene brickScene = new JarScene(testScript); + + for(int y = 1; y < 7; y++) { + for(int x = 9; x < 12; x++) { + for(int z = 6; z < 9; z++) { + brickScene.add(new ActionSetBlock(x, y, z, Blocks.brick_block)); + } + } + brickScene.add(new ActionWait(2)); + } + + brickScene.add(new ActionRotateBy(-90, 0, 10)); + + brickScene.add(new ActionCreateActor(0, new ActorTileEntity(new RenderStirling()))); + NBTTagCompound stirling = new NBTTagCompound(); + stirling.setDouble("x", 7); + stirling.setDouble("y", 1); + stirling.setDouble("z", 7); + stirling.setInteger("rotation", 2); + stirling.setBoolean("hasCog", true); + brickScene.add(new ActionSetActorData(0, stirling)); + brickScene.add(new ActionWait(20)); + brickScene.add(new ActionUpdateActor(0, "speed", 5F)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionUpdateActor(0, "speed", 10F)); + brickScene.add(new ActionOffsetBy(1, 0, 0, 10)); + brickScene.add(new ActionWait(10)); + brickScene.add(new ActionOffsetBy(0, 0, 1, 10)); + + //brickScene.add(new ActionCreateActor(1, new ActorBasicPanel(0, 0, new Object[]{ new ItemStack(ModItems.ammo_arty, 1, 5)," shit *and* piss" }))); + + brickScene.add(new ActionCreateActor(1, new ActorFancyPanel(this.fontRendererObj, 0, 30, new Object[][] {{"I've come to make an announcement: Shadow the Hedgehog's a" + + " bitch-ass motherfucker. He pissed on my fucking wife. That's right. He took his hedgehog fuckin' quilly dick out and he pissed on my FUCKING wife, and he" + + " said his dick was THIS BIG, and I said that's disgusting. So I'm making a callout post on my Twitter.com. Shadow the Hedgehog, you got a small dick. It's" + + " the size of this walnut except WAY smaller. And guess what? Here's what my dong looks like. That's right, baby. Tall points, no quills, no pillows, look " + + "at that, it looks like two balls and a bong. He fucked my wife, so guess what, I'm gonna fuck the earth. That's right, this is what you get! My SUPER LASE" + + "R PISS! Except I'm not gonna piss on the earth. I'm gonna go higher. I'm pissing on the MOOOON! How do you like that, OBAMA? I PISSED ON THE MOON, YOU IDI" + + "OT! You have twenty-three hours before the piss DROPLETS hit the fucking earth, now get out of my fucking sight before I piss on you too! "}}, 450) + .setColors(0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xff1A1F22).setOrientation(Orientation.BOTTOM))); + brickScene.add(new ActionWait(200)); + + this.testScript.addScene(startingScene).addScene(brickScene);*/ + //SKY BLUE: 0xffA5D9FF, 0xff39ACFF, 0xff1A6CA7, 0xff1A1F22 + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + this.drawDefaultBackground(); + //shittyHack = this; + + try { + if(jarScript != null) { + jarScript.run(); + } + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + } catch(Exception ex) { + + for(StackTraceElement line : ex.getStackTrace()) { + this.mc.thePlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + line.toString())); + } + + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) { + + if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + + if(this.jarScript.isPaused()) { + this.jarScript.unpause(); + } else { + this.jarScript.pause(); + } + } + + if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + + if(this.jarScript.sceneNumber > 0) { + this.jarScript.rewindOne(); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + } + + if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) { + + if(this.jarScript.sceneNumber < this.jarScript.scenes.size()) { + this.jarScript.forwardOne(); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + } + } + } + + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + for(Entry actor : this.jarScript.actors.entrySet()) { + GL11.glPushMatrix(); + actor.getValue().drawForegroundComponent(this.width, this.height, this.jarScript.ticksElapsed, this.jarScript.interp); + GL11.glPopMatrix(); + } + + if(Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { + List list = new ArrayList(); + list.add(new Object[] { (mouseX - width / 2) + " / " + (mouseY - height / 2) }); + this.drawStackText(list, mouseX - width / 2, mouseY - height / 2, this.fontRendererObj); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int playButton = this.jarScript.isPaused() ? 64 : 40; + + if(width / 2 - 12 <= mouseX && width / 2 - 12 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12, height - 36, playButton, 48, 24, 24); + + if(this.jarScript.sceneNumber == 0) + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 72, 24, 24); + else if(width / 2 - 12 - 36 <= mouseX && width / 2 - 12 - 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12 - 36, height - 36, 88, 48, 24, 24); + + if(this.jarScript.sceneNumber >= this.jarScript.scenes.size()) + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 72, 24, 24); + else if(width / 2 - 12 + 36 <= mouseX && width / 2 - 12 + 36 + 24 > mouseX && height - 36 < mouseY && height - 36 + 24 >= mouseY) + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 24, 24, 24); + else + this.drawTexturedModalRect(width / 2 - 12 + 36, height - 36, 112, 48, 24, 24); + + GL11.glEnable(GL11.GL_DEPTH_TEST); + this.drawTexturedModalRect(15, 15, 136, 48, 24, 24); + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19, null); + RenderHelper.disableStandardItemLighting(); + + if(15 <= mouseX && 39 > mouseX && 15 < mouseY && 39 >= mouseY) { + this.titlePanel.drawForegroundComponent(0, 0, this.jarScript.ticksElapsed, this.jarScript.interp); + } + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + + GL11.glPushMatrix(); + setupRotation(); + + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator.instance.startDrawingQuads(); + + for(int x = 0; x < jarScript.world.sizeX; x++) { + for(int y = 0; y < jarScript.world.sizeY; y++) { + for(int z = 0; z < jarScript.world.sizeZ; z++) { + renderer.renderBlockByRenderType(jarScript.world.getBlock(x, y, z), x, y, z); + } + } + } + + Tessellator.instance.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + GL11.glPushMatrix(); + setupRotation(); + RenderHelper.enableStandardItemLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + + for(Entry actor : this.jarScript.actors.entrySet()) { + GL11.glPushMatrix(); + actor.getValue().drawBackgroundComponent(this.jarScript.ticksElapsed, this.jarScript.interp); + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } + + private void setupRotation() { + + double scale = -10; + + GL11.glTranslated(width / 2, height / 2, 400); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.5); //incredible flattening power + + double zoom = jarScript.zoom(); + GL11.glScaled(zoom, zoom, zoom); + + GL11.glRotated(jarScript.pitch(), 1, 0, 0); + GL11.glRotated(jarScript.yaw(), 0, 1, 0); + GL11.glTranslated(jarScript.world.sizeX / -2D, -jarScript.world.sizeY / 2D , jarScript.world.sizeZ / -2D); + GL11.glTranslated(jarScript.offsetX(), jarScript.offsetY(), jarScript.offsetZ()); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + //ublic static GuiWorldInAJar shittyHack; + + public void drawStackText(List lines, int x, int y, FontRenderer font) { + + x += width / 2; + y += height / 2; + + if(!lines.isEmpty()) { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int height = 0; + int longestline = 0; + Iterator iterator = lines.iterator(); + + while(iterator.hasNext()) { + Object[] line = (Object[]) iterator.next(); + int lineWidth = 0; + + boolean hasStack = false; + + for(Object o : line) { + + if(o instanceof String) { + lineWidth += font.getStringWidth((String) o); + } else { + lineWidth += 18; + hasStack = true; + } + } + + if(hasStack) { + height += 18; + } else { + height += 10; + } + + if(lineWidth > longestline) { + longestline = lineWidth; + } + } + + int minX = x + 12; + int minY = y - 12; + + if(minX + longestline > this.width) { + minX -= 28 + longestline; + } + + if(minY + height + 6 > this.height) { + minY = this.height - height - 6; + } + + this.zLevel = 300.0F; + itemRender.zLevel = 300.0F; + //int j1 = -267386864; + int colorBg = 0xF0100010; + this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY + height + 3, minX + longestline + 3, minY + height + 4, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX - 4, minY - 3, minX - 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX + longestline + 3, minY - 3, minX + longestline + 4, minY + height + 3, colorBg, colorBg); + //int k1 = 1347420415; + int color0 = 0x505000FF; + //int l1 = (k1 & 16711422) >> 1 | k1 & -16777216; + int color1 = (color0 & 0xFEFEFE) >> 1 | color0 & 0xFF000000; + this.drawGradientRect(minX - 3, minY - 3 + 1, minX - 3 + 1, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX + longestline + 2, minY - 3 + 1, minX + longestline + 3, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY - 3 + 1, color0, color0); + this.drawGradientRect(minX - 3, minY + height + 2, minX + longestline + 3, minY + height + 3, color1, color1); + + for(int index = 0; index < lines.size(); ++index) { + + Object[] line = (Object[]) lines.get(index); + int indent = 0; + boolean hasStack = false; + + for(Object o : line) { + if(!(o instanceof String)) { + hasStack = true; + } + } + + for(Object o : line) { + + if(o instanceof String) { + font.drawStringWithShadow((String) o, minX + indent, minY + (hasStack ? 4 : 0), -1); + indent += font.getStringWidth((String) o) + 2; + } else { + ItemStack stack = (ItemStack) o; + GL11.glColor3f(1F, 1F, 1F); + + if(stack.stackSize == 0) { + this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), stack, minX + indent, minY, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + indent += 18; + } + } + + if(index == 0) { + minY += 2; + } + + minY += hasStack ? 18 : 10; + } + + this.zLevel = 0.0F; + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + } +} diff --git a/src/main/java/com/hbm/wiaj/JarScene.java b/src/main/java/com/hbm/wiaj/JarScene.java new file mode 100644 index 000000000..ec62493f2 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/JarScene.java @@ -0,0 +1,65 @@ +package com.hbm.wiaj; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.wiaj.actions.IJarAction; + +/** + * A scene is a simple sequence of tasks, every script can have multiple scenes + * Scenes depend on each other, in order to rewind we'll have to re-init the playing field and FFW through all previous scenes + * @author hbm + * + */ +public class JarScene { + + public List actions = new ArrayList(); + public JarScript script; + + public int actionNumber = 0; + public IJarAction currentAction; //the action that is currently happening + public int currentActionStart = 0; //time in ticks since init + + public JarScene (JarScript script) { + this.script = script; + } + + public JarScene add(IJarAction action) { + + if(this.currentAction == null) + this.currentAction = action; //set first action + + this.actions.add(action); + return this; + } + + /** does the once per 50ms tick routine */ + public void tick() { + + if(this.currentAction == null) return; + + this.currentAction.act(script.world, this); + + int duration = this.currentAction.getDuration(); + + if(this.currentActionStart + duration <= script.ticksElapsed) { //choose next action + + this.actionNumber++; + this.currentActionStart = script.ticksElapsed; + + if(actionNumber < this.actions.size()) { + this.currentAction = this.actions.get(actionNumber); + tick(); + + } else { + this.currentAction = null; + } + } + } + + public void reset() { + this.currentAction = this.actions.get(0); + this.actionNumber = 0; + this.currentActionStart = script.ticksElapsed; + } +} diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java new file mode 100644 index 000000000..caa8d65b8 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -0,0 +1,199 @@ +package com.hbm.wiaj; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.util.BobMathUtil; +import com.hbm.wiaj.actors.ISpecialActor; + +import net.minecraft.util.MathHelper; + +public class JarScript { + + public WorldInAJar world; + public List scenes = new ArrayList(); + public HashMap actors = new HashMap(); + public JarScene currentScene; + public int sceneNumber = 0; + + public double lastRotationYaw = -45D, rotationYaw = -45D; + public double lastRotationPitch = -30D, rotationPitch = -30D; + public double lastOffsetX = 0, offsetX = 0; + public double lastOffsetY = 0, offsetY = 0; + public double lastOffsetZ = 0, offsetZ = 0; + public double lastZoom = 1, zoom = 1; + + public float interp = 0F; + + public long lastTick = 0; + public int ticksElapsed = 0; + + private boolean isPaused = false; + + public JarScript(WorldInAJar world) { + this.world = world; + } + + public JarScript addScene(JarScene scene) { + + if(this.currentScene == null) + this.currentScene = scene; + + this.scenes.add(scene); + return this; + } + + /**supposed to be called every frame, it calculates tick times and interp values */ + public void run() { + + if(this.isPaused && !freeRun) return; + + long now = System.currentTimeMillis(); + + boolean nextTick = false; + + if(this.lastTick == 0) { // do the first tick right away + this.lastTick = now; + nextTick = true; + } + + if(this.lastTick + 50 < now || freeRun) { + this.lastTick = now; + this.ticksElapsed++; + nextTick = true; + } + + if(this.currentScene != null) { + this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); + } else { + this.interp = 0; + } + + if(nextTick) { + + this.lastRotationPitch = this.rotationPitch; + this.lastRotationYaw = this.rotationYaw; + this.lastOffsetX = this.offsetX; + this.lastOffsetY = this.offsetY; + this.lastOffsetZ = this.offsetZ; + this.lastZoom = this.zoom; + + if(this.currentScene != null) { + + for(Entry actor : this.actors.entrySet()) { + actor.getValue().updateActor(this.currentScene); + } + + tickScene(); + } + } + } + + public void tickScene() { + this.currentScene.tick(); + + if(this.currentScene.currentAction == null) { //means this scene is done + + this.sceneNumber++; + + if(this.sceneNumber < this.scenes.size()) { + this.currentScene = this.scenes.get(sceneNumber); + this.currentScene.reset(); + } else { + this.currentScene = null; + } + } + } + + private long pauseDelta; + + public void pause() { + this.isPaused = true; + this.pauseDelta = System.currentTimeMillis() - this.lastTick; //saves the difference between last tick and now + } + + public void unpause() { + this.isPaused = false; + this.lastTick = System.currentTimeMillis() - this.pauseDelta; //recreates an equivalent last tick from the new current time + } + + public boolean isPaused() { + return this.isPaused; + } + + private void ffw() { + + this.reset(); + + freeRun = true; + int i = 0; + + while(this.sceneNumber < ffwTarget && this.currentScene != null && i < 10_000) { + this.run(); + i++; + } + + if(i > 0) { //i don't know why it needs one more cycle but it does + this.run(); + } + + freeRun = false; + } + + /** how far we want to fast forward */ + public static int ffwTarget = 0; + /** flag set during FFW, skips tick delay checks which means ticks during run() are always executed */ + public static boolean freeRun = false; + + public void reset() { + + this.actors.clear(); + this.world.nuke(); + + this.currentScene = this.scenes.get(0); + this.sceneNumber = 0; + this.ticksElapsed = 0; + this.lastTick = 0; + + this.lastOffsetX = this.offsetX = 0D; + this.lastOffsetY = this.offsetY = 0D; + this.lastOffsetZ = this.offsetZ = 0D; + this.lastZoom = this.zoom = 1D; + this.lastRotationYaw = this.rotationYaw = -45D; + this.lastRotationPitch = this.rotationPitch = -30D; + + for(JarScene scene : this.scenes) { + scene.reset(); + } + } + + public void rewindOne() { + + if(this.sceneNumber > 0) { + this.ffwTarget = this.sceneNumber - 1; + } else { + this.ffwTarget = 0; + } + + ffw(); + } + + public void forwardOne() { + if(this.sceneNumber < this.scenes.size()) { + this.ffwTarget = this.sceneNumber + 1; + } else { + this.ffwTarget = this.scenes.size(); + } + + ffw(); + } + + public double yaw() { return BobMathUtil.interp(this.lastRotationYaw, this.rotationYaw, interp); } + public double pitch() { return BobMathUtil.interp(this.lastRotationPitch, this.rotationPitch, interp); } + public double offsetX() { return BobMathUtil.interp(this.lastOffsetX, this.offsetX, interp); } + public double offsetY() { return BobMathUtil.interp(this.lastOffsetY, this.offsetY, interp); } + public double offsetZ() { return BobMathUtil.interp(this.lastOffsetZ, this.offsetZ, interp); } + public double zoom() { return BobMathUtil.interp(this.lastZoom, this.zoom, interp); } +} diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java new file mode 100644 index 000000000..099cdc444 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -0,0 +1,125 @@ +package com.hbm.wiaj; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * A hastily put together implementation of IBlockAccess in order to render things using ISBRH... + * It can handle blocks, and not a whole lot else. + * @author hbm + */ +public class WorldInAJar implements IBlockAccess { + + public int sizeX; + public int sizeY; + public int sizeZ; + + private Block[][][] blocks; + private short[][][] meta; + private TileEntity[][][] tiles; + + public WorldInAJar(int x, int y, int z) { + this.sizeX = x; + this.sizeY = y; + this.sizeZ = z; + + this.blocks = new Block[x][y][z]; + this.meta = new short[x][y][z]; + this.tiles = new TileEntity[x][y][z]; + } + + public void nuke() { + + this.blocks = new Block[sizeX][sizeY][sizeZ]; + this.meta = new short[sizeX][sizeY][sizeZ]; + this.tiles = new TileEntity[sizeX][sizeY][sizeZ]; + } + + @Override + public Block getBlock(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return Blocks.air; + + return this.blocks[x][y][z] != null ? this.blocks[x][y][z] : Blocks.air; + } + + public void setBlock(int x, int y, int z, Block b, int meta) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return; + + this.blocks[x][y][z] = b; + this.meta[x][y][z] = (short)meta; + } + + @Override + public int getBlockMetadata(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return 0; + + return this.meta[x][y][z]; + } + + //shaky, we may kick tile entities entirely and rely on outside-the-world tile actors for rendering + //might still come in handy for manipulating things using dummy tiles, like cable connections + @Override + public TileEntity getTileEntity(int x, int y, int z) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return null; + + return this.tiles[x][y][z]; + } + + public void setTileEntity(int x, int y, int z, TileEntity tile) { + if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ) + return; + + this.tiles[x][y][z] = tile; + } + + //always render fullbright, if the situation requires it we could add a very rudimentary system that + //darkens blocks id there is a solid one above + @Override + public int getLightBrightnessForSkyBlocks(int x, int y, int z, int blockBrightness) { + return 15; //always be on fullbright + } + + //redstone could theoretically be implemented, but we will wait for now + @Override + public int isBlockProvidingPowerTo(int x, int y, int z, int dir) { + return 0; + } + + @Override + public boolean isAirBlock(int x, int y, int z) { + return this.getBlock(x, y, z).isAir(this, x, y, z); + } + + //biomes don't matter to us, if the situation requires it we could implement a primitive biome mask + @Override + @SideOnly(Side.CLIENT) + public BiomeGenBase getBiomeGenForCoords(int x, int z) { + return BiomeGenBase.plains; + } + + @Override + @SideOnly(Side.CLIENT) + public int getHeight() { + return this.sizeY; + } + + @Override + public boolean extendedLevelsInChunkCache() { + return false; + } + + @Override + public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) { + return getBlock(x, y, z).isSideSolid(this, x, y, z, side); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java new file mode 100644 index 000000000..c18986376 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java @@ -0,0 +1,26 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actors.ISpecialActor; + +public class ActionCreateActor implements IJarAction { + + int id; + ISpecialActor actor; + + public ActionCreateActor(int id, ISpecialActor actor) { + this.id = id; + this.actor = actor; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.put(id, actor); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java new file mode 100644 index 000000000..4035fedb1 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionOffsetBy.java @@ -0,0 +1,42 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +/** + * Static action for moving the scene around + * To move the scene along with another action, create a special actor that moves the scene + * @author hbm + */ +public class ActionOffsetBy implements IJarAction { + + int time; + double motionX; + double motionY; + double motionZ; + + public ActionOffsetBy(double x, double y, double z, int time) { + this.motionX = x / (time + 1); + this.motionY = y / (time + 1); + this.motionZ = z / (time + 1); + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.offsetX += this.motionX; + scene.script.offsetY += this.motionY; + scene.script.offsetZ += this.motionZ; + + if(this.time == 0) { + scene.script.lastOffsetX = scene.script.offsetX; + scene.script.lastOffsetY = scene.script.offsetY; + scene.script.lastOffsetZ = scene.script.offsetZ; + } + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java new file mode 100644 index 000000000..62e94b615 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java @@ -0,0 +1,23 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionRemoveActor implements IJarAction { + + int id; + + public ActionRemoveActor(int id) { + this.id = id; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.remove(id); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java b/src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java new file mode 100644 index 000000000..99277ef6d --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionRotateBy.java @@ -0,0 +1,33 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +/** + * Static action for rotating the scene around + * To rotate the scene along with another action, create a special actor that rotates the scene + * @author hbm + */ +public class ActionRotateBy implements IJarAction { + + int time; + double velYaw; + double velPitch; + + public ActionRotateBy(double yaw, double pitch, int time) { + this.velYaw = yaw / (time + 1); + this.velPitch = pitch / (time + 1); + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.rotationPitch += this.velPitch; + scene.script.rotationYaw += this.velYaw; + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java new file mode 100644 index 000000000..fdab377b9 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActionSetActorData implements IJarAction { + + int id; + NBTTagCompound data; + + public ActionSetActorData(int id, NBTTagCompound data) { + this.id = id; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setActorData((NBTTagCompound) data.copy()); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java new file mode 100644 index 000000000..8291c3c88 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetBlock.java @@ -0,0 +1,41 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.block.Block; + +/** + * Simple action that places one block instantly with no delay + * @author hmb + */ +public class ActionSetBlock implements IJarAction { + + int x; + int y; + int z; + Block b; + int meta; + + public ActionSetBlock(int x, int y, int z, Block b) { + this(x, y, z, b, 0); + } + + public ActionSetBlock(int x, int y, int z, Block b, int meta) { + this.x = x; + this.y = y; + this.z = z; + this.b = b; + this.meta = meta; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + world.setBlock(x, y, z, b, meta); + } + + @Override + public int getDuration() { + return 0; + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java b/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java new file mode 100644 index 000000000..3317557dc --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetTile.java @@ -0,0 +1,31 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.tileentity.TileEntity; + +public class ActionSetTile implements IJarAction { + + int x; + int y; + int z; + TileEntity tile; + + public ActionSetTile(int x, int y, int z, TileEntity tile) { + this.x = x; + this.y = y; + this.z = z; + this.tile = tile; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + world.setTileEntity(x, y, z, tile); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java b/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java new file mode 100644 index 000000000..23e093a49 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetZoom.java @@ -0,0 +1,30 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionSetZoom implements IJarAction { + + int time; + double zoom; + + public ActionSetZoom(double zoom, int time) { + this.zoom = zoom / (time + 1); + this.time = time; + } + + @Override + public int getDuration() { + return this.time; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + + if(this.getDuration() == 0) { + scene.script.lastZoom = scene.script.zoom = this.zoom; + } else { + scene.script.zoom += this.zoom; + } + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java new file mode 100644 index 000000000..6c28be0f2 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionUpdateActor implements IJarAction { + + int id; + String key; + Object data; + + public ActionUpdateActor(int id, String key, Object data) { + this.id = id; + this.key = key; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setDataPoint(key, data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionWait.java b/src/main/java/com/hbm/wiaj/actions/ActionWait.java new file mode 100644 index 000000000..4ed64fec0 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionWait.java @@ -0,0 +1,21 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionWait implements IJarAction { + + private int ticks; + + public ActionWait(int ticks) { + this.ticks = ticks; + } + + @Override + public int getDuration() { + return this.ticks; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { } +} diff --git a/src/main/java/com/hbm/wiaj/actions/IJarAction.java b/src/main/java/com/hbm/wiaj/actions/IJarAction.java new file mode 100644 index 000000000..5250d248b --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/IJarAction.java @@ -0,0 +1,12 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public interface IJarAction { + + /** Time taken by this action in ticks */ + public int getDuration(); + /** Perform this action */ + public void act(WorldInAJar world, JarScene scene); +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorBase.java b/src/main/java/com/hbm/wiaj/actors/ActorBase.java new file mode 100644 index 000000000..be65923cf --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorBase.java @@ -0,0 +1,28 @@ +package com.hbm.wiaj.actors; + +import net.minecraft.nbt.NBTTagCompound; + +/** + * Very basic actor base class that holds NBT, not very useful on its own + * @author hbm + */ +public abstract class ActorBase implements ISpecialActor { + + protected NBTTagCompound data = new NBTTagCompound(); + + @Override + public void setActorData(NBTTagCompound data) { + this.data = data; + } + + @Override + public void setDataPoint(String tag, Object o) { + if(o instanceof String) this.data.setString(tag, (String) o); + if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); + if(o instanceof Float) this.data.setFloat(tag, (Float) o); + if(o instanceof Double) this.data.setDouble(tag, (Double) o); + if(o instanceof Boolean) this.data.setBoolean(tag, (Boolean) o); + if(o instanceof Byte) this.data.setByte(tag, (Byte) o); + if(o instanceof Short) this.data.setShort(tag, (Short) o); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java new file mode 100644 index 000000000..55290e0bd --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java @@ -0,0 +1,201 @@ +package com.hbm.wiaj.actors; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ActorBasicPanel implements ISpecialActor { + + int x; + int y; + List lines; + + public ActorBasicPanel(int x, int y, Object[]... objects) { + this.x = x; + this.y = y; + this.lines = new ArrayList(); + + for(Object[] o : objects) { + this.lines.add(o); + } + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { + drawStackText(lines, x, y, Minecraft.getMinecraft().fontRenderer, RenderItem.getInstance(), w, h); + } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { } + + @Override + public void updateActor(JarScene scene) { } + + @Override + public void setActorData(NBTTagCompound data) { } + + @Override + public void setDataPoint(String tag, Object o) { } + + protected void drawStackText(List lines, int x, int y, FontRenderer font, RenderItem itemRender, int w, int h) { + + x += w / 2; + y += h / 2; + + if(!lines.isEmpty()) { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int height = 0; + int longestline = 0; + Iterator iterator = lines.iterator(); + + while(iterator.hasNext()) { + Object[] line = (Object[]) iterator.next(); + int lineWidth = 0; + + boolean hasStack = false; + + for(Object o : line) { + + if(o instanceof String) { + lineWidth += font.getStringWidth((String) o); + } else { + lineWidth += 18; + hasStack = true; + } + } + + if(hasStack) { + height += 18; + } else { + height += 10; + } + + if(lineWidth > longestline) { + longestline = lineWidth; + } + } + + int minX = x + 12; + int minY = y - 12; + + if(minX + longestline > w) { + minX -= 28 + longestline; + } + + if(minY + height + 6 > h) { + minY = h - height - 6; + } + + itemRender.zLevel = 300.0F; + //int j1 = -267386864; + int colorBg = 0xF0100010; + this.drawGradientRect(minX - 3, minY - 4, minX + longestline + 3, minY - 3, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY + height + 3, minX + longestline + 3, minY + height + 4, colorBg, colorBg); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX - 4, minY - 3, minX - 3, minY + height + 3, colorBg, colorBg); + this.drawGradientRect(minX + longestline + 3, minY - 3, minX + longestline + 4, minY + height + 3, colorBg, colorBg); + //int k1 = 1347420415; + int color0 = 0x505000FF; + //int l1 = (k1 & 16711422) >> 1 | k1 & -16777216; + int color1 = (color0 & 0xFEFEFE) >> 1 | color0 & 0xFF000000; + this.drawGradientRect(minX - 3, minY - 3 + 1, minX - 3 + 1, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX + longestline + 2, minY - 3 + 1, minX + longestline + 3, minY + height + 3 - 1, color0, color1); + this.drawGradientRect(minX - 3, minY - 3, minX + longestline + 3, minY - 3 + 1, color0, color0); + this.drawGradientRect(minX - 3, minY + height + 2, minX + longestline + 3, minY + height + 3, color1, color1); + + for(int index = 0; index < lines.size(); ++index) { + + Object[] line = (Object[]) lines.get(index); + int indent = 0; + boolean hasStack = false; + + for(Object o : line) { + if(!(o instanceof String)) { + hasStack = true; + } + } + + for(Object o : line) { + + if(o instanceof String) { + font.drawStringWithShadow((String) o, minX + indent, minY + (hasStack ? 4 : 0), -1); + indent += font.getStringWidth((String) o) + 2; + } else { + ItemStack stack = (ItemStack) o; + GL11.glColor3f(1F, 1F, 1F); + + if(stack.stackSize == 0) { + this.drawGradientRect(minX + indent - 1, minY - 1, minX + indent + 17, minY + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, minX + indent, minY); + itemRender.renderItemOverlayIntoGUI(font, Minecraft.getMinecraft().getTextureManager(), stack, minX + indent, minY, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + indent += 18; + } + } + + if(index == 0) { + minY += 2; + } + + minY += hasStack ? 18 : 10; + } + + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + } + + protected void drawGradientRect(int p_73733_1_, int p_73733_2_, int p_73733_3_, int p_73733_4_, int p_73733_5_, int p_73733_6_) { + float zLevel = 300.0F; + float f = (float) (p_73733_5_ >> 24 & 255) / 255.0F; + float f1 = (float) (p_73733_5_ >> 16 & 255) / 255.0F; + float f2 = (float) (p_73733_5_ >> 8 & 255) / 255.0F; + float f3 = (float) (p_73733_5_ & 255) / 255.0F; + float f4 = (float) (p_73733_6_ >> 24 & 255) / 255.0F; + float f5 = (float) (p_73733_6_ >> 16 & 255) / 255.0F; + float f6 = (float) (p_73733_6_ >> 8 & 255) / 255.0F; + float f7 = (float) (p_73733_6_ & 255) / 255.0F; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(f1, f2, f3, f); + tessellator.addVertex((double) p_73733_3_, (double) p_73733_2_, (double) zLevel); + tessellator.addVertex((double) p_73733_1_, (double) p_73733_2_, (double) zLevel); + tessellator.setColorRGBA_F(f5, f6, f7, f4); + tessellator.addVertex((double) p_73733_1_, (double) p_73733_4_, (double) zLevel); + tessellator.addVertex((double) p_73733_3_, (double) p_73733_4_, (double) zLevel); + tessellator.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java new file mode 100644 index 000000000..c1b4de34f --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java @@ -0,0 +1,414 @@ +package com.hbm.wiaj.actors; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import com.hbm.lib.RefStrings; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public class ActorFancyPanel implements ISpecialActor { + + static final ResourceLocation guiUtil = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_utility.png"); + + List lines = new ArrayList(); + RenderItem itemRender = new RenderItem(); + TextureManager texman = Minecraft.getMinecraft().getTextureManager(); + FontRenderer font; + + int x; + int y; + + boolean consistentHeight = false; + int lineDist = 2; + int tallestElement = 0; + static final int STACK_HEIGHT = 18; + + Orientation o = Orientation.CENTER; + int colorBrighter = 0xFFCCCCCC; + int colorDarker = 0xFF7D7D7D; + int colorFrame = 0xFFA0A0A0; + int colorBg = 0xFF302E36; + + public ActorFancyPanel(FontRenderer font, int x, int y, Object[][] raw, int autowrap) { + + this.font = font; + this.x = x; + this.y = y; + + if(autowrap <= 0) { //if autowrap is off, just add the lines 1:1 + for(Object[] o : raw) { + lines.add(o); + } + } else { + + for(Object[] line : raw) { + + if(line.length == 1 && line[0] instanceof String) { //auto wrap can only apply to text-only lines + List frags = I18nUtil.autoBreak(font, (String)line[0], autowrap); + for(String s : frags) { + lines.add(new Object[] { s }); + } + } else { + lines.add(line); + } + } + } + } + + public ActorFancyPanel enforceConsistentHeight() { + this.consistentHeight = true; + return this; + } + + public ActorFancyPanel setLineDist(int dist) { + this.lineDist = dist; + return this; + } + + public ActorFancyPanel setOrientation(Orientation o) { + this.o = o; + return this; + } + + public ActorFancyPanel setColors(int brighter, int frame, int darker, int background) { + this.colorBrighter = brighter; + this.colorFrame = frame; + this.colorDarker = darker; + this.colorBg = background; + return this; + } + + public ActorFancyPanel setColors(int[] colors) { + return setColors(colors[0], colors[1], colors[2], colors[3]); + } + + public int getTallestElement() { + if(this.tallestElement > 0) { + return this.tallestElement; + } + + for(Object[] line : this.lines) { + for(Object element : line) { + + int height = getElementHeight(element); + + if(height > this.tallestElement) { + this.tallestElement = height; + } + } + } + + return this.tallestElement; + } + + public int getElementHeight(Object element) { + + if(element instanceof String) { + return this.font.FONT_HEIGHT; + } + + if(element instanceof ItemStack) { + return STACK_HEIGHT; + } + + if(element instanceof Object[]) { + Object[] scaledStack = (Object[]) element; //[0] ItemStack, [1] double + return (int) Math.ceil(STACK_HEIGHT * (double) scaledStack[1]); + } + + return 0; + } + + public int getElementWidth(Object element) { + + if(element instanceof String) { + return this.font.getStringWidth((String) element); + } + + if(element instanceof ItemStack) { + return STACK_HEIGHT; + } + + if(element instanceof Object[]) { + Object[] scaledStack = (Object[]) element; //[0] ItemStack, [1] double + return (int) Math.ceil(STACK_HEIGHT * (double) scaledStack[1]); + } + + return 0; + } + + int blockHeight = 0; + private int getBlockHeight() { + + if(this.blockHeight > 0) { + return this.blockHeight; + } + + for(Object[] line : this.lines) { + + if(this.blockHeight > 0) { + this.blockHeight += this.lineDist; + } + + int lineHeight = this.font.FONT_HEIGHT; + + if(this.consistentHeight) { + lineHeight = Math.max(lineHeight, getTallestElement()); + } else { + + for(Object o : line) { + lineHeight = Math.max(lineHeight, getElementHeight(o)); + } + } + + this.blockHeight += lineHeight; + } + + return this.blockHeight; + } + + int blockWidth = 0; + private int getBlockWidth() { + + if(this.blockWidth > 0) { + return this.blockWidth; + } + + for(Object[] line : this.lines) { + + int lineWidth = 0; + + for(Object o : line) { + + if(lineWidth > 0) { + lineWidth += 2; + } + + lineWidth += getElementWidth(o); + } + + if(lineWidth > this.blockWidth) { + this.blockWidth = lineWidth; + } + } + + return this.blockWidth; + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { + + int height = this.getBlockHeight(); + int width = this.getBlockWidth(); + + int posX = w / 2 + x; + int posY = h / 2 + y; + + switch(o) { + case TOP: + posX -= width / 2; + posY += 15; + break; + case BOTTOM: + posX -= width / 2; + posY -= height + 15; + break; + case LEFT: + posX += 15; + posY -= height / 2; + break; + case RIGHT: + posX -= width + 15; + posY -= height / 2; + break; + case CENTER: + posX -= width / 2; + posY -= height / 2; + break; + } + + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + this.drawRect(posX - 5, posY - 5, posX + width + 5, posY + height + 5, colorFrame); + + this.drawRect(posX - 5, posY - 5, posX - 4, posY + height + 4, colorBrighter); + this.drawRect(posX - 5, posY - 5, posX + width + 4, posY - 4, colorBrighter); + this.drawRect(posX + width + 2, posY - 2, posX + width + 3, posY + height + 3, colorBrighter); + this.drawRect(posX - 2, posY + height + 2, posX + width + 3, posY + height + 3, colorBrighter); + + this.drawRect(posX - 3, posY - 3, posX - 2, posY + height + 2, colorDarker); + this.drawRect(posX - 3, posY - 3, posX + width + 2, posY - 2, colorDarker); + this.drawRect(posX + width + 4, posY - 4, posX + width + 5, posY + height + 5, colorDarker); + this.drawRect(posX - 4, posY + height + 4, posX + width + 5, posY + height + 5, colorDarker); + + this.drawRect(posX - 2, posY - 2, posX + width + 2, posY + height + 2, colorBg); + + Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); + + switch(o) { + case TOP: + this.drawArrow(posX + width / 2 - 7, posY - 15, 40, 14, 14, 10); + break; + case BOTTOM: + this.drawArrow(posX + width / 2 - 7, posY + height + 5, 54, 14, 14, 10); + break; + case LEFT: + this.drawArrow(posX - 15, posY + height / 2 - 7, 40, 0, 10, 14); + break; + case RIGHT: + this.drawArrow(posX + width + 5, posY + height / 2 - 7, 50, 0, 10, 14); + break; + case CENTER: break; + } + + int offsetY = 0; + + for(Object[] line : this.lines) { + + if(offsetY > 0) offsetY+= this.lineDist; + int lineHeight = 0; + for(Object element : line) lineHeight = Math.max(lineHeight, this.getElementHeight(element)); + + int indent = 0; + for(Object element : line) { + + if(indent > 0) { + indent += 2; + } + + drawElement(posX + indent, posY + offsetY + lineHeight / 2, element); + indent += getElementWidth(element); + } + + offsetY += lineHeight; + } + + itemRender.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + + private void drawArrow(int posX, int posY, int sourceX, int sourceY, int sizeX, int sizeY) { + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 0, sourceY, sizeX, sizeY, this.colorBrighter); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 1, sourceY, sizeX, sizeY, this.colorFrame); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 2, sourceY, sizeX, sizeY, this.colorDarker); + this.drawTexturedModalRect(posX, posY, sourceX + 28 * 3, sourceY, sizeX, sizeY, this.colorBg); + } + + private void drawElement(int x, int y, Object element) { + + if(element instanceof String) { + String text = (String) element; + this.font.drawString(text, x, y - this.font.FONT_HEIGHT / 2, 0xffffff); + + } else if(element instanceof ItemStack) { + + ItemStack stack = (ItemStack) element; + GL11.glColor3f(1F, 1F, 1F); + + if(stack.stackSize == 0) { + this.drawGradientRect(x - 1, y - 1 - 8, x + 17, y + 17, 0xffff0000, 0xffff0000); + this.drawGradientRect(x, y - 8, x + 16, y + 16, 0xffb0b0b0, 0xffb0b0b0); + } + itemRender.renderItemAndEffectIntoGUI(this.font, texman, stack, x, y - 8); + itemRender.renderItemOverlayIntoGUI(this.font, texman, stack, x, y - 8, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + } //TODO: scaled stacks + } + + @Override public void drawBackgroundComponent(int ticks, float interp) { } + @Override public void updateActor(JarScene scene) { } + @Override public void setActorData(NBTTagCompound data) { } + @Override public void setDataPoint(String tag, Object o) { } + + protected void drawRect(int minX, int minY, int maxX, int maxY, int color) { + drawGradientRect(minX, minY, maxX, maxY, color, color); + } + + protected void drawGradientRect(int minX, int minY, int maxX, int maxY, int color1, int color2) { + + double zLevel = 300D; + float a1 = (float) (color1 >> 24 & 255) / 255.0F; + float r1 = (float) (color1 >> 16 & 255) / 255.0F; + float g1 = (float) (color1 >> 8 & 255) / 255.0F; + float b1 = (float) (color1 & 255) / 255.0F; + float a2 = (float) (color2 >> 24 & 255) / 255.0F; + float r2 = (float) (color2 >> 16 & 255) / 255.0F; + float g2 = (float) (color2 >> 8 & 255) / 255.0F; + float b2 = (float) (color2 & 255) / 255.0F; + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_SMOOTH); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(r1, g1, b1, a1); + tessellator.addVertex((double) maxX, (double) minY, (double) zLevel); + tessellator.addVertex((double) minX, (double) minY, (double) zLevel); + tessellator.setColorRGBA_F(r2, g2, b2, a2); + tessellator.addVertex((double) minX, (double) maxY, (double) zLevel); + tessellator.addVertex((double) maxX, (double) maxY, (double) zLevel); + tessellator.draw(); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + public void drawTexturedModalRect(int posX, int posY, int u, int v, int sizeX, int sizeY) { + drawTexturedModalRect(posX, posY, u, v, sizeX, sizeY, 0xffffff); + } + + public void drawTexturedModalRect(int posX, int posY, int u, int v, int sizeX, int sizeY, int color) { + double zLevel = 300D; + float a = (float) (color >> 24 & 255) / 255.0F; + float r = (float) (color >> 16 & 255) / 255.0F; + float g = (float) (color >> 8 & 255) / 255.0F; + float b = (float) (color & 255) / 255.0F; + float f = 0.00390625F; + float f1 = 0.00390625F; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.setColorRGBA_F(r, g, b, a); + tessellator.addVertexWithUV(posX + 0, posY + sizeY, zLevel, (u + 0) * f, (v + sizeY) * f1); + tessellator.addVertexWithUV(posX + sizeX, posY + sizeY, zLevel, (u + sizeX) * f, (v + sizeY) * f1); + tessellator.addVertexWithUV(posX + sizeX, posY + 0, zLevel, (u + sizeX) * f, (v + 0) * f1); + tessellator.addVertexWithUV(posX + 0, posY + 0, zLevel, (u + 0) * f, (v + 0) * f); + tessellator.draw(); + } + + /** where the arrow should be or if the box should be centered around the home position */ + public static enum Orientation { + TOP, + BOTTOM, + LEFT, + RIGHT, + CENTER + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java new file mode 100644 index 000000000..50a1f1650 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -0,0 +1,32 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActorTileEntity extends ActorBase { + + ITileActorRenderer renderer; + + public ActorTileEntity(ITileActorRenderer renderer) { + this.renderer = renderer; + } + + public ActorTileEntity(ITileActorRenderer renderer, NBTTagCompound data) { + this(renderer); + this.data = data; + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { + renderer.renderActor(ticks, interp, data); + } + + @Override + public void updateActor(JarScene scene) { + renderer.updateActor(scene.script.ticksElapsed, data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java new file mode 100644 index 000000000..2d4b02bed --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java @@ -0,0 +1,52 @@ +package com.hbm.wiaj.actors; + +import org.lwjgl.opengl.GL11; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.nbt.NBTTagCompound; + +public class ActorVillager implements ISpecialActor { + + EntityVillager villager = new EntityVillager(Minecraft.getMinecraft().theWorld); + NBTTagCompound data = new NBTTagCompound(); + + public ActorVillager() { } + + public ActorVillager(NBTTagCompound data) { + this.data = data; + } + + @Override + public void drawForegroundComponent(int w, int h, int ticks, float interp) { } + + @Override + public void drawBackgroundComponent(int ticks, float interp) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + double yaw = data.getDouble("yaw"); + GL11.glTranslated(x, y, z); + GL11.glRotated(yaw, 0, 1, 0); + RenderManager.instance.renderEntityWithPosYaw(villager, 0D, 0D, 0D, 0F, interp); + } + + @Override + public void updateActor(JarScene scene) { + villager.limbSwingAmount += (1F - villager.limbSwingAmount) * 0.4F; + villager.limbSwing += villager.limbSwingAmount; + } + + @Override + public void setActorData(NBTTagCompound data) { + + } + + @Override + public void setDataPoint(String tag, Object o) { + + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java new file mode 100644 index 000000000..a70be8389 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -0,0 +1,24 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.nbt.NBTTagCompound; + +/** + * Actors, anything that can receive ticks (for rendering movement for example) and renders on screen + * Can be tile entity models, faux entities or tooltips + * @author hbm + */ +public interface ISpecialActor { + + /** Draws things in the foreground like text boxes */ + public void drawForegroundComponent(int w, int h, int ticks, float interp); + /** Draws things in the background, fotted to the world renderer like TESRs */ + public void drawBackgroundComponent(int ticks, float interp); + /** Update ticks to emulate serverside ticking */ + public void updateActor(JarScene scene); + /** Sets the data object to the passed NBT */ + public void setActorData(NBTTagCompound data); + /** Auto-detects the passed object's type and sets the specified NBT tag */ + public void setDataPoint(String tag, Object o); +} diff --git a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java new file mode 100644 index 000000000..5c98d5b90 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -0,0 +1,15 @@ +package com.hbm.wiaj.actors; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public interface ITileActorRenderer { + + public void renderActor(int ticks, float interp, NBTTagCompound data); + public void updateActor(int ticks, NBTTagCompound data); + + public static void bindTexture(ResourceLocation tex) { + Minecraft.getMinecraft().getTextureManager().bindTexture(tex); + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java new file mode 100644 index 000000000..c94397274 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java @@ -0,0 +1,18 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.wiaj.JarScript; + +import net.minecraft.item.ItemStack; + +public abstract class CanneryBase { + + public static final int[] colorCopper = new int[] {0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xFF1A1F22}; + public static final int[] colorGold = new int[] {0xFFFFFDE0, 0xFFFAD64A, 0xFFDC9613, 0xFF1A1F22}; + public static final int[] colorBlue = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; + public static final int[] colorGrey = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; + + public abstract ItemStack getIcon(); + public abstract String getName(); + public abstract JarScript createScript(); + public CanneryBase[] seeAlso() { return new CanneryBase[0]; } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java new file mode 100644 index 000000000..fe8cde550 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -0,0 +1,174 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryCentrifuge extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_gascent); + } + + @Override + public String getName() { + return "cannery.centrifuge"; + } + + public JarScript createScript() { + WorldInAJar world = new WorldInAJar(9, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(2, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + + if(x == 7) { + scene0.add(new ActionSetTile(7, 1, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetBlock(7, 1, 2, ModBlocks.barrel_tcalloy)); + } + + if(x == 6) { + TileEntityPipeBaseNT duct = new TileEntityPipeBaseNT(); + duct.setType(Fluids.UF6); + scene0.add(new ActionSetTile(6, 1, 2, duct)); + scene0.add(new ActionSetBlock(6, 1, 2, ModBlocks.fluid_duct_neo, 0)); + } + + if(x == 5) { + scene0.add(new ActionSetTile(5, 1, 2, new Dummies.JarDummyConnector())); + NBTTagCompound cent = new NBTTagCompound(); + cent.setDouble("x", 5); + cent.setDouble("y", 1); + cent.setDouble("z", 2); + cent.setInteger("rotation", 2); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorGasCent(), cent))); + } + + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, -50, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.0")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -15, 10, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.1")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(1)); + + scene1.add(new ActionSetZoom(4, 20)); + + scene1.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.2")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(1)); + scene1.add(new ActionSetZoom(-2, 20)); + scene1.add(new ActionWait(20)); + + NBTTagCompound c2 = new NBTTagCompound(); c2.setDouble("x", 4); c2.setDouble("y", 1); c2.setDouble("z", 2); c2.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new ActorGasCent(), c2))); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.3")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(100)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionSetZoom(-2, 20)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.4")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + + NBTTagCompound c3 = new NBTTagCompound(); c3.setDouble("x", 3); c3.setDouble("y", 1); c3.setDouble("z", 2); c3.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(2, new ActorTileEntity(new ActorGasCent(), c3))); + scene1.add(new ActionWait(10)); + NBTTagCompound c4 = new NBTTagCompound(); c4.setDouble("x", 2); c4.setDouble("y", 1); c4.setDouble("z", 2); c4.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(3, new ActorTileEntity(new ActorGasCent(), c4))); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.centrifuge.5")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.CENTER))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(4)); + + scene1.add(new ActionCreateActor(4, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 28, -30, new Object[][] {{new ItemStack(ModItems.upgrade_gc_speed)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionCreateActor(5, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 45, 35, new Object[][] {{" = ", new ItemStack(ModItems.nugget_u238, 11), new ItemStack(ModItems.nugget_u235)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorGasCent implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.gascent_tex); + ResourceManager.gascent.renderPart("Centrifuge"); + ResourceManager.gascent.renderPart("Flag"); + + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java new file mode 100644 index 000000000..dcd1e22ee --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFEnSU.java @@ -0,0 +1,104 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.blocks.ModBlocks; +import com.hbm.render.tileentity.RenderFENSU; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionOffsetBy; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionRotateBy; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryFEnSU extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_fensu); + } + + @Override + public String getName() { + return "cannery.fensu"; + } + + public JarScript createScript() { + WorldInAJar world = new WorldInAJar(11, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + scene0.add(new ActionSetZoom(1.5D, 0)); + scene0.add(new ActionOffsetBy(-2D, 0D, 0D, 0)); + NBTTagCompound fensu = new NBTTagCompound(); + fensu.setDouble("x", 7); + fensu.setDouble("y", 1); + fensu.setDouble("z", 2); + fensu.setInteger("rotation", 4); + fensu.setFloat("speed", 10F); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new RenderFENSU(), fensu))); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -50, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.0")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionWait(80)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRotateBy(45, 90, 20)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.1")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.TOP))); + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 20, new Object[][] {{I18nUtil.resolveKey("cannery.fensu.2")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.TOP))); + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + + scene0.add(new ActionSetBlock(7, 0, 2, ModBlocks.red_wire_coated)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 2)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRotateBy(0, -60, 20)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 10)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionSetBlock(6, 0, 2, Blocks.lever, 2)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionRotateBy(-45, -30, 20)); + scene0.add(new ActionOffsetBy(2D, 0D, 0D, 10)); + /// END OF SCENE 1 /// + + JarScene scene1 = new JarScene(script); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + if(z == 2 && x > 0 && x < 10) + scene1.add(new ActionSetBlock(x, 0, z, ModBlocks.red_wire_coated)); + else + scene1.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene1.add(new ActionWait(2)); + } + + scene1.add(new ActionWait(18)); + scene1.add(new ActionSetBlock(1, 1, 2, ModBlocks.machine_detector)); + scene1.add(new ActionWait(10)); + scene1.add(new ActionSetBlock(1, 1, 2, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(60)); + + script.addScene(scene0).addScene(scene1); + return script; + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java new file mode 100644 index 000000000..3429c3404 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java @@ -0,0 +1,226 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.render.tileentity.RenderStirling; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; + +public class CanneryFirebox extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.heater_firebox); + } + + @Override + public String getName() { + return "cannery.firebox"; + } + + public JarScript createScript() { + + WorldInAJar world = new WorldInAJar(5, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionWait(8)); + + NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFirebox(), firebox))); + + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.0")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.1")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(5)); + scene0.add(new ActionUpdateActor(0, "open", true)); + scene0.add(new ActionWait(30)); + + scene0.add(new ActionUpdateActor(0, "isOn", true)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.coke)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.rocket_fuel)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(ModItems.solid_fuel_bf)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(10)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionUpdateActor(0, "open", false)); + scene0.add(new ActionWait(30)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.2")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(80)); + + scene0.add(new ActionCreateActor(1, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -10, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.3")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(1)); + scene0.add(new ActionWait(10)); + + JarScene scene1 = new JarScene(script); + + NBTTagCompound stirling = new NBTTagCompound(); + stirling.setDouble("x", 2); + stirling.setDouble("y", 2); + stirling.setDouble("z", 2); + stirling.setInteger("rotation", 2); + stirling.setBoolean("hasCog", true); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new RenderStirling(), stirling))); + scene1.add(new ActionUpdateActor(1, "speed", 0F)); + + scene1.add(new ActionWait(10)); + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.firebox.4")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionWait(10)); + + for(int i = 0; i < 60; i++) { + scene1.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionSetTile(1, 2, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 2, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 1, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 1, 3, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(0, 2, 2, ModBlocks.red_cable)); + scene1.add(new ActionSetBlock(0, 1, 2, ModBlocks.red_cable)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + scene1.add(new ActionWait(10)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(100)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorFirebox implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + boolean isOn = data.getBoolean("isOn"); + float doorAngle = data.getFloat("angle"); + float prevDoorAngle = data.getFloat("lastAngle"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.heater_firebox_tex); + ResourceManager.heater_firebox.renderPart("Main"); + + GL11.glPushMatrix(); + + float door = prevDoorAngle + (doorAngle - prevDoorAngle) * interp; + GL11.glTranslated(1.375, 0, 0.375); + GL11.glRotatef(door, 0F, -1F, 0F); + GL11.glTranslated(-1.375, 0, -0.375); + ResourceManager.heater_firebox.renderPart("Door"); + GL11.glPopMatrix(); + + if(isOn) { + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + ResourceManager.heater_firebox.renderPart("InnerBurning"); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } else { + ResourceManager.heater_firebox.renderPart("InnerEmpty"); + } + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + boolean open = data.getBoolean("open"); + float doorAngle = data.getFloat("angle"); + data.setFloat("lastAngle", doorAngle); + + float swingSpeed = (doorAngle / 10F) + 3; + + if(open) { + doorAngle += swingSpeed; + } else { + doorAngle -= swingSpeed; + } + + doorAngle = MathHelper.clamp_float(doorAngle, 0F, 135F); + data.setFloat("angle", doorAngle); + } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java new file mode 100644 index 000000000..5fbb1481b --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java @@ -0,0 +1,310 @@ +package com.hbm.wiaj.cannery; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; +import com.hbm.main.ResourceManager; +import com.hbm.render.util.BeamPronter; +import com.hbm.render.util.BeamPronter.EnumBeamType; +import com.hbm.render.util.BeamPronter.EnumWaveType; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; + +public class CannerySILEX extends CanneryBase{ + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_silex); + } + + @Override + public String getName() { + return "cannery.silex"; + } + + public JarScript createScript() { + WorldInAJar world = new WorldInAJar(17, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(2, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + + scene0.add(new ActionWait(1)); + } + + scene0.add(new ActionWait(9)); + + NBTTagCompound fel = new NBTTagCompound(); + fel.setDouble("x", 11D); + fel.setDouble("y", 1D); + fel.setDouble("z", 2D); + fel.setInteger("rotation", 5); + fel.setInteger("length", 11); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFEL(), fel))); + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 15, -5, new Object[][] {{I18nUtil.resolveKey("cannery.silex.0")}}, 100) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + scene0.add(new ActionWait(80)); + scene0.add(new ActionRemoveActor(3)); + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_co2)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 1)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_bismuth)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 2)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_cmb)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 3)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_dnt)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 4)); + scene0.add(new ActionWait(20)); + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{new ItemStack(ModItems.laser_crystal_digamma)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 5)); + scene0.add(new ActionWait(20)); + + scene0.add(new ActionRemoveActor(3)); + scene0.add(new ActionUpdateActor(0, "mode", 0)); + scene0.add(new ActionWait(20)); + + for(int y = 1; y < 4; y++) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, Blocks.stone)); + } + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.1")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionUpdateActor(0, "mode", 3)); + scene0.add(new ActionUpdateActor(0, "length", 4)); + + scene0.add(new ActionWait(40)); + scene0.add(new ActionUpdateActor(0, "length", 11)); + scene0.add(new ActionSetBlock(5, 2, 2, Blocks.fire)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(5, 2, 2, Blocks.air)); + scene0.add(new ActionWait(40)); + + for(int y = 1; y < 4; y++) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, ModBlocks.brick_concrete)); + } + + if(y == 2) { + scene0.add(new ActionUpdateActor(0, "length", 4)); + } + + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.2")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene0.add(new ActionWait(40)); + scene0.add(new ActionRemoveActor(3)); + + for(int y = 3; y > 0; y--) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(5, y, z, Blocks.air)); + } + + if(y == 2) { + scene0.add(new ActionUpdateActor(0, "length", 11)); + } + + scene0.add(new ActionWait(5)); + } + + scene0.add(new ActionUpdateActor(0, "mode", 0)); + + JarScene scene1 = new JarScene(script); + + NBTTagCompound silex0 = new NBTTagCompound(); + silex0.setDouble("x", 5D); + silex0.setDouble("y", 1D); + silex0.setDouble("z", 2D); + silex0.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(1, new ActorTileEntity(new ActorSILEX(), silex0))); + + scene1.add(new ActionWait(20)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.3")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(80)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 60, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.4")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + + scene1.add(new ActionWait(60)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 12, 32, new Object[][] {{I18nUtil.resolveKey("cannery.silex.5")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(3)); + scene1.add(new ActionWait(10)); + + TileEntityPipeBaseNT duct = new TileEntityPipeBaseNT(); + duct.setType(Fluids.ACID); + scene1.add(new ActionSetTile(5, 2, 0, duct)); + scene1.add(new ActionSetTile(5, 1, 0, duct)); + scene1.add(new ActionSetTile(6, 1, 0, duct)); + scene1.add(new ActionSetTile(7, 1, 0, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(5, 2, 1, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(5, 2, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(5, 1, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(6, 1, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetBlock(7, 1, 0, ModBlocks.barrel_tcalloy)); + + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(0, "mode", 3)); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.6")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(80)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, -18, new Object[][] {{I18nUtil.resolveKey("cannery.silex.7")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(60)); + + scene1.add(new ActionCreateActor(3, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -7, -15, new Object[][] {{I18nUtil.resolveKey("cannery.silex.8")}}, 150) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(3)); + scene1.add(new ActionWait(10)); + + NBTTagCompound silex1 = new NBTTagCompound(); + silex1.setDouble("x", 1D); + silex1.setDouble("y", 1D); + silex1.setDouble("z", 2D); + silex1.setInteger("rotation", 2); + scene1.add(new ActionCreateActor(2, new ActorTileEntity(new ActorSILEX(), silex1))); + scene1.add(new ActionWait(10)); + + for(int i = 1; i < 5; i++) { + scene1.add(new ActionSetTile(i, 1, 0, duct)); + scene1.add(new ActionSetBlock(i, 1, 0, ModBlocks.fluid_duct_neo)); + } + scene1.add(new ActionSetTile(1, 2, 0, duct)); + scene1.add(new ActionSetBlock(1, 2, 0, ModBlocks.fluid_duct_neo)); + scene1.add(new ActionSetTile(1, 2, 1, new Dummies.JarDummyConnector())); + + scene1.add(new ActionWait(20)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorFEL implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + int mode = data.getInteger("mode"); + int length = data.getInteger("length"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.fel_tex); + ResourceManager.fel.renderAll(); + + GL11.glTranslated(0, 1.5, -1.5); + if(mode > 0 && mode < 6) { + EnumWavelengths wave = EnumWavelengths.values()[mode]; + int color = wave.guiColor; + if(color == 0) + color = Color.HSBtoRGB(Minecraft.getMinecraft().theWorld.getTotalWorldTime() / 50.0F, 0.5F, 0.1F) & 16777215; + + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.SPIRAL, EnumBeamType.SOLID, color, color, 0, 1, 0F, 2, 0.0625F); + BeamPronter.prontBeamwithDepth(Vec3.createVectorHelper(0, 0, -length - 1), EnumWaveType.RANDOM, EnumBeamType.SOLID, color, color, (int)(Minecraft.getMinecraft().theWorld.getTotalWorldTime() % 1000 / 2), (length / 2) + 1, 0.0625F, 2, 0.0625F); + } + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } + + public static class ActorSILEX implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + ITileActorRenderer.bindTexture(ResourceManager.silex_tex); + ResourceManager.silex.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java new file mode 100644 index 000000000..e150b4959 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java @@ -0,0 +1,202 @@ +package com.hbm.wiaj.cannery; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.tileentity.RenderStirling; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ITileActorRenderer; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; +import com.hbm.wiaj.cannery.CanneryFirebox.ActorFirebox; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryStirling extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_stirling); + } + + @Override + public String getName() { + return "cannery.stirling"; + } + public CanneryBase[] seeAlso() { + return new CanneryBase[] { + new CanneryFirebox() + }; + } + + @Override + public JarScript createScript() { + + WorldInAJar world = new WorldInAJar(5, 5, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + scene0.add(new ActionWait(2)); + } + + scene0.add(new ActionWait(8)); + + NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); + scene0.add(new ActionCreateActor(0, new ActorTileEntity(new ActorFirebox(), firebox))); + + scene0.add(new ActionWait(10)); + + NBTTagCompound stirling = new NBTTagCompound(); + stirling.setDouble("x", 2); + stirling.setDouble("z", 2); + stirling.setInteger("rotation", 2); + scene0.add(new ActionCreateActor(1, new ActorTileEntity(new RenderStirling(), stirling))); + /* + * When rewinding, the NBT tag persists. We have to manually set all variable values with UpdateActor. + */ + scene0.add(new ActionUpdateActor(1, "speed", 0F)); + scene0.add(new ActionUpdateActor(1, "y", 2D)); + scene0.add(new ActionUpdateActor(1, "type", 0)); + scene0.add(new ActionUpdateActor(1, "hasCog", true)); + scene0.add(new ActionUpdateActor(1, "spin", 0F)); + scene0.add(new ActionUpdateActor(1, "lastSpin", 0F)); + + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.0")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 40, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.1")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(2)); + scene0.add(new ActionWait(5)); + scene0.add(new ActionUpdateActor(0, "open", true)); + scene0.add(new ActionWait(30)); + scene0.add(new ActionUpdateActor(0, "isOn", true)); + scene0.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 40, new Object[][] {{new ItemStack(Items.coal)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene0.add(new ActionWait(20)); + scene0.add(new ActionRemoveActor(2)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionUpdateActor(0, "open", false)); + scene0.add(new ActionWait(30)); + + for(int i = 0; i < 60; i++) { + scene0.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene0.add(new ActionWait(1)); + } + + scene0.add(new ActionWait(20)); + + scene0.add(new ActionSetTile(1, 2, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 2, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 1, 2, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetTile(0, 1, 3, new Dummies.JarDummyConnector())); + scene0.add(new ActionSetBlock(0, 2, 2, ModBlocks.red_cable)); + scene0.add(new ActionSetBlock(0, 1, 2, ModBlocks.red_cable)); + scene0.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene0.add(new ActionWait(40)); + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.2")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + + NBTTagCompound burner = new NBTTagCompound(); burner.setDouble("x", 2); burner.setDouble("y", 1); burner.setDouble("z", 2); burner.setInteger("rotation", 5); + scene1.add(new ActionCreateActor(0, new ActorTileEntity(new ActorBurner(), burner))); + scene1.add(new ActionUpdateActor(1, "y", 3D)); + scene1.add(new ActionSetTile(1, 2, 2, null)); + scene1.add(new ActionSetTile(1, 3, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetTile(0, 3, 2, new Dummies.JarDummyConnector())); + scene1.add(new ActionSetBlock(0, 3, 2, ModBlocks.red_cable)); + + for(int i = 0; i < 100; i++) { + scene1.add(new ActionUpdateActor(1, "speed", (i + 60) / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(1, "hasCog", false)); + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 0)); + + for(int i = 0; i < 160; i += 10) { + scene1.add(new ActionUpdateActor(1, "speed", (160 - i) / 5F)); + scene1.add(new ActionWait(1)); + } + scene1.add(new ActionUpdateActor(1, "speed", 0F)); + + scene1.add(new ActionWait(20)); + + scene1.add(new ActionCreateActor(2, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -45, new Object[][] {{I18nUtil.resolveKey("cannery.stirling.3")}}, 250) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(2)); + scene1.add(new ActionWait(20)); + scene1.add(new ActionUpdateActor(1, "hasCog", true)); + scene1.add(new ActionUpdateActor(1, "type", 1)); + scene1.add(new ActionWait(20)); + + for(int i = 0; i < 60; i++) { + scene1.add(new ActionUpdateActor(1, "speed", i / 5F)); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionSetBlock(0, 1, 3, ModBlocks.machine_detector, 1)); + scene1.add(new ActionWait(100)); + + script.addScene(scene0).addScene(scene1); + return script; + } + + public static class ActorBurner implements ITileActorRenderer { + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glEnable(GL11.GL_CULL_FACE); + + ITileActorRenderer.bindTexture(ResourceManager.heater_oilburner_tex); + ResourceManager.heater_oilburner.renderAll(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/Dummies.java b/src/main/java/com/hbm/wiaj/cannery/Dummies.java new file mode 100644 index 000000000..adbc22ee6 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/Dummies.java @@ -0,0 +1,20 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.inventory.fluid.FluidType; + +import api.hbm.energy.IEnergyConnector; +import api.hbm.fluid.IFluidConnector; +import net.minecraft.tileentity.TileEntity; + +public class Dummies { + + public static class JarDummyConnector extends TileEntity implements IEnergyConnector, IFluidConnector { + + @Override public boolean isLoaded() { return false; } + @Override public long transferFluid(FluidType type, long fluid) { return 0; } + @Override public long getDemand(FluidType type) { return 0; } + @Override public long transferPower(long power) { return 0; } + @Override public long getPower() { return 0; } + @Override public long getMaxPower() { return 0; } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/Jars.java b/src/main/java/com/hbm/wiaj/cannery/Jars.java new file mode 100644 index 000000000..30907c583 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/Jars.java @@ -0,0 +1,21 @@ +package com.hbm.wiaj.cannery; + +import java.util.HashMap; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; + +public class Jars { + + public static HashMap canneries = new HashMap(); + + static { + canneries.put(new ComparableStack(ModBlocks.heater_firebox), new CanneryFirebox()); + canneries.put(new ComparableStack(ModBlocks.machine_stirling), new CanneryStirling()); + canneries.put(new ComparableStack(ModBlocks.machine_stirling_steel), new CanneryStirling()); + canneries.put(new ComparableStack(ModBlocks.machine_gascent), new CanneryCentrifuge()); + canneries.put(new ComparableStack(ModBlocks.machine_fensu), new CanneryFEnSU()); + canneries.put(new ComparableStack(ModBlocks.machine_fel), new CannerySILEX()); + canneries.put(new ComparableStack(ModBlocks.machine_silex), new CannerySILEX()); + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/package-info.java b/src/main/java/com/hbm/wiaj/cannery/package-info.java new file mode 100644 index 000000000..a3380c776 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/package-info.java @@ -0,0 +1,9 @@ +/** + * @author hbm + */ +package com.hbm.wiaj.cannery; + +/* + * as it turns out, a factory for filling jars is called a "cannery", not a "jarrery", even though they don't necessarily + * fill cans there. well it sure beats calling every damn class a "JarFactory" + */ \ No newline at end of file diff --git a/src/main/java/com/hbm/world/dungeon/Factory.java b/src/main/java/com/hbm/world/dungeon/Factory.java index 970f789fe..f8446778c 100644 --- a/src/main/java/com/hbm/world/dungeon/Factory.java +++ b/src/main/java/com/hbm/world/dungeon/Factory.java @@ -7,7 +7,6 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.lib.HbmChestContents; -import com.hbm.main.MainRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -21,7 +20,6 @@ public class Factory extends WorldGenerator { Block Block1 = ModBlocks.steel_scaffold; Block Block2 = ModBlocks.red_barrel; - Block Block3 = ModBlocks.factory_titanium_core; Block Block4 = ModBlocks.steel_wall; Block Block5 = ModBlocks.reinforced_light; @@ -594,9 +592,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 3, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 4, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 4, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 4, 5, 3); if(world.getBlock(x + 9, y + 0, z + 4) == Blocks.chest) @@ -607,16 +605,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 5, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 5, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 5, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 6, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 6, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 7, Blocks.stonebrick, 0, 3); @@ -630,9 +628,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 9, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 10, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 10, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 10, 5, 3); if(world.getBlock(x + 9, y + 0, z + 10) == Blocks.chest) @@ -643,16 +641,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 11, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 11, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 11, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 12, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 12, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 13, Blocks.stonebrick, 0, 3); @@ -666,9 +664,9 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 15, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 16, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 9, y + 0, z + 16, Blocks.chest, 5, 3); world.setBlockMetadataWithNotify(x + 9, y + 0, z + 16, 5, 3); if(world.getBlock(x + 9, y + 0, z + 16) == Blocks.chest) @@ -679,16 +677,16 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 0, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 17, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 17, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 17, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 17, Blocks.chest, 4, 3); world.setBlock(x + 14, y + 0, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 0, z + 18, Blocks.stonebrick, 0, 3); - world.setBlock(x + 6, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 0, z + 18, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 0, z + 18, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 0, z + 18, Blocks.hopper, 2, 3); world.setBlock(x + 14, y + 0, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 0, z + 19, Blocks.stonebrick, 0, 3); @@ -798,23 +796,23 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 3, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 4, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 4, ModBlocks.factory_titanium_furnace, 2, 3); - world.setBlock(x + 8, y + 1, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 4, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 4, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 5, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 5, ModBlocks.factory_titanium_furnace, 4, 3); - world.setBlock(x + 7, y + 1, z + 5, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 5, ModBlocks.factory_titanium_furnace, 5, 3); + world.setBlock(x + 6, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 5, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 5, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 6, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 6, ModBlocks.factory_titanium_furnace, 3, 3); - world.setBlock(x + 8, y + 1, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 6, ModBlocks.deco_steel, 3, 3); + world.setBlock(x + 8, y + 1, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 6, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 6, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 7, Blocks.stonebrick, 0, 3); @@ -827,23 +825,23 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 9, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 10, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 10, ModBlocks.factory_titanium_furnace, 2, 3); - world.setBlock(x + 8, y + 1, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 10, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 10, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 11, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 11, ModBlocks.factory_titanium_furnace, 4, 3); - world.setBlock(x + 7, y + 1, z + 11, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 11, ModBlocks.factory_titanium_furnace, 5, 3); + world.setBlock(x + 6, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 11, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 11, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 12, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 12, ModBlocks.factory_titanium_furnace, 3, 3); - world.setBlock(x + 8, y + 1, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 12, ModBlocks.deco_steel, 3, 3); + world.setBlock(x + 8, y + 1, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 12, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 12, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 13, Blocks.stonebrick, 0, 3); @@ -856,21 +854,21 @@ public class Factory extends WorldGenerator world.setBlock(x + 14, y + 1, z + 15, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 16, ModBlocks.deco_lead, 5, 3); - world.setBlock(x + 6, y + 1, z + 16, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 16, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 16, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 16, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 17, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 17, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 17, Block3, 0, 3); - world.setBlock(x + 8, y + 1, z + 17, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 1, z + 17, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 17, Blocks.stone_brick_stairs, 4, 3); world.setBlock(x + 14, y + 1, z + 17, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 1, y + 1, z + 18, Block2, 5, 3); - world.setBlock(x + 6, y + 1, z + 18, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 1, z + 18, ModBlocks.factory_titanium_furnace, 3, 3); + world.setBlock(x + 6, y + 1, z + 18, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 1, z + 18, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 13, y + 1, z + 18, ModBlocks.machine_electric_furnace_off, 4, 3); world.setBlock(x + 14, y + 1, z + 18, Blocks.stonebrick, 0, 3); world.setBlock(x + 0, y + 1, z + 19, Blocks.stonebrick, 0, 3); @@ -965,19 +963,19 @@ public class Factory extends WorldGenerator world.setBlock(x + 8, y + 2, z + 3, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 3, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 4, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 4, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 4, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 4, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 5, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 5, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 5, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 5, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 6, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 6, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 6, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 6, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 7, Blocks.glass, 0, 3); world.setBlock(x + 6, y + 2, z + 7, Blocks.iron_bars, 0, 3); @@ -992,19 +990,19 @@ public class Factory extends WorldGenerator world.setBlock(x + 8, y + 2, z + 9, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 9, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 10, Blocks.brick_block, 0, 3); - world.setBlock(x + 6, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 10, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 10, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 10, Blocks.brick_block, 0, 3); world.setBlock(x + 0, y + 2, z + 11, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 11, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 11, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 11, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 12, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 7, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); - world.setBlock(x + 8, y + 2, z + 12, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 7, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); + world.setBlock(x + 8, y + 2, z + 12, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 12, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 13, Blocks.brick_block, 0, 3); world.setBlock(x + 6, y + 2, z + 13, Blocks.iron_bars, 0, 3); @@ -1017,7 +1015,7 @@ public class Factory extends WorldGenerator world.setBlock(x + 6, y + 2, z + 15, Blocks.iron_bars, 0, 3); world.setBlock(x + 14, y + 2, z + 15, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 16, Blocks.glass, 0, 3); - world.setBlock(x + 6, y + 2, z + 16, ModBlocks.factory_titanium_hull, 0, 3); + world.setBlock(x + 6, y + 2, z + 16, ModBlocks.deco_steel, 0, 3); world.setBlock(x + 14, y + 2, z + 16, Blocks.glass, 0, 3); world.setBlock(x + 0, y + 2, z + 17, Blocks.brick_block, 0, 3); world.setBlock(x + 14, y + 2, z + 17, Blocks.brick_block, 0, 3); diff --git a/src/main/java/com/hbm/world/feature/Dud.java b/src/main/java/com/hbm/world/feature/Dud.java index 1622cfae4..85572aa4a 100644 --- a/src/main/java/com/hbm/world/feature/Dud.java +++ b/src/main/java/com/hbm/world/feature/Dud.java @@ -13,12 +13,6 @@ import net.minecraft.world.gen.feature.WorldGenerator; public class Dud extends WorldGenerator { - Block Block1 = ModBlocks.steel_scaffold; - Block Block2 = ModBlocks.machine_difurnace_off; - Block Block3 = ModBlocks.factory_titanium_core; - Block Block4 = ModBlocks.steel_wall; - Block Block5 = ModBlocks.reinforced_light; - protected Block[] GetValidSpawnBlocks() { return new Block[] { Blocks.grass, diff --git a/src/main/java/com/hbm/world/feature/OilSpot.java b/src/main/java/com/hbm/world/feature/OilSpot.java index 35fc16e2d..cfc3014c1 100644 --- a/src/main/java/com/hbm/world/feature/OilSpot.java +++ b/src/main/java/com/hbm/world/feature/OilSpot.java @@ -1,11 +1,17 @@ package com.hbm.world.feature; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockDeadPlant.EnumDeadPlantType; import net.minecraft.block.Block; +import net.minecraft.block.BlockBush; +import net.minecraft.block.BlockDoublePlant; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.BlockTallGrass; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; public class OilSpot { @@ -17,9 +23,32 @@ public class OilSpot { int rY = world.getHeightValue(rX, rZ); for(int y = rY; y > rY - 4; y--) { - + + Block below = world.getBlock(rX, y - 1, rZ); Block ground = world.getBlock(rX, y, rZ); + if(below.isNormalCube() && ground != ModBlocks.plant_dead) { + if(ground instanceof BlockTallGrass) { + if(world.rand.nextInt(10) == 0) { + if(world.getBlockMetadata(rX, y + 1, rZ) == 2) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.FERN.ordinal(), 3); + } else { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GRASS.ordinal(), 3); + } + } else { + world.setBlock(rX, y, rZ, Blocks.air); + } + } else if(ground instanceof BlockFlower) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.FLOWER.ordinal(), 3); + } else if(ground instanceof BlockDoublePlant) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.BIGFLOWER.ordinal(), 3); + } else if(ground instanceof BlockBush) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GENERIC.ordinal(), 3); + } else if(ground instanceof IPlantable) { + world.setBlock(rX, y, rZ, ModBlocks.plant_dead, EnumDeadPlantType.GENERIC.ordinal(), 3); + } + } + if(ground == Blocks.grass || ground == Blocks.dirt) { world.setBlock(rX, y, rZ, world.rand.nextInt(10) == 0 ? ModBlocks.dirt_oily : ModBlocks.dirt_dead); break; diff --git a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java deleted file mode 100644 index b98219729..000000000 --- a/src/main/java/com/hbm/world/worldgen/ComponentNTMFeatures.java +++ /dev/null @@ -1,1312 +0,0 @@ -package com.hbm.world.worldgen; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockBobble.BobbleType; -import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; -import com.hbm.lib.HbmChestContents; -import com.hbm.tileentity.machine.storage.TileEntityCrateIron; -import com.hbm.util.LootGenerator; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemDoor; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.MapGenStructureIO; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -//Probably one of the more difficult parts. -/** Base component file. For structure generation under 32x32 blocks, as Minecraft generates 2x2 chunks for structures. - * Larger non-procedural structures should be split up into several bounding boxes, which check if they intersect the chunk bounding box currently being loaded. Doing so will prevent - * cascading world generation. See - * - * TheMasterCaver's advice. */ -public class ComponentNTMFeatures { - - /** Register structures in MapGenStructureIO */ - public static void registerNTMFeatures() { - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMHouse1.class, "NTMHouse1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMHouse2.class, "NTMHouse2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMLab1.class, "NTMLab1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMLab2.class, "NTMLab2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMWorkshop1.class, "NTMWorkshop1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin1.class, "NTMRuin1"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin2.class, "NTMRuin2"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin3.class, "NTMRuin3"); - MapGenStructureIO.func_143031_a(ComponentNTMFeatures.NTMRuin4.class, "NTMRuin4"); - } - - /** Sandstone Ruin 1 */ - public static class NTMHouse1 extends ComponentNTMFeatures.Feature { - - private boolean hasPlacedChest; - - private static ComponentNTMFeatures.Sandstone RandomSandstone = new ComponentNTMFeatures.Sandstone(); - - public NTMHouse1() { - super(); - } - - /** Constructor for this feature; takes coordinates for bounding box */ - protected NTMHouse1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 9, 4, 6); - this.hasPlacedChest = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasChest", this.hasPlacedChest); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedChest = nbt.getBoolean("hasChest"); - } - - /** - * Generates structures. - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - /* - * Places block at current position. Dependent on coordinate mode, i.e. will allow for random rotation, so use this instead of setBlock! - * this.placeBlockAtCurrentPosition(world, block, minX, metadata, x, y, z, box); - * Fills an area with air, self-explanatory. Use to clear interiors of unwanted blocks. - * this.fillWithAir(world, box, minX, minY, minZ, maxX, maxY, maxZ); - * Fills an area with blocks, self-explanatory. - * this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); - * Fills an area with metadata blocks, self-explanatory. - * this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockPlaceMeta, blockToReplace, replaceBlockMeta, alwaysReplace); - * Fills an area with randomized blocks, self-explanatory. - * this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, alwaysReplace, rand, StructureComponent.blockSelector); - * (BlockSelector is basically a list of blocks that can be randomly picked, except that it can actually be weighted) - * Replaces any air or water blocks with this block down. Useful for foundations - * this.func_151554_b(world, block, metadata, x, startAtY, z, box - * Fills an area with blocks randomly - look into randLimit? - * this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); - */ - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - //Walls - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, featureSizeX, 0, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, 1, 0, 1, 1, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 1, 0, box); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 5, 1, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 1, 0, box); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 1, 0, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX, 1, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 2, 0, featureSizeX - 2, 2, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 0, 1, featureSizeZ, false, rand, RandomSandstone); //Left Wall - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 0, 2, 1, box); - this.fillWithMetadataBlocks(world, box, 0, 2, 3, 0, 2, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 1, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, 3, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 1, 2, featureSizeZ, 3, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithMetadataBlocks(world, box, 4, 2, featureSizeZ, 5, 2, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 2, 2, featureSizeZ, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 0, featureSizeZ, false, rand, RandomSandstone); //Right Wall - this.randomlyFillWithBlocks(world, box, rand, 0.65F, featureSizeX, 1, 1, featureSizeX, 1, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - this.fillWithRandomizedBlocks(world, box, 4, 0, 1, 4, 1, 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, ModBlocks.reinforced_sand, 0, 4, 0, 4, box); - - //Loot/Sand - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 1, 0, 1, box); - if(!this.hasPlacedChest) - this.hasPlacedChest = this.generateStructureChestContents(world, box, rand, 3, 0, 1, HbmChestContents.modGeneric, rand.nextInt(2) + 8); - this.fillWithBlocks(world, box, 5, 0, 1, 6, 0, 1, ModBlocks.crate, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, Blocks.sand, 0, 7, 0, 1, box); - if(rand.nextFloat() <= 0.25) - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_metal, 0, featureSizeX - 1, 0, 1, box); - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 2, 3, 0, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 5, 0, 2, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - return true; - } - - } - - public static class NTMHouse2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.Sandstone RandomSandstone = new ComponentNTMFeatures.Sandstone(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMHouse2() { - super(); - } - - protected NTMHouse2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 15, 5, 9); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.print(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < 7; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - for(byte i = 9; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box); - } - } - - this.fillWithAir(world, box, 1, 0, 1, 5, featureSizeY, featureSizeZ - 1); - - //House 1 - this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 6, 1, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, 2, 0, 1, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, 3, 2, 0, 3, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, 5, 2, 0, 6, 2, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 3, 0, 6, 3, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 3, featureSizeZ, false, rand, RandomSandstone); //Left Wall - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 6, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, 1, 2, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithBlocks(world, box, 2, 2, featureSizeZ, 4, 2, featureSizeZ, Blocks.fence, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 5, 2, featureSizeZ, 6, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 1, 3, featureSizeZ, 6, 3, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ - 1, 6, 3, featureSizeZ - 1, false, rand, RandomSandstone); //Right Wall - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ - 2, 6, 0, featureSizeZ - 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 3, featureSizeZ - 2, 6, 3, featureSizeZ - 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, 6, 0, 1, 6, 3, featureSizeZ - 3, false, rand, RandomSandstone); - - this.fillWithBlocks(world, box, 1, 0, 1, 5, 0, featureSizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor - //this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 1, 0, 5, featureSizeY - 1, featureSizeZ, false, rand, RandomSandstone); //Ceiling - this.fillWithBlocks(world, box, 1, featureSizeY - 1, 0, 5, featureSizeY - 1, featureSizeZ, Blocks.sandstone, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 0, featureSizeY - 1, 0, 0, featureSizeY - 1, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); //Roof - this.fillWithMetadataBlocks(world, box, 6, featureSizeY - 1, 0, 6, featureSizeY - 1, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY, 0, 4, featureSizeY, 0, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, featureSizeY, 1, 3, featureSizeY, 2, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, featureSizeY, 4, 3, featureSizeY, 6, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 3, featureSizeY, featureSizeZ - 1, box); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY, featureSizeZ, 4, featureSizeY, featureSizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); - - //House 2 - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 0, featureSizeX, 0, 0, false, rand, RandomSandstone); //Back Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 1, 0, featureSizeX - 2, 1, 0, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 0, featureSizeX - 6, 2, 0, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 6, 2, 0, box); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 3, 2, 0, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 1, featureSizeX - 6, 3, 1, false, rand, RandomSandstone); //Left Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 2, featureSizeX - 6, 0, 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 3, 2, featureSizeX - 6, 3, featureSizeZ - 1, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX - 6, featureSizeY - 1, 2, box); - this.fillWithMetadataBlocks(world, box, featureSizeX - 6, featureSizeY - 1, 4, featureSizeX - 6, featureSizeY - 1, featureSizeZ - 2, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 3, featureSizeX - 6, 1, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 0, 2, featureSizeX - 6, 0, 2, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 3, featureSizeX - 6, 2, 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, featureSizeX - 6, 2, 4, box); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, 5, featureSizeX - 6, 2, 5, false, rand, RandomSandstone); - this.fillWithBlocks(world, box, featureSizeX - 6, 2, featureSizeZ - 3, featureSizeX - 6, 2, featureSizeZ - 2, Blocks.fence, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 6, 2, featureSizeZ - 1, featureSizeX - 6, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 5, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, false, rand, RandomSandstone); //Front Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 5, 2, featureSizeZ, featureSizeX - 5, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 2, featureSizeZ, featureSizeX, 2, featureSizeZ, false, rand, RandomSandstone); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomSandstone); //Right Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 3, featureSizeX, 1, 3, false, rand, RandomSandstone); - this.fillWithMetadataBlocks(world, box, featureSizeX, 1, 4, featureSizeX, 1, 5, Blocks.stone_slab, 1, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, featureSizeZ - 1, featureSizeX, 1, featureSizeZ - 3, false, rand, RandomSandstone); - this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, featureSizeX, 1, featureSizeZ - 1, box); - - this.fillWithBlocks(world, box, featureSizeX - 5, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor - - //Loot & Decorations - //House 1 - int eastMeta = this.getMetadataForRotatableDeco(4); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box); - this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, featureSizeY, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 2, 1, 3, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, 1, 1, featureSizeZ - 4, box); - if(!hasPlacedLoot[0]) { - this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), 1, 1, featureSizeZ - 2, box); - WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.machineParts, (TileEntityChest)world.getTileEntity(this.getXWithOffset(1, featureSizeZ - 2), - this.getYWithOffset(1), this.getZWithOffset(1, featureSizeZ - 2)), 10); - this.hasPlacedLoot[0] = true; - } - this.fillWithBlocks(world, box, 4, 1, featureSizeZ - 1, 5, 1, featureSizeZ - 1, ModBlocks.crate, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 1, 4, 5, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 5, 1, 6, 5, 3, 6, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_grate, 7, 5, 1, 5, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 5, 2, 5, box); - - //House 2 - if(!hasPlacedLoot[1]) { - this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), featureSizeX - 5, 1, 1, box); - WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.antenna, (TileEntityChest)world.getTileEntity(this.getXWithOffset(featureSizeX - 5, 1), - this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 5, 1)), 10); - this.hasPlacedLoot[1] = true; - } - this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureSizeX - 5, 1, 4, box); - TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(featureSizeX - 5, 4), this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 5, 4)); - - if(bobble != null) { - bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; - bobble.markDirty(); - } - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, featureSizeX - 4, 1, 1, featureSizeX - 1, 1, featureSizeZ - 1, Blocks.sand, Blocks.air, false); - - return true; - } - } - - public static class NTMLab1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - private static ComponentNTMFeatures.LabTiles RandomLabTiles = new ComponentNTMFeatures.LabTiles(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMLab1() { - super(); - } - - /** Constructor for this feature; takes coordinates for bounding box */ - protected NTMLab1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 9, 4, 7); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < this.featureSizeX + 1; i++) { - for(byte j = 0; j < this.featureSizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 3; i < this.featureSizeX + 1; i++) { - for(byte j = 6; j < this.featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - int stairsMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 0); - if(this.getBlockAtCurrentPosition(world, 2, 0, featureSizeZ - 1, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, 2, 0, featureSizeZ - 1, box) == Blocks.air) { - this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, featureSizeZ - 1, box); - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairsMeta, 2, 0, featureSizeZ - 1, box); - } - - this.fillWithAir(world, box, 1, 0, 1, featureSizeX - 1, featureSizeY, 4); - this.fillWithAir(world, box, 4, 0, 4, featureSizeX - 1, featureSizeY, featureSizeZ - 1); - this.fillWithAir(world, box, 3, 1, featureSizeZ - 1, 3, 2, featureSizeZ - 1); - - int pillarMeta = this.getMetadataForRotatablePillar(8); - - //Pillars - this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, 4, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ - 2, 0, 3, featureSizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 0, featureSizeZ - 2, 3, 3, featureSizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 0, featureSizeZ, 3, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - - //Walls - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, featureSizeY - 1, 0, false, rand, RandomConcreteBricks); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY, 0, featureSizeX, featureSizeY, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, featureSizeY - 1, 4, false, rand, RandomConcreteBricks); //Left Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY, 0, 0, featureSizeY, featureSizeZ - 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ - 2, 2, featureSizeY, featureSizeZ - 2, false, rand, RandomConcreteBricks); //Front Wall Pt. 1 - this.placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete_broken, 0, 3, featureSizeY, featureSizeZ - 2, box); - this.fillWithRandomizedBlocks(world, box, 3, featureSizeY - 1, featureSizeZ - 1, 3, featureSizeY, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 0, featureSizeZ, featureSizeX - 1, 1, featureSizeZ, false, rand, RandomConcreteBricks); //Front Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, 4, 2, featureSizeZ, 4, 3, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 2, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, false, rand, RandomConcreteBricks); - this.randomlyFillWithBlocks(world, box, rand, 0.75F, 5, 2, featureSizeZ, featureSizeX - 2, 3, featureSizeZ, Blocks.glass_pane, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 3, featureSizeY, featureSizeZ, featureSizeX, featureSizeY, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, featureSizeY, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Right Wall - - //Floor & Ceiling - this.fillWithRandomizedBlocks(world, box, 1, 0, 1, featureSizeX - 1, 0, 4, false, rand, RandomLabTiles); //Floor - this.fillWithRandomizedBlocks(world, box, 4, 0, featureSizeZ - 2, featureSizeX - 1, 0, featureSizeZ - 1, false, rand, RandomLabTiles); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 3, 0, featureSizeZ - 1, box); - - this.fillWithBlocks(world, box, 1, featureSizeY - 1, 1, 1, featureSizeY, 4, ModBlocks.reinforced_glass, Blocks.air, false); //Ceiling - this.fillWithBlocks(world, box, 2, featureSizeY, 1, featureSizeX - 1, featureSizeY, 4, ModBlocks.brick_light, Blocks.air, false); - this.fillWithBlocks(world, box, 4, featureSizeY, featureSizeZ - 2, featureSizeX - 1, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); - - //Decorations & Loot - this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false); - int westDecoMeta = this.getMetadataForRotatableDeco(5); - this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 2, featureSizeY - 1, 1, 2, featureSizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); - for(byte i = 0; i < 4; i++) { - this.placeBlockAtCurrentPosition(world, ModBlocks.plant_flower, i, 1, 2, 1 + i, box); - } - - int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 2); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, featureSizeZ - 1, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, featureSizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, featureSizeZ - 1), doorMeta, ModBlocks.door_office); - - int northDecoMeta = this.getMetadataForRotatableDeco(3); - this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 1, featureSizeX - 1, featureSizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 5, featureSizeY - 1, 2, featureSizeX - 1, featureSizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_microwave, northDecoMeta, 5, 2, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, 6, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_shredder, 0, featureSizeX - 2, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, featureSizeX - 1, 1, 1, box); - this.fillWithBlocks(world, box, 5, 1, 3, featureSizeX - 1, 1, 3, ModBlocks.deco_titanium, Blocks.air, false); - if(!hasPlacedLoot[0]) { - this.placeBlockAtCurrentPosition(world, ModBlocks.deco_loot, 0, 6, 2, 3, box); - LootGenerator.lootMedicine(world, this.getXWithOffset(6, 3), this.getYWithOffset(2), this.getZWithOffset(6, 3)); - this.hasPlacedLoot[0] = true; - } - - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, featureSizeX - 1, 1, featureSizeZ - 2, box); - if(!hasPlacedLoot[1]) { - this.hasPlacedLoot[1] = this.generateIronCrateContents(world, box, rand, featureSizeX - 1, 1, featureSizeZ - 1, HbmChestContents.modGeneric, 8); - } - - return true; - } - } - - public static class NTMLab2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.SuperConcrete RandomSuperConcrete = new ComponentNTMFeatures.SuperConcrete(); - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - private static ComponentNTMFeatures.LabTiles RandomLabTiles = new ComponentNTMFeatures.LabTiles(); - - private boolean[] hasPlacedLoot = new boolean[2]; - - public NTMLab2() { - super(); - } - - protected NTMLab2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 12, 11, 8); - this.hasPlacedLoot[0] = false; - this.hasPlacedLoot[1] = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); - nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); - this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - this.boundingBox.offset(0, -7, 0); - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ - 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } - - for(byte i = 0; i < 7; i++) { - for(byte j = 7; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box); - } - } - - if(this.getBlockAtCurrentPosition(world, featureSizeX - 3, featureSizeY - 4, 7, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, featureSizeX - 3, featureSizeY - 4, 7, box) == Blocks.air) { - int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX - 3, featureSizeY - 4, 7, box); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX - 2, featureSizeY - 4, 7, box); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 4, 7, featureSizeX - 2, featureSizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false); - } - - - this.fillWithAir(world, box, 1, featureSizeY - 4, 1, featureSizeX - 1, featureSizeY, featureSizeZ - 3); - this.fillWithAir(world, box, 1, featureSizeY - 4, featureSizeZ - 2, 5, featureSizeY, featureSizeZ - 1); - this.fillWithAir(world, box, featureSizeX - 3, featureSizeY - 3, featureSizeZ - 2, featureSizeX - 2, featureSizeY - 2, featureSizeZ - 2); - this.fillWithAir(world, box, 5, 5, 1, 6, 6, 2); - this.fillWithAir(world, box, 2, 0, 2, featureSizeX - 2, 3, featureSizeZ - 2); - - //Walls - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY - 4, 0, featureSizeX, featureSizeY, 0, false, rand, RandomSuperConcrete); //Back Wall - this.fillWithRandomizedBlocks(world, box, 0, featureSizeY - 4, 0, 0, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); //Left Wall - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 4, featureSizeZ, 5, featureSizeY - 4, featureSizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 1 - this.fillWithBlocks(world, box, 1, featureSizeY - 3, featureSizeZ, 1, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, featureSizeY - 4, featureSizeZ, 2, featureSizeY - 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, featureSizeY - 3, featureSizeZ, 3, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 4, featureSizeY - 4, featureSizeZ, 4, featureSizeY - 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 5, featureSizeY - 3, featureSizeZ, 5, featureSizeY - 1, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY, featureSizeZ, 5, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 6, featureSizeY - 4, featureSizeZ - 1, 6, featureSizeY, featureSizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 2 - this.fillWithRandomizedBlocks(world, box, 6, featureSizeY - 4, featureSizeZ - 2, 7, featureSizeY - 2, featureSizeZ - 2, false, rand, RandomSuperConcrete); //Front Wall pt. 3 - this.fillWithBlocks(world, box, 6, featureSizeY - 1, featureSizeZ - 2, 7, featureSizeY - 1, featureSizeZ - 2, ModBlocks.concrete_super_broken, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 4, featureSizeZ - 2, featureSizeX, featureSizeY - 4, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 3, featureSizeZ - 2, featureSizeX - 4, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, featureSizeY - 1, featureSizeZ - 2, featureSizeX - 2, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, featureSizeY - 4, featureSizeZ - 2, featureSizeX, featureSizeY, featureSizeZ - 2, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 4, 1, featureSizeX, featureSizeY - 4, featureSizeZ - 3, false, rand, RandomSuperConcrete); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, featureSizeZ - 3, featureSizeX, featureSizeY - 1, featureSizeZ - 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 3, 4, featureSizeX, featureSizeY - 1, 4, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, 3, featureSizeX, featureSizeY - 1, 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY - 3, 2, featureSizeX, featureSizeY - 1, 2, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, featureSizeX, featureSizeY - 3, 1, featureSizeX, featureSizeY - 1, 1, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, featureSizeY, 1, featureSizeX, featureSizeY, featureSizeZ - 3, false, rand, RandomSuperConcrete); - - this.fillWithBlocks(world, box, 1, 0, 1, featureSizeX - 1, 3, 1, ModBlocks.reinforced_stone, Blocks.air, false); //Back Wall - this.fillWithBlocks(world, box, 1, 0, 2, 1, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Left Wall - this.fillWithBlocks(world, box, 1, 0, featureSizeZ - 1, featureSizeX - 1, 3, featureSizeZ - 1, ModBlocks.reinforced_stone, Blocks.air, false); //Front Wall - this.fillWithBlocks(world, box, featureSizeX - 1, 0, 2, featureSizeX - 1, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); // Right Wall - this.fillWithBlocks(world, box, 6, 0, 3, 6, 3, featureSizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Internal Wall - - //Floors & Ceiling - this.fillWithRandomizedBlocks(world, box, 1, featureSizeY - 4, 1, 3, featureSizeY - 4, featureSizeZ - 1, false, rand, RandomLabTiles); //Left Floor - this.fillWithRandomizedBlocks(world, box, 4, featureSizeY - 4, featureSizeZ - 2, 5, featureSizeY - 4, featureSizeZ - 1, false, rand, RandomLabTiles); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, featureSizeY - 4, 1, featureSizeX - 1, featureSizeY - 4, featureSizeZ - 3, false, rand, RandomLabTiles); //Right Floor - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, featureSizeY - 4, featureSizeZ - 2, featureSizeX - 2, featureSizeY - 4, featureSizeZ - 2, false, rand, RandomLabTiles); - this.fillWithBlocks(world, box, 4, featureSizeY - 4, 1, 7, featureSizeY - 4, 1, ModBlocks.tile_lab_broken, Blocks.air, false); //Center Floor (Pain) - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 4, featureSizeY - 4, 2, box); - this.fillWithBlocks(world, box, 4, featureSizeY - 4, 3, 4, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 5, featureSizeY - 4, 3, box); - this.fillWithBlocks(world, box, 5, featureSizeY - 4, 4, 5, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 6, featureSizeY - 4, 4, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 6, featureSizeY - 4, 5, box); - this.fillWithBlocks(world, box, 7, featureSizeY - 4, 2, 7, featureSizeY - 4, 3, ModBlocks.tile_lab_broken, Blocks.air, false); - this.fillWithBlocks(world, box, 7, featureSizeY - 4, 4, 7, featureSizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); - - this.fillWithBlocks(world, box, 1, featureSizeY, 1, 2, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Left Ceiling - this.fillWithBlocks(world, box, 3, featureSizeY, featureSizeZ - 2, 4, featureSizeY, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); - this.fillWithBlocks(world, box, featureSizeX - 3, featureSizeY, 1, featureSizeX - 1, featureSizeY, featureSizeZ - 3, ModBlocks.brick_light, Blocks.air, false); //Right Ceiling - this.fillWithBlocks(world, box, 3, featureSizeY, 1, 8, featureSizeY, 1, ModBlocks.waste_planks, Blocks.air, false); //Center Ceiling (Pain) - this.fillWithBlocks(world, box, 3, featureSizeY, 2, 4, featureSizeY, 2, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 7, featureSizeY, 2, 8, featureSizeY, 2, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 3, featureSizeY, 3, 3, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 4, featureSizeY, 4, 4, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 5, featureSizeY, 6, 5, featureSizeY, featureSizeZ - 1, ModBlocks.waste_planks, Blocks.air, false); - this.fillWithBlocks(world, box, 8, featureSizeY, 3, 8, featureSizeY, 5, ModBlocks.waste_planks, Blocks.air, false); - - this.fillWithRandomizedBlocks(world, box, 2, 0, 2, 5, 0, featureSizeZ - 2, false, rand, RandomLabTiles); //Floor - this.fillWithRandomizedBlocks(world, box, 6, 0, 2, 6, 0, 3, false, rand, RandomLabTiles); - this.fillWithRandomizedBlocks(world, box, 7, 0, 2, featureSizeX - 2, 0, featureSizeZ - 2, false, rand, RandomLabTiles); - - this.fillWithRandomizedBlocks(world, box, 1, 4, 1, featureSizeX - 1, 4, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling - - //Decorations & Loot - int eastMeta = this.getMetadataForRotatableDeco(4); - int westMeta = this.getMetadataForRotatableDeco(5); - int northMeta = this.getMetadataForRotatableDeco(3); - int southMeta = this.getMetadataForRotatableDeco(2); - this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, featureSizeY - 2, 3, box); - - int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, featureSizeX - 3, featureSizeY - 3, featureSizeZ - 2, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(featureSizeX - 3, featureSizeZ - 2), this.getYWithOffset(featureSizeY - 3), this.getZWithOffset(featureSizeX - 3, featureSizeZ - 2), - doorMeta, ModBlocks.door_office); - this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, featureSizeX - 2, featureSizeY - 3, featureSizeZ - 2, box); - ItemDoor.placeDoorBlock(world, this.getXWithOffset(featureSizeX - 2, featureSizeZ - 2), this.getYWithOffset(featureSizeY - 3), this.getZWithOffset(featureSizeX - 2, featureSizeZ - 2), - doorMeta, ModBlocks.door_office); - - this.fillWithBlocks(world, box, 1, featureSizeY - 3, 1, 1, featureSizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 1, featureSizeY - 3, 2, 1, featureSizeY - 2, 3, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, westMeta, 1, featureSizeY - 1, 2, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, 1, featureSizeY - 1, 3, box); - this.fillWithBlocks(world, box, 1, featureSizeY - 3, 6, 1, featureSizeY - 1, 6, ModBlocks.deco_pipe_framed_rusted, Blocks.air, false); - - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, featureSizeY - 3, 1, featureSizeX - 4, featureSizeY - 1, 1, ModBlocks.steel_wall, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 1, 1, featureSizeX - 2, featureSizeY - 1, 1, ModBlocks.steel_grate, 0, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, featureSizeY - 2, 1, featureSizeX - 2, featureSizeY - 2, 1, ModBlocks.tape_recorder, northMeta, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX - 3, featureSizeY - 3, 1, featureSizeX - 2, featureSizeY - 3, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 1, featureSizeY - 3, 1, featureSizeX - 1, featureSizeY - 1, 1, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - - this.fillWithMetadataBlocks(world, box, 2, 1, 2, 2, 1, featureSizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.vitrified_barrel, 0, 2, 2, 2, box); - this.fillWithMetadataBlocks(world, box, 3, 1, 2, 3, 3, 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, 1, 4, 3, 3, 4, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 3, 1, featureSizeZ - 2, 3, 3, featureSizeZ - 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 4, 1, featureSizeZ - 2, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_lead, 0, 4, 2, featureSizeZ - 2, box); - if(!hasPlacedLoot[0]) { - this.hasPlacedLoot[0] = this.generateIronCrateContents(world, box, rand, 5, 1, featureSizeZ - 2, HbmChestContents.nuclearFuel, 10); - } - this.fillWithBlocks(world, box, 4, 1, featureSizeZ - 3, 5, 1, featureSizeZ - 3, ModBlocks.crate_lead, Blocks.air, false); - - this.fillWithBlocks(world, box, featureSizeX - 5, 1, featureSizeZ - 2, featureSizeX - 5, 3, featureSizeZ - 2, ModBlocks.deco_steel, Blocks.air, false);; - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, 1, featureSizeZ - 2, featureSizeX - 2, 1, featureSizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 4, 2, featureSizeZ - 2, featureSizeX - 3, 2, featureSizeZ - 2, ModBlocks.tape_recorder, southMeta, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, featureSizeX - 2, 2, featureSizeZ - 2, box); - this.fillWithBlocks(world, box, featureSizeX - 4, 3, featureSizeZ - 2, featureSizeX - 2, 3, featureSizeZ - 2, ModBlocks.steel_roof, Blocks.air, false); - if(!hasPlacedLoot[1]) { - this.hasPlacedLoot[1] = this.generateIronCrateContents(world, box, rand, featureSizeX - 2, 1, 3, HbmChestContents.nukeTrash, 9); - } - - return true; - } - } - - public static class NTMWorkshop1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.SuperConcrete RandomSuperConcrete = new ComponentNTMFeatures.SuperConcrete(); - - private boolean hasPlacedLoot; - - public NTMWorkshop1() { - super(); - } - - protected NTMWorkshop1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 10, 6, 8); - this.hasPlacedLoot = false; - } - - @Override - protected void func_143012_a(NBTTagCompound nbt) { - super.func_143012_a(nbt); - nbt.setBoolean("hasLoot", this.hasPlacedLoot); - } - - @Override - protected void func_143011_b(NBTTagCompound nbt) { - super.func_143011_b(nbt); - this.hasPlacedLoot = nbt.getBoolean("hasLoot"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - ////System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 1; i < featureSizeX - 2; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - for(byte i = 8; i < featureSizeX + 1; i++) { - for(byte j = 1; j < 7; j++) { - this.func_151554_b(world, Blocks.dirt, 0, i, -1, j, box); - } - } - - this.fillWithAir(world, box, 1, 0, 0, featureSizeX - 3, featureSizeY - 2, featureSizeZ); - this.fillWithAir(world, box, featureSizeX - 2, 0, 2, featureSizeX - 1, 2, 5); - - if(this.getBlockAtCurrentPosition(world, 0, 0, 5, box).getMaterial().isReplaceable() - || this.getBlockAtCurrentPosition(world, 0, 0, 5, box) == Blocks.air) { - int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1); - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box); - - for(byte i = 1; 1 < featureSizeZ; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - } - - this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false); - } - - //Walls - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); - this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box); - this.fillWithMetadataBlocks(world, box, 2, 4, 0, featureSizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, featureSizeX - 3, 4, 0, box); - this.fillWithBlocks(world, box, featureSizeX - 3, 0, 0, featureSizeX - 3, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, 0, 0, featureSizeX - 4, 1, 0, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 2, 0, 2, 2, 0, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, 2, 0, 5, 2, 0, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, 2, 0, featureSizeX - 4, 2, 0, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 3, 0, featureSizeX - 4, 3, 0, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, 1, 4, 1, 1, 4, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, featureSizeZ, box); - this.fillWithBlocks(world, box, 1, 0, featureSizeZ, 1, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 1, 1, 1, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 2, 1, 1, 2, 1, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 1, 2, 2, 1, 2, 3, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 2, 4, 1, 2, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 3, 1, 1, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ - 2, 1, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, 2, 4, featureSizeZ, featureSizeX - 4, 4, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, featureSizeX - 3, 4, featureSizeZ, box); - this.fillWithBlocks(world, box, featureSizeX - 3, 0, featureSizeZ, featureSizeX - 3, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 2, 0, featureSizeZ, featureSizeX - 4, 1, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 2, featureSizeZ, 2, 2, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithBlocks(world, box, 3, 2, featureSizeZ, 5, 2, featureSizeZ, ModBlocks.reinforced_glass, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 4, 2, featureSizeZ, featureSizeX - 4, 2, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 3, featureSizeZ, featureSizeX - 4, 3, featureSizeZ, false, rand, RandomSuperConcrete); - this.fillWithMetadataBlocks(world, box, featureSizeX - 3, 4, 1, featureSizeX - 3, 4, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithRandomizedBlocks(world, box, featureSizeX - 3, 0, 1, featureSizeX - 3, 3, featureSizeZ - 1, false, rand, RandomSuperConcrete); - - pillarMetaWE = this.getMetadataForRotatablePillar(5); - pillarMetaNS = this.getMetadataForRotatablePillar(9); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 2, 1, featureSizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 1, featureSizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 2, 2, featureSizeX, 2, 5, Blocks.log, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 2, 6, Blocks.log, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 0, 3, featureSizeX, 1, 5, Blocks.planks, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 2, 6, featureSizeX - 1, 2, 6, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 6, featureSizeX - 1, 1, 6, Blocks.planks, 1, Blocks.air, 0, false); - - //Floor & Ceiling - this.fillWithBlocks(world, box, 2, 0, 1, 6, 0, featureSizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Floor - this.placeBlockAtCurrentPosition(world, ModBlocks.brick_light, 0, 1, 0, 5, box); - this.fillWithRandomizedBlocks(world, box, 2, 4, 1, 6, 4, 3, false, rand, RandomSuperConcrete); //Ceiling - this.fillWithRandomizedBlocks(world, box, 2, 4, 4, 2, 4, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 5, 4, 4, 6, 4, 4, false, rand, RandomSuperConcrete); - this.fillWithRandomizedBlocks(world, box, 2, 4, featureSizeZ - 3, 6, 4, featureSizeZ - 1, false, rand, RandomSuperConcrete); - - this.fillWithBlocks(world, box, featureSizeX - 2, 2, 2, featureSizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false); - - //Loot & Decorations - int southMeta = this.getMetadataForRotatableDeco(2); - int eastMeta = this.getMetadataForRotatableDeco(5); - this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, featureSizeY - 1, 1, box); - this.fillWithBlocks(world, box, 3, featureSizeY - 1, 1, 4, featureSizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithBlocks(world, box, 2, featureSizeY - 1, 2, 4, featureSizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false); - this.fillWithBlocks(world, box, 2, featureSizeY, 1, 4, featureSizeY, 2, ModBlocks.steel_roof, Blocks.air, false); - this.fillWithBlocks(world, box, 2, 1, 1, 2, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 1, 1, 3, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_generator, 0, 4, 1, 1, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.machine_detector, 0, 4, 1, 2, box); - this.fillWithBlocks(world, box, 5, 1, 1, 5, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); - this.fillWithBlocks(world, box, 6, 1, 1, 6, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); - this.fillWithBlocks(world, box, 3, 1, 4, 4, 1, 4, ModBlocks.concrete_super_broken, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 6, 1, 4, 6, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, box, 6, 1, 5, 6, 1, 7, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.radiorec, eastMeta, 6, 2, featureSizeZ - 1, box); - this.fillWithMetadataBlocks(world, box, 2, 1, featureSizeZ - 1, 3, 1, featureSizeZ - 1, ModBlocks.machine_electric_furnace_off, southMeta, Blocks.air, 0, false); - if(!hasPlacedLoot) { - this.hasPlacedLoot = this.generateIronCrateContents(world, box, rand, 4, 1, featureSizeZ - 1, HbmChestContents.machineParts, 11); - } - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 5, 3, 1, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 2, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 2, 5, box); - - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 5, featureSizeX - 1, 0, 5, ModBlocks.steel_grate, 7, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, southMeta, featureSizeX - 2, 1, 5, box); - this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureSizeX - 1, 1, 5, box); - TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(featureSizeX - 1, 5), this.getYWithOffset(1), this.getZWithOffset(featureSizeX - 1, 5)); - - if(bobble != null) { - bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; - bobble.markDirty(); - } - this.fillWithMetadataBlocks(world, box, featureSizeX - 2, 0, 2, featureSizeX - 2, 0, 3, Blocks.log, pillarMetaWE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, Blocks.log, pillarMetaWE, featureSizeX - 2, 1, 2, box); - this.placeBlockAtCurrentPosition(world, Blocks.web, 0, featureSizeX - 2, 1, 3, box); - - return true; - } - } - - public static class NTMRuin1 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin1() { - super(); - } - - protected NTMRuin1(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 8, 6, 10); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); - - this.fillWithBlocks(world, box, 0, 0, 0, 0, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.fillWithMetadataBlocks(world, box, 1, 3, 0, 3, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, 4, 0, 0, 4, featureSizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 3, 0, featureSizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, featureSizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 3, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 3, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 0, 5, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 4, 0, 3, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 4, 0, featureSizeX - 1, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, featureSizeY - 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 2, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 2, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, featureSizeZ - 2, 0, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 4, 1, 0, 4, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 5, 1, 0, 5, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 4, featureSizeZ - 2, 0, 4, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 1, 3, featureSizeZ, 3, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithBlocks(world, box, 4, 0, featureSizeZ, 4, featureSizeY - 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, 5, 3, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, featureSizeY - 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 3, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, featureSizeZ, 3, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, featureSizeZ, 5, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, featureSizeZ, featureSizeX - 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, 1, featureSizeX, 3, 2, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, featureSizeZ - 1, featureSizeX, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, 2, 2, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, featureSizeZ - 2, featureSizeX, 1, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 2, featureSizeZ - 1, featureSizeX, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin2 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin2() { - super(); - } - - protected NTMRuin2(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 7, 5, 10); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeX + 1; i++) { - for(byte j = 0; j < featureSizeZ + 1; j++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box); - } - } - - int pillarMetaWE = this.getMetadataForRotatablePillar(4); - int pillarMetaNS = this.getMetadataForRotatablePillar(8); - - this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.fillWithMetadataBlocks(world, box, 1, 3, 0, featureSizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 4, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 3, 4, 0, featureSizeX - 1, 4, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, featureSizeY, 0, featureSizeX - 1, featureSizeY, 0, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall - this.fillWithBlocks(world, box, 0, 0, 5, 0, 0, 5, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, 2, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 2, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, featureSizeZ - 3, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, featureSizeZ - 1, 0, 1, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX - 1, 3, featureSizeZ, featureSizeX - 1, 3, featureSizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 3, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, featureSizeZ, 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, featureSizeZ, featureSizeX - 1, 2, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, 1, featureSizeX, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 4, 5, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithMetadataBlocks(world, box, featureSizeX, 3, featureSizeZ - 2, featureSizeX, 3, featureSizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 1, featureSizeX, 2, 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 3, featureSizeX, 2, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 4, featureSizeX, 1, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 6, featureSizeX, 1, 7, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, featureSizeZ - 1, featureSizeX, 2, featureSizeZ - 1, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin3 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin3() { - super(); - } - - protected NTMRuin3(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 8, 3, 10); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, featureSizeX, -1, i, box); - } - - for(byte i = 1; i < featureSizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 0, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 4, box); - } - - this.fillWithBlocks(world, box, 0, 0, 0, 0, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall - this.fillWithBlocks(world, box, featureSizeX, 0, 0, featureSizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, featureSizeX - 1, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 0, featureSizeX - 1, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 1, 2, 0, featureSizeX - 2, 2, 0, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 0, 0, 4, 0, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Left Wall - this.placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 0, 0, featureSizeZ, box); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, 5, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 5, 0, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 7, 0, 1, 7, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, 4, featureSizeX, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 1, featureSizeX, 1, 3, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 0, 6, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, featureSizeZ - 1, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 4, 0, 4, 4, 2, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Center Wall - this.fillWithRandomizedBlocks(world, box, 3, 0, 4, 3, 1, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 0, 4, featureSizeX - 1, 1, 4, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, featureSizeX - 1, 0, 3, Blocks.gravel, Blocks.air, false); - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } - } - - public static class NTMRuin4 extends ComponentNTMFeatures.Feature { - - private static ComponentNTMFeatures.ConcreteBricks RandomConcreteBricks = new ComponentNTMFeatures.ConcreteBricks(); - - public NTMRuin4() { - super(); - } - - protected NTMRuin4(Random rand, int minX, int minY, int minZ) { - super(rand, minX, minY, minZ, 10, 2, 11); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { - - //System.out.println(this.coordBaseMode); - if(!this.func_74935_a(world, box, this.boundingBox.minY)) { - return false; - } - //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); - - for(byte i = 0; i < featureSizeZ + 1; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i >= 5 ? featureSizeX : 5, -1, i, box); //elegant solution - } - - for(byte i = 1; i < featureSizeX; i++) { - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, featureSizeZ, box); - this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, i > 4 ? 5 : 0, box); //ternary operators my beloved - } - - this.fillWithBlocks(world, box, 0, 0, 0, 0, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 1 - this.fillWithBlocks(world, box, 5, 0, 0, 5, featureSizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); - this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 5, 0, 5, 5, featureSizeY, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 1 - this.fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 0, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 1, 5, 1, 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 1, 4, 5, 1, 4, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 5, 2, 1, 5, 2, 4, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, 5, featureSizeX, 1, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, 6, 0, 5, featureSizeX - 1, 0, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 6, 1, 5, 6, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 1, 5, featureSizeX - 1, 1, 5, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, featureSizeX, 0, featureSizeZ, featureSizeX, 1, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 2 - this.fillWithRandomizedBlocks(world, box, featureSizeX, 0, 6, featureSizeX, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX, 1, 6, featureSizeX, 1, featureSizeZ - 3, false, rand, RandomConcreteBricks); - this.fillWithBlocks(world, box, 0, 0, featureSizeZ, 0, 0, featureSizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Front Wall - this.fillWithRandomizedBlocks(world, box, 1, 0, featureSizeZ, 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 6, 0, featureSizeZ, 7, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, featureSizeX - 1, 0, featureSizeZ, featureSizeX - 1, 0, featureSizeZ, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, featureSizeZ - 1, false, rand, RandomConcreteBricks); //Left Wall - this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 1, 1, false, rand, RandomConcreteBricks); - this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 1, 7, false, rand, RandomConcreteBricks); - - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 4, 0, 5, Blocks.gravel, Blocks.air, false); - this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 6, featureSizeX - 1, 0, featureSizeZ - 1, Blocks.gravel, Blocks.air, false); - - return true; - } -} - - abstract static class Feature extends StructureComponent { - /** The size of the bounding box for this feature in the X axis */ - protected int featureSizeX; - /** The size of the bounding box for this feature in the Y axis */ - protected int featureSizeY; - /** The size of the bounding box for this feature in the Z axis */ - protected int featureSizeZ; - /** Average height? */ - protected int hpos = -1; - - - protected Feature() { - super(0); - } - - protected Feature(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) { - super(0); - this.featureSizeX = maxX; - this.featureSizeY = maxY; - this.featureSizeZ = maxZ; - this.coordBaseMode = rand.nextInt(4); - - switch(this.coordBaseMode) { - case 0: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - case 1: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); - break; - case 2: - //North (2) and East (3) will result in mirrored structures. Not an issue, but keep in mind. - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - case 3: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - break; - default: - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - - } - } - - /** Set to NBT */ - protected void func_143012_a(NBTTagCompound nbt) { - nbt.setInteger("Width", this.featureSizeX); - nbt.setInteger("Height", this.featureSizeY); - nbt.setInteger("Depth", this.featureSizeZ); - nbt.setInteger("HPos", this.hpos); - } - - /** Get from NBT */ - protected void func_143011_b(NBTTagCompound nbt) { - this.featureSizeX = nbt.getInteger("Width"); - this.featureSizeY = nbt.getInteger("Height"); - this.featureSizeZ = nbt.getInteger("Depth"); - this.hpos = nbt.getInteger("HPos"); - } - - protected boolean func_74935_a(World world, StructureBoundingBox box, int y) { - - int j = 0; - int k = 0; - - for(int l = this.boundingBox.minZ; l <= this.boundingBox.maxZ; l++) { - for(int i = this.boundingBox.minX; i <= this.boundingBox.maxX; i++) { - if(box.isVecInside(i, y, l)) { - j += Math.max(world.getTopSolidOrLiquidBlock(i, l), world.provider.getAverageGroundLevel()); - k++; - } - } - } - - if(k == 0) - return false; - - this.hpos = j / k; - this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0); - return true; - } - - /** - * Gets metadata for rotatable pillars. - * @param metadata (First two digits are equal to block metadata, other two are equal to orientation - * @return metadata adjusted for random orientation - */ - protected int getMetadataForRotatablePillar(int metadata) { - int blockMeta = metadata & 3; - int rotationMeta = metadata >> 2; - - if(rotationMeta == 0) - return metadata; - - if(this.coordBaseMode == 0 || this.coordBaseMode == 2) { //North & South - switch(rotationMeta) { - case 1: - rotationMeta = 4; - break; - case 2: - rotationMeta = 8; - break; - } - } else if(this.coordBaseMode == 1 || this.coordBaseMode == 3) { //East & West - switch(rotationMeta) { - case 1: - rotationMeta = 8; - break; - case 2: - rotationMeta = 4; - break; - } - } - - return blockMeta | rotationMeta; - } - - /** - * Gets metadata for rotatable DecoBlock - * @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West - * @return metadata adjusted for random orientation - */ - protected int getMetadataForRotatableDeco(int metadata) { - switch(this.coordBaseMode) { - case 0: //South - switch(metadata) { - case 2: - return 2; - case 3: - return 3; - case 4: - return 4; - case 5: - return 5; - } - case 1: //West - switch(metadata) { - case 2: - return 5; - case 3: - return 4; - case 4: - return 2; - case 5: - return 3; - } - case 2: //North - switch(metadata) { - case 2: - return 3; - case 3: - return 2; - case 4: - return 4; - case 5: - return 5; - } - case 3: //East - switch(metadata) { - case 2: - return 4; - case 3: - return 5; - case 4: - return 2; - case 5: - return 3; - } - } - return 0; - } - - /** - * it feels disgusting to make a method with this many parameters but fuck it, it's easier - * @return iron crate with generated content - */ - protected boolean generateIronCrateContents(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { - int posX = this.getXWithOffset(featureX, featureZ); - int posY = this.getYWithOffset(featureY); - int posZ = this.getZWithOffset(featureX, featureZ); - - this.placeBlockAtCurrentPosition(world, ModBlocks.crate_iron, 0, featureX, featureY, featureZ, box); - TileEntityCrateIron crate = (TileEntityCrateIron)world.getTileEntity(posX, posY, posZ); - - if(crate != null) { - WeightedRandomChestContent.generateChestContents(rand, content, crate, amount); - return true; - } - - return false; - } - } - - //Block Selectors - - static class Sandstone extends StructureComponent.BlockSelector { - - Sandstone() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance > 0.6F) { - this.field_151562_a = Blocks.sandstone; - } else if (chance < 0.5F ) { - this.field_151562_a = ModBlocks.reinforced_sand; - } else { - this.field_151562_a = Blocks.sand; - } - } - } - - static class ConcreteBricks extends StructureComponent.BlockSelector { - - ConcreteBricks() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance < 0.2F) { - this.field_151562_a = ModBlocks.brick_concrete; - } else if (chance < 0.55F) { - this.field_151562_a = ModBlocks.brick_concrete_mossy; - } else if (chance < 0.75F) { - this.field_151562_a = ModBlocks.brick_concrete_cracked; - } else { - this.field_151562_a = ModBlocks.brick_concrete_broken; - } - } - } - - static class LabTiles extends StructureComponent.BlockSelector { - - LabTiles() { } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - float chance = rand.nextFloat(); - - if(chance < 0.5F) { - this.field_151562_a = ModBlocks.tile_lab; - } else if (chance < 0.9F) { - this.field_151562_a = ModBlocks.tile_lab_cracked; - } else { - this.field_151562_a = ModBlocks.tile_lab_broken; - } - } - } - - static class SuperConcrete extends StructureComponent.BlockSelector { - - SuperConcrete() { - this.field_151562_a = ModBlocks.concrete_super; - } - - /** Selects blocks */ - @Override - public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { - this.selectedBlockMetaData = rand.nextInt(6) + 10; - - - } - } -} diff --git a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java index 9f26946be..7045891e0 100644 --- a/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/worldgen/MapGenNTMFeatures.java @@ -2,19 +2,30 @@ package com.hbm.world.worldgen; import java.util.Arrays; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Random; import com.hbm.config.GeneralConfig; +import com.hbm.config.StructureConfig; +import com.hbm.world.worldgen.components.CivilianFeatures.*; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures; +import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*; +import com.hbm.world.worldgen.components.OfficeFeatures.*; +import com.hbm.world.worldgen.components.RuinFeatures.*; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBeach; import net.minecraft.world.biome.BiomeGenMesa; import net.minecraft.world.gen.structure.MapGenStructure; +import net.minecraft.world.gen.structure.MapGenStructureIO; +import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureStart; public class MapGenNTMFeatures extends MapGenStructure { + //BiomeDictionary could be /very/ useful, since it automatically sorts *all* biomes into predefined categories private static List biomelist = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); /** Maximum distance between structures */ private int maxDistanceBetweenScatteredFeatures; @@ -22,8 +33,8 @@ public class MapGenNTMFeatures extends MapGenStructure { private int minDistanceBetweenScatteredFeatures; public MapGenNTMFeatures() { - this.maxDistanceBetweenScatteredFeatures = 24; - this.minDistanceBetweenScatteredFeatures = 8; + this.maxDistanceBetweenScatteredFeatures = StructureConfig.structureMaxChunks; + this.minDistanceBetweenScatteredFeatures = StructureConfig.structureMinChunks; } /** String ID for this MapGen */ @@ -97,51 +108,64 @@ public class MapGenNTMFeatures extends MapGenStructure { * chance/location fails for all other structures. Might not even be necessary, but whatever. * Rainfall & Temperature Check */ - + //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP if(rand.nextBoolean()) { //Empty Ruin Structures switch(rand.nextInt(4)) { case 0: - ComponentNTMFeatures.NTMRuin1 ruin1 = new ComponentNTMFeatures.NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin1 ruin1 = new NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin1); break; case 1: - ComponentNTMFeatures.NTMRuin2 ruin2 = new ComponentNTMFeatures.NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin2 ruin2 = new NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin2); break; case 2: - ComponentNTMFeatures.NTMRuin3 ruin3 = new ComponentNTMFeatures.NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin3 ruin3 = new NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin3); break; case 3: - ComponentNTMFeatures.NTMRuin4 ruin4 = new ComponentNTMFeatures.NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMRuin4 ruin4 = new NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(ruin4); } } else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMHouse1 house1 = new ComponentNTMFeatures.NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMHouse1 house1 = new NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(house1); } else { - ComponentNTMFeatures.NTMHouse2 house2 = new ComponentNTMFeatures.NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + NTMHouse2 house2 = new NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(house2); } - } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9) { //Taiga & Mega Taiga - if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMWorkshop1 workshop1 = new ComponentNTMFeatures.NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + + } else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9 && rand.nextBoolean()) { //Taiga & Mega Taiga + NTMWorkshop1 workshop1 = new NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); this.components.add(workshop1); - } + + } else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextInt(3) == 0) { //Everything except jungles, extra-hilly areas, and beaches + MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg + } else { //Everything else - if(rand.nextBoolean()) { - ComponentNTMFeatures.NTMLab2 lab2 = new ComponentNTMFeatures.NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); - this.components.add(lab2); - } else { - ComponentNTMFeatures.NTMLab1 lab1 = new ComponentNTMFeatures.NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); - this.components.add(lab1); + switch(rand.nextInt(3)) { + case 0: + NTMLab2 lab2 = new NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + this.components.add(lab2); break; + case 1: + NTMLab1 lab1 = new NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + this.components.add(lab1); break; + case 2: + LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + this.components.add(office); break; } } - if(GeneralConfig.enableDebugMode) - System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n"); + if(GeneralConfig.enableDebugMode) { + System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n[Debug] Components: "); + this.components.forEach((component) -> { + System.out.print(MapGenStructureIO.func_143036_a((StructureComponent) component) + " "); + }); + + System.out.print("\n"); + } this.updateBoundingBox(); } diff --git a/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java index 1205d04ac..01c7b7acc 100644 --- a/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/worldgen/NTMWorldGenerator.java @@ -2,7 +2,7 @@ package com.hbm.world.worldgen; import java.util.Random; -import com.hbm.config.GeneralConfig; +import com.hbm.config.StructureConfig; import cpw.mods.fml.common.IWorldGenerator; import net.minecraft.block.Block; @@ -39,12 +39,12 @@ public class NTMWorldGenerator implements IWorldGenerator { //WorldConfig.enableStructures /** Spawns structure starts. Utilizes canSpawnStructureAtCoords() + if else checks in Start constructor */ - if(GeneralConfig.enableDungeons) { + if(StructureConfig.enableStructures) { this.NTMFeatureGenerator.func_151539_a(chunkGenerator, world, chunkX, chunkZ, ablock); } /** Actually generates structures in a given chunk. */ - if(GeneralConfig.enableDungeons) { + if(StructureConfig.enableStructures) { this.NTMFeatureGenerator.generateStructuresInChunk(world, rand, chunkX, chunkZ); } } diff --git a/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java new file mode 100644 index 000000000..b18789236 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/CivilianFeatures.java @@ -0,0 +1,717 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBobble.BobbleType; +import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; +import com.hbm.lib.HbmChestContents; +import com.hbm.util.LootGenerator; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemDoor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +/* Described as "Civilian", as that's the overarching connection between all of these structures. Unlike the ruins, there's not enough to + * compartmentalize even further. Just in general many of the structures I consider lower-quality (except for the sandstone houses; those are actually pretty nice). + */ +public class CivilianFeatures { + + /** Sandstone Ruin 1 */ + public static class NTMHouse1 extends Feature { + + private boolean hasPlacedChest; + + private static Sandstone RandomSandstone = new Sandstone(); + + public NTMHouse1() { + super(); + } + + /** Constructor for this feature; takes coordinates for bounding box */ + public NTMHouse1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 9, 4, 6); + this.hasPlacedChest = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasChest", this.hasPlacedChest); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedChest = nbt.getBoolean("hasChest"); + } + + /** + * Generates structures. + */ + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + /* + * Places block at current position. Dependent on coordinate mode, i.e. will allow for random rotation, so use this instead of setBlock! + * this.placeBlockAtCurrentPosition(world, block, minX, metadata, x, y, z, box); + * Fills an area with air, self-explanatory. Use to clear interiors of unwanted blocks. + * this.fillWithAir(world, box, minX, minY, minZ, maxX, maxY, maxZ); + * Fills an area with blocks, self-explanatory. + * this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); + * Fills an area with metadata blocks, self-explanatory. + * this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockPlaceMeta, blockToReplace, replaceBlockMeta, alwaysReplace); + * Fills an area with randomized blocks, self-explanatory. + * this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, alwaysReplace, rand, StructureComponent.blockSelector); + * (BlockSelector is basically a list of blocks that can be randomly picked, except that it can actually be weighted) + * Replaces any air or water blocks with this block down. Useful for foundations + * this.func_151554_b(world, block, metadata, x, startAtY, z, box + * Fills an area with blocks randomly - look into randLimit? + * this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace); + */ + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.sandstone, 0, 0, 0, sizeX, sizeZ, -1, box); + + //Walls + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, 1, 0, 1, 1, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 1, 0, box); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 5, 1, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 1, 0, box); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 1, 0, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX, 1, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 2, 0, sizeX - 2, 2, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 0, 1, sizeZ, false, rand, RandomSandstone); //Left Wall + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 0, 2, 1, box); + this.fillWithMetadataBlocks(world, box, 0, 2, 3, 0, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, 3, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 3, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithMetadataBlocks(world, box, 4, 2, sizeZ, 5, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 2, 2, sizeZ, box); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 0, sizeX, 0, sizeZ, false, rand, RandomSandstone); //Right Wall + this.randomlyFillWithBlocks(world, box, rand, 0.65F, sizeX, 1, 1, sizeX, 1, sizeZ - 1, Blocks.sand, Blocks.air, false); + + this.fillWithRandomizedBlocks(world, box, 4, 0, 1, 4, 1, 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, ModBlocks.reinforced_sand, 0, 4, 0, 4, box); + + //Loot/Sand + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 1, 0, 1, box); + if(!this.hasPlacedChest) + this.hasPlacedChest = this.generateStructureChestContents(world, box, rand, 3, 0, 1, HbmChestContents.modGeneric, rand.nextInt(2) + 8); + this.fillWithBlocks(world, box, 5, 0, 1, 6, 0, 1, ModBlocks.crate, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, Blocks.sand, 0, 7, 0, 1, box); + if(rand.nextFloat() <= 0.25) + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_metal, 0, sizeX - 1, 0, 1, box); + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 2, 3, 0, sizeZ - 1, Blocks.sand, Blocks.air, false); + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 5, 0, 2, sizeX - 1, 0, sizeZ - 1, Blocks.sand, Blocks.air, false); + + return true; + } + + } + + public static class NTMHouse2 extends Feature { + + private static Sandstone RandomSandstone = new Sandstone(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMHouse2() { + super(); + } + + public NTMHouse2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 15, 5, 9); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.print(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.sandstone, 0, 0, 0, 6, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.sandstone, 0, 9, 0, sizeX, sizeZ, -1, box); + + this.fillWithAir(world, box, 1, 0, 1, 5, sizeY, sizeZ - 1); + + //House 1 + this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 6, 1, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, 2, 0, 1, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, 3, 2, 0, 3, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, 5, 2, 0, 6, 2, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 3, 0, 6, 3, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 3, sizeZ, false, rand, RandomSandstone); //Left Wall + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 6, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 1, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithBlocks(world, box, 2, 2, sizeZ, 4, 2, sizeZ, Blocks.fence, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 5, 2, sizeZ, 6, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 1, 3, sizeZ, 6, 3, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 1, 6, 3, sizeZ - 1, false, rand, RandomSandstone); //Right Wall + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 2, 6, 0, sizeZ - 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 3, sizeZ - 2, 6, 3, sizeZ - 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, 6, 0, 1, 6, 3, sizeZ - 3, false, rand, RandomSandstone); + + this.fillWithBlocks(world, box, 1, 0, 1, 5, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor + //this.fillWithRandomizedBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, false, rand, RandomSandstone); //Ceiling + this.fillWithBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, Blocks.sandstone, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 0, sizeY - 1, 0, 0, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); //Roof + this.fillWithMetadataBlocks(world, box, 6, sizeY - 1, 0, 6, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 2, sizeY, 0, 4, sizeY, 0, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, sizeY, 1, 3, sizeY, 2, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, sizeY, 4, 3, sizeY, 6, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 3, sizeY, sizeZ - 1, box); + this.fillWithMetadataBlocks(world, box, 2, sizeY, sizeZ, 4, sizeY, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); + + //House 2 + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 1, 0, sizeX - 2, 1, 0, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 0, sizeX - 6, 2, 0, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, 2, 0, box); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 3, 2, 0, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 1, sizeX - 6, 3, 1, false, rand, RandomSandstone); //Left Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 3, 2, sizeX - 6, 3, sizeZ - 1, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, sizeY - 1, 2, box); + this.fillWithMetadataBlocks(world, box, sizeX - 6, sizeY - 1, 4, sizeX - 6, sizeY - 1, sizeZ - 2, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 3, sizeX - 6, 1, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 3, sizeX - 6, 2, 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, sizeX - 6, 2, 4, box); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 5, sizeX - 6, 2, 5, false, rand, RandomSandstone); + this.fillWithBlocks(world, box, sizeX - 6, 2, sizeZ - 3, sizeX - 6, 2, sizeZ - 2, Blocks.fence, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, sizeZ - 1, sizeX - 6, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 5, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone); //Front Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 5, 2, sizeZ, sizeX - 5, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX, 2, sizeZ, false, rand, RandomSandstone); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, false, rand, RandomSandstone); //Right Wall + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 1, 3, false, rand, RandomSandstone); + this.fillWithMetadataBlocks(world, box, sizeX, 1, 4, sizeX, 1, 5, Blocks.stone_slab, 1, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 1, sizeZ - 3, false, rand, RandomSandstone); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX, 1, sizeZ - 1, box); + + this.fillWithBlocks(world, box, sizeX - 5, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor + + //Loot & Decorations + //House 1 + int eastMeta = this.getDecoMeta(4); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box); + this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, sizeY, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 2, 1, 3, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, 1, 1, sizeZ - 4, box); + if(!hasPlacedLoot[0]) { + this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), 1, 1, sizeZ - 2, box); + WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.machineParts, (TileEntityChest)world.getTileEntity(this.getXWithOffset(1, sizeZ - 2), + this.getYWithOffset(1), this.getZWithOffset(1, sizeZ - 2)), 10); + this.hasPlacedLoot[0] = true; + } + this.fillWithBlocks(world, box, 4, 1, sizeZ - 1, 5, 1, sizeZ - 1, ModBlocks.crate, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 1, 4, 5, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 5, 1, 6, 5, 3, 6, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_grate, 7, 5, 1, 5, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 5, 2, 5, box); + + //House 2 + if(!hasPlacedLoot[1]) { + this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), sizeX - 5, 1, 1, box); + WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.antenna, (TileEntityChest)world.getTileEntity(this.getXWithOffset(sizeX - 5, 1), + this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 1)), 10); + this.hasPlacedLoot[1] = true; + } + this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 5, 1, 4, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 5, 4), this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 4)); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, sizeX - 4, 1, 1, sizeX - 1, 1, sizeZ - 1, Blocks.sand, Blocks.air, false); + + return true; + } + } + + public static class NTMLab1 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + private static LabTiles RandomLabTiles = new LabTiles(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMLab1() { + super(); + } + + /** Constructor for this feature; takes coordinates for bounding box */ + public NTMLab1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 9, 4, 7); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ - 2, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 3, 6, sizeX, sizeZ, -1, box); + + if(this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box) == Blocks.air) { + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 2, sizeZ - 1, 2, sizeZ - 1, -1, box); + this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0), 2, 0, sizeZ - 1, box); + } + + this.fillWithAir(world, box, 1, 0, 1, sizeX - 1, sizeY, 4); + this.fillWithAir(world, box, 4, 0, 4, sizeX - 1, sizeY, sizeZ - 1); + this.fillWithAir(world, box, 3, 1, sizeZ - 1, 3, 2, sizeZ - 1); + + int pillarMeta = this.getPillarMeta(8); + + //Pillars + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, 4, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false); + this.fillWithBlocks(world, box, 0, 0, sizeZ - 2, 0, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 0, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + + //Walls + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, sizeY - 1, 0, false, rand, RandomConcreteBricks); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, sizeX, sizeY, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, sizeY - 1, 4, false, rand, RandomConcreteBricks); //Left Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, 0, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 2, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks); //Front Wall Pt. 1 + this.placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete_broken, 0, 3, sizeY, sizeZ - 2, box); + this.fillWithRandomizedBlocks(world, box, 3, sizeY - 1, sizeZ - 1, 3, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ, sizeX - 1, 1, sizeZ, false, rand, RandomConcreteBricks); //Front Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, 4, 2, sizeZ, 4, 3, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 3, sizeZ, false, rand, RandomConcreteBricks); + this.randomlyFillWithBlocks(world, box, rand, 0.75F, 5, 2, sizeZ, sizeX - 2, 3, sizeZ, Blocks.glass_pane, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 3, sizeY, sizeZ, sizeX, sizeY, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks); //Right Wall + + //Floor & Ceiling + this.fillWithRandomizedBlocks(world, box, 1, 0, 1, sizeX - 1, 0, 4, false, rand, RandomLabTiles); //Floor + this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ - 2, sizeX - 1, 0, sizeZ - 1, false, rand, RandomLabTiles); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 3, 0, sizeZ - 1, box); + + this.fillWithBlocks(world, box, 1, sizeY - 1, 1, 1, sizeY, 4, ModBlocks.reinforced_glass, Blocks.air, false); //Ceiling + this.fillWithBlocks(world, box, 2, sizeY, 1, sizeX - 1, sizeY, 4, ModBlocks.brick_light, Blocks.air, false); + this.fillWithBlocks(world, box, 4, sizeY, sizeZ - 2, sizeX - 1, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); + + //Decorations & Loot + this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false); + int westDecoMeta = this.getDecoMeta(5); + this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 2, sizeY - 1, 1, 2, sizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false); + for(byte i = 0; i < 4; i++) { + this.placeBlockAtCurrentPosition(world, ModBlocks.plant_flower, i, 1, 2, 1 + i, box); + } + + int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 2); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, sizeZ - 1, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, sizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, sizeZ - 1), doorMeta, ModBlocks.door_office); + + int northDecoMeta = this.getDecoMeta(3); + this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 2, sizeX - 1, sizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_microwave, northDecoMeta, 5, 2, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, 6, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_shredder, 0, sizeX - 2, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, sizeX - 1, 1, 1, box); + this.fillWithBlocks(world, box, 5, 1, 3, sizeX - 1, 1, 3, ModBlocks.deco_titanium, Blocks.air, false); + if(!hasPlacedLoot[0]) { + this.placeBlockAtCurrentPosition(world, ModBlocks.deco_loot, 0, 6, 2, 3, box); + LootGenerator.lootMedicine(world, this.getXWithOffset(6, 3), this.getYWithOffset(2), this.getZWithOffset(6, 3)); + this.hasPlacedLoot[0] = true; + } + + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, sizeX - 1, 1, sizeZ - 2, box); + if(!hasPlacedLoot[1]) { + this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 1, 1, sizeZ - 1, HbmChestContents.modGeneric, 8); + } + + return true; + } + } + + public static class NTMLab2 extends Feature { + + private static SuperConcrete RandomSuperConcrete = new SuperConcrete(); + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + private static LabTiles RandomLabTiles = new LabTiles(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public NTMLab2() { + super(); + } + + public NTMLab2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 12, 11, 8); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + this.boundingBox.offset(0, -7, 0); + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ - 2, 6, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 7, 6, sizeZ, 6, box); + + if(this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box) == Blocks.air) { + int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX - 3, 7, sizeX - 2, 7, sizeY - 4, box); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 4, 7, sizeX - 2, sizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false); + } + + + this.fillWithAir(world, box, 1, sizeY - 4, 1, sizeX - 1, sizeY, sizeZ - 3); + this.fillWithAir(world, box, 1, sizeY - 4, sizeZ - 2, 5, sizeY, sizeZ - 1); + this.fillWithAir(world, box, sizeX - 3, sizeY - 3, sizeZ - 2, sizeX - 2, sizeY - 2, sizeZ - 2); + this.fillWithAir(world, box, 5, 5, 1, 6, 6, 2); + this.fillWithAir(world, box, 2, 0, 2, sizeX - 2, 3, sizeZ - 2); + + //Walls + this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, sizeX, sizeY, 0, false, rand, RandomSuperConcrete); //Back Wall + this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, 0, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Left Wall + this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, sizeZ, 5, sizeY - 4, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 1 + this.fillWithBlocks(world, box, 1, sizeY - 3, sizeZ, 1, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, sizeY - 4, sizeZ, 2, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, sizeY - 3, sizeZ, 3, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ, 4, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 5, sizeY - 3, sizeZ, 5, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, sizeY, sizeZ, 5, sizeY, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 1, 6, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 2 + this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 2, 7, sizeY - 2, sizeZ - 2, false, rand, RandomSuperConcrete); //Front Wall pt. 3 + this.fillWithBlocks(world, box, 6, sizeY - 1, sizeZ - 2, 7, sizeY - 1, sizeZ - 2, ModBlocks.concrete_super_broken, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, sizeZ - 2, sizeX, sizeY - 4, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 3, sizeZ - 2, sizeX - 4, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 1, sizeZ - 2, sizeX - 2, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY - 4, sizeZ - 2, sizeX, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 4, 1, sizeX, sizeY - 4, sizeZ - 3, false, rand, RandomSuperConcrete); //Right Wall + this.fillWithBlocks(world, box, sizeX, sizeY - 3, sizeZ - 3, sizeX, sizeY - 1, sizeZ - 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 4, sizeX, sizeY - 1, 4, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, sizeX, sizeY - 3, 3, sizeX, sizeY - 1, 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 2, sizeX, sizeY - 1, 2, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, sizeX, sizeY - 3, 1, sizeX, sizeY - 1, 1, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, sizeY, 1, sizeX, sizeY, sizeZ - 3, false, rand, RandomSuperConcrete); + + this.fillWithBlocks(world, box, 1, 0, 1, sizeX - 1, 3, 1, ModBlocks.reinforced_stone, Blocks.air, false); //Back Wall + this.fillWithBlocks(world, box, 1, 0, 2, 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Left Wall + this.fillWithBlocks(world, box, 1, 0, sizeZ - 1, sizeX - 1, 3, sizeZ - 1, ModBlocks.reinforced_stone, Blocks.air, false); //Front Wall + this.fillWithBlocks(world, box, sizeX - 1, 0, 2, sizeX - 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); // Right Wall + this.fillWithBlocks(world, box, 6, 0, 3, 6, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Internal Wall + + //Floors & Ceiling + this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, 1, 3, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles); //Left Floor + this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ - 2, 5, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, 1, sizeX - 1, sizeY - 4, sizeZ - 3, false, rand, RandomLabTiles); //Right Floor + this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 4, sizeZ - 2, sizeX - 2, sizeY - 4, sizeZ - 2, false, rand, RandomLabTiles); + this.fillWithBlocks(world, box, 4, sizeY - 4, 1, 7, sizeY - 4, 1, ModBlocks.tile_lab_broken, Blocks.air, false); //Center Floor (Pain) + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 4, sizeY - 4, 2, box); + this.fillWithBlocks(world, box, 4, sizeY - 4, 3, 4, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 5, sizeY - 4, 3, box); + this.fillWithBlocks(world, box, 5, sizeY - 4, 4, 5, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 6, sizeY - 4, 4, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 6, sizeY - 4, 5, box); + this.fillWithBlocks(world, box, 7, sizeY - 4, 2, 7, sizeY - 4, 3, ModBlocks.tile_lab_broken, Blocks.air, false); + this.fillWithBlocks(world, box, 7, sizeY - 4, 4, 7, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false); + + this.fillWithBlocks(world, box, 1, sizeY, 1, 2, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Left Ceiling + this.fillWithBlocks(world, box, 3, sizeY, sizeZ - 2, 4, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); + this.fillWithBlocks(world, box, sizeX - 3, sizeY, 1, sizeX - 1, sizeY, sizeZ - 3, ModBlocks.brick_light, Blocks.air, false); //Right Ceiling + this.fillWithBlocks(world, box, 3, sizeY, 1, 8, sizeY, 1, ModBlocks.waste_planks, Blocks.air, false); //Center Ceiling (Pain) + this.fillWithBlocks(world, box, 3, sizeY, 2, 4, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 7, sizeY, 2, 8, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 3, sizeY, 3, 3, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 4, sizeY, 4, 4, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 5, sizeY, 6, 5, sizeY, sizeZ - 1, ModBlocks.waste_planks, Blocks.air, false); + this.fillWithBlocks(world, box, 8, sizeY, 3, 8, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false); + + this.fillWithRandomizedBlocks(world, box, 2, 0, 2, 5, 0, sizeZ - 2, false, rand, RandomLabTiles); //Floor + this.fillWithRandomizedBlocks(world, box, 6, 0, 2, 6, 0, 3, false, rand, RandomLabTiles); + this.fillWithRandomizedBlocks(world, box, 7, 0, 2, sizeX - 2, 0, sizeZ - 2, false, rand, RandomLabTiles); + + this.fillWithRandomizedBlocks(world, box, 1, 4, 1, sizeX - 1, 4, sizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling + + //Decorations & Loot + int eastMeta = this.getDecoMeta(4); + int westMeta = this.getDecoMeta(5); + int northMeta = this.getDecoMeta(3); + int southMeta = this.getDecoMeta(2); + this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, sizeY - 2, 3, box); + + int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 3, sizeY - 3, sizeZ - 2, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 3, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 3, sizeZ - 2), + doorMeta, ModBlocks.door_office); + this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 2, sizeY - 3, sizeZ - 2, box); + ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 2, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 2, sizeZ - 2), + doorMeta, ModBlocks.door_office); + + this.fillWithBlocks(world, box, 1, sizeY - 3, 1, 1, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 1, sizeY - 3, 2, 1, sizeY - 2, 3, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, westMeta, 1, sizeY - 1, 2, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, 1, sizeY - 1, 3, box); + this.fillWithBlocks(world, box, 1, sizeY - 3, 6, 1, sizeY - 1, 6, ModBlocks.deco_pipe_framed_rusted, Blocks.air, false); + + this.fillWithMetadataBlocks(world, box, sizeX - 4, sizeY - 3, 1, sizeX - 4, sizeY - 1, 1, ModBlocks.steel_wall, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 1, 1, sizeX - 2, sizeY - 1, 1, ModBlocks.steel_grate, 0, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 2, 1, sizeX - 2, sizeY - 2, 1, ModBlocks.tape_recorder, northMeta, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX - 3, sizeY - 3, 1, sizeX - 2, sizeY - 3, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, sizeX - 1, sizeY - 3, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + + this.fillWithMetadataBlocks(world, box, 2, 1, 2, 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.vitrified_barrel, 0, 2, 2, 2, box); + this.fillWithMetadataBlocks(world, box, 3, 1, 2, 3, 3, 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, 1, 4, 3, 3, 4, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 3, 1, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 4, 1, sizeZ - 2, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.crate_lead, 0, 4, 2, sizeZ - 2, box); + if(!hasPlacedLoot[0]) { + this.hasPlacedLoot[0] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 5, 1, sizeZ - 2, HbmChestContents.nuclearFuel, 10); + } + this.fillWithBlocks(world, box, 4, 1, sizeZ - 3, 5, 1, sizeZ - 3, ModBlocks.crate_lead, Blocks.air, false); + + this.fillWithBlocks(world, box, sizeX - 5, 1, sizeZ - 2, sizeX - 5, 3, sizeZ - 2, ModBlocks.deco_steel, Blocks.air, false);; + this.fillWithMetadataBlocks(world, box, sizeX - 4, 1, sizeZ - 2, sizeX - 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 4, 2, sizeZ - 2, sizeX - 3, 2, sizeZ - 2, ModBlocks.tape_recorder, southMeta, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, sizeX - 2, 2, sizeZ - 2, box); + this.fillWithBlocks(world, box, sizeX - 4, 3, sizeZ - 2, sizeX - 2, 3, sizeZ - 2, ModBlocks.steel_roof, Blocks.air, false); + if(!hasPlacedLoot[1]) { + this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 2, 1, 3, HbmChestContents.nukeTrash, 9); + } + + return true; + } + } + + public static class NTMWorkshop1 extends Feature { + + private static SuperConcrete RandomSuperConcrete = new SuperConcrete(); + + private boolean hasPlacedLoot; + + public NTMWorkshop1() { + super(); + } + + public NTMWorkshop1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 10, 6, 8); + this.hasPlacedLoot = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot", this.hasPlacedLoot); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot = nbt.getBoolean("hasLoot"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + ////System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, sizeX - 3, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.dirt, 0, 8, 1, sizeX, 6, -1, box); + + this.fillWithAir(world, box, 1, 0, 0, sizeX - 3, sizeY - 2, sizeZ); + this.fillWithAir(world, box, sizeX - 2, 0, 2, sizeX - 1, 2, 5); + + if(this.getBlockAtCurrentPosition(world, 0, 0, 5, box).getMaterial().isReplaceable() + || this.getBlockAtCurrentPosition(world, 0, 0, 5, box) == Blocks.air) { + int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1); + this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 1, 0, sizeZ - 1, -1, box); + + this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false); + } + + //Walls + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); + this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box); + this.fillWithMetadataBlocks(world, box, 2, 4, 0, sizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, 0, box); + this.fillWithBlocks(world, box, sizeX - 3, 0, 0, sizeX - 3, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, 0, 0, sizeX - 4, 1, 0, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 2, 0, 2, 2, 0, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, 2, 0, 5, 2, 0, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, 0, sizeX - 4, 2, 0, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 3, 0, sizeX - 4, 3, 0, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, 1, 4, 1, 1, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, sizeZ, box); + this.fillWithBlocks(world, box, 1, 0, sizeZ, 1, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 1, 1, 1, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 2, 1, 1, 2, 1, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 1, 2, 2, 1, 2, 3, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 2, 4, 1, 2, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 3, 1, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, 2, 4, sizeZ, sizeX - 4, 4, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, sizeZ, box); + this.fillWithBlocks(world, box, sizeX - 3, 0, sizeZ, sizeX - 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 2, 0, sizeZ, sizeX - 4, 1, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 2, sizeZ, 2, 2, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithBlocks(world, box, 3, 2, sizeZ, 5, 2, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, sizeZ, sizeX - 4, 2, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 3, sizeZ, sizeX - 4, 3, sizeZ, false, rand, RandomSuperConcrete); + this.fillWithMetadataBlocks(world, box, sizeX - 3, 4, 1, sizeX - 3, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithRandomizedBlocks(world, box, sizeX - 3, 0, 1, sizeX - 3, 3, sizeZ - 1, false, rand, RandomSuperConcrete); + + pillarMetaWE = this.getPillarMeta(5); + pillarMetaNS = this.getPillarMeta(9); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 1, sizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall + this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 1, sizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 2, 2, sizeX, 2, 5, Blocks.log, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithMetadataBlocks(world, box, sizeX, 0, 6, sizeX, 2, 6, Blocks.log, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX, 0, 3, sizeX, 1, 5, Blocks.planks, 1, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 6, sizeX - 1, 2, 6, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 6, sizeX - 1, 1, 6, Blocks.planks, 1, Blocks.air, 0, false); + + //Floor & Ceiling + this.fillWithBlocks(world, box, 2, 0, 1, 6, 0, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Floor + this.placeBlockAtCurrentPosition(world, ModBlocks.brick_light, 0, 1, 0, 5, box); + this.fillWithRandomizedBlocks(world, box, 2, 4, 1, 6, 4, 3, false, rand, RandomSuperConcrete); //Ceiling + this.fillWithRandomizedBlocks(world, box, 2, 4, 4, 2, 4, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 5, 4, 4, 6, 4, 4, false, rand, RandomSuperConcrete); + this.fillWithRandomizedBlocks(world, box, 2, 4, sizeZ - 3, 6, 4, sizeZ - 1, false, rand, RandomSuperConcrete); + + this.fillWithBlocks(world, box, sizeX - 2, 2, 2, sizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false); + + //Loot & Decorations + int southMeta = this.getDecoMeta(2); + int eastMeta = this.getDecoMeta(5); + this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, sizeY - 1, 1, box); + this.fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithBlocks(world, box, 2, sizeY - 1, 2, 4, sizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false); + this.fillWithBlocks(world, box, 2, sizeY, 1, 4, sizeY, 2, ModBlocks.steel_roof, Blocks.air, false); + this.fillWithBlocks(world, box, 2, 1, 1, 2, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 1, 1, 3, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_generator, 0, 4, 1, 1, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.machine_detector, 0, 4, 1, 2, box); + this.fillWithBlocks(world, box, 5, 1, 1, 5, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false); + this.fillWithBlocks(world, box, 6, 1, 1, 6, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false); + this.fillWithBlocks(world, box, 3, 1, 4, 4, 1, 4, ModBlocks.concrete_super_broken, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 6, 1, 4, 6, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false); + this.fillWithMetadataBlocks(world, box, 6, 1, 5, 6, 1, 7, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.radiorec, eastMeta, 6, 2, sizeZ - 1, box); + this.fillWithMetadataBlocks(world, box, 2, 1, sizeZ - 1, 3, 1, sizeZ - 1, ModBlocks.machine_electric_furnace_off, southMeta, Blocks.air, 0, false); + if(!hasPlacedLoot) { + this.hasPlacedLoot = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 4, 1, sizeZ - 1, HbmChestContents.machineParts, 11); + } + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 5, 3, 1, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 2, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 2, 5, box); + + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 5, sizeX - 1, 0, 5, ModBlocks.steel_grate, 7, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, southMeta, sizeX - 2, 1, 5, box); + this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 1, 1, 5, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 1, 5), this.getYWithOffset(1), this.getZWithOffset(sizeX - 1, 5)); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 2, sizeX - 2, 0, 3, Blocks.log, pillarMetaWE, Blocks.air, 0, false); + this.placeBlockAtCurrentPosition(world, Blocks.log, pillarMetaWE, sizeX - 2, 1, 2, box); + this.placeBlockAtCurrentPosition(world, Blocks.web, 0, sizeX - 2, 1, 3, box); + + return true; + } + } + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/Feature.java b/src/main/java/com/hbm/world/worldgen/components/Feature.java new file mode 100644 index 000000000..ceffa9eca --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/Feature.java @@ -0,0 +1,513 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockBobble.BobbleType; +import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; +import com.hbm.config.StructureConfig; +import com.hbm.lib.HbmChestContents; +import com.hbm.tileentity.machine.TileEntityLockableBase; +import com.hbm.tileentity.machine.storage.TileEntityCrateIron; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemDoor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraft.world.gen.structure.StructureComponent; + +abstract public class Feature extends StructureComponent { + /** The size of the bounding box for this feature in the X axis */ + protected int sizeX; + /** The size of the bounding box for this feature in the Y axis */ + protected int sizeY; + /** The size of the bounding box for this feature in the Z axis */ + protected int sizeZ; + /** Average height (Presumably stands for height position) */ + protected int hpos = -1; + + protected Feature() { + super(0); + } + + protected Feature(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) { + super(0); + this.sizeX = maxX; + this.sizeY = maxY; + this.sizeZ = maxZ; + this.coordBaseMode = rand.nextInt(4); + + switch(this.coordBaseMode) { + case 0: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + break; + case 1: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); + break; + case 2: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + break; + case 3: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX); + break; + default: + this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); + + } + } + + /** Set to NBT */ + protected void func_143012_a(NBTTagCompound nbt) { + nbt.setInteger("Width", this.sizeX); + nbt.setInteger("Height", this.sizeY); + nbt.setInteger("Depth", this.sizeZ); + nbt.setInteger("HPos", this.hpos); + } + + /** Get from NBT */ + protected void func_143011_b(NBTTagCompound nbt) { + this.sizeX = nbt.getInteger("Width"); + this.sizeY = nbt.getInteger("Height"); + this.sizeZ = nbt.getInteger("Depth"); + this.hpos = nbt.getInteger("HPos"); + } + + protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) { + + int total = 0; + int iterations = 0; + + for(int z = this.boundingBox.minZ; z <= this.boundingBox.maxZ; z++) { + for(int x = this.boundingBox.minX; x <= this.boundingBox.maxX; x++) { + if(box.isVecInside(x, y, z)) { + total += Math.max(world.getTopSolidOrLiquidBlock(x, z), world.provider.getAverageGroundLevel()); + iterations++; + } + } + } + + if(iterations == 0) + return false; + + this.hpos = total / iterations; //finds mean of every block in bounding box + this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0); + return true; + } + + /** Metadata for Decoration Methods **/ + + /** + * Gets metadata for rotatable pillars. + * @param metadata (First two digits are equal to block metadata, other two are equal to orientation + * @return metadata adjusted for random orientation + */ + protected int getPillarMeta(int metadata) { + if(this.coordBaseMode % 2 != 0 && this.coordBaseMode != -1) + metadata = metadata ^ 12; + + return metadata; + } + + /** + * Gets metadata for rotatable DecoBlock + * honestly i don't remember how i did this and i'm scared to optimize it because i fail to see any reasonable patterns like the pillar + * seriously, 3 fucking bits for 4 orientations when you can do it easily with 2? + * @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West + */ + protected int getDecoMeta(int metadata) { + switch(this.coordBaseMode) { + case 0: //South + switch(metadata) { + case 2: return 2; + case 3: return 3; + case 4: return 4; + case 5: return 5; + } + case 1: //West + switch(metadata) { + case 2: return 5; + case 3: return 4; + case 4: return 2; + case 5: return 3; + } + case 2: //North + switch(metadata) { + case 2: return 3; + case 3: return 2; + case 4: return 5; + case 5: return 4; + } + case 3: //East + switch(metadata) { + case 2: return 4; + case 3: return 5; + case 4: return 3; + case 5: return 2; + } + } + return 0; + } + + /** + * Get orientation-offset metadata for BlockDecoModel + * @param metadata (0 for facing North, 1 for facing South, 2 for facing West, 3 for facing East) + */ + protected int getDecoModelMeta(int metadata) { + //N: 0b00, S: 0b01, W: 0b10, E: 0b11 + + switch(this.coordBaseMode) { + default: //South + break; + case 1: //West + if((metadata & 3) < 2) //N & S can just have bits toggled + metadata = metadata ^ 3; + else //W & E can just have first bit set to 0 + metadata = metadata ^ 2; + break; + case 2: //North + metadata = metadata ^ 1; //N, W, E & S can just have first bit toggled + break; + case 3: //East + if((metadata & 3) < 2)//N & S can just have second bit set to 1 + metadata = metadata ^ 2; + else //W & E can just have bits toggled + metadata = metadata ^ 3; + break; + } + + return metadata; + } + + /** + * Gets orientation-adjusted meta for stairs. + * 0 = West, 1 = East, 2 = North, 3 = South + */ + protected int getStairMeta(int metadata) { + switch(this.coordBaseMode) { + default: //South + break; + case 1: //West + if((metadata & 3) < 2) //Flip second bit for E/W + metadata = metadata ^ 2; + else + metadata = metadata ^ 3; //Flip both bits for N/S + break; + case 2: //North + metadata = metadata ^ 1; //Flip first bit + break; + case 3: //East + if((metadata & 3) < 2) //Flip both bits for E/W + metadata = metadata ^ 3; + else //Flip second bit for N/S + metadata = metadata ^ 2; + break; + } + + return metadata; + } + + /* For Later: + * 0/S: S->S; W->W; N->N; E->E + * 1/W: S->W; W->N; N->E; E->S + * 2/N: S->N; W->E; N->S; E->W + * 3/E: S->E; W->S; N->W; E->N + * 0/b00/W, 1/b01/N, 2/b10/E, 3/b11/S + */ + /** + * Places door at specified location with orientation-adjusted meta + * 0 = West, 1 = North, 2 = East, 3 = South + */ + protected void placeDoor(World world, StructureBoundingBox box, Block door, int meta, int featureX, int featureY, int featureZ) { + switch(this.coordBaseMode) { + default: + break; + case 1: + meta = (meta + 1) % 4; break; + case 2: + meta = meta ^ 2; break; //Flip second bit + case 3: + meta = (meta - 1) % 4; break; + } + + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, door, meta, featureX, featureY, featureZ, box); + ItemDoor.placeDoorBlock(world, posX, posY, posZ, meta, door); + } + + /** Loot Methods **/ + + /** + * it feels disgusting to make a method with this many parameters but fuck it, it's easier + * @return TE implementing IInventory with randomized contents + */ + protected boolean generateInvContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box); + IInventory inventory = (IInventory)world.getTileEntity(posX, posY, posZ); + + if(inventory != null) { + amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); + WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); + return true; + } + + return false; + } + + + /** + * Block TE MUST extend TileEntityLockableBase, otherwise this will not work and crash! + * @return TE implementing IInventory and extending TileEntityLockableBase with randomized contents + lock + */ + protected boolean generateLockableContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, + WeightedRandomChestContent[] content, int amount, double mod) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box); + TileEntity tile = world.getTileEntity(posX, posY, posZ); + TileEntityLockableBase lock = (TileEntityLockableBase) tile; + IInventory inventory = (IInventory) tile; + + if(inventory != null && lock != null) { + lock.setPins(rand.nextInt(999) + 1); + lock.setMod(mod); + lock.lock(); + + amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); + WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); + return true; + } + + return false; + } + + protected void generateLoreBook(World world, StructureBoundingBox box, int featureX, int featureY, int featureZ, int slot, String key) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + IInventory inventory = (IInventory) world.getTileEntity(posX, posY, posZ); + + if(inventory != null) { + ItemStack book = HbmChestContents.genetateBook(key); + + inventory.setInventorySlotContents(slot, book); + } + } + + /** + * Places random bobblehead with a randomized orientation at specified location + */ + protected void placeRandomBobble(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box); + TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ); + + if(bobble != null) { + bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; + bobble.markDirty(); + } + } + + /** Block Placement Utility Methods **/ + + /** + * Places blocks underneath location until reaching a solid block; good for foundations + */ + protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int minX, int minZ, int maxX, int maxZ, int featureY, StructureBoundingBox box) { + + for(int featureX = minX; featureX <= maxX; featureX++) { + for(int featureZ = minZ; featureZ <= maxZ; featureZ++) { + int posX = this.getXWithOffset(featureX, featureZ); + int posY = this.getYWithOffset(featureY); + int posZ = this.getZWithOffset(featureX, featureZ); + + if(box.isVecInside(posX, posY, posZ)) { + Block block = world.getBlock(posX, posY, posZ); + int brake = 0; + + while ((world.isAirBlock(posX, posY, posZ) || + !block.getMaterial().isSolid() || + (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && + posY > 1 && brake <= 15) { + world.setBlock(posX, posY, posZ, placeBlock, meta, 2); + block = world.getBlock(posX, --posY, posZ); + + brake++; + } + } + } + } + } + + /** + * Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids. + * Useful for stuff like fences and walls most likely. + */ + protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) { + + for(int x = minX; x <= maxX; x++) { + for(int z = minZ; z <= maxZ; z++) { + int posX = this.getXWithOffset(x, z); + int posZ = this.getZWithOffset(x, z); + int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ); + + if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) { + + for(int i = 0; i < height; i++) { + int posY = topHeight + i; + + world.setBlock(posX, posY, posZ, block, 0, 2); + } + } + } + } + } + + /** getXWithOffset & getZWithOffset Methods that are actually fixed **/ + //Turns out, this entire time every single minecraft structure is mirrored instead of rotated when facing East and North + //Also turns out, it's a scarily easy fix that they somehow didn't see *entirely* + @Override + protected int getXWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minX + x; + case 1: + return this.boundingBox.maxX - z; + case 2: + return this.boundingBox.maxX - x; + case 3: + return this.boundingBox.minX + z; + default: + return x; + } + } + + @Override + protected int getZWithOffset(int x, int z) { + switch(this.coordBaseMode) { + case 0: + return this.boundingBox.minZ + z; + case 1: + return this.boundingBox.minZ + x; + case 2: + return this.boundingBox.maxZ - z; + case 3: + return this.boundingBox.maxZ - x; + default: + return x; + } + } + + /** Methods that remove the replaceBlock and alwaysReplace, and other parameters: as they are useless and only serve as a time sink normally. */ + + protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { + this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, block, false); + } + + protected void fillWithMetadataBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta) { + this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, meta, block, meta, false); + } + + protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { + this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, block, block, false); + } + + protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector) { + this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, false, rand, selector); + } + + /** Block Selectors **/ + + static class Sandstone extends StructureComponent.BlockSelector { + + Sandstone() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance > 0.6F) { + this.field_151562_a = Blocks.sandstone; + } else if (chance < 0.5F ) { + this.field_151562_a = ModBlocks.reinforced_sand; + } else { + this.field_151562_a = Blocks.sand; + } + } + } + + static class ConcreteBricks extends StructureComponent.BlockSelector { + + ConcreteBricks() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance < 0.2F) { + this.field_151562_a = ModBlocks.brick_concrete; + } else if (chance < 0.55F) { + this.field_151562_a = ModBlocks.brick_concrete_mossy; + } else if (chance < 0.75F) { + this.field_151562_a = ModBlocks.brick_concrete_cracked; + } else { + this.field_151562_a = ModBlocks.brick_concrete_broken; + } + } + } + + //ag + static class LabTiles extends StructureComponent.BlockSelector { + + LabTiles() { } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + float chance = rand.nextFloat(); + + if(chance < 0.5F) { + this.field_151562_a = ModBlocks.tile_lab; + } else if (chance < 0.9F) { + this.field_151562_a = ModBlocks.tile_lab_cracked; + } else { + this.field_151562_a = ModBlocks.tile_lab_broken; + } + } + } + + static class SuperConcrete extends StructureComponent.BlockSelector { + + SuperConcrete() { + this.field_151562_a = ModBlocks.concrete_super; + } + + /** Selects blocks */ + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) { + this.selectedBlockMetaData = rand.nextInt(6) + 10; + } + } + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java new file mode 100644 index 000000000..27571adf5 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/MilitaryBaseFeatures.java @@ -0,0 +1,181 @@ +package com.hbm.world.worldgen.components; + +import java.util.LinkedList; +import java.util.Random; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +//These structures are... kind of? low quality, but they test out new methods so whatev. +public class MilitaryBaseFeatures { + + //stop-gap methods until this entire mess can be organized into proper classes/structure groups + public static void smallHelipad(LinkedList components, int chunkX, int posY, int chunkZ, Random rand) { + BasicHelipad helipad = new BasicHelipad(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8); + int[] chunkPos = getAdjacentChunk(chunkX, chunkZ, rand); + + RadioShack radio = new RadioShack(rand, chunkPos[0] * 16 + 8, posY, chunkPos[1] * 16 + 8); + components.add(helipad); + components.add(radio); + } + + //ugh + public static int[] getAdjacentChunk(int chunkX, int chunkZ, Random rand) { + int[] chunkPos = new int[2]; + + switch(rand.nextInt(4)) { + case 0: + chunkPos[0] = chunkX; + chunkPos[1] = chunkZ + 1; + break; + case 1: + chunkPos[0] = chunkX - 1; + chunkPos[1] = chunkZ; + break; + case 2: + chunkPos[0] = chunkX; + chunkPos[1] = chunkZ - 1; + break; + case 3: + chunkPos[0] = chunkX + 1; + chunkPos[1] = chunkZ; + break; + } + + return chunkPos; + } + + public static class BasicHelipad extends Feature { + + public BasicHelipad() { super(); } + + protected BasicHelipad(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 12, 0, 12); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + for(int i = 1; i < sizeX; i++) { + for(int j = 1; j < sizeZ; j++) { + clearCurrentPositionBlocksUpwards(world, i, 1, j, box); + } + } + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 1, sizeX - 1, sizeZ - 1, -1, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 1, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 1, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, sizeZ, sizeX - 1, sizeZ, -1, box); + + //Helipad + fillWithBlocks(world, box, 1, 0, 1, 11, 0, 1, ModBlocks.concrete, Blocks.air, false); //this entire time, the second block was actually for anything not at min/max x's, y's, and z's. useful! + fillWithBlocks(world, box, 11, 0, 2, 11, 0, 11, ModBlocks.concrete, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 11, 10, 0, 11, ModBlocks.concrete, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 2, 1, 0, 10, ModBlocks.concrete, Blocks.air, false); + + fillWithBlocks(world, box, 2, 0, 2, 10, 0, 10, ModBlocks.concrete_smooth, Blocks.air, false); //i'm not carefully carving out the white H lmao fuck that + fillWithBlocks(world, box, 4, 0, 4, 4, 0, 8, ModBlocks.concrete_colored, Blocks.air, false); //white is 0 + fillWithBlocks(world, box, 8, 0, 4, 8, 0, 8, ModBlocks.concrete_colored, Blocks.air, false); + fillWithBlocks(world, box, 5, 0, 6, 7, 0, 6, ModBlocks.concrete_colored, Blocks.air, false); + + //Surrounding Fences + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 0, sizeX, 0, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, sizeX, 1, sizeX, sizeZ, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, sizeZ, sizeX - 1, sizeZ, 1); + placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 1, 0, sizeZ - 1, 1); + + return false; + } + + } + + public static class RadioShack extends Feature { + + private static LabTiles RandomLabTiles = new LabTiles(); + private static ConcreteBricks ConcreteBricks = new ConcreteBricks(); + + public RadioShack() { super(); } + + protected RadioShack(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 6, 4, 5); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 1, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 2, 0, 2, 0, box); + + //Floor & Foundation + fillWithRandomizedBlocks(world, box, 2, 0, 1, 5, 0, 4, false, rand, RandomLabTiles); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, 1, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, 1, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, sizeZ, box); + placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, sizeZ, box); + fillWithBlocks(world, box, 2, 0, 1, sizeX - 1, 0, 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, 0, 0, sizeX - 1, 0, 0, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, sizeX, 0, 2, sizeX, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, 0, sizeZ, sizeX - 1, 0, sizeZ, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 1, 0, 2, 1, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + + //Back Wall + fillWithRandomizedBlocks(world, box, 1, 1, 1, 2, sizeY - 1, 1, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 2, 1, 0, 5, sizeY - 1, 0, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 1, 1, sizeX, sizeY - 1, 1, false, rand, ConcreteBricks); + //Front Wall + fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 2, sizeY - 1, sizeZ, false, rand, ConcreteBricks); + placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete, 0, 3, sizeY - 1, sizeZ, box); + fillWithRandomizedBlocks(world, box, 4, 1, sizeZ, sizeX, sizeY - 1, sizeZ, false, rand, ConcreteBricks); + placeDoor(world, box, ModBlocks.door_metal, 3, 3, 1, sizeZ); + //Left & Right Wall + fillWithRandomizedBlocks(world, box, 1, 1, 2, 1, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 1, 2, sizeX, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, 1, 2, 3, box); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 2, box); + placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 4, box); + //Ceiling + fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.concrete_smooth, Blocks.air, false); + fillWithBlocks(world, box, 2, sizeY - 1, 2, sizeX - 1, sizeY - 1, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false); + + fillWithAir(world, box, 2, 1, 2, sizeX - 1, 2, sizeZ - 1); + + //Decoration + int southMeta = getDecoMeta(2); + int northMeta = getDecoMeta(3); //all of these deco blocks are so inconsistent about what their directions actually are + int eastMeta = getDecoMeta(4); + fillWithMetadataBlocks(world, box, 2, 1, 2, 5, 1, 2, ModBlocks.steel_grate, 7, null, 0, false); //null should be okay here + fillWithBlocks(world, box, 3, 1, 1, 4, 1, 1, ModBlocks.deco_tungsten, null, false); + fillWithMetadataBlocks(world, box, 3, 2, 1, 4, 2, 1, ModBlocks.tape_recorder, northMeta, null, 0, false); + placeBlockAtCurrentPosition(world, ModBlocks.radiorec, southMeta, 2, 2, 2, box); + placeRandomBobble(world, box, rand, sizeX - 1, 2, 2); + fillWithMetadataBlocks(world, box, sizeX - 1, 1, 3, sizeX - 1, 2, 3, ModBlocks.tape_recorder, eastMeta, null, 0, false); + //OutsideDeco + fillWithMetadataBlocks(world, box, 0, 1, 2, 0, 2, 2, ModBlocks.steel_poles, eastMeta, null, 0, false); + placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 0, sizeY - 1, 2, box); + fillWithBlocks(world, box, 0, sizeY, 2, sizeX - 1, sizeY, 2, ModBlocks.steel_roof, null, false); + placeBlockAtCurrentPosition(world, ModBlocks.steel_roof, 0, sizeX - 1, sizeY, 3, box); + + return false; + } + + } + + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java new file mode 100644 index 000000000..ebcdeb079 --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/OfficeFeatures.java @@ -0,0 +1,220 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.lib.HbmChestContents; +import com.hbm.world.worldgen.components.Feature.ConcreteBricks; + +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +//Oh my fucking god TM +public class OfficeFeatures { + + public static class LargeOffice extends Feature { + + private static ConcreteBricks ConcreteBricks = new ConcreteBricks(); + + private boolean[] hasPlacedLoot = new boolean[2]; + + public LargeOffice() { + super(); + } + + public LargeOffice(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 14, 5, 12); + this.hasPlacedLoot[0] = false; + this.hasPlacedLoot[1] = false; + } + + @Override + protected void func_143012_a(NBTTagCompound nbt) { + super.func_143012_a(nbt); + nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]); + nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]); + } + + @Override + protected void func_143011_b(NBTTagCompound nbt) { + super.func_143011_b(nbt); + this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1"); + this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2"); + } + + //Holy shit I despise this method so goddamn much + //TODO BOB: please i beg you make some sort of utility tool to simplify this + //ideally we'd invent something like the structure blocks or even a more advanced + //schematic to java tool + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return true; + } + + this.boundingBox.offset(0, -1, 0); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, sizeX, 1, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 2, sizeX, 7, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 8, 8, sizeZ, 0, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 9, 8, sizeX, sizeZ, -1, box); + + fillWithAir(world, box, 1, 1, 3, 4, 3, 6); + fillWithAir(world, box, 6, 1, 1, sizeX - 1, 3, 6); + fillWithAir(world, box, 10, 1, 7, sizeX - 1, 3, sizeZ - 1); + + //Pillars + //Back + fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 5, 0, 0, 5, 4, 0, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 4, 0, ModBlocks.concrete_pillar); + //Front + fillWithBlocks(world, box, 0, 0, 7, 0, 3, 7, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 0, 0, sizeZ, 0, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 6, 0, sizeZ, 6, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 9, 0, sizeZ, 9, 3, sizeZ, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, 9, 0, 7, 9, 3, 7, ModBlocks.concrete_pillar); + fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 4, sizeZ, ModBlocks.concrete_pillar); + + //Walls + //Back + fillWithRandomizedBlocks(world, box, 1, 0, 2, 5, 4, 2, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 4, 1, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 6, 0, 0, sizeX - 1, 1, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 6, 2, 0, 6, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 9, 2, 0, 10, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX - 1, 2, 0, sizeX - 1, 2, 0, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 6, 3, 0, sizeX - 1, 4, 0, rand, ConcreteBricks); + //Right + fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, 1, sizeX, 2, 2, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, 5, sizeX, 2, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 2, sizeX, 2, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX, 3, 1, sizeX, 4, sizeZ - 1, rand, ConcreteBricks); + //Front + fillWithRandomizedBlocks(world, box, 0, 4, sizeZ, sizeX - 1, 4, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 0, sizeZ, sizeX - 1, 1, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 2, sizeZ, 10, 2, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 2, sizeZ, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 10, 3, sizeZ, sizeX - 1, 3, sizeZ, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 9, 0, 8, 9, 3, sizeZ - 1, rand, ConcreteBricks); + + fillWithRandomizedBlocks(world, box, 1, 0, 7, 8, 0, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 1, 1, 7, 1, 2, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 4, 1, 7, 8, 3, 7, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 1, 3, 7, 3, 3, 7, rand, ConcreteBricks); + //Left + fillWithRandomizedBlocks(world, box, 0, 4, 3, 0, 4, sizeZ - 1, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 0, 3, 0, 1, 6, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 2, 3, 0, 3, 3, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 0, 2, 6, 0, 3, 6, rand, ConcreteBricks); + //Interior + fillWithRandomizedBlocks(world, box, 5, 1, 3, 5, 3, 5, rand, ConcreteBricks); + fillWithRandomizedBlocks(world, box, 5, 3, 6, 5, 3, 6, rand, ConcreteBricks); + + //Trim + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 2, 5, sizeY, 2, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 1, 5, sizeY, 1, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 0, sizeX, sizeY, 0, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, sizeX, sizeY, 1, sizeX, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, sizeZ, sizeX - 1, sizeY, sizeZ, Blocks.stone_slab); + randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 3, 0, sizeY, sizeZ - 1, Blocks.stone_slab); + + //Floor + fillWithMetadataBlocks(world, box, 1, 0, 3, 4, 0, 6, Blocks.wool, 13); //Green Wool + fillWithBlocks(world, box, 5, 0, 3, 5, 0, 6, ModBlocks.brick_light); + fillWithBlocks(world, box, 6, 0, 1, sizeX - 1, 0, 6, ModBlocks.brick_light); + fillWithBlocks(world, box, 10, 0, 7, sizeX - 1, 0, sizeZ - 1, ModBlocks.brick_light); + //Ceiling + fillWithBlocks(world, box, 6, 4, 1, sizeX - 1, 4, 2, ModBlocks.brick_light); + fillWithBlocks(world, box, 1, 4, 3, sizeX - 1, 4, sizeZ - 1, ModBlocks.brick_light); + + //Decorations + //Carpet + fillWithMetadataBlocks(world, box, 9, 1, 3, 11, 1, 6, Blocks.carpet, 8); //Light gray + //Windows + randomlyFillWithBlocks(world, box, rand, 0.75F, 0, 2, 4, 0, 3, 5, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, 7, 2, 0, 8, 2, 0, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, 0, sizeX - 2, 2, 0, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 3, sizeX, 2, 4, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 8, sizeX, 2, 9, Blocks.glass_pane); + randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane); + //Fuwnituwe >w< + int stairMetaE = getStairMeta(1); //East + int stairMetaN = getStairMeta(2); //*SHOULD* be north + int stairMetaS = getStairMeta(3); //South :3 + int stairMetaWU = getStairMeta(0) | 4; //West, Upside-down + int stairMetaEU = stairMetaE | 4; //East, Upside-down + int stairMetaNU = stairMetaN | 4; //North, Upside-down uwu + int stairMetaSU = stairMetaS | 4; //South, Upside-down + //Desk 1 :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 2, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 3, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 2, 1, 3, box); //Chaiw :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 1, 2, 4, box); //Nowth-facing Computer :33 + //Desk 2 :3 + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 7, 1, 3, box); //Chaiw :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 6, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 7, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.planks, 1, 8, 1, 4, box); //Spwuce Pwanks :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 7, 2, 4, box); //Nowth-facing Computer X3 + placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, 8, 2, 4, box); + //Desk 3 :3 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 1, box); + fillWithMetadataBlocks(world, box, 11, 1, 1, sizeX - 1, 1, 1, Blocks.spruce_stairs, stairMetaSU); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 2, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, 3, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, 4, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 5, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 11, 1, 2, box); //Chaiw ;3 + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 2, 1, 4, box); //Chaiw :333 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), sizeX - 3, 2, 1, box); //South-facing Computer :3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, 5, box); //West-facing Computer ^w^ + placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, sizeX - 1, 2, 3, box); + placeBlockAtCurrentPosition(world, ModBlocks.radiorec, getDecoMeta(5), sizeX - 1, 2, 2, box); //Wadio + //Desk 4 DX + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 8, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 11, 1, 8, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 10, 1, 9, box); //Chaiw ;3 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), 10, 2, 8, box); //South-facing Computer :33 + //Desk 5 :333 + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, sizeZ - 3, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, sizeZ - 2, box); + placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, sizeZ - 1, box); + placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 3, 1, sizeZ - 1, box); //UwU... Chaiw!!!! :333 I wove chaiws XD :333 OwO what's this?? chaiw???? :333333333333333333 + placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, sizeZ - 1, box); //West-facing Computer >w< + //Cobwebs pwobabwy + //Maybe make a method for this eventually? + //Something where the tops of ceilings + empty corners along walls get most cobwebs, + //with no cobwebs hanging midair + it not being performance intensive + randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 3, 3, 4, 3, 6, Blocks.web); + randomlyFillWithBlocks(world, box, rand, 0.25F, 6, 3, 1, sizeX - 1, 3, 6, Blocks.web); + randomlyFillWithBlocks(world, box, rand, 0.25F, 10, 3, 7, sizeX - 1, 3, sizeZ - 1, Blocks.web); + //Doors + placeDoor(world, box, ModBlocks.door_office, 3, 2, 1, 7); + placeDoor(world, box, ModBlocks.door_office, 3, 3, 1, 7); + placeDoor(world, box, ModBlocks.door_office, 0, 5, 1, 6); + + //Woot + if(!this.hasPlacedLoot[0]) + this.hasPlacedLoot[0] = generateInvContents(world, box, rand, Blocks.chest, sizeX - 4, 1, sizeZ - 1, HbmChestContents.officeTrash, 10); + if(!this.hasPlacedLoot[1]) { + this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, HbmChestContents.machineParts, 10, 0.5D); + generateLoreBook(world, box, 6, 1, 1, 7, "office" + rand.nextInt(1)); + } + + //TODO: add book with funny lore to safe, add cobwebs too + //0b00/0 West, 0b01/1 East, 0b10/2 North, 0b11/3 South, 0b100/4 West UD, 0b101 East UD, 0b110 North UD, 0b111 South UD + return false; + } + + } + +} diff --git a/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java new file mode 100644 index 000000000..47953d9da --- /dev/null +++ b/src/main/java/com/hbm/world/worldgen/components/RuinFeatures.java @@ -0,0 +1,266 @@ +package com.hbm.world.worldgen.components; + +import java.util.Random; + +import com.hbm.blocks.ModBlocks; + +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; + +public class RuinFeatures { + + public static class NTMRuin1 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin1() { + super(); + } + + public NTMRuin1(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 8, 6, 10); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ, -1, box); + + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); + + this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.fillWithMetadataBlocks(world, box, 1, 3, 0, 3, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, 4, 0, 0, 4, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 3, 0, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 3, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 3, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 0, 5, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 4, 0, 3, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, sizeY - 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 2, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 2, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 2, 0, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 4, 1, 0, 4, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 5, 1, 0, 5, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 4, sizeZ - 2, 0, 4, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 1, 3, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithBlocks(world, box, 4, 0, sizeZ, 4, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, 5, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 3, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, sizeZ, 3, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, sizeZ, 5, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 2, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 1, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 2, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 2, sizeX, 1, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin2 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin2() { + super(); + } + + public NTMRuin2(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 7, 5, 10); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, sizeX, sizeZ, -1, box); + + int pillarMetaWE = this.getPillarMeta(4); + int pillarMetaNS = this.getPillarMeta(8); + + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.fillWithMetadataBlocks(world, box, 1, 3, 0, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 4, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 3, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY, 0, sizeX - 1, sizeY, 0, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall + this.fillWithBlocks(world, box, 0, 0, 5, 0, 0, 5, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 2, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, sizeZ - 3, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 1, 0, 1, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX - 1, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall + this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 4, 5, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 2, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 2, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 4, sizeX, 1, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, 7, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin3 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin3() { + super(); + } + + public NTMRuin3(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 8, 3, 10); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 0, sizeX, sizeZ, -1, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, sizeX, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 4, sizeX, 4, -1, box); + + this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall + this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 1, 2, 0, sizeX - 2, 2, 0, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 0, 0, 4, 0, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Left Wall + this.placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 0, 0, sizeZ, box); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, 5, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 5, 0, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 7, 0, 1, 7, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, 4, sizeX, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, 3, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 5, sizeX, 0, 6, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 1, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 4, 0, 4, 4, 2, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Center Wall + this.fillWithRandomizedBlocks(world, box, 3, 0, 4, 3, 1, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 0, 4, sizeX - 1, 1, 4, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, sizeX - 1, 0, 3, Blocks.gravel, Blocks.air, false); + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + + public static class NTMRuin4 extends Feature { + + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); + + public NTMRuin4() { + super(); + } + + public NTMRuin4(Random rand, int minX, int minY, int minZ) { + super(rand, minX, minY, minZ, 10, 2, 11); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + + //System.out.println(this.coordBaseMode); + if(!this.setAverageHeight(world, box, this.boundingBox.minY)) { + return false; + } + //System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ); + + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 0, 0, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, sizeX, 5, sizeX, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, 5, 4, -1, box); + + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, sizeZ, sizeX - 1, sizeZ, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 4, 0, -1, box); + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 5, sizeX - 1, 5, -1, box); + + this.fillWithBlocks(world, box, 0, 0, 0, 0, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 1 + this.fillWithBlocks(world, box, 5, 0, 0, 5, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); + this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 5, 0, 5, 5, sizeY, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 1 + this.fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 0, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 1, 5, 1, 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 1, 4, 5, 1, 4, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 5, 2, 1, 5, 2, 4, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 1, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, 6, 0, 5, sizeX - 1, 0, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 6, 1, 5, 6, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 5, sizeX - 1, 1, 5, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 2 + this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, sizeZ - 3, false, rand, RandomConcreteBricks); + this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 0, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Front Wall + this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ, 7, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); //Left Wall + this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 1, 1, false, rand, RandomConcreteBricks); + this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 1, 7, false, rand, RandomConcreteBricks); + + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 4, 0, 5, Blocks.gravel, Blocks.air, false); + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 6, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false); + + return true; + } + } + +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 098a6cc35..5f43b32ef 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -10,7 +10,7 @@ achievement.bossMeltdown.desc=Mehr schlecht als recht, aber was will man machen. achievement.bossMeltdown=3,6 Röntgen achievement.bossWorm.desc=Der Fabstaff. Mein Arsch. Jetzt fang an zu rechnen. achievement.bossWorm=Disassembling Balls-O-Tron -achievement.bossUFO.desc=Yo, what do we have here? A huge spacecraft pulling up to the bloockship? +achievement.bossUFO.desc=Yo, what do we have here? A huge spacecraft pulling up to the blockship? achievement.bossUFO=Ayy Lmao achievement.c20_5.desc=??? achievement.c20_5=Kapitel [ZWANZIG KOMMA FÜNF] @@ -76,8 +76,8 @@ achievement.space.desc=Scheitere in jeder möglichen Weise und verschwende 90 Mi achievement.space=Die finale Grenz-ach vergiss es achievement.tasteofblood.desc=ist nicht Teil des Testprotokolls. achievement.tasteofblood=Der Geschmack von Blut -achievement.witchtaunter.desc=Diese komischen Kraturen können dir garnichts! -achievement.witchtaunter=Hexen verstpotten +achievement.witchtaunter.desc=Diese komischen Kreaturen können dir garnichts! +achievement.witchtaunter=Hexen verspotten armor.blastProtection=Explosionsmodifikator: %s armor.cap=Schadensobergrenze: %s @@ -128,6 +128,45 @@ bomb.triggered=Erfolgreich ausgelöst! book.test.page1=Testseite 1 +cannery.f1=[ Drücke F1 für Hilfe ] + +cannery.centrifuge=Gaszentrifuge +cannery.centrifuge.0=Gaszentrifugen können mit Flüssigkeitsrohren versorgt werden. +cannery.centrifuge.1=Die meisten Rezepte benötigen mehrere Zentrifugen, Zwischenprodukte können nicht mit Rohren transportiert werden. +cannery.centrifuge.2=Diese Seite dient als Verbindung, die Zwischenprodukte in anliegende Zentrifugen überträgt. +cannery.centrifuge.3=Uranhexafluorid kann mit nur zwei Zentrifugen verarbeitet werden, jedoch erzeugt das Urankernbrennstoff und Uran-238. +cannery.centrifuge.4=Mit vier Zentrifugen kann es vollständig in Uran-235 und Uran238 verarbeitet werden. +cannery.centrifuge.5=Manche Rezepte benötigen das Zentrifugen-Geschwingidkeitsupgrade. + +cannery.fensu=FEnSU +cannery.fensu.0=Die FEnSU kann absurde Mengen Energie speichern, über 9EHE (eine Neun gefolgt von 18 Nullen). +cannery.fensu.1=Es gibt nur einen Kontakt auf der Unterseite. +cannery.fensu.2=Das ist auch der einzige Ort, an dem die FEnSU ein Redstone-Signal empfangen kann. + +cannery.firebox=Feuerbüchse +cannery.firebox.0=Die Feuerbüchse verbrennt Gegenstände, um Hitze zu erzeugen. +cannery.firebox.1=Sie kann alle brennbaren Gegenstände verwenden, aber hochwertigere Brennstoffe wie Kohle, Koks oder Festbrennstoff brennen länger und heißer. +cannery.firebox.2=Hitze wird von dem Kupferkontakt an der Oberseite abgegeben. Maschinen mit einem identischen Kontakt an der Unterseite können Hitze annehmen, wenn sie darauf platziert werden. +cannery.firebox.3=Wenn die Hitze nicht verbraucht wird hält die Feuerbüchse an, um keinen Brennstoff zu verschwenden. +cannery.firebox.4=Eine solche Maschine ist der Stirlingmotor, welcher aus Hitze direkt Energie erzeugt. + +cannery.silex=FEL & SILEX +cannery.silex.0=Der Freieilektonenlaser (FEL) verwendet Energie und einen Laserkristall um einen starken Laserstrahl zu erzeugen. +cannery.silex.1=Vorsicht, der Laser kann sich durch schwächere Blöcke hindurchbrennen... +cannery.silex.2=...aber nicht durch sprengsichere. +cannery.silex.3=Der FEL betreibt den Laser-Isotopentrenner (SILEX). FEL und SILEX müssen dabei mindestens zwei Blöcke Abstand haben. +cannery.silex.4=Der Laser muss durch die kleinen Fenster des SILEX durch. Eine falsche Ausrichtung könnte das SILEX zerstören. +cannery.silex.5=Die Öffnungen an den Seiten können verwendet werden, um das SILEX mit Flüssigkeit zu versorgen. +cannery.silex.6=Zusätzlich zu den zwei Öffnungen gibt es an der Unterseite eine versteckte Verbindung, über der Gegenstände herausgenommen werden kann. +cannery.silex.7=Jedes Rezept benötigt einen speziellen Laser-Typ. Stärkere Typen beschleunigen den Vorgang. +cannery.silex.8=Ein FEL kann bis zu fünf SILEX betreiben. Jedes SILEX muss einen Block Abstand halten. + +cannery.stirling=Stirlingmotor +cannery.stirling.0=Der Stirlingmotor verwendet Hitze aus einer externen Quelle um Energie zu erzeugen. +cannery.stirling.1=Er muss auf einem Hitzeerzeuger platziert werden, zum Beispiel der Feuerbüchse. +cannery.stirling.2=Die Hitze die maximal verwendet werden kann ist limitiert, Übergeschwindigkeit kann zu katastrophalen Fehlfunktionen führen. +cannery.stirling.3=Die verbesserte Version kann wesentlich mehr Hitze aufnehmen, ohne kaputt zu werden. + chem.ARSENIC=Arsenextraktion chem.ASPHALT=Asphaltherstellung chem.BAKELITE=Bakelitherstellung @@ -233,8 +272,11 @@ container.bombMulti=Mehrzweckbombe container.centrifuge=Zentrifuge container.chemplant=Chemiewerk container.compactLauncher=Kompakt-Startrampe +container.craneBoxer=Förderband-Verpacker container.craneExtractor=Förderband-Auswerfer container.craneInserter=Förderband-Einsetzer +container.craneRouter=Förderband-Sortierer +container.craneUnboxer=Förderband-Entpacker container.crateDesh=Deshkiste container.crateIron=Eisenkiste container.crateSteel=Stahlkiste @@ -272,6 +314,7 @@ container.launchTable=Große Startrampe container.machineBoiler=Dampfkessel container.machineCMB=CMB-Stahl Hochofen container.machineCoal=Verbrennungsgenerator +container.machineCrucible=Schmelztiegel container.machineDiesel=Dieselgenerator container.machineElectricBoiler=Elektrischer Boiler container.machineFEL=FEL @@ -342,6 +385,7 @@ container.turretArty=Greg container.turretChekhov=Tschechows Gewehr container.turretFriendly=Mister Friendly container.turretFritz=Fritz +container.turretHIMARS=Henry container.turretHoward=Howard container.turretJeremy=Jeremy container.turretMaxwell=Maxwell @@ -353,13 +397,15 @@ container.watzPowerplant=Watzkraftwerk container.zirnox=ZIRNOX Atomreaktor death.attack.acid=%1$s fiel in Säure. +death.attack.acidPlayer=%1$s wurde von %2$s aufgelöst. death.attack.ams=%1$s wurde in tödlichen Teilchen gebadet, die von der Menschheit erst benannt werden müssen. death.attack.amsCore=%1$s wurde vom Feuer einer Singularität verdampft. death.attack.asbestos=%1$s hat sich für finanzielle Entschädigung qualifiziert. death.attack.bang=%1$s wurde in mundgerechte Stücke zerfetzt. death.attack.blackhole=%1$s wurde spaghettifiziert. death.attack.blender=%1$s wurde in kleine, mundgerechte Stücke geschnitten. -death.attack.boat=%1$s wurde von Schiff erschlagen. +death.attack.boat=%1$s wurde von einem Schiff erschlagen. +death.attack.boil=%1$s wurde von %2$s lebend gekocht. death.attack.boxcar=%1$s wurde von einem fallenden Güterwagon zermatscht. Autsch! death.attack.broadcast=%1$s wurde das Gehirn geschmolzen. death.attack.building=%1$s wurde von einem Gebäude zermatscht. @@ -445,6 +491,10 @@ fluid.schrabidic_fluid=Schrabidische Säure fluid.toxic_fluid=Stereotypischer grüner Schleim fluid.volcanic_lava_fluid=Vulkanische Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone invertiert +foundry.noCast=Keine Form eingelegt! + geiger.chunkRad=Chunk-Strahlung: geiger.envRad=Gesamte Umgebungsstrahlung: geiger.playerRad=Spieler-Kontaminierung: @@ -585,6 +635,8 @@ hbmfluid.watz=Giftiger Schlamm hbmfluid.xenon=Xenongas hbmfluid.xpjuice=Erfahrungssaft +info.asbestos=Meine Lunge brennt. +info.coaldust=Das Atmen fällt mir schwer. info.coil=Spulenstärke info.templatefolder=Hergestellt mit %s info.template_in=Input: @@ -701,6 +753,7 @@ item.ammo_9mm_chlorophyte.name=9mm Patrone (Grünalgen) item.ammo_9mm_du.name=9mm Patrone (DU) item.ammo_9mm_rocket.name=9mm Rakete item.ammo_arty.name=16" Artilleriegranate +item.ammo_arty_cargo.name=16" Artilleriegranate (Expresslieferung) item.ammo_arty_classic.name=16" Artilleriegranate (Das Factorio-Spezial) item.ammo_arty_he.name=16" Artilleriegranate (HE) item.ammo_arty_mini_nuke.name=16" Mikroatomgranate @@ -736,6 +789,8 @@ item.ammo_grenade_phosphorus.name=40mm Granate (WP) item.ammo_grenade_sleek.name=40mm Granate (IF-F&E) item.ammo_grenade_toxic.name=40mm Granate (Chemisch) item.ammo_grenade_tracer.name=40mm Übungsgranate +item.ammo_himars_standard.name=M28 gelenkte Artillerierakete +item.ammo_himars_single.name=M39A1 gelenkte Artillerierakete item.ammo_mirv.name=Mini-MIRV item.ammo_mirv_high.name=Mini-MIRV (Stark) item.ammo_mirv_low.name=Mini-MIRV (Schwach) @@ -797,6 +852,7 @@ item.ams_focus_limiter.name=Beschränkender Stabilisierungsfokus item.ams_lens.name=Stabilisierer-Linse item.ams_muzzle.name=Strahlenemissions-Mündung item.analyzer.name=Analysierer +item.anchor_remote.name=Rückrufgerät item.antiknock.name=Tetraethyblei-Antiklopfmittel item.apple_euphemium.name=Euphemiumapfel item.apple_lead.name=Bleiapfel @@ -838,6 +894,7 @@ item.balefire_and_ham.name=Ham and Balefire-Eggs item.balefire_and_steel.name=Balefire-Zeug item.balefire_scrambled.name=Rühr-Balefire-Ei item.ball_dynamite.name=Dynamit +item.ball_fireclay.name=Schamott item.ball_tnt.name=TNT item.ballistite.name=Ballistit item.bandaid.name=Samtenes Pflaster @@ -1250,6 +1307,7 @@ item.cotton_candy.name=Radioaktive Zuckerwatte item.crate_caller.name=Nachschub-Requester item.crowbar.name=Mk.V Kistenöffnungsapparat "Brechstange" item.crucible.name=Schmelztiegel +item.crucible_template.name=Schmelztiegelvorlage item.crystal_aluminium.name=Aluminiumkristalle item.crystal_beryllium.name=Berylliumkristalle item.crystal_charred.name=Verkohlter Kristall @@ -1454,6 +1512,7 @@ item.gas_mask_mono.name=Halbmaske item.gas_mask_olde.name=Ledergasmaske item.gas_petroleum.name=Petroleumgastank item.gear_large.name=Großes Zahnrad +item.gear_large_steel.name=Großes Stahlzahnrad item.geiger_counter.name=Mobiler Geigerzähler item.gem_alexandrite.name=Alexandrit item.gem_tantalium.name=Tantal-Polykristall @@ -1523,6 +1582,7 @@ item.gun_bolter_digamma.name=Digammagewehr item.gun_calamity.name=Knochensäge item.gun_calamity_ammo.name=.50 BMG Patrone (LEGACY) item.gun_calamity_dual.name=Sattelkanone +item.gun_chemthrower.name=Chemowerfer item.gun_cryolator.name=Der Cryolator item.gun_cryolator_ammo.name=Kryozelle item.gun_dampfmaschine.name=Garantiert keine Scherzwaffe @@ -1701,6 +1761,7 @@ item.ingot_electronium.name=Elektroniumbarren item.ingot_euphemium.name=Euphemiumbarren item.ingot_ferrouranium.name=Ferrouranbarren item.ingot_fiberglass.name=Fiberglasstafel +item.ingot_firebrick.name=Schamottstein item.ingot_gh336.name=Ghiorsium-336-Barren item.ingot_gh336.desc=Seaborgiums Kollege. item.ingot_graphite.name=Graphitbarren @@ -1912,6 +1973,8 @@ item.missile_strong.name=Starke HE Rakete item.missile_taint.name=Verdorbene Rakete item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Mit der Kraft von Kernwaffen können wir einen Vulkan beschwören! +item.mold_base.name=Blanke Gussform +item.mold.name=Gussform item.morning_glory.name=Zaunwinde item.motor.name=Motor item.motor_desh.name=Desh-Motor @@ -2208,6 +2271,7 @@ item.pile_rod_plutonium.name=Chicago Pile Plutoniumstab item.pile_rod_source.name=Chicago Pile Ra226Be-Neutronenquelle item.pile_rod_uranium.name=Chicago Pile Uranstab item.pill_iodine.name=Iodpille +item.pill_herbal.name=Kräuterpaste item.pin.name=Haarklammer item.pipes_steel.name=Stahlrohre item.pirfenidone.name=Pirfenidon @@ -2318,6 +2382,7 @@ item.powder_power.name=Energiepulver item.powder_quartz.name=Quarzstaub item.powder_red_copper.name=Roter Kupfer Staub item.powder_reiium.name=Reiiumstaub +item.powder_sawdust.name=Sägespäne item.powder_schrabidate.name=Eisenschrabidatstaub item.powder_schrabidium.name=Schrabidiumstaub item.powder_semtex_mix.name=Semtexmischung @@ -2587,7 +2652,7 @@ item.safety_fuse.name=Zündschnur item.sat_base.name=Satellitenkörper item.sat_chip.name=Satelliten-ID-Chip item.sat_coord.name=Satelliten-Zielmarkierer -item.sat_designator.name=atelliten-Laserzielmarkierer +item.sat_designator.name=Satelliten-Laserzielmarkierer item.sat_foeq.name=PEAF - Mk.I FOEQ Dunasonde mit experimenter nuklearer Schubdüse item.sat_gerald.name=Gerald der Konstruktionsandroid item.sat_head_laser.name=Todesstrahl @@ -2603,6 +2668,7 @@ item.sat_miner.name=Asteroiden-Förderschiff item.sat_radar.name=Radar-Überwachungssatellit item.sat_resonator.name=Xenium-Resonator-Satellit item.sat_scanner.name=Satellit mit Tiefenscanning-Modul +item.sawblade.name=Sägeblatt item.schnitzel_vegan.name=Veganes Schnitzel item.schrabidium_axe.name=Schrabidiumaxt item.schrabidium_boots.name=Schrabidiumstiefel @@ -2618,7 +2684,9 @@ item.scrap.name=Schrott item.scrap_nuclear.name=Radioaktiver Schutt item.scrap_oil.name=Öliger Schutt item.scrap_plastic.name=Geschreddertes Plastik +item.scraps.name=Gießerei-Schutt item.screwdriver.name=Schraubenzieher +item.screwdriver.desc=Könnte statt einer Sicherung verwendet werden... item.screwdriver_desh.name=Desh-Schraubenzieher item.scrumpy.name=Flasche Scrumpy item.security_boots.name=Sicherheitsstiefel @@ -2816,6 +2884,7 @@ item.upgrade_ejector_3.name=Auswurfupgrade Mk.III item.upgrade_fortune_1.name=Glückupgrade Mk.I item.upgrade_fortune_2.name=Glückupgrade Mk.II item.upgrade_fortune_3.name=Glückupgrade Mk.III +item.upgrade_gc_speed.name=Gaszentrifugen-Geschwindigkeitsupgrade item.upgrade_health.name=Kraftfeld-Resistenzupgrade item.upgrade_nullifier.name=Müllvernichter-Upgrade item.upgrade_overdrive_1.name=Overdrive-Upgrade Mk.I @@ -2938,6 +3007,22 @@ rbmk.rod.xenon=Xenonvergiftung: %s rbmk.rod.coreTemp=Kerntemperatur: %s rbmk.rod.skinTemp=Außentemperatur: %s / %s +shape.billet=Billet +shape.blade=Turbinenblatt +shape.blades=Sägeblatt +shape.block=Block +shape.dust=Haufen +shape.dusttiny=Winziger Haufen +shape.hull_big=Große Hülle +shape.hull_small=Kleine Hülle +shape.ingot=Barren +shape.nugget=Nugget +shape.quantum=Quantum +shape.quart=Viertel Block +shape.plate=Platte +shape.stamp=Stempel +shape.wire=Draht + soundCategory.ntmMachines=NTM Maschinen tile.absorber.name=Strahlungs-Absorber @@ -3094,17 +3179,26 @@ tile.bomber.name=Abgestürtzer Bomber tile.book_guide.name=Hbm's Nuclear Tech Mod Handbuch [LEGACY] tile.boxcar.name=Güterwagon tile.brick_asbestos.name=Asbestziegel +tile.brick_asbestos_stairs.name=Asbestziegeltreppe tile.brick_compound.name=Verstärkter Verbund +tile.brick_compound_stairs.name=Verbundtreppe tile.brick_concrete.name=Betonziegel +tile.brick_concrete_stairs.name=Concrete Brick Stairs tile.brick_concrete_broken.name=Gebrochene Betonziegel +tile.brick_concrete_broken_stairs.name=Gebrochene Betonziegeltreppe tile.brick_concrete_cracked.name=Rissige Betonziegel +tile.brick_concrete_cracked_stairs.name=Rissige Betonziegeltreppe tile.brick_concrete_marked.name=Beschriebene Betonziegel tile.brick_concrete_mossy.name=Bemooste Betonziegel -tile.brick_ducrete.name=Ducrete-Ziegel +tile.brick_concrete_mossy.name=Bemooste Betonziegeltreppe +tile.brick_ducrete.name=Ducreteziegel +tile.brick_ducrete_stairs.name=Ducreteziegeltreppe tile.brick_dungeon.name=Berzelianitziegel tile.brick_dungeon_circle.name=Berzelianitkreis 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_jungle.name=Enargitziegel tile.brick_jungle_circle.name=Mechanistenzirkel tile.brick_jungle_cracked.name=Rissige Enargitziegel @@ -3115,7 +3209,16 @@ tile.brick_jungle_mystic.name=Arkane Enargitziegel tile.brick_jungle_ooze.name=Radioaktive Enargitziegel tile.brick_jungle_trap.name=Enargit-Falle tile.brick_light.name=Helle Ziegel +tile.brick_light_stairs.name=Helle Ziegeltreppe tile.brick_obsidian.name=Obsidianziegel +tile.brick_obsidian_stairs.name=Obsidianziegeltreppe +tile.brick_slab.brick_asbestos.name=Asbestziegelstufe +tile.brick_slab.brick_compound.name=Verbundstufe +tile.brick_slab.brick_fire.name=Schamottsteinstufe +tile.brick_slab.brick_light.name=Helle Ziegelstufe +tile.brick_slab.brick_obsidian.name=Obsidianziegelstufe +tile.brick_slab.reinforced_brick.name=Verstärkte Steinstufe +tile.brick_slab.reinforced_stone.name=Verdichtete Steinstufe tile.broadcaster_pc.name=Korrupter Sender tile.burning_earth.name=Brennendes Gras tile.c4.name=C4 @@ -3142,6 +3245,12 @@ tile.cmb_brick_reinforced.name=Verstärkte CMB-Ziegel tile.compact_launcher.name=Kompakt-Startrampe tile.concrete.name=Betonfliese tile.concrete_asbestos.name=Asbestbeton +tile.concrete_asbestos_stairs.name=Asbestbetontreppe +tile.concrete_brick_slab.brick_concrete.name=Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_broken.name=Rissige Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_cracked.name=Gebrochene Betonziegelstufe +tile.concrete_brick_slab.brick_concrete_mossy.name=Bemooste Betonziegelstufe +tile.concrete_brick_slab.brick_ducrete.name=Ducreteziegelstufe tile.concrete_colored.black.name=Schwarzer Beton tile.concrete_colored.blue.name=Blauer Beton tile.concrete_colored.brown.name=Brauner Beton @@ -3159,7 +3268,14 @@ tile.concrete_colored.silver.name=Hellgrauer Beton tile.concrete_colored.white.name=Weißer Beton tile.concrete_colored.yellow.name=Gelber Beton tile.concrete_pillar.name=Stahlbetonsäule +tile.concrete_slab.concrete.name=Betonfliesenstufe +tile.concrete_slab.concrete_asbestos.name=Asbestbetonstufe +tile.concrete_slab.concrete_smooth.name=Betonstufe +tile.concrete_slab.ducrete.name=Ducretefliesenstufe +tile.concrete_slab.ducrete_smooth.name=Ducretestufe tile.concrete_smooth.name=Beton +tile.concrete_stairs.name=Betonfliesentreppe +tile.concrete_smooth_stairs.name=Betontreppe tile.concrete_super.name=Super Beton tile.concrete_super_broken.name=Schimmliger Schutt tile.conveyor.name=Förderband @@ -3168,8 +3284,11 @@ tile.conveyor_double.name=Zweispuriges Förderband tile.conveyor_lift.name=Kettenaufzug tile.conveyor_triple.name=Dreispuriges Förderband tile.corium_block.name=Corium +tile.crane_boxer.name=Förderband-Verpacker tile.crane_extractor.name=Förderband-Auswerfer tile.crane_inserter.name=Förderband-Einsetzer +tile.crane_router.name=Förderband-Sortierer +tile.crane_unboxer.name=Förderband-Entpacker tile.crashed_bomb.name=Blindgänger tile.crate.name=Vorratskiste tile.crate_ammo.name=Sternenmetallkiste @@ -3239,8 +3358,10 @@ tile.dfc_stabilizer.name=DFC-Stabilisator tile.dirt_dead.name=Tote Erde tile.dirt_oily.name=Ölige Erde tile.drill_pipe.name=Bohrgestänge -tile.ducrete.name=Ducrete-Fliese +tile.ducrete.name=Ducretefliese +tile.ducrete_stairs.name=Ducretefliesentreppe tile.ducrete_smooth.name=Ducrete +tile.ducrete_smooth_stairs.name=Ducretetreppe tile.dummy_block.name=Dummyblock tile.dummy_port.name=Dummyblock (Stromanschluss) tile.dungeon_chain.name=Metallkette @@ -3249,11 +3370,11 @@ tile.emp_bomb.name=EMP-Ladung tile.factory_advanced_conductor.name=Fortgeschrittener Fabriksstromanschluss tile.factory_advanced_core.name=Fortgeschrittene Fabrikkernkomponente tile.factory_advanced_furnace.name=Fortgeschrittene Fabrikzugriffsluke -tile.factory_advanced_hull.name=Fortgeschrittene Fabrikshülle +tile.factory_advanced_hull.name=Fabrikblock tile.factory_titanium_conductor.name=Einfacher Fabriksstromanschluss tile.factory_titanium_core.name=Einfache Fabrikkernkomponente tile.factory_titanium_furnace.name=Einfache Fabrikzugriffsluke -tile.factory_titanium_hull.name=Einfache Fabrikshülle +tile.factory_titanium_hull.name=Fabrikblock tile.fallout.name=Fallout tile.fence_metal.name=Maschendrahtzaun tile.fire_digamma.name=Verweilendes Digamma @@ -3267,6 +3388,11 @@ tile.float_bomb.name=Schwebebombe tile.fluid_duct.name=Universelles Flüssigkeitsrohr tile.fluid_duct_solid.name=Geschirmtes universelles Flüssigkeitsrohr tile.foam_layer.name=Schaumdecke +tile.foundry_basin.name=Gussbecken +tile.foundry_channel.name=Gusskanal +tile.foundry_tank.name=Gießerei-Lagerbecken +tile.foundry_mold.name=Seichtes Gussbecken +tile.foundry_outlet.name=Ausguss tile.fraction_spacer.name=Fraktionierungsturm-Teiler tile.frozen_dirt.name=Gefrorene Erde tile.frozen_grass.name=Gefrorenes Gras @@ -3341,6 +3467,8 @@ tile.hadron_power_100m.name=Teilchenbeschleuniger-Stromanschluss (100MHE) tile.hadron_power_1g.name=Teilchenbeschleuniger-Stromanschluss (1GHE) tile.hadron_power_10g.name=Teilchenbeschleuniger-Stromanschluss (10GHE) tile.hazmat.name=Strahlenschutzstoff-Block +tile.heater_electric.name=Elektrische Heizung +tile.heater_electric.desc=Erzeugt Wärme aus Strom.$Nimmt von unten Wärme mit 85%% Effizienz auf.$Kann mit einem Schraubenzeiher konfiguriert werden. tile.heater_firebox.name=Feuerbüchse tile.heater_firebox.desc=Erzeugt Wärme aus Festbrennstoff. tile.heater_oilburner.name=Brenner @@ -3376,6 +3504,8 @@ tile.machine_autocrafter.name=Automatische Werkbank tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock +tile.machine_boiler.name=Boiler +tile.machine_boiler.desc=Großer Boiler zum Verdampfen von Wasser oder$Erhitzen von Öl. Benötigt externe Hitzequelle.$Wärmestransferrate: ΔT*0.01 TU/t tile.machine_boiler_electric_off.name=Elektrischer Boiler tile.machine_boiler_electric_on.name=Elektrischer Boiler tile.machine_boiler_off.name=Dampfkessel @@ -3385,6 +3515,7 @@ tile.machine_centrifuge.name=Zentrifuge tile.machine_chemfac.name=Chemiefabrik tile.machine_chemplant.name=Chemiewerk tile.machine_chungus.name=Leviathan-Dampfturbine +tile.machine_chungus.desc=Effizienz: 85%% tile.machine_coal_off.name=Verbrennungsgenerator tile.machine_coal_on.name=Verbrennungsgenerator tile.machine_combine_factory.name=CMB-Stahl Hochofen @@ -3392,6 +3523,7 @@ tile.machine_condenser.name=Dampfkondensierer tile.machine_controller.name=Reaktorfernsteuerung tile.machine_converter_he_rf.name=HE zu RF Konverter tile.machine_converter_rf_he.name=RF zu HE Konverter +tile.machine_crucible.name=Schmelztiegel tile.machine_crystallizer.name=Erzauflöser tile.machine_cyclotron.name=Zyklotron tile.machine_detector.name=Energiedetektor @@ -3420,6 +3552,7 @@ tile.machine_geo.name=Gepthermiegenerator tile.machine_industrial_generator.name=Industrieller Generator tile.machine_keyforge.name=Schlossertisch tile.machine_large_turbine.name=Industrielle Dampfturbine +tile.machine_large_turbine.desc=Effizienz: 100%% tile.machine_lithium_battery.name=Li-Ion-Energiespeicherblock tile.machine_microwave.name=Mikrowelle tile.machine_mining_laser.name=Bergbaulaser @@ -3450,6 +3583,7 @@ tile.machine_rtg_purple.name=Paarvernichtungsgenerator tile.machine_rtg_red.name=Fulminationsgenerator tile.machine_rtg_yellow.name=Australium Supergenerator tile.machine_satlinker.name=Satelliten-ID-Manager +tile.machine_sawmill.name=Stirling-Sägemühle tile.machine_schrabidium_battery.name=Schrabidium-Energiespeicherblock tile.machine_schrabidium_transmutator.name=Schrabidium-Transmutationsgerät tile.machine_selenium.name=Hochleistungs-Sternmotor @@ -3462,6 +3596,8 @@ tile.machine_spp_bottom.name=NPE-Potentialgenerator (Unterteil) tile.machine_spp_top.name=NPE-Potentialgenerator (Oberteil) tile.machine_stirling.name=Stirlingmotor tile.machine_stirling.desc=Erzeugt Energie aus Wärme. Benötigt externe Hitzequelle.$Wärmestransferrate: T*0.1 TU/t$Maximalaufnahme: 300 TU/t$Effizienz: 50%% +tile.machine_stirling_steel.name=Schwerer Stirlingmotor +tile.machine_stirling_steel.desc=Erzeugt Energie aus Wärme. Benötigt externe Hitzequelle.$Verwendet ein schwereres Zahnrad und verträgt höhere Temparaturen.$Wärmestransferrate: T*0.1 TU/t$Maximalaufnahme: 1500 TU/t$Effizienz: 50%% tile.machine_storage_drum.name=Atommüll-Lagertrommel tile.machine_telelinker.name=Geschütz-Telemetrie-Manager tile.machine_teleporter.name=Teleporter @@ -3472,6 +3608,7 @@ tile.machine_transformer_20.name=10k-1Hz-Transformator tile.machine_transformer_dnt.name=DNT-20Hz-Transformator tile.machine_transformer_dnt_20.name=DNT-1Hz-Transformator tile.machine_turbine.name=Dampfturbine +tile.machine_turbine.desc=Effizienz: 85%% tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranhexafluorid-Tank tile.machine_waste_drum.name=Abklingbecken-Trommel @@ -3586,6 +3723,7 @@ tile.pink_log.name=Pinkes Holz tile.pink_planks.name=Pinke Holzbretter tile.pink_slab.name=Pinke Holzstufe tile.pink_stairs.name=Pinke Holztreppen +tile.plant_dead.name=Tote Pflanze tile.plant_flower.foxglove.name=Roter Fingerhut tile.plant_flower.nightshade.name=Schwarze Tollkirsche tile.plant_flower.tobacco.name=Tabakpflanze @@ -3642,6 +3780,7 @@ tile.red_pylon.name=Strommasten tile.red_pylon_large.name=Hochspannungsmasten tile.red_wire_coated.name=Geschirmtes rotes Kupferkabel tile.reinforced_brick.name=Verstärkter Stein +tile.reinforced_brick_stairs.name=Verstärkte Steintreppe tile.reinforced_ducrete.name=Verstärkter Ducrete tile.reinforced_glass.name=Verstärktes Glas tile.reinforced_lamp_off.name=Verstärkte Lampe @@ -3649,6 +3788,7 @@ tile.reinforced_lamp_on.name=Verstärkte Lampe tile.reinforced_light.name=Verstärkter Glowstone tile.reinforced_sand.name=Verstärkter Sandstein tile.reinforced_stone.name=Verdichteter Stein +tile.reinforced_stone_stairs.name=Verdichtete Steintreppe tile.rejuvinator.name=Regenerationsmaschine tile.residue.name=Wolkenrückstände tile.safe.name=Panzerschrank @@ -3716,6 +3856,7 @@ tile.taint.name=Korrupter Schmutz tile.taint_barrel.name=IMP-Rückstandsfass tile.tape_recorder.name=Tonbandgerät tile.tektite.name=Tektit +tile.teleanchor.name=Teleportations-Anker tile.tesla.name=Teslaspule tile.test_nuke.name=Test Atombombe tile.therm_endo.name=Endothermische Bombe @@ -3733,6 +3874,7 @@ tile.turret_cwis.name=Phalanx Mk-15 CIWS tile.turret_flamer.name=Flammenwerfergeschütz tile.turret_friendly.name=Gatlingeschütz "Mister Friendly" tile.turret_fritz.name=Schwered Flammenwerfergeschütz "Fritz" +tile.turret_himars.name=Raketenartilleriegeschütz "Henry" tile.turret_heavy.name=Schweres MG-Geschütz tile.turret_howard.name=Goalkeeper-Zwilling CIWS "Howard" tile.turret_howard_damaged.name=Goalkeeper-Zwilling CIWS "turret_howard_damaged" @@ -3791,7 +3933,7 @@ trait.rbmk.depletion=Erschöpfung: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux-Funktion: %s trait.rbmk.funcType=Funktionstyp: %s -trait.rbmk.heat=Hitze pro Tick bei voller Kraft: %s +trait.rbmk.heat=Hitze pro Flux: %s trait.rbmk.melt=Schmelzpunkt: %s trait.rbmk.neutron.any=Alle Neutronen trait.rbmk.neutron.fast=Schnelle Neutronen diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1dfb75ba8..94bca60ad 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -314,6 +314,45 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea #book.rbmk.title16=Meltdown #book.rbmk.page16=§4§lAvoid. +cannery.f1=[ Press F1 for help ] + +cannery.centrifuge=Gas Centrifuge +cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. +cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. +cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. +cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrifuges, this however will produce Uranium fuel and Uranium-238. +cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. +cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. + +cannery.fensu=FEnSU +cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). +cannery.fensu.1=There is only one energy connector which can be found on the bottom. +cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. + +cannery.firebox=Firebox +cannery.firebox.0=The firebox burns flammable items to generate heat. +cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. +cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. +cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. +cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. + +cannery.silex=FEL & SILEX +cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. +cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... +cannery.silex.2=...but not blast-proof ones. +cannery.silex.3=The FEL is used to power the Laser Isotope Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart. +cannery.silex.4=The laser has to enter through the glass openings of the SILEX. Aiming it wrong could destroy it. +cannery.silex.5=The openings on the sides can be used to connect fluid ducts to the SILEX. +cannery.silex.6=In addition to the two connectors on the sides, there is a third hidden connector at the bottom from which items can be extracted. +cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. +cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. + +cannery.stirling=Stirling Engine +cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. +cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. +cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. +cannery.stirling.3=The upgraded version can take significantly more heat without breaking. + chem.ARSENIC=Arsenic Extraction chem.ASPHALT=Asphalt Production chem.BAKELITE=Bakelite Production @@ -423,8 +462,11 @@ container.bombMulti=Multi Purpose Bomb container.centrifuge=Centrifuge container.chemplant=Chemical Plant container.compactLauncher=Compact Launch Pad -container.craneExtractor=Conveyor Extractor +container.craneBoxer=Conveyor Boxer +container.craneExtractor=Conveyor Ejector container.craneInserter=Conveyor Inserter +container.craneRouter=Conveyor Router +container.craneUnboxer=Conveyor Unboxer container.crateDesh=Desh Crate container.crateIron=Iron Crate container.crateSteel=Steel Crate @@ -462,6 +504,7 @@ container.launchTable=Large Launch Pad container.machineBoiler=Boiler container.machineCMB=CMB Steel Furnace container.machineCoal=Combustion Generator +container.machineCrucible=Crucible container.machineDiesel=Diesel Generator container.machineElectricBoiler=Electric Boiler container.machineFEL=FEL @@ -533,6 +576,7 @@ container.turretArty=Greg container.turretChekhov=Chekhov's Gun container.turretFriendly=Mister Friendly container.turretFritz=Fritz +container.turretHIMARS=Henry container.turretHoward=Howard container.turretJeremy=Jeremy container.turretMaxwell=Maxwell @@ -544,6 +588,7 @@ container.watzPowerplant=Watz Power Plant container.zirnox=ZIRNOX Nuclear Reactor death.attack.acid=%1$s fell into acid. +death.attack.acidPlayer=%1$s was dissolved by %2$s. death.attack.ams=%1$s was bathed in deadly particles that have yet to be named by human science. death.attack.amsCore=%1$s was vaporized in the fire of a singularity. death.attack.asbestos=%1$s is now entitled to financial compensation. @@ -551,6 +596,7 @@ death.attack.bang=%1$s was blasted into bite-sized pieces. death.attack.blackhole=%1$s was spaghettified. death.attack.blender=%1$s was chopped in small, bite-sized pieces. death.attack.boat=%1$s was hit by a boat. +death.attack.boil=%1$s was boiled alive by %2$s. death.attack.boxcar=%1$s was smushed by a falling boxcar. Oh well. death.attack.broadcast=%1$s got their brain melted. death.attack.building=%1$s was hit by a falling building. @@ -664,6 +710,10 @@ fluid.schrabidic_fluid=Schrabidic Acid fluid.toxic_fluid=Stereotypical Green Ooze fluid.volcanic_lava_fluid=Volcanic Lava +foundry.filter=Filter: %s +foundry.inverted=Redstone inverted +foundry.noCast=No mold installed! + geiger.chunkRad=Current chunk radiation: geiger.envRad=Total environmental radiation: geiger.playerRad=Player contamination: @@ -813,6 +863,8 @@ hbmpseudofluid.pf6=Plutonium Hexafluoride hbmpseudofluid.mud_heavy=Heavy Sludge Fraction hbmpseudofluid.mud=Poisonous Sludge Gas +info.asbestos=My lungs are burning. +info.coaldust=It's hard to breathe here. info.coil=Coil Strength info.templatefolder=Created with %s info.template_in=Input: @@ -929,6 +981,7 @@ item.ammo_9mm_chlorophyte.name=9mm Round (Chlorophyte) item.ammo_9mm_du.name=9mm Round (DU) item.ammo_9mm_rocket.name=9mm Rocket item.ammo_arty.name=16" Artillery Shell +item.ammo_arty_cargo.name=16" Express Delivery Artillery Shell item.ammo_arty_classic.name=16" Artillery Shell (The Factorio Special) item.ammo_arty_he.name=16" High Explosive Artillery Shell item.ammo_arty_mini_nuke.name=16" Micro Nuclear Artillery Shell @@ -964,6 +1017,8 @@ item.ammo_grenade_phosphorus.name=40mm Grenade (WP) item.ammo_grenade_sleek.name=40mm Grenade (IF-R&D) item.ammo_grenade_toxic.name=40mm Grenade (Chemical) item.ammo_grenade_tracer.name=40mm Training Grenade +item.ammo_himars_standard.name=M28 Guided Artillery Rocket Pod +item.ammo_himars_single.name=M39A1 Guided Artillery Rocket Pod item.ammo_mirv.name=Mini MIRV item.ammo_mirv_high.name=Mini MIRV (High Yield) item.ammo_mirv_low.name=Mini MIRV (Low Yield) @@ -1028,6 +1083,7 @@ item.ams_lens.name=Stabilizer Lens item.ams_muzzle.name=Ray-Emission Muzzle item.ams_muzzle.desc=...it emits an energy-beam thingy. item.analyzer.name=Analyzer +item.anchor_remote.name=Recall Device item.antiknock.name=Tetraethyllead Antiknock Agent item.apple_euphemium.name=Euphemium Apple item.apple_lead.name=Lead Apple @@ -1069,6 +1125,7 @@ item.balefire_and_ham.name=Ham and Balefire Eggs item.balefire_and_steel.name=Balefire and Steel item.balefire_scrambled.name=Scrambled Balefire Egg item.ball_dynamite.name=Dynamite +item.ball_fireclay.name=Fireclay item.ball_tnt.name=TNT item.ballistite.name=Ballistite item.bandaid.name=Velvet Band-Aid @@ -1497,6 +1554,7 @@ item.cotton_candy.name=Radioactive Cotton Candy item.crate_caller.name=Supply Drop Requester item.crowbar.name=Mk.V Crate Opening Device "Crowbar" item.crucible.name=Crucible +item.crucible_template.name=Crucible Template item.crystal_aluminium.name=Aluminium Crystals item.crystal_beryllium.name=Beryllium Crystals item.crystal_charred.name=Charred Crystal @@ -1718,6 +1776,7 @@ item.gas_mask_mono.name=Half Mask item.gas_mask_olde.name=Leather Gas Mask item.gas_petroleum.name=Petroleum Gas Tank item.gear_large.name=Large Gear +item.gear_large_steel.name=Large Steel Gear item.geiger_counter.name=Handheld Geiger Counter item.gem_alexandrite.name=Alexandrite item.gem_tantalium.name=Tantalium Polycrystal @@ -1789,6 +1848,7 @@ item.gun_bolter_digamma.name=Digamma Gun item.gun_calamity.name=Buzzsaw item.gun_calamity_ammo.name=.50 BMG Round (LEGACY) item.gun_calamity_dual.name=Saddle Gun +item.gun_chemthrower.name=Chemthrower item.gun_cryolator.name=The Cryolator item.gun_cryolator_ammo.name=Cryo Cell item.gun_dampfmaschine.name=Totally Not a Joke Weapon @@ -1976,6 +2036,7 @@ item.ingot_euphemium.desc=A very special and yet strange element. item.ingot_ferrouranium.name=Ferrouranium Ingot item.ingot_fiberglass.name=Fiberglass Bar item.ingot_fiberglass.desc=High in fiber, high in glass. Everything the body needs. +item.ingot_firebrick.name=Firebrick item.ingot_gh336.name=Ghiorsium-336 Ingot item.ingot_gh336.desc=Seaborgium's colleague. item.ingot_graphite.name=Graphite Ingot @@ -2209,6 +2270,8 @@ item.missile_strong.name=Strong HE Missile item.missile_taint.name=Taint-Tipped Missile item.missile_volcano.name=Tectonic Missile item.missile_volcano.desc=Using the power of nuclear explosives, we can summon a volcano! +item.mold_base.name=Blank Foundry Mold +item.mold.name=Foundry Mold item.morning_glory.name=Morning Glory item.motor.name=Motor item.motor_desh.name=Desh Motor @@ -2546,6 +2609,7 @@ item.pile_rod_source.desc=§d[Neutron Source] item.pile_rod_uranium.name=Chicago Pile Uranium Rod item.pile_rod_uranium.desc=§a[Reactive Fuel]$§eUse hand drill to take core sample item.pill_iodine.name=Iodine Pill +item.pill_herbal.name=Herbal Paste item.pin.name=Bobby Pin item.pin.desc="*Unmodified* success rate of picking a standard lock is ~10%. item.pipes_steel.name=Steel Pipes @@ -2671,6 +2735,7 @@ item.powder_quartz.name=Quartz Powder item.powder_ra226.name=Radium-226 Powder item.powder_red_copper.name=Red Copper Powder item.powder_reiium.name=Reiium Powder +item.powder_sawdust.name=Sawdust item.powder_schrabidate.name=Ferric Schrabidate Powder item.powder_schrabidium.name=Schrabidium Powder item.powder_semtex_mix.name=Semtex Blend @@ -3014,6 +3079,7 @@ item.sat_miner.name=Asteroid Mining Ship item.sat_radar.name=Radar Survey Satellite item.sat_resonator.name=Xenium Resonator Satellite item.sat_scanner.name=Satellite with Depth-Resource Scanning Module +item.sawblade.name=Sawblade item.schnitzel_vegan.name=Vegan Schnitzel item.schrabidium_axe.name=Schrabidium Axe item.schrabidium_boots.name=Schrabidium Boots @@ -3029,6 +3095,7 @@ item.scrap.name=Scrap item.scrap_nuclear.name=Radioactive Scraps item.scrap_oil.name=Oily Scraps item.scrap_plastic.name=Plastic Scraps +item.scraps.name=Foundry Scraps item.screwdriver.name=Screwdriver item.screwdriver.desc=Could be used instead of a fuse... item.screwdriver_desh.name=Desh Screwdriver @@ -3373,6 +3440,22 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +shape.billet=Billet +shape.blade=Blade +shape.blades=Shredder Blades +shape.block=Block +shape.dust=Dust +shape.dusttiny=Tiny Dust +shape.hull_big=Big Shell +shape.hull_small=Small Shell +shape.ingot=Ingot +shape.nugget=Nugget +shape.quantum=Quantum +shape.quart=Quarter Block +shape.plate=Plate +shape.stamp=Press Stamp +shape.wire=Wire + soundCategory.ntmMachines=NTM Machines tile.absorber.name=Radiation Absorber @@ -3533,17 +3616,26 @@ tile.bomber.name=Crashed Bomber tile.book_guide.name=Hbm's Nuclear Tech Mod Manual [LEGACY] tile.boxcar.name=Boxcar tile.brick_asbestos.name=Asbestos Bricks +tile.brick_asbestos_stairs.name=Asbestos Brick Stairs tile.brick_compound.name=Compound Mesh +tile.brick_compound_stairs.name=Compound Mesh Stairs tile.brick_concrete.name=Concrete Bricks +tile.brick_concrete_stairs.name=Concrete Brick Stairs tile.brick_concrete_broken.name=Broken Concrete Bricks +tile.brick_concrete_broken_stairs.name=Broken Concrete Brick Stairs tile.brick_concrete_cracked.name=Cracked Concrete Bricks +tile.brick_concrete_cracked_stairs.name=Cracked Concrete Brick Stairs tile.brick_concrete_marked.name=Marked Concrete Bricks tile.brick_concrete_mossy.name=Mossy Concrete Bricks +tile.brick_concrete_mossy_stairs.name=Mossy Concrete Brick Stairs tile.brick_ducrete.name=Ducrete Bricks +tile.brick_ducrete_stairs.name=Ducrete Brick Stairs tile.brick_dungeon.name=Berzelianite Bricks tile.brick_dungeon_circle.name=Berzelianite Cirlce 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_jungle.name=Enargite Bricks tile.brick_jungle_circle.name=Mechanist's Circle tile.brick_jungle_cracked.name=Cracked Enargite Bricks @@ -3554,7 +3646,16 @@ tile.brick_jungle_mystic.name=Arcane Enargite Bricks tile.brick_jungle_ooze.name=Radioactive Enargite Bricks tile.brick_jungle_trap.name=Trapped Enargite Bricks tile.brick_light.name=Light Bricks +tile.brick_light_stairs.name=Light Bricks Stairs tile.brick_obsidian.name=Obsidian Bricks +tile.brick_obsidian_stairs.name=Obsidian Brick Stairs +tile.brick_slab.brick_asbestos.name=Asbestos Brick Slab +tile.brick_slab.brick_compound.name=Compound Mesh Slab +tile.brick_slab.brick_fire.name=Firebrick Slab +tile.brick_slab.brick_light.name=Light Brick Slab +tile.brick_slab.brick_obsidian.name=Obsidian Brick Slab +tile.brick_slab.reinforced_brick.name=Reinforced Stone Slab +tile.brick_slab.reinforced_stone.name=Dense Stone Slab tile.broadcaster_pc.name=Corrupted Broadcaster tile.burning_earth.name=Burning Grass tile.c4.name=C-4 @@ -3581,6 +3682,12 @@ tile.cmb_brick_reinforced.name=Reinforced CMB Bricks tile.compact_launcher.name=Compact Launch Pad tile.concrete.name=Concrete Tile tile.concrete_asbestos.name=Asbestos Concrete +tile.concrete_asbestos_stairs.name=Asbestos Concrete Stairs +tile.concrete_brick_slab.brick_concrete.name=Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_broken.name=Broken Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_cracked.name=Cracked Concrete Brick Slab +tile.concrete_brick_slab.brick_concrete_mossy.name=Mossy Concrete Brick Slab +tile.concrete_brick_slab.brick_ducrete.name=Ducrete Brick Slab tile.concrete_colored.black.name=Black Concrete tile.concrete_colored.blue.name=Blue Concrete tile.concrete_colored.brown.name=Brown Concrete @@ -3598,7 +3705,14 @@ tile.concrete_colored.silver.name=Light Gray Concrete tile.concrete_colored.white.name=White Concrete tile.concrete_colored.yellow.name=Yellow Concrete tile.concrete_pillar.name=Rebar Reinforced Concrete Pillar -tile.concrete_smooth.name=Concrete +tile.concrete_slab.concrete.name=Concrete Tile Slab +tile.concrete_slab.concrete_asbestos.name=Asbestos Concrete Slab +tile.concrete_slab.concrete_smooth.name=Concrete Slab +tile.concrete_slab.ducrete.name=Ducrete Tile Slab +tile.concrete_slab.ducrete_smooth.name=Ducrete Slab +tile.concrete_smooth.name=Concrete Stairs +tile.concrete_smooth_stairs.name=Concrete +tile.concrete_stairs.name=Concrete Tile Stairs tile.concrete_super.name=Über Concrete tile.concrete_super_broken.name=Moldy Debris tile.conveyor.name=Conveyor Belt @@ -3607,8 +3721,11 @@ tile.conveyor_double.name=Double-Lane Conveyor Belt tile.conveyor_lift.name=Conveyor Chain Lift tile.conveyor_triple.name=Triple-Lane Conveyor Belt tile.corium_block.name=Corium +tile.crane_boxer.name=Conveyor Boxer tile.crane_extractor.name=Conveyor Ejector tile.crane_inserter.name=Conveyor Inserter +tile.crane_router.name=Conveyor Sorter +tile.crane_unboxer.name=Conveyor Unboxer tile.crashed_bomb.name=Dud tile.crate.name=Supply Crate tile.crate_ammo.name=Starmetal Crate @@ -3628,6 +3745,7 @@ tile.crystal_virus.name=Dark Crystal tile.deco_aluminium.name=Aluminium Deco Block tile.deco_asbestos.name=Asbestos Roof tile.deco_beryllium.name=Beryllium Deco Block +tile.deco_computer.name=IBM Personal Computer 300PL tile.deco_emitter.name=Deco Light Emitter tile.deco_lead.name=Lead Deco Block tile.deco_rbmk.name=RBMK Deco Block @@ -3679,7 +3797,9 @@ tile.dirt_dead.name=Dead Dirt tile.dirt_oily.name=Oily Dirt tile.drill_pipe.name=Drill Pipe tile.ducrete.name=Ducrete Tile +tile.ducrete_stairs.name=Ducrete Tile Stairs tile.ducrete_smooth.name=Ducrete +tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain @@ -3688,11 +3808,11 @@ tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port tile.factory_advanced_core.name=Advanced Factory Core Component tile.factory_advanced_furnace.name=Advanced Factory Access Hatch -tile.factory_advanced_hull.name=Advanced Factory Casing +tile.factory_advanced_hull.name=Factory Block tile.factory_titanium_conductor.name=Basic Factory Electricity Port tile.factory_titanium_core.name=Basic Factory Core Component tile.factory_titanium_furnace.name=Basic Factory Access Hatch -tile.factory_titanium_hull.name=Basic Factory Casing +tile.factory_titanium_hull.name=Factory Block tile.fallout.name=Fallout tile.fence_metal.name=Chainlink Fence tile.fire_digamma.name=Lingering Digamma @@ -3706,6 +3826,11 @@ tile.float_bomb.name=Levitation Bomb tile.fluid_duct.name=Universal Fluid Duct tile.fluid_duct_solid.name=Coated Universal Fluid Duct tile.foam_layer.name=Foam layer +tile.foundry_basin.name=Foundry Basin +tile.foundry_channel.name=Foundry Channel +tile.foundry_tank.name=Foundry Storage Basin +tile.foundry_mold.name=Shallow Foundry Basin +tile.foundry_outlet.name=Foundry Outlet tile.fraction_spacer.name=Fractioning Tower Separator tile.frozen_dirt.name=Frozen Dirt tile.frozen_grass.name=Frozen Grass @@ -3780,6 +3905,8 @@ tile.hadron_power_100m.name=Particle Accelerator Power Plug (100MHE) tile.hadron_power_1g.name=Particle Accelerator Power Plug (1GHE) tile.hadron_power_10g.name=Particle Accelerator Power Plug (10GHE) tile.hazmat.name=Hazmat Cloth Block +tile.heater_electric.name=Electric Heater +tile.heater_electric.desc=Uses energy to produce heat.$Accepts heat from the bottom with 85%% efficiency.$Can be configured with a screwdriver. tile.heater_firebox.name=Firebox tile.heater_firebox.desc=Burns solid fuel to produce heat. tile.heater_oilburner.name=Fluid Burner @@ -3815,6 +3942,8 @@ tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block +tile.machine_boiler.name=Boiler +tile.machine_boiler.desc=Large boiler that can boil water or heat up oil.$Requires external heat source.$Heat transfer rate: ΔT*0.01 TU/t tile.machine_boiler_electric_off.name=Electric Boiler tile.machine_boiler_electric_on.name=Electric Boiler tile.machine_boiler_off.name=Boiler @@ -3824,6 +3953,7 @@ tile.machine_centrifuge.name=Centrifuge tile.machine_chemfac.name=Chemical Factory tile.machine_chemplant.name=Chemical Plant tile.machine_chungus.name=Leviathan Steam Turbine +tile.machine_chungus.desc=Efficiency: 85%% tile.machine_coal_off.name=Combustion Generator tile.machine_coal_on.name=Combustion Generator tile.machine_combine_factory.name=CMB Steel Furnace @@ -3831,6 +3961,7 @@ tile.machine_condenser.name=Steam Condenser tile.machine_controller.name=Reactor Remote Control Block tile.machine_converter_he_rf.name=HE to RF Converter tile.machine_converter_rf_he.name=RF to HE Converter +tile.machine_crucible.name=Crucible tile.machine_crystallizer.name=Ore Acidizer tile.machine_cyclotron.name=Cyclotron tile.machine_detector.name=Power Detector @@ -3859,6 +3990,7 @@ tile.machine_geo.name=Geothermal Electric Generator tile.machine_industrial_generator.name=Industrial Generator tile.machine_keyforge.name=Locksmith Table tile.machine_large_turbine.name=Industrial Steam Turbine +tile.machine_large_turbine.desc=Efficiency: 100%% tile.machine_liquefactor.name=Industrial Liquefaction Machine tile.machine_liquefactor.desc=Powerful universal machine to turn items into fluids.$Comes with versatile catalytic components, heating elements$and a built-in hydrator for petrochemical liquefaction. tile.machine_lithium_battery.name=Li-Ion Energy Storage Block @@ -3891,6 +4023,7 @@ tile.machine_rtg_purple.name=Antimatter Annihilation Generator tile.machine_rtg_red.name=Fulmination Generator tile.machine_rtg_yellow.name=Australium Superfuel Reactor tile.machine_satlinker.name=Satellite ID Manager +tile.machine_sawmill.name=Stirling Sawmill tile.machine_schrabidium_battery.name=Schrabidium Energy Storage Block tile.machine_schrabidium_transmutator.name=Schrabidium Transmutation Device tile.machine_selenium.name=Radial Performance Engine @@ -3904,6 +4037,8 @@ tile.machine_spp_bottom.name=ZPE Potential Generator (Bottom) tile.machine_spp_top.name=ZPE Potential Generator (Top) tile.machine_stirling.name=Stirling Engine tile.machine_stirling.desc=Turns heat into energy. Requires external heat source.$Heat transfer rate: T*0.1 TU/t$Max intake: 300 TU/t$Efficiency: 50%% +tile.machine_stirling_steel.name=Heavy Stirling Engine +tile.machine_stirling_steel.desc=Turns heat into energy. Requires external heat source.$Uses a much heavier gear to support higher temperatures.$Heat transfer rate: T*0.1 TU/t$Max intake: 1500 TU/t$Efficiency: 50%% tile.machine_storage_drum.name=Nuclear Waste Disposal Drum tile.machine_telelinker.name=Turret Telemetry Linker tile.machine_teleporter.name=Teleporter @@ -3914,6 +4049,7 @@ tile.machine_transformer_20.name=10k-1Hz Transformer tile.machine_transformer_dnt.name=DNT-20Hz Transformer tile.machine_transformer_dnt_20.name=DNT-1Hz Transformer tile.machine_turbine.name=Steam Turbine +tile.machine_turbine.desc=Efficiency: 85%% tile.machine_turbofan.name=Turbofan tile.machine_uf6_tank.name=Uranium Hexafluoride Tank tile.machine_waste_drum.name=Spent Fuel Pool Drum @@ -4028,6 +4164,7 @@ tile.pink_log.name=Pink Log tile.pink_planks.name=Pink Wood Planks tile.pink_slab.name=Pink Wood Slab tile.pink_stairs.name=Pink Wood Stairs +tile.plant_dead.name=Dead Plant tile.plant_flower.foxglove.name=Foxglove tile.plant_flower.nightshade.name=Deadly Nightshade tile.plant_flower.tobacco.name=Tobacco Plant @@ -4084,6 +4221,7 @@ tile.red_pylon.name=Electricity Pole tile.red_pylon_large.name=Large Electricity Pylon tile.red_wire_coated.name=Coated Red Copper Cable tile.reinforced_brick.name=Reinforced Stone +tile.reinforced_brick_stairs.name=Reinforced Stone Stairs tile.reinforced_ducrete.name=Reinforced Ducrete tile.reinforced_glass.name=Reinforced Glass tile.reinforced_lamp_off.name=Reinforced Lamp @@ -4091,6 +4229,7 @@ tile.reinforced_lamp_on.name=Reinforced Lamp tile.reinforced_light.name=Reinforced Glowstone tile.reinforced_sand.name=Reinforced Sandstone tile.reinforced_stone.name=Dense Stone +tile.reinforced_stone_stairs.name=Dense Stone Stairs tile.rejuvinator.name=Rejuvination Device tile.residue.name=Cloud Residue tile.safe.name=Safe @@ -4158,6 +4297,7 @@ tile.taint.name=Taint tile.taint_barrel.name=IMP Residue Barrel tile.tape_recorder.name=Tape Recorder tile.tektite.name=Tektite +tile.teleanchor.name=Teleportation Anchor tile.tesla.name=Tesla Coil tile.test_nuke.name=Test Nuke tile.therm_endo.name=Endothermic Bomb @@ -4176,6 +4316,7 @@ tile.turret_flamer.name=Flamethrower Turret tile.turret_friendly.name=Chaingun Turret "Mister Friendly" tile.turret_fritz.name=Heavy Flamethrower Turret "Fritz" tile.turret_heavy.name=Heavy Machine Gun Turret +tile.turret_himars.name=Rocket Artillery Turret "Henry" tile.turret_howard.name=Goalkeeper Twin Chaingun CIWS "Howard" tile.turret_howard_damaged.name=Goalkeeper Twin Chaingun CIWS "Methusalem" tile.turret_jeremy.name=Autocannon Turret "Jeremy" @@ -4232,7 +4373,7 @@ trait.rbmk.depletion=Depletion: %s trait.rbmk.diffusion=Diffusion: %s trait.rbmk.fluxFunc=Flux function: %s trait.rbmk.funcType=Function type: %s -trait.rbmk.heat=Heat per tick at full power: %s +trait.rbmk.heat=Heat per flux: %s trait.rbmk.melt=Melting point: %s trait.rbmk.neutron.any=All Neutrons trait.rbmk.neutron.fast=Fast Neutrons diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 061933f81..6fa1a320f 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -12,7 +12,7 @@ soundCategory.ntmMachines=Механизмы NTM achievement.acidizer.desc=уфф ай моя кожа achievement.acidizer=Кислюка -achievement.assembly.desc=Подождика, уже час утра? +achievement.assembly.desc=Подожди-ка, уже час утра? achievement.assembly=Завод расширяется achievement.sacrifice=Жертва achievement.sacrifice.desc=Встреться лицом к лицу с огнём и выживи. @@ -27,7 +27,7 @@ achievement.selenium.desc=О,да! achievement.potato=Восстание машин achievement.potato.desc=Можешь убить для меня эту птицу? achievement.c44=Глава 44 -achievement.c44.desc=Гальванизирован! Я имею в виду цинк! +achievement.c44.desc=Гальванизирован! Типа, цинк! achievement.c20_5=Глава [ДВАДЦАТЬ_С_ПОЛОВИНОЙ] achievement.c20_5.desc=??? achievement.space=Последний Рубеж... Хотя ладно, забей. @@ -149,6 +149,45 @@ achievement.sulfuric=я не должен был окунать свои яйц achievement.witchtaunter.desc=Эти твари ничего тебе не сделают! achievement.witchtaunter=Насмехайтесь над ведьмами +cannery.f1=[ Press F1 for help ] + +cannery.centrifuge=Gas Centrifuge +cannery.centrifuge.0=Gas centrifuges can be supplied with fluid using regular fluid ducts. +cannery.centrifuge.1=Most recipes require multiple centrifuges. The intermediate products cannot be transported via pipes. +cannery.centrifuge.2=This side acts as a connector which outputs the intermediate product into an adjacent centrifuge. +cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrifuges, this however will produce Uranium fuel and Uranium-238. +cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. +cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. + +cannery.fensu=FEnSU +cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). +cannery.fensu.1=There is only one energy connector which can be found on the bottom. +cannery.fensu.2=This is also the only place where the FEnSU can receive a redstone signal. + +cannery.firebox=Firebox +cannery.firebox.0=The firebox burns flammable items to generate heat. +cannery.firebox.1=It can burn any flammable item, although higher quality fuels such as coal, coke and solid fuel burn longer and hotter. +cannery.firebox.2=Heat is given off by the copper contact at the top of the firebox. Machines with an identical contact on the bottom can receive heat by being placed on top of the firebox. +cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. +cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. + +cannery.silex=FEL & SILEX +cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. +cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... +cannery.silex.2=...but not blast-proof ones. +cannery.silex.3=The FEL is used to power the Laser Isotope Separation Chamber (SILEX). The FEL and SILEX have to be at least two blocks apart. +cannery.silex.4=The laser has to enter through the glass openings of the SILEX. Aiming it wrong could destroy it. +cannery.silex.5=The openings on the sides can be used to connect fluid ducts to the SILEX. +cannery.silex.6=In addition to the two connectors on the sides, there is a third hidden connector at the bottom from which items can be extracted. +cannery.silex.7=Each recipe requires a specific laser type. Using a stronger type than required will process items faster. +cannery.silex.8=One FEL can supply up to 5 SILEX. Each SILEX has to be one block apart from one another. + +cannery.stirling=Stirling Engine +cannery.stirling.0=The Stirling engine uses heat energy from external sources to create power. +cannery.stirling.1=It needs to be placed on top of a heat-producing machine, such as the firebox. +cannery.stirling.2=The amount of heat it can utilize however is limited, overspinning can lead to catastrophic malfunction. +cannery.stirling.3=The upgraded version can take significantly more heat without breaking. + potion.hbm_taint=Порча potion.hbm_mutation=Заражённое порчей сердце potion.hbm_radiation=Излучение @@ -190,6 +229,8 @@ weapon.elecGun.glass_cannon.uv=Ультрафиолет weapon.elecGun.glass_cannon.xray=Рентген weapon.elecGun.glass_cannon.gamma=Гамма-лучи +info.asbestos=Мои лёгкие горят. +info.coaldust=Здесь тяжело дышать. info.coil=Сила катушки info.templatefolder=Создано с помощью %s info.template_in=Ввод: @@ -222,7 +263,7 @@ armor.rocketBoots=Ракетные ботинки armor.sprintBoost=Ускоренный бег armor.projectileProtection=Модификатор урона %s от снарядов armor.dash=Даёт %s рывков -armor.yield=Protection applies to damage <%s +armor.yield=Защита применима к урону <%s armorMod.all=Всему armorMod.applicableTo=Применяется к: @@ -311,32 +352,39 @@ trait.rbmx.xenon=Свинцовое отравление: %s trait.rbmx.xenonBurn=Функция разрушения свинца: %s trait.rbmx.xenonGen=Функция создания свинца: %s -turret.animals=Target Passive: %s -turret.machines=Target Machines: %s -turret.mobs=Target Mobs: %s -turret.none=None -turret.off=OFF -turret.on=ON -turret.players=Target Players: %s +turret.animals=Целиться по пассивным: %s +turret.machines=Целиться по машинам: %s +turret.mobs=Целиться по мобам: %s +turret.none=Ничего +turret.off=ВЫКЛ +turret.on=ВКЛ +turret.players=Целиться по игрокам: %s -battery.mode.buffer=Input/Output Mode -battery.mode.input=Input Mode -battery.mode.off=OffW -battery.mode.output=Output Mode -battery.priority.high=Charge Priority: High -battery.priority.high.desc=Emergency buffers that$always need to be full -battery.priority.low=Charge Priority: Low -battery.priority.low.desc=Most use-cases where surplus$energy needs to be stored without$affecting machine performance -battery.priority.normal=Charge Priority: Normal -battery.priority.normal.desc=Smaller power grids where$priority doesn't matter -battery.priority.recommended=Recommended for: -battery.redstone.off=Redstone OFF -battery.redstone.on=Redstone ON +battery.mode.buffer=Буферный режим +battery.mode.input=Зарядка +battery.mode.off=Отключено +battery.mode.output=Разрядка +battery.priority.high=Приоритет: Высший +battery.priority.high.desc=Аварийные буферы, которые$всегда должны быть полными +battery.priority.low=Приоритет: Низкий +battery.priority.low.desc=Большинство случаев использования, когда$избыточная энергия должна храниться без$влияния на производительность машины +battery.priority.normal=Приоритет: Обычный +battery.priority.normal.desc=Небольшие электросети, где приоритет$не имеет значения +battery.priority.recommended=Рекомендуется для: +battery.redstone.off=Редстоун выключен +battery.redstone.on=Редстоун включен rbmk.heat=Температура компонента: %s rbmk.boiler.water=Вода: %s / %s rbmk.boiler.steam=Пар: %s / %s rbmk.boiler.type=Сжатие: %s +rbmk.console.assign=Назначить стержни к экрану #%s +rbmk.console.none=Выкл. +rbmk.console.col_temp=Средняя температура стержня +rbmk.console.rod_extraction=Среднее извлечение регулирующих стержней +rbmk.console.fuel_depletion=Среднее топливное обеднение +rbmk.console.fuel_poison=Среднее ксеноновое отравление +rbmk.console.fuel_temp=Средняя температура топлива rbmk.control.level=%s rbmk.control.red=§cКрасная группа rbmk.control.yellow=§eЖёлтая группа @@ -348,6 +396,25 @@ rbmk.rod.depletion=Обеднение: %s rbmk.rod.xenon=Ксеноновое отравление: %s rbmk.rod.coreTemp=Температура стержня: %s rbmk.rod.skinTemp=Температура оболочки стержня: %s / %s +rbmk.screen.core=Core: %s +rbmk.screen.depletion=Depl: %s +rbmk.screen.rod=Control: %s +rbmk.screen.temp=Temp: %s +rbmk.screen.xenon=Xenon: %s + +shape.quantum=Кванта +shape.nugget=Самородок +shape.dusttiny=Кучка пыли +shape.wire=Провод +shape.billet=Заготовка +shape.ingot=Слиток +shape.dust=Порошок +shape.plate=Пластина +shape.quart=Четверть блока +shape.block=Блок +foundry.noCast=Литейная форма не установлена! +foundry.filter=Фильтр: %s +foundry.inverted=Инвертирован редстоуном hbm.key=NTM Hotkeys hbm.key.calculator=Калькулятор @@ -625,18 +692,18 @@ gun.make.UNKNOWN=??? gun.make.WINCHESTER=Winchester Repeating Arms Company gun.make.WINCHESTER_BIGMT=Winchester Repeating Arms Company / Большая Гора -gun.name.ar15_50=AR-15 .50 BMG Mod -gun.name.baeAR=Britannian Standard Issue Assault Rifle -gun.name.bel=Balefire Egg Launcher +gun.name.ar15_50=Модификация AR-15 под .50 BMG +gun.name.baeAR=Стандартная винтовка британнской армии +gun.name.bel=Катапульта для жар-яиц gun.name.benelli=Benelli M4 Super 90 -gun.name.benelliDrum=Benelli M4 Super 90 (Drum Magazine Modification) -gun.name.bolter=Manticora Pattern Boltgun -gun.name.cz53=CZ53 Personal Minigun -gun.name.cz57=CZ57 Avenger Minigun -gun.name.dart=Needle Gun +gun.name.benelliDrum=Benelli M4 Super 90 (Барабанный магазин) +gun.name.bolter=Болтер модели "Мантикора" +gun.name.cz53=Персональный миниган CZ53 +gun.name.cz57=Миниган "Мститель" CZ57 +gun.name.dart=Игломёт gun.name.deagle=IMI Desert Eagle -gun.name.emp=EMP Orb Projector -gun.name.extinguisher=PROTEX Fire Exinguisher 6kg +gun.name.emp=Проектор ЭМИ-сфер +gun.name.extinguisher=6кг огнетушитель PROTEX gun.name.ffiV=FFI Viper gun.name.ffiVInox=FFI Viper Inox gun.name.ffiVLead=FFI Viper Lead @@ -646,45 +713,45 @@ gun.name.ffiVUltra=FFI Viper Ultra gun.name.ffivBling=FFI Viper Bling gun.name.ffivSatur=FFI Viper D-25A gun.name.gPistol=Granatpistole HK69 -gun.name.gustav=Carl Gustav Recoilless Rifle M1 -gun.name.ifHorseshoe=IF-18 Horseshoe -gun.name.ifPit=IF-18 Horseshoe Bottomless Pit -gun.name.ifScope=IF-18 Horseshoe Scoped -gun.name.ifStorm=IF-18 Horseshoe Silver Storm -gun.name.ifVanity=IF-18 Horseshoe Vanity +gun.name.gustav=Безоткатная винтовка "Карл-Густав" M1 +gun.name.ifHorseshoe=IF-18 "Подкова" +gun.name.ifPit=IF-18 "Подкова" - Бездонная яма +gun.name.ifScope=IF-18 "Подкова" с прицелом +gun.name.ifStorm=IF-18 "Подкова" - Сильвер Шторм +gun.name.ifVanity=IF-18 "Подкова" - Ванити gun.name.karl=M1 Karl-Gerät gun.name.ks23=KS-23 -gun.name.lacunae=Auntie Lacunae +gun.name.lacunae=Тётушка Лакунэ gun.name.lunaAR=1936 Bishamonten type Assault Rifle gun.name.lunaGun=1958 Lunatic Gun (Revised) gun.name.lunaHLR=1944 Chang'e type LMG gun.name.lunaSMG=1936 Ānanda type SMG gun.name.lunaSniper=1909 Rāhula type Anti-Material Rifle gun.name.lunaTWR=Time Warp Rifle -gun.name.m42=M-42 Tactical Nuclear Catapult -gun.name.m42MIRV=M-42 Experimental MIRV -gun.name.m60=Machine Gun, Caliber 7.62 mm, M60 -gun.name.maxim=Maxim gun -gun.name.maximDouble=Double Maxim gun +gun.name.m42=Тактическая ядерная катапульта M-42 +gun.name.m42MIRV=Экспериментальная РГН M-42 +gun.name.m60=Пулемёт калибра 7.62мм M60 +gun.name.maxim=Пулемёт "Максим" +gun.name.maximDouble=Сдвоенный пулемёт "Максим" gun.name.mp40=Maschinenpistole 40 -gun.name.nerf=NERF blaster of unknown design -gun.name.osipr=Overwatch Standard Issue Pulse Rifle +gun.name.nerf=Неизвестный бластер NERF +gun.name.osipr=Стандартная пульсовая винтовка Патруля gun.name.panz=Raketenpanzerbüchse 54 -gun.name.quadro=OpenQuadro Guided Man-Portable Missile Launcher -gun.name.revolverCursed=Britannia Standard Issue Motorized Handgun -gun.name.sauer=Sauer Shotgun +gun.name.quadro=Счетверённый переносной ракетный гранатомёт +gun.name.revolverCursed=Стандартный пистолет британнской армии +gun.name.sauer=Дробовик Sauer gun.name.spiw=H&R SPIW -gun.name.supershotty=Double-Barreled Combat Shotgun -gun.name.tau=XVL1456 Tau Cannon -gun.name.tommy9=M1A1 Submachine Gun 9mm Mod -gun.name.tommy=M1A1 Submachine Gun -gun.name.topaz=Heavy Duty Flamer +gun.name.supershotty=Двуствольный дробовик +gun.name.tau=Тау-пушка XVL1456 +gun.name.tommy9=Модификация пистолета-пулемёта M1A1 под 9мм +gun.name.tommy=Пистолет-пулемёт M1A1 +gun.name.topaz=Тяжёлый огнемёт gun.name.uacCarbine=UAC-41 Carbine gun.name.uacDMR=UAC-30 Designated Marksman Rifle gun.name.uacLMG=UAC-49 Light Machine Gun gun.name.uacPistol=UAC .45 Standard Issue Handgun gun.name.uacSMG=UAC Compact Sub-Machine Gun -gun.name.uboinik=Uboinik Revolving Shotgun +gun.name.uboinik=Револьверный дробовик "Убойник" gun.name.uzi=IMI Uzi gun.name.uziSatur=IMI Uzi D-25A gun.name.win1887=Winchester Model 1887 @@ -692,7 +759,7 @@ gun.name.win1887Inox=Winchester Model 1887 Inox gun.name.win20Inox=Winchester Model 20 Inox gun.name.win20Poly=Winchester Model 20 Polymer gun.name.win20Satur=Winchester Model 20 D-25A -gun.name.zomg=EMC101 Prismatic Negative Energy Cannon +gun.name.zomg=Пушка отрицательной энергии EMC101 book.error.cover=Адронный Коллайдер:$Диагностирование проблем book.error.title1=Ошибка 0x01 [NC] @@ -829,7 +896,19 @@ book.starter.page15=Наконец, вы можете создать свой п book.starter.title16=Заключение book.starter.page16=Если вы зашли так далеко, значит, вы на пути к тому, чтобы помочь восстановить цивилизацию. Вы успешно воссоздали передовую технику доапокалипсиса - с помощью ядерной энергетики, нефтехимии и многого другого. Я не могу знать, §oкак§r вы будете использовать эти новообретенные преимущества, но я лично надеюсь, что вы используете их на благо себе и другим - или, по крайней мере, в целях самообороны. До свидания! book.starter.title18=Об авторе -book.starter.page18=vær - просто парень, который слишком долго был пойман в ловушку серой пустоты, показанной в фильме "Говорящая голова" §o"Раз в жизни"§r. Однажды он нашел дверь студии, но, к своему ужасу, обнаружил, что она была вырезана из картона. +book.starter.page18=vær - просто парень, который слишком долго был пойман в ловушку серой пустоты, показанной в клипе Talking Heads §o"Once In A Lifetime"§r. Однажды он нашел дверь студии, но, к своему ужасу, обнаружил, что она была вырезана из картона. + +book.lore.office0.title=Заявление об увольнении +book.lore.office0.author=Kosma +book.lore.office0.page1=Вчера руководство снова сократило наш отдел. Эти идиоты должны винить только самих себя, я не знаю, чего они ожидали после фиаско с Панаем. Кто, черт возьми, сливает такую информацию? Мы теряем миллионы, и +book.lore.office0.page2=это Я сейчас без работы. Это меня просят уйти в отставку. Я надеюсь, что вы, придурки, наконец-то извлекли урок из своего переизбытка ошибок и вытащили эту палку из своей задницы. +book.lore.office0.page3=Я не вернусь в пятницу. Просто пришлите чек на зарплату. + +book.lore.office1.title=Заметка +book.lore.office1.author=Jonas Quinn +book.lore.office1.page1= +book.lore.office2.page2= + hbmfluid.none=Ничего hbmfluid.water=Вода @@ -1172,7 +1251,7 @@ death.attack.digamma=%1$s шагнул в пустоту. death.attack.asbestos=%1$s теперь имеет право на финансовую компенсацию. death.attack.mku=%1$s умер по неизвестным причинам. death.attack.BERYLLIUM=лёгкие %1$s выдохлись от воздействия бериллия. -death.attack.CHEMICAL=органы %1$s отключились. +death.attack.CHEMICAL=Органы %1$s отключились. death.attack.HEAVY_METAL=%1$s умер от отравления тяжёлыми металлами. death.attack.bleed=органы %1$s вытекли из-за наличия в них отверстий. death.attack.burn=%1$s был полностью сожжён горячей плазмой @@ -1191,6 +1270,8 @@ death.attack.twr2=%2$s разбил %1$s на миллион осколков с death.attack.twr3=%2$s показал %1$s, что здесь нету выхода. death.attack.overdose=%1$s умер от передоза метамфетамином. death.attack.microwave=%1$s взорвался от микроволнового излучения. +death.attack.acidPlayer=%1$s был растворён %2$s. +death.attack.boil=%1$s был заживо сварен %2$s. item.redstone_sword.name=Меч из красного камня item.big_sword.name=Большой меч @@ -1351,6 +1432,13 @@ tile.struct_iter_core.name=Ядро термоядерного реактора tile.machine_difurnace_off.name=Доменная печь tile.machine_difurnace_on.name=Доменная печь container.diFurnace=Доменная печь +tile.foundry_basin.name=Литейный резервуар +tile.foundry_channel.name=Литейный канал +tile.foundry_outlet.name=Литейный спуск +tile.foundry_mold.name=Малый литейный резервуар +tile.foundry_tank.name=Литейный бассейн +tile.machine_crucible.name=Плавильня +container.machineCrucible=Плавильня tile.machine_centrifuge.name=Центрифуга container.centrifuge=Центрифуга tile.machine_gascent.name=Газовая центрифуга @@ -1432,6 +1520,7 @@ container.machineShredder=Измельчитель tile.machine_combine_factory.name=Печь для стали Альянса container.machineCMB=Печь для стали Альянса tile.machine_teleporter.name=Телепорт +tile.teleanchor.name=Телепортационный якорь container.teleporter=Телепорт tile.machine_reix_mainframe.name=Мэйнфрейм Rei-X (WIP) container.reix=Мэйнфрейм Rei-X @@ -1598,12 +1687,18 @@ container.craneExtractor=Конвейерный извлекатель container.craneInserter=Конвейерный вставщик tile.crane_extractor.name=Конвейерный извлекатель tile.crane_inserter.name=Конвейерный вставщик +container.craneBoxer=Конвейерный упаковщик +container.craneRouter=Конвейерный сортировщик +container.craneUnboxer=Конвейерный распаковщик +tile.crane_boxer.name=Конвейерный упаковщик +tile.crane_router.name=Конвейерный сортировщик +tile.crane_unboxer.name=Конвейерный распаковщик tile.conveyor_chute.name=Конвейерный желоб tile.conveyor_double.name=Двухполосная конвейер tile.conveyor_lift.name=Конвейерный цепной лифт tile.conveyor_triple.name=Трёхполосный конвейер -container.turretArty=Грэг -tile.turret_arty.name=Артиллерийская турель "Грэг" +container.turretArty=Грег +tile.turret_arty.name=Артиллерийская турель "Грег" container.heaterFirebox=Топка tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. @@ -1612,6 +1707,9 @@ tile.heater_oilburner.name=Жидкостный бойлер tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо. tile.machine_stirling.name=Генератор Стирлинга tile.machine_stirling.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 300 TU/t$Эффективность: 50%% +tile.machine_stirling_steel.name=Укреплённый генератор Стирлинга +tile.machine_stirling_steel.desc=Превращает тепло в энергию. Требует внешний источник тепла.$Использует более тяжёлую шестерню, чтобы выдерживать высокие температуры.$Скорость теплопередачи: T*0.1 TU/t$Максимальное потребление: 1500 TU/t$Эффективность: 50%% +tile.machine_sawmill.name=Лесопилка на генераторе Стирлинга container.hadron=Ускоритель частиц tile.hadron_access.name=Терминал доступа ускорителя частиц @@ -1780,12 +1878,12 @@ tile.machine_storage_drum.name=Бочка для захоронения ядер tile.machine_spp_bottom.name=Генератор потенциала ZPE (низ) tile.machine_spp_top.name=Генератор потенциала ZPE (верх) -tile.ams_limiter.name=Стабилизатор АМС [Деко] -container.amsLimiter=Стабилизатор АМС [Деко] -tile.ams_emitter.name=Излучатель АМС [Деко] -container.amsEmitter=Излучатель АМС [Деко] -tile.ams_base.name=Основание АМС [Деко] -container.amsBase=Основание АМС [Деко] +tile.ams_limiter.name=Стабилизатор АМС [Декор] +container.amsLimiter=Стабилизатор АМС [Декор] +tile.ams_emitter.name=Излучатель АМС [Декор] +container.amsEmitter=Излучатель АМС [Декор] +tile.ams_base.name=Основание АМС [Декор] +container.amsBase=Основание АМС [Декор] tile.dfc_emitter.name=Излучатель РТС container.dfcEmitter=Излучатель РТС @@ -1813,7 +1911,10 @@ item.fluid_identifier_multi.info=Жидкостный идентификатор item.fluid_identifier_multi.info2=Второй тип: item.assembly_template.name=Шаблон сборочной машины: item.chemistry_template.name=Шаблон химической машины: +item.crucible_template.name=Шаблон плавильни: item.siren_track.name=Трек сирены +item.mold_base.name=Пустая литейная форма +item.mold.name=Литейная форма item.bobmazon_materials.name=Бобмазон: Материалы item.bobmazon_machines.name=Бобмазон: Блоки и машины @@ -1825,7 +1926,7 @@ item.fuse.name=Предохранитель item.arc_electrode.name=Графитовый электрод item.arc_electrode_burnt.name=Расплавленный электрод item.arc_electrode_desh.name=Электрод из деш -item.crt_display.name=Электронно-Лучевая трубка +item.crt_display.name=Электронно-лучевая трубка tile.test_nuke.name=Тестовая бомба @@ -1854,7 +1955,7 @@ item.ingot_titanium.name=Титановый слиток item.ingot_cobalt.name=Кобальтовый слиток item.ingot_tantalium.name=Танталовый слиток item.ingot_tantalium.desc='Танталум' -item.ingot_tantalium.desc.P11=АКА Танталум. +item.ingot_tantalium.desc.P11=АКА Танталий. item.ingot_meteorite.name=Метеоритовый слиток item.ingot_osmiridium.name=Осмиридиевый слиток item.ingot_meteorite_forged.name=Выкованный метеоритовый слиток @@ -1909,6 +2010,7 @@ item.ingot_bismuth.name=Слиток висмута item.cube_power.name=Куб электрония item.ingot_smore.name=Слиток с'мора item.ingot_niobium.name=Ниобиевый слиток +item.ingot_firebrick.name=Шамотный кирпич item.plate_armor_lunar.name=Лунная обшивка item.plate_armor_titanium.name=Титановая обшивка брони @@ -1930,7 +2032,7 @@ item.servo_set_desh.name=Набор деш-сервоприводов item.bandaid.name=Пластырь Вельвет item.bathwater.name=Токсичная мыльная вода item.bathwater_mk2.name=Токсичная мыльная вода (Лошадиный аромат) -item.horseshoe_magnet.name=Подковообразный магнит +item.horseshoe_magnet.name=Магнит-подкова item.industrial_magnet.name=Промышленный магнит item.lodestone.name=Магнетит item.morning_glory.name=Монин Глори @@ -2072,7 +2174,7 @@ item.nugget_beryllium.name=Бериллиевый самородок item.nugget_bismuth.name=Самородок висмута item.nugget_tantalium.name=Самородок тантала item.nugget_tantalium.desc='Танталум' -item.nugget_tantalium.desc.P11=АКА Танталум. +item.nugget_tantalium.desc.P11=АКА Танталий. item.nugget_osmiridium.name=Самородок осмиридия item.crystal_iron.name=Кристаллизованное железо @@ -2103,7 +2205,7 @@ item.crystal_cinnebar.name=Кристаллизованная киноварь item.crystal_lapis.name=Кристализованный лазурит item.gem_tantalium.name=Поликристалл тантала item.gem_tantalium.desc='Танталум' -item.gem_tantalium.desc.P11=АКА Танталум. +item.gem_tantalium.desc.P11=АКА Танталий. item.gem_alexandrite.name=Александрит item.gem_volcanic.name=Вулканический самоцвет item.black_diamond.name=Чёрный алмаз @@ -2251,6 +2353,7 @@ tile.block_insulator.name=Рулон изолятора tile.block_fiberglass.name=Рулон стекловолокна tile.block_asbestos.name=Асбест tile.brick_asbestos.name=Асбестовые кирпичи +tile.brick_fire.name=Шамотные кирпичи tile.block_cobalt.name=Кобальтовый блок tile.block_lithium.name=Литиевый блок tile.block_white_phosphorus.name=Блок белого фосфора @@ -2367,7 +2470,7 @@ tile.ore_bedrock_coltan.name=Бедроковая колтановая руда tile.ore_bedrock_oil.name=Бедроковый нефтяной пласт tile.ore_cobalt.name=Кобальтовая руда tile.stone_porous.name=Пористый камень -tile.ore_random.name=%s руды +tile.ore_random.name=Руда %s tile.bobblehead.name=Болванчик tile.deco_titanium.name=Титановый декоративный блок @@ -2493,6 +2596,7 @@ tile.gneiss_tile.name=Сланцевая плитка tile.brick_ducrete.name=Дюкретовые кирпичи tile.ducrete.name=Дюкретовая плитка tile.ducrete_smooth.name=Дюкрет +tile.ducrete_debris.name=Дюкретовые обломки tile.reinforced_ducrete.name=Усиленный дюкрет tile.asphalt.name=Асфальт tile.asphalt_light.name=Асфальтированный светящийся камень @@ -2520,7 +2624,7 @@ tile.gas_meltdown.name=Газ из активной зоны tile.gas_coal.name=Воздушная угольная пыль tile.gas_explosive.name=Взрывоопасный газ tile.cmb_brick.name=Плита из стали Альянса -tile.cmb_brick_reinforced.name=Усиленные стальные кирпичи Альянса +tile.cmb_brick_reinforced.name=Усиленные кирпичи из стали Альянса tile.ladder_aluminium.name=Алюминиевая лестница tile.ladder_cobalt.name=Кобальтовая лестница tile.ladder_copper.name=Медная лестница @@ -2667,7 +2771,7 @@ item.powder_coltan.name=Очищенный танталит item.powder_coltan_ore.name=Измельченный Колтан item.powder_tantalium.name=Порошок тантала item.powder_tantalium.desc='Танталум' -item.powder_tantalium.desc.P11=АКА Танталум. +item.powder_tantalium.desc.P11=АКА Танталий. item.powder_impure_osmiridium.name=Порошок загрязнённого осмиридия item.powder_paleogenite.name=Порошок палеогенита item.powder_paleogenite_tiny.name=Кучка палеогенитового порошка @@ -2675,6 +2779,7 @@ item.powder_tektite.name=Порошок тектита item.powder_ra226.name=Порошок радия-226 item.powder_sr90.name=Порошок стронция-90 item.powder_sr90_tiny.name=Кучка порошка стронция-90 +item.powder_sawdust.name=Древесные опилки item.fragment_neodymium.name=Неодимовый осколок item.fragment_cobalt.name=Кобальтовый осколок @@ -3134,6 +3239,7 @@ item.kit_toolbox_empty.name=Пустой ящик для инструменто tile.burning_earth.name=Горящая трава tile.waste_earth.name=Мертвая трава tile.dirt_dead.name=Мертвая земля +tile.plant_dead.name=Мертвое растение tile.dirt_oily.name=Пропитанная нефтью земля tile.waste_trinitite.name=Тринититовая руда tile.waste_trinitite_red.name=Красная тринититовая руда @@ -3146,6 +3252,7 @@ item.nuclear_waste.name=Ядерные отходы item.scrap_nuclear.name=Радиоактивный мусор item.scrap_oil.name=Нефтяные отходы item.scrap_plastic.name=Куски пластмассы +item.scraps.name=Литейный шлак item.nuclear_waste_tiny.name=Маленькая кучка ядерных отходов item.nuclear_waste_vitrified.name=Остеклованные ядерные отходы item.nuclear_waste_vitrified_tiny.name=Кучка остеклованных ядерных отходов @@ -3365,6 +3472,7 @@ tile.frozen_planks.name=Замороженные доски tile.tape_recorder.name=Магнитофон tile.steel_poles.name=Стальные опоры tile.pole_top.name=Антенна +tile.deco_computer.name=Персональный компьютер IBM 300PL tile.pole_satellite_receiver.name=Спутниковая тарелка tile.steel_wall.name=Стальная стенка tile.steel_corner.name=Стальной угол стены @@ -3418,6 +3526,7 @@ item.gun_xvl1456.name=Прототип Тау-пушки XVL1456 item.gun_osipr.name=Импульсная винтовка Патруля item.gun_immolator.name=Иммолятор item.gun_flamer.name=Мистер Топаз +item.gun_chemthrower.name=Химомёт item.gun_cryolator.name=Криолятор item.gun_mp.name=Пулемет Пацифистов item.gun_zomg.name=ZOMG-пушка @@ -3437,7 +3546,7 @@ item.gun_folly.name=Прототип Дигамма "Причуда" item.gun_darter.name=Дротиковый пистолет item.gun_mymy.name=Ньетес item.gun_ar15.name="Джош" -item.gun_glass_cannon.name=Стелянная пушка +item.gun_glass_cannon.name=Стеклянная пушка item.gun_revolver_iron_ammo.name=Пуля item.gun_revolver_ammo.name=Свинцовая пуля @@ -3642,6 +3751,7 @@ item.cordite.name=Кордит item.ballistite.name=Баллистит item.ball_dynamite.name=Динамит item.ball_tnt.name=ТНТ +item.ball_fireclay.name=Шамотная глина item.plate_kevlar.name=Кевларо-керамический состав item.weaponized_starblaster_cell.name=§cСмонтированная энергетическая ячейка Звездного бластера§r @@ -3726,6 +3836,7 @@ item.radx.name=Рад-X item.mentats.name=Ментаты item.pt_mentats.name=Праздничные Ментаты item.pill_iodine.name=Таблетка иода +item.pill_herbal.name=Травяная паста item.fmn.name=Таблетка флунитразепама item.xanax.name=Препарат "НАКСА" против дигаммы item.five_htp.name=Таблетки энтерамина @@ -3813,6 +3924,7 @@ item.generator_front.name=Перед генератора item.blade_tungsten.name=Усиленная вольфрамом лопасть item.turbine_tungsten.name=Усиленные лопасти турбовентилятора item.gear_large.name=Большая шестерня +item.gear_large_steel.name=Большая стальная шестерня item.combine_scrap.name=Металлолом Альянса item.chopper_head.name=Кабина Вертолета-охотника @@ -3836,7 +3948,7 @@ item.plate_euphemium.name=Составная пластина из эвфеми item.plate_dineutronium.name=Составная пластина из динейтрония item.plate_desh.name=Составная пластина из деш item.plate_bismuth.name=Составная пластина из висмута -item.plate_bismuth.desc=Ребята, клянусь, это алхимический символ Висмута. +item.plate_bismuth.desc=Ребята, клянусь, это алхимический символ висмута. item.plate_fuel_mox.name=МОКС-топливная пластина item.plate_fuel_pu238be.name=Плутоний-238-Бериллевая топливная пластина @@ -3858,7 +3970,7 @@ item.euphemium_plate.name=Эвфемиевый нагрудник item.euphemium_legs.name=Эвфемиевые поножи item.euphemium_boots.name=Эвфемиевые ботинки -item.schrabidium_helmet.name=Шрабидиевый щлем +item.schrabidium_helmet.name=Шрабидиевый шлем item.schrabidium_plate.name=Шрабидиевый нагрудник item.schrabidium_legs.name=Шрабидиевые поножи item.schrabidium_boots.name=Шрабидиевые ботинки @@ -4082,7 +4194,7 @@ item.missile_custom.name=Пользовательская Ракета item.missile_carrier.name=Ракета-носитель HTR-01 item.missile_soyuz.name=Союз-ФГ item.missile_soyuz_lander.name=Орбитальный Модуль -item.missile_soyuz_lander.desc=Также и паршивый посадочный модуль! +item.missile_soyuz_lander.desc=А также паршивый посадочный модуль! item.sat_mapper.name=Спутник для Картографирования Поверхности item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования item.sat_radar.name=Спутник с Радиолокационным Зондированием @@ -4096,12 +4208,12 @@ item.sat_chip.name=Спутниковый ID-чип item.sat_interface.name=Интерфейс спутникового управления item.sat_coord.name=Спутниковый целеуказатель item.sat_designator.name=Спутниковый лазерный целеуказатель -tile.sat_mapper.name=Спутник для картографирования поверхности (Декорация) -tile.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования (Декорация) -tile.sat_radar.name=Спутник с радиолокационным зондированием (Декорация) -tile.sat_laser.name=Орбитальный Луч Смерти (Декорация) -tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декорация) -tile.sat_resonator.name=Спутник с Зен-Резонатором (Декорация) +tile.sat_mapper.name=Спутник для картографирования поверхности (Декор) +tile.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования (Декор) +tile.sat_radar.name=Спутник с радиолокационным зондированием (Декор) +tile.sat_laser.name=Орбитальный Луч Смерти (Декор) +tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декор) +tile.sat_resonator.name=Спутник с Зен-Резонатором (Декор) item.hazmat_helmet.name=Защитный шлем item.hazmat_plate.name=Защитный нагрудник @@ -4109,8 +4221,8 @@ item.hazmat_legs.name=Защитные поножи item.hazmat_boots.name=Защитные ботинки item.hazmat_helmet_red.name=Улучшенный защитный шлем item.hazmat_plate_red.name=Улучшенный защитный нагрудник -item.hazmat_legs_red.name=Улучшенный защитные поножи -item.hazmat_boots_red.name=Улучшенный защитные ботинки +item.hazmat_legs_red.name=Улучшенные защитные поножи +item.hazmat_boots_red.name=Улучшенные защитные ботинки item.hazmat_helmet_grey.name=Высокоэффективный защитный шлем item.hazmat_plate_grey.name=Высокоэффективный защитный нагрудник item.hazmat_legs_grey.name=Высокоэффективные защитные поножи @@ -4314,7 +4426,7 @@ item.desh_sword.name=Меч из рабочего сплава item.desh_pickaxe.name=Кирка из рабочего сплава item.desh_axe.name=Топор из рабочего сплава item.desh_shovel.name=Лопата из рабочего сплава -item.desh_hoe.name=Мотыга из рабочего рплава +item.desh_hoe.name=Мотыга из рабочего сплава item.cobalt_sword.name=Кобальтовый меч item.cobalt_pickaxe.name=Кобальтовая кирка item.cobalt_axe.name=Кобальтовый топор @@ -4566,6 +4678,7 @@ item.blades_advanced_alloy.name=Усовершенствованные лезв item.blades_combine_steel.name=Стальные лезвия измельчителя Альянса item.blades_schrabidium.name=Шрабидиевые лезвия измельчителя item.blades_desh.name=Деш-лезвия измельчителя +item.sawblade.name=Лезвие пилорамы item.stamp_stone_flat.name=Плоский штамп (Камень) item.stamp_stone_plate.name=Штамп пластины (Камень) @@ -4690,6 +4803,7 @@ item.rbmk_tool.set=РБМК соединён! item.bismuth_tool.name=Магнитный экстрактор item.reacher.name=Вольфрамовые хваталки item.power_net_tool.name=Анализатор энергосети +item.anchor_remote.name=Устройство вызова item.multitool_dig.name=Силовая перчатка (Добывающий коготь) item.multitool_silk.name=Силовая перчатка (Коготь шёлкового касания) @@ -4709,10 +4823,10 @@ item.australium_v.name=Увеличитель жизни Марк V item.flask_infusion.shield.name=Эликсир защиты item.weapon_saw.name=Убийство при содействии врача -item.weapon_bat.name=По умолчанию Ричарда +item.weapon_bat.name=Любимица Ричарда item.weapon_bat_nail.name=Клише -item.weapon_golf_club.name=Русский бандитская клюшка -item.weapon_pipe_rusty.name=Дубина +item.weapon_golf_club.name=Клюшка русского бандита +item.weapon_pipe_rusty.name=Поправитель поведения item.weapon_pipe_lead.name=Ручное управление item.reer_graar.name=Рер Граар item.stopsign.name=Боевой топор из знака СТОП @@ -4771,12 +4885,12 @@ item.acrylic.desc=Aka: Polymethyl methacrylate item.acrylic.name=Acrylic Prism item.ammo_308.name=7.62x51mm NATO Round item.ammo_45.name=.45 ACP Round -item.ammo_50bmg.desc=§e12.7mm anti-material round$§eYou shoot down planes with these, using$§ethem against people would be nasty. +item.ammo_50bmg.desc=§eКрупнокалиберный патрон 12.7мм$§eТакими сбивают самолёты, стрелять$§eими по людям – мерзко. item.ammo_556_chlorophyte.desc=§o.223 Remington -item.ammo_75bolt.desc=§eGyro-stabilized armor-piercing$§eDU round with tandem charge -item.ammo_75bolt_he.desc=§eArmor-piercing penetrator filled$§ewith a powerful explosive charge -item.ammo_75bolt_incendiary.desc=§eArmor-piercing explosive round$§efilled with oxy-phosphorous gel -item.ammo_folly.desc=§9+ Focused starmetal reaction blast +item.ammo_75bolt.desc=§eГироскопический бронебойный$§eпатрон с тандемным зарядом +item.ammo_75bolt_he.desc=§eБронебойный патрон с$§eмощным зарядом взрывчатки +item.ammo_75bolt_incendiary.desc=§eБронебойный разрывной патрон,$§eнаполненный фосфоровым гелем +item.ammo_folly.desc=§9+ Заряд направленной реакции звёздного металла item.ammo_folly_du.desc=§9+ Howitzer mini nuke shell item.ammo_folly_nuclear.desc=§9+ Howitzer 17kg Uranium-238 shell item.ammo_grenade_lunatic.name=40mm Lunatic Grenade @@ -4809,19 +4923,19 @@ item.billet_euphemium.name=Euphemium Billet item.billet_sa327be.name=Sa327Be Billet item.billet_tha.name=Activated Thorium Billet item.billet_u234.name=Uranium-234 Billet -item.black_hole.desc=Contains a regular singularity$in the center. Large enough to$stay stable. It's not the end$of the world as we know it,$and I don't feel fine. +item.black_hole.desc=В центре этой штуки – сингулярность.$Достаточно большая, чтобы оставаться стабильной.$Это – не конец вселенной, но мне от этого лучше не становится. item.bolt_staballoy.name=Staballoy Bolt -item.bottle_sr90.name=Bottle of Bone Hurting Juice -item.can_breen.name=Dr. Breens Private Reserve -item.canteen_13.desc.11=Cooldown: 1 minute$Restores 2.5 hearts$ $You sip a sip from your trusty Vault 13 SIPPP -item.canteen_13.desc=Cooldown: 1 minute$Restores 2.5 hearts$ $You take a sip from your trusty Vault 13 canteen. -item.canteen_fab.desc=Cooldown: 2 minutes$Engages the fab drive -item.canteen_vodka.desc.11=Cooldown: 3 minutes$Nausea I for 10 seconds$Strength III for 30 seconds$ $Time to get hammered & sickled! -item.canteen_vodka.desc=Cooldown: 3 minutes$Nausea I for 10 seconds$Strength III for 30 seconds$ $Smells like disinfectant, tastes like disinfectant. -item.catalyst_rare.name=Rare Earth Catalyst -item.catalyst_ten.name=Tennessine Catalyst -item.cell_anti_schrabidium.desc=Warning: Exposure to matter will$create a fólkvangr field! -item.cell_antimatter.desc=Warning: Exposure to matter will$lead to violent annihilation! +item.bottle_sr90.name=Бутылка с костебольным соком +item.can_breen.name=Личный резерв др.Брина +item.canteen_13.desc.11=Откат: 1 минута$Восстанавливает 2.5 сердца$ $Вы глотаете глоток из вашего верного глотка Убежища ГЛОТОК +item.canteen_13.desc=Откат: 1 минута$Восстанавливает 2.5 сердца$ $Вы делаете глоток из вашей верной фляжки Убежища 13… +item.canteen_fab.desc=Откат: 2 минуты$Включает фаб-двигатели +item.canteen_vodka.desc.11=Откат: 3 минуты$Тошнота I на 10 секунд$Сила III на 30 секунд$ $Сейчас тебя разсерпуют и перемолотят! +item.canteen_vodka.desc=Откат: 3 минуты$Тошнота I на 10 секунд$Сила III на 30 секунд$ $На запах – как антисептик, и на вкус – как антисептик. +item.catalyst_rare.name=Редкоземельный катализатор +item.catalyst_ten.name=Tеннесиновый катализатор +item.cell_anti_schrabidium.desc=Внимание: взаимодействие с материей$создаст поле Фолькванга! +item.cell_antimatter.desc=Внимание: взаимодействие с материей$приведёт к аннигиляции! item.chronometer_player.name=Biological Chronometer item.coil_warp.name=Antimass Gravity Manipulation Coil item.coil_warp_coated.name=FTL Drive Coil with WCo Alloy and Desh Coating @@ -4829,8 +4943,8 @@ item.core_plut_boosted.name=Plutonium Core with Schrabidium Booster item.core_uran_boosted.name=Uranium Core with Schrabidium Booster item.crystal_energy.desc=Densely packed energy powder.$Not edible. item.custom_core.name=Nuclear Fission Core -item.detonator_de.desc=Explodes when dropped! -item.detonator_deadman.desc=Shift right-click to set position,$drop to detonate! +item.detonator_de.desc=Взрывается при падении! +item.detonator_deadman.desc=Shift+ПКМ, чтобы задать позицию,$выбросите для детонации! item.euphemium_capacitor.name=Redcoil Capacitor with Euphemium Positive Energy Negator item.eye.desc.11=§c"All humans, are afraid of monsters, the monsters they keep inside of them.$§cThey drove the species who are able to expose the monsters in them down the$§cpurgatory underground. There, in the purgatory deep inside the earth where$§cpeople are made, he was born. He hated, and loved, the monster that is$§cforming inside of him more than anyone else. Together with his second$§cmother, he climbed up to the world where the people who have driven him into$§cthe underground live. However, at that time, it was too late. This world$§cabove ground is waiting for its slow death, same as the people who are$§ccontinue to stay there. This world, this surface, is the realm of the dead.$§cAnd this species called humans, they have built for themselves a world of$§ctwilight. There, he met a ghost called 'father'. His second mother, who has$§ccome to this netherworld with him, remained there, while he returned to the$§cpurgatory where he was born. That place, the place where he lives, that$§cpurgatory. That should be the last world of humans."§r item.eye.desc=It's looking at me despite being closed,$or rather, through me...$into my soul.$It makes me uncomfortable @@ -4845,11 +4959,11 @@ item.ferrouranium_plate.name=Ferrouranium Chestplate item.ferrouranium_shovel.name=Ferrouranium Shovel item.ferrouranium_sword.name=Ferrouranium Sword item.filter_fiberglass.name=Bound Fiberglass Filter -item.five_htp.desc=Removes all DRX, Stability for 10 minutes -item.fmn.desc=Removes all DRX above 2,000mDRX +item.five_htp.desc=Убирает все DRX, Стабильность на 10 минут +item.fmn.desc=Убирает все DRX более 2,000mDRX item.fragment_orichalcum.desc=Gem shard, retains its hardness and$resistance to pressure and heat, but$requires further refinement item.fragment_orichalcum.name=§6Orichalcum Shard§r -item.fuse.desc=This item is needed for every large$nuclear reactor, as it allows the$reactor to generate electricity and$use up it's fuel. Removing the fuse$from a reactor will instantly shut$it down.$$§mjk, it's §oalmost§r§7§m useless now +item.fuse.desc=эта штука теперь практически бесполезна item.gas_sarin.name=Sarin Gas Tank item.gas_xenon.name=Xenon Gas Tank item.gem_orichalcum.desc=High hardness and luster, provides shielding$against pressure and heat fronts diff --git a/src/main/resources/assets/hbm/models/blocks/puter.obj b/src/main/resources/assets/hbm/models/blocks/puter.obj new file mode 100644 index 000000000..9445788f7 --- /dev/null +++ b/src/main/resources/assets/hbm/models/blocks/puter.obj @@ -0,0 +1,966 @@ +# Blender v3.2.0 OBJ File: 'puter.blend' +# www.blender.org +o Cube.001_Cube.005 +v -0.369039 -0.501855 0.479973 +v -0.369039 -0.459563 0.479973 +v -0.369039 -0.501855 0.209191 +v -0.369039 -0.433180 0.209191 +v 0.369039 -0.501855 0.479973 +v 0.369039 -0.459563 0.479973 +v 0.369039 -0.501855 0.209191 +v 0.369039 -0.433180 0.209191 +vt 0.175000 0.175000 +vt -0.000000 0.150000 +vt 0.175000 0.150000 +vt 0.350000 0.225000 +vt 0.175000 0.200000 +vt 0.350000 0.200000 +vt 0.175000 0.225000 +vt -0.000000 0.200000 +vt -0.000000 0.225000 +vt 0.175000 0.225000 +vt 0.350000 0.250000 +vt 0.175000 0.250000 +vt 0.350000 0.150000 +vt 0.175000 0.200000 +vt 0.175000 0.150000 +vt -0.000000 0.150000 +vt 0.350000 0.000000 +vt 0.350000 0.150000 +vt -0.000000 0.200000 +vt 0.175000 0.225000 +vt 0.175000 0.175000 +vt 0.350000 0.225000 +vt 0.350000 0.200000 +vt -0.000000 0.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.9953 0.0970 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 7/7/3 6/8/3 5/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/14/5 3/15/5 +f 4/16/6 6/17/6 8/18/6 +f 2/1/1 4/19/1 3/2/1 +f 4/4/2 8/20/2 7/5/2 +f 7/7/3 8/21/3 6/8/3 +f 6/10/4 2/22/4 1/11/4 +f 7/13/5 5/23/5 1/14/5 +f 4/16/6 2/24/6 6/17/6 +o Cube +v 0.262500 0.290571 0.025979 +v -0.061658 -0.358688 -0.212822 +v -0.077958 -0.358688 -0.229123 +v 0.262500 -0.234429 0.025979 +v -0.262500 0.290571 0.025979 +v -0.262500 -0.234429 0.025979 +v -0.077958 -0.358688 -0.352438 +v 0.131250 0.290571 0.034371 +v 0.000000 0.290571 0.035881 +v -0.061658 -0.358688 -0.368738 +v -0.131250 0.290571 0.034371 +v -0.131250 -0.234429 0.034371 +v 0.077958 -0.358688 -0.229123 +v 0.000000 -0.234429 0.035881 +v 0.061658 -0.358688 -0.212822 +v 0.131250 -0.234429 0.034371 +v -0.262500 -0.103179 0.034371 +v -0.262500 0.028071 0.035881 +v -0.262500 0.159321 0.034371 +v 0.061658 -0.358688 -0.368738 +v 0.262500 0.159321 0.034371 +v 0.077958 -0.358688 -0.352438 +v 0.262500 0.028071 0.035881 +v 0.262500 -0.103179 0.034371 +v 0.131250 0.159321 0.040787 +v -0.065019 -0.247914 -0.242045 +v -0.048736 -0.247914 -0.225761 +v 0.131250 0.028071 0.044501 +v 0.131250 -0.103179 0.040787 +v -0.048736 -0.247914 -0.355799 +v -0.065019 -0.247914 -0.339516 +v 0.000000 0.159321 0.044501 +v 0.000000 0.028071 0.049025 +v 0.065019 -0.247914 -0.339516 +v 0.000000 -0.103179 0.044501 +v 0.048736 -0.247914 -0.355799 +v -0.131250 0.159321 0.040787 +v 0.048736 -0.247914 -0.225761 +v -0.131250 0.028071 0.044501 +v 0.065019 -0.247914 -0.242045 +v -0.131250 -0.103179 0.040787 +v -0.065019 -0.337090 -0.339524 +v -0.048744 -0.337090 -0.355799 +v 0.262500 0.290571 0.092896 +v 0.048744 -0.337090 -0.355799 +v -0.262500 0.290571 0.092896 +v 0.262500 -0.234429 0.092896 +v 0.065019 -0.337090 -0.339524 +v 0.065019 -0.337090 -0.242037 +v -0.262500 -0.234429 0.092896 +v -0.262500 0.256505 -0.133796 +v 0.048744 -0.337090 -0.225761 +v -0.228434 0.290571 -0.133796 +v -0.065019 -0.337090 -0.242037 +v 0.228434 0.290571 -0.133796 +v -0.048744 -0.337090 -0.225761 +v 0.262500 0.256505 -0.133796 +v 0.262500 -0.200363 -0.133796 +v 0.228434 -0.234429 -0.133796 +v -0.228434 -0.234429 -0.133796 +v -0.262500 -0.200363 -0.133796 +v -0.305185 -0.311180 -0.084290 +v -0.339251 -0.277114 -0.084290 +v 0.339251 0.333256 -0.084290 +v 0.305185 0.367322 -0.084290 +v -0.305185 0.367322 -0.084290 +v -0.339251 0.333256 -0.084290 +v 0.339251 -0.277114 -0.084290 +v 0.305185 -0.311180 -0.084290 +v 0.339251 0.333342 0.092896 +v 0.305271 0.367322 0.092896 +v 0.316748 0.344819 0.092896 +v -0.305271 0.367322 0.092896 +v -0.339251 0.333342 0.092896 +v -0.316748 0.344819 0.092896 +v 0.305271 -0.311180 0.092896 +v 0.339251 -0.277200 0.092896 +v 0.316748 -0.288677 0.092896 +v -0.339251 -0.277200 0.092896 +v -0.305271 -0.311180 0.092896 +v -0.316748 -0.288677 0.092896 +v 0.219945 0.269868 -0.499021 +v 0.228515 0.290571 -0.478319 +v 0.241798 0.248016 -0.499021 +v 0.262500 0.256586 -0.478319 +v 0.241798 -0.150854 -0.499021 +v 0.262500 -0.159424 -0.478319 +v 0.219945 -0.172706 -0.499021 +v 0.228515 -0.193409 -0.478319 +v -0.241798 0.248016 -0.499021 +v -0.262500 0.256586 -0.478319 +v -0.219945 0.269868 -0.499021 +v -0.228515 0.290571 -0.478319 +v -0.219945 -0.172706 -0.499021 +v -0.228515 -0.193409 -0.478319 +v -0.241798 -0.150854 -0.499021 +v -0.262500 -0.159424 -0.478319 +v -0.131250 -0.234429 0.101749 +v 0.000000 -0.233661 0.104777 +v 0.131250 -0.234429 0.101749 +v 0.131250 0.290571 0.101749 +v 0.000000 0.291339 0.105210 +v -0.131250 0.290571 0.101749 +v -0.057767 -0.234429 -0.364857 +v 0.074076 -0.234429 -0.348548 +v 0.057767 -0.234429 -0.364857 +v -0.074076 -0.234429 -0.348548 +v -0.074076 -0.234429 -0.233013 +v 0.074076 -0.234429 -0.233013 +v 0.057767 -0.234429 -0.216704 +v -0.057767 -0.234429 -0.216704 +vt 0.325000 0.725000 +vt 0.375000 0.737500 +vt 0.325000 0.737500 +vt 0.450000 0.675000 +vt 0.500000 0.725000 +vt 0.450000 0.725000 +vt 0.500000 0.675000 +vt 0.450000 0.662500 +vt 0.500000 0.662500 +vt 0.387500 0.725000 +vt 0.437500 0.737500 +vt 0.387500 0.737500 +vt 0.512500 0.725000 +vt 0.562500 0.737500 +vt 0.512500 0.737500 +vt 0.512500 0.675000 +vt 0.562500 0.725000 +vt 0.325000 0.675000 +vt 0.375000 0.725000 +vt 0.387500 0.675000 +vt 0.437500 0.725000 +vt 0.325000 0.787500 +vt 0.375000 0.800000 +vt 0.387500 0.750000 +vt 0.562500 0.662500 +vt 0.562500 0.675000 +vt 0.375000 0.675000 +vt 0.325000 0.662500 +vt 0.375000 0.662500 +vt 0.437500 0.662500 +vt 0.437500 0.675000 +vt 0.512500 0.737500 +vt 0.575000 0.737500 +vt 0.575000 0.725000 +vt 0.512500 0.662500 +vt 0.575000 0.675000 +vt 0.575000 0.662500 +vt 0.387500 0.662500 +vt 0.450000 0.737500 +vt 0.375000 0.737500 +vt 0.337500 0.737500 +vt 0.325000 0.750000 +vt 0.337500 0.800000 +vt 0.387500 0.787500 +vt 0.112500 0.737500 +vt 0.062500 0.687500 +vt 0.112500 0.687500 +vt 0.387500 0.262500 +vt 0.375000 0.375000 +vt 0.375000 0.262500 +vt 0.262500 0.687500 +vt 0.212500 0.737500 +vt 0.212500 0.687500 +vt 0.162500 0.737500 +vt 0.162500 0.687500 +vt 0.187500 0.262500 +vt 0.200000 0.375000 +vt 0.187500 0.375000 +vt 0.162500 0.537500 +vt 0.112500 0.587500 +vt 0.112500 0.537500 +vt 0.162500 0.587500 +vt 0.112500 0.637500 +vt 0.162500 0.637500 +vt 0.212500 0.587500 +vt 0.212500 0.537500 +vt 0.212500 0.637500 +vt 0.262500 0.587500 +vt 0.262500 0.537500 +vt 0.262500 0.637500 +vt 0.562500 0.262500 +vt 0.575000 0.375000 +vt 0.562500 0.375000 +vt 0.600000 0.262500 +vt 0.750000 0.375000 +vt 0.062500 0.587500 +vt 0.062500 0.537500 +vt 0.062500 0.637500 +vt 0.387500 0.412500 +vt 0.387500 0.375000 +vt 0.012500 0.412500 +vt 0.012500 0.375000 +vt -0.000000 0.787500 +vt 0.037500 0.762500 +vt 0.012500 0.787500 +vt 0.562500 0.475000 +vt 0.562500 0.412500 +vt 0.575000 0.412500 +vt 0.187500 0.475000 +vt 0.187500 0.412500 +vt 0.200000 0.412500 +vt 0.212500 0.512500 +vt 0.262500 0.512500 +vt 0.287500 0.737500 +vt 0.012500 0.475000 +vt 0.312500 0.475000 +vt 0.287500 0.512500 +vt 0.325000 0.787500 +vt 0.287500 0.762500 +vt 0.287500 0.687500 +vt 0.312500 0.800000 +vt 0.012500 0.800000 +vt 0.037500 0.537500 +vt 0.750000 0.475000 +vt 0.575000 0.475000 +vt 0.112500 0.762500 +vt 0.200000 0.475000 +vt 0.375000 0.412500 +vt 0.375000 0.475000 +vt -0.000000 0.487500 +vt 0.012500 0.487500 +vt 0.312500 0.787500 +vt 0.325000 0.487500 +vt 0.312500 0.487500 +vt 0.012500 0.475000 +vt -0.000000 0.412500 +vt 0.350000 0.262500 +vt 0.450000 0.312500 +vt 0.450000 0.337500 +vt 0.500000 0.337500 +vt 0.487500 0.350000 +vt 0.012500 0.262500 +vt -0.000000 0.375000 +vt 0.387500 0.475000 +vt -0.000000 0.262500 +vt 0.200000 0.250000 +vt 0.187500 0.250000 +vt 0.575000 0.250000 +vt 0.562500 0.250000 +vt -0.000000 0.250000 +vt 0.375000 0.250000 +vt 0.200000 0.262500 +vt 0.350000 0.250000 +vt 0.750000 0.250000 +vt 0.750000 0.262500 +vt 0.337500 0.475000 +vt 0.325000 0.487500 +vt 0.325000 0.650000 +vt 0.112500 0.512500 +vt 0.062500 0.512500 +vt 0.162500 0.512500 +vt 0.062500 0.737500 +vt 0.062500 0.762500 +vt 0.212500 0.762500 +vt 0.262500 0.737500 +vt 0.262500 0.762500 +vt 0.162500 0.762500 +vt 0.500000 0.312500 +vt 0.487500 0.300000 +vt 0.462500 0.300000 +vt 0.462500 0.350000 +vt 0.575000 0.262500 +vt 0.037500 0.637500 +vt 0.037500 0.512500 +vt 0.037500 0.575000 +vt 0.037500 0.687500 +vt 0.750000 0.412500 +vt 0.287500 0.537500 +vt 0.287500 0.575000 +vt 0.287500 0.637500 +vt 0.037500 0.737500 +vt -0.000000 0.475000 +vt 0.012500 0.250000 +vt 0.387500 0.250000 +vt 0.600000 0.250000 +vt 0.337500 0.662500 +vt 0.525000 0.662500 +vt 0.537500 0.650000 +vt 0.537500 0.487500 +vt 0.525000 0.475000 +vn 0.8578 0.5139 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8301 -0.5576 0.0000 +vn 0.0000 0.5139 0.8578 +vn 0.0000 0.5139 -0.8578 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 -0.5576 -0.8301 +vn 0.8301 -0.5576 0.0000 +vn 0.0000 -0.5576 0.8301 +vn -0.5130 -0.6882 0.5130 +vn -0.5397 0.6460 -0.5397 +vn 0.5397 0.6460 -0.5397 +vn 0.5397 0.6460 0.5397 +vn -0.7071 0.0001 0.7071 +vn -0.5130 -0.6882 -0.5130 +vn 0.5130 -0.6882 -0.5130 +vn 0.5130 -0.6882 0.5130 +vn -0.7071 0.0001 -0.7071 +vn 0.7071 0.0001 -0.7071 +vn 0.7071 0.0001 0.7071 +vn -0.5397 0.6460 0.5397 +vn -0.8578 0.5139 0.0000 +vn -0.0339 0.0525 0.9980 +vn -0.0525 0.0339 0.9980 +vn -0.0385 0.0385 0.9985 +vn -0.7046 -0.7046 -0.0837 +vn 0.0525 0.0339 0.9980 +vn 0.0339 0.0525 0.9980 +vn 0.0385 0.0385 0.9985 +vn 0.0000 0.0572 0.9984 +vn 0.0000 0.0484 0.9988 +vn -0.7071 0.7071 0.0002 +vn -0.0000 -0.0572 0.9984 +vn -0.0385 -0.0385 0.9985 +vn -0.0339 -0.0525 0.9980 +vn -0.0000 -0.0484 0.9988 +vn -0.0484 0.0000 0.9988 +vn 0.0385 -0.0385 0.9985 +vn 0.0339 -0.0525 0.9980 +vn 0.0484 -0.0000 0.9988 +vn 0.0525 -0.0339 0.9980 +vn 0.0637 -0.0637 0.9959 +vn 0.0572 -0.0000 0.9984 +vn 0.7046 -0.7046 -0.0837 +vn -0.0525 -0.0339 0.9980 +vn -0.0637 -0.0637 0.9959 +vn -0.0572 0.0000 0.9984 +vn -0.0000 -0.5420 -0.8403 +vn 0.0000 0.5420 -0.8403 +vn 0.0204 0.0104 0.9997 +vn 0.0297 -0.0165 0.9994 +vn 0.5420 0.0000 -0.8403 +vn 0.0000 1.0000 0.0000 +vn -0.5420 0.0000 -0.8403 +vn 0.0008 1.0000 -0.0002 +vn 0.0052 0.9999 0.0090 +vn -0.0297 0.0165 0.9994 +vn 0.0201 -0.0104 0.9997 +vn 0.0297 0.0165 0.9994 +vn 0.0286 -0.0504 0.9983 +vn 0.0009 -1.0000 0.0018 +vn 0.0020 -1.0000 0.0094 +vn -0.0204 0.0104 0.9997 +vn -0.0201 -0.0104 0.9997 +vn 0.7071 0.7071 -0.0003 +vn -0.7071 0.7071 -0.0003 +vn -0.0653 -0.9968 -0.0469 +vn -0.1280 -0.9858 -0.1089 +vn 0.0653 -0.9968 -0.0469 +vn 0.2934 -0.2934 -0.9098 +vn 0.2934 0.2934 -0.9098 +vn -0.2934 -0.2934 -0.9098 +vn -0.2934 0.2934 -0.9098 +vn -0.7071 -0.7071 -0.0003 +vn 0.7071 -0.7071 -0.0003 +vn 0.7071 0.7071 0.0002 +vn -0.5000 0.5000 -0.7070 +vn 0.5000 -0.5000 -0.7070 +vn 0.5000 0.5000 -0.7070 +vn -0.5000 -0.5000 -0.7070 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.0009 1.0000 -0.0018 +vn -0.0024 1.0000 -0.0093 +vn -0.0007 0.9999 -0.0122 +vn -0.0020 1.0000 -0.0095 +vn -0.0052 -0.9999 -0.0091 +vn -0.0008 -1.0000 0.0002 +vn 0.0023 -1.0000 0.0093 +vn 0.1280 -0.9858 -0.1089 +vn 0.0502 -0.9610 -0.2719 +vn 0.0989 -0.9734 -0.2067 +vn -0.0989 -0.9734 -0.2067 +vn -0.0502 -0.9610 -0.2719 +vn -0.0637 0.0637 0.9959 +vn 0.0637 0.0637 0.9959 +vn 0.0000 0.1434 0.9897 +vn -0.0297 -0.0165 0.9994 +vn -0.0320 0.0425 0.9986 +vn 0.0320 0.0425 0.9986 +vn -0.0286 -0.0504 0.9983 +vn 0.0000 -0.1379 0.9904 +vn 0.0007 -0.9999 0.0121 +usemtl Material +s off +f 56/25/7 21/26/7 30/27/7 +f 34/28/8 50/29/8 62/30/8 +f 39/31/9 116/32/9 115/33/9 +f 60/34/10 10/35/10 23/36/10 +f 51/37/11 28/38/11 18/39/11 +f 38/40/12 53/41/12 51/37/12 +f 42/42/13 57/43/13 56/25/13 +f 46/44/14 64/45/14 60/34/14 +f 15/46/15 28/47/15 21/48/15 +f 38/40/16 114/49/16 44/50/16 +f 48/51/17 113/52/17 117/53/17 +f 46/44/18 119/54/18 35/55/18 +f 116/32/19 35/55/19 119/54/19 +f 51/37/20 15/56/20 50/29/20 +f 30/57/21 53/41/21 56/58/21 +f 23/36/22 57/43/22 60/34/22 +f 35/55/23 62/30/23 64/45/23 +f 39/31/24 112/59/24 38/40/24 +f 42/60/25 114/49/25 113/61/25 +f 48/51/26 118/62/26 46/44/26 +f 51/37/27 39/31/27 38/40/27 +f 56/58/28 44/50/28 42/60/28 +f 60/34/29 48/51/29 46/44/29 +f 10/35/30 62/30/30 11/63/30 +f 62/30/31 15/56/31 11/63/31 +f 56/25/7 57/43/7 21/26/7 +f 34/28/8 39/31/8 50/29/8 +f 39/31/9 34/28/9 116/32/9 +f 60/34/10 64/45/10 10/35/10 +f 51/37/11 53/41/11 28/38/11 +f 38/40/12 44/50/12 53/41/12 +f 42/42/13 48/51/13 57/43/13 +f 46/44/14 35/55/14 64/45/14 +f 21/48/15 23/64/15 10/65/15 +f 10/65/15 11/66/15 15/46/15 +f 15/46/15 18/67/15 28/47/15 +f 28/47/15 30/68/15 21/48/15 +f 21/48/15 10/65/15 15/46/15 +f 38/40/16 112/59/16 114/49/16 +f 48/51/17 42/42/17 113/52/17 +f 46/44/18 118/62/18 119/54/18 +f 116/32/19 34/28/19 35/55/19 +f 51/37/20 18/39/20 15/56/20 +f 30/57/21 28/38/21 53/41/21 +f 23/36/22 21/26/22 57/43/22 +f 35/55/23 34/28/23 62/30/23 +f 39/31/24 115/33/24 112/59/24 +f 42/60/25 44/50/25 114/49/25 +f 48/51/26 117/53/26 118/62/26 +f 51/37/27 50/29/27 39/31/27 +f 56/58/28 53/41/28 44/50/28 +f 60/34/29 57/43/29 48/51/29 +f 10/35/30 64/45/30 62/30/30 +f 62/30/31 50/29/31 15/56/31 +s 1 +f 19/69/32 27/70/33 45/71/34 +f 103/72/35 69/73/35 105/74/35 +f 29/75/36 16/76/37 33/77/38 +f 33/77/38 17/78/39 40/79/40 +f 17/78/39 45/71/34 40/79/40 +f 101/80/41 59/81/41 61/82/41 +f 22/83/42 49/84/43 20/85/44 +f 43/86/45 47/87/46 49/84/43 +f 40/79/40 47/87/46 41/88/14 +f 37/89/47 22/83/42 24/90/48 +f 36/91/49 43/86/45 37/89/47 +f 36/91/49 40/79/40 41/88/14 +f 32/92/50 24/90/48 12/93/51 +f 31/94/52 37/89/47 32/92/50 +f 31/94/52 33/77/38 36/91/49 +f 97/95/53 66/96/53 67/97/53 +f 95/98/13 65/99/13 66/96/13 +f 20/85/44 25/100/54 14/101/55 +f 49/84/43 26/102/56 25/100/54 +f 45/71/34 26/102/56 47/87/46 +f 67/97/57 70/103/57 68/104/57 +f 61/82/58 73/105/58 63/106/58 +f 79/107/59 52/108/60 80/109/14 +f 84/110/15 70/103/15 77/111/15 +f 65/99/61 76/112/61 66/96/61 +f 81/113/62 73/105/62 74/114/62 +f 69/73/63 75/115/63 59/81/63 +f 12/93/64 108/116/65 55/117/62 +f 52/118/8 29/75/8 31/94/8 +f 82/119/14 87/120/14 58/121/66 +f 84/122/67 55/123/68 108/124/69 +f 85/125/14 78/126/14 52/108/60 +f 58/127/13 25/100/13 26/102/13 +f 76/112/13 78/128/13 85/129/13 +f 111/130/70 19/69/15 17/78/71 +f 82/131/8 71/132/8 87/133/8 +f 78/126/14 79/107/59 80/109/14 +f 81/134/72 82/119/14 83/135/14 +f 84/122/67 85/125/14 86/136/14 +f 87/120/14 88/137/73 89/138/14 +f 79/139/74 72/140/74 73/105/74 +f 74/114/75 82/131/75 81/113/75 +f 59/81/8 105/141/8 69/73/8 +f 68/104/76 115/142/77 116/143/15 +f 117/144/15 67/97/78 118/145/15 +f 77/111/79 66/96/79 76/112/79 +f 101/80/62 63/106/62 91/146/62 +f 63/106/80 72/140/80 65/147/80 +f 71/132/81 68/104/81 70/103/81 +f 61/82/82 75/115/82 74/114/82 +f 88/148/83 71/132/83 70/103/83 +f 77/111/84 85/129/84 84/110/84 +f 63/106/85 93/149/85 91/146/85 +f 98/150/86 101/80/86 100/151/86 +f 94/152/87 97/95/87 96/153/87 +f 92/154/88 91/146/88 93/149/88 +f 104/155/89 103/72/89 105/74/89 +f 103/72/90 96/153/90 97/95/90 +f 99/156/91 104/157/91 105/141/91 +f 91/146/92 100/151/92 101/80/92 +f 95/98/93 92/158/93 93/159/93 +f 102/160/12 104/161/12 98/162/12 +f 106/163/94 14/101/62 58/164/62 +f 108/116/65 12/93/64 107/165/95 +f 107/165/95 24/90/96 22/83/97 +f 13/166/15 111/130/70 54/167/15 +f 109/168/98 9/169/99 52/170/15 +f 110/171/100 9/169/99 109/168/98 +f 113/172/101 67/97/78 117/144/15 +f 114/173/102 97/95/103 113/172/101 +f 103/72/104 114/173/102 112/174/105 +f 115/142/77 103/72/104 112/174/105 +f 119/175/15 68/104/76 116/143/15 +f 118/145/15 68/104/76 119/175/15 +f 19/69/32 13/166/106 27/70/33 +f 103/72/35 68/104/35 69/73/35 +f 29/75/36 9/169/107 16/76/37 +f 33/77/38 16/76/37 17/78/39 +f 17/78/39 19/69/32 45/71/34 +f 101/80/41 99/156/41 59/81/41 +f 22/83/42 43/86/45 49/84/43 +f 43/86/45 41/88/14 47/87/46 +f 40/79/40 45/71/34 47/87/46 +f 37/89/47 43/86/45 22/83/42 +f 36/91/49 41/88/14 43/86/45 +f 36/91/49 33/77/38 40/79/40 +f 32/92/50 37/89/47 24/90/48 +f 31/94/52 36/91/49 37/89/47 +f 31/94/52 29/75/36 33/77/38 +f 97/95/53 95/176/53 66/96/53 +f 95/98/13 93/159/13 65/99/13 +f 20/85/44 49/84/43 25/100/54 +f 49/84/43 47/87/46 26/102/56 +f 45/71/34 27/70/33 26/102/56 +f 67/97/57 77/111/57 70/103/57 +f 61/82/58 74/114/58 73/105/58 +f 79/107/59 81/134/72 110/177/108 +f 81/134/72 83/135/14 54/178/109 +f 110/177/108 81/134/72 111/179/110 +f 54/178/109 111/179/110 81/134/72 +f 110/177/108 109/180/111 79/107/59 +f 109/180/111 52/108/60 79/107/59 +f 84/110/15 88/148/15 70/103/15 +f 65/99/61 72/181/61 76/112/61 +f 81/113/62 79/139/62 73/105/62 +f 69/73/63 71/132/63 75/115/63 +f 12/93/8 55/182/8 32/92/8 +f 55/182/8 52/118/8 31/94/8 +f 32/92/8 55/182/8 31/94/8 +f 52/118/8 9/169/8 29/75/8 +f 87/120/14 89/138/14 58/121/66 +f 58/121/66 54/178/109 82/119/14 +f 54/178/109 83/135/14 82/119/14 +f 106/183/112 58/121/66 88/137/73 +f 58/121/66 89/138/14 88/137/73 +f 88/137/73 84/122/67 107/184/113 +f 106/183/112 88/137/73 107/184/113 +f 84/122/67 86/136/14 55/123/68 +f 108/124/69 107/184/113 84/122/67 +f 78/126/14 80/109/14 52/108/60 +f 52/108/60 55/123/68 85/125/14 +f 55/123/68 86/136/14 85/125/14 +f 13/166/13 54/185/13 27/70/13 +f 54/185/13 58/127/13 26/102/13 +f 27/70/13 54/185/13 26/102/13 +f 58/127/13 14/101/13 25/100/13 +f 76/112/13 72/181/13 78/128/13 +f 9/169/99 110/171/100 16/76/114 +f 110/171/100 111/130/70 17/78/71 +f 16/76/114 110/171/100 17/78/71 +f 111/130/70 13/166/15 19/69/15 +f 82/131/8 75/115/8 71/132/8 +f 79/139/74 78/186/74 72/140/74 +f 74/114/75 75/115/75 82/131/75 +f 59/81/8 99/156/8 105/141/8 +f 68/104/76 103/72/104 115/142/77 +f 77/111/79 67/97/79 66/96/79 +f 101/80/62 61/82/62 63/106/62 +f 63/106/80 73/105/80 72/140/80 +f 71/132/81 69/73/81 68/104/81 +f 61/82/82 59/81/82 75/115/82 +f 88/148/83 87/133/83 71/132/83 +f 77/111/84 76/112/84 85/129/84 +f 63/106/85 65/147/85 93/149/85 +f 98/150/86 99/156/86 101/80/86 +f 94/152/87 95/176/87 97/95/87 +f 92/154/88 90/187/88 91/146/88 +f 104/155/89 102/188/89 103/72/89 +f 103/72/90 102/188/90 96/153/90 +f 99/156/91 98/150/91 104/157/91 +f 91/146/92 90/187/92 100/151/92 +f 95/98/93 94/189/93 92/158/93 +f 98/162/12 100/190/12 102/160/12 +f 100/190/12 90/191/12 102/160/12 +f 90/191/12 92/192/12 94/193/12 +f 94/193/12 96/194/12 90/191/12 +f 96/194/12 102/160/12 90/191/12 +f 14/101/62 106/163/94 20/85/62 +f 106/163/94 107/165/95 22/83/97 +f 20/85/62 106/163/94 22/83/97 +f 107/165/95 12/93/64 24/90/96 +f 113/172/101 97/95/103 67/97/78 +f 103/72/104 97/95/103 114/173/102 +f 118/145/15 67/97/78 68/104/76 +o Cube.002 +v -0.182506 -0.376577 0.025979 +v -0.202175 -0.376577 0.006310 +v -0.202175 -0.376577 -0.479353 +v -0.182475 -0.376637 -0.499021 +v 0.202175 -0.376577 0.006310 +v -0.236819 -0.500000 0.112318 +v 0.182506 -0.376577 0.025979 +v -0.262500 -0.500000 0.000000 +v 0.182509 -0.376637 -0.499021 +v -0.262500 -0.376637 0.000000 +v -0.236819 -0.376637 0.112318 +v 0.202175 -0.376577 -0.479353 +v 0.262500 -0.500000 0.000000 +v -0.168634 -0.353125 -0.007583 +v -0.202175 -0.356313 0.006310 +v 0.236819 -0.500000 0.112318 +v 0.236819 -0.376637 0.112318 +v -0.182506 -0.356313 0.025979 +v 0.262500 -0.376637 0.000000 +v -0.168634 -0.353125 -0.465459 +v -0.262500 -0.500000 -0.434422 +v -0.182506 -0.356313 -0.499021 +v -0.242168 -0.500000 -0.499021 +v -0.242168 -0.376637 -0.499021 +v -0.202175 -0.356313 -0.479353 +v -0.262500 -0.376637 -0.434422 +v 0.168634 -0.353125 -0.007583 +v 0.242168 -0.500000 -0.499021 +v 0.262500 -0.500000 -0.434422 +v 0.182506 -0.356313 0.025979 +v 0.262500 -0.376637 -0.434422 +v 0.202175 -0.356313 0.006310 +v 0.242168 -0.376637 -0.499021 +v -0.236819 -0.391892 0.112318 +v 0.168634 -0.353125 -0.465459 +v 0.202175 -0.356313 -0.479353 +v -0.262500 -0.391892 0.000000 +v 0.236819 -0.391892 0.112318 +v 0.182506 -0.356313 -0.499021 +v 0.262500 -0.391892 0.000000 +v 0.243379 -0.391892 0.123162 +v -0.269772 -0.391892 0.010843 +v -0.243379 -0.500000 0.123162 +v -0.269772 -0.500000 0.010843 +v 0.243379 -0.500000 0.123162 +v 0.269772 -0.500000 0.010843 +v -0.243379 -0.391892 0.123162 +v 0.269772 -0.391892 0.010843 +vt 0.737500 0.775000 +vt 0.750000 0.787500 +vt 0.737500 0.787500 +vt 0.975000 0.787500 +vt 0.962500 0.775000 +vt 0.975000 0.775000 +vt 0.962500 0.725000 +vt 0.750000 0.712500 +vt 0.962500 0.712500 +vt 0.962500 0.062500 +vt 0.962500 0.350000 +vt 0.750000 0.062500 +vt 0.975000 0.725000 +vt 0.937500 0.400000 +vt 0.925000 0.712500 +vt 0.925000 0.400000 +vt 0.737500 0.787500 +vt 0.962500 0.787500 +vt 0.962500 0.712500 +vt 0.975000 0.400000 +vt 0.975000 0.712500 +vt 0.950000 0.700000 +vt 0.950000 0.412500 +vt 0.750000 0.750000 +vt 0.962500 0.750000 +vt 0.950000 0.412500 +vt 0.962500 0.400000 +vt 0.750000 0.775000 +vt 0.962500 0.750000 +vt 0.750000 0.725000 +vt 0.737500 0.712500 +vt 0.650000 0.075000 +vt 0.362500 0.062500 +vt 0.650000 0.062500 +vt 0.575000 0.475000 +vt 0.700000 0.475000 +vt 0.575000 0.662500 +vt 0.350000 0.162500 +vt 0.412500 0.225000 +vt 0.350000 0.225000 +vt 0.425000 0.225000 +vt 0.425000 0.162500 +vt 0.687500 0.162500 +vt 0.350000 0.150000 +vt 0.425000 0.137500 +vt 0.350000 0.137500 +vt 0.425000 0.075000 +vt 0.412500 0.137500 +vt 0.725000 0.000000 +vt 0.937500 0.000000 +vt 0.975000 0.062500 +vt 0.725000 0.075000 +vt 0.687500 0.150000 +vt 0.725000 0.150000 +vt 0.725000 0.237500 +vt 0.687500 0.237500 +vt 0.750000 0.487500 +vt 0.712500 0.475000 +vt 0.762500 0.487500 +vt 0.537500 0.150000 +vt 0.350000 0.162500 +vt 0.350000 0.150000 +vt 0.762500 0.650000 +vt 0.750000 0.650000 +vt 0.350000 0.225000 +vt 0.425000 0.237500 +vt 0.350000 0.237500 +vt 0.587500 0.162500 +vt 0.537500 0.162500 +vt 0.350000 0.137500 +vt 0.412500 0.075000 +vt 0.350000 0.075000 +vt 0.412500 0.162500 +vt 0.687500 0.075000 +vt 0.587500 0.162500 +vt 0.637500 0.150000 +vt 0.637500 0.162500 +vt 0.712500 0.662500 +vt 0.700000 0.662500 +vt 0.350000 0.062500 +vt 0.662500 0.000000 +vt 0.662500 0.062500 +vt 0.912500 0.412500 +vt 0.862500 0.687500 +vt 0.862500 0.375000 +vt 0.750000 0.775000 +vt 0.750000 0.350000 +vt 0.975000 0.712500 +vt 0.937500 0.712500 +vt 0.737500 0.725000 +vt 0.750000 0.750000 +vt 0.737500 0.775000 +vt 0.950000 0.700000 +vt 0.362500 0.075000 +vt 0.537500 0.650000 +vt 0.537500 0.487500 +vt 0.425000 0.150000 +vt 0.975000 0.000000 +vt 0.662500 0.062500 +vt 0.662500 0.000000 +vt 0.725000 0.162500 +vt 0.587500 0.150000 +vt 0.587500 0.150000 +vt 0.350000 0.000000 +vt 0.862500 0.687500 +vt 0.875000 0.700000 +vt 0.825000 0.700000 +vt 0.812500 0.650000 +vt 0.812500 0.350000 +vt 0.862500 0.375000 +vt 0.925000 0.350000 +vt 0.925000 0.400000 +vt 0.812500 0.350000 +vt 0.812500 0.650000 +vt 0.762500 0.375000 +vt 0.800000 0.700000 +vt 0.762500 0.687500 +vt 0.750000 0.700000 +vt 0.925000 0.712500 +vt 0.925000 0.662500 +vt 0.912500 0.650000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0946 0.9955 0.0000 +vn 0.0000 0.9955 0.0946 +vn 0.0946 0.9955 0.0000 +vn 0.0000 0.9955 -0.0946 +vn -0.7071 0.0000 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.9735 0.0000 0.2288 +vn -0.9748 0.0000 0.2229 +vn -0.8305 0.0000 -0.5570 +vn -0.9539 0.0000 -0.3002 +vn 0.9539 0.0000 -0.3002 +vn 0.9748 0.0000 0.2229 +vn -0.9735 0.0000 0.2288 +vn 0.8305 0.0000 -0.5570 +vn 0.0000 1.0000 0.0007 +vn -0.7066 -0.0011 -0.7077 +vn 0.7072 0.0001 -0.7071 +vn -0.0669 0.9955 0.0669 +vn -0.0669 0.9955 -0.0669 +vn 0.0669 0.9955 -0.0669 +vn 0.0669 0.9955 0.0669 +vn 0.0000 1.0000 -0.0031 +vn -0.0013 1.0000 -0.0004 +vn -0.0010 1.0000 0.0000 +vn 0.0010 1.0000 0.0002 +vn 0.0010 1.0000 0.0000 +vn 0.0013 1.0000 -0.0004 +vn -0.0010 1.0000 0.0002 +vn -0.0004 1.0000 0.0004 +vn 0.0004 1.0000 0.0004 +s off +f 141/195/115 122/196/115 144/197/115 +f 131/198/116 158/199/116 155/200/116 +f 149/201/117 120/202/117 126/203/117 +f 146/204/118 154/205/118 133/206/118 +f 126/203/119 151/207/119 149/201/119 +f 134/208/120 122/209/120 121/210/120 +f 123/211/121 158/199/121 128/212/121 +f 155/213/122 124/214/122 131/215/122 +f 139/216/123 134/208/123 133/217/123 +f 133/218/124 149/201/124 146/219/124 +f 155/213/125 146/220/125 151/221/125 +f 141/222/126 154/223/126 158/199/126 +f 137/224/127 121/225/127 120/202/127 +f 136/226/117 153/227/117 157/228/117 +f 148/229/128 132/230/128 140/231/128 +f 164/232/129 167/233/129 160/234/129 +f 159/235/122 132/236/122 148/237/122 +f 130/238/130 156/239/130 153/240/130 +f 127/241/131 161/242/131 156/239/131 +f 123/243/121 128/244/121 147/245/121 +f 142/246/132 145/247/132 143/248/132 +f 148/237/133 152/249/133 150/250/133 +f 135/251/128 165/252/128 164/253/128 +f 153/254/118 160/255/118 157/256/118 +f 135/251/128 162/257/128 125/258/128 +f 157/259/134 138/260/134 136/261/134 +f 153/254/118 161/262/118 166/263/118 +f 166/264/135 163/265/135 162/266/135 +f 159/235/136 165/267/136 132/236/136 +f 140/268/120 156/239/120 145/247/120 +f 157/269/118 167/270/118 159/271/118 +f 125/258/128 163/272/128 127/273/128 +f 166/274/117 164/275/117 160/276/117 +f 126/277/137 130/278/137 136/279/137 +f 141/195/138 123/280/138 122/196/138 +f 131/198/139 128/212/139 158/199/139 +f 149/201/117 137/224/117 120/202/117 +f 139/281/118 133/206/118 154/205/118 +f 126/203/119 124/282/119 151/207/119 +f 134/208/120 144/283/120 122/209/120 +f 123/211/121 141/195/121 158/199/121 +f 155/213/122 151/221/122 124/214/122 +f 133/218/140 134/284/140 137/224/140 +f 139/285/141 141/222/141 144/286/141 +f 154/223/142 155/200/142 158/199/142 +f 146/219/143 149/201/143 151/207/143 +f 139/216/123 144/283/123 134/208/123 +f 133/218/124 137/224/124 149/201/124 +f 155/213/125 154/287/125 146/220/125 +f 141/222/126 139/285/126 154/223/126 +f 137/224/127 134/284/127 121/225/127 +f 136/226/117 130/288/117 153/227/117 +f 132/230/128 135/251/128 125/258/128 +f 125/258/128 127/273/128 132/230/128 +f 127/273/128 140/231/128 132/230/128 +f 140/231/128 142/289/128 147/290/128 +f 147/290/128 148/229/128 140/231/128 +f 164/232/129 165/267/129 167/233/129 +f 148/237/122 150/250/122 159/235/122 +f 150/250/122 138/260/122 159/235/122 +f 130/238/130 129/291/130 156/239/130 +f 127/241/131 163/265/131 161/242/131 +f 128/244/121 152/292/121 147/245/121 +f 147/245/121 142/293/121 123/243/121 +f 142/293/121 143/294/121 123/243/121 +f 142/246/132 140/268/132 145/247/132 +f 148/237/133 147/295/133 152/249/133 +f 135/251/128 132/230/128 165/252/128 +f 153/254/118 166/263/118 160/255/118 +f 135/251/128 164/253/128 162/257/128 +f 157/259/134 159/235/134 138/260/134 +f 153/254/118 156/296/118 161/262/118 +f 166/264/135 161/242/135 163/265/135 +f 159/235/136 167/233/136 165/267/136 +f 127/241/120 156/239/120 140/268/120 +f 156/239/120 129/291/120 145/247/120 +f 157/269/118 160/297/118 167/270/118 +f 125/258/128 162/257/128 163/272/128 +f 166/274/117 162/298/117 164/275/117 +f 122/299/144 123/300/144 143/301/144 +f 143/301/145 145/302/145 122/299/145 +f 145/302/146 129/303/146 121/304/146 +f 136/279/147 138/305/147 124/306/147 +f 138/307/148 150/308/148 124/309/148 +f 150/308/149 152/310/149 131/311/149 +f 152/310/144 128/312/144 131/311/144 +f 145/302/146 121/304/146 122/299/146 +f 129/313/150 130/278/150 121/314/150 +f 150/308/148 131/311/148 124/309/148 +f 120/315/151 121/314/151 130/278/151 +f 136/279/152 124/306/152 126/277/152 +f 126/277/137 120/315/137 130/278/137 diff --git a/src/main/resources/assets/hbm/models/centrifuge.obj b/src/main/resources/assets/hbm/models/centrifuge.obj deleted file mode 100644 index ad8ddc807..000000000 --- a/src/main/resources/assets/hbm/models/centrifuge.obj +++ /dev/null @@ -1,492 +0,0 @@ -# Blender v2.70 (sub 0) OBJ File: 'centrifuge.blend' -# www.blender.org -o Cube_Cube.001 -v -0.500000 0.000000 0.500000 -v -0.500000 0.000000 -0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 0.000000 0.500000 -v -0.500000 1.000000 0.500000 -v -0.500000 1.000000 -0.500000 -v 0.500000 1.000000 -0.500000 -v 0.500000 1.000000 0.500000 -v 0.250000 2.500000 0.375000 -v 0.375000 2.500000 0.250000 -v -0.250000 2.500000 0.375000 -v -0.375000 2.500000 0.250000 -v 0.375000 2.500000 -0.125000 -v -0.250000 2.500000 -0.375000 -v 0.375000 2.500000 0.125000 -v -0.375000 2.500000 -0.250000 -v -0.250000 1.000000 0.000000 -v 0.250000 1.000000 0.000000 -v 0.000000 1.000000 0.250000 -v 0.000000 1.000000 -0.250000 -v 0.125000 2.500000 0.375000 -v 0.000000 2.500000 0.125000 -v -0.125000 2.500000 0.375000 -v 0.125000 2.500000 0.000000 -v -0.125000 2.500000 -0.375000 -v -0.125000 2.500000 0.000000 -v -0.375000 2.500000 -0.125000 -v 0.000000 2.500000 -0.125000 -v 0.000000 1.000000 -0.125000 -v 0.125000 2.500000 -0.375000 -v 0.000000 2.500000 -0.250000 -v -0.375000 2.500000 0.125000 -v 0.000000 2.500000 0.250000 -v 0.250000 2.500000 -0.375000 -v 0.250000 2.500000 0.000000 -v 0.375000 2.500000 -0.250000 -v -0.250000 2.500000 0.000000 -v -0.125000 1.000000 0.000000 -v 0.125000 1.000000 0.000000 -v 0.000000 1.000000 0.125000 -v -0.375000 1.000000 -0.250000 -v -0.250000 1.000000 -0.375000 -v -0.375000 1.000000 0.250000 -v -0.250000 1.000000 0.375000 -v 0.375000 1.000000 0.250000 -v 0.250000 1.000000 0.375000 -v 0.375000 1.000000 -0.250000 -v 0.250000 1.000000 -0.375000 -v -0.375000 1.000000 0.125000 -v 0.125000 1.000000 -0.375000 -v -0.375000 1.000000 -0.125000 -v -0.125000 1.000000 -0.375000 -v -0.125000 1.000000 0.375000 -v 0.125000 1.000000 0.375000 -v 0.375000 1.000000 0.125000 -v 0.375000 1.000000 -0.125000 -v -0.125000 2.500000 -0.016543 -v -0.250000 2.625000 0.125000 -v -0.125000 2.625000 0.125000 -v -0.250000 2.625000 0.250000 -v -0.125000 2.625000 0.250000 -v 0.250000 2.625000 0.250000 -v 0.250000 2.625000 -0.250000 -v -0.125000 2.625000 -0.250000 -v -0.125000 2.625000 -0.125000 -v 0.250000 2.625000 -0.125000 -v -0.250000 2.625000 -0.250000 -v -0.250000 2.625000 -0.125000 -v 0.125000 2.625000 -0.250000 -v 0.125000 2.625000 -0.125000 -v 0.125000 2.625000 0.250000 -v 0.125000 2.625000 0.125000 -v 0.250000 2.625000 0.125000 -vt 0.407021 0.190559 -vt 0.227717 0.190559 -vt 0.227717 0.015734 -vt 0.404781 0.219788 -vt 0.404782 0.399093 -vt 0.229956 0.399093 -vt 0.193202 0.192799 -vt 0.018377 0.192799 -vt 0.018377 0.013495 -vt 0.193202 0.399093 -vt 0.018377 0.399093 -vt 0.018377 0.219789 -vt 0.439296 0.396853 -vt 0.439296 0.222028 -vt 0.618600 0.222028 -vt 0.323385 0.428322 -vt 0.323385 0.690560 -vt 0.291688 0.690560 -vt 0.102522 0.722028 -vt 0.102522 0.984266 -vt 0.080109 0.984266 -vt 0.983863 0.515734 -vt 0.983863 0.777972 -vt 0.961450 0.777972 -vt 0.618600 0.428322 -vt 0.618600 0.690559 -vt 0.586903 0.690559 -vt 0.682572 0.515734 -vt 0.682572 0.777972 -vt 0.650875 0.777972 -vt 0.865203 0.222028 -vt 0.865203 0.484266 -vt 0.842790 0.484266 -vt 0.810515 0.222028 -vt 0.810515 0.484266 -vt 0.778819 0.484266 -vt 0.750389 0.027972 -vt 0.750389 0.093531 -vt 0.727976 0.071678 -vt 0.016137 0.765734 -vt 0.016137 0.743881 -vt 0.038550 0.722028 -vt 0.461709 0.146853 -vt 0.484122 0.168706 -vt 0.439296 0.190559 -vt 0.461709 0.059441 -vt 0.439296 0.015734 -vt 0.484122 0.037587 -vt 0.596187 0.059441 -vt 0.573774 0.037587 -vt 0.618600 0.015734 -vt 0.596187 0.146853 -vt 0.618600 0.190559 -vt 0.573774 0.168706 -vt 0.534964 0.428322 -vt 0.534964 0.690559 -vt 0.503268 0.690559 -vt 0.596187 0.081294 -vt 0.461709 0.125000 -vt 0.551361 0.168706 -vt 0.470993 0.428322 -vt 0.470993 0.690559 -vt 0.439296 0.690559 -vt 0.551361 0.037587 -vt 0.637776 0.969712 -vt 0.637723 0.816438 -vt 0.958331 0.816438 -vt 0.596187 0.125000 -vt 0.573774 0.103147 -vt 0.506535 0.037587 -vt 0.528948 0.059441 -vt 0.461709 0.081294 -vt 0.484122 0.103147 -vt 0.506535 0.168706 -vt 0.528948 0.146853 -vt 0.397737 0.722028 -vt 0.397737 0.984266 -vt 0.375324 0.984266 -vt 0.874487 0.515734 -vt 0.874487 0.777972 -vt 0.842790 0.777972 -vt 0.407021 0.428322 -vt 0.407021 0.690560 -vt 0.375324 0.690560 -vt 0.929175 0.515734 -vt 0.929175 0.777972 -vt 0.906762 0.777972 -vt 0.974579 0.222028 -vt 0.974579 0.484266 -vt 0.952166 0.484266 -vt 0.682572 0.222028 -vt 0.682572 0.484266 -vt 0.650875 0.484266 -vt 0.746543 0.515734 -vt 0.746544 0.777972 -vt 0.714847 0.777972 -vt 0.919891 0.222028 -vt 0.919891 0.484266 -vt 0.897478 0.484266 -vt 0.746544 0.222028 -vt 0.746544 0.484266 -vt 0.714847 0.484266 -vt 0.343049 0.722028 -vt 0.343049 0.984266 -vt 0.320636 0.984266 -vt 0.810515 0.515734 -vt 0.810515 0.777972 -vt 0.778819 0.777972 -vt 0.111806 0.428322 -vt 0.111806 0.690560 -vt 0.080109 0.690560 -vt 0.195442 0.428322 -vt 0.195442 0.690560 -vt 0.163745 0.690560 -vt 0.047834 0.428322 -vt 0.047834 0.690559 -vt 0.016138 0.690559 -vt 0.259413 0.428322 -vt 0.259413 0.690560 -vt 0.227717 0.690560 -vt 0.673288 0.037587 -vt 0.695701 0.015734 -vt 0.695701 0.081294 -vt 0.750389 0.190559 -vt 0.727976 0.168706 -vt 0.727976 0.146853 -vt 0.650875 0.081294 -vt 0.650875 0.015734 -vt 0.448580 0.722028 -vt 0.470993 0.743881 -vt 0.470993 0.765734 -vt 0.265949 0.743881 -vt 0.288362 0.722028 -vt 0.288362 0.787587 -vt 0.650875 0.190559 -vt 0.650875 0.125000 -vt 0.673288 0.146853 -vt 0.503268 0.743881 -vt 0.525681 0.722028 -vt 0.525681 0.787587 -vt 0.016137 0.840909 -vt 0.016137 0.819056 -vt 0.038550 0.819056 -vt 0.522306 0.965642 -vt 0.499893 0.965643 -vt 0.499893 0.943789 -vt 0.610887 0.870908 -vt 0.610896 0.901792 -vt 0.579193 0.901785 -vt 0.178986 0.819056 -vt 0.178986 0.840909 -vt 0.156573 0.840909 -vt 0.695701 0.125000 -vt 0.695701 0.190559 -vt 0.673288 0.168706 -vt 0.186158 0.787587 -vt 0.163745 0.765734 -vt 0.163745 0.743881 -vt 0.782664 0.071678 -vt 0.805077 0.093531 -vt 0.805077 0.027972 -vt 0.837352 0.049825 -vt 0.859765 0.027972 -vt 0.859765 0.093531 -vt 0.609316 0.765734 -vt 0.586903 0.787587 -vt 0.586903 0.722028 -vt 0.805077 0.125000 -vt 0.805077 0.190559 -vt 0.782664 0.168706 -vt 0.837352 0.146853 -vt 0.859765 0.125000 -vt 0.859765 0.190559 -vt 0.265949 0.819056 -vt 0.288362 0.819056 -vt 0.288362 0.849961 -vt 0.442818 0.940641 -vt 0.465231 0.940641 -vt 0.465231 0.971546 -vt 0.233674 0.849961 -vt 0.211261 0.849961 -vt 0.211261 0.819056 -vt 0.522505 0.912435 -vt 0.500092 0.912435 -vt 0.500092 0.881530 -vt 0.470993 0.819056 -vt 0.470993 0.849961 -vt 0.448580 0.849961 -vt 0.586903 0.849961 -vt 0.586903 0.819056 -vt 0.609316 0.819056 -vt 0.469202 0.910790 -vt 0.469202 0.879885 -vt 0.446789 0.879885 -vt 0.503268 0.849961 -vt 0.503268 0.819056 -vt 0.525681 0.819056 -vt 0.407021 0.015734 -vt 0.229956 0.219789 -vt 0.193202 0.013495 -vt 0.193202 0.219788 -vt 0.618600 0.396853 -vt 0.291688 0.428322 -vt 0.080109 0.722028 -vt 0.961450 0.515734 -vt 0.586903 0.428322 -vt 0.650875 0.515734 -vt 0.842790 0.222028 -vt 0.778818 0.222028 -vt 0.727976 0.049825 -vt 0.038550 0.787587 -vt 0.503268 0.428322 -vt 0.439296 0.428322 -vt 0.375324 0.722028 -vt 0.958385 0.969712 -vt 0.842790 0.515734 -vt 0.375324 0.428322 -vt 0.906762 0.515734 -vt 0.952166 0.222028 -vt 0.650875 0.222028 -vt 0.714846 0.515734 -vt 0.897478 0.222028 -vt 0.714847 0.222028 -vt 0.320636 0.722028 -vt 0.778818 0.515734 -vt 0.080109 0.428322 -vt 0.163745 0.428322 -vt 0.016137 0.428322 -vt 0.227717 0.428322 -vt 0.673288 0.059441 -vt 0.750389 0.125000 -vt 0.448580 0.787587 -vt 0.265949 0.765734 -vt 0.503268 0.765734 -vt 0.038550 0.840909 -vt 0.522306 0.943789 -vt 0.579193 0.870880 -vt 0.156573 0.819056 -vt 0.186158 0.722028 -vt 0.782664 0.049825 -vt 0.837352 0.071678 -vt 0.609316 0.743881 -vt 0.782664 0.146853 -vt 0.837352 0.168706 -vt 0.265949 0.849961 -vt 0.442818 0.971546 -vt 0.233674 0.819056 -vt 0.522505 0.881530 -vt 0.448580 0.819056 -vt 0.609316 0.849961 -vt 0.446789 0.910790 -vt 0.525681 0.849961 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 1.000000 0.000000 0.000000 -vn 0.000000 0.000000 -1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.707107 0.000000 0.707107 -vn -0.707107 0.000000 0.707107 -vn 0.707107 0.000000 -0.707107 -vn -0.707107 0.000000 -0.707107 -vn 0.000000 1.000000 0.000000 -vn 1.000000 -0.000001 0.000000 -vn 0.000000 1.000000 -0.000001 -vn 0.000000 1.000000 0.000002 -vn 0.000000 0.707107 -0.707107 -vn 0.000000 0.707107 0.707107 -vn 0.000000 0.707105 -0.707108 -vn 0.000000 1.000000 -0.000004 -vn -1.000000 -0.000001 -0.000000 -vn 1.000000 -0.000002 -0.000000 -vn -0.000000 0.707108 -0.707106 -vn 0.000000 0.707107 -0.707106 -vn 0.000000 0.707108 -0.707105 -s off -f 5/1/1 6/2/1 2/3/1 -f 4/4/2 8/5/2 5/6/2 -f 7/7/3 8/8/3 4/9/3 -f 6/10/4 7/11/4 3/12/4 -f 2/13/5 3/14/5 4/15/5 -f 19/16/6 33/17/6 23/18/6 -f 46/19/2 9/20/2 21/21/2 -f 42/22/4 14/23/4 25/24/4 -f 17/25/7 37/26/7 27/27/7 -f 38/28/8 26/29/8 22/30/8 -f 47/31/3 36/32/3 13/33/3 -f 40/34/9 22/35/9 24/36/9 -f 26/37/3 25/38/3 64/39/3 -f 70/40/1 69/41/1 30/42/1 -f 44/43/10 43/44/10 5/45/10 -f 46/46/10 8/47/10 45/48/10 -f 48/49/10 47/50/10 7/51/10 -f 42/52/10 6/53/10 41/54/10 -f 54/55/7 21/56/7 33/57/7 -f 48/49/10 7/51/10 50/58/10 -f 53/59/10 44/43/10 5/45/10 -f 41/54/10 6/53/10 51/60/10 -f 39/61/7 24/62/7 28/63/7 -f 7/51/10 47/50/10 56/64/10 -f 40/65/10 39/66/10 29/67/10 -f 52/68/10 20/69/10 50/58/10 -f 55/70/10 56/64/10 18/71/10 -f 53/59/10 54/72/10 19/73/10 -f 51/60/10 49/74/10 17/75/10 -f 50/76/4 30/77/4 34/78/4 -f 20/79/9 31/80/9 30/81/9 -f 52/82/8 25/83/8 31/84/8 -f 51/85/1 27/86/1 16/87/1 -f 43/88/1 12/89/1 32/90/1 -f 44/91/7 11/92/7 12/93/7 -f 41/94/9 16/95/9 14/96/9 -f 55/97/3 15/98/3 10/99/3 -f 48/100/8 34/101/8 36/102/8 -f 53/103/2 23/104/2 11/105/2 -f 56/106/6 13/107/6 35/108/6 -f 45/109/6 10/110/6 9/111/6 -f 49/112/9 32/113/9 37/114/9 -f 29/115/6 28/116/6 26/117/6 -f 18/118/8 35/119/8 15/120/8 -f 28/121/10 24/122/10 30/123/10 -f 34/124/3 63/125/3 66/126/3 -f 25/127/10 26/128/10 28/121/10 -f 26/129/11 59/130/11 61/131/11 -f 58/132/1 37/133/1 11/134/1 -f 26/135/10 23/136/10 33/137/10 -f 36/138/10 34/139/10 35/140/10 -f 60/141/12 61/142/12 59/143/12 -f 67/144/10 68/145/10 65/146/10 -f 69/147/10 70/148/10 66/149/10 -f 71/150/13 62/151/13 73/152/13 -f 21/153/10 24/154/10 22/155/10 -f 21/156/1 71/157/1 72/158/1 -f 67/159/1 14/160/1 37/161/1 -f 12/162/10 11/163/10 37/164/10 -f 27/165/10 37/166/10 14/167/10 -f 9/168/3 35/169/3 73/170/3 -f 15/171/10 35/172/10 9/173/10 -f 34/174/14 30/175/14 69/176/14 -f 62/177/15 71/178/15 21/179/15 -f 35/180/16 24/181/16 72/182/16 -f 24/183/15 35/184/15 66/185/15 -f 23/186/15 61/187/15 60/188/15 -f 59/189/14 26/190/14 37/191/14 -f 26/192/15 65/193/15 68/194/15 -f 14/195/14 67/196/14 64/197/14 -f 1/198/1 5/1/1 2/3/1 -f 1/199/2 4/4/2 5/6/2 -f 3/200/3 7/7/3 4/9/3 -f 2/201/4 6/10/4 3/12/4 -f 1/202/5 2/13/5 4/15/5 -f 53/203/6 19/16/6 23/18/6 -f 54/204/2 46/19/2 21/21/2 -f 52/205/4 42/22/4 25/24/4 -f 51/206/7 17/25/7 27/27/7 -f 40/207/8 38/28/8 22/30/8 -f 56/208/3 47/31/3 13/33/3 -f 39/209/9 40/34/9 24/36/9 -f 65/210/3 26/37/3 64/39/3 -f 24/211/1 70/40/1 30/42/1 -f 19/212/7 54/55/7 33/57/7 -f 6/53/10 52/68/10 7/51/10 -f 6/53/10 42/52/10 52/68/10 -f 5/45/10 43/44/10 49/74/10 -f 7/51/10 52/68/10 50/58/10 -f 53/59/10 8/47/10 54/72/10 -f 5/45/10 49/74/10 6/53/10 -f 8/47/10 46/46/10 54/72/10 -f 53/59/10 5/45/10 8/47/10 -f 29/213/7 39/61/7 28/63/7 -f 6/53/10 49/74/10 51/60/10 -f 55/70/10 45/48/10 8/47/10 -f 48/214/4 50/76/4 34/78/4 -f 55/70/10 7/51/10 56/64/10 -f 38/215/10 40/65/10 29/67/10 -f 55/70/10 8/47/10 7/51/10 -f 50/216/9 20/79/9 30/81/9 -f 20/217/8 52/82/8 31/84/8 -f 41/218/1 51/85/1 16/87/1 -f 49/219/1 43/88/1 32/90/1 -f 43/220/7 44/91/7 12/93/7 -f 42/221/9 41/94/9 14/96/9 -f 45/222/3 55/97/3 10/99/3 -f 47/223/8 48/100/8 36/102/8 -f 44/224/2 53/103/2 11/105/2 -f 18/225/6 56/106/6 35/108/6 -f 46/226/6 45/109/6 9/111/6 -f 17/227/9 49/112/9 37/114/9 -f 38/228/6 29/115/6 26/117/6 -f 55/229/8 18/118/8 15/120/8 -f 31/230/10 28/121/10 30/123/10 -f 35/231/3 34/124/3 66/126/3 -f 31/230/10 25/127/10 28/121/10 -f 23/232/3 26/129/3 61/131/3 -f 60/233/1 58/132/1 11/134/1 -f 22/155/10 26/135/10 33/137/10 -f 13/234/10 36/138/10 35/140/10 -f 58/235/10 60/141/10 59/143/10 -f 64/236/17 67/144/17 65/146/17 -f 63/237/10 69/147/10 66/149/10 -f 72/238/10 71/150/10 73/152/10 -f 33/137/10 21/153/10 22/155/10 -f 24/239/1 21/156/1 72/158/1 -f 68/240/18 67/159/18 37/161/18 -f 32/241/10 12/162/10 37/164/10 -f 16/242/10 27/165/10 14/167/10 -f 62/243/19 9/168/19 73/170/19 -f 10/244/10 15/171/10 9/173/10 -f 63/245/14 34/174/14 69/176/14 -f 9/246/15 62/177/15 21/179/15 -f 73/247/20 35/180/20 72/182/20 -f 70/248/15 24/183/15 66/185/15 -f 11/249/15 23/186/15 60/188/15 -f 58/250/21 59/189/21 37/191/21 -f 37/251/15 26/192/15 68/194/15 -f 25/252/22 14/195/22 64/197/22 -l 57 26 diff --git a/src/main/resources/assets/hbm/models/centrifuge_new.obj b/src/main/resources/assets/hbm/models/centrifuge_new.obj deleted file mode 100644 index 357ce15eb..000000000 --- a/src/main/resources/assets/hbm/models/centrifuge_new.obj +++ /dev/null @@ -1,874 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'centrifuge_new.blend' -# www.blender.org -o Cube_Cube.001 -v -0.500000 0.000000 0.500000 -v -0.500000 1.000000 0.500000 -v -0.500000 0.000000 -0.500000 -v -0.500000 1.000000 -0.500000 -v 0.500000 0.000000 0.500000 -v 0.500000 1.000000 0.500000 -v 0.500000 0.000000 -0.500000 -v 0.500000 1.000000 -0.500000 -v -0.500000 0.343750 0.156250 -v -0.500000 0.656250 0.156250 -v -0.500000 0.343750 -0.156250 -v -0.500000 0.656250 -0.156250 -v 0.500000 0.343750 0.156250 -v 0.500000 0.656250 0.156250 -v 0.500000 0.343750 -0.156250 -v 0.500000 0.656250 -0.156250 -v 0.156250 0.343750 0.500000 -v 0.156250 0.656250 0.500000 -v -0.156250 0.343750 0.500000 -v -0.156250 0.656250 0.500000 -v 0.156250 0.343750 -0.500000 -v 0.156250 0.656250 -0.500000 -v -0.156250 0.343750 -0.500000 -v -0.156250 0.656250 -0.500000 -v -0.250000 0.250000 0.500000 -v -0.250000 0.750000 0.500000 -v -0.250000 0.250000 -0.500000 -v -0.250000 0.750000 -0.500000 -v 0.250000 0.250000 0.500000 -v 0.250000 0.750000 0.500000 -v 0.250000 0.250000 -0.500000 -v 0.250000 0.750000 -0.500000 -v 0.500000 0.250000 0.250000 -v 0.500000 0.750000 0.250000 -v -0.500000 0.250000 0.250000 -v -0.500000 0.750000 0.250000 -v 0.500000 0.250000 -0.250000 -v 0.500000 0.750000 -0.250000 -v -0.500000 0.250000 -0.250000 -v -0.500000 0.750000 -0.250000 -v -0.250000 0.750000 -0.437500 -v 0.250000 0.750000 -0.437500 -v 0.250000 0.250000 -0.437500 -v -0.250000 0.250000 -0.437500 -v 0.250000 0.750000 0.437500 -v -0.250000 0.750000 0.437500 -v -0.250000 0.250000 0.437500 -v 0.250000 0.250000 0.437500 -v -0.437500 0.750000 0.250000 -v -0.437500 0.750000 -0.250000 -v -0.437500 0.250000 -0.250000 -v -0.437500 0.250000 0.250000 -v 0.437500 0.750000 -0.250000 -v 0.437500 0.750000 0.250000 -v 0.437500 0.250000 0.250000 -v 0.437500 0.250000 -0.250000 -v -0.437500 0.656250 0.156250 -v -0.437500 0.343750 0.156250 -v -0.437500 0.343750 -0.156250 -v -0.437500 0.656250 -0.156250 -v 0.437500 0.656250 -0.156250 -v 0.437500 0.343750 -0.156250 -v 0.437500 0.343750 0.156250 -v 0.437500 0.656250 0.156250 -v 0.156250 0.656250 0.437500 -v 0.156250 0.343750 0.437500 -v -0.156250 0.343750 0.437500 -v -0.156250 0.656250 0.437500 -v -0.156250 0.656250 -0.437500 -v -0.156250 0.343750 -0.437500 -v 0.156250 0.343750 -0.437500 -v 0.156250 0.656250 -0.437500 -v 0.250000 2.900000 -0.450000 -v 0.250000 1.000000 -0.450000 -v 0.250000 1.000000 0.050000 -v 0.250000 2.900000 0.050000 -v 0.391421 1.000000 0.108579 -v 0.391421 2.900000 0.108579 -v 0.450000 1.000000 0.250000 -v 0.450000 2.900000 0.250000 -v 0.391421 1.000000 0.391421 -v 0.391421 2.900000 0.391421 -v 0.250000 1.000000 0.450000 -v 0.250000 2.900000 0.450000 -v 0.108579 1.000000 0.391421 -v 0.108579 2.900000 0.391421 -v 0.050000 1.000000 0.250000 -v 0.050000 2.900000 0.250000 -v 0.108579 1.000000 0.108579 -v 0.108579 2.900000 0.108579 -v 0.391421 1.000000 -0.391421 -v 0.391421 2.900000 -0.391421 -v 0.450000 1.000000 -0.250000 -v 0.450000 2.900000 -0.250000 -v 0.391421 1.000000 -0.108579 -v 0.391421 2.900000 -0.108579 -v 0.250000 1.000000 -0.050000 -v 0.250000 2.900000 -0.050000 -v 0.108579 1.000000 -0.108579 -v 0.108579 2.900000 -0.108579 -v 0.050000 1.000000 -0.250000 -v 0.050000 2.900000 -0.250000 -v 0.108579 1.000000 -0.391421 -v 0.108579 2.900000 -0.391421 -v -0.250000 2.900000 -0.450000 -v -0.250000 1.000000 -0.450000 -v -0.250000 1.000000 0.050000 -v -0.250000 2.900000 0.050000 -v -0.108579 1.000000 0.108579 -v -0.108579 2.900000 0.108579 -v -0.050000 1.000000 0.250000 -v -0.050000 2.900000 0.250000 -v -0.108579 1.000000 0.391421 -v -0.108579 2.900000 0.391421 -v -0.250000 1.000000 0.450000 -v -0.250000 2.900000 0.450000 -v -0.391421 1.000000 0.391421 -v -0.391421 2.900000 0.391421 -v -0.450000 1.000000 0.250000 -v -0.450000 2.900000 0.250000 -v -0.391421 1.000000 0.108579 -v -0.391421 2.900000 0.108579 -v -0.108579 1.000000 -0.391421 -v -0.108579 2.900000 -0.391421 -v -0.050000 1.000000 -0.250000 -v -0.050000 2.900000 -0.250000 -v -0.108579 1.000000 -0.108579 -v -0.108579 2.900000 -0.108579 -v -0.250000 1.000000 -0.050000 -v -0.250000 2.900000 -0.050000 -v -0.391421 1.000000 -0.108579 -v -0.391421 2.900000 -0.108579 -v -0.450000 1.000000 -0.250000 -v -0.450000 2.900000 -0.250000 -v -0.391421 1.000000 -0.391421 -v -0.391421 2.900000 -0.391421 -v 0.320711 2.950000 0.179289 -v 0.250000 2.950000 0.150000 -v 0.179289 2.950000 0.179289 -v 0.150000 2.950000 0.250000 -v 0.179289 2.950000 0.320711 -v 0.250000 2.950000 0.350000 -v 0.320711 2.950000 0.320711 -v 0.350000 2.950000 0.250000 -v 0.320711 2.950000 -0.320711 -v 0.250000 2.950000 -0.350000 -v 0.179289 2.950000 -0.320711 -v 0.150000 2.950000 -0.250000 -v 0.179289 2.950000 -0.179289 -v 0.250000 2.950000 -0.150000 -v 0.320711 2.950000 -0.179289 -v 0.350000 2.950000 -0.250000 -v -0.179289 2.950000 0.179289 -v -0.250000 2.950000 0.150000 -v -0.320711 2.950000 0.179289 -v -0.350000 2.950000 0.250000 -v -0.320711 2.950000 0.320711 -v -0.250000 2.950000 0.350000 -v -0.179289 2.950000 0.320711 -v -0.150000 2.950000 0.250000 -v -0.179289 2.950000 -0.320711 -v -0.250000 2.950000 -0.350000 -v -0.320711 2.950000 -0.320711 -v -0.350000 2.950000 -0.250000 -v -0.320711 2.950000 -0.179289 -v -0.250000 2.950000 -0.150000 -v -0.179289 2.950000 -0.179289 -v -0.150000 2.950000 -0.250000 -v 0.100000 1.000000 -0.064645 -v 0.100000 3.000000 -0.064645 -v 0.064645 1.000000 -0.100000 -v 0.064645 3.000000 -0.100000 -v 0.135355 1.000000 -0.100000 -v 0.135355 3.000000 -0.100000 -v 0.100000 1.000000 -0.135355 -v 0.100000 3.000000 -0.135355 -v 0.100000 3.050000 -0.064645 -v 0.064645 3.050000 -0.100000 -v 0.100000 3.050000 -0.135355 -v 0.135355 3.050000 -0.100000 -v 0.250000 3.050000 -0.214645 -v 0.214645 3.050000 -0.250000 -v 0.250000 3.050000 -0.285355 -v 0.285355 3.050000 -0.250000 -v 0.250000 3.000000 -0.214645 -v 0.214645 3.000000 -0.250000 -v 0.250000 3.000000 -0.285355 -v 0.285355 3.000000 -0.250000 -v 0.250000 2.950000 -0.214645 -v 0.214645 2.950000 -0.250000 -v 0.250000 2.950000 -0.285355 -v 0.285355 2.950000 -0.250000 -v 0.100000 1.000000 0.435355 -v 0.100000 3.000000 0.435355 -v 0.064645 1.000000 0.400000 -v 0.064645 3.000000 0.400000 -v 0.135355 1.000000 0.400000 -v 0.135355 3.000000 0.400000 -v 0.100000 1.000000 0.364645 -v 0.100000 3.000000 0.364645 -v 0.100000 3.050000 0.435355 -v 0.064645 3.050000 0.400000 -v 0.100000 3.050000 0.364645 -v 0.135355 3.050000 0.400000 -v 0.250000 3.050000 0.285355 -v 0.214645 3.050000 0.250000 -v 0.250000 3.050000 0.214645 -v 0.285355 3.050000 0.250000 -v 0.250000 3.000000 0.285355 -v 0.214645 3.000000 0.250000 -v 0.250000 3.000000 0.214645 -v 0.285355 3.000000 0.250000 -v 0.250000 2.950000 0.285355 -v 0.214645 2.950000 0.250000 -v 0.250000 2.950000 0.214645 -v 0.285355 2.950000 0.250000 -v -0.400000 1.000000 0.435355 -v -0.400000 3.000000 0.435355 -v -0.435355 1.000000 0.400000 -v -0.435355 3.000000 0.400000 -v -0.364645 1.000000 0.400000 -v -0.364645 3.000000 0.400000 -v -0.400000 1.000000 0.364645 -v -0.400000 3.000000 0.364645 -v -0.400000 3.050000 0.435355 -v -0.435355 3.050000 0.400000 -v -0.400000 3.050000 0.364645 -v -0.364645 3.050000 0.400000 -v -0.250000 3.050000 0.285355 -v -0.285355 3.050000 0.250000 -v -0.250000 3.050000 0.214645 -v -0.214645 3.050000 0.250000 -v -0.250000 3.000000 0.285355 -v -0.285355 3.000000 0.250000 -v -0.250000 3.000000 0.214645 -v -0.214645 3.000000 0.250000 -v -0.250000 2.950000 0.285355 -v -0.285355 2.950000 0.250000 -v -0.250000 2.950000 0.214645 -v -0.214645 2.950000 0.250000 -v -0.400000 1.000000 -0.064645 -v -0.400000 3.000000 -0.064645 -v -0.435355 1.000000 -0.100000 -v -0.435355 3.000000 -0.100000 -v -0.364645 1.000000 -0.100000 -v -0.364645 3.000000 -0.100000 -v -0.400000 1.000000 -0.135355 -v -0.400000 3.000000 -0.135355 -v -0.400000 3.050000 -0.064645 -v -0.435355 3.050000 -0.100000 -v -0.400000 3.050000 -0.135355 -v -0.364645 3.050000 -0.100000 -v -0.250000 3.050000 -0.214645 -v -0.285355 3.050000 -0.250000 -v -0.250000 3.050000 -0.285355 -v -0.214645 3.050000 -0.250000 -v -0.250000 3.000000 -0.214645 -v -0.285355 3.000000 -0.250000 -v -0.250000 3.000000 -0.285355 -v -0.214645 3.000000 -0.250000 -v -0.250000 2.950000 -0.214645 -v -0.285355 2.950000 -0.250000 -v -0.250000 2.950000 -0.285355 -v -0.214645 2.950000 -0.250000 -vt 0.695312 0.371094 -vt 0.949219 0.371094 -vt 0.949219 0.625000 -vt 0.144531 -0.000000 -vt 0.207031 0.000000 -vt 0.207031 0.062500 -vt 0.136719 0.039062 -vt 0.128906 0.031250 -vt 0.128906 0.015625 -vt 0.136719 0.007812 -vt 0.113281 0.015625 -vt 0.113281 0.031250 -vt 0.105469 0.039062 -vt 0.089844 0.027344 -vt 0.070312 0.027344 -vt 0.070312 0.007812 -vt 0.046875 0.015625 -vt 0.015625 0.015625 -vt -0.000000 0.000000 -vt 0.015625 0.046875 -vt 0.046875 0.046875 -vt 0.062500 0.062500 -vt 0.000000 0.062500 -vt 0.062500 0.000000 -vt 0.136719 0.042969 -vt 0.105469 0.007812 -vt 0.101562 0.039062 -vt 0.105469 0.003906 -vt 0.140625 0.007812 -vt 0.093750 0.007812 -vt 0.093750 0.027344 -vt 0.070312 0.003906 -vt 0.089844 0.003906 -vt 0.089844 0.007812 -vt 0.066406 0.027344 -vt 0.066406 0.007812 -vt 0.089844 0.031250 -vt 0.070312 0.031250 -vt 0.050903 0.836838 -vt 0.013435 0.836838 -vt 0.013433 0.371769 -vt 0.238245 0.836838 -vt 0.200776 0.836838 -vt 0.200776 0.371768 -vt 0.088372 0.836838 -vt 0.050902 0.371769 -vt 0.163308 0.836838 -vt 0.163307 0.371768 -vt 0.125840 0.836838 -vt 0.088370 0.371769 -vt 0.125839 0.371769 -vt 0.377931 0.861153 -vt 0.377931 0.371601 -vt 0.390169 0.371601 -vt 0.313181 0.836838 -vt 0.275713 0.836838 -vt 0.275713 0.371768 -vt 0.238244 0.371768 -vt 0.353454 0.861153 -vt 0.353454 0.371601 -vt 0.365692 0.371601 -vt 0.365692 0.861153 -vt 0.341215 0.861153 -vt 0.341216 0.371601 -vt 0.875778 0.677068 -vt 0.889025 0.645087 -vt 0.921006 0.658334 -vt 0.228878 0.862551 -vt 0.210143 0.862551 -vt 0.266346 0.862551 -vt 0.247612 0.862551 -vt 0.303814 0.862551 -vt 0.285080 0.862551 -vt 0.041536 0.862552 -vt 0.022802 0.862552 -vt 0.079004 0.862551 -vt 0.060270 0.862552 -vt 0.116473 0.862551 -vt 0.097739 0.862551 -vt 0.153941 0.862551 -vt 0.135207 0.862551 -vt 0.191409 0.862551 -vt 0.172675 0.862551 -vt 0.875778 0.658334 -vt 0.907759 0.645087 -vt 0.921006 0.677068 -vt 0.443375 0.716201 -vt 0.431136 0.716201 -vt 0.431136 0.676515 -vt 0.455614 0.676515 -vt 0.455614 0.664276 -vt 0.467852 0.664276 -vt 0.467852 0.652038 -vt 0.480091 0.676515 -vt 0.467852 0.676515 -vt 0.443375 0.664276 -vt 0.455614 0.728439 -vt 0.455614 0.716201 -vt 0.467852 0.716201 -vt 0.888254 0.732063 -vt 0.888254 0.719824 -vt 0.900493 0.719824 -vt 0.480091 0.716201 -vt 0.480091 0.728439 -vt 0.443375 0.728439 -vt 0.467852 0.728439 -vt 0.467852 0.740678 -vt 0.455614 0.740678 -vt 0.912731 0.732063 -vt 0.912731 0.719824 -vt 0.924970 0.719824 -vt 0.900493 0.732063 -vt 0.876015 0.732063 -vt 0.876015 0.719824 -vt 0.924970 0.732063 -vt 0.695312 0.625000 -vt 0.144531 0.062500 -vt 0.105469 0.042969 -vt 0.101562 0.007812 -vt 0.136719 0.003906 -vt 0.140625 0.039062 -vt 0.390170 0.861153 -vt 0.313181 0.371768 -vt 0.907759 0.690316 -vt 0.889025 0.690315 -vt 0.443375 0.676515 -vt 0.455614 0.652038 -vt 0.480091 0.664276 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -vn 0.000000 0.000000 1.000000 -vn 0.000000 0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -vn -0.923900 0.000000 0.382700 -vn 0.382700 0.000000 -0.923900 -vn -0.382700 0.000000 0.923900 -vn 0.923900 0.000000 -0.382700 -vn 0.382700 0.000000 0.923900 -vn 0.923900 0.000000 0.382700 -vn -0.707100 0.000000 -0.707100 -vn -0.923900 0.000000 -0.382700 -vn -0.382700 0.000000 -0.923900 -vn 0.707100 0.000000 0.707100 -vn 0.707100 0.000000 -0.707100 -vn -0.707100 0.000000 0.707100 -vn 0.182100 0.879500 -0.439700 -vn -0.182100 0.879500 -0.439700 -vn -0.439700 0.879500 -0.182100 -vn -0.439700 0.879500 0.182100 -vn -0.182100 0.879500 0.439700 -vn 0.182100 0.879500 0.439700 -vn 0.439700 0.879500 0.182100 -vn 0.439700 0.879500 -0.182100 -s off -f 3/1/1 7/2/1 5/3/1 -f 8/4/2 4/5/2 2/6/2 -f 49/7/3 57/8/3 58/9/3 -f 52/10/3 58/9/3 59/11/3 -f 59/11/3 60/12/3 50/13/3 -f 18/14/4 20/15/4 19/16/4 -f 27/17/5 31/18/5 7/19/5 -f 32/20/5 28/21/5 4/22/5 -f 35/17/3 39/18/3 3/19/3 -f 40/20/3 36/21/3 2/22/3 -f 29/17/4 25/18/4 1/19/4 -f 26/20/4 30/21/4 6/22/4 -f 37/17/6 33/18/6 5/19/6 -f 34/20/6 38/21/6 8/22/6 -f 6/23/6 5/19/6 33/18/6 -f 29/17/4 5/24/4 6/22/4 -f 2/23/4 1/19/4 25/18/4 -f 35/17/3 1/24/3 2/22/3 -f 4/23/3 3/19/3 39/18/3 -f 27/17/5 3/24/5 4/22/5 -f 8/23/5 7/19/5 31/18/5 -f 37/17/6 7/24/6 8/22/6 -f 42/13/1 41/7/1 28/25/1 -f 43/26/3 42/13/3 32/27/3 -f 44/10/2 43/26/2 31/28/2 -f 41/7/6 44/10/6 27/29/6 -f 46/13/1 45/7/1 30/25/1 -f 47/26/6 46/13/6 26/27/6 -f 48/10/2 47/26/2 25/28/2 -f 45/7/3 48/10/3 29/29/3 -f 50/13/1 49/7/1 36/25/1 -f 51/26/4 50/13/4 40/27/4 -f 52/10/2 51/26/2 39/28/2 -f 49/7/5 52/10/5 35/29/5 -f 54/13/1 53/7/1 38/25/1 -f 55/26/5 54/13/5 34/27/5 -f 56/10/2 55/26/2 33/28/2 -f 53/7/4 56/10/4 37/29/4 -f 47/26/4 67/11/4 68/12/4 -f 58/30/4 57/31/4 10/14/4 -f 59/32/1 58/33/1 9/34/1 -f 60/35/5 59/36/5 11/16/5 -f 57/37/2 60/38/2 12/15/2 -f 46/13/4 68/12/4 65/8/4 -f 62/30/5 61/31/5 16/14/5 -f 63/32/1 62/33/1 15/34/1 -f 64/35/4 63/36/4 13/16/4 -f 61/37/2 64/38/2 14/15/2 -f 65/8/4 66/9/4 48/10/4 -f 66/30/6 65/31/6 18/14/6 -f 67/32/1 66/33/1 17/34/1 -f 68/35/3 67/36/3 19/16/3 -f 65/37/2 68/38/2 20/15/2 -f 66/9/4 67/11/4 47/26/4 -f 70/30/3 69/31/3 24/14/3 -f 71/32/1 70/33/1 23/34/1 -f 72/35/6 71/36/6 21/16/6 -f 69/37/2 72/38/2 22/15/2 -f 60/12/3 57/8/3 49/7/3 -f 43/26/5 71/11/5 72/12/5 -f 70/9/5 71/11/5 43/26/5 -f 69/8/5 70/9/5 44/10/5 -f 42/13/5 72/12/5 69/8/5 -f 63/11/6 64/12/6 54/13/6 -f 56/10/6 62/9/6 63/11/6 -f 53/7/6 61/8/6 62/9/6 -f 64/12/6 61/8/6 53/7/6 -f 10/14/3 12/15/3 11/16/3 -f 24/14/5 22/15/5 21/16/5 -f 16/14/6 14/15/6 13/16/6 -f 100/39/7 102/40/7 101/41/7 -f 76/42/8 78/43/8 77/44/8 -f 98/45/9 100/39/9 99/46/9 -f 78/43/10 80/47/10 79/48/10 -f 96/49/11 98/45/11 97/50/11 -f 80/47/12 82/49/12 81/51/12 -f 200/52/13 199/53/13 195/54/13 -f 94/47/12 96/49/12 95/51/12 -f 82/49/11 84/45/11 83/50/11 -f 102/55/14 104/56/14 103/57/14 -f 92/43/10 94/47/10 93/48/10 -f 84/45/9 86/39/9 85/46/9 -f 104/56/15 73/42/15 74/58/15 -f 73/42/8 92/43/8 91/44/8 -f 86/39/7 88/40/7 87/41/7 -f 170/59/16 169/60/16 173/61/16 -f 90/56/15 76/42/15 75/58/15 -f 88/55/14 90/56/14 89/57/14 -f 174/62/17 173/61/17 175/53/17 -f 198/62/17 197/61/17 199/53/17 -f 132/39/7 134/40/7 133/41/7 -f 108/42/8 110/43/8 109/44/8 -f 130/45/9 132/39/9 131/46/9 -f 110/43/10 112/47/10 111/48/10 -f 128/49/11 130/45/11 129/50/11 -f 112/47/12 114/49/12 113/51/12 -f 194/59/16 193/60/16 197/61/16 -f 126/47/12 128/49/12 127/51/12 -f 114/49/11 116/45/11 115/50/11 -f 134/55/14 136/56/14 135/57/14 -f 124/43/10 126/47/10 125/48/10 -f 116/45/9 118/39/9 117/46/9 -f 136/56/15 105/42/15 106/58/15 -f 105/42/8 124/43/8 123/44/8 -f 118/39/7 120/40/7 119/41/7 -f 176/52/13 175/53/13 171/54/13 -f 122/56/15 108/42/15 107/58/15 -f 120/55/14 122/56/14 121/57/14 -f 172/63/18 171/64/18 169/60/18 -f 140/65/2 142/66/2 144/67/2 -f 76/42/19 138/68/19 137/69/19 -f 139/70/20 138/71/20 76/42/20 -f 140/72/21 139/73/21 90/56/21 -f 141/74/22 140/75/22 88/40/22 -f 142/76/23 141/77/23 86/39/23 -f 143/78/24 142/79/24 84/45/24 -f 144/80/25 143/81/25 82/49/25 -f 137/82/26 144/83/26 80/47/26 -f 148/65/2 150/66/2 152/67/2 -f 73/42/19 146/68/19 145/69/19 -f 104/56/20 147/70/20 146/71/20 -f 148/72/21 147/73/21 104/56/21 -f 100/39/22 149/74/22 148/75/22 -f 98/45/23 150/76/23 149/77/23 -f 151/78/24 150/79/24 98/45/24 -f 152/80/25 151/81/25 96/49/25 -f 92/43/26 145/82/26 152/83/26 -f 156/84/2 158/85/2 160/86/2 -f 108/42/19 154/68/19 153/69/19 -f 155/70/20 154/71/20 108/42/20 -f 156/72/21 155/73/21 122/56/21 -f 118/39/22 157/74/22 156/75/22 -f 158/76/23 157/77/23 118/39/23 -f 114/49/24 159/78/24 158/79/24 -f 160/80/25 159/81/25 114/49/25 -f 153/82/26 160/83/26 112/47/26 -f 164/84/2 166/85/2 168/86/2 -f 162/68/19 161/69/19 124/43/19 -f 136/56/20 163/70/20 162/71/20 -f 164/72/21 163/73/21 136/56/21 -f 132/39/22 165/74/22 164/75/22 -f 166/76/23 165/77/23 132/39/23 -f 128/49/24 167/78/24 166/79/24 -f 168/80/25 167/81/25 128/49/25 -f 124/43/26 161/82/26 168/83/26 -f 186/87/1 185/88/1 174/89/1 -f 179/90/2 178/91/2 177/92/2 -f 170/93/18 177/92/18 178/91/18 -f 174/94/16 180/95/16 177/92/16 -f 172/96/13 178/91/13 179/90/13 -f 183/97/2 182/98/2 181/99/2 -f 185/100/16 189/101/16 192/102/16 -f 179/90/13 182/98/13 186/87/13 -f 181/99/16 185/103/16 188/104/16 -f 183/97/13 187/105/13 186/87/13 -f 184/106/17 188/107/17 187/108/17 -f 180/95/2 181/99/2 182/98/2 -f 187/109/13 191/110/13 190/111/13 -f 188/112/17 192/102/17 191/110/17 -f 186/113/18 190/114/18 189/101/18 -f 174/94/16 185/103/16 181/99/16 -f 196/63/18 195/64/18 193/60/18 -f 210/87/1 209/88/1 198/89/1 -f 203/90/2 202/91/2 201/92/2 -f 194/93/18 201/92/18 202/91/18 -f 198/94/16 204/95/16 201/92/16 -f 196/96/13 202/91/13 203/90/13 -f 207/97/2 206/98/2 205/99/2 -f 209/100/16 213/101/16 216/102/16 -f 203/90/13 206/98/13 210/87/13 -f 205/99/16 209/103/16 212/104/16 -f 207/97/13 211/105/13 210/87/13 -f 208/106/17 212/107/17 211/108/17 -f 204/95/2 205/99/2 206/98/2 -f 211/109/13 215/110/13 214/111/13 -f 212/112/17 216/102/17 215/110/17 -f 210/113/18 214/114/18 213/101/18 -f 198/94/16 209/103/16 205/99/16 -f 224/52/13 223/53/13 219/54/13 -f 222/62/17 221/61/17 223/53/17 -f 218/59/16 217/60/16 221/61/16 -f 220/63/18 219/64/18 217/60/18 -f 234/87/1 233/88/1 222/89/1 -f 227/90/2 226/91/2 225/92/2 -f 218/93/18 225/92/18 226/91/18 -f 222/94/16 228/95/16 225/92/16 -f 220/96/13 226/91/13 227/90/13 -f 231/97/2 230/98/2 229/99/2 -f 233/100/16 237/101/16 240/102/16 -f 227/90/13 230/98/13 234/87/13 -f 229/99/16 233/103/16 236/104/16 -f 231/97/13 235/105/13 234/87/13 -f 232/106/17 236/107/17 235/108/17 -f 228/95/2 229/99/2 230/98/2 -f 235/109/13 239/110/13 238/111/13 -f 236/112/17 240/102/17 239/110/17 -f 234/113/18 238/114/18 237/101/18 -f 222/94/16 233/103/16 229/99/16 -f 248/52/13 247/53/13 243/54/13 -f 246/62/17 245/61/17 247/53/17 -f 242/59/16 241/60/16 245/61/16 -f 244/63/18 243/64/18 241/60/18 -f 258/87/1 257/88/1 246/89/1 -f 251/90/2 250/91/2 249/92/2 -f 242/93/18 249/92/18 250/91/18 -f 246/94/16 252/95/16 249/92/16 -f 244/96/13 250/91/13 251/90/13 -f 255/97/2 254/98/2 253/99/2 -f 257/110/16 261/109/16 264/112/16 -f 251/90/13 254/98/13 258/87/13 -f 253/99/16 257/103/16 260/104/16 -f 255/97/13 259/105/13 258/87/13 -f 256/106/17 260/107/17 259/108/17 -f 252/95/2 253/99/2 254/98/2 -f 259/101/13 263/100/13 262/113/13 -f 260/102/17 264/112/17 263/100/17 -f 258/111/18 262/115/18 261/109/18 -f 246/94/16 257/103/16 253/99/16 -f 1/116/1 3/1/1 5/3/1 -f 6/117/2 8/4/2 2/6/2 -f 52/10/3 49/7/3 58/9/3 -f 51/26/3 52/10/3 59/11/3 -f 51/26/3 59/11/3 50/13/3 -f 17/34/4 18/14/4 19/16/4 -f 3/24/5 27/17/5 7/19/5 -f 8/23/5 32/20/5 4/22/5 -f 1/24/3 35/17/3 3/19/3 -f 4/23/3 40/20/3 2/22/3 -f 5/24/4 29/17/4 1/19/4 -f 2/23/4 26/20/4 6/22/4 -f 7/24/6 37/17/6 5/19/6 -f 6/23/6 34/20/6 8/22/6 -f 34/20/6 6/23/6 33/18/6 -f 30/21/4 29/17/4 6/22/4 -f 26/20/4 2/23/4 25/18/4 -f 36/21/3 35/17/3 2/22/3 -f 40/20/3 4/23/3 39/18/3 -f 28/21/5 27/17/5 4/22/5 -f 32/20/5 8/23/5 31/18/5 -f 38/21/6 37/17/6 8/22/6 -f 32/118/1 42/13/1 28/25/1 -f 31/119/3 43/26/3 32/27/3 -f 27/120/2 44/10/2 31/28/2 -f 28/121/6 41/7/6 27/29/6 -f 26/118/1 46/13/1 30/25/1 -f 25/119/6 47/26/6 26/27/6 -f 29/120/2 48/10/2 25/28/2 -f 30/121/3 45/7/3 29/29/3 -f 40/118/1 50/13/1 36/25/1 -f 39/119/4 51/26/4 40/27/4 -f 35/120/2 52/10/2 39/28/2 -f 36/121/5 49/7/5 35/29/5 -f 34/118/1 54/13/1 38/25/1 -f 33/119/5 55/26/5 34/27/5 -f 37/120/2 56/10/2 33/28/2 -f 38/121/4 53/7/4 37/29/4 -f 46/13/4 47/26/4 68/12/4 -f 9/34/4 58/30/4 10/14/4 -f 11/16/1 59/32/1 9/34/1 -f 12/15/5 60/35/5 11/16/5 -f 10/14/2 57/37/2 12/15/2 -f 45/7/4 46/13/4 65/8/4 -f 15/34/5 62/30/5 16/14/5 -f 13/16/1 63/32/1 15/34/1 -f 14/15/4 64/35/4 13/16/4 -f 16/14/2 61/37/2 14/15/2 -f 45/7/4 65/8/4 48/10/4 -f 17/34/6 66/30/6 18/14/6 -f 19/16/1 67/32/1 17/34/1 -f 20/15/3 68/35/3 19/16/3 -f 18/14/2 65/37/2 20/15/2 -f 48/10/4 66/9/4 47/26/4 -f 23/34/3 70/30/3 24/14/3 -f 21/16/1 71/32/1 23/34/1 -f 22/15/6 72/35/6 21/16/6 -f 24/14/2 69/37/2 22/15/2 -f 50/13/3 60/12/3 49/7/3 -f 42/13/5 43/26/5 72/12/5 -f 44/10/5 70/9/5 43/26/5 -f 41/7/5 69/8/5 44/10/5 -f 41/7/5 42/13/5 69/8/5 -f 55/26/6 63/11/6 54/13/6 -f 55/26/6 56/10/6 63/11/6 -f 56/10/6 53/7/6 62/9/6 -f 54/13/6 64/12/6 53/7/6 -f 9/34/3 10/14/3 11/16/3 -f 23/34/5 24/14/5 21/16/5 -f 15/34/6 16/14/6 13/16/6 -f 99/46/7 100/39/7 101/41/7 -f 75/58/8 76/42/8 77/44/8 -f 97/50/9 98/45/9 99/46/9 -f 77/44/10 78/43/10 79/48/10 -f 95/51/11 96/49/11 97/50/11 -f 79/48/12 80/47/12 81/51/12 -f 196/122/13 200/52/13 195/54/13 -f 93/48/12 94/47/12 95/51/12 -f 81/51/11 82/49/11 83/50/11 -f 101/123/14 102/55/14 103/57/14 -f 91/44/10 92/43/10 93/48/10 -f 83/50/9 84/45/9 85/46/9 -f 103/57/15 104/56/15 74/58/15 -f 74/58/8 73/42/8 91/44/8 -f 85/46/7 86/39/7 87/41/7 -f 174/62/16 170/59/16 173/61/16 -f 89/57/15 90/56/15 75/58/15 -f 87/123/14 88/55/14 89/57/14 -f 176/52/17 174/62/17 175/53/17 -f 200/52/17 198/62/17 199/53/17 -f 131/46/7 132/39/7 133/41/7 -f 107/58/8 108/42/8 109/44/8 -f 129/50/9 130/45/9 131/46/9 -f 109/44/10 110/43/10 111/48/10 -f 127/51/11 128/49/11 129/50/11 -f 111/48/12 112/47/12 113/51/12 -f 198/62/16 194/59/16 197/61/16 -f 125/48/12 126/47/12 127/51/12 -f 113/51/11 114/49/11 115/50/11 -f 133/123/14 134/55/14 135/57/14 -f 123/44/10 124/43/10 125/48/10 -f 115/50/9 116/45/9 117/46/9 -f 135/57/15 136/56/15 106/58/15 -f 106/58/8 105/42/8 123/44/8 -f 117/46/7 118/39/7 119/41/7 -f 172/122/13 176/52/13 171/54/13 -f 121/57/15 122/56/15 107/58/15 -f 119/123/14 120/55/14 121/57/14 -f 170/59/18 172/63/18 169/60/18 -f 144/67/2 137/86/2 138/124/2 -f 138/124/2 139/125/2 140/65/2 -f 140/65/2 141/84/2 142/66/2 -f 142/66/2 143/85/2 144/67/2 -f 144/67/2 138/124/2 140/65/2 -f 78/43/19 76/42/19 137/69/19 -f 90/56/20 139/70/20 76/42/20 -f 88/55/21 140/72/21 90/56/21 -f 86/39/22 141/74/22 88/40/22 -f 84/45/23 142/76/23 86/39/23 -f 82/49/24 143/78/24 84/45/24 -f 80/47/25 144/80/25 82/49/25 -f 78/43/26 137/82/26 80/47/26 -f 152/67/2 145/86/2 146/124/2 -f 146/124/2 147/125/2 148/65/2 -f 148/65/2 149/84/2 150/66/2 -f 150/66/2 151/85/2 152/67/2 -f 152/67/2 146/124/2 148/65/2 -f 92/43/19 73/42/19 145/69/19 -f 73/42/20 104/56/20 146/71/20 -f 102/55/21 148/72/21 104/56/21 -f 102/40/22 100/39/22 148/75/22 -f 100/39/23 98/45/23 149/77/23 -f 96/49/24 151/78/24 98/45/24 -f 94/47/25 152/80/25 96/49/25 -f 94/47/26 92/43/26 152/83/26 -f 160/86/2 153/124/2 154/125/2 -f 154/125/2 155/65/2 156/84/2 -f 156/84/2 157/66/2 158/85/2 -f 158/85/2 159/67/2 160/86/2 -f 160/86/2 154/125/2 156/84/2 -f 110/43/19 108/42/19 153/69/19 -f 122/56/20 155/70/20 108/42/20 -f 120/55/21 156/72/21 122/56/21 -f 120/40/22 118/39/22 156/75/22 -f 116/45/23 158/76/23 118/39/23 -f 116/45/24 114/49/24 158/79/24 -f 112/47/25 160/80/25 114/49/25 -f 110/43/26 153/82/26 112/47/26 -f 168/86/2 161/124/2 162/125/2 -f 162/125/2 163/65/2 164/84/2 -f 164/84/2 165/66/2 166/85/2 -f 166/85/2 167/67/2 168/86/2 -f 168/86/2 162/125/2 164/84/2 -f 105/42/19 162/68/19 124/43/19 -f 105/42/20 136/56/20 162/71/20 -f 134/55/21 164/72/21 136/56/21 -f 134/40/22 132/39/22 164/75/22 -f 130/45/23 166/76/23 132/39/23 -f 130/45/24 128/49/24 166/79/24 -f 126/47/25 168/80/25 128/49/25 -f 126/47/26 124/43/26 168/83/26 -f 176/126/1 186/87/1 174/89/1 -f 180/95/2 179/90/2 177/92/2 -f 172/127/18 170/93/18 178/91/18 -f 170/128/16 174/94/16 177/92/16 -f 176/126/13 172/96/13 179/90/13 -f 184/106/2 183/97/2 181/99/2 -f 188/112/16 185/100/16 192/102/16 -f 176/126/13 179/90/13 186/87/13 -f 184/106/16 181/99/16 188/104/16 -f 182/98/13 183/97/13 186/87/13 -f 183/97/17 184/106/17 187/108/17 -f 179/90/2 180/95/2 182/98/2 -f 186/115/13 187/109/13 190/111/13 -f 187/109/17 188/112/17 191/110/17 -f 185/100/18 186/113/18 189/101/18 -f 180/95/16 174/94/16 181/99/16 -f 194/59/18 196/63/18 193/60/18 -f 200/126/1 210/87/1 198/89/1 -f 204/95/2 203/90/2 201/92/2 -f 196/127/18 194/93/18 202/91/18 -f 194/128/16 198/94/16 201/92/16 -f 200/126/13 196/96/13 203/90/13 -f 208/106/2 207/97/2 205/99/2 -f 212/112/16 209/100/16 216/102/16 -f 200/126/13 203/90/13 210/87/13 -f 208/106/16 205/99/16 212/104/16 -f 206/98/13 207/97/13 210/87/13 -f 207/97/17 208/106/17 211/108/17 -f 203/90/2 204/95/2 206/98/2 -f 210/115/13 211/109/13 214/111/13 -f 211/109/17 212/112/17 215/110/17 -f 209/100/18 210/113/18 213/101/18 -f 204/95/16 198/94/16 205/99/16 -f 220/122/13 224/52/13 219/54/13 -f 224/52/17 222/62/17 223/53/17 -f 222/62/16 218/59/16 221/61/16 -f 218/59/18 220/63/18 217/60/18 -f 224/126/1 234/87/1 222/89/1 -f 228/95/2 227/90/2 225/92/2 -f 220/127/18 218/93/18 226/91/18 -f 218/128/16 222/94/16 225/92/16 -f 224/126/13 220/96/13 227/90/13 -f 232/106/2 231/97/2 229/99/2 -f 236/112/16 233/100/16 240/102/16 -f 224/126/13 227/90/13 234/87/13 -f 232/106/16 229/99/16 236/104/16 -f 230/98/13 231/97/13 234/87/13 -f 231/97/17 232/106/17 235/108/17 -f 227/90/2 228/95/2 230/98/2 -f 234/115/13 235/109/13 238/111/13 -f 235/109/17 236/112/17 239/110/17 -f 233/100/18 234/113/18 237/101/18 -f 228/95/16 222/94/16 229/99/16 -f 244/122/13 248/52/13 243/54/13 -f 248/52/17 246/62/17 247/53/17 -f 246/62/16 242/59/16 245/61/16 -f 242/59/18 244/63/18 241/60/18 -f 248/126/1 258/87/1 246/89/1 -f 252/95/2 251/90/2 249/92/2 -f 244/127/18 242/93/18 250/91/18 -f 242/128/16 246/94/16 249/92/16 -f 248/126/13 244/96/13 251/90/13 -f 256/106/2 255/97/2 253/99/2 -f 260/102/16 257/110/16 264/112/16 -f 248/126/13 251/90/13 258/87/13 -f 256/106/16 253/99/16 260/104/16 -f 254/98/13 255/97/13 258/87/13 -f 255/97/17 256/106/17 259/108/17 -f 251/90/2 252/95/2 254/98/2 -f 258/114/13 259/101/13 262/113/13 -f 259/101/17 260/102/17 263/100/17 -f 257/110/18 258/111/18 261/109/18 -f 252/95/16 246/94/16 253/99/16 diff --git a/src/main/resources/assets/hbm/models/machines/boiler.obj b/src/main/resources/assets/hbm/models/machines/boiler.obj new file mode 100644 index 000000000..352e0ce4d --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/boiler.obj @@ -0,0 +1,2080 @@ +# Blender v2.79 (sub 0) OBJ File: 'boiler.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v -1.500000 0.250000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 0.000000 0.250000 -1.375000 +v -0.526190 0.250000 -1.270334 +v -0.972272 0.250000 -0.972272 +v -1.270334 0.250000 -0.526190 +v -1.375000 0.250000 0.000000 +v -1.270334 0.250000 0.526190 +v -0.972272 0.250000 0.972272 +v -0.526190 0.250000 1.270334 +v -0.000000 0.250000 1.375000 +v 0.526189 0.250000 1.270334 +v 0.972272 0.250000 0.972272 +v 1.270334 0.250000 0.526190 +v 1.375000 0.250000 -0.000000 +v 1.270334 0.250000 -0.526190 +v 0.972272 0.250000 -0.972272 +v 0.526189 0.250000 -1.270335 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 3.000000 -1.375000 +v -0.526190 3.000000 -1.270334 +v -0.972272 3.000000 -0.972272 +v -1.270334 3.000000 -0.526190 +v -1.375000 3.000000 0.000000 +v -1.270334 3.000000 0.526190 +v -0.972272 3.000000 0.972272 +v -0.526190 3.000000 1.270334 +v -0.000000 3.000000 1.375000 +v 0.526189 3.000000 1.270334 +v 0.972272 3.000000 0.972272 +v 1.270334 3.000000 0.526190 +v 1.375000 3.000000 -0.000000 +v 1.270334 3.000000 -0.526190 +v 0.972272 3.000000 -0.972272 +v 0.526189 3.000000 -1.270335 +v 0.000000 3.250000 -1.375000 +v -0.526190 3.250000 -1.270334 +v -0.972272 3.250000 -0.972272 +v -1.270334 3.250000 -0.526190 +v -1.375000 3.250000 0.000000 +v -1.270334 3.250000 0.526190 +v -0.972272 3.250000 0.972272 +v -0.526190 3.250000 1.270334 +v -0.000000 3.250000 1.375000 +v 0.526189 3.250000 1.270334 +v 0.972272 3.250000 0.972272 +v 1.270334 3.250000 0.526190 +v 1.375000 3.250000 -0.000000 +v 1.270334 3.250000 -0.526190 +v 0.972272 3.250000 -0.972272 +v 0.526189 3.250000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.000000 3.000000 -1.250000 +v -0.478354 3.000000 -1.154849 +v -0.883883 3.000000 -0.883883 +v -1.154849 3.000000 -0.478354 +v -1.250000 3.000000 0.000000 +v -1.154849 3.000000 0.478354 +v -0.883883 3.000000 0.883883 +v -0.478354 3.000000 1.154849 +v -0.000000 3.000000 1.250000 +v 0.478354 3.000000 1.154850 +v 0.883883 3.000000 0.883884 +v 1.154849 3.000000 0.478354 +v 1.250000 3.000000 -0.000000 +v 1.154849 3.000000 -0.478355 +v 0.883883 3.000000 -0.883884 +v 0.478354 3.000000 -1.154850 +v -0.000000 3.500000 -1.082532 +v -0.000000 3.250000 -1.250000 +v 0.239177 3.683013 -0.577425 +v 0.414267 3.500000 -1.000129 +v 0.478354 3.250000 -1.154849 +v 0.441941 3.683013 -0.441942 +v 0.765465 3.500000 -0.765465 +v 0.883883 3.250000 -0.883883 +v 0.577424 3.683013 -0.239177 +v 1.000129 3.500000 -0.414267 +v 1.154849 3.250000 -0.478354 +v 0.625000 3.683013 -0.000000 +v 1.082531 3.500000 0.000000 +v 1.250000 3.250000 0.000000 +v 0.577424 3.683013 0.239177 +v 1.000129 3.500000 0.414267 +v 1.154849 3.250000 0.478354 +v 0.441941 3.683013 0.441941 +v 0.765465 3.500000 0.765465 +v 0.883883 3.250000 0.883883 +v 0.239177 3.683013 0.577424 +v 0.414266 3.500000 1.000129 +v 0.478354 3.250000 1.154849 +v -0.000000 3.683013 0.625000 +v -0.000000 3.500000 1.082531 +v -0.000001 3.250000 1.250000 +v -0.239177 3.683013 0.577424 +v -0.414267 3.500000 1.000128 +v -0.478355 3.250000 1.154849 +v -0.441942 3.683013 0.441941 +v -0.765466 3.500000 0.765465 +v -0.883884 3.250000 0.883883 +v -0.577425 3.683013 0.239177 +v -1.000129 3.500000 0.414266 +v -1.154849 3.250000 0.478354 +v -0.625000 3.683013 -0.000000 +v -1.082531 3.500000 -0.000001 +v -1.250000 3.250000 -0.000001 +v -0.577424 3.683013 -0.239177 +v -1.000129 3.500000 -0.414267 +v -1.154849 3.250000 -0.478355 +v -0.441941 3.683013 -0.441942 +v -0.765465 3.500000 -0.765466 +v -0.883883 3.250000 -0.883884 +v -0.239177 3.683013 -0.577425 +v -0.414266 3.500000 -1.000129 +v -0.478354 3.250000 -1.154849 +v -0.000000 3.750000 0.000000 +v 0.000000 3.683013 -0.625000 +v 0.265165 1.390165 -1.125000 +v 0.375000 1.125000 -1.125000 +v 0.265165 0.859835 -1.125000 +v -0.000000 0.750000 -1.125000 +v -0.265165 0.859835 -1.125000 +v -0.375000 1.125000 -1.125000 +v -0.000000 1.500000 -1.125000 +v -0.265165 1.390165 -1.125000 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v -1.500000 0.750000 0.250000 +v -1.500000 0.250000 0.250000 +v -1.500000 0.750000 -0.250000 +v -1.500000 0.250000 -0.250000 +v -1.187500 0.750000 -0.250000 +v -1.187500 0.750000 0.250000 +v -1.187500 0.250000 0.250000 +v -1.187500 0.250000 -0.250000 +v 1.500000 0.750000 -0.250000 +v 1.500000 0.250000 -0.250000 +v 1.500000 0.750000 0.250000 +v 1.500000 0.250000 0.250000 +v 1.187500 0.750000 0.250000 +v 1.187500 0.750000 -0.250000 +v 1.187500 0.250000 -0.250000 +v 1.187500 0.250000 0.250000 +v -0.250000 4.000000 0.250000 +v 0.250000 4.000000 0.250000 +v -0.250000 4.000000 -0.250000 +v 0.250000 4.000000 -0.250000 +v -0.250000 3.687500 0.250000 +v 0.250000 3.687500 0.250000 +v -0.250000 3.687500 -0.250000 +v 0.250000 3.687500 -0.250000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -0.126841 3.749999 0.126839 +v -0.064340 3.786610 0.189339 +v -0.126841 3.999999 0.126839 +v -0.064340 3.963387 0.189339 +v -0.038452 3.874999 0.215228 +v -0.215229 3.874999 0.038451 +v -0.189341 3.786610 0.064339 +v -0.189341 3.963387 0.064339 +v -1.275888 0.375000 1.275889 +v -1.187500 0.375000 1.312500 +v -1.099111 0.375000 1.275889 +v -1.062500 0.375000 1.187500 +v -1.099111 0.375000 1.099112 +v -1.187500 0.375000 1.062500 +v -1.275888 0.375000 1.099112 +v -1.312500 0.375000 1.187500 +v 1.073224 3.963388 0.948223 +v 1.099112 3.875000 0.922335 +v 1.073224 3.786611 0.948223 +v 1.010723 3.750000 1.010723 +v 0.948223 3.786611 1.073223 +v 0.922335 3.875000 1.099112 +v 0.948223 3.963388 1.073223 +v 1.010723 4.000000 1.010723 +v 1.242418 3.864276 1.117417 +v 1.224112 3.801776 1.047335 +v 1.154029 3.739276 1.029029 +v 1.073223 3.713388 1.073223 +v 1.029029 3.739276 1.154029 +v 1.047335 3.801776 1.224112 +v 1.117418 3.864276 1.242417 +v 1.198223 3.890164 1.198223 +v 1.187500 3.625000 1.312500 +v 1.099112 3.625000 1.275888 +v 1.062500 3.625000 1.187500 +v 1.099112 3.625000 1.099111 +v 1.187500 3.625000 1.062500 +v 1.275889 3.625000 1.099111 +v 1.312500 3.625000 1.187500 +v 1.275889 3.625000 1.275888 +v -1.275888 3.624999 1.275889 +v -1.187500 3.624999 1.312500 +v -1.099111 3.624999 1.275889 +v -1.062500 3.624999 1.187500 +v -1.099111 3.624999 1.099112 +v -1.187500 3.624999 1.062500 +v -1.275888 3.624999 1.099112 +v -1.312500 3.624999 1.187500 +v -1.198223 3.890164 1.198223 +v -1.242417 3.864275 1.117418 +v -1.224112 3.801775 1.047335 +v -1.154029 3.739275 1.029029 +v -1.073223 3.713387 1.073223 +v -1.029029 3.739275 1.154029 +v -1.047335 3.801775 1.224112 +v -1.117417 3.864275 1.242418 +v 1.187500 0.375000 1.312500 +v 1.099112 0.375000 1.275888 +v 1.062500 0.375000 1.187500 +v 1.099112 0.375000 1.099111 +v 1.187500 0.375000 1.062500 +v 1.275889 0.375000 1.099111 +v 1.312500 0.375000 1.187500 +v 1.275889 0.375000 1.275888 +v 1.000000 0.375000 1.375000 +v 1.375000 0.375000 1.375000 +v 1.000000 0.375000 1.000000 +v 1.375000 0.375000 1.000000 +v 1.000000 0.250000 1.000000 +v 1.375000 0.250000 1.000000 +v 1.000000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v -1.010723 3.999999 1.010723 +v -1.073223 3.963387 0.948224 +v -1.099112 3.874999 0.922335 +v -1.073223 3.786610 0.948224 +v -1.010723 3.749999 1.010723 +v -0.948223 3.786610 1.073224 +v -0.922335 3.874999 1.099112 +v -0.948223 3.963387 1.073224 +v 0.064339 3.963388 0.189341 +v 0.064339 3.786611 0.189341 +v 0.038451 3.875000 0.215229 +v 0.215228 3.875000 0.038452 +v 0.189339 3.963388 0.064340 +v 0.126839 4.000000 0.126841 +v 0.189339 3.786611 0.064340 +v 0.126839 3.750000 0.126841 +v -1.073224 3.963387 -0.948223 +v -1.099112 3.874999 -0.922335 +v -1.073224 3.786611 -0.948223 +v -1.010723 3.749999 -1.010723 +v -0.948224 3.786611 -1.073223 +v -0.922335 3.874999 -1.099112 +v -0.948224 3.963387 -1.073223 +v -1.010723 3.999999 -1.010723 +v -1.242418 3.864276 -1.117417 +v -1.224112 3.801776 -1.047335 +v -1.154029 3.739276 -1.029029 +v -1.073223 3.713387 -1.073223 +v -1.029029 3.739276 -1.154029 +v -1.047335 3.801776 -1.224112 +v -1.117418 3.864276 -1.242417 +v -1.198223 3.890164 -1.198223 +v -1.187500 3.625000 -1.312500 +v -1.099112 3.625000 -1.275888 +v -1.062500 3.625000 -1.187500 +v -1.099112 3.625000 -1.099111 +v -1.187500 3.625000 -1.062500 +v -1.275889 3.625000 -1.099111 +v -1.312500 3.625000 -1.187500 +v -1.275889 3.625000 -1.275888 +v -1.187500 0.375000 -1.312500 +v -1.099112 0.375000 -1.275888 +v -1.062500 0.375000 -1.187500 +v -1.099112 0.375000 -1.099111 +v -1.187500 0.375000 -1.062500 +v -1.275889 0.375000 -1.099111 +v -1.312500 0.375000 -1.187500 +v -1.275889 0.375000 -1.275888 +v -0.064339 3.963387 -0.189341 +v -0.064339 3.786611 -0.189341 +v -0.038451 3.874999 -0.215229 +v -0.215228 3.874999 -0.038452 +v -0.189339 3.963387 -0.064340 +v -0.126839 3.999999 -0.126841 +v -0.189339 3.786611 -0.064340 +v -0.126839 3.749999 -0.126841 +v 0.126841 3.749999 -0.126839 +v 0.064340 3.786611 -0.189339 +v 0.126841 3.999999 -0.126839 +v 0.064340 3.963387 -0.189339 +v 0.038452 3.874999 -0.215228 +v 0.215229 3.874999 -0.038451 +v 0.189341 3.786611 -0.064339 +v 0.189341 3.963387 -0.064339 +v 1.375000 0.250000 -1.000000 +v 1.000000 0.250000 -1.000000 +v 1.375000 0.250000 -1.375000 +v 1.000000 0.250000 -1.375000 +v 1.375000 0.375000 -1.375000 +v 1.000000 0.375000 -1.375000 +v 1.375000 0.375000 -1.000000 +v 1.000000 0.375000 -1.000000 +v 1.275888 0.375000 -1.275889 +v 1.187500 0.375000 -1.312500 +v 1.099111 0.375000 -1.275889 +v 1.062500 0.375000 -1.187500 +v 1.099111 0.375000 -1.099112 +v 1.187500 0.375000 -1.062500 +v 1.275888 0.375000 -1.099112 +v 1.312500 0.375000 -1.187500 +v 1.275888 3.625000 -1.275889 +v 1.187500 3.625000 -1.312500 +v 1.099111 3.625000 -1.275889 +v 1.062500 3.625000 -1.187500 +v 1.099111 3.625000 -1.099112 +v 1.187500 3.625000 -1.062500 +v 1.275888 3.625000 -1.099112 +v 1.312500 3.625000 -1.187500 +v 1.198223 3.890164 -1.198223 +v 1.242417 3.864276 -1.117418 +v 1.224112 3.801776 -1.047335 +v 1.154029 3.739276 -1.029029 +v 1.073223 3.713387 -1.073223 +v 1.029029 3.739276 -1.154029 +v 1.047335 3.801776 -1.224112 +v 1.117417 3.864276 -1.242418 +v 1.010723 3.999999 -1.010723 +v 1.073223 3.963387 -0.948224 +v 1.099112 3.874999 -0.922335 +v 1.073223 3.786611 -0.948224 +v 1.010723 3.749999 -1.010723 +v 0.948223 3.786611 -1.073224 +v 0.922335 3.874999 -1.099112 +v 0.948223 3.963387 -1.073224 +v -1.375000 0.375000 1.375000 +v -1.000000 0.375000 1.375000 +v -1.375000 0.375000 1.000000 +v -1.000000 0.375000 1.000000 +v -1.375000 0.250000 1.000000 +v -1.000000 0.250000 1.000000 +v -1.375000 0.250000 1.375000 +v -1.000000 0.250000 1.375000 +v -1.000000 0.250000 -1.000000 +v -1.375000 0.250000 -1.000000 +v -1.000000 0.250000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.000000 0.375000 -1.375000 +v -1.375000 0.375000 -1.375000 +v -1.000000 0.375000 -1.000000 +v -1.375000 0.375000 -1.000000 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 3.000000 -1.375000 +v -0.526190 3.000000 -1.270334 +v -0.972272 3.000000 -0.972272 +v -1.270334 3.000000 -0.526190 +v -1.375000 3.000000 0.000000 +v -1.270334 3.000000 0.526190 +v -0.972272 3.000000 0.972272 +v -0.526190 3.000000 1.270334 +v -0.000000 3.000000 1.375000 +v 0.526189 3.000000 1.270334 +v 0.972272 3.000000 0.972272 +v 1.270334 3.000000 0.526190 +v 1.375000 3.000000 -0.000000 +v 1.270334 3.000000 -0.526190 +v 0.972272 3.000000 -0.972272 +v 0.526189 3.000000 -1.270335 +v 0.000000 3.250000 -1.375000 +v -0.526190 3.250000 -1.270334 +v -0.972272 3.250000 -0.972272 +v -1.270334 3.250000 -0.526190 +v -1.375000 3.250000 0.000000 +v -1.270334 3.250000 0.526190 +v -0.972272 3.250000 0.972272 +v -0.526190 3.250000 1.270334 +v -0.000000 3.250000 1.375000 +v 0.526189 3.250000 1.270334 +v 0.972272 3.250000 0.972272 +v 1.270334 3.250000 0.526190 +v 1.375000 3.250000 -0.000000 +v 1.270334 3.250000 -0.526190 +v 0.972272 3.250000 -0.972272 +v 0.526189 3.250000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.000000 3.000000 -1.250000 +v -0.478354 3.000000 -1.154849 +v -0.883883 3.000000 -0.883883 +v -1.154849 3.000000 -0.478354 +v -1.250000 3.000000 0.000000 +v -1.154849 3.000000 0.478354 +v -0.883883 3.000000 0.883883 +v -0.478354 3.000000 1.154849 +v -0.000000 3.000000 1.250000 +v 0.478354 3.000000 1.154850 +v 0.883883 3.000000 0.883884 +v 1.154849 3.000000 0.478354 +v 1.250000 3.000000 -0.000000 +v 1.154849 3.000000 -0.478355 +v 0.883883 3.000000 -0.883884 +v 0.478354 3.000000 -1.154850 +v -0.000000 3.250000 -1.250000 +v 0.478354 3.250000 -1.154849 +v 0.883883 3.250000 -0.883883 +v 1.154849 3.250000 -0.478354 +v 1.250000 3.250000 0.000000 +v 1.154849 3.250000 0.478354 +v 0.883883 3.250000 0.883883 +v 0.478354 3.250000 1.154849 +v -0.000001 3.250000 1.250000 +v -0.478355 3.250000 1.154849 +v -0.883884 3.250000 0.883883 +v -1.154849 3.250000 0.478354 +v -1.250000 3.250000 -0.000001 +v -1.154849 3.250000 -0.478355 +v -0.883883 3.250000 -0.883884 +v -0.478354 3.250000 -1.154849 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v 0.265165 1.390165 1.125000 +v 0.000000 1.500000 1.125000 +v 0.375000 1.125000 1.125000 +v 0.265165 0.859835 1.125000 +v 0.000000 0.750000 1.125000 +v -0.265165 0.859835 1.125000 +v -0.375000 1.125000 1.125000 +v -0.265165 1.390165 1.125000 +vt 0.000000 0.000000 +vt 0.081633 0.320000 +vt 0.000000 0.480000 +vt 0.244898 0.520000 +vt 0.000000 1.000000 +vt 0.000000 0.520000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.244898 0.480000 +vt -0.000000 0.520000 +vt -0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.964286 0.250000 +vt 0.923469 0.330000 +vt 0.923469 0.250000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.964286 0.330000 +vt 0.923469 0.380000 +vt 0.964286 0.200000 +vt 0.989796 0.330000 +vt 0.897959 0.250000 +vt 1.000000 0.180000 +vt 0.994898 0.020000 +vt 1.000000 0.020000 +vt 0.244898 0.000000 +vt 0.081633 0.160000 +vt 0.163265 0.160000 +vt 0.163265 0.320000 +vt 0.989796 0.010000 +vt 0.913265 0.020000 +vt 0.908163 0.010000 +vt 0.897959 0.020000 +vt 0.903061 0.180000 +vt 0.897959 0.180000 +vt 0.989796 0.000000 +vt 0.908163 0.000000 +vt 0.908163 0.200000 +vt 0.989796 0.190000 +vt 0.989796 0.200000 +vt 0.989796 0.170000 +vt 0.984694 0.030000 +vt 0.989796 0.030000 +vt 0.908163 0.190000 +vt 0.984694 0.180000 +vt 0.994898 0.180000 +vt 0.903061 0.020000 +vt 0.908163 0.170000 +vt 0.913265 0.030000 +vt 0.984694 0.170000 +vt 0.913265 0.170000 +vt 0.908163 0.030000 +vt 0.984694 0.020000 +vt 0.913265 0.180000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.693878 0.040000 +vt 0.653061 0.060000 +vt 0.653061 0.040000 +vt 0.734694 0.040000 +vt 0.693878 0.060000 +vt 0.775510 0.060000 +vt 0.734694 0.060000 +vt 0.816327 0.040000 +vt 0.775510 0.040000 +vt 0.857143 0.040000 +vt 0.816327 0.060000 +vt 0.897959 0.040000 +vt 0.857143 0.060000 +vt 0.285714 0.040000 +vt 0.244898 0.060000 +vt 0.244898 0.040000 +vt 0.326531 0.040000 +vt 0.285714 0.060000 +vt 0.367347 0.040000 +vt 0.326531 0.060000 +vt 0.408163 0.060000 +vt 0.367347 0.060000 +vt 0.448980 0.040000 +vt 0.408163 0.040000 +vt 0.489796 0.040000 +vt 0.448980 0.060000 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.530612 0.040000 +vt 0.571429 0.060000 +vt 0.612245 0.040000 +vt 0.571429 0.040000 +vt 0.612245 0.060000 +vt 0.693878 0.460000 +vt 0.734694 0.480000 +vt 0.693878 0.480000 +vt 0.775510 0.460000 +vt 0.775510 0.480000 +vt 0.816327 0.480000 +vt 0.816327 0.460000 +vt 0.857143 0.480000 +vt 0.857143 0.460000 +vt 0.897959 0.480000 +vt 0.244898 0.460000 +vt 0.285714 0.480000 +vt 0.244898 0.480000 +vt 0.326531 0.460000 +vt 0.326531 0.480000 +vt 0.367347 0.460000 +vt 0.367347 0.480000 +vt 0.408163 0.460000 +vt 0.408163 0.480000 +vt 0.448980 0.480000 +vt 0.448980 0.460000 +vt 0.489796 0.480000 +vt 0.530612 0.460000 +vt 0.530612 0.480000 +vt 0.571429 0.460000 +vt 0.571429 0.480000 +vt 0.612245 0.480000 +vt 0.653061 0.460000 +vt 0.653061 0.480000 +vt 0.408163 0.540000 +vt 0.367347 0.520000 +vt 0.408163 0.520000 +vt 0.448980 0.540000 +vt 0.448980 0.520000 +vt 0.897959 0.540000 +vt 0.857143 0.520000 +vt 0.897959 0.520000 +vt 0.285714 0.520000 +vt 0.326531 0.540000 +vt 0.285714 0.540000 +vt 0.775510 0.520000 +vt 0.816327 0.540000 +vt 0.775510 0.540000 +vt 0.326531 0.520000 +vt 0.367347 0.540000 +vt 0.244898 0.520000 +vt 0.244898 0.540000 +vt 0.612245 0.520000 +vt 0.653061 0.540000 +vt 0.612245 0.540000 +vt 0.734694 0.520000 +vt 0.693878 0.540000 +vt 0.693878 0.520000 +vt 0.857143 0.540000 +vt 0.816327 0.520000 +vt 0.571429 0.540000 +vt 0.530612 0.520000 +vt 0.571429 0.520000 +vt 0.734694 0.540000 +vt 0.653061 0.520000 +vt 0.489796 0.540000 +vt 0.489796 0.520000 +vt 0.530612 0.540000 +vt 0.244898 1.000000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.964286 0.380000 +vt 0.923469 0.200000 +vt 0.989796 0.250000 +vt 0.897959 0.330000 +vt 0.897959 0.060000 +vt 0.734694 0.460000 +vt 0.897959 0.460000 +vt 0.285714 0.460000 +vt 0.489796 0.460000 +vt 0.612245 0.460000 +vt 0.326531 -0.000000 +vt 0.285714 0.040000 +vt 0.285714 0.000000 +vt 0.653061 0.000000 +vt 0.612245 0.040000 +vt 0.612245 -0.000000 +vt 0.367347 0.000000 +vt 0.326531 0.040000 +vt 0.693878 0.000000 +vt 0.653061 0.040000 +vt 0.408163 0.000000 +vt 0.367347 0.040000 +vt 0.734694 0.000000 +vt 0.693878 0.040000 +vt 0.448980 0.000000 +vt 0.408163 0.040000 +vt 0.775510 0.000000 +vt 0.734694 0.040000 +vt 0.489796 0.000000 +vt 0.448980 0.040000 +vt 0.816327 0.000000 +vt 0.775510 0.040000 +vt 0.530612 -0.000000 +vt 0.489796 0.040000 +vt 0.857143 -0.000000 +vt 0.816327 0.040000 +vt 0.571429 -0.000000 +vt 0.530612 0.040000 +vt 0.244898 0.040000 +vt 0.244898 0.000000 +vt 0.897959 0.000000 +vt 0.857143 0.040000 +vt 0.571429 0.040000 +vt 0.326531 0.480000 +vt 0.285714 0.520000 +vt 0.285714 0.480000 +vt 0.653061 0.480000 +vt 0.612245 0.520000 +vt 0.612245 0.480000 +vt 0.367347 0.480000 +vt 0.326531 0.520000 +vt 0.693878 0.480000 +vt 0.653061 0.520000 +vt 0.408163 0.480000 +vt 0.367347 0.520000 +vt 0.734694 0.480000 +vt 0.693878 0.520000 +vt 0.448980 0.480000 +vt 0.408163 0.520000 +vt 0.775510 0.480000 +vt 0.734694 0.520000 +vt 0.489796 0.480000 +vt 0.448980 0.520000 +vt 0.816327 0.480000 +vt 0.775510 0.520000 +vt 0.530612 0.480000 +vt 0.489796 0.520000 +vt 0.857143 0.480000 +vt 0.816327 0.520000 +vt 0.571429 0.480000 +vt 0.530612 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.480000 +vt 0.897959 0.480000 +vt 0.857143 0.520000 +vt 0.571429 0.520000 +vt 0.653061 0.060000 +vt 0.612245 0.460000 +vt 0.612245 0.060000 +vt 0.367347 0.060000 +vt 0.326531 0.460000 +vt 0.326531 0.060000 +vt 0.693878 0.060000 +vt 0.653061 0.460000 +vt 0.408163 0.060000 +vt 0.367347 0.460000 +vt 0.734694 0.060000 +vt 0.693878 0.460000 +vt 0.448980 0.060000 +vt 0.408163 0.460000 +vt 0.775510 0.060000 +vt 0.734694 0.460000 +vt 0.489796 0.060000 +vt 0.448980 0.460000 +vt 0.816327 0.060000 +vt 0.775510 0.460000 +vt 0.530612 0.060000 +vt 0.489796 0.460000 +vt 0.857143 0.060000 +vt 0.816327 0.460000 +vt 0.571429 0.060000 +vt 0.530612 0.460000 +vt 0.285714 0.060000 +vt 0.244898 0.460000 +vt 0.244898 0.060000 +vt 0.897959 0.060000 +vt 0.857143 0.460000 +vt 0.571429 0.460000 +vt 0.285714 0.460000 +vt 0.897959 0.590000 +vt 0.857143 0.540000 +vt 0.897959 0.540000 +vt 0.887755 0.670000 +vt 0.877551 0.770000 +vt 0.867347 0.670000 +vt 0.857143 0.590000 +vt 0.816327 0.540000 +vt 0.846939 0.670000 +vt 0.836735 0.770000 +vt 0.826531 0.670000 +vt 0.816327 0.590000 +vt 0.806122 0.670000 +vt 0.795918 0.770000 +vt 0.785714 0.670000 +vt 0.775510 0.590000 +vt 0.775510 0.540000 +vt 0.765306 0.670000 +vt 0.734694 0.590000 +vt 0.734694 0.540000 +vt 0.755102 0.770000 +vt 0.744898 0.670000 +vt 0.704082 0.670000 +vt 0.693878 0.590000 +vt 0.693878 0.540000 +vt 0.724490 0.670000 +vt 0.714286 0.770000 +vt 0.683673 0.670000 +vt 0.653061 0.590000 +vt 0.653061 0.540000 +vt 0.673469 0.770000 +vt 0.663265 0.670000 +vt 0.642857 0.670000 +vt 0.612245 0.590000 +vt 0.612245 0.540000 +vt 0.632653 0.770000 +vt 0.622449 0.670000 +vt 0.602041 0.670000 +vt 0.571429 0.590000 +vt 0.571429 0.540000 +vt 0.591837 0.770000 +vt 0.581633 0.670000 +vt 0.530612 0.590000 +vt 0.530612 0.540000 +vt 0.561224 0.670000 +vt 0.551020 0.770000 +vt 0.540816 0.670000 +vt 0.489796 0.590000 +vt 0.489796 0.540000 +vt 0.520408 0.670000 +vt 0.510204 0.770000 +vt 0.500000 0.670000 +vt 0.448980 0.590000 +vt 0.448980 0.540000 +vt 0.479592 0.670000 +vt 0.469388 0.770000 +vt 0.459184 0.670000 +vt 0.408163 0.590000 +vt 0.408163 0.540000 +vt 0.438776 0.670000 +vt 0.428571 0.770000 +vt 0.418367 0.670000 +vt 0.367347 0.590000 +vt 0.367347 0.540000 +vt 0.397959 0.670000 +vt 0.387755 0.770000 +vt 0.377551 0.670000 +vt 0.357143 0.670000 +vt 0.346939 0.770000 +vt 0.336735 0.670000 +vt 0.326531 0.810000 +vt 0.346939 0.770000 +vt 0.346939 0.810000 +vt 0.306122 0.810000 +vt 0.326531 0.770000 +vt 0.326531 0.590000 +vt 0.265306 0.810000 +vt 0.285714 0.770000 +vt 0.285714 0.810000 +vt 0.326531 0.540000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.770000 +vt 0.367347 0.810000 +vt 0.295918 0.670000 +vt 0.285714 0.590000 +vt 0.306122 0.770000 +vt 0.285714 0.540000 +vt 0.316327 0.670000 +vt 0.306122 0.770000 +vt 0.244898 0.810000 +vt 0.265306 0.770000 +vt 0.387755 0.770000 +vt 0.275510 0.670000 +vt 0.244898 0.590000 +vt 0.244898 0.540000 +vt 0.265306 0.770000 +vt 0.255102 0.670000 +vt 0.326531 0.810000 +vt 0.346939 0.770000 +vt 0.346939 0.810000 +vt 0.306122 0.810000 +vt 0.326531 0.770000 +vt 0.265306 0.810000 +vt 0.285714 0.770000 +vt 0.285714 0.810000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.770000 +vt 0.367347 0.810000 +vt 0.306122 0.770000 +vt 0.244898 0.810000 +vt 0.265306 0.770000 +vt 0.387755 0.770000 +vt 0.765306 0.930000 +vt 0.867347 0.910000 +vt 0.867347 0.930000 +vt 0.459184 0.910000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.790000 +vt 0.724490 0.810000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.724490 0.850000 +vt 0.459184 0.850000 +vt 0.724490 0.870000 +vt 0.459184 0.870000 +vt 0.459184 0.890000 +vt 0.724490 0.910000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.724490 0.830000 +vt 0.724490 0.890000 +vt 0.744898 0.850000 +vt 0.765306 0.870000 +vt 0.744898 0.870000 +vt 0.760204 0.890000 +vt 0.744898 0.890000 +vt 0.755102 0.910000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.930000 +vt 0.734694 0.790000 +vt 0.744898 0.770000 +vt 0.744898 0.790000 +vt 0.744898 0.810000 +vt 0.729592 0.810000 +vt 0.724490 0.830000 +vt 0.744898 0.830000 +vt 0.744898 0.850000 +vt 0.724490 0.850000 +vt 0.744898 0.870000 +vt 0.724490 0.870000 +vt 0.729592 0.890000 +vt 0.744898 0.890000 +vt 0.744898 0.910000 +vt 0.765306 0.890000 +vt 0.867347 0.910000 +vt 0.765306 0.910000 +vt 0.765306 0.870000 +vt 0.867347 0.890000 +vt 0.765306 0.790000 +vt 0.867347 0.810000 +vt 0.765306 0.810000 +vt 0.765306 0.850000 +vt 0.867347 0.830000 +vt 0.867347 0.850000 +vt 0.867347 0.870000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.830000 +vt 0.760204 0.810000 +vt 0.755102 0.790000 +vt 0.755102 0.910000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.744898 0.790000 +vt 0.744898 0.810000 +vt 0.760204 0.810000 +vt 0.744898 0.830000 +vt 0.765306 0.830000 +vt 0.867347 0.810000 +vt 0.867347 0.830000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.790000 +vt 0.765306 0.850000 +vt 0.867347 0.870000 +vt 0.867347 0.850000 +vt 0.760204 0.890000 +vt 0.459184 0.870000 +vt 0.724490 0.890000 +vt 0.459184 0.890000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.459184 0.790000 +vt 0.724490 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.724490 0.810000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.867347 0.930000 +vt 0.765306 0.930000 +vt 0.765306 0.810000 +vt 0.765306 0.890000 +vt 0.867347 0.890000 +vt 0.765306 0.910000 +vt 0.734694 0.910000 +vt 0.729592 0.890000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.734694 0.770000 +vt 0.734694 0.930000 +vt 0.734694 0.930000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.734694 0.770000 +vt 0.744898 0.790000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.744898 0.810000 +vt 0.724490 0.830000 +vt 0.744898 0.830000 +vt 0.744898 0.850000 +vt 0.724490 0.850000 +vt 0.744898 0.870000 +vt 0.724490 0.870000 +vt 0.744898 0.890000 +vt 0.729592 0.890000 +vt 0.734694 0.910000 +vt 0.765306 0.890000 +vt 0.867347 0.910000 +vt 0.765306 0.910000 +vt 0.765306 0.870000 +vt 0.867347 0.890000 +vt 0.765306 0.790000 +vt 0.867347 0.810000 +vt 0.765306 0.810000 +vt 0.765306 0.850000 +vt 0.867347 0.830000 +vt 0.867347 0.850000 +vt 0.867347 0.870000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.830000 +vt 0.760204 0.810000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.755102 0.910000 +vt 0.459184 0.870000 +vt 0.724490 0.890000 +vt 0.459184 0.890000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.459184 0.790000 +vt 0.724490 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.724490 0.810000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.765306 0.930000 +vt 0.867347 0.930000 +vt 0.765306 0.930000 +vt 0.867347 0.910000 +vt 0.867347 0.930000 +vt 0.459184 0.910000 +vt 0.724490 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.790000 +vt 0.724490 0.810000 +vt 0.459184 0.810000 +vt 0.459184 0.830000 +vt 0.724490 0.850000 +vt 0.459184 0.850000 +vt 0.724490 0.870000 +vt 0.459184 0.870000 +vt 0.459184 0.890000 +vt 0.724490 0.910000 +vt 0.459184 0.770000 +vt 0.724490 0.790000 +vt 0.724490 0.830000 +vt 0.724490 0.890000 +vt 0.744898 0.850000 +vt 0.765306 0.870000 +vt 0.744898 0.870000 +vt 0.744898 0.890000 +vt 0.755102 0.910000 +vt 0.744898 0.910000 +vt 0.744898 0.930000 +vt 0.744898 0.770000 +vt 0.755102 0.790000 +vt 0.744898 0.790000 +vt 0.760204 0.810000 +vt 0.744898 0.810000 +vt 0.765306 0.830000 +vt 0.744898 0.830000 +vt 0.867347 0.810000 +vt 0.867347 0.830000 +vt 0.765306 0.770000 +vt 0.867347 0.790000 +vt 0.765306 0.790000 +vt 0.765306 0.850000 +vt 0.867347 0.870000 +vt 0.867347 0.850000 +vt 0.765306 0.810000 +vt 0.867347 0.890000 +vt 0.765306 0.890000 +vt 0.765306 0.910000 +vt 0.734694 0.910000 +vt 0.729592 0.890000 +vt 0.734694 0.790000 +vt 0.729592 0.810000 +vt 0.734694 0.770000 +vt 0.734694 0.930000 +vt 0.897959 0.040000 +vt 0.897959 0.520000 +vt 0.897959 0.460000 +vt 0.244898 0.770000 +vt 0.244898 0.770000 +vt 0.724490 0.770000 +vt 0.755102 0.930000 +vt 0.734694 0.770000 +vt 0.867347 0.770000 +vt 0.755102 0.770000 +vt 0.755102 0.930000 +vt 0.755102 0.770000 +vt 0.867347 0.770000 +vt 0.724490 0.770000 +vt 0.867347 0.770000 +vt 0.755102 0.770000 +vt 0.755102 0.930000 +vt 0.760204 0.890000 +vt 0.724490 0.770000 +vt 0.724490 0.770000 +vt 0.760204 0.890000 +vt 0.755102 0.930000 +vt 0.755102 0.770000 +vt 0.867347 0.770000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.0000 0.7595 -0.6505 +vn 0.3179 0.5565 -0.7676 +vn 0.0000 0.5565 -0.8308 +vn 0.0000 0.9664 -0.2571 +vn 0.0984 0.9664 -0.2376 +vn 0.2489 0.7595 -0.6009 +vn 0.5875 0.5565 -0.5875 +vn 0.1818 0.9664 -0.1818 +vn 0.4599 0.7595 -0.4599 +vn 0.2376 0.9664 -0.0984 +vn 0.6009 0.7595 -0.2489 +vn 0.7676 0.5565 -0.3179 +vn 0.6505 0.7595 0.0000 +vn 0.8308 0.5565 0.0000 +vn 0.2571 0.9664 0.0000 +vn 0.2376 0.9664 0.0984 +vn 0.6009 0.7595 0.2489 +vn 0.7676 0.5565 0.3179 +vn 0.4599 0.7595 0.4599 +vn 0.5875 0.5565 0.5875 +vn 0.1818 0.9664 0.1818 +vn 0.2489 0.7595 0.6009 +vn 0.3179 0.5565 0.7676 +vn 0.0984 0.9664 0.2376 +vn 0.0000 0.7595 0.6505 +vn 0.0000 0.5565 0.8308 +vn 0.0000 0.9664 0.2571 +vn -0.2489 0.7595 0.6009 +vn -0.3179 0.5565 0.7676 +vn -0.0984 0.9664 0.2376 +vn -0.4599 0.7595 0.4599 +vn -0.5875 0.5565 0.5875 +vn -0.1818 0.9664 0.1818 +vn -0.6009 0.7595 0.2489 +vn -0.7676 0.5565 0.3179 +vn -0.2376 0.9664 0.0984 +vn -0.6505 0.7595 0.0000 +vn -0.8308 0.5565 0.0000 +vn -0.2571 0.9664 0.0000 +vn -0.6009 0.7595 -0.2489 +vn -0.7676 0.5565 -0.3179 +vn -0.2376 0.9664 -0.0984 +vn -0.1818 0.9664 -0.1818 +vn -0.7071 0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.4599 0.7595 -0.4599 +vn 0.7071 -0.7071 0.0000 +vn -0.5875 0.5565 -0.5875 +vn -0.7071 -0.7071 0.0000 +vn -0.0984 0.9664 -0.2376 +vn -0.2489 0.7595 -0.6009 +vn -0.3179 0.5565 -0.7676 +vn 0.1448 -0.9788 -0.1448 +vn -0.5000 -0.7071 -0.5000 +vn 0.6921 -0.2048 -0.6921 +vn 0.6727 0.0196 0.7396 +vn -0.6947 0.1866 0.6947 +vn -0.9890 0.1447 0.0283 +vn -0.0372 -0.1363 -0.9900 +vn 0.9900 -0.1363 0.0372 +vn -0.0283 0.1447 0.9890 +vn -0.7396 0.0196 -0.6727 +vn -0.5000 0.7071 0.5000 +vn -0.5828 0.7194 -0.3780 +vn -0.8431 0.5293 -0.0945 +vn -0.7200 0.0473 -0.6923 +vn -0.7513 0.0670 -0.6565 +vn -0.4172 -0.6737 -0.6099 +vn -0.2090 -0.4617 -0.8620 +vn 0.5000 -0.7071 -0.5000 +vn -0.9900 -0.1363 0.0372 +vn -0.6921 -0.2048 -0.6921 +vn 0.0372 -0.1363 -0.9900 +vn 0.2090 -0.4617 -0.8620 +vn 0.7513 0.0670 -0.6565 +vn 0.7396 0.0196 -0.6727 +vn 0.9890 0.1447 0.0283 +vn 0.8431 0.5293 -0.0945 +vn 0.5000 0.7071 0.5000 +vn 0.6947 0.1866 0.6947 +vn -0.0945 0.5293 0.8431 +vn 0.0282 0.1447 0.9890 +vn -0.6727 0.0196 0.7396 +vn -0.6565 0.0670 0.7513 +vn -0.8620 -0.4617 0.2090 +vn -0.6923 0.0473 0.7200 +vn -0.5000 -0.7071 0.5000 +vn -0.6099 -0.6737 0.4172 +vn -0.3780 0.7194 0.5828 +vn 0.4172 -0.6737 -0.6099 +vn 0.7200 0.0473 -0.6923 +vn 0.1319 0.9824 0.1319 +vn 0.5000 0.7071 -0.5000 +vn -0.1448 -0.9788 -0.1448 +vn 0.5828 0.7194 -0.3780 +vn 0.6099 -0.6737 0.4172 +vn 0.8620 -0.4617 0.2090 +vn 0.6565 0.0670 0.7513 +vn 0.6923 0.0473 0.7200 +vn 0.0945 0.5293 0.8431 +vn 0.3780 0.7194 0.5828 +vn 0.5000 -0.7071 0.5000 +vn -0.1319 0.9824 0.1319 +vn -0.5000 0.7071 -0.5000 +vn 0.6921 -0.2048 0.6921 +vn 0.8620 -0.4617 -0.2090 +vn -0.2090 -0.4617 0.8620 +vn -0.0372 -0.1363 0.9900 +vn -0.7396 0.0196 0.6727 +vn -0.7513 0.0670 0.6565 +vn -0.9890 0.1447 -0.0283 +vn -0.8431 0.5293 0.0945 +vn -0.6947 0.1866 -0.6947 +vn 0.0945 0.5293 -0.8431 +vn -0.0283 0.1447 -0.9890 +vn 0.6565 0.0670 -0.7513 +vn 0.6727 0.0196 -0.7396 +vn 0.9900 -0.1363 -0.0372 +vn 0.6923 0.0473 -0.7200 +vn 0.6099 -0.6737 -0.4172 +vn 0.3780 0.7194 -0.5828 +vn -0.4172 -0.6737 0.6099 +vn -0.7200 0.0473 0.6923 +vn -0.1319 0.9824 -0.1319 +vn 0.1448 -0.9788 0.1448 +vn -0.5828 0.7194 0.3780 +vn -0.1448 -0.9788 0.1448 +vn -0.6921 -0.2048 0.6921 +vn -0.6727 0.0196 -0.7396 +vn 0.6947 0.1866 -0.6947 +vn 0.9890 0.1447 -0.0283 +vn 0.0372 -0.1363 0.9900 +vn -0.9900 -0.1363 -0.0372 +vn 0.0283 0.1447 -0.9890 +vn 0.7396 0.0196 0.6727 +vn 0.5828 0.7194 0.3780 +vn 0.8431 0.5293 0.0945 +vn 0.7513 0.0670 0.6565 +vn 0.4172 -0.6737 0.6099 +vn 0.2090 -0.4617 0.8620 +vn -0.6099 -0.6737 -0.4172 +vn -0.8620 -0.4617 -0.2090 +vn -0.6923 0.0473 -0.7200 +vn -0.6565 0.0670 -0.7513 +vn -0.3780 0.7194 -0.5828 +vn -0.0945 0.5293 -0.8431 +vn 0.1319 0.9824 -0.1319 +vn 0.7200 0.0473 0.6923 +s off +f 3/1/1 202/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/10/4 5/6/4 1/3/4 +f 4/11/5 6/12/5 2/13/5 +f 1/14/6 7/15/6 3/16/6 +f 513/17/3 507/18/3 509/19/3 +f 172/20/6 171/21/6 170/22/6 +f 180/23/5 179/24/5 178/25/5 +f 172/20/3 177/26/3 173/27/3 +f 171/21/4 175/28/4 170/22/4 +f 170/22/2 174/29/2 172/20/2 +f 180/23/4 185/30/4 181/31/4 +f 179/24/3 183/32/3 178/25/3 +f 178/25/2 182/33/2 180/23/2 +f 187/34/2 188/35/2 186/36/2 +f 194/37/4 200/38/4 198/39/4 +f 189/40/3 192/41/3 188/35/3 +f 186/36/4 191/42/4 187/34/4 +f 187/34/5 193/43/5 189/40/5 +f 188/35/6 190/44/6 186/36/6 +f 203/45/6 209/46/6 205/47/6 +f 4/48/1 204/49/1 3/1/1 +f 2/10/1 205/50/1 4/48/1 +f 1/3/1 203/51/1 2/10/1 +f 209/52/1 210/53/1 206/54/1 +f 204/55/5 207/56/5 202/57/5 +f 205/58/4 206/54/4 204/59/4 +f 202/60/3 208/61/3 203/62/3 +f 212/63/5 217/64/5 213/65/5 +f 207/66/1 212/67/1 208/61/1 +f 208/68/1 213/65/1 209/46/1 +f 206/69/1 211/70/1 207/56/1 +f 214/71/1 216/72/1 215/73/1 +f 210/74/6 215/73/6 211/70/6 +f 213/75/3 214/71/3 210/53/3 +f 211/76/4 216/72/4 212/67/4 +f 288/77/6 284/78/6 286/79/6 +f 286/80/3 285/81/3 287/82/3 +f 287/83/5 283/84/5 289/85/5 +f 289/86/4 282/87/4 288/88/4 +f 283/84/2 284/78/2 282/87/2 +f 360/89/2 359/90/2 361/91/2 +f 354/92/4 361/91/4 355/93/4 +f 356/94/5 360/89/5 354/95/5 +f 357/96/3 358/97/3 356/98/3 +f 355/99/6 359/90/6 357/100/6 +f 400/101/6 396/102/6 398/103/6 +f 398/104/3 397/105/3 399/106/3 +f 399/107/5 395/108/5 401/109/5 +f 401/110/4 394/111/4 400/112/4 +f 395/108/2 396/102/2 394/111/2 +f 408/113/2 407/114/2 409/115/2 +f 402/116/4 409/115/4 403/117/4 +f 404/118/5 408/113/5 402/119/5 +f 405/120/3 406/121/3 404/122/3 +f 403/123/6 407/114/6 405/124/6 +f 421/125/2 468/126/2 420/127/2 +f 422/128/2 469/129/2 421/125/2 +f 422/128/2 471/130/2 470/131/2 +f 424/132/2 471/130/2 423/133/2 +f 425/134/2 472/135/2 424/132/2 +f 410/136/2 473/137/2 425/134/2 +f 411/138/2 458/139/2 410/140/2 +f 412/141/2 459/142/2 411/138/2 +f 413/143/2 460/144/2 412/141/2 +f 413/143/2 462/145/2 461/146/2 +f 415/147/2 462/145/2 414/148/2 +f 416/149/2 463/150/2 415/147/2 +f 416/149/2 465/151/2 464/152/2 +f 417/153/2 466/154/2 465/151/2 +f 419/155/2 466/154/2 418/156/2 +f 419/155/2 468/126/2 467/157/2 +f 485/158/1 438/159/1 437/160/1 +f 438/159/1 487/161/1 439/162/1 +f 487/161/1 440/163/1 439/162/1 +f 488/164/1 441/165/1 440/163/1 +f 489/166/1 426/167/1 441/165/1 +f 474/168/1 427/169/1 426/170/1 +f 427/169/1 476/171/1 428/172/1 +f 428/172/1 477/173/1 429/174/1 +f 429/174/1 478/175/1 430/176/1 +f 478/175/1 431/177/1 430/176/1 +f 479/178/1 432/179/1 431/177/1 +f 432/179/1 481/180/1 433/181/1 +f 433/181/1 482/182/1 434/183/1 +f 482/182/1 435/184/1 434/183/1 +f 435/184/1 484/185/1 436/186/1 +f 484/185/1 437/160/1 436/186/1 +f 502/187/2 445/188/2 446/189/2 +f 501/190/2 446/189/2 447/191/2 +f 490/192/2 457/193/2 442/194/2 +f 443/195/2 504/196/2 505/197/2 +f 455/198/2 492/199/2 493/200/2 +f 444/201/2 503/202/2 504/196/2 +f 442/203/2 505/197/2 490/204/2 +f 451/205/2 496/206/2 497/207/2 +f 454/208/2 495/209/2 453/210/2 +f 491/211/2 456/212/2 457/193/2 +f 498/213/2 449/214/2 450/215/2 +f 454/208/2 493/200/2 494/216/2 +f 453/210/2 496/206/2 452/217/2 +f 500/218/2 447/191/2 448/219/2 +f 499/220/2 448/219/2 449/214/2 +f 497/207/2 450/215/2 451/205/2 +f 3/1/1 204/49/1 202/2/1 +f 6/4/2 8/221/2 7/5/2 +f 3/7/3 7/222/3 8/8/3 +f 2/10/4 6/4/4 5/6/4 +f 4/11/5 8/223/5 6/12/5 +f 1/14/6 5/224/6 7/15/6 +f 511/225/3 512/226/3 513/17/3 +f 513/17/3 506/227/3 507/18/3 +f 507/18/3 508/228/3 509/19/3 +f 509/19/3 510/229/3 511/225/3 +f 511/225/3 513/17/3 509/19/3 +f 172/20/6 173/27/6 171/21/6 +f 180/23/5 181/31/5 179/24/5 +f 172/20/3 174/230/3 177/26/3 +f 171/21/4 176/231/4 175/28/4 +f 170/22/2 175/232/2 174/29/2 +f 180/23/4 182/233/4 185/30/4 +f 179/24/3 184/234/3 183/32/3 +f 178/25/2 183/235/2 182/33/2 +f 187/34/2 189/40/2 188/35/2 +f 196/236/4 195/237/4 194/37/4 +f 194/37/4 201/238/4 200/38/4 +f 200/38/4 199/239/4 198/39/4 +f 198/39/4 197/240/4 196/236/4 +f 196/236/4 194/37/4 198/39/4 +f 189/40/3 193/241/3 192/41/3 +f 186/36/4 190/242/4 191/42/4 +f 187/34/5 191/243/5 193/43/5 +f 188/35/6 192/244/6 190/44/6 +f 203/45/6 208/68/6 209/46/6 +f 4/48/1 205/50/1 204/49/1 +f 2/10/1 203/51/1 205/50/1 +f 1/3/1 202/2/1 203/51/1 +f 209/52/1 213/75/1 210/53/1 +f 204/55/5 206/69/5 207/56/5 +f 205/58/4 209/52/4 206/54/4 +f 202/60/3 207/66/3 208/61/3 +f 212/63/5 216/72/5 217/64/5 +f 207/66/1 211/76/1 212/67/1 +f 208/68/1 212/63/1 213/65/1 +f 206/69/1 210/74/1 211/70/1 +f 214/71/1 217/64/1 216/72/1 +f 210/74/6 214/71/6 215/73/6 +f 213/75/3 217/64/3 214/71/3 +f 211/76/4 215/73/4 216/72/4 +f 288/77/6 282/87/6 284/78/6 +f 286/80/3 284/78/3 285/81/3 +f 287/83/5 285/81/5 283/84/5 +f 289/86/4 283/84/4 282/87/4 +f 283/84/2 285/81/2 284/78/2 +f 360/89/2 358/97/2 359/90/2 +f 354/92/4 360/89/4 361/91/4 +f 356/94/5 358/97/5 360/89/5 +f 357/96/3 359/90/3 358/97/3 +f 355/99/6 361/91/6 359/90/6 +f 400/101/6 394/111/6 396/102/6 +f 398/104/3 396/102/3 397/105/3 +f 399/107/5 397/105/5 395/108/5 +f 401/110/4 395/108/4 394/111/4 +f 395/108/2 397/105/2 396/102/2 +f 408/113/2 406/121/2 407/114/2 +f 402/116/4 408/113/4 409/115/4 +f 404/118/5 406/121/5 408/113/5 +f 405/120/3 407/114/3 406/121/3 +f 403/123/6 409/115/6 407/114/6 +f 421/125/2 469/129/2 468/126/2 +f 422/128/2 470/131/2 469/129/2 +f 422/128/2 423/133/2 471/130/2 +f 424/132/2 472/135/2 471/130/2 +f 425/134/2 473/137/2 472/135/2 +f 410/136/2 458/245/2 473/137/2 +f 411/138/2 459/142/2 458/139/2 +f 412/141/2 460/144/2 459/142/2 +f 413/143/2 461/146/2 460/144/2 +f 413/143/2 414/148/2 462/145/2 +f 415/147/2 463/150/2 462/145/2 +f 416/149/2 464/152/2 463/150/2 +f 416/149/2 417/153/2 465/151/2 +f 417/153/2 418/156/2 466/154/2 +f 419/155/2 467/157/2 466/154/2 +f 419/155/2 420/127/2 468/126/2 +f 485/158/1 486/246/1 438/159/1 +f 438/159/1 486/246/1 487/161/1 +f 487/161/1 488/164/1 440/163/1 +f 488/164/1 489/166/1 441/165/1 +f 489/166/1 474/247/1 426/167/1 +f 474/168/1 475/248/1 427/169/1 +f 427/169/1 475/248/1 476/171/1 +f 428/172/1 476/171/1 477/173/1 +f 429/174/1 477/173/1 478/175/1 +f 478/175/1 479/178/1 431/177/1 +f 479/178/1 480/249/1 432/179/1 +f 432/179/1 480/249/1 481/180/1 +f 433/181/1 481/180/1 482/182/1 +f 482/182/1 483/250/1 435/184/1 +f 435/184/1 483/250/1 484/185/1 +f 484/185/1 485/158/1 437/160/1 +f 502/187/2 503/202/2 445/188/2 +f 501/190/2 502/187/2 446/189/2 +f 490/192/2 491/211/2 457/193/2 +f 443/195/2 444/201/2 504/196/2 +f 455/198/2 456/212/2 492/199/2 +f 444/201/2 445/188/2 503/202/2 +f 442/203/2 443/195/2 505/197/2 +f 451/205/2 452/217/2 496/206/2 +f 454/208/2 494/216/2 495/209/2 +f 491/211/2 492/199/2 456/212/2 +f 498/213/2 499/220/2 449/214/2 +f 454/208/2 455/198/2 493/200/2 +f 453/210/2 495/209/2 496/206/2 +f 500/218/2 501/190/2 447/191/2 +f 499/220/2 500/218/2 448/219/2 +f 497/207/2 498/213/2 450/215/2 +s 1 +f 11/251/7 26/252/8 10/253/8 +f 19/254/9 34/255/10 18/256/10 +f 12/257/11 27/258/7 11/251/7 +f 20/259/12 35/260/9 19/254/9 +f 13/261/6 28/262/11 12/257/11 +f 21/263/5 36/264/12 20/259/12 +f 14/265/13 29/266/6 13/261/6 +f 22/267/14 37/268/5 21/263/5 +f 15/269/15 30/270/13 14/265/13 +f 23/271/16 38/272/14 22/267/14 +f 16/273/17 31/274/15 15/269/15 +f 24/275/18 39/276/16 23/271/16 +f 17/277/4 32/278/17 16/273/17 +f 10/253/8 25/279/3 9/280/3 +f 9/281/3 40/282/18 24/275/18 +f 18/256/10 33/283/4 17/277/4 +f 43/284/7 58/285/8 42/286/8 +f 51/287/9 66/288/10 50/289/10 +f 44/290/11 59/291/7 43/284/7 +f 52/292/12 67/293/9 51/287/9 +f 45/294/6 60/295/11 44/290/11 +f 53/296/5 68/297/12 52/292/12 +f 46/298/13 61/299/6 45/294/6 +f 54/300/14 69/301/5 53/296/5 +f 47/302/15 62/303/13 46/298/13 +f 55/304/16 70/305/14 54/300/14 +f 48/306/17 63/307/15 47/302/15 +f 56/308/18 71/309/16 55/304/16 +f 49/310/4 64/311/17 48/306/17 +f 42/286/8 57/312/3 41/313/3 +f 41/314/3 72/315/18 56/308/18 +f 50/289/10 65/316/4 49/310/4 +f 83/317/9 98/318/10 82/319/10 +f 76/320/11 91/321/7 75/322/7 +f 84/323/12 99/324/9 83/317/9 +f 77/325/6 92/326/11 76/320/11 +f 85/327/5 100/328/12 84/323/12 +f 78/329/13 93/330/6 77/325/6 +f 86/331/14 101/332/5 85/327/5 +f 79/333/15 94/334/13 78/329/13 +f 87/335/16 102/336/14 86/331/14 +f 80/337/17 95/338/15 79/333/15 +f 88/339/18 103/340/16 87/335/16 +f 81/341/4 96/342/17 80/337/17 +f 74/343/8 89/344/3 73/345/3 +f 73/346/3 104/347/18 88/339/18 +f 82/319/10 97/348/4 81/341/4 +f 75/322/7 90/349/8 74/343/8 +f 105/350/19 109/351/20 106/352/21 +f 153/353/22 152/354/2 107/355/23 +f 153/353/22 108/356/24 105/350/19 +f 108/356/24 112/357/25 109/351/20 +f 107/358/23 152/359/2 110/360/26 +f 107/358/23 111/361/27 108/356/24 +f 110/362/26 152/363/2 113/364/28 +f 111/361/27 113/364/28 114/365/29 +f 111/361/27 115/366/30 112/357/25 +f 113/367/28 117/368/31 114/365/29 +f 114/365/29 118/369/32 115/366/30 +f 113/367/28 152/370/2 116/371/33 +f 117/368/31 119/372/34 120/373/35 +f 117/368/31 121/374/36 118/369/32 +f 116/375/33 152/376/2 119/372/34 +f 119/377/34 123/378/37 120/373/35 +f 120/373/35 124/379/38 121/374/36 +f 119/377/34 152/380/2 122/381/39 +f 122/382/39 126/383/40 123/378/37 +f 123/378/37 127/384/41 124/379/38 +f 122/382/39 152/385/2 125/386/42 +f 125/387/42 129/388/43 126/383/40 +f 126/383/40 130/389/44 127/384/41 +f 125/387/42 152/390/2 128/391/45 +f 130/389/44 132/392/46 133/393/47 +f 128/394/45 152/395/2 131/396/48 +f 128/394/45 132/392/46 129/388/43 +f 133/393/47 135/397/49 136/398/50 +f 131/399/48 152/400/2 134/401/51 +f 131/399/48 135/397/49 132/392/46 +f 136/398/50 138/402/52 139/403/53 +f 134/404/51 152/405/2 137/406/54 +f 134/404/51 138/402/52 135/397/49 +f 139/403/53 141/407/55 142/408/56 +f 137/409/54 152/410/2 140/411/57 +f 137/409/54 141/407/55 138/402/52 +f 142/408/56 144/412/58 145/413/59 +f 140/414/57 152/415/2 143/416/60 +f 140/414/57 144/412/58 141/407/55 +f 143/417/60 152/418/2 146/419/61 +f 514/420/2 529/421/62 521/422/62 +f 515/423/63 523/424/2 514/420/2 +f 143/417/60 147/425/64 144/412/58 +f 517/426/65 524/427/5 516/428/5 +f 145/413/59 147/425/64 148/429/66 +f 519/430/67 526/431/1 518/432/1 +f 521/422/62 528/433/6 520/434/6 +f 147/425/64 149/435/68 150/436/69 +f 516/428/5 522/437/63 515/423/63 +f 148/429/66 150/436/69 151/438/70 +f 146/439/61 152/440/2 149/435/68 +f 518/441/1 525/442/65 517/426/65 +f 520/434/6 527/443/67 519/430/67 +f 149/444/68 105/445/19 150/436/69 +f 151/438/70 105/445/19 106/446/21 +f 149/444/68 152/447/2 153/448/22 +f 169/449/2 154/450/63 162/451/63 +f 168/452/62 160/453/2 169/449/2 +f 166/454/67 159/455/6 167/456/6 +f 164/457/65 157/458/1 165/459/1 +f 162/451/63 155/460/5 163/461/5 +f 167/456/6 161/462/62 168/452/62 +f 165/463/1 158/464/67 166/454/67 +f 163/461/5 156/465/65 164/457/65 +f 294/466/71 224/467/72 218/468/1 +f 231/469/3 262/470/73 230/471/16 +f 229/472/5 260/473/74 228/474/9 +f 227/475/4 258/476/75 226/477/15 +f 226/477/15 265/478/76 233/479/6 +f 232/480/7 263/481/77 231/469/3 +f 230/482/16 261/483/78 229/472/5 +f 228/474/9 259/484/79 227/475/4 +f 233/479/6 264/485/80 232/480/7 +f 266/486/81 291/487/82 267/488/83 +f 267/488/83 292/489/84 268/490/85 +f 268/490/85 293/491/86 269/492/87 +f 293/491/86 270/493/88 269/492/87 +f 252/494/89 245/495/72 253/496/90 +f 254/497/91 245/498/72 244/499/92 +f 254/497/91 243/500/93 255/501/94 +f 256/502/95 243/500/93 242/503/96 +f 256/502/95 249/504/97 257/505/98 +f 257/505/98 248/506/99 250/507/100 +f 251/508/101 248/506/99 247/509/102 +f 252/494/89 247/509/102 246/510/103 +f 239/511/104 299/512/105 238/513/106 +f 240/514/107 300/515/15 239/511/104 +f 236/516/108 301/517/16 235/518/109 +f 241/519/110 302/520/111 303/521/2 +f 241/519/110 298/522/81 240/514/107 +f 237/523/112 304/524/88 236/516/108 +f 235/518/109 302/520/111 234/525/113 +f 234/525/113 249/504/97 242/503/96 +f 235/526/109 242/503/96 243/500/93 +f 236/527/108 243/500/93 244/499/92 +f 245/498/72 236/527/108 244/499/92 +f 238/528/106 245/495/72 246/510/103 +f 270/529/88 295/530/114 271/531/115 +f 295/530/114 272/532/116 271/531/115 +f 296/533/117 273/534/118 272/532/116 +f 297/535/119 266/486/81 273/534/118 +f 297/535/119 222/536/9 221/537/97 +f 294/538/71 219/539/120 295/540/114 +f 290/541/121 225/542/122 291/487/82 +f 290/541/121 221/537/97 220/543/2 +f 239/544/104 246/510/103 247/509/102 +f 240/514/107 247/509/102 248/506/99 +f 249/504/97 240/514/107 248/506/99 +f 274/545/4 251/546/101 275/547/15 +f 279/548/16 256/502/95 280/549/5 +f 277/550/7 254/551/91 278/552/3 +f 275/547/15 252/553/89 276/554/6 +f 281/555/9 250/507/100 274/545/4 +f 280/549/5 257/505/98 281/555/9 +f 278/552/3 255/556/94 279/548/16 +f 276/554/6 253/557/90 277/558/7 +f 238/513/106 305/559/1 237/560/112 +f 295/540/114 222/536/9 296/561/117 +f 292/562/84 225/542/122 223/563/7 +f 292/562/84 224/467/72 293/564/86 +f 263/565/77 268/490/85 269/492/87 +f 264/566/80 267/488/83 268/490/85 +f 265/478/76 266/486/81 267/488/83 +f 259/484/79 266/486/81 258/476/75 +f 259/484/79 272/532/116 273/534/118 +f 261/567/78 272/532/116 260/568/74 +f 262/569/73 271/531/115 261/567/78 +f 263/565/77 270/493/88 262/570/73 +f 325/571/123 318/572/124 317/573/120 +f 325/574/123 316/575/125 326/576/126 +f 327/577/127 316/575/125 315/578/128 +f 328/579/129 315/578/128 314/580/130 +f 328/579/129 321/581/122 329/582/131 +f 329/582/131 320/583/132 322/584/133 +f 322/584/133 319/585/134 323/586/135 +f 324/587/136 319/585/134 318/572/124 +f 311/588/137 339/589/88 310/590/138 +f 312/591/139 340/592/16 311/588/137 +f 308/593/140 341/594/15 307/595/141 +f 313/596/142 342/597/81 343/598/2 +f 313/596/142 338/599/111 312/591/139 +f 309/600/143 344/601/105 308/593/140 +f 306/602/144 341/594/15 342/597/81 +f 306/602/144 321/581/122 314/580/130 +f 315/578/128 306/602/144 314/580/130 +f 316/575/125 307/603/141 315/578/128 +f 317/604/120 308/605/140 316/575/125 +f 310/606/138 317/573/120 318/572/124 +f 319/585/134 310/606/138 318/572/124 +f 312/591/139 319/585/134 320/583/132 +f 321/581/122 312/591/139 320/583/132 +f 330/607/3 323/608/135 331/609/16 +f 335/610/15 328/579/129 336/611/6 +f 333/612/9 326/613/126 334/614/4 +f 331/609/16 324/615/136 332/616/5 +f 337/617/7 322/584/133 330/607/3 +f 336/611/6 329/582/131 337/617/7 +f 334/614/4 327/618/127 335/610/15 +f 332/616/5 325/619/123 333/620/9 +f 309/621/143 339/589/88 345/622/1 +f 390/623/145 352/624/120 346/625/1 +f 367/626/4 374/627/146 366/628/15 +f 365/629/6 372/630/147 364/631/7 +f 363/632/3 370/633/148 362/634/16 +f 362/634/16 377/635/149 369/636/5 +f 368/637/9 375/638/150 367/626/4 +f 366/639/15 373/640/151 365/629/6 +f 364/631/7 371/641/152 363/632/3 +f 369/636/5 376/642/153 368/637/9 +f 378/643/111 387/644/154 379/645/155 +f 387/644/154 380/646/156 379/645/155 +f 380/646/156 389/647/157 381/648/158 +f 389/647/157 382/649/105 381/648/158 +f 382/650/105 391/651/159 383/652/160 +f 383/652/160 392/653/161 384/654/162 +f 384/654/162 393/655/163 385/656/164 +f 393/655/163 378/643/111 385/656/164 +f 393/655/163 350/657/7 349/658/122 +f 390/659/145 347/660/72 391/661/159 +f 386/662/165 353/663/97 387/644/154 +f 386/662/165 349/658/122 348/664/2 +f 391/661/159 350/657/7 392/665/161 +f 387/644/154 351/666/9 388/667/166 +f 388/667/166 352/624/120 389/668/157 +f 375/669/150 380/646/156 381/648/158 +f 376/670/153 379/645/155 380/646/156 +f 377/635/149 378/643/111 379/645/155 +f 371/641/152 378/643/111 370/633/148 +f 371/641/152 384/654/162 385/656/164 +f 373/671/151 384/654/162 372/672/147 +f 374/673/146 383/652/160 373/671/151 +f 375/669/150 382/649/105 374/674/146 +f 11/251/7 27/258/7 26/252/8 +f 19/254/9 35/260/9 34/255/10 +f 12/257/11 28/262/11 27/258/7 +f 20/259/12 36/264/12 35/260/9 +f 13/261/6 29/266/6 28/262/11 +f 21/263/5 37/268/5 36/264/12 +f 14/265/13 30/270/13 29/266/6 +f 22/267/14 38/272/14 37/268/5 +f 15/269/15 31/274/15 30/270/13 +f 23/271/16 39/276/16 38/272/14 +f 16/273/17 32/278/17 31/274/15 +f 24/275/18 40/282/18 39/276/16 +f 17/277/4 33/283/4 32/278/17 +f 10/253/8 26/252/8 25/279/3 +f 9/281/3 25/675/3 40/282/18 +f 18/256/10 34/255/10 33/283/4 +f 43/284/7 59/291/7 58/285/8 +f 51/287/9 67/293/9 66/288/10 +f 44/290/11 60/295/11 59/291/7 +f 52/292/12 68/297/12 67/293/9 +f 45/294/6 61/299/6 60/295/11 +f 53/296/5 69/301/5 68/297/12 +f 46/298/13 62/303/13 61/299/6 +f 54/300/14 70/305/14 69/301/5 +f 47/302/15 63/307/15 62/303/13 +f 55/304/16 71/309/16 70/305/14 +f 48/306/17 64/311/17 63/307/15 +f 56/308/18 72/315/18 71/309/16 +f 49/310/4 65/316/4 64/311/17 +f 42/286/8 58/285/8 57/312/3 +f 41/314/3 57/676/3 72/315/18 +f 50/289/10 66/288/10 65/316/4 +f 83/317/9 99/324/9 98/318/10 +f 76/320/11 92/326/11 91/321/7 +f 84/323/12 100/328/12 99/324/9 +f 77/325/6 93/330/6 92/326/11 +f 85/327/5 101/332/5 100/328/12 +f 78/329/13 94/334/13 93/330/6 +f 86/331/14 102/336/14 101/332/5 +f 79/333/15 95/338/15 94/334/13 +f 87/335/16 103/340/16 102/336/14 +f 80/337/17 96/342/17 95/338/15 +f 88/339/18 104/347/18 103/340/16 +f 81/341/4 97/348/4 96/342/17 +f 74/343/8 90/349/8 89/344/3 +f 73/346/3 89/677/3 104/347/18 +f 82/319/10 98/318/10 97/348/4 +f 75/322/7 91/321/7 90/349/8 +f 105/350/19 108/356/24 109/351/20 +f 153/353/22 107/355/23 108/356/24 +f 108/356/24 111/361/27 112/357/25 +f 107/358/23 110/360/26 111/361/27 +f 111/361/27 110/362/26 113/364/28 +f 111/361/27 114/365/29 115/366/30 +f 113/367/28 116/371/33 117/368/31 +f 114/365/29 117/368/31 118/369/32 +f 117/368/31 116/375/33 119/372/34 +f 117/368/31 120/373/35 121/374/36 +f 119/377/34 122/381/39 123/378/37 +f 120/373/35 123/378/37 124/379/38 +f 122/382/39 125/386/42 126/383/40 +f 123/378/37 126/383/40 127/384/41 +f 125/387/42 128/391/45 129/388/43 +f 126/383/40 129/388/43 130/389/44 +f 130/389/44 129/388/43 132/392/46 +f 128/394/45 131/396/48 132/392/46 +f 133/393/47 132/392/46 135/397/49 +f 131/399/48 134/401/51 135/397/49 +f 136/398/50 135/397/49 138/402/52 +f 134/404/51 137/406/54 138/402/52 +f 139/403/53 138/402/52 141/407/55 +f 137/409/54 140/411/57 141/407/55 +f 142/408/56 141/407/55 144/412/58 +f 140/414/57 143/416/60 144/412/58 +f 514/420/2 523/424/2 529/421/62 +f 515/423/63 522/437/63 523/424/2 +f 143/417/60 146/419/61 147/425/64 +f 517/426/65 525/442/65 524/427/5 +f 145/413/59 144/412/58 147/425/64 +f 519/430/67 527/443/67 526/431/1 +f 521/422/62 529/421/62 528/433/6 +f 147/425/64 146/439/61 149/435/68 +f 516/428/5 524/427/5 522/437/63 +f 148/429/66 147/425/64 150/436/69 +f 518/441/1 526/678/1 525/442/65 +f 520/434/6 528/433/6 527/443/67 +f 149/444/68 153/448/22 105/445/19 +f 151/438/70 150/436/69 105/445/19 +f 169/449/2 160/453/2 154/450/63 +f 168/452/62 161/462/62 160/453/2 +f 166/454/67 158/464/67 159/455/6 +f 164/457/65 156/465/65 157/458/1 +f 162/451/63 154/450/63 155/460/5 +f 167/456/6 159/455/6 161/462/62 +f 165/463/1 157/679/1 158/464/67 +f 163/461/5 155/460/5 156/465/65 +f 294/466/71 293/564/86 224/467/72 +f 231/469/3 263/481/77 262/470/73 +f 229/472/5 261/483/78 260/473/74 +f 227/475/4 259/484/79 258/476/75 +f 226/477/15 258/476/75 265/478/76 +f 232/480/7 264/485/80 263/481/77 +f 230/482/16 262/680/73 261/483/78 +f 228/474/9 260/473/74 259/484/79 +f 233/479/6 265/478/76 264/485/80 +f 266/486/81 290/541/121 291/487/82 +f 267/488/83 291/487/82 292/489/84 +f 268/490/85 292/489/84 293/491/86 +f 293/491/86 294/681/71 270/493/88 +f 252/494/89 246/510/103 245/495/72 +f 254/497/91 253/682/90 245/498/72 +f 254/497/91 244/499/92 243/500/93 +f 256/502/95 255/501/94 243/500/93 +f 256/502/95 242/503/96 249/504/97 +f 257/505/98 249/504/97 248/506/99 +f 251/508/101 250/507/100 248/506/99 +f 252/494/89 251/508/101 247/509/102 +f 239/511/104 300/515/15 299/512/105 +f 240/514/107 298/522/81 300/515/15 +f 236/516/108 304/524/88 301/517/16 +f 241/519/110 234/525/113 302/520/111 +f 241/519/110 303/521/2 298/522/81 +f 237/523/112 305/683/1 304/524/88 +f 235/518/109 301/517/16 302/520/111 +f 234/525/113 241/519/110 249/504/97 +f 235/526/109 234/525/113 242/503/96 +f 236/527/108 235/526/109 243/500/93 +f 245/498/72 237/684/112 236/527/108 +f 238/528/106 237/685/112 245/495/72 +f 270/529/88 294/686/71 295/530/114 +f 295/530/114 296/533/117 272/532/116 +f 296/533/117 297/535/119 273/534/118 +f 297/535/119 290/541/121 266/486/81 +f 297/535/119 296/561/117 222/536/9 +f 294/538/71 218/687/1 219/539/120 +f 290/541/121 220/543/2 225/542/122 +f 290/541/121 297/535/119 221/537/97 +f 239/544/104 238/528/106 246/510/103 +f 240/514/107 239/544/104 247/509/102 +f 249/504/97 241/519/110 240/514/107 +f 274/545/4 250/507/100 251/546/101 +f 279/548/16 255/556/94 256/502/95 +f 277/550/7 253/688/90 254/551/91 +f 275/547/15 251/546/101 252/553/89 +f 281/555/9 257/505/98 250/507/100 +f 280/549/5 256/502/95 257/505/98 +f 278/552/3 254/551/91 255/556/94 +f 276/554/6 252/553/89 253/557/90 +f 238/513/106 299/512/105 305/559/1 +f 295/540/114 219/539/120 222/536/9 +f 292/562/84 291/487/82 225/542/122 +f 292/562/84 223/563/7 224/467/72 +f 263/565/77 264/566/80 268/490/85 +f 264/566/80 265/478/76 267/488/83 +f 265/478/76 258/476/75 266/486/81 +f 259/484/79 273/534/118 266/486/81 +f 259/484/79 260/568/74 272/532/116 +f 261/567/78 271/531/115 272/532/116 +f 262/569/73 270/529/88 271/531/115 +f 263/565/77 269/492/87 270/493/88 +f 325/571/123 324/587/136 318/572/124 +f 325/574/123 317/604/120 316/575/125 +f 327/577/127 326/576/126 316/575/125 +f 328/579/129 327/577/127 315/578/128 +f 328/579/129 314/580/130 321/581/122 +f 329/582/131 321/581/122 320/583/132 +f 322/584/133 320/583/132 319/585/134 +f 324/587/136 323/586/135 319/585/134 +f 311/588/137 340/592/16 339/589/88 +f 312/591/139 338/599/111 340/592/16 +f 308/593/140 344/601/105 341/594/15 +f 313/596/142 306/602/144 342/597/81 +f 313/596/142 343/598/2 338/599/111 +f 309/600/143 345/689/1 344/601/105 +f 306/602/144 307/595/141 341/594/15 +f 306/602/144 313/596/142 321/581/122 +f 315/578/128 307/603/141 306/602/144 +f 316/575/125 308/605/140 307/603/141 +f 317/604/120 309/690/143 308/605/140 +f 310/606/138 309/691/143 317/573/120 +f 319/585/134 311/692/137 310/606/138 +f 312/591/139 311/692/137 319/585/134 +f 321/581/122 313/596/142 312/591/139 +f 330/607/3 322/584/133 323/608/135 +f 335/610/15 327/618/127 328/579/129 +f 333/612/9 325/693/123 326/613/126 +f 331/609/16 323/608/135 324/615/136 +f 337/617/7 329/582/131 322/584/133 +f 336/611/6 328/579/129 329/582/131 +f 334/614/4 326/613/126 327/618/127 +f 332/616/5 324/615/136 325/619/123 +f 309/621/143 310/590/138 339/589/88 +f 390/623/145 389/668/157 352/624/120 +f 367/626/4 375/638/150 374/627/146 +f 365/629/6 373/640/151 372/630/147 +f 363/632/3 371/641/152 370/633/148 +f 362/634/16 370/633/148 377/635/149 +f 368/637/9 376/642/153 375/638/150 +f 366/639/15 374/694/146 373/640/151 +f 364/631/7 372/630/147 371/641/152 +f 369/636/5 377/635/149 376/642/153 +f 378/643/111 386/662/165 387/644/154 +f 387/644/154 388/695/166 380/646/156 +f 380/646/156 388/695/166 389/647/157 +f 389/647/157 390/696/145 382/649/105 +f 382/650/105 390/697/145 391/651/159 +f 383/652/160 391/651/159 392/653/161 +f 384/654/162 392/653/161 393/655/163 +f 393/655/163 386/662/165 378/643/111 +f 393/655/163 392/665/161 350/657/7 +f 390/659/145 346/698/1 347/660/72 +f 386/662/165 348/664/2 353/663/97 +f 386/662/165 393/655/163 349/658/122 +f 391/661/159 347/660/72 350/657/7 +f 387/644/154 353/663/97 351/666/9 +f 388/667/166 351/666/9 352/624/120 +f 375/669/150 376/670/153 380/646/156 +f 376/670/153 377/635/149 379/645/155 +f 377/635/149 370/633/148 378/643/111 +f 371/641/152 385/656/164 378/643/111 +f 371/641/152 372/672/147 384/654/162 +f 373/671/151 383/652/160 384/654/162 +f 374/673/146 382/650/105 383/652/160 +f 375/669/150 381/648/158 382/649/105 diff --git a/src/main/resources/assets/hbm/models/machines/boiler_burst.obj b/src/main/resources/assets/hbm/models/machines/boiler_burst.obj new file mode 100644 index 000000000..242ef8101 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/boiler_burst.obj @@ -0,0 +1,1299 @@ +# Blender v2.79 (sub 0) OBJ File: 'boiler_burst.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v -1.500000 0.250000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 0.000000 0.250000 -1.375000 +v -0.526190 0.250000 -1.270334 +v -0.972272 0.250000 -0.972272 +v -1.270334 0.250000 -0.526190 +v -1.375000 0.250000 0.000000 +v -1.270334 0.250000 0.526190 +v -0.972272 0.250000 0.972272 +v -0.526190 0.250000 1.270334 +v -0.000000 0.250000 1.375000 +v 0.526189 0.250000 1.270334 +v 0.972272 0.250000 0.972272 +v 1.270334 0.250000 0.526190 +v 1.375000 0.250000 -0.000000 +v 1.270334 0.250000 -0.526190 +v 0.972272 0.250000 -0.972272 +v 0.526189 0.250000 -1.270335 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v -0.000000 0.716458 -1.082532 +v -0.000000 0.966458 -1.250000 +v 0.239177 0.533445 -0.577425 +v 0.414267 0.716458 -1.000129 +v 0.478354 0.966458 -1.154849 +v 0.441941 0.533445 -0.441942 +v 0.765465 0.716458 -0.765465 +v 0.883883 0.966458 -0.883883 +v 0.577424 0.533445 -0.239177 +v 1.000129 0.716458 -0.414267 +v 1.154849 0.966458 -0.478354 +v 0.625000 0.533445 -0.000000 +v 1.082531 0.716458 0.000000 +v 1.250000 0.966458 0.000000 +v 0.577424 0.533445 0.239177 +v 1.000129 0.716458 0.414267 +v 1.154849 0.966458 0.478354 +v 0.441941 0.533445 0.441941 +v 0.765465 0.716458 0.765465 +v 0.883883 0.966458 0.883883 +v 0.239177 0.533445 0.577424 +v 0.414266 0.716458 1.000129 +v 0.478354 0.966458 1.154849 +v -0.000000 0.533445 0.625000 +v -0.000000 0.716458 1.082531 +v -0.000001 0.966458 1.250000 +v -0.239177 0.533445 0.577424 +v -0.414267 0.716458 1.000128 +v -0.478355 0.966458 1.154849 +v -0.441942 0.533445 0.441941 +v -0.765466 0.716458 0.765465 +v -0.883884 0.966458 0.883883 +v -0.577425 0.533445 0.239177 +v -1.000129 0.716458 0.414266 +v -1.154849 0.966458 0.478354 +v -0.625000 0.533445 -0.000000 +v -1.082531 0.716458 -0.000001 +v -1.250000 0.966458 -0.000001 +v -0.577424 0.533445 -0.239177 +v -1.000129 0.716458 -0.414267 +v -1.154849 0.966458 -0.478355 +v -0.441941 0.533445 -0.441942 +v -0.765465 0.716458 -0.765466 +v -0.883883 0.966458 -0.883884 +v -0.239177 0.533445 -0.577425 +v -0.414266 0.716458 -1.000129 +v -0.478354 0.966458 -1.154849 +v -0.000000 0.466458 0.000000 +v 0.000000 0.533445 -0.625000 +v 0.265165 1.390165 1.182243 +v 0.375000 1.125000 -1.125000 +v 0.265165 0.859835 -1.125000 +v -0.000000 0.750000 -1.125000 +v -0.265165 0.859835 -1.125000 +v -0.265165 1.390165 1.176438 +v 0.000000 1.500000 1.232605 +v -0.319109 0.990066 -1.125000 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v -1.500000 0.750000 0.250000 +v -1.500000 0.250000 0.250000 +v -1.500000 0.750000 -0.250000 +v -1.500000 0.250000 -0.250000 +v -1.187500 0.750000 -0.250000 +v -1.187500 0.750000 0.250000 +v -1.187500 0.250000 0.250000 +v -1.187500 0.250000 -0.250000 +v 1.500000 0.750000 -0.250000 +v 1.500000 0.250000 -0.250000 +v 1.500000 0.750000 0.250000 +v 1.500000 0.250000 0.250000 +v 1.187500 0.750000 0.250000 +v 1.187500 0.750000 -0.250000 +v 1.187500 0.250000 -0.250000 +v 1.187500 0.250000 0.250000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -1.099112 1.741336 -1.099111 +v 1.187500 0.375000 1.312500 +v 1.099112 0.375000 1.275888 +v 1.062500 0.375000 1.187500 +v 1.099112 0.375000 1.099111 +v 1.187500 0.375000 1.062500 +v 1.275889 0.375000 1.099111 +v 1.312500 0.375000 1.187500 +v 1.275889 0.375000 1.275888 +v 1.000000 0.375000 1.375000 +v 1.375000 0.375000 1.375000 +v 1.000000 0.375000 1.000000 +v 1.375000 0.375000 1.000000 +v 1.000000 0.250000 1.000000 +v 1.375000 0.250000 1.000000 +v 1.000000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v 0.478354 1.453251 -1.154850 +v -1.062500 1.565094 -1.187500 +v -1.099112 1.675266 -1.275888 +v -1.187500 1.753248 -1.062500 +v -1.275889 1.629296 -1.099111 +v -1.275889 1.746521 -1.275888 +v -1.187500 1.634389 -1.312500 +v -1.312500 1.584031 -1.187500 +v -0.478354 1.380250 -1.154849 +v -1.154849 1.715569 -0.478354 +v -0.883883 1.256777 -0.883883 +v -0.883883 1.354637 0.883883 +v -1.154849 1.408746 0.478354 +v -1.250000 1.688512 0.000000 +v -0.000000 1.841970 1.250000 +v -1.187500 0.375000 -1.312500 +v -1.099112 0.375000 -1.275888 +v -1.062500 0.375000 -1.187500 +v -1.099112 0.375000 -1.099111 +v -1.187500 0.375000 -1.062500 +v -1.275889 0.375000 -1.099111 +v -1.312500 0.375000 -1.187500 +v -1.275889 0.375000 -1.275888 +v 0.478354 1.503106 1.154850 +v -0.478354 1.603803 1.154849 +v 1.250000 1.431234 -0.000000 +v 1.154849 1.266202 0.478354 +v 0.883883 1.639337 0.883884 +v 0.883883 1.186719 -0.883884 +v 0.000000 1.664942 -1.250000 +v 1.154849 1.584849 -0.478355 +v 1.375000 0.250000 -1.000000 +v 1.000000 0.250000 -1.000000 +v 1.375000 0.250000 -1.375000 +v 1.000000 0.250000 -1.375000 +v 1.375000 0.375000 -1.375000 +v 1.000000 0.375000 -1.375000 +v 1.375000 0.375000 -1.000000 +v 1.000000 0.375000 -1.000000 +v 1.187500 1.566981 1.062500 +v 1.275889 1.631251 1.099111 +v 1.312500 1.580286 1.187500 +v 1.275889 1.568108 1.275888 +v 1.099112 1.493643 1.099111 +v 1.099112 1.588674 1.275888 +v 1.187500 1.538954 1.312500 +v 1.062500 1.537098 1.187500 +v -1.375000 0.375000 1.375000 +v -1.000000 0.375000 1.375000 +v -1.375000 0.375000 1.000000 +v -1.000000 0.375000 1.000000 +v -1.375000 0.250000 1.000000 +v -1.000000 0.250000 1.000000 +v -1.375000 0.250000 1.375000 +v -1.000000 0.250000 1.375000 +v -1.000000 0.250000 -1.000000 +v -1.375000 0.250000 -1.000000 +v -1.000000 0.250000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.000000 0.375000 -1.375000 +v -1.375000 0.375000 -1.375000 +v -1.000000 0.375000 -1.000000 +v -1.375000 0.375000 -1.000000 +v 0.000000 0.500000 -1.375000 +v -0.526190 0.500000 -1.270334 +v -0.972272 0.500000 -0.972272 +v -1.270334 0.500000 -0.526190 +v -1.375000 0.500000 0.000000 +v -1.270334 0.500000 0.526190 +v -0.972272 0.500000 0.972272 +v -0.526190 0.500000 1.270334 +v -0.000000 0.500000 1.375000 +v 0.526189 0.500000 1.270334 +v 0.972272 0.500000 0.972272 +v 1.270334 0.500000 0.526190 +v 1.375000 0.500000 -0.000000 +v 1.270334 0.500000 -0.526190 +v 0.972272 0.500000 -0.972272 +v 0.526189 0.500000 -1.270335 +v 1.154849 1.584848 -0.478355 +v 0.000000 1.664942 -1.250000 +v 0.883883 1.186719 -0.883884 +v 0.883883 1.639337 0.883884 +v 1.154849 1.266202 0.478354 +v 1.250000 1.431234 -0.000000 +v -0.478354 1.603803 1.154849 +v 0.478354 1.503106 1.154850 +v -0.000000 1.841970 1.250000 +v -1.250000 1.688512 0.000000 +v -1.154849 1.408746 0.478354 +v -0.883883 1.354637 0.883883 +v -0.883883 1.256777 -0.883883 +v -1.154849 1.715569 -0.478354 +v -0.478354 1.380250 -1.154849 +v 0.478354 1.453251 -1.154850 +v 0.000000 0.500000 -1.250000 +v -0.478354 0.500000 -1.154849 +v -0.883883 0.500000 -0.883883 +v -1.154849 0.500000 -0.478354 +v -1.250000 0.500000 0.000000 +v -1.154849 0.500000 0.478354 +v -0.883883 0.500000 0.883883 +v -0.478354 0.500000 1.154849 +v -0.000000 0.500000 1.250000 +v 0.478354 0.500000 1.154850 +v 0.883883 0.500000 0.883884 +v 1.154849 0.500000 0.478354 +v 1.250000 0.500000 -0.000000 +v 1.154849 0.500000 -0.478355 +v 0.883883 0.500000 -0.883884 +v 0.478354 0.500000 -1.154850 +v 0.418559 0.500000 -1.010493 +v 0.773398 0.500000 -0.773398 +v 1.010493 0.500000 -0.418560 +v 1.093750 0.500000 -0.000000 +v 1.010493 0.500000 0.418560 +v 0.773398 0.500000 0.773398 +v 0.418560 0.500000 1.010493 +v -0.000000 0.500000 1.093750 +v -0.418560 0.500000 1.010493 +v -0.773398 0.500000 0.773398 +v -1.010493 0.500000 0.418560 +v -1.093750 0.500000 0.000000 +v -1.010493 0.500000 -0.418560 +v -0.773398 0.500000 -0.773398 +v -0.418560 0.500000 -1.010493 +v -0.000000 0.500000 -1.093750 +v 0.265165 1.390165 -1.375000 +v 0.375000 1.125000 -1.375000 +v 0.265165 0.859835 -1.375000 +v -0.000000 0.750000 -1.375000 +v -0.265165 0.859835 -1.375000 +v -0.375000 1.125000 -1.375000 +v -0.265165 1.390165 -1.375000 +v -0.000000 1.500000 -1.375000 +v 0.000000 1.500000 1.375000 +v 0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.375000 +v 0.265165 0.859835 1.375000 +v 0.000000 0.750000 1.375000 +v -0.265165 0.859835 1.375000 +v -0.375000 1.125000 1.375000 +v -0.265165 1.390165 1.375000 +v 0.375000 1.125000 1.125000 +v 0.265165 0.859835 1.125000 +v 0.000000 0.750000 1.125000 +v -0.265165 0.859835 1.125000 +v -0.375000 1.125000 1.125000 +v 0.265165 1.390165 -1.184336 +v 0.375000 1.125000 -1.147111 +v -0.000000 1.500000 -1.242492 +v -0.265165 1.390165 -1.190043 +v -0.375000 1.125000 -1.153109 +v 0.375000 1.125000 1.150544 +vt 0.000000 0.000000 +vt 0.081633 0.320000 +vt 0.000000 0.480000 +vt 0.244898 0.520000 +vt 0.000000 1.000000 +vt 0.000000 0.520000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.244898 0.480000 +vt -0.000000 0.520000 +vt -0.000000 0.480000 +vt 0.244898 0.480000 +vt 0.000000 0.520000 +vt 0.000000 0.480000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.331633 0.890000 +vt 0.372449 0.810000 +vt 0.372449 0.890000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.306122 0.810000 +vt 0.331633 0.810000 +vt 0.397959 0.890000 +vt 0.331633 0.940000 +vt 0.275510 0.929965 +vt 0.244916 0.870000 +vt 0.275510 0.810035 +vt 1.000000 0.180000 +vt 0.994898 0.020000 +vt 1.000000 0.020000 +vt 0.244898 0.000000 +vt 0.081633 0.160000 +vt 0.163265 0.160000 +vt 0.163265 0.320000 +vt 0.989796 0.010000 +vt 0.913265 0.020000 +vt 0.908163 0.010000 +vt 0.897959 0.020000 +vt 0.903061 0.180000 +vt 0.897959 0.180000 +vt 0.989796 0.000000 +vt 0.908163 0.000000 +vt 0.908163 0.200000 +vt 0.989796 0.190000 +vt 0.989796 0.200000 +vt 0.989796 0.170000 +vt 0.984694 0.030000 +vt 0.989796 0.030000 +vt 0.908163 0.190000 +vt 0.984694 0.180000 +vt 0.994898 0.180000 +vt 0.903061 0.020000 +vt 0.908163 0.170000 +vt 0.913265 0.030000 +vt 0.984694 0.170000 +vt 0.913265 0.170000 +vt 0.908163 0.030000 +vt 0.984694 0.020000 +vt 0.913265 0.180000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.408163 0.790000 +vt 0.418367 0.850000 +vt 0.408163 0.850000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.459184 0.850000 +vt 0.448980 0.790000 +vt 0.459184 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.790000 +vt 0.418367 0.770000 +vt 0.448980 0.790000 +vt 0.418367 0.850000 +vt 0.418367 0.790000 +vt 0.448980 0.770000 +vt 0.418367 0.770000 +vt 0.459184 0.850000 +vt 0.459184 0.790000 +vt 0.418367 0.870000 +vt 0.448980 0.850000 +vt 0.448980 0.870000 +vt 0.408163 0.790000 +vt 0.408163 0.850000 +vt 0.693878 0.040000 +vt 0.653061 0.060000 +vt 0.653061 0.040000 +vt 0.734694 0.040000 +vt 0.693878 0.060000 +vt 0.775510 0.060000 +vt 0.734694 0.060000 +vt 0.816327 0.040000 +vt 0.775510 0.040000 +vt 0.857143 0.040000 +vt 0.816327 0.060000 +vt 0.897959 0.040000 +vt 0.857143 0.060000 +vt 0.285714 0.040000 +vt 0.244898 0.060000 +vt 0.244898 0.040000 +vt 0.326531 0.040000 +vt 0.285714 0.060000 +vt 0.367347 0.040000 +vt 0.326531 0.060000 +vt 0.408163 0.060000 +vt 0.367347 0.060000 +vt 0.448980 0.040000 +vt 0.408163 0.040000 +vt 0.489796 0.040000 +vt 0.448980 0.060000 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.530612 0.040000 +vt 0.571429 0.060000 +vt 0.612245 0.040000 +vt 0.571429 0.040000 +vt 0.612245 0.060000 +vt 0.244898 1.000000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.244898 0.520000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306122 0.890000 +vt 0.397959 0.810000 +vt 0.372449 0.940000 +vt 0.306104 0.870000 +vt 0.297144 0.912401 +vt 0.253877 0.912401 +vt 0.253877 0.827599 +vt 0.297144 0.827599 +vt 0.897959 0.060000 +vt 0.326531 -0.000000 +vt 0.285714 0.040000 +vt 0.285714 0.000000 +vt 0.653061 0.000000 +vt 0.612245 0.040000 +vt 0.612245 -0.000000 +vt 0.367347 0.000000 +vt 0.326531 0.040000 +vt 0.693878 0.000000 +vt 0.653061 0.040000 +vt 0.408163 0.000000 +vt 0.367347 0.040000 +vt 0.734694 0.000000 +vt 0.693878 0.040000 +vt 0.448980 0.000000 +vt 0.408163 0.040000 +vt 0.775510 0.000000 +vt 0.734694 0.040000 +vt 0.489796 0.000000 +vt 0.448980 0.040000 +vt 0.816327 0.000000 +vt 0.775510 0.040000 +vt 0.530612 -0.000000 +vt 0.489796 0.040000 +vt 0.857143 -0.000000 +vt 0.816327 0.040000 +vt 0.571429 -0.000000 +vt 0.530612 0.040000 +vt 0.244898 0.040000 +vt 0.244898 0.000000 +vt 0.897959 0.000000 +vt 0.857143 0.040000 +vt 0.571429 0.040000 +vt 0.653061 0.060000 +vt 0.612245 0.220497 +vt 0.612245 0.060000 +vt 0.367347 0.060000 +vt 0.326531 0.181084 +vt 0.326531 0.060000 +vt 0.693878 0.182592 +vt 0.653061 0.242294 +vt 0.408163 0.250162 +vt 0.367347 0.254491 +vt 0.734694 0.060000 +vt 0.693878 0.060000 +vt 0.408163 0.060000 +vt 0.448980 0.205399 +vt 0.775510 0.060000 +vt 0.734694 0.208998 +vt 0.448980 0.060000 +vt 0.489796 0.196742 +vt 0.816327 0.169875 +vt 0.775510 0.233576 +vt 0.530612 0.060000 +vt 0.489796 0.060000 +vt 0.857143 0.060000 +vt 0.816327 0.060000 +vt 0.571429 0.060000 +vt 0.530612 0.236608 +vt 0.244898 0.060000 +vt 0.285714 0.200840 +vt 0.244898 0.246391 +vt 0.897959 0.060000 +vt 0.857143 0.212520 +vt 0.571429 0.274715 +vt 0.285714 0.060000 +vt 0.897959 0.590000 +vt 0.857143 0.540000 +vt 0.897959 0.540000 +vt 0.887755 0.670000 +vt 0.877551 0.770000 +vt 0.867347 0.670000 +vt 0.857143 0.590000 +vt 0.816327 0.540000 +vt 0.846939 0.670000 +vt 0.836735 0.770000 +vt 0.826531 0.670000 +vt 0.816327 0.590000 +vt 0.806122 0.670000 +vt 0.795918 0.770000 +vt 0.785714 0.670000 +vt 0.775510 0.590000 +vt 0.775510 0.540000 +vt 0.765306 0.670000 +vt 0.734694 0.590000 +vt 0.734694 0.540000 +vt 0.755102 0.770000 +vt 0.744898 0.670000 +vt 0.724490 0.670000 +vt 0.693878 0.590000 +vt 0.693878 0.540000 +vt 0.714286 0.770000 +vt 0.704082 0.670000 +vt 0.683673 0.670000 +vt 0.653061 0.590000 +vt 0.653061 0.540000 +vt 0.673469 0.770000 +vt 0.663265 0.670000 +vt 0.642857 0.670000 +vt 0.612245 0.590000 +vt 0.612245 0.540000 +vt 0.632653 0.770000 +vt 0.622449 0.670000 +vt 0.602041 0.670000 +vt 0.571429 0.590000 +vt 0.571429 0.540000 +vt 0.591837 0.770000 +vt 0.581633 0.670000 +vt 0.530612 0.590000 +vt 0.530612 0.540000 +vt 0.561224 0.670000 +vt 0.551020 0.770000 +vt 0.540816 0.670000 +vt 0.489796 0.590000 +vt 0.489796 0.540000 +vt 0.520408 0.670000 +vt 0.510204 0.770000 +vt 0.500000 0.670000 +vt 0.448980 0.590000 +vt 0.448980 0.540000 +vt 0.479592 0.670000 +vt 0.469388 0.770000 +vt 0.459184 0.670000 +vt 0.408163 0.590000 +vt 0.408163 0.540000 +vt 0.438776 0.670000 +vt 0.428571 0.770000 +vt 0.418367 0.670000 +vt 0.367347 0.590000 +vt 0.367347 0.540000 +vt 0.397959 0.670000 +vt 0.387755 0.770000 +vt 0.377551 0.670000 +vt 0.357143 0.670000 +vt 0.346939 0.770000 +vt 0.336735 0.670000 +vt 0.346939 0.810000 +vt 0.326531 0.787217 +vt 0.346939 0.778230 +vt 0.306122 0.810000 +vt 0.326531 0.810000 +vt 0.326531 0.590000 +vt 0.265306 0.770000 +vt 0.285714 0.770000 +vt 0.285714 0.774087 +vt 0.326531 0.540000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.810000 +vt 0.367347 0.770000 +vt 0.316327 0.670000 +vt 0.285714 0.590000 +vt 0.285714 0.810000 +vt 0.306122 0.779159 +vt 0.285714 0.540000 +vt 0.306122 0.770000 +vt 0.295918 0.670000 +vt 0.244898 0.810000 +vt 0.265306 0.810000 +vt 0.387755 0.770000 +vt 0.275510 0.670000 +vt 0.244898 0.590000 +vt 0.244898 0.540000 +vt 0.265306 0.770000 +vt 0.255102 0.670000 +vt 0.346939 0.810000 +vt 0.326531 0.788799 +vt 0.346939 0.779494 +vt 0.306122 0.810000 +vt 0.326531 0.810000 +vt 0.265306 0.810000 +vt 0.265306 0.770000 +vt 0.275329 0.770000 +vt 0.387755 0.810000 +vt 0.408163 0.770000 +vt 0.408163 0.810000 +vt 0.367347 0.810000 +vt 0.367347 0.773538 +vt 0.285714 0.810000 +vt 0.306122 0.780407 +vt 0.244898 0.810000 +vt 0.367347 0.770000 +vt 0.387755 0.770000 +vt 0.459184 0.890000 +vt 0.554200 0.870000 +vt 0.558259 0.890000 +vt 0.459184 0.810000 +vt 0.557574 0.830000 +vt 0.459184 0.830000 +vt 0.459184 0.790000 +vt 0.550501 0.770000 +vt 0.556488 0.790000 +vt 0.554049 0.910000 +vt 0.459184 0.910000 +vt 0.459184 0.850000 +vt 0.459184 0.870000 +vt 0.556580 0.850000 +vt 0.561735 0.810000 +vt 0.550501 0.930000 +vt 0.459184 0.930000 +vt 0.459184 0.890000 +vt 0.561991 0.870000 +vt 0.565328 0.890000 +vt 0.459184 0.810000 +vt 0.557880 0.830000 +vt 0.459184 0.830000 +vt 0.459184 0.790000 +vt 0.570721 0.770000 +vt 0.571694 0.790000 +vt 0.459184 0.850000 +vt 0.459184 0.870000 +vt 0.571145 0.850000 +vt 0.561575 0.810000 +vt 0.459184 0.930000 +vt 0.556334 0.910000 +vt 0.570721 0.930000 +vt 0.285714 0.060000 +vt 0.326531 0.181084 +vt 0.326531 0.060000 +vt 0.571429 0.060000 +vt 0.612245 0.220497 +vt 0.612245 0.060000 +vt 0.857143 0.212520 +vt 0.897959 0.060000 +vt 0.857143 0.060000 +vt 0.244898 0.060000 +vt 0.285714 0.200840 +vt 0.530612 0.236608 +vt 0.530612 0.060000 +vt 0.816327 0.169875 +vt 0.816327 0.060000 +vt 0.489796 0.196742 +vt 0.489796 0.060000 +vt 0.775510 0.060000 +vt 0.448980 0.060000 +vt 0.734694 0.208998 +vt 0.734694 0.060000 +vt 0.408163 0.060000 +vt 0.448980 0.205399 +vt 0.693878 0.182592 +vt 0.693878 0.060000 +vt 0.367347 0.060000 +vt 0.408163 0.250162 +vt 0.653061 0.060000 +vt 0.897959 0.040000 +vt 0.897959 0.246391 +vt 0.244898 0.770000 +vt 0.285714 0.774498 +vt 0.244898 0.770000 +vt 0.459184 0.770000 +vt 0.459184 0.770000 +vt 0.459184 0.910000 +vt 0.571429 0.274715 +vt 0.897959 0.246391 +vt 0.244898 0.246391 +vt 0.775510 0.233576 +vt 0.367347 0.254491 +vt 0.653061 0.242294 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 -0.9239 +vn 0.7071 0.0000 0.7071 +vn 0.3827 0.0000 0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.3673 0.0000 0.9301 +vn -0.7241 0.0000 -0.6897 +vn 0.9177 0.0000 0.3972 +vn 0.6825 0.0000 0.7308 +vn -0.9991 0.0000 -0.0428 +vn -0.9450 0.0000 -0.3269 +vn -0.9368 0.0000 0.3498 +vn 0.9992 0.0000 -0.0402 +vn -0.6933 0.0000 0.7206 +vn 0.7131 0.0000 -0.7011 +vn 0.9367 0.0000 -0.3500 +vn -0.3276 0.0000 0.9448 +vn -0.3406 0.0000 -0.9402 +vn 0.0107 0.0000 -0.9999 +vn 0.3273 0.0000 -0.9449 +vn -0.0146 0.0000 0.9999 +vn 0.0000 0.7595 0.6505 +vn -0.3179 0.5565 0.7676 +vn 0.0000 0.5565 0.8308 +vn 0.0000 0.9664 0.2571 +vn -0.0984 0.9664 0.2376 +vn -0.2489 0.7595 0.6009 +vn -0.5875 0.5565 0.5875 +vn -0.1818 0.9664 0.1818 +vn -0.4599 0.7595 0.4599 +vn -0.2376 0.9664 0.0984 +vn -0.6009 0.7595 0.2489 +vn -0.7676 0.5565 0.3179 +vn -0.6505 0.7595 0.0000 +vn -0.8308 0.5565 0.0000 +vn -0.2571 0.9664 0.0000 +vn -0.6009 0.7595 -0.2489 +vn -0.7676 0.5565 -0.3179 +vn -0.2376 0.9664 -0.0984 +vn -0.4599 0.7595 -0.4599 +vn -0.5875 0.5565 -0.5875 +vn -0.1818 0.9664 -0.1818 +vn -0.2489 0.7595 -0.6009 +vn -0.3179 0.5565 -0.7676 +vn -0.0984 0.9664 -0.2376 +vn 0.0000 0.7595 -0.6505 +vn 0.0000 0.5565 -0.8308 +vn 0.0000 0.9664 -0.2571 +vn 0.2489 0.7595 -0.6009 +vn 0.3179 0.5565 -0.7676 +vn 0.0984 0.9664 -0.2376 +vn 0.4599 0.7595 -0.4599 +vn 0.5875 0.5565 -0.5875 +vn 0.1818 0.9664 -0.1818 +vn 0.6009 0.7595 -0.2489 +vn 0.7676 0.5565 -0.3179 +vn 0.2376 0.9664 -0.0984 +vn 0.6505 0.7595 0.0000 +vn 0.8308 0.5565 0.0000 +vn 0.2571 0.9664 0.0000 +vn 0.6009 0.7595 0.2489 +vn 0.7676 0.5565 0.3179 +vn 0.2376 0.9664 0.0984 +vn 0.1818 0.9664 0.1818 +vn -0.7071 0.7071 0.0000 +vn -0.0023 1.0000 0.0000 +vn -0.7409 0.6716 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.4599 0.7595 0.4599 +vn 0.7071 -0.7071 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.9887 -0.1495 0.0000 +vn 0.5875 0.5565 0.5875 +vn -0.7071 -0.7071 0.0000 +vn -0.9997 -0.0248 0.0000 +vn 0.2489 0.7595 0.6009 +vn 0.7335 0.6796 0.0000 +vn 0.3179 0.5565 0.7676 +vn 0.0984 0.9664 0.2376 +vn 0.0022 1.0000 0.0000 +vn 0.7377 0.6751 0.0000 +vn -0.9239 -0.3827 0.0000 +vn 0.9884 -0.1518 0.0000 +vn -0.7357 0.6772 0.0000 +vn -0.0194 0.0000 0.9998 +vn -0.7050 0.0000 0.7091 +vn 0.9973 0.0000 -0.0726 +vn -0.6911 0.0000 -0.7227 +vn 0.1652 0.0000 -0.9862 +vn -0.9930 0.0000 0.1180 +vn 0.7474 0.0000 0.6643 +vn 0.7215 0.0000 -0.6924 +vn -0.0432 0.0000 -0.9991 +vn 0.6336 0.0000 -0.7736 +vn -0.9986 0.0000 -0.0534 +vn 0.5336 0.0000 0.8457 +vn 0.1536 0.0000 0.9881 +vn -0.6648 0.0000 -0.7470 +vn -0.5901 0.0000 0.8073 +vn 0.9998 0.0000 0.0178 +vn 0.3687 0.1836 0.9112 +vn 0.7411 0.1645 0.6509 +vn 0.6925 0.2022 0.6925 +vn 0.0041 0.1384 -0.9904 +vn -0.3432 0.1329 -0.9298 +vn -0.3781 0.1539 -0.9129 +vn -0.2659 0.1476 0.9526 +vn -0.0038 0.1574 0.9875 +vn -0.3603 0.1804 0.9152 +vn 0.2843 0.1560 0.9460 +vn 0.2723 0.1278 -0.9537 +vn 0.3672 0.1536 -0.9174 +vn -0.7129 0.1744 0.6793 +vn -0.6895 0.2218 0.6895 +vn 0.6661 0.1616 -0.7281 +vn 0.6955 0.1798 -0.6955 +vn -0.9156 0.1751 0.3619 +vn 0.9111 0.1729 -0.3740 +vn -0.9843 0.1555 0.0828 +vn -0.9842 0.1766 0.0101 +vn 0.9895 0.1439 0.0117 +vn 0.9400 0.1527 -0.3050 +vn -0.8948 0.1652 -0.4148 +vn -0.9052 0.1998 -0.3750 +vn 0.9208 0.1528 0.3587 +vn 0.9888 0.1288 0.0749 +vn -0.6882 0.1631 -0.7069 +vn -0.9991 -0.0411 0.0000 +vn 0.0215 0.1156 -0.9930 +vn -0.0169 0.1329 0.9910 +vn -0.9345 0.1423 0.3262 +vn 0.9489 0.1269 0.2889 +vn -0.6608 0.1357 -0.7382 +s off +f 3/1/1 146/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 3/7/3 8/8/3 4/9/3 +f 2/10/4 5/6/4 1/3/4 +f 4/11/5 6/12/5 2/13/5 +f 1/14/6 7/15/6 3/16/6 +f 313/17/3 307/18/3 309/19/3 +f 124/20/6 123/21/6 122/22/6 +f 132/23/5 131/24/5 130/25/5 +f 124/20/3 129/26/3 125/27/3 +f 123/21/4 127/28/4 122/22/4 +f 122/22/2 126/29/2 124/20/2 +f 132/23/4 137/30/4 133/31/4 +f 131/24/3 135/32/3 130/25/3 +f 130/25/2 134/33/2 132/23/2 +f 138/34/4 144/35/4 142/36/4 +f 147/37/6 153/38/6 149/39/6 +f 4/40/1 148/41/1 3/1/1 +f 2/10/1 149/42/1 4/40/1 +f 1/3/1 147/43/1 2/10/1 +f 153/44/1 154/45/1 150/46/1 +f 148/47/5 151/48/5 146/49/5 +f 149/50/4 150/46/4 148/51/4 +f 146/52/3 152/53/3 147/54/3 +f 156/55/5 161/56/5 157/57/5 +f 151/58/1 156/59/1 152/53/1 +f 152/60/1 157/57/1 153/38/1 +f 150/61/1 155/62/1 151/48/1 +f 158/63/1 160/64/1 159/65/1 +f 154/66/6 159/65/6 155/62/6 +f 157/67/3 158/63/3 154/45/3 +f 155/68/4 160/64/4 156/59/4 +f 177/69/6 173/70/6 175/71/6 +f 175/72/3 174/73/3 176/74/3 +f 176/75/5 172/76/5 178/77/5 +f 178/78/4 171/79/4 177/80/4 +f 172/76/2 173/70/2 171/79/2 +f 216/81/2 215/82/2 217/83/2 +f 210/84/4 217/83/4 211/85/4 +f 212/86/5 216/81/5 210/87/5 +f 213/88/3 214/89/3 212/90/3 +f 211/91/6 215/82/6 213/92/6 +f 232/93/6 228/94/6 230/95/6 +f 230/96/3 229/97/3 231/98/3 +f 231/99/5 227/100/5 233/101/5 +f 233/102/4 226/103/4 232/104/4 +f 227/100/2 228/94/2 226/103/2 +f 240/105/2 239/106/2 241/107/2 +f 234/108/4 241/107/4 235/109/4 +f 236/110/5 240/105/5 234/111/5 +f 237/112/3 238/113/3 236/114/3 +f 235/115/6 239/106/6 237/116/6 +f 253/117/2 284/118/2 252/119/2 +f 254/120/2 285/121/2 253/117/2 +f 254/120/2 287/122/2 286/123/2 +f 256/124/2 287/122/2 255/125/2 +f 257/126/2 288/127/2 256/124/2 +f 242/128/2 289/129/2 257/126/2 +f 243/130/2 274/131/2 242/132/2 +f 244/133/2 275/134/2 243/130/2 +f 245/135/2 276/136/2 244/133/2 +f 245/135/2 278/137/2 277/138/2 +f 247/139/2 278/137/2 246/140/2 +f 248/141/2 279/142/2 247/139/2 +f 248/141/2 281/143/2 280/144/2 +f 249/145/2 282/146/2 281/143/2 +f 251/147/2 282/146/2 250/148/2 +f 251/147/2 284/118/2 283/149/2 +f 3/1/1 148/41/1 146/2/1 +f 6/4/2 8/150/2 7/5/2 +f 3/7/3 7/151/3 8/8/3 +f 2/10/4 6/4/4 5/6/4 +f 4/11/5 8/152/5 6/12/5 +f 1/14/6 5/153/6 7/15/6 +f 311/154/3 312/155/3 313/17/3 +f 313/17/3 306/156/3 307/18/3 +f 307/18/3 308/157/3 309/19/3 +f 309/19/3 310/158/3 311/154/3 +f 311/154/3 313/17/3 309/19/3 +f 124/20/6 125/27/6 123/21/6 +f 132/23/5 133/31/5 131/24/5 +f 124/20/3 126/159/3 129/26/3 +f 123/21/4 128/160/4 127/28/4 +f 122/22/2 127/161/2 126/29/2 +f 132/23/4 134/162/4 137/30/4 +f 131/24/3 136/163/3 135/32/3 +f 130/25/2 135/164/2 134/33/2 +f 140/165/4 139/166/4 138/34/4 +f 138/34/4 145/167/4 144/35/4 +f 144/35/4 143/168/4 142/36/4 +f 142/36/4 141/169/4 140/165/4 +f 140/165/4 138/34/4 142/36/4 +f 147/37/6 152/60/6 153/38/6 +f 4/40/1 149/42/1 148/41/1 +f 2/10/1 147/43/1 149/42/1 +f 1/3/1 146/2/1 147/43/1 +f 153/44/1 157/67/1 154/45/1 +f 148/47/5 150/61/5 151/48/5 +f 149/50/4 153/44/4 150/46/4 +f 146/52/3 151/58/3 152/53/3 +f 156/55/5 160/64/5 161/56/5 +f 151/58/1 155/68/1 156/59/1 +f 152/60/1 156/55/1 157/57/1 +f 150/61/1 154/66/1 155/62/1 +f 158/63/1 161/56/1 160/64/1 +f 154/66/6 158/63/6 159/65/6 +f 157/67/3 161/56/3 158/63/3 +f 155/68/4 159/65/4 160/64/4 +f 177/69/6 171/79/6 173/70/6 +f 175/72/3 173/70/3 174/73/3 +f 176/75/5 174/73/5 172/76/5 +f 178/78/4 172/76/4 171/79/4 +f 172/76/2 174/73/2 173/70/2 +f 216/81/2 214/89/2 215/82/2 +f 210/84/4 216/81/4 217/83/4 +f 212/86/5 214/89/5 216/81/5 +f 213/88/3 215/82/3 214/89/3 +f 211/91/6 217/83/6 215/82/6 +f 232/93/6 226/103/6 228/94/6 +f 230/96/3 228/94/3 229/97/3 +f 231/99/5 229/97/5 227/100/5 +f 233/102/4 227/100/4 226/103/4 +f 227/100/2 229/97/2 228/94/2 +f 240/105/2 238/113/2 239/106/2 +f 234/108/4 240/105/4 241/107/4 +f 236/110/5 238/113/5 240/105/5 +f 237/112/3 239/106/3 238/113/3 +f 235/115/6 241/107/6 239/106/6 +f 253/117/2 285/121/2 284/118/2 +f 254/120/2 286/123/2 285/121/2 +f 254/120/2 255/125/2 287/122/2 +f 256/124/2 288/127/2 287/122/2 +f 257/126/2 289/129/2 288/127/2 +f 242/128/2 274/170/2 289/129/2 +f 243/130/2 275/134/2 274/131/2 +f 244/133/2 276/136/2 275/134/2 +f 245/135/2 277/138/2 276/136/2 +f 245/135/2 246/140/2 278/137/2 +f 247/139/2 279/142/2 278/137/2 +f 248/141/2 280/144/2 279/142/2 +f 248/141/2 249/145/2 281/143/2 +f 249/145/2 250/148/2 282/146/2 +f 251/147/2 283/149/2 282/146/2 +f 251/147/2 252/119/2 284/118/2 +s 1 +f 11/171/7 26/172/8 10/173/8 +f 19/174/9 34/175/10 18/176/10 +f 12/177/11 27/178/7 11/171/7 +f 20/179/12 35/180/9 19/174/9 +f 13/181/6 28/182/11 12/177/11 +f 21/183/5 36/184/12 20/179/12 +f 14/185/13 29/186/6 13/181/6 +f 22/187/14 37/188/5 21/183/5 +f 15/189/15 30/190/13 14/185/13 +f 23/191/16 38/192/14 22/187/14 +f 16/193/17 31/194/15 15/189/15 +f 24/195/18 39/196/16 23/191/16 +f 17/197/4 32/198/17 16/193/17 +f 10/173/8 25/199/3 9/200/3 +f 9/201/3 40/202/18 24/195/18 +f 18/176/10 33/203/4 17/197/4 +f 51/204/9 202/205/19 50/206/10 +f 44/207/11 189/208/20 43/209/7 +f 51/204/9 205/210/21 206/211/22 +f 44/207/11 192/212/23 188/213/24 +f 53/214/5 205/210/21 52/215/12 +f 45/216/6 191/217/25 192/212/23 +f 54/218/14 204/219/26 53/214/5 +f 46/220/13 190/221/27 191/217/25 +f 54/218/14 207/222/28 209/223/29 +f 48/224/17 190/221/27 47/225/15 +f 56/226/18 207/222/28 55/227/16 +f 49/228/4 203/229/30 48/224/17 +f 41/230/3 187/231/31 208/232/32 +f 41/233/3 179/234/33 56/226/18 +f 49/228/4 202/205/19 193/235/34 +f 42/236/8 189/208/20 187/231/31 +f 57/237/35 61/238/36 58/239/37 +f 105/240/38 104/241/2 59/242/39 +f 105/240/38 60/243/40 57/237/35 +f 60/243/40 64/244/41 61/238/36 +f 59/245/39 104/246/2 62/247/42 +f 59/245/39 63/248/43 60/243/40 +f 62/249/42 104/250/2 65/251/44 +f 63/248/43 65/251/44 66/252/45 +f 63/248/43 67/253/46 64/244/41 +f 65/254/44 69/255/47 66/252/45 +f 67/253/46 69/255/47 70/256/48 +f 65/254/44 104/257/2 68/258/49 +f 68/259/49 72/260/50 69/255/47 +f 69/255/47 73/261/51 70/256/48 +f 68/259/49 104/262/2 71/263/52 +f 71/264/52 75/265/53 72/260/50 +f 72/260/50 76/266/54 73/261/51 +f 71/264/52 104/267/2 74/268/55 +f 74/269/55 78/270/56 75/265/53 +f 75/265/53 79/271/57 76/266/54 +f 74/269/55 104/272/2 77/273/58 +f 77/274/58 81/275/59 78/270/56 +f 79/271/57 81/275/59 82/276/60 +f 77/274/58 104/277/2 80/278/61 +f 82/276/60 84/279/62 85/280/63 +f 80/281/61 104/282/2 83/283/64 +f 80/281/61 84/279/62 81/275/59 +f 85/280/63 87/284/65 88/285/66 +f 83/286/64 104/287/2 86/288/67 +f 83/286/64 87/284/65 84/279/62 +f 88/285/66 90/289/68 91/290/69 +f 86/291/67 104/292/2 89/293/70 +f 86/291/67 90/289/68 87/284/65 +f 91/290/69 93/294/71 94/295/72 +f 89/296/70 104/297/2 92/298/73 +f 89/296/70 93/294/71 90/289/68 +f 94/295/72 96/299/74 97/300/75 +f 92/301/73 104/302/2 95/303/76 +f 93/294/71 95/303/76 96/299/74 +f 95/304/76 104/305/2 98/306/77 +f 321/307/78 112/308/79 111/309/80 +f 315/310/81 112/308/79 314/311/2 +f 95/304/76 99/312/82 96/299/74 +f 323/313/83 322/314/84 332/315/85 +f 97/300/75 99/312/82 100/316/86 +f 319/317/87 324/318/1 318/319/1 +f 320/320/6 111/309/80 326/321/88 +f 98/322/77 102/323/89 99/312/82 +f 316/324/5 106/325/90 315/310/81 +f 100/316/86 102/323/89 103/326/91 +f 98/322/77 104/327/2 101/328/92 +f 318/329/1 323/313/83 317/330/83 +f 320/320/6 325/331/87 319/317/87 +f 101/332/92 57/333/35 102/323/89 +f 103/326/91 57/333/35 58/334/37 +f 101/332/92 104/335/2 105/336/38 +f 114/337/81 329/338/93 327/339/94 +f 120/340/78 329/338/93 121/341/2 +f 118/342/87 110/343/87 113/344/95 +f 116/345/83 109/346/1 117/347/1 +f 115/348/5 327/339/94 328/349/96 +f 119/350/6 330/351/97 120/340/78 +f 117/352/1 110/343/87 118/342/87 +f 328/349/96 107/353/84 108/354/83 +f 164/355/15 224/356/98 223/357/99 +f 168/358/16 220/359/100 169/360/5 +f 167/361/3 222/362/101 218/363/102 +f 164/355/15 225/364/103 165/365/6 +f 170/366/9 224/356/98 163/367/4 +f 169/360/5 221/368/104 170/366/9 +f 168/358/16 218/363/102 219/369/105 +f 165/365/6 222/370/101 166/371/7 +f 195/372/16 185/373/106 181/374/107 +f 199/375/15 186/376/108 200/377/6 +f 198/378/4 162/379/109 182/380/110 +f 201/381/7 185/373/106 194/382/3 +f 201/381/7 186/376/108 184/383/111 +f 198/378/4 183/384/112 199/375/15 +f 197/385/9 180/386/113 162/387/109 +f 180/386/113 195/372/16 181/374/107 +f 304/388/114 270/389/115 303/390/116 +f 297/391/117 265/392/118 296/393/119 +f 273/394/120 305/395/121 290/396/122 +f 305/397/121 272/398/123 304/388/114 +f 264/399/124 297/391/117 298/400/125 +f 260/401/126 290/396/122 291/402/127 +f 269/403/128 298/400/125 299/404/129 +f 292/405/130 260/401/126 291/402/127 +f 300/406/131 269/403/128 299/404/129 +f 263/407/132 292/405/130 293/408/133 +f 301/409/134 268/410/135 300/406/131 +f 262/411/136 293/408/133 294/412/137 +f 302/413/138 267/414/139 301/409/134 +f 295/415/140 262/411/136 294/412/137 +f 270/389/115 302/413/138 303/390/116 +f 265/392/118 295/415/140 296/393/119 +f 11/171/7 27/178/7 26/172/8 +f 19/174/9 35/180/9 34/175/10 +f 12/177/11 28/182/11 27/178/7 +f 20/179/12 36/184/12 35/180/9 +f 13/181/6 29/186/6 28/182/11 +f 21/183/5 37/188/5 36/184/12 +f 14/185/13 30/190/13 29/186/6 +f 22/187/14 38/192/14 37/188/5 +f 15/189/15 31/194/15 30/190/13 +f 23/191/16 39/196/16 38/192/14 +f 16/193/17 32/198/17 31/194/15 +f 24/195/18 40/202/18 39/196/16 +f 17/197/4 33/203/4 32/198/17 +f 10/173/8 26/172/8 25/199/3 +f 9/201/3 25/416/3 40/202/18 +f 18/176/10 34/175/10 33/203/4 +f 51/204/9 206/211/22 202/205/19 +f 44/207/11 188/213/24 189/208/20 +f 51/204/9 52/215/12 205/210/21 +f 44/207/11 45/216/6 192/212/23 +f 53/214/5 204/219/26 205/210/21 +f 45/216/6 46/220/13 191/217/25 +f 54/218/14 209/223/29 204/219/26 +f 46/220/13 47/225/15 190/221/27 +f 54/218/14 55/227/16 207/222/28 +f 48/224/17 203/229/30 190/221/27 +f 56/226/18 179/234/33 207/222/28 +f 49/228/4 193/235/34 203/229/30 +f 41/230/3 42/236/8 187/231/31 +f 41/233/3 208/417/32 179/234/33 +f 49/228/4 50/206/10 202/205/19 +f 42/236/8 43/209/7 189/208/20 +f 57/237/35 60/243/40 61/238/36 +f 105/240/38 59/242/39 60/243/40 +f 60/243/40 63/248/43 64/244/41 +f 59/245/39 62/247/42 63/248/43 +f 63/248/43 62/249/42 65/251/44 +f 63/248/43 66/252/45 67/253/46 +f 65/254/44 68/258/49 69/255/47 +f 67/253/46 66/252/45 69/255/47 +f 68/259/49 71/263/52 72/260/50 +f 69/255/47 72/260/50 73/261/51 +f 71/264/52 74/268/55 75/265/53 +f 72/260/50 75/265/53 76/266/54 +f 74/269/55 77/273/58 78/270/56 +f 75/265/53 78/270/56 79/271/57 +f 77/274/58 80/278/61 81/275/59 +f 79/271/57 78/270/56 81/275/59 +f 82/276/60 81/275/59 84/279/62 +f 80/281/61 83/283/64 84/279/62 +f 85/280/63 84/279/62 87/284/65 +f 83/286/64 86/288/67 87/284/65 +f 88/285/66 87/284/65 90/289/68 +f 86/291/67 89/293/70 90/289/68 +f 91/290/69 90/289/68 93/294/71 +f 89/296/70 92/298/73 93/294/71 +f 94/295/72 93/294/71 96/299/74 +f 93/294/71 92/301/73 95/303/76 +f 321/307/78 314/311/2 112/308/79 +f 315/310/81 106/325/90 112/308/79 +f 95/304/76 98/306/77 99/312/82 +f 332/315/85 316/324/5 317/330/83 +f 317/330/83 323/313/83 332/315/85 +f 97/300/75 96/299/74 99/312/82 +f 319/317/87 325/331/87 324/318/1 +f 320/320/6 321/307/78 111/309/80 +f 98/322/77 101/328/92 102/323/89 +f 316/324/5 332/315/85 106/325/90 +f 100/316/86 99/312/82 102/323/89 +f 318/329/1 324/418/1 323/313/83 +f 320/320/6 326/321/88 325/331/87 +f 101/332/92 105/336/38 57/333/35 +f 103/326/91 102/323/89 57/333/35 +f 114/337/81 121/341/2 329/338/93 +f 120/340/78 330/351/97 329/338/93 +f 331/419/141 119/350/6 113/344/95 +f 119/350/6 118/342/87 113/344/95 +f 116/345/83 108/354/83 109/346/1 +f 115/348/5 114/337/81 327/339/94 +f 119/350/6 331/419/141 330/351/97 +f 117/352/1 109/420/1 110/343/87 +f 108/354/83 116/345/83 328/349/96 +f 116/345/83 115/348/5 328/349/96 +f 164/355/15 163/367/4 224/356/98 +f 168/358/16 219/369/105 220/359/100 +f 167/361/3 166/421/7 222/362/101 +f 164/355/15 223/357/99 225/364/103 +f 170/366/9 221/368/104 224/356/98 +f 169/360/5 220/359/100 221/368/104 +f 168/358/16 167/361/3 218/363/102 +f 165/365/6 225/364/103 222/370/101 +f 195/372/16 194/382/3 185/373/106 +f 199/375/15 183/384/112 186/376/108 +f 198/378/4 197/422/9 162/379/109 +f 201/381/7 184/383/111 185/373/106 +f 201/381/7 200/377/6 186/376/108 +f 198/378/4 182/380/110 183/384/112 +f 197/385/9 196/423/5 180/386/113 +f 180/386/113 196/423/5 195/372/16 +f 304/388/114 272/398/123 270/389/115 +f 297/391/117 266/424/142 265/392/118 +f 273/394/120 259/425/143 305/395/121 +f 305/397/121 259/426/143 272/398/123 +f 264/399/124 266/424/142 297/391/117 +f 260/401/126 273/394/120 290/396/122 +f 269/403/128 264/399/124 298/400/125 +f 292/405/130 258/427/144 260/401/126 +f 300/406/131 268/410/135 269/403/128 +f 263/407/132 258/427/144 292/405/130 +f 301/409/134 267/414/139 268/410/135 +f 262/411/136 263/407/132 293/408/133 +f 302/413/138 271/428/145 267/414/139 +f 295/415/140 261/429/146 262/411/136 +f 270/389/115 271/428/145 302/413/138 +f 265/392/118 261/429/146 295/415/140 diff --git a/src/main/resources/assets/hbm/models/machines/centrifuge.obj b/src/main/resources/assets/hbm/models/machines/centrifuge.obj new file mode 100644 index 000000000..97732f95e --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/centrifuge.obj @@ -0,0 +1,953 @@ +# Blender v2.79 (sub 0) OBJ File: 'centrifuge.blend' +# www.blender.org +o Cube_Cube.001 +v -0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v 0.500000 0.125000 0.375000 +v 0.500000 0.875000 0.375000 +v 0.500000 0.125000 -0.375000 +v 0.500000 0.875000 -0.375000 +v -0.375000 0.000000 0.375000 +v -0.375000 0.000000 -0.375000 +v 0.375000 0.000000 0.375000 +v 0.375000 0.000000 -0.375000 +v -0.500000 0.125000 0.375000 +v -0.500000 0.875000 0.375000 +v -0.500000 0.125000 -0.375000 +v -0.500000 0.875000 -0.375000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.875000 0.500000 +v 0.375000 0.125000 0.500000 +v 0.375000 0.875000 0.500000 +v -0.375000 0.125000 -0.500000 +v -0.375000 0.875000 -0.500000 +v 0.375000 0.125000 -0.500000 +v 0.375000 0.875000 -0.500000 +v -0.375000 1.000000 0.375000 +v -0.375000 1.000000 -0.375000 +v 0.375000 1.000000 0.375000 +v 0.375000 1.000000 -0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v -0.312500 0.187500 -0.437500 +v -0.312500 0.812500 -0.437500 +v 0.312500 0.187500 -0.437500 +v 0.312500 0.812500 -0.437500 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v -0.187500 0.312500 -0.437500 +v -0.187500 0.687500 -0.437500 +v 0.187500 0.312500 -0.437500 +v 0.187500 0.687500 -0.437500 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.312500 -0.500000 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.687500 -0.500000 +v -0.437500 0.187500 0.312500 +v -0.437500 0.812500 0.312500 +v -0.437500 0.187500 -0.312500 +v -0.437500 0.812500 -0.312500 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v -0.375000 0.125000 -0.375000 +v -0.375000 0.875000 -0.375000 +v -0.437500 0.312500 0.187500 +v -0.437500 0.687500 0.187500 +v -0.437500 0.312500 -0.187500 +v -0.437500 0.687500 -0.187500 +v -0.500000 0.687500 0.187500 +v -0.500000 0.312500 0.187500 +v -0.500000 0.312500 -0.187500 +v -0.500000 0.687500 -0.187500 +v 0.312500 0.187500 0.437500 +v 0.312500 0.812500 0.437500 +v -0.312500 0.187500 0.437500 +v -0.312500 0.812500 0.437500 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v -0.375000 0.125000 0.375000 +v -0.375000 0.875000 0.375000 +v 0.187500 0.312500 0.437500 +v 0.187500 0.687500 0.437500 +v -0.187500 0.312500 0.437500 +v -0.187500 0.687500 0.437500 +v 0.187500 0.687500 0.500000 +v 0.187500 0.312500 0.500000 +v -0.187500 0.312500 0.500000 +v -0.187500 0.687500 0.500000 +v 0.437500 0.187500 -0.312500 +v 0.437500 0.812500 -0.312500 +v 0.437500 0.187500 0.312500 +v 0.437500 0.812500 0.312500 +v 0.375000 0.125000 -0.375000 +v 0.375000 0.875000 -0.375000 +v 0.375000 0.125000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.437500 0.312500 -0.187500 +v 0.437500 0.687500 -0.187500 +v 0.437500 0.312500 0.187500 +v 0.437500 0.687500 0.187500 +v 0.500000 0.687500 -0.187500 +v 0.500000 0.312500 -0.187500 +v 0.500000 0.312500 0.187500 +v 0.500000 0.687500 0.187500 +v 0.375000 0.937500 0.375000 +v 0.375000 0.937500 -0.375000 +v -0.375000 0.937500 -0.375000 +v -0.375000 0.937500 0.375000 +v 0.375000 0.062500 0.375000 +v 0.375000 0.062500 -0.375000 +v -0.375000 0.062500 0.375000 +v -0.375000 0.062500 -0.375000 +v 0.000000 3.687500 -0.375000 +v -0.143506 3.687500 -0.346455 +v -0.265165 3.687500 -0.265165 +v -0.346455 3.687500 -0.143506 +v -0.375000 3.687500 0.000000 +v -0.346455 3.687500 0.143506 +v -0.265165 3.687500 0.265165 +v -0.143506 3.687500 0.346455 +v -0.000000 3.687500 0.375000 +v 0.143506 3.687500 0.346455 +v 0.265165 3.687500 0.265165 +v 0.346455 3.687500 0.143506 +v 0.375000 3.687500 -0.000000 +v 0.346455 3.687500 -0.143506 +v 0.265165 3.687500 -0.265165 +v 0.143506 3.687500 -0.346455 +v -0.000000 3.687500 -0.312500 +v -0.119589 3.687500 -0.288712 +v -0.220971 3.687500 -0.220971 +v -0.288712 3.687500 -0.119589 +v -0.312500 3.687500 0.000000 +v -0.288712 3.687500 0.119589 +v -0.220971 3.687500 0.220971 +v -0.119589 3.687500 0.288712 +v -0.000000 3.687500 0.312500 +v 0.119588 3.687500 0.288712 +v 0.220971 3.687500 0.220971 +v 0.288712 3.687500 0.119589 +v 0.312500 3.687500 -0.000000 +v 0.288712 3.687500 -0.119589 +v 0.220971 3.687500 -0.220971 +v 0.119588 3.687500 -0.288712 +v -0.000000 3.937500 -0.312500 +v -0.119589 3.937500 -0.288712 +v -0.220971 3.937500 -0.220971 +v -0.288712 3.937500 -0.119589 +v -0.312500 3.937500 0.000000 +v -0.288712 3.937500 0.119589 +v -0.220971 3.937500 0.220971 +v -0.119589 3.937500 0.288712 +v -0.000000 3.937500 0.312500 +v 0.119588 3.937500 0.288712 +v 0.220971 3.937500 0.220971 +v 0.288712 3.937500 0.119589 +v 0.312500 3.937500 -0.000000 +v 0.288712 3.937500 -0.119589 +v 0.220971 3.937500 -0.220971 +v 0.119588 3.937500 -0.288712 +v -0.125000 3.937500 0.125000 +v 0.125000 3.937500 0.125000 +v -0.125000 3.937500 -0.125000 +v 0.125000 3.937500 -0.125000 +v -0.125000 4.000000 -0.125000 +v -0.125000 4.000000 0.125000 +v 0.125000 4.000000 0.125000 +v 0.125000 4.000000 -0.125000 +v 0.031250 4.000000 -0.125000 +v -0.031250 4.000000 -0.125000 +v 0.031250 4.000000 -0.375000 +v -0.031250 4.000000 -0.375000 +v -0.062500 4.000000 -0.125000 +v -0.125000 4.000000 -0.125000 +v -0.062500 4.000000 -0.375000 +v -0.125000 4.000000 -0.375000 +v 0.125000 4.000000 -0.125000 +v 0.062500 4.000000 -0.125000 +v 0.125000 4.000000 -0.375000 +v 0.062500 4.000000 -0.375000 +v 0.031250 3.937500 -0.437500 +v -0.031250 3.937500 -0.437500 +v -0.062500 3.937500 -0.437500 +v -0.125000 3.937500 -0.437500 +v 0.125000 3.937500 -0.437500 +v 0.062500 3.937500 -0.437500 +v 0.031250 1.000000 -0.437500 +v -0.031250 1.000000 -0.437500 +v -0.062500 1.000000 -0.437500 +v -0.125000 1.000000 -0.437500 +v 0.125000 1.000000 -0.437500 +v 0.062500 1.000000 -0.437500 +v 0.000000 0.937500 -0.375000 +v -0.143506 0.937500 -0.346455 +v -0.265165 0.937500 -0.265165 +v -0.346455 0.937500 -0.143506 +v -0.375000 0.937500 0.000000 +v -0.346455 0.937500 0.143506 +v -0.265165 0.937500 0.265165 +v -0.143506 0.937500 0.346455 +v -0.000000 0.937500 0.375000 +v 0.143506 0.937500 0.346455 +v 0.265165 0.937500 0.265165 +v 0.346455 0.937500 0.143506 +v 0.375000 0.937500 -0.000000 +v 0.346455 0.937500 -0.143506 +v 0.265165 0.937500 -0.265165 +v 0.143506 0.937500 -0.346455 +v 0.000000 3.687500 -0.375000 +v -0.143506 3.687500 -0.346455 +v -0.265165 3.687500 -0.265165 +v -0.346455 3.687500 -0.143506 +v -0.375000 3.687500 0.000000 +v -0.346455 3.687500 0.143506 +v -0.265165 3.687500 0.265165 +v -0.143506 3.687500 0.346455 +v -0.000000 3.687500 0.375000 +v 0.143506 3.687500 0.346455 +v 0.265165 3.687500 0.265165 +v 0.346455 3.687500 0.143506 +v 0.375000 3.687500 -0.000000 +v 0.346455 3.687500 -0.143506 +v 0.265165 3.687500 -0.265165 +v 0.143506 3.687500 -0.346455 +v -0.000000 3.687500 -0.312500 +v -0.119589 3.687500 -0.288712 +v -0.220971 3.687500 -0.220971 +v -0.288712 3.687500 -0.119589 +v -0.312500 3.687500 0.000000 +v -0.288712 3.687500 0.119589 +v -0.220971 3.687500 0.220971 +v -0.119589 3.687500 0.288712 +v -0.000000 3.687500 0.312500 +v 0.119588 3.687500 0.288712 +v 0.220971 3.687500 0.220971 +v 0.288712 3.687500 0.119589 +v 0.312500 3.687500 -0.000000 +v 0.288712 3.687500 -0.119589 +v 0.220971 3.687500 -0.220971 +v 0.119588 3.687500 -0.288712 +v -0.000000 3.937500 -0.312500 +v -0.119589 3.937500 -0.288712 +v -0.220971 3.937500 -0.220971 +v -0.288712 3.937500 -0.119589 +v -0.312500 3.937500 0.000000 +v -0.288712 3.937500 0.119589 +v -0.220971 3.937500 0.220971 +v -0.119589 3.937500 0.288712 +v -0.000000 3.937500 0.312500 +v 0.119588 3.937500 0.288712 +v 0.220971 3.937500 0.220971 +v 0.288712 3.937500 0.119589 +v 0.312500 3.937500 -0.000000 +v 0.288712 3.937500 -0.119589 +v 0.220971 3.937500 -0.220971 +v 0.119588 3.937500 -0.288712 +vt 0.036364 0.066667 +vt 0.054545 0.253333 +vt 0.036364 0.280000 +vt 0.063636 0.266667 +vt 0.190909 0.293333 +vt 0.045455 0.293333 +vt 0.272727 0.280000 +vt 0.254545 0.093333 +vt 0.272727 0.066667 +vt 0.063636 0.026667 +vt 0.190909 0.053333 +vt 0.045455 0.053333 +vt 0.172727 0.320000 +vt 0.290909 0.093333 +vt 0.272727 0.280000 +vt 0.272727 0.066667 +vt 0.200000 0.280000 +vt 0.181818 0.093333 +vt 0.200000 0.066667 +vt 0.190909 0.053333 +vt 0.063636 0.080000 +vt 0.045455 0.053333 +vt 0.290909 0.093333 +vt 0.272727 0.280000 +vt 0.272727 0.066667 +vt 0.254545 0.253333 +vt 0.272727 0.066667 +vt 0.272727 0.280000 +vt 0.172727 0.320000 +vt 0.045455 0.293333 +vt 0.190909 0.293333 +vt 0.172727 0.026667 +vt 0.254545 0.253333 +vt 0.290909 0.093333 +vt 0.018182 0.093333 +vt 0.018182 0.253333 +vt 0.036364 0.066667 +vt 0.036364 0.280000 +vt 0.218182 0.093333 +vt 0.200000 0.280000 +vt 0.200000 0.066667 +vt 0.254545 0.253333 +vt 0.290909 0.253333 +vt 0.218182 0.253333 +vt 0.181818 0.253333 +vt 0.172727 0.080000 +vt 0.063636 0.266667 +vt 0.054545 0.093333 +vt 0.309091 0.093333 +vt 0.290909 0.093333 +vt 0.236364 0.093333 +vt 0.218182 0.093333 +vt 0.254545 0.093333 +vt 0.236364 0.093333 +vt 0.218182 0.253333 +vt 0.172727 0.093333 +vt 0.181818 0.093333 +vt 0.063636 0.093333 +vt 0.172727 0.253333 +vt 0.063636 0.253333 +vt 0.054545 0.253333 +vt 0.181818 0.253333 +vt 0.172727 0.093333 +vt 0.054545 0.093333 +vt 0.063636 0.253333 +vt 0.172727 0.080000 +vt 0.063636 0.093333 +vt 0.309091 0.093333 +vt 0.290909 0.253333 +vt 0.172727 0.346667 +vt 0.063636 0.320000 +vt 0.063636 -0.000000 +vt 0.063636 0.026667 +vt 0.236364 0.253333 +vt 0.254545 0.093333 +vt 0.000000 0.253333 +vt 0.018182 0.253333 +vt 0.309091 0.253333 +vt 0.290909 0.253333 +vt 1.000000 0.853333 +vt 0.418182 0.000000 +vt 1.000000 0.000000 +vt -0.000000 0.253333 +vt 0.018182 0.093333 +vt 0.172727 0.253333 +vt 0.172727 0.266667 +vt 0.236364 0.093333 +vt 0.254545 0.093333 +vt 0.172727 0.346667 +vt 0.063636 0.320000 +vt 0.254545 0.253333 +vt 0.236364 0.093333 +vt 0.063636 -0.000000 +vt 0.172727 0.026667 +vt 0.309091 0.093333 +vt 0.290909 0.253333 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.409091 0.146667 +vt 0.318182 0.013333 +vt 0.409091 0.013333 +vt 0.418182 0.000000 +vt 0.309091 0.160000 +vt 0.318182 0.146667 +vt 0.309091 0.000000 +vt 0.372727 0.253333 +vt 0.318182 0.173333 +vt 0.372727 0.173333 +vt 0.381818 0.253333 +vt 0.381818 0.173333 +vt 0.309091 0.173333 +vt 0.318182 0.253333 +vt 0.309091 0.253333 +vt 0.372727 0.160000 +vt 0.318182 0.160000 +vt 0.318182 0.266667 +vt 0.372727 0.266667 +vt 0.172727 0.266667 +vt 0.063636 0.080000 +vt 0.272727 0.933333 +vt 0.290909 0.946667 +vt 0.272727 0.946667 +vt 0.018182 0.933333 +vt 0.000000 0.946667 +vt 0.000000 0.933333 +vt 0.036364 0.933333 +vt 0.018182 0.946667 +vt 0.054545 0.933333 +vt 0.036364 0.946667 +vt 0.072727 0.933333 +vt 0.054545 0.946667 +vt 0.090909 0.946667 +vt 0.072727 0.946667 +vt 0.090909 0.933333 +vt 0.109091 0.946667 +vt 0.109091 0.933333 +vt 0.127273 0.946667 +vt 0.127273 0.933333 +vt 0.145455 0.946667 +vt 0.145455 0.933333 +vt 0.163636 0.946667 +vt 0.163636 0.933333 +vt 0.181818 0.946667 +vt 0.181818 0.933333 +vt 0.200000 0.946667 +vt 0.200000 0.933333 +vt 0.218182 0.946667 +vt 0.236364 0.933333 +vt 0.218182 0.933333 +vt 0.254545 0.933333 +vt 0.236364 0.946667 +vt 0.254545 0.946667 +vt 0.336364 0.267132 +vt 0.368281 0.286522 +vt 0.381501 0.333333 +vt 0.300000 0.413333 +vt 0.336364 0.466667 +vt 0.300000 0.466667 +vt 0.345455 0.466667 +vt 0.336364 0.413333 +vt 0.345455 0.413333 +vt 0.290909 0.413333 +vt 0.290909 0.466667 +vt 0.336364 0.400000 +vt 0.300000 0.400000 +vt 0.300000 0.480000 +vt 0.336364 0.480000 +vt 0.390909 0.853333 +vt 0.400000 0.800000 +vt 0.400000 0.853333 +vt 0.400000 0.853333 +vt 0.409091 0.800000 +vt 0.409091 0.853333 +vt 0.381818 0.853333 +vt 0.390909 0.800000 +vt 0.390909 0.853333 +vt 0.381818 0.800000 +vt 0.390909 0.786667 +vt 0.400000 0.800000 +vt 0.409091 0.786667 +vt 0.390909 0.800000 +vt 0.400000 0.786667 +vt 0.381818 0.786667 +vt 0.390909 0.160000 +vt 0.400000 0.786667 +vt 0.409091 0.160000 +vt 0.390909 0.786667 +vt 0.400000 0.160000 +vt 0.309091 0.253333 +vt 0.236364 0.253333 +vt 0.236364 0.253333 +vt 0.309091 0.253333 +vt 0.063636 0.346667 +vt 0.172727 -0.000000 +vt 0.236364 0.093333 +vt 0.000000 0.093333 +vt 0.309091 0.093333 +vt 0.418182 0.853333 +vt -0.000000 0.093333 +vt 0.236364 0.253333 +vt 0.063636 0.346667 +vt 0.236364 0.253333 +vt 0.172727 -0.000000 +vt 0.309091 0.253333 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.418182 0.160000 +vt 0.290909 0.933333 +vt 0.378065 0.358668 +vt 0.336364 0.399535 +vt 0.368281 0.380145 +vt 0.353637 0.394496 +vt 0.319090 0.394496 +vt 0.304447 0.380145 +vt 0.294662 0.358668 +vt 0.291226 0.333333 +vt 0.294662 0.307999 +vt 0.304447 0.286522 +vt 0.319090 0.272171 +vt 0.353637 0.272171 +vt 0.378065 0.307999 +vt 0.381818 0.160000 +vt 0.400000 0.160000 +vt 0.390909 0.160000 +vt 0.163636 0.346667 +vt 0.145455 0.933333 +vt 0.145455 0.346667 +vt 0.036364 0.346667 +vt 0.018182 0.933333 +vt 0.018182 0.346667 +vt 0.181818 0.346667 +vt 0.163636 0.933333 +vt 0.054545 0.346667 +vt 0.036364 0.933333 +vt 0.200000 0.346667 +vt 0.181818 0.933333 +vt 0.072727 0.346667 +vt 0.054545 0.933333 +vt 0.218182 0.346667 +vt 0.200000 0.933333 +vt 0.090909 0.346667 +vt 0.072727 0.933333 +vt 0.236364 0.346667 +vt 0.218182 0.933333 +vt 0.109091 0.346667 +vt 0.090909 0.933333 +vt 0.254545 0.346667 +vt 0.236364 0.933333 +vt 0.127273 0.346667 +vt 0.109091 0.933333 +vt 0.272727 0.346667 +vt 0.254545 0.933333 +vt 0.127273 0.933333 +vt 0.000000 0.933333 +vt 0.000000 0.346667 +vt 0.290909 0.346667 +vt 0.272727 0.933333 +vt 0.236364 0.946667 +vt 0.218182 1.000000 +vt 0.218182 0.946667 +vt 0.109091 0.946667 +vt 0.090909 1.000000 +vt 0.090909 0.946667 +vt 0.254545 0.946667 +vt 0.236364 1.000000 +vt 0.127273 0.946667 +vt 0.109091 1.000000 +vt 0.272727 0.946667 +vt 0.254545 1.000000 +vt 0.145455 0.946667 +vt 0.127273 1.000000 +vt 0.018182 0.946667 +vt 0.000000 1.000000 +vt 0.000000 0.946667 +vt 0.290909 0.946667 +vt 0.272727 1.000000 +vt 0.163636 0.946667 +vt 0.145455 1.000000 +vt 0.036364 0.946667 +vt 0.018182 1.000000 +vt 0.181818 0.946667 +vt 0.163636 1.000000 +vt 0.054545 0.946667 +vt 0.036364 1.000000 +vt 0.200000 0.946667 +vt 0.181818 1.000000 +vt 0.072727 0.946667 +vt 0.054545 1.000000 +vt 0.200000 1.000000 +vt 0.072727 1.000000 +vt 0.290909 0.933333 +vt 0.290909 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.0000 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.3827 0.0000 0.9239 +vn -0.3827 0.0000 -0.9239 +vn -0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn -0.9239 0.0000 0.3827 +vn 0.9239 0.0000 -0.3827 +vn -0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +s off +f 1/1/1 15/2/1 5/3/1 +f 15/4/1 7/5/1 5/6/1 +f 8/7/2 11/8/2 7/9/2 +f 10/10/2 8/11/2 6/12/2 +f 11/13/2 5/6/2 7/5/2 +f 9/14/2 6/15/2 5/16/2 +f 7/17/1 14/18/1 3/19/1 +f 3/20/1 13/21/1 1/22/1 +f 19/23/3 4/24/3 3/25/3 +f 18/26/3 1/27/3 2/28/3 +f 20/29/3 2/30/3 4/31/3 +f 1/22/3 19/32/3 3/20/3 +f 24/33/4 5/16/4 6/15/4 +f 21/34/4 2/28/4 1/27/4 +f 5/3/4 21/35/4 1/1/4 +f 22/36/4 6/37/4 2/38/4 +f 28/39/5 4/40/5 8/41/5 +f 26/42/5 3/25/5 4/24/5 +f 7/9/5 28/43/5 8/7/5 +f 3/19/5 27/44/5 7/17/5 +f 30/45/6 8/41/6 4/40/6 +f 32/46/6 6/12/6 8/11/6 +f 29/47/6 4/31/6 2/30/6 +f 31/48/6 2/38/6 6/37/6 +f 39/49/3 28/43/3 27/50/3 +f 35/51/6 27/44/6 25/52/6 +f 26/42/2 35/51/2 25/53/2 +f 40/54/1 26/55/1 28/39/1 +f 30/45/4 106/56/4 32/57/4 +f 105/58/6 107/59/6 108/60/6 +f 31/48/5 108/60/5 29/61/5 +f 16/62/4 112/63/4 14/18/4 +f 13/64/5 109/65/5 15/2/5 +f 14/66/2 111/67/2 13/21/2 +f 35/68/4 20/69/4 19/23/4 +f 36/70/1 18/71/1 20/29/1 +f 33/72/6 19/32/6 17/73/6 +f 34/74/5 17/75/5 18/26/5 +f 37/76/6 21/35/6 23/77/6 +f 21/34/2 34/78/2 22/79/2 +f 110/80/1 111/81/1 112/82/1 +f 34/83/1 24/84/1 22/36/1 +f 15/4/3 110/85/3 16/86/3 +f 24/33/3 37/87/3 23/88/3 +f 39/89/6 9/90/6 11/13/6 +f 12/91/4 39/92/4 11/8/4 +f 38/93/1 12/94/1 10/10/1 +f 37/95/5 10/96/5 9/14/5 +f 42/97/5 43/98/5 41/99/5 +f 45/100/7 42/97/7 41/99/7 +f 42/97/8 48/101/8 44/102/8 +f 44/102/9 47/103/9 43/98/9 +f 43/98/10 45/100/10 41/99/10 +f 53/104/5 55/105/5 54/106/5 +f 50/107/3 54/106/3 49/108/3 +f 51/109/2 56/110/2 52/111/2 +f 49/112/1 55/105/1 51/113/1 +f 52/114/6 53/104/6 50/115/6 +f 58/116/3 59/117/3 57/118/3 +f 61/119/11 58/116/11 57/118/11 +f 58/116/12 64/120/12 60/121/12 +f 60/121/7 63/122/7 59/117/7 +f 59/117/13 61/119/13 57/118/13 +f 69/123/3 71/124/3 70/125/3 +f 66/126/4 70/125/4 65/127/4 +f 67/128/5 72/129/5 68/130/5 +f 65/131/1 71/124/1 67/132/1 +f 68/133/6 69/123/6 66/134/6 +f 74/135/4 75/136/4 73/137/4 +f 77/138/14 74/135/14 73/137/14 +f 74/135/15 80/139/15 76/140/15 +f 76/140/11 79/141/11 75/136/11 +f 75/136/16 77/138/16 73/137/16 +f 85/142/4 87/143/4 86/144/4 +f 82/145/2 86/144/2 81/146/2 +f 83/147/3 88/148/3 84/149/3 +f 81/150/1 87/143/1 83/151/1 +f 84/152/6 85/142/6 82/153/6 +f 90/154/2 91/155/2 89/156/2 +f 93/157/9 90/154/9 89/156/9 +f 90/154/17 96/158/17 92/159/17 +f 92/159/14 95/160/14 91/155/14 +f 91/155/18 93/157/18 89/156/18 +f 101/161/2 103/162/2 102/163/2 +f 98/164/5 102/163/5 97/165/5 +f 99/166/4 104/167/4 100/168/4 +f 97/169/1 103/162/1 99/170/1 +f 100/171/6 101/161/6 98/172/6 +f 29/47/2 107/59/2 30/173/2 +f 32/46/3 105/58/3 31/174/3 +f 128/175/6 129/176/6 144/177/6 +f 114/178/6 129/179/6 113/180/6 +f 115/181/6 130/182/6 114/178/6 +f 116/183/6 131/184/6 115/181/6 +f 117/185/6 132/186/6 116/183/6 +f 117/185/6 134/187/6 133/188/6 +f 118/189/6 135/190/6 134/187/6 +f 119/191/6 136/192/6 135/190/6 +f 120/193/6 137/194/6 136/192/6 +f 121/195/6 138/196/6 137/194/6 +f 122/197/6 139/198/6 138/196/6 +f 123/199/6 140/200/6 139/198/6 +f 124/201/6 141/202/6 140/200/6 +f 126/203/6 141/202/6 125/204/6 +f 127/205/6 142/206/6 126/203/6 +f 128/175/6 143/207/6 127/205/6 +f 157/208/6 159/209/6 145/210/6 +f 167/211/6 165/212/6 166/213/6 +f 163/214/5 168/215/5 164/216/5 +f 162/217/4 166/213/4 161/218/4 +f 164/219/2 167/211/2 162/220/2 +f 161/221/3 165/212/3 163/222/3 +f 169/223/6 172/224/6 170/225/6 +f 173/226/6 176/227/6 174/228/6 +f 177/229/6 180/230/6 178/231/6 +f 179/232/8 186/233/8 180/230/8 +f 175/234/8 184/235/8 176/227/8 +f 171/236/8 182/237/8 172/224/8 +f 185/238/5 192/239/5 186/233/5 +f 183/240/5 190/241/5 184/235/5 +f 181/242/5 188/243/5 182/237/5 +f 1/1/1 13/64/1 15/2/1 +f 15/4/1 16/86/1 7/5/1 +f 8/7/2 12/91/2 11/8/2 +f 10/10/2 12/94/2 8/11/2 +f 11/13/2 9/90/2 5/6/2 +f 9/14/2 10/96/2 6/15/2 +f 7/17/1 16/62/1 14/18/1 +f 3/20/1 14/66/1 13/21/1 +f 19/23/3 20/69/3 4/24/3 +f 18/26/3 17/75/3 1/27/3 +f 20/29/3 18/71/3 2/30/3 +f 1/22/3 17/73/3 19/32/3 +f 24/33/4 23/88/4 5/16/4 +f 21/34/4 22/79/4 2/28/4 +f 5/3/4 23/77/4 21/35/4 +f 22/36/4 24/84/4 6/37/4 +f 28/39/5 26/55/5 4/40/5 +f 26/42/5 25/53/5 3/25/5 +f 7/9/5 27/50/5 28/43/5 +f 3/19/5 25/52/5 27/44/5 +f 30/45/6 32/57/6 8/41/6 +f 32/46/6 31/174/6 6/12/6 +f 29/47/6 30/173/6 4/31/6 +f 31/48/6 29/61/6 2/38/6 +f 39/49/3 40/244/3 28/43/3 +f 35/51/6 39/245/6 27/44/6 +f 26/42/2 36/246/2 35/51/2 +f 40/54/1 36/246/1 26/55/1 +f 30/45/4 107/59/4 106/56/4 +f 105/58/6 106/56/6 107/59/6 +f 31/48/5 105/58/5 108/60/5 +f 16/62/4 110/85/4 112/63/4 +f 13/64/5 111/67/5 109/65/5 +f 14/66/2 112/63/2 111/67/2 +f 35/68/4 36/247/4 20/69/4 +f 36/70/1 34/248/1 18/71/1 +f 33/72/6 35/249/6 19/32/6 +f 34/74/5 33/250/5 17/75/5 +f 37/76/6 33/251/6 21/35/6 +f 21/34/2 33/252/2 34/78/2 +f 110/80/1 109/253/1 111/81/1 +f 34/83/1 38/254/1 24/84/1 +f 15/4/3 109/65/3 110/85/3 +f 24/33/3 38/255/3 37/87/3 +f 39/89/6 37/256/6 9/90/6 +f 12/91/4 40/257/4 39/92/4 +f 38/93/1 40/258/1 12/94/1 +f 37/95/5 38/259/5 10/96/5 +f 42/97/5 44/102/5 43/98/5 +f 45/100/7 46/260/7 42/97/7 +f 42/97/8 46/260/8 48/101/8 +f 44/102/9 48/101/9 47/103/9 +f 43/98/10 47/103/10 45/100/10 +f 53/104/5 56/110/5 55/105/5 +f 50/107/3 53/104/3 54/106/3 +f 51/109/2 55/105/2 56/110/2 +f 49/112/1 54/106/1 55/105/1 +f 52/114/6 56/110/6 53/104/6 +f 58/116/3 60/121/3 59/117/3 +f 61/119/11 62/261/11 58/116/11 +f 58/116/12 62/261/12 64/120/12 +f 60/121/7 64/120/7 63/122/7 +f 59/117/13 63/122/13 61/119/13 +f 69/123/3 72/129/3 71/124/3 +f 66/126/4 69/123/4 70/125/4 +f 67/128/5 71/124/5 72/129/5 +f 65/131/1 70/125/1 71/124/1 +f 68/133/6 72/129/6 69/123/6 +f 74/135/4 76/140/4 75/136/4 +f 77/138/14 78/262/14 74/135/14 +f 74/135/15 78/262/15 80/139/15 +f 76/140/11 80/139/11 79/141/11 +f 75/136/16 79/141/16 77/138/16 +f 85/142/4 88/148/4 87/143/4 +f 82/145/2 85/142/2 86/144/2 +f 83/147/3 87/143/3 88/148/3 +f 81/150/1 86/144/1 87/143/1 +f 84/152/6 88/148/6 85/142/6 +f 90/154/2 92/159/2 91/155/2 +f 93/157/9 94/263/9 90/154/9 +f 90/154/17 94/263/17 96/158/17 +f 92/159/14 96/158/14 95/160/14 +f 91/155/18 95/160/18 93/157/18 +f 101/161/2 104/167/2 103/162/2 +f 98/164/5 101/161/5 102/163/5 +f 99/166/4 103/162/4 104/167/4 +f 97/169/1 102/163/1 103/162/1 +f 100/171/6 104/167/6 101/161/6 +f 29/47/2 108/60/2 107/59/2 +f 32/46/3 106/56/3 105/58/3 +f 128/175/6 113/264/6 129/176/6 +f 114/178/6 130/182/6 129/179/6 +f 115/181/6 131/184/6 130/182/6 +f 116/183/6 132/186/6 131/184/6 +f 117/185/6 133/188/6 132/186/6 +f 117/185/6 118/189/6 134/187/6 +f 118/189/6 119/191/6 135/190/6 +f 119/191/6 120/193/6 136/192/6 +f 120/193/6 121/195/6 137/194/6 +f 121/195/6 122/197/6 138/196/6 +f 122/197/6 123/199/6 139/198/6 +f 123/199/6 124/201/6 140/200/6 +f 124/201/6 125/204/6 141/202/6 +f 126/203/6 142/206/6 141/202/6 +f 127/205/6 143/207/6 142/206/6 +f 128/175/6 144/177/6 143/207/6 +f 145/210/6 146/265/6 149/266/6 +f 146/265/6 147/267/6 149/266/6 +f 147/267/6 148/268/6 149/266/6 +f 149/266/6 150/269/6 151/270/6 +f 151/270/6 152/271/6 153/272/6 +f 153/272/6 154/273/6 155/274/6 +f 155/274/6 156/275/6 157/208/6 +f 157/208/6 158/276/6 159/209/6 +f 159/209/6 160/277/6 145/210/6 +f 149/266/6 151/270/6 145/210/6 +f 151/270/6 153/272/6 145/210/6 +f 153/272/6 155/274/6 145/210/6 +f 155/274/6 157/208/6 145/210/6 +f 167/211/6 168/215/6 165/212/6 +f 163/214/5 165/212/5 168/215/5 +f 162/217/4 167/211/4 166/213/4 +f 164/219/2 168/215/2 167/211/2 +f 161/221/3 166/213/3 165/212/3 +f 169/223/6 171/236/6 172/224/6 +f 173/226/6 175/234/6 176/227/6 +f 177/229/6 179/232/6 180/230/6 +f 179/232/8 185/238/8 186/233/8 +f 175/234/8 183/240/8 184/235/8 +f 171/236/8 181/242/8 182/237/8 +f 185/238/5 191/278/5 192/239/5 +f 183/240/5 189/279/5 190/241/5 +f 181/242/5 187/280/5 188/243/5 +s 1 +f 202/281/19 217/282/4 201/283/4 +f 195/284/7 210/285/20 194/286/20 +f 203/287/14 218/288/19 202/281/19 +f 196/289/21 211/290/7 195/284/7 +f 204/291/22 219/292/14 203/287/14 +f 197/293/3 212/294/21 196/289/21 +f 205/295/2 220/296/22 204/291/22 +f 198/297/23 213/298/3 197/293/3 +f 206/299/24 221/300/2 205/295/2 +f 199/301/11 214/302/23 198/297/23 +f 207/303/9 222/304/24 206/299/24 +f 200/305/25 215/306/11 199/301/11 +f 208/307/26 223/308/9 207/303/9 +f 201/283/4 216/309/25 200/305/25 +f 194/286/20 209/310/5 193/311/5 +f 193/312/5 224/313/26 208/307/26 +f 238/314/24 253/315/2 237/316/2 +f 231/317/11 246/318/23 230/319/23 +f 239/320/9 254/321/24 238/314/24 +f 232/322/25 247/323/11 231/317/11 +f 240/324/26 255/325/9 239/320/9 +f 233/326/4 248/327/25 232/322/25 +f 226/328/20 241/329/5 225/330/5 +f 225/331/5 256/332/26 240/324/26 +f 234/333/19 249/334/4 233/326/4 +f 227/335/7 242/336/20 226/328/20 +f 235/337/14 250/338/19 234/333/19 +f 228/339/21 243/340/7 227/335/7 +f 236/341/22 251/342/14 235/337/14 +f 229/343/3 244/344/21 228/339/21 +f 237/316/2 252/345/22 236/341/22 +f 230/319/23 245/346/3 229/343/3 +f 202/281/19 218/288/19 217/282/4 +f 195/284/7 211/290/7 210/285/20 +f 203/287/14 219/292/14 218/288/19 +f 196/289/21 212/294/21 211/290/7 +f 204/291/22 220/296/22 219/292/14 +f 197/293/3 213/298/3 212/294/21 +f 205/295/2 221/300/2 220/296/22 +f 198/297/23 214/302/23 213/298/3 +f 206/299/24 222/304/24 221/300/2 +f 199/301/11 215/306/11 214/302/23 +f 207/303/9 223/308/9 222/304/24 +f 200/305/25 216/309/25 215/306/11 +f 208/307/26 224/313/26 223/308/9 +f 201/283/4 217/282/4 216/309/25 +f 194/286/20 210/285/20 209/310/5 +f 193/312/5 209/347/5 224/313/26 +f 238/314/24 254/321/24 253/315/2 +f 231/317/11 247/323/11 246/318/23 +f 239/320/9 255/325/9 254/321/24 +f 232/322/25 248/327/25 247/323/11 +f 240/324/26 256/332/26 255/325/9 +f 233/326/4 249/334/4 248/327/25 +f 226/328/20 242/336/20 241/329/5 +f 225/331/5 241/348/5 256/332/26 +f 234/333/19 250/338/19 249/334/4 +f 227/335/7 243/340/7 242/336/20 +f 235/337/14 251/342/14 250/338/19 +f 228/339/21 244/344/21 243/340/7 +f 236/341/22 252/345/22 251/342/14 +f 229/343/3 245/346/3 244/344/21 +f 237/316/2 253/315/2 252/345/22 +f 230/319/23 246/318/23 245/346/3 diff --git a/src/main/resources/assets/hbm/models/machines/crucible.obj b/src/main/resources/assets/hbm/models/machines/crucible.obj new file mode 100644 index 000000000..14e9d2957 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/crucible.obj @@ -0,0 +1,646 @@ +# Blender v2.79 (sub 0) OBJ File: 'crucible.blend' +# www.blender.org +o Lava +v -1.000000 0.500000 -1.000000 +v -1.000000 0.500000 1.000000 +v 1.000000 0.500000 1.000000 +v 1.000000 0.500000 -1.000000 +vt 0.999900 0.000100 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.999900 +vn 0.0000 1.0000 0.0000 +s off +f 2/1/1 4/2/1 1/3/1 +f 2/1/1 3/4/1 4/2/1 +o Main +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.000000 1.500000 1.000000 +v 1.000000 1.500000 1.000000 +v -1.000000 1.500000 -1.000000 +v 1.000000 1.500000 -1.000000 +v -1.250000 1.500000 1.250000 +v 1.250000 1.500000 1.250000 +v -1.250000 1.500000 -1.250000 +v 1.250000 1.500000 -1.250000 +v -1.250000 0.500000 1.250000 +v 1.250000 0.500000 1.250000 +v -1.250000 0.500000 -1.250000 +v 1.250000 0.500000 -1.250000 +v -1.500000 0.250000 -1.500000 +v -1.500000 0.250000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.500000 0.250000 -1.500000 +v -1.000000 0.500000 -1.000000 +v -1.000000 0.500000 1.000000 +v 1.000000 0.500000 1.000000 +v 1.000000 0.500000 -1.000000 +v 1.250000 1.250000 0.875000 +v 1.250000 0.375000 0.875000 +v 1.250000 1.250000 0.625000 +v 1.250000 0.375000 0.625000 +v 1.375000 0.375000 0.875000 +v 1.375000 1.125000 0.875000 +v 1.375000 0.375000 0.625000 +v 1.375000 1.125000 0.625000 +v 1.250000 1.250000 -0.625000 +v 1.250000 0.375000 -0.625000 +v 1.250000 1.250000 -0.875000 +v 1.250000 0.375000 -0.875000 +v 1.375000 0.375000 -0.625000 +v 1.375000 1.125000 -0.625000 +v 1.375000 0.375000 -0.875000 +v 1.375000 1.125000 -0.875000 +v -1.250000 1.250000 -0.875000 +v -1.250000 0.375000 -0.875000 +v -1.250000 1.250000 -0.625000 +v -1.250000 0.375000 -0.625000 +v -1.375000 0.375000 -0.875000 +v -1.375000 1.125000 -0.875000 +v -1.375000 0.375000 -0.625000 +v -1.375000 1.125000 -0.625000 +v -1.250000 1.250000 0.625000 +v -1.250000 0.375000 0.625000 +v -1.250000 1.250000 0.875000 +v -1.250000 0.375000 0.875000 +v -1.375000 0.375000 0.625000 +v -1.375000 1.125000 0.625000 +v -1.375000 0.375000 0.875000 +v -1.375000 1.125000 0.875000 +v 0.875000 1.250000 -1.250000 +v 0.875000 0.375000 -1.250000 +v 0.625000 1.250000 -1.250000 +v 0.625000 0.375000 -1.250000 +v 0.875000 0.375000 -1.375000 +v 0.875000 1.125000 -1.375000 +v 0.625000 0.375000 -1.375000 +v 0.625000 1.125000 -1.375000 +v -0.625000 1.250000 -1.250000 +v -0.625000 0.375000 -1.250000 +v -0.875000 1.250000 -1.250000 +v -0.875000 0.375000 -1.250000 +v -0.625000 0.375000 -1.375000 +v -0.625000 1.125000 -1.375000 +v -0.875000 0.375000 -1.375000 +v -0.875000 1.125000 -1.375000 +v -0.875000 1.250000 1.250000 +v -0.875000 0.375000 1.250000 +v -0.625000 1.250000 1.250000 +v -0.625000 0.375000 1.250000 +v -0.875000 0.375000 1.375000 +v -0.875000 1.125000 1.375000 +v -0.625000 0.375000 1.375000 +v -0.625000 1.125000 1.375000 +v 0.625000 1.250000 1.250000 +v 0.625000 0.375000 1.250000 +v 0.875000 1.250000 1.250000 +v 0.875000 0.375000 1.250000 +v 0.625000 0.375000 1.375000 +v 0.625000 1.125000 1.375000 +v 0.875000 0.375000 1.375000 +v 0.875000 1.125000 1.375000 +v 1.500000 0.625000 0.125000 +v 1.500000 0.375000 0.125000 +v 1.500000 0.625000 -0.125000 +v 1.500000 0.375000 -0.125000 +v 1.500000 0.625000 0.187500 +v 1.500000 0.375000 0.187500 +v 1.500000 0.625000 -0.187500 +v 1.500000 0.375000 -0.187500 +v 1.500000 0.312500 0.125000 +v 1.500000 0.312500 -0.125000 +v 1.250000 0.875000 0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.875000 -0.125000 +v 1.250000 0.875000 0.187500 +v 1.250000 0.625000 0.187500 +v 1.250000 0.625000 -0.187500 +v 1.250000 0.875000 -0.187500 +v 1.250000 0.562500 0.125000 +v 1.250000 0.562500 -0.125000 +v -1.500000 0.625000 -0.125000 +v -1.500000 0.375000 -0.125000 +v -1.500000 0.625000 0.125000 +v -1.500000 0.375000 0.125000 +v -1.500000 0.625000 -0.187500 +v -1.500000 0.375000 -0.187500 +v -1.500000 0.625000 0.187500 +v -1.500000 0.375000 0.187500 +v -1.500000 0.312500 -0.125000 +v -1.500000 0.312500 0.125000 +v -1.250000 0.875000 -0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.625000 0.125000 +v -1.250000 0.875000 0.125000 +v -1.250000 0.875000 -0.187500 +v -1.250000 0.625000 -0.187500 +v -1.250000 0.625000 0.187500 +v -1.250000 0.875000 0.187500 +v -1.250000 0.562500 -0.125000 +v -1.250000 0.562500 0.125000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v 1.250000 0.875000 0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.875000 -0.125000 +v -1.250000 0.875000 -0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.625000 0.125000 +v -1.250000 0.875000 0.125000 +vt 0.631579 0.428571 +vt 0.421053 0.142857 +vt 0.631579 0.000000 +vt 0.105263 0.964286 +vt 0.052632 0.642857 +vt 0.105263 0.678571 +vt 0.526316 0.964286 +vt 0.052632 1.000000 +vt 0.526316 0.678571 +vt 0.578947 1.000000 +vt 0.578947 0.642857 +vt 0.052632 0.642857 +vt 0.578947 0.500000 +vt 0.578947 0.642857 +vt 0.052632 0.642857 +vt 0.578947 0.500000 +vt 0.578947 0.642857 +vt 0.342105 0.553571 +vt 0.578947 0.642857 +vt 0.289474 0.553571 +vt 0.342105 0.553571 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.631579 0.428571 +vt 0.000000 0.464286 +vt 0.000000 0.428571 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.578947 0.500000 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.052632 0.500000 +vt 0.631579 0.464286 +vt 0.578947 0.500000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.105263 0.964286 +vt 0.526316 0.678571 +vt 0.526316 0.964286 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.578947 1.000000 +vt 1.000000 0.857143 +vt 1.000000 1.000000 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.605263 0.696429 +vt 0.657895 0.678571 +vt 0.657895 0.696429 +vt 0.605263 0.571429 +vt 0.657895 0.678571 +vt 0.605263 0.678571 +vt 0.605263 0.696429 +vt 0.657895 0.696429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.605263 0.571429 +vt 0.605263 0.678571 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.578947 0.571429 +vt 0.578947 0.696429 +vt 0.684211 0.571429 +vt 0.657895 0.571429 +vt 0.763158 0.741071 +vt 0.763158 0.732143 +vt 0.776316 0.741071 +vt 0.710526 0.857143 +vt 0.697368 0.821429 +vt 0.710526 0.821429 +vt 0.763158 0.821429 +vt 0.776316 0.857143 +vt 0.763158 0.857143 +vt 0.763158 0.812500 +vt 0.710526 0.812500 +vt 0.776316 0.821429 +vt 0.710526 0.741071 +vt 0.697368 0.741071 +vt 0.710526 0.732143 +vt 0.776316 0.776786 +vt 0.763158 0.776786 +vt 0.710526 0.776786 +vt 0.776316 0.812500 +vt 0.763158 0.776786 +vt 0.776316 0.776786 +vt 0.644737 0.812500 +vt 0.697368 0.776786 +vt 0.697368 0.812500 +vt 0.631579 0.812500 +vt 0.578947 0.776786 +vt 0.631579 0.776786 +vt 0.828947 0.812500 +vt 0.842105 0.776786 +vt 0.842105 0.812500 +vt 0.644737 0.776786 +vt 0.710526 0.857143 +vt 0.710526 0.776786 +vt 0.894737 0.776786 +vt 0.894737 0.812500 +vt 0.828947 0.776786 +vt 0.776316 0.732143 +vt 0.763158 0.696429 +vt 0.776316 0.696429 +vt 0.644737 0.732143 +vt 0.697368 0.696429 +vt 0.697368 0.732143 +vt 0.631579 0.732143 +vt 0.578947 0.696429 +vt 0.631579 0.696429 +vt 0.828947 0.732143 +vt 0.842105 0.696429 +vt 0.842105 0.732143 +vt 0.644737 0.696429 +vt 0.710526 0.776786 +vt 0.710526 0.696429 +vt 0.894737 0.696429 +vt 0.894737 0.732143 +vt 0.828947 0.696429 +vt 0.421053 0.285714 +vt 0.000000 0.000000 +vt 0.210526 0.285714 +vt 0.210526 0.142857 +vt 0.657895 0.178571 +vt 0.868421 0.169643 +vt 0.868421 0.178571 +vt 0.881579 0.160714 +vt 0.868421 0.026786 +vt 0.881579 0.017857 +vt 0.868421 0.000000 +vt 0.657895 0.008929 +vt 0.657895 0.000000 +vt 0.894737 0.160714 +vt 0.894737 0.017857 +vt 0.631579 0.017857 +vt 0.644737 0.160714 +vt 0.631579 0.160714 +vt 0.671053 0.160714 +vt 0.855263 0.151786 +vt 0.855263 0.160714 +vt 0.644737 0.017857 +vt 0.657895 0.151786 +vt 0.657895 0.169643 +vt 0.868421 0.008929 +vt 0.671053 0.017857 +vt 0.671053 0.026786 +vt 0.855263 0.026786 +vt 0.855263 0.017857 +vt 0.868421 0.151786 +vt 0.657895 0.026786 +vt 0.671053 0.151786 +vt 0.631579 0.535714 +vt 0.578947 0.571429 +vt 0.578947 0.535714 +vt 0.289474 0.553571 +vt 0.342105 0.517857 +vt 0.631579 0.535714 +vt 0.578947 0.571429 +vt 0.578947 0.535714 +vt 0.052632 0.642857 +vt 0.342105 0.517857 +vt 0.578947 0.857143 +vt 0.105263 0.678571 +vt 0.578947 0.857143 +vt 0.578947 0.857143 +vt 0.578947 0.857143 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.684211 0.696429 +vt 0.697368 0.857143 +vt 0.697368 0.776786 +vt 0.578947 0.812500 +vt 0.763158 0.857143 +vt 0.578947 0.732143 +vt 0.763158 0.776786 +vt 0.631579 0.571429 +vt 0.289474 0.517857 +vt 0.631579 0.571429 +vt 0.289474 0.517857 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.5774 -0.5774 -0.5774 +vn -0.5774 -0.5774 0.5774 +vn -0.7071 -0.7071 0.0000 +vn 0.5774 -0.5774 0.5773 +vn 0.5774 -0.5774 -0.5774 +vn 0.7071 -0.7071 0.0000 +vn 0.5774 -0.5774 0.5774 +s off +f 8/5/2 135/6/2 7/7/2 +f 9/8/3 14/9/3 10/10/3 +f 11/11/3 13/12/3 9/8/3 +f 12/13/3 15/14/3 11/11/3 +f 10/10/3 16/15/3 12/13/3 +f 16/16/4 19/17/4 15/18/4 +f 13/19/5 18/20/5 14/21/5 +f 14/9/6 152/22/6 16/15/6 +f 13/23/7 153/24/7 156/25/7 +f 17/26/8 23/27/8 18/20/8 +f 8/5/6 23/28/6 6/29/6 +f 5/30/7 21/31/7 7/32/7 +f 7/33/4 24/34/4 8/35/4 +f 6/36/5 22/37/5 5/38/5 +f 18/39/9 24/40/9 20/41/9 +f 20/42/10 21/43/10 19/17/10 +f 19/44/11 22/45/11 17/46/11 +f 9/47/6 25/48/6 11/49/6 +f 26/50/3 28/51/3 25/52/3 +f 11/53/5 28/54/5 12/55/5 +f 10/56/4 26/57/4 9/58/4 +f 12/59/7 27/60/7 10/61/7 +f 37/62/9 44/63/9 39/64/9 +f 33/65/6 36/66/6 34/67/6 +f 29/68/9 36/66/9 31/69/9 +f 30/70/5 34/67/5 29/71/5 +f 41/72/6 44/63/6 42/73/6 +f 32/74/4 36/66/4 35/75/4 +f 38/76/5 42/73/5 37/77/5 +f 40/78/4 44/63/4 43/79/4 +f 53/80/11 60/81/11 55/82/11 +f 49/83/7 52/84/7 50/85/7 +f 45/86/11 52/84/11 47/87/11 +f 46/88/4 50/85/4 45/89/4 +f 57/90/7 60/81/7 58/91/7 +f 48/92/5 52/84/5 51/93/5 +f 54/94/4 58/91/4 53/95/4 +f 56/96/5 60/81/5 59/97/5 +f 69/98/10 76/99/10 71/100/10 +f 65/101/4 68/102/4 66/103/4 +f 61/104/10 68/102/10 63/105/10 +f 62/106/6 66/103/6 61/107/6 +f 73/108/4 76/99/4 74/109/4 +f 64/110/7 68/102/7 67/111/7 +f 70/112/6 74/109/6 69/113/6 +f 72/114/7 76/99/7 75/115/7 +f 85/116/8 92/117/8 87/118/8 +f 81/119/5 84/120/5 82/121/5 +f 77/122/8 84/120/8 79/123/8 +f 78/124/7 82/121/7 77/125/7 +f 89/126/5 92/117/5 90/127/5 +f 80/128/6 84/120/6 83/129/6 +f 86/130/7 90/127/7 85/131/7 +f 88/132/6 92/117/6 91/133/6 +f 116/134/7 122/135/7 120/136/7 +f 93/137/6 98/138/6 94/139/6 +f 96/140/6 99/141/6 95/142/6 +f 94/139/6 102/143/6 96/140/6 +f 94/139/6 98/138/6 101/144/6 +f 96/140/6 102/143/6 100/145/6 +f 114/146/7 118/147/7 121/148/7 +f 114/146/7 122/135/7 116/134/7 +f 116/134/7 119/149/7 115/150/7 +f 113/151/7 118/147/7 114/146/7 +f 100/152/12 112/153/12 109/154/12 +f 97/155/5 108/156/5 98/157/5 +f 93/158/4 104/159/4 103/160/4 +f 99/161/9 106/162/9 95/163/9 +f 93/158/9 107/164/9 97/155/9 +f 96/140/9 104/165/9 94/139/9 +f 98/157/13 111/166/13 101/144/13 +f 95/163/5 105/167/5 96/168/5 +f 101/144/14 112/153/14 102/143/14 +f 99/161/4 109/154/4 110/169/4 +f 120/170/15 132/171/15 129/172/15 +f 117/173/4 128/174/4 118/175/4 +f 113/176/5 124/177/5 123/178/5 +f 119/179/11 126/180/11 115/181/11 +f 113/176/11 127/182/11 117/173/11 +f 116/134/11 124/183/11 114/146/11 +f 118/175/16 131/184/16 121/148/16 +f 115/181/4 125/185/4 116/186/4 +f 121/148/17 132/171/17 122/135/17 +f 119/179/5 129/172/5 130/187/5 +f 6/29/2 136/188/2 8/5/2 +f 5/189/2 134/190/2 6/29/2 +f 7/7/2 133/191/2 5/189/2 +f 134/192/7 140/193/7 136/194/7 +f 140/195/2 141/196/2 137/197/2 +f 135/198/6 138/199/6 133/200/6 +f 136/201/5 137/197/5 135/202/5 +f 133/203/4 139/204/4 134/205/4 +f 143/206/6 148/207/6 144/208/6 +f 138/209/2 143/210/2 139/204/2 +f 139/211/2 144/208/2 140/193/2 +f 137/212/2 142/213/2 138/199/2 +f 148/207/2 146/214/2 145/215/2 +f 141/216/7 146/214/7 142/213/7 +f 144/217/4 145/215/4 141/196/4 +f 142/218/5 147/219/5 143/210/5 +f 151/220/6 149/221/6 150/222/6 +f 18/39/6 149/223/6 14/9/6 +f 151/224/6 18/39/6 20/41/6 +f 152/22/6 20/41/6 16/15/6 +f 155/225/7 153/226/7 154/227/7 +f 19/44/7 153/24/7 15/228/7 +f 155/229/7 19/44/7 17/46/7 +f 156/25/7 17/46/7 13/23/7 +f 8/5/2 136/188/2 135/6/2 +f 9/8/3 13/12/3 14/9/3 +f 11/11/3 15/14/3 13/12/3 +f 12/13/3 16/15/3 15/14/3 +f 10/10/3 14/9/3 16/15/3 +f 16/16/4 20/42/4 19/17/4 +f 13/19/5 17/26/5 18/20/5 +f 14/9/6 149/223/6 152/22/6 +f 13/23/7 15/228/7 153/24/7 +f 17/26/8 22/37/8 23/27/8 +f 8/5/6 24/40/6 23/28/6 +f 5/30/7 22/45/7 21/31/7 +f 7/33/4 21/43/4 24/34/4 +f 6/36/5 23/27/5 22/37/5 +f 18/39/9 23/28/9 24/40/9 +f 20/42/10 24/34/10 21/43/10 +f 19/44/11 21/31/11 22/45/11 +f 9/47/6 26/230/6 25/48/6 +f 26/50/3 27/231/3 28/51/3 +f 11/53/5 25/232/5 28/54/5 +f 10/56/4 27/233/4 26/57/4 +f 12/59/7 28/234/7 27/60/7 +f 37/62/9 42/73/9 44/63/9 +f 33/65/6 35/75/6 36/66/6 +f 29/68/9 34/67/9 36/66/9 +f 30/70/5 33/65/5 34/67/5 +f 41/72/6 43/79/6 44/63/6 +f 32/74/4 31/235/4 36/66/4 +f 38/76/5 41/72/5 42/73/5 +f 40/78/4 39/236/4 44/63/4 +f 53/80/11 58/91/11 60/81/11 +f 49/83/7 51/93/7 52/84/7 +f 45/86/11 50/85/11 52/84/11 +f 46/88/4 49/83/4 50/85/4 +f 57/90/7 59/97/7 60/81/7 +f 48/92/5 47/237/5 52/84/5 +f 54/94/4 57/90/4 58/91/4 +f 56/96/5 55/238/5 60/81/5 +f 69/98/10 74/109/10 76/99/10 +f 65/101/4 67/111/4 68/102/4 +f 61/104/10 66/103/10 68/102/10 +f 62/106/6 65/101/6 66/103/6 +f 73/108/4 75/115/4 76/99/4 +f 64/110/7 63/239/7 68/102/7 +f 70/112/6 73/108/6 74/109/6 +f 72/114/7 71/240/7 76/99/7 +f 85/116/8 90/127/8 92/117/8 +f 81/119/5 83/129/5 84/120/5 +f 77/122/8 82/121/8 84/120/8 +f 78/124/7 81/119/7 82/121/7 +f 89/126/5 91/133/5 92/117/5 +f 80/128/6 79/241/6 84/120/6 +f 86/130/7 89/126/7 90/127/7 +f 88/132/6 87/242/6 92/117/6 +f 93/137/6 97/243/6 98/138/6 +f 96/140/6 100/145/6 99/141/6 +f 94/139/6 101/144/6 102/143/6 +f 114/146/7 121/148/7 122/135/7 +f 116/134/7 120/136/7 119/149/7 +f 113/151/7 117/244/7 118/147/7 +f 100/152/12 102/143/12 112/153/12 +f 97/155/5 107/164/5 108/156/5 +f 93/158/4 94/245/4 104/159/4 +f 99/161/9 110/169/9 106/162/9 +f 93/158/9 103/160/9 107/164/9 +f 96/140/9 105/246/9 104/165/9 +f 98/157/13 108/156/13 111/166/13 +f 95/163/5 106/162/5 105/167/5 +f 101/144/14 111/166/14 112/153/14 +f 99/161/4 100/152/4 109/154/4 +f 120/170/18 122/135/18 132/171/18 +f 117/173/4 127/182/4 128/174/4 +f 113/176/5 114/247/5 124/177/5 +f 119/179/11 130/187/11 126/180/11 +f 113/176/11 123/178/11 127/182/11 +f 116/134/11 125/248/11 124/183/11 +f 118/175/16 128/174/16 131/184/16 +f 115/181/4 126/180/4 125/185/4 +f 121/148/17 131/184/17 132/171/17 +f 119/179/5 120/170/5 129/172/5 +f 6/29/2 134/190/2 136/188/2 +f 5/189/2 133/191/2 134/190/2 +f 7/7/2 135/6/2 133/191/2 +f 134/192/7 139/211/7 140/193/7 +f 140/195/2 144/217/2 141/196/2 +f 135/198/6 137/212/6 138/199/6 +f 136/201/5 140/195/5 137/197/5 +f 133/203/4 138/209/4 139/204/4 +f 143/206/6 147/219/6 148/207/6 +f 138/209/2 142/218/2 143/210/2 +f 139/211/2 143/206/2 144/208/2 +f 137/212/2 141/216/2 142/213/2 +f 148/207/2 147/219/2 146/214/2 +f 141/216/7 145/215/7 146/214/7 +f 144/217/4 148/207/4 145/215/4 +f 142/218/5 146/214/5 147/219/5 +f 151/220/6 152/249/6 149/221/6 +f 18/39/6 150/250/6 149/223/6 +f 151/224/6 150/250/6 18/39/6 +f 152/22/6 151/224/6 20/41/6 +f 155/225/7 156/251/7 153/226/7 +f 19/44/7 154/252/7 153/24/7 +f 155/229/7 154/252/7 19/44/7 +f 156/25/7 155/229/7 17/46/7 diff --git a/src/main/resources/assets/hbm/models/machines/electric_heater.obj b/src/main/resources/assets/hbm/models/machines/electric_heater.obj new file mode 100644 index 000000000..df504a052 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/electric_heater.obj @@ -0,0 +1,1140 @@ +# Blender v2.79 (sub 0) OBJ File: 'electric_heater.blend' +# www.blender.org +o Plane +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -1.500000 1.000000 -1.500000 +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 1.500000 +v 1.500000 1.000000 -1.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 0.937500 -0.500000 +v -0.500000 0.937500 0.500000 +v 0.500000 0.937500 0.500000 +v 0.500000 0.937500 -0.500000 +v -0.437500 0.937500 -0.437500 +v -0.437500 0.937500 0.437500 +v 0.437500 0.937500 0.437500 +v 0.437500 0.937500 -0.437500 +v -0.437500 1.000000 -0.437500 +v -0.437500 1.000000 0.437500 +v 0.437500 1.000000 0.437500 +v 0.437500 1.000000 -0.437500 +v 1.250000 0.125000 -1.500000 +v -1.250000 0.125000 -1.500000 +v 1.250000 0.875000 -1.500000 +v -1.250000 0.875000 -1.500000 +v -1.500000 0.125000 -1.250000 +v -1.500000 0.125000 1.250000 +v -1.500000 0.875000 -1.250000 +v -1.500000 0.875000 1.250000 +v -1.250000 0.125000 1.500000 +v 1.250000 0.125000 1.500000 +v -1.250000 0.875000 1.500000 +v 1.250000 0.875000 1.500000 +v 1.250000 0.125000 -1.250000 +v -1.250000 0.125000 -1.250000 +v 1.250000 0.875000 -1.250000 +v -1.250000 0.875000 -1.250000 +v -1.250000 0.125000 -1.250000 +v -1.250000 0.125000 1.250000 +v -1.250000 0.875000 -1.250000 +v -1.250000 0.875000 1.250000 +v -1.250000 0.125000 1.250000 +v 1.250000 0.125000 1.250000 +v -1.250000 0.875000 1.250000 +v 1.250000 0.875000 1.250000 +v -1.000000 0.531250 -1.250000 +v 1.000000 0.531250 -1.250000 +v -1.000000 0.468750 -1.250000 +v 1.000000 0.468750 -1.250000 +v -1.000000 0.468750 -1.625000 +v -1.000000 0.531250 -1.625000 +v 1.000000 0.531250 -1.625000 +v 1.000000 0.468750 -1.625000 +v -1.000000 0.625000 -1.250000 +v 1.000000 0.625000 -1.250000 +v -1.000000 0.562500 -1.250000 +v 1.000000 0.562500 -1.250000 +v -1.000000 0.562500 -1.625000 +v -1.000000 0.625000 -1.625000 +v 1.000000 0.625000 -1.625000 +v 1.000000 0.562500 -1.625000 +v -1.000000 0.437500 -1.250000 +v 1.000000 0.437500 -1.250000 +v -1.000000 0.375000 -1.250000 +v 1.000000 0.375000 -1.250000 +v -1.000000 0.375000 -1.625000 +v -1.000000 0.437500 -1.625000 +v 1.000000 0.437500 -1.625000 +v 1.000000 0.375000 -1.625000 +v -1.000000 0.343750 -1.250000 +v 1.000000 0.343750 -1.250000 +v -1.000000 0.281250 -1.250000 +v 1.000000 0.281250 -1.250000 +v -1.000000 0.281250 -1.625000 +v -1.000000 0.343750 -1.625000 +v 1.000000 0.343750 -1.625000 +v 1.000000 0.281250 -1.625000 +v -1.000000 0.250000 -1.250000 +v 1.000000 0.250000 -1.250000 +v -1.000000 0.187500 -1.250000 +v 1.000000 0.187500 -1.250000 +v -1.000000 0.187500 -1.625000 +v -1.000000 0.250000 -1.625000 +v 1.000000 0.250000 -1.625000 +v 1.000000 0.187500 -1.625000 +v -1.000000 0.812500 -1.250000 +v 1.000000 0.812500 -1.250000 +v -1.000000 0.750000 -1.250000 +v 1.000000 0.750000 -1.250000 +v -1.000000 0.750000 -1.625000 +v -1.000000 0.812500 -1.625000 +v 1.000000 0.812500 -1.625000 +v 1.000000 0.750000 -1.625000 +v -1.000000 0.718750 -1.250000 +v 1.000000 0.718750 -1.250000 +v -1.000000 0.656250 -1.250000 +v 1.000000 0.656250 -1.250000 +v -1.000000 0.656250 -1.625000 +v -1.000000 0.718750 -1.625000 +v 1.000000 0.718750 -1.625000 +v 1.000000 0.656250 -1.625000 +v -1.250000 0.531250 1.000000 +v -1.250000 0.531250 -1.000000 +v -1.250000 0.468750 1.000000 +v -1.250000 0.468750 -1.000000 +v -1.625000 0.468750 1.000000 +v -1.625000 0.531250 1.000000 +v -1.625000 0.531250 -1.000000 +v -1.625000 0.468750 -1.000000 +v -1.250000 0.625000 1.000000 +v -1.250000 0.625000 -1.000000 +v -1.250000 0.562500 1.000000 +v -1.250000 0.562500 -1.000000 +v -1.625000 0.562500 1.000000 +v -1.625000 0.625000 1.000000 +v -1.625000 0.625000 -1.000000 +v -1.625000 0.562500 -1.000000 +v -1.250000 0.437500 1.000000 +v -1.250000 0.437500 -1.000000 +v -1.250000 0.375000 1.000000 +v -1.250000 0.375000 -1.000000 +v -1.625000 0.375000 1.000000 +v -1.625000 0.437500 1.000000 +v -1.625000 0.437500 -1.000000 +v -1.625000 0.375000 -1.000000 +v -1.250000 0.343750 1.000000 +v -1.250000 0.343750 -1.000000 +v -1.250000 0.281250 1.000000 +v -1.250000 0.281250 -1.000000 +v -1.625000 0.281250 1.000000 +v -1.625000 0.343750 1.000000 +v -1.625000 0.343750 -1.000000 +v -1.625000 0.281250 -1.000000 +v -1.250000 0.250000 1.000000 +v -1.250000 0.250000 -1.000000 +v -1.250000 0.187500 1.000000 +v -1.250000 0.187500 -1.000000 +v -1.625000 0.187500 1.000000 +v -1.625000 0.250000 1.000000 +v -1.625000 0.250000 -1.000000 +v -1.625000 0.187500 -1.000000 +v -1.250000 0.812500 1.000000 +v -1.250000 0.812500 -1.000000 +v -1.250000 0.750000 1.000000 +v -1.250000 0.750000 -1.000000 +v -1.625000 0.750000 1.000000 +v -1.625000 0.812500 1.000000 +v -1.625000 0.812500 -1.000000 +v -1.625000 0.750000 -1.000000 +v -1.250000 0.718750 1.000000 +v -1.250000 0.718750 -1.000000 +v -1.250000 0.656250 1.000000 +v -1.250000 0.656250 -1.000000 +v -1.625000 0.656250 1.000000 +v -1.625000 0.718750 1.000000 +v -1.625000 0.718750 -1.000000 +v -1.625000 0.656250 -1.000000 +v 1.000000 0.531250 1.250000 +v -1.000000 0.531250 1.250000 +v 1.000000 0.468750 1.250000 +v -1.000000 0.468750 1.250000 +v 1.000000 0.468750 1.625000 +v 1.000000 0.531250 1.625000 +v -1.000000 0.531250 1.625000 +v -1.000000 0.468750 1.625000 +v 1.000000 0.625000 1.250000 +v -1.000000 0.625000 1.250000 +v 1.000000 0.562500 1.250000 +v -1.000000 0.562500 1.250000 +v 1.000000 0.562500 1.625000 +v 1.000000 0.625000 1.625000 +v -1.000000 0.625000 1.625000 +v -1.000000 0.562500 1.625000 +v 1.000000 0.437500 1.250000 +v -1.000000 0.437500 1.250000 +v 1.000000 0.375000 1.250000 +v -1.000000 0.375000 1.250000 +v 1.000000 0.375000 1.625000 +v 1.000000 0.437500 1.625000 +v -1.000000 0.437500 1.625000 +v -1.000000 0.375000 1.625000 +v 1.000000 0.343750 1.250000 +v -1.000000 0.343750 1.250000 +v 1.000000 0.281250 1.250000 +v -1.000000 0.281250 1.250000 +v 1.000000 0.281250 1.625000 +v 1.000000 0.343750 1.625000 +v -1.000000 0.343750 1.625000 +v -1.000000 0.281250 1.625000 +v 1.000000 0.250000 1.250000 +v -1.000000 0.250000 1.250000 +v 1.000000 0.187500 1.250000 +v -1.000000 0.187500 1.250000 +v 1.000000 0.187500 1.625000 +v 1.000000 0.250000 1.625000 +v -1.000000 0.250000 1.625000 +v -1.000000 0.187500 1.625000 +v 1.000000 0.812500 1.250000 +v -1.000000 0.812500 1.250000 +v 1.000000 0.750000 1.250000 +v -1.000000 0.750000 1.250000 +v 1.000000 0.750000 1.625000 +v 1.000000 0.812500 1.625000 +v -1.000000 0.812500 1.625000 +v -1.000000 0.750000 1.625000 +v 1.000000 0.718750 1.250000 +v -1.000000 0.718750 1.250000 +v 1.000000 0.656250 1.250000 +v -1.000000 0.656250 1.250000 +v 1.000000 0.656250 1.625000 +v 1.000000 0.718750 1.625000 +v -1.000000 0.718750 1.625000 +v -1.000000 0.656250 1.625000 +v 1.750000 0.000000 1.500000 +v 1.750000 0.000000 -1.500000 +v 1.750000 1.000000 1.500000 +v 1.750000 1.000000 -1.500000 +v 2.250000 0.000000 1.500000 +v 2.250000 0.000000 -1.500000 +v 2.250000 1.000000 1.500000 +v 2.250000 1.000000 -1.500000 +v 2.312500 0.687500 0.187500 +v 2.312500 0.312500 0.187500 +v 2.312500 0.687500 -0.187500 +v 2.312500 0.312500 -0.187500 +v 2.500000 0.687500 -0.187500 +v 2.500000 0.687500 0.187500 +v 2.500000 0.312500 0.187500 +v 2.500000 0.312500 -0.187500 +v 2.250000 0.750000 0.250000 +v 2.250000 0.250000 0.250000 +v 2.250000 0.750000 -0.250000 +v 2.250000 0.250000 -0.250000 +v 2.312500 0.750000 -0.250000 +v 2.312500 0.750000 0.250000 +v 2.312500 0.250000 0.250000 +v 2.312500 0.250000 -0.250000 +v 1.750000 0.125000 1.250000 +v 1.750000 0.125000 -1.250000 +v 1.750000 0.875000 1.250000 +v 1.750000 0.875000 -1.250000 +v 1.500000 0.125000 1.250000 +v 1.500000 0.125000 -1.250000 +v 1.500000 0.875000 1.250000 +v 1.500000 0.875000 -1.250000 +v 2.250000 0.875000 1.375000 +v 2.250000 0.125000 1.375000 +v 2.250000 0.875000 0.625000 +v 2.250000 0.125000 0.625000 +v 2.375000 0.875000 0.625000 +v 2.375000 0.875000 1.375000 +v 2.375000 0.125000 1.375000 +v 2.375000 0.125000 0.625000 +v 2.250000 0.875000 -0.625000 +v 2.250000 0.125000 -0.625000 +v 2.250000 0.875000 -1.375000 +v 2.250000 0.125000 -1.375000 +v 2.375000 0.875000 -1.375000 +v 2.375000 0.875000 -0.625000 +v 2.375000 0.125000 -0.625000 +v 2.375000 0.125000 -1.375000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +vt 0.000000 0.375000 +vt 0.285714 0.250000 +vt 0.428571 0.375000 +vt 0.285714 0.625000 +vt 0.000000 0.500000 +vt 0.428571 0.500000 +vt 0.428571 0.875000 +vt 0.035714 0.890625 +vt 0.000000 0.875000 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.428571 0.875000 +vt 0.000000 0.875000 +vt 0.035714 0.984375 +vt 0.000000 1.000000 +vt 0.607143 0.804687 +vt 0.598214 0.679687 +vt 0.607143 0.679687 +vt 0.285714 0.750000 +vt 0.142857 0.750000 +vt 0.142857 0.625000 +vt 0.589286 0.671875 +vt 0.455357 0.679687 +vt 0.446429 0.671875 +vt 0.428571 0.679687 +vt 0.437500 0.804688 +vt 0.428571 0.804688 +vt 0.589286 0.664062 +vt 0.446429 0.664062 +vt 0.446429 0.820312 +vt 0.589286 0.812500 +vt 0.589286 0.820312 +vt 0.580357 0.679687 +vt 0.455357 0.687500 +vt 0.446429 0.812500 +vt 0.580357 0.804688 +vt 0.598214 0.804688 +vt 0.589286 0.687500 +vt 0.437500 0.679687 +vt 0.446429 0.796875 +vt 0.580357 0.796875 +vt 0.455357 0.796875 +vt 0.455357 0.804688 +vt 0.589286 0.796875 +vt 0.580357 0.687500 +vt 0.446429 0.687500 +vt 0.857143 0.601562 +vt 0.821429 0.507812 +vt 0.857143 0.507812 +vt 0.000000 0.875000 +vt 0.035714 0.984375 +vt 0.000000 1.000000 +vt 0.035714 0.890625 +vt 0.392857 0.984375 +vt 0.464286 0.632812 +vt 0.821429 0.601562 +vt 0.821429 0.632812 +vt 0.000000 1.000000 +vt 0.392857 0.984375 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.035714 0.984375 +vt 0.428571 0.507812 +vt 0.464286 0.601562 +vt 0.428571 0.601562 +vt 0.428571 0.875000 +vt 0.035714 0.890625 +vt 0.392857 0.984375 +vt 0.428571 1.000000 +vt 0.392857 0.890625 +vt 0.464286 0.601562 +vt 0.821429 0.601562 +vt 0.464286 0.632812 +vt 0.821429 0.632812 +vt 0.428571 0.507812 +vt 0.428571 0.601562 +vt 0.821429 0.476562 +vt 0.464286 0.507812 +vt 0.464286 0.476562 +vt 0.464286 0.601562 +vt 0.821429 0.507812 +vt 0.857143 0.601562 +vt 0.857143 0.507812 +vt 0.821429 0.476562 +vt 0.464286 0.507812 +vt 0.464286 0.476562 +vt 0.428571 0.507812 +vt 0.428571 0.601562 +vt 0.821429 0.507812 +vt 0.464286 0.507812 +vt 0.464286 0.632812 +vt 0.821429 0.601562 +vt 0.821429 0.632812 +vt 0.857143 0.601562 +vt 0.857143 0.507812 +vt 0.821429 0.476562 +vt 0.464286 0.476562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.767857 -0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.482143 0.054688 +vt 0.767857 0.046875 +vt 0.767857 0.054688 +vt 0.428571 0.046875 +vt 0.428571 0.054688 +vt 0.821429 0.054688 +vt 0.821429 0.046875 +vt 0.482143 0.000000 +vt 0.482143 0.046875 +vt 0.482143 0.101562 +vt 0.767857 0.101562 +vt 0.500000 0.351562 +vt 0.928571 0.476562 +vt 0.500000 0.476562 +vt 0.928571 0.164062 +vt 0.500000 0.289062 +vt 0.500000 0.164062 +vt 0.428571 0.164062 +vt 0.428571 0.289062 +vt 0.928571 0.289062 +vt 0.928571 0.351562 +vt 1.000000 0.289062 +vt 1.000000 0.164062 +vt 0.928571 0.101562 +vt 0.500000 0.101562 +vt 0.892857 0.632812 +vt 0.785714 0.664062 +vt 0.785714 0.632812 +vt 0.776786 0.687500 +vt 0.830357 0.734375 +vt 0.776786 0.734375 +vt 0.830357 0.664062 +vt 0.776786 0.664062 +vt 0.776786 0.757812 +vt 0.830357 0.757812 +vt 0.857143 0.734375 +vt 0.830357 0.687500 +vt 0.857143 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.734375 +vt 0.758929 0.765625 +vt 0.830357 0.828125 +vt 0.758929 0.828125 +vt 0.839286 0.828125 +vt 0.830357 0.765625 +vt 0.839286 0.765625 +vt 0.750000 0.765625 +vt 0.750000 0.828125 +vt 0.830357 0.757812 +vt 0.758929 0.757812 +vt 0.758929 0.835938 +vt 0.830357 0.835938 +vt 0.785714 0.632812 +vt 0.428571 0.664062 +vt 0.428571 0.632812 +vt 0.892857 0.632812 +vt 0.785714 0.664062 +vt 0.428571 0.632812 +vt 0.625000 0.679688 +vt 0.732143 0.773438 +vt 0.625000 0.773438 +vt 0.750000 0.773438 +vt 0.732143 0.679688 +vt 0.750000 0.679688 +vt 0.607143 0.679688 +vt 0.607143 0.773438 +vt 0.732143 0.664062 +vt 0.625000 0.664062 +vt 0.625000 0.789062 +vt 0.732143 0.789062 +vt 0.625000 0.679688 +vt 0.732143 0.773438 +vt 0.625000 0.773438 +vt 0.750000 0.773438 +vt 0.732143 0.679688 +vt 0.750000 0.679688 +vt 0.607143 0.679688 +vt 0.607143 0.773438 +vt 0.732143 0.664062 +vt 0.625000 0.664062 +vt 0.625000 0.789062 +vt 0.732143 0.789062 +vt 0.428571 0.679687 +vt 0.437500 0.804688 +vt 0.428571 0.804688 +vt 0.285714 0.125000 +vt 0.428571 -0.000000 +vt 0.142857 0.125000 +vt 0.000000 -0.000000 +vt 0.142857 0.250000 +vt 0.589286 0.671875 +vt 0.455357 0.679687 +vt 0.446429 0.671875 +vt 0.607143 0.804687 +vt 0.598214 0.679687 +vt 0.607143 0.679687 +vt 0.589286 0.664062 +vt 0.446429 0.664062 +vt 0.446429 0.820312 +vt 0.589286 0.812500 +vt 0.589286 0.820312 +vt 0.446429 0.687500 +vt 0.455357 0.796875 +vt 0.446429 0.796875 +vt 0.446429 0.812500 +vt 0.580357 0.804688 +vt 0.437500 0.679687 +vt 0.598214 0.804688 +vt 0.589286 0.687500 +vt 0.580357 0.687500 +vt 0.580357 0.796875 +vt 0.589286 0.796875 +vt 0.580357 0.679687 +vt 0.455357 0.687500 +vt 0.455357 0.804688 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.767857 0.000000 +vt 0.892857 0.664062 +vt 0.892857 0.664062 +vt 0.428571 0.664062 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +s off +f 2/1/1 268/2/1 4/3/1 +f 12/4/2 7/5/2 8/6/2 +f 4/3/3 7/5/3 2/1/3 +f 5/7/4 32/8/4 6/9/4 +f 4/10/5 27/11/5 8/12/5 +f 7/13/6 34/14/6 2/15/6 +f 11/16/6 16/17/6 12/18/6 +f 11/19/2 8/6/2 5/7/2 +f 9/20/2 5/7/2 6/9/2 +f 10/21/2 6/9/2 7/5/2 +f 16/22/2 19/23/2 15/24/2 +f 10/25/5 14/26/5 9/27/5 +f 12/28/4 15/24/4 10/29/4 +f 9/30/3 13/31/3 11/32/3 +f 20/33/3 23/34/3 19/23/3 +f 14/35/2 17/36/2 13/31/2 +f 13/37/2 20/38/2 16/17/2 +f 15/39/2 18/40/2 14/26/2 +f 23/34/2 21/41/2 22/42/2 +f 18/43/4 21/41/4 17/36/4 +f 17/44/5 24/45/5 20/38/5 +f 19/46/6 22/42/6 18/40/6 +f 25/47/4 39/48/4 27/49/4 +f 5/50/5 26/51/5 3/52/5 +f 8/12/5 28/53/5 5/50/5 +f 3/52/5 25/54/5 4/10/5 +f 30/55/2 41/56/2 29/57/2 +f 1/58/4 29/59/4 3/60/4 +f 3/60/4 31/61/4 5/7/4 +f 6/9/4 30/62/4 1/58/4 +f 33/63/3 47/64/3 35/65/3 +f 6/66/6 36/67/6 7/13/6 +f 2/15/6 33/68/6 1/69/6 +f 1/69/6 35/70/6 6/66/6 +f 38/71/5 39/48/5 37/72/5 +f 26/73/2 37/72/2 25/74/2 +f 28/75/3 38/71/3 26/76/3 +f 27/77/1 40/78/1 28/79/1 +f 42/80/4 43/81/4 41/56/4 +f 29/82/6 43/81/6 31/83/6 +f 31/84/1 44/85/1 32/86/1 +f 32/87/5 42/80/5 30/88/5 +f 46/89/6 47/64/6 45/90/6 +f 35/91/1 48/92/1 36/93/1 +f 36/94/4 46/89/4 34/95/4 +f 34/96/2 45/90/2 33/97/2 +f 63/98/5 61/99/5 62/100/5 +f 55/101/5 53/102/5 54/103/5 +f 52/104/3 55/101/3 50/105/3 +f 49/106/4 53/102/4 51/107/4 +f 51/108/1 56/109/1 52/110/1 +f 50/111/2 54/103/2 49/112/2 +f 60/113/3 63/98/3 58/114/3 +f 57/115/4 61/99/4 59/116/4 +f 59/117/1 64/118/1 60/119/1 +f 58/120/2 62/100/2 57/121/2 +f 71/122/5 69/123/5 70/124/5 +f 68/125/3 71/122/3 66/126/3 +f 65/127/4 69/123/4 67/128/4 +f 67/129/1 72/130/1 68/131/1 +f 66/132/2 70/124/2 65/133/2 +f 79/134/5 77/135/5 78/136/5 +f 76/137/3 79/134/3 74/138/3 +f 73/139/4 77/135/4 75/140/4 +f 75/141/1 80/142/1 76/143/1 +f 74/144/2 78/136/2 73/145/2 +f 87/146/5 85/147/5 86/148/5 +f 84/149/3 87/146/3 82/150/3 +f 81/151/4 85/147/4 83/152/4 +f 83/153/1 88/154/1 84/155/1 +f 82/156/2 86/148/2 81/157/2 +f 95/158/5 93/159/5 94/160/5 +f 92/161/3 95/158/3 90/162/3 +f 89/163/4 93/159/4 91/164/4 +f 91/165/1 96/166/1 92/167/1 +f 90/168/2 94/160/2 89/169/2 +f 103/170/5 101/171/5 102/172/5 +f 100/173/3 103/170/3 98/174/3 +f 97/175/4 101/171/4 99/176/4 +f 99/177/1 104/178/1 100/179/1 +f 98/180/2 102/172/2 97/181/2 +f 119/182/4 117/183/4 118/184/4 +f 111/185/4 109/186/4 110/187/4 +f 108/188/5 111/185/5 106/189/5 +f 105/190/6 109/186/6 107/191/6 +f 107/192/1 112/193/1 108/194/1 +f 106/195/2 110/187/2 105/196/2 +f 116/197/5 119/182/5 114/198/5 +f 113/199/6 117/183/6 115/200/6 +f 115/201/1 120/202/1 116/203/1 +f 114/204/2 118/184/2 113/205/2 +f 127/206/4 125/207/4 126/208/4 +f 124/209/5 127/206/5 122/210/5 +f 121/211/6 125/207/6 123/212/6 +f 123/213/1 128/214/1 124/215/1 +f 122/216/2 126/208/2 121/217/2 +f 135/218/4 133/219/4 134/220/4 +f 132/221/5 135/218/5 130/222/5 +f 129/223/6 133/219/6 131/224/6 +f 131/225/1 136/226/1 132/227/1 +f 130/228/2 134/220/2 129/229/2 +f 143/230/4 141/231/4 142/232/4 +f 140/233/5 143/230/5 138/234/5 +f 137/235/6 141/231/6 139/236/6 +f 139/237/1 144/238/1 140/239/1 +f 138/240/2 142/232/2 137/241/2 +f 151/242/4 149/243/4 150/244/4 +f 148/245/5 151/242/5 146/246/5 +f 145/247/6 149/243/6 147/248/6 +f 147/249/1 152/250/1 148/251/1 +f 146/252/2 150/244/2 145/253/2 +f 159/254/4 157/255/4 158/256/4 +f 156/257/5 159/254/5 154/258/5 +f 153/259/6 157/255/6 155/260/6 +f 155/261/1 160/262/1 156/263/1 +f 154/264/2 158/256/2 153/265/2 +f 175/266/6 173/267/6 174/268/6 +f 167/269/6 165/270/6 166/271/6 +f 164/272/4 167/269/4 162/273/4 +f 161/274/3 165/270/3 163/275/3 +f 164/276/1 165/270/1 168/277/1 +f 162/278/2 166/271/2 161/279/2 +f 172/280/4 175/266/4 170/281/4 +f 169/282/3 173/267/3 171/283/3 +f 172/284/1 173/267/1 176/285/1 +f 170/286/2 174/268/2 169/287/2 +f 183/288/6 181/289/6 182/290/6 +f 180/291/4 183/288/4 178/292/4 +f 177/293/3 181/289/3 179/294/3 +f 180/295/1 181/289/1 184/296/1 +f 178/297/2 182/290/2 177/298/2 +f 191/299/6 189/300/6 190/301/6 +f 188/302/4 191/299/4 186/303/4 +f 185/304/3 189/300/3 187/305/3 +f 188/306/1 189/300/1 192/307/1 +f 186/308/2 190/301/2 185/309/2 +f 199/310/6 197/311/6 198/312/6 +f 196/313/4 199/310/4 194/314/4 +f 193/315/3 197/311/3 195/316/3 +f 196/317/1 197/311/1 200/318/1 +f 194/319/2 198/312/2 193/320/2 +f 207/321/6 205/322/6 206/323/6 +f 204/324/4 207/321/4 202/325/4 +f 201/326/3 205/322/3 203/327/3 +f 204/328/1 205/322/1 208/329/1 +f 202/330/2 206/323/2 201/331/2 +f 215/332/6 213/333/6 214/334/6 +f 212/335/4 215/332/4 210/336/4 +f 209/337/3 213/333/3 211/338/3 +f 212/339/1 213/333/1 216/340/1 +f 210/341/2 214/334/2 209/342/2 +f 219/343/4 218/344/4 217/345/4 +f 222/346/3 223/347/3 221/348/3 +f 217/349/6 223/347/6 219/350/6 +f 219/343/2 224/351/2 220/352/2 +f 220/353/5 222/346/5 218/354/5 +f 218/355/1 221/348/1 217/356/1 +f 242/357/5 248/358/5 244/359/5 +f 231/360/3 229/361/3 230/362/3 +f 228/363/1 231/360/1 226/364/1 +f 225/365/2 229/361/2 227/366/2 +f 227/367/5 232/368/5 228/369/5 +f 226/370/6 230/362/6 225/371/6 +f 239/372/3 237/373/3 238/374/3 +f 235/375/5 240/376/5 236/377/5 +f 234/378/6 238/374/6 233/379/6 +f 236/380/1 239/372/1 234/381/1 +f 233/382/2 237/373/2 235/383/2 +f 241/384/1 246/385/1 242/386/1 +f 243/387/6 245/388/6 241/384/6 +f 248/358/2 243/389/2 244/359/2 +f 255/390/3 253/391/3 254/392/3 +f 251/393/5 256/394/5 252/395/5 +f 250/396/6 254/392/6 249/397/6 +f 252/398/1 255/390/1 250/399/1 +f 249/400/2 253/391/2 251/401/2 +f 263/402/3 261/403/3 262/404/3 +f 259/405/5 264/406/5 260/407/5 +f 258/408/6 262/404/6 257/409/6 +f 260/410/1 263/402/1 258/411/1 +f 257/412/2 261/403/2 259/413/2 +f 268/414/6 269/415/6 267/416/6 +f 4/3/1 267/417/1 3/418/1 +f 3/418/1 265/419/1 1/420/1 +f 1/420/1 266/421/1 2/1/1 +f 271/422/1 276/423/1 272/424/1 +f 265/425/5 271/426/5 266/427/5 +f 266/428/4 272/424/4 268/429/4 +f 267/430/3 270/431/3 265/432/3 +f 276/433/5 277/434/5 273/435/5 +f 269/436/1 274/437/1 270/431/1 +f 272/438/1 273/435/1 269/415/1 +f 270/439/1 275/440/1 271/426/1 +f 277/434/1 279/441/1 278/442/1 +f 274/443/6 279/441/6 275/440/6 +f 275/444/3 280/445/3 276/423/3 +f 273/446/4 278/442/4 274/437/4 +f 2/1/1 266/421/1 268/2/1 +f 12/4/2 10/21/2 7/5/2 +f 4/3/3 8/6/3 7/5/3 +f 5/7/4 31/61/4 32/8/4 +f 4/10/5 25/54/5 27/11/5 +f 7/13/6 36/67/6 34/14/6 +f 11/16/6 13/37/6 16/17/6 +f 11/19/2 12/4/2 8/6/2 +f 9/20/2 11/19/2 5/7/2 +f 10/21/2 9/20/2 6/9/2 +f 16/22/2 20/33/2 19/23/2 +f 10/25/5 15/39/5 14/26/5 +f 12/28/4 16/22/4 15/24/4 +f 9/30/3 14/35/3 13/31/3 +f 20/33/3 24/45/3 23/34/3 +f 14/35/2 18/43/2 17/36/2 +f 13/37/2 17/44/2 20/38/2 +f 15/39/2 19/46/2 18/40/2 +f 23/34/2 24/45/2 21/41/2 +f 18/43/4 22/42/4 21/41/4 +f 17/44/5 21/41/5 24/45/5 +f 19/46/6 23/34/6 22/42/6 +f 25/47/4 37/72/4 39/48/4 +f 5/50/5 28/53/5 26/51/5 +f 8/12/5 27/11/5 28/53/5 +f 3/52/5 26/51/5 25/54/5 +f 30/55/2 42/80/2 41/56/2 +f 1/58/4 30/62/4 29/59/4 +f 3/60/4 29/59/4 31/61/4 +f 6/9/4 32/8/4 30/62/4 +f 33/63/3 45/90/3 47/64/3 +f 6/66/6 35/70/6 36/67/6 +f 2/15/6 34/14/6 33/68/6 +f 1/69/6 33/68/6 35/70/6 +f 38/71/5 40/78/5 39/48/5 +f 26/73/2 38/71/2 37/72/2 +f 28/75/3 40/78/3 38/71/3 +f 27/77/1 39/48/1 40/78/1 +f 42/80/4 44/85/4 43/81/4 +f 29/82/6 41/56/6 43/81/6 +f 31/84/1 43/81/1 44/85/1 +f 32/87/5 44/85/5 42/80/5 +f 46/89/6 48/92/6 47/64/6 +f 35/91/1 47/64/1 48/92/1 +f 36/94/4 48/92/4 46/89/4 +f 34/96/2 46/89/2 45/90/2 +f 63/98/5 64/118/5 61/99/5 +f 55/101/5 56/109/5 53/102/5 +f 52/104/3 56/109/3 55/101/3 +f 49/106/4 54/103/4 53/102/4 +f 51/108/1 53/102/1 56/109/1 +f 50/111/2 55/101/2 54/103/2 +f 60/113/3 64/118/3 63/98/3 +f 57/115/4 62/100/4 61/99/4 +f 59/117/1 61/99/1 64/118/1 +f 58/120/2 63/98/2 62/100/2 +f 71/122/5 72/130/5 69/123/5 +f 68/125/3 72/130/3 71/122/3 +f 65/127/4 70/124/4 69/123/4 +f 67/129/1 69/123/1 72/130/1 +f 66/132/2 71/122/2 70/124/2 +f 79/134/5 80/142/5 77/135/5 +f 76/137/3 80/142/3 79/134/3 +f 73/139/4 78/136/4 77/135/4 +f 75/141/1 77/135/1 80/142/1 +f 74/144/2 79/134/2 78/136/2 +f 87/146/5 88/154/5 85/147/5 +f 84/149/3 88/154/3 87/146/3 +f 81/151/4 86/148/4 85/147/4 +f 83/153/1 85/147/1 88/154/1 +f 82/156/2 87/146/2 86/148/2 +f 95/158/5 96/166/5 93/159/5 +f 92/161/3 96/166/3 95/158/3 +f 89/163/4 94/160/4 93/159/4 +f 91/165/1 93/159/1 96/166/1 +f 90/168/2 95/158/2 94/160/2 +f 103/170/5 104/178/5 101/171/5 +f 100/173/3 104/178/3 103/170/3 +f 97/175/4 102/172/4 101/171/4 +f 99/177/1 101/171/1 104/178/1 +f 98/180/2 103/170/2 102/172/2 +f 119/182/4 120/202/4 117/183/4 +f 111/185/4 112/193/4 109/186/4 +f 108/188/5 112/193/5 111/185/5 +f 105/190/6 110/187/6 109/186/6 +f 107/192/1 109/186/1 112/193/1 +f 106/195/2 111/185/2 110/187/2 +f 116/197/5 120/202/5 119/182/5 +f 113/199/6 118/184/6 117/183/6 +f 115/201/1 117/183/1 120/202/1 +f 114/204/2 119/182/2 118/184/2 +f 127/206/4 128/214/4 125/207/4 +f 124/209/5 128/214/5 127/206/5 +f 121/211/6 126/208/6 125/207/6 +f 123/213/1 125/207/1 128/214/1 +f 122/216/2 127/206/2 126/208/2 +f 135/218/4 136/226/4 133/219/4 +f 132/221/5 136/226/5 135/218/5 +f 129/223/6 134/220/6 133/219/6 +f 131/225/1 133/219/1 136/226/1 +f 130/228/2 135/218/2 134/220/2 +f 143/230/4 144/238/4 141/231/4 +f 140/233/5 144/238/5 143/230/5 +f 137/235/6 142/232/6 141/231/6 +f 139/237/1 141/231/1 144/238/1 +f 138/240/2 143/230/2 142/232/2 +f 151/242/4 152/250/4 149/243/4 +f 148/245/5 152/250/5 151/242/5 +f 145/247/6 150/244/6 149/243/6 +f 147/249/1 149/243/1 152/250/1 +f 146/252/2 151/242/2 150/244/2 +f 159/254/4 160/262/4 157/255/4 +f 156/257/5 160/262/5 159/254/5 +f 153/259/6 158/256/6 157/255/6 +f 155/261/1 157/255/1 160/262/1 +f 154/264/2 159/254/2 158/256/2 +f 175/266/6 176/285/6 173/267/6 +f 167/269/6 168/277/6 165/270/6 +f 164/272/4 168/277/4 167/269/4 +f 161/274/3 166/271/3 165/270/3 +f 164/276/1 163/447/1 165/270/1 +f 162/278/2 167/269/2 166/271/2 +f 172/280/4 176/285/4 175/266/4 +f 169/282/3 174/268/3 173/267/3 +f 172/284/1 171/448/1 173/267/1 +f 170/286/2 175/266/2 174/268/2 +f 183/288/6 184/296/6 181/289/6 +f 180/291/4 184/296/4 183/288/4 +f 177/293/3 182/290/3 181/289/3 +f 180/295/1 179/449/1 181/289/1 +f 178/297/2 183/288/2 182/290/2 +f 191/299/6 192/307/6 189/300/6 +f 188/302/4 192/307/4 191/299/4 +f 185/304/3 190/301/3 189/300/3 +f 188/306/1 187/450/1 189/300/1 +f 186/308/2 191/299/2 190/301/2 +f 199/310/6 200/318/6 197/311/6 +f 196/313/4 200/318/4 199/310/4 +f 193/315/3 198/312/3 197/311/3 +f 196/317/1 195/451/1 197/311/1 +f 194/319/2 199/310/2 198/312/2 +f 207/321/6 208/329/6 205/322/6 +f 204/324/4 208/329/4 207/321/4 +f 201/326/3 206/323/3 205/322/3 +f 204/328/1 203/452/1 205/322/1 +f 202/330/2 207/321/2 206/323/2 +f 215/332/6 216/340/6 213/333/6 +f 212/335/4 216/340/4 215/332/4 +f 209/337/3 214/334/3 213/333/3 +f 212/339/1 211/453/1 213/333/1 +f 210/341/2 215/332/2 214/334/2 +f 219/343/4 220/352/4 218/344/4 +f 222/346/3 224/351/3 223/347/3 +f 217/349/6 221/348/6 223/347/6 +f 219/343/2 223/347/2 224/351/2 +f 220/353/5 224/351/5 222/346/5 +f 218/355/1 222/346/1 221/348/1 +f 242/357/5 246/454/5 248/358/5 +f 231/360/3 232/368/3 229/361/3 +f 228/363/1 232/368/1 231/360/1 +f 225/365/2 230/362/2 229/361/2 +f 227/367/5 229/361/5 232/368/5 +f 226/370/6 231/360/6 230/362/6 +f 239/372/3 240/376/3 237/373/3 +f 235/375/5 237/373/5 240/376/5 +f 234/378/6 239/372/6 238/374/6 +f 236/380/1 240/376/1 239/372/1 +f 233/382/2 238/374/2 237/373/2 +f 241/384/1 245/388/1 246/385/1 +f 243/387/6 247/455/6 245/388/6 +f 248/358/2 247/456/2 243/389/2 +f 255/390/3 256/394/3 253/391/3 +f 251/393/5 253/391/5 256/394/5 +f 250/396/6 255/390/6 254/392/6 +f 252/398/1 256/394/1 255/390/1 +f 249/400/2 254/392/2 253/391/2 +f 263/402/3 264/406/3 261/403/3 +f 259/405/5 261/403/5 264/406/5 +f 258/408/6 263/402/6 262/404/6 +f 260/410/1 264/406/1 263/402/1 +f 257/412/2 262/404/2 261/403/2 +f 268/414/6 272/438/6 269/415/6 +f 4/3/1 268/2/1 267/417/1 +f 3/418/1 267/417/1 265/419/1 +f 1/420/1 265/419/1 266/421/1 +f 271/422/1 275/444/1 276/423/1 +f 265/425/5 270/439/5 271/426/5 +f 266/428/4 271/422/4 272/424/4 +f 267/430/3 269/436/3 270/431/3 +f 276/433/5 280/445/5 277/434/5 +f 269/436/1 273/446/1 274/437/1 +f 272/438/1 276/433/1 273/435/1 +f 270/439/1 274/443/1 275/440/1 +f 277/434/1 280/445/1 279/441/1 +f 274/443/6 278/442/6 279/441/6 +f 275/444/3 279/441/3 280/445/3 +f 273/446/4 277/434/4 278/442/4 diff --git a/src/main/resources/assets/hbm/models/machines/sawmill.obj b/src/main/resources/assets/hbm/models/machines/sawmill.obj new file mode 100644 index 000000000..880f0f117 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/sawmill.obj @@ -0,0 +1,2296 @@ +# Blender v2.79 (sub 0) OBJ File: 'sawmill.blend' +# www.blender.org +o GearRight +v -0.687500 0.687500 -1.031250 +v -0.687500 0.687500 -1.218750 +v -0.437500 0.687500 -1.031250 +v -0.437500 0.687500 -1.218750 +v -0.129487 1.625000 -1.250000 +v -0.312500 1.808013 -1.250000 +v -0.562500 1.875000 -1.250000 +v -0.812500 1.808012 -1.250000 +v -0.995513 1.625000 -1.250000 +v -1.062500 1.375000 -1.250000 +v -0.995513 1.125000 -1.250000 +v -0.812500 0.941987 -1.250000 +v -0.562500 0.875000 -1.250000 +v -0.312500 0.941987 -1.250000 +v -0.062500 1.375000 -1.250000 +v -0.129487 1.125000 -1.250000 +v -0.129487 1.625000 -1.000000 +v -0.312500 1.808013 -1.000000 +v -0.562500 1.875000 -1.000000 +v -0.812500 1.808012 -1.000000 +v -0.995513 1.625000 -1.000000 +v -1.062500 1.375000 -1.000000 +v -0.995513 1.125000 -1.000000 +v -0.812500 0.941987 -1.000000 +v -0.562500 0.875000 -1.000000 +v -0.312500 0.941987 -1.000000 +v -0.129487 1.125000 -1.000000 +v -0.062500 1.375000 -1.000000 +v -0.687500 0.937500 -1.218750 +v -0.437500 0.937500 -1.218750 +v -0.687500 0.937500 -1.031250 +v -0.437500 0.937500 -1.031250 +v -0.437500 2.062500 -1.031250 +v -0.437500 2.062500 -1.218750 +v -0.687500 2.062500 -1.031250 +v -0.687500 2.062500 -1.218750 +v -0.437500 1.812500 -1.218750 +v -0.687500 1.812500 -1.218750 +v -0.437500 1.812500 -1.031250 +v -0.687500 1.812500 -1.031250 +v -0.029608 0.922997 -1.031250 +v -0.029608 0.922997 -1.218750 +v 0.095392 1.139503 -1.031250 +v 0.095392 1.139503 -1.218750 +v -0.246114 1.047997 -1.218750 +v -0.121114 1.264503 -1.218750 +v -0.246114 1.047997 -1.031250 +v -0.121114 1.264503 -1.031250 +v -1.095392 1.827003 -1.031250 +v -1.095392 1.827003 -1.218750 +v -1.220392 1.610497 -1.031250 +v -1.220392 1.610497 -1.218750 +v -0.878886 1.702003 -1.218750 +v -1.003886 1.485497 -1.218750 +v -0.878886 1.702003 -1.031250 +v -1.003886 1.485497 -1.031250 +v 0.095393 1.610497 -1.031250 +v 0.095393 1.610497 -1.218750 +v -0.029607 1.827003 -1.031250 +v -0.029607 1.827003 -1.218750 +v -0.121114 1.485497 -1.218750 +v -0.246114 1.702003 -1.218750 +v -0.121114 1.485497 -1.031250 +v -0.246114 1.702003 -1.031250 +v -1.220392 1.139503 -1.031250 +v -1.220392 1.139503 -1.218750 +v -1.095392 0.922997 -1.031250 +v -1.095392 0.922997 -1.218750 +v -1.003886 1.264503 -1.218750 +v -0.878886 1.047997 -1.218750 +v -1.003886 1.264503 -1.031250 +v -0.878886 1.047997 -1.031250 +v -0.237741 1.562500 -1.000000 +v -0.375000 1.699759 -1.000000 +v -0.562500 1.750000 -1.000000 +v -0.750000 1.699759 -1.000000 +v -0.887259 1.562500 -1.000000 +v -0.937500 1.375000 -1.000000 +v -0.887259 1.187500 -1.000000 +v -0.750000 1.050241 -1.000000 +v -0.562500 1.000000 -1.000000 +v -0.375000 1.050241 -1.000000 +v -0.237740 1.187500 -1.000000 +v -0.187500 1.375000 -1.000000 +v -0.237741 1.562500 -1.250000 +v -0.375000 1.699759 -1.250000 +v -0.562500 1.750000 -1.250000 +v -0.750000 1.699759 -1.250000 +v -0.887259 1.562500 -1.250000 +v -0.937500 1.375000 -1.250000 +v -0.887259 1.187500 -1.250000 +v -0.750000 1.050241 -1.250000 +v -0.562500 1.000000 -1.250000 +v -0.375000 1.050241 -1.250000 +v -0.187500 1.375000 -1.250000 +v -0.237740 1.187500 -1.250000 +v -0.345994 1.500000 -1.250000 +v -0.437500 1.591506 -1.250000 +v -0.562500 1.625000 -1.250000 +v -0.687500 1.591506 -1.250000 +v -0.779006 1.500000 -1.250000 +v -0.812500 1.375000 -1.250000 +v -0.779006 1.250000 -1.250000 +v -0.687500 1.158494 -1.250000 +v -0.562500 1.125000 -1.250000 +v -0.437500 1.158494 -1.250000 +v -0.312500 1.375000 -1.250000 +v -0.345994 1.250000 -1.250000 +v -0.345994 1.500000 -1.000000 +v -0.437500 1.591506 -1.000000 +v -0.562500 1.625000 -1.000000 +v -0.687500 1.591506 -1.000000 +v -0.779006 1.500000 -1.000000 +v -0.812500 1.375000 -1.000000 +v -0.779006 1.250000 -1.000000 +v -0.687500 1.158494 -1.000000 +v -0.562500 1.125000 -1.000000 +v -0.437500 1.158494 -1.000000 +v -0.345994 1.250000 -1.000000 +v -0.312500 1.375000 -1.000000 +v -0.437500 1.562500 -1.062500 +v -0.437500 1.562500 -1.187500 +v -0.687500 1.562500 -1.062500 +v -0.687500 1.562500 -1.187500 +v -0.437500 1.750000 -1.062500 +v -0.437500 1.750000 -1.187500 +v -0.687500 1.750000 -1.062500 +v -0.687500 1.750000 -1.187500 +v -0.462620 1.172997 -1.062500 +v -0.462620 1.172997 -1.187500 +v -0.337621 1.389503 -1.062500 +v -0.337620 1.389503 -1.187500 +v -0.300241 1.079247 -1.062500 +v -0.300241 1.079247 -1.187500 +v -0.175241 1.295753 -1.062500 +v -0.175241 1.295753 -1.187500 +v -0.787380 1.389503 -1.062500 +v -0.787380 1.389503 -1.187500 +v -0.662380 1.172997 -1.062500 +v -0.662380 1.172997 -1.187500 +v -0.949759 1.295753 -1.062500 +v -0.949759 1.295753 -1.187500 +v -0.824759 1.079247 -1.062500 +v -0.824759 1.079247 -1.187500 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.696429 +vt 0.598214 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.690476 0.767857 +vt 0.702381 0.732143 +vt 0.702381 0.767857 +vt 0.642857 0.767857 +vt 0.654762 0.732143 +vt 0.654762 0.767857 +vt 0.714286 0.732143 +vt 0.714286 0.767857 +vt 0.726190 0.732143 +vt 0.726190 0.767857 +vt 0.738095 0.732143 +vt 0.738095 0.767857 +vt 0.750000 0.732143 +vt 0.750000 0.767857 +vt 0.666667 0.732143 +vt 0.666667 0.767857 +vt 0.761905 0.732143 +vt 0.761905 0.767857 +vt 0.678571 0.732143 +vt 0.678571 0.767857 +vt 0.619048 0.767857 +vt 0.630952 0.732143 +vt 0.630952 0.767857 +vt 0.690476 0.732143 +vt 0.642857 0.732143 +vt 0.623435 0.679608 +vt 0.642857 0.662788 +vt 0.662280 0.679608 +vt 0.662280 0.786751 +vt 0.662280 0.820392 +vt 0.623435 0.820392 +vt 0.666667 0.705357 +vt 0.690476 0.732143 +vt 0.666667 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.690476 0.705357 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.830357 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.619048 0.732143 +vt 0.665285 0.696429 +vt 0.662280 0.713249 +vt 0.654071 0.725563 +vt 0.642857 0.730070 +vt 0.631644 0.725563 +vt 0.623435 0.713249 +vt 0.620430 0.696429 +vt 0.631644 0.667295 +vt 0.654071 0.667295 +vt 0.620430 0.803571 +vt 0.642857 0.769930 +vt 0.623435 0.786751 +vt 0.631644 0.774437 +vt 0.654071 0.774437 +vt 0.665284 0.803571 +vt 0.654071 0.832705 +vt 0.642857 0.837212 +vt 0.631644 0.832705 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vn 0.0000 -1.0000 0.0000 +vn -0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.7071 0.7071 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.9659 -0.2588 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.9659 0.2588 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.2588 -0.9659 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.8660 0.5000 0.0000 +vn -0.8660 -0.5000 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +s off +f 3/1/1 2/2/1 4/3/1 +f 19/4/2 8/5/2 20/6/2 +f 27/7/3 15/8/3 28/9/3 +f 20/10/4 9/11/4 21/12/4 +f 21/13/5 10/14/5 22/15/5 +f 22/16/6 11/17/6 23/18/6 +f 23/19/7 12/20/7 24/21/7 +f 28/22/8 5/23/8 17/24/8 +f 24/25/9 13/26/9 25/27/9 +f 17/28/10 6/29/10 18/30/10 +f 25/31/11 14/32/11 26/33/11 +f 18/34/12 7/35/12 19/36/12 +f 26/37/13 16/38/13 27/39/13 +f 35/40/14 34/41/14 36/42/14 +f 3/43/15 31/44/15 1/45/15 +f 2/2/16 30/46/16 4/3/16 +f 4/3/17 32/47/17 3/43/17 +f 1/45/18 29/48/18 2/49/18 +f 33/50/15 40/51/15 39/52/15 +f 34/41/16 38/53/16 36/42/16 +f 36/42/18 40/51/18 35/54/18 +f 33/50/17 37/55/17 34/56/17 +f 43/57/19 42/58/19 44/59/19 +f 51/60/20 50/61/20 52/62/20 +f 41/63/15 48/64/15 47/65/15 +f 42/58/16 46/66/16 44/59/16 +f 44/59/21 48/64/21 43/67/21 +f 41/63/22 45/68/22 42/69/22 +f 51/70/15 55/71/15 49/72/15 +f 52/62/16 53/73/16 54/74/16 +f 52/62/22 56/75/22 51/70/22 +f 49/72/21 53/76/21 50/77/21 +f 59/78/23 58/79/23 60/80/23 +f 67/81/24 66/82/24 68/83/24 +f 57/84/15 64/85/15 63/86/15 +f 58/79/16 62/87/16 60/80/16 +f 60/80/25 64/85/25 59/88/25 +f 57/84/26 61/89/26 58/90/26 +f 65/91/15 72/92/15 71/93/15 +f 66/82/16 70/94/16 68/83/16 +f 68/83/26 72/92/26 67/95/26 +f 65/91/25 69/96/25 66/97/25 +f 20/6/15 75/98/15 19/4/15 +f 27/39/15 82/99/15 26/37/15 +f 17/24/15 84/100/15 28/22/15 +f 24/21/15 79/101/15 23/19/15 +f 20/10/15 77/102/15 76/103/15 +f 27/7/15 84/104/15 83/105/15 +f 17/28/15 74/106/15 73/107/15 +f 25/27/15 80/108/15 24/25/15 +f 22/15/15 77/109/15 21/13/15 +f 18/34/15 75/110/15 74/111/15 +f 26/33/15 81/112/15 25/31/15 +f 23/18/15 78/113/15 22/16/15 +f 10/14/16 89/114/16 90/115/16 +f 6/116/16 87/117/16 7/35/16 +f 13/118/16 94/119/16 14/32/16 +f 10/120/16 91/121/16 11/17/16 +f 8/5/16 87/122/16 88/123/16 +f 14/124/16 96/125/16 16/38/16 +f 5/23/16 95/126/16 85/127/16 +f 11/128/16 92/129/16 12/20/16 +f 8/130/16 89/131/16 9/11/16 +f 16/132/16 95/133/16 15/8/16 +f 5/134/16 86/135/16 6/29/16 +f 12/136/16 93/137/16 13/26/16 +f 94/119/2 81/138/2 82/139/2 +f 96/125/4 82/140/4 83/141/4 +f 95/133/5 83/142/5 84/143/5 +f 85/127/6 84/144/6 73/145/6 +f 86/135/7 73/146/7 74/147/7 +f 87/117/9 74/148/9 75/149/9 +f 88/123/11 75/150/11 76/151/11 +f 77/152/13 88/153/13 76/154/13 +f 90/115/3 77/155/3 78/156/3 +f 91/121/8 78/157/8 79/158/8 +f 92/129/10 79/159/10 80/160/10 +f 93/137/12 80/161/12 81/162/12 +f 111/163/2 100/164/2 112/165/2 +f 119/166/3 107/167/3 120/168/3 +f 112/165/4 101/169/4 113/170/4 +f 113/170/5 102/171/5 114/172/5 +f 114/172/6 103/173/6 115/174/6 +f 115/174/7 104/175/7 116/176/7 +f 120/168/8 97/177/8 109/178/8 +f 116/176/9 105/179/9 117/180/9 +f 109/178/10 98/181/10 110/182/10 +f 117/183/11 106/184/11 118/185/11 +f 110/182/12 99/186/12 111/163/12 +f 118/185/13 108/187/13 119/166/13 +f 115/188/15 117/189/15 119/190/15 +f 103/191/16 101/192/16 97/193/16 +f 125/194/15 123/195/15 121/196/15 +f 128/197/16 122/198/16 124/199/16 +f 127/200/18 124/199/18 123/195/18 +f 126/201/17 121/202/17 122/198/17 +f 129/203/15 135/204/15 131/205/15 +f 136/206/16 130/207/16 132/208/16 +f 135/204/21 132/208/21 131/205/21 +f 134/209/22 129/210/22 130/207/22 +f 137/211/15 143/212/15 139/213/15 +f 144/214/16 138/215/16 140/216/16 +f 143/212/26 140/216/26 139/213/26 +f 142/217/25 137/218/25 138/215/25 +f 3/1/1 1/219/1 2/2/1 +f 19/4/2 7/220/2 8/5/2 +f 27/7/3 16/132/3 15/8/3 +f 20/10/4 8/130/4 9/11/4 +f 21/13/5 9/221/5 10/14/5 +f 22/16/6 10/120/6 11/17/6 +f 23/19/7 11/128/7 12/20/7 +f 28/22/8 15/222/8 5/23/8 +f 24/25/9 12/136/9 13/26/9 +f 17/28/10 5/134/10 6/29/10 +f 25/31/11 13/118/11 14/32/11 +f 18/34/12 6/116/12 7/35/12 +f 26/37/13 14/124/13 16/38/13 +f 35/40/14 33/223/14 34/41/14 +f 3/43/15 32/47/15 31/44/15 +f 2/2/16 29/224/16 30/46/16 +f 4/3/17 30/46/17 32/47/17 +f 1/45/18 31/44/18 29/48/18 +f 33/50/15 35/54/15 40/51/15 +f 34/41/16 37/225/16 38/53/16 +f 36/42/18 38/53/18 40/51/18 +f 33/50/17 39/52/17 37/55/17 +f 43/57/19 41/226/19 42/58/19 +f 51/60/20 49/227/20 50/61/20 +f 41/63/15 43/67/15 48/64/15 +f 42/58/16 45/228/16 46/66/16 +f 44/59/21 46/66/21 48/64/21 +f 41/63/22 47/65/22 45/68/22 +f 51/70/15 56/75/15 55/71/15 +f 52/62/16 50/61/16 53/73/16 +f 52/62/22 54/74/22 56/75/22 +f 49/72/21 55/71/21 53/76/21 +f 59/78/23 57/229/23 58/79/23 +f 67/81/24 65/230/24 66/82/24 +f 57/84/15 59/88/15 64/85/15 +f 58/79/16 61/231/16 62/87/16 +f 60/80/25 62/87/25 64/85/25 +f 57/84/26 63/86/26 61/89/26 +f 65/91/15 67/95/15 72/92/15 +f 66/82/16 69/232/16 70/94/16 +f 68/83/26 70/94/26 72/92/26 +f 65/91/25 71/93/25 69/96/25 +f 20/6/15 76/233/15 75/98/15 +f 27/39/15 83/234/15 82/99/15 +f 17/24/15 73/235/15 84/100/15 +f 24/21/15 80/236/15 79/101/15 +f 20/10/15 21/12/15 77/102/15 +f 27/7/15 28/9/15 84/104/15 +f 17/28/15 18/30/15 74/106/15 +f 25/27/15 81/237/15 80/108/15 +f 22/15/15 78/238/15 77/109/15 +f 18/34/15 19/36/15 75/110/15 +f 26/33/15 82/239/15 81/112/15 +f 23/18/15 79/240/15 78/113/15 +f 10/14/16 9/221/16 89/114/16 +f 6/116/16 86/241/16 87/117/16 +f 13/118/16 93/242/16 94/119/16 +f 10/120/16 90/243/16 91/121/16 +f 8/5/16 7/220/16 87/122/16 +f 14/124/16 94/244/16 96/125/16 +f 5/23/16 15/222/16 95/126/16 +f 11/128/16 91/245/16 92/129/16 +f 8/130/16 88/153/16 89/131/16 +f 16/132/16 96/246/16 95/133/16 +f 5/134/16 85/247/16 86/135/16 +f 12/136/16 92/248/16 93/137/16 +f 94/119/2 93/242/2 81/138/2 +f 96/125/4 94/244/4 82/140/4 +f 95/133/5 96/246/5 83/142/5 +f 85/127/6 95/126/6 84/144/6 +f 86/135/7 85/247/7 73/146/7 +f 87/117/9 86/241/9 74/148/9 +f 88/123/11 87/122/11 75/150/11 +f 77/152/13 89/131/13 88/153/13 +f 90/115/3 89/114/3 77/155/3 +f 91/121/8 90/243/8 78/157/8 +f 92/129/10 91/245/10 79/159/10 +f 93/137/12 92/248/12 80/161/12 +f 111/163/2 99/186/2 100/164/2 +f 119/166/3 108/187/3 107/167/3 +f 112/165/4 100/164/4 101/169/4 +f 113/170/5 101/169/5 102/171/5 +f 114/172/6 102/171/6 103/173/6 +f 115/174/7 103/173/7 104/175/7 +f 120/168/8 107/167/8 97/177/8 +f 116/176/9 104/175/9 105/179/9 +f 109/178/10 97/177/10 98/181/10 +f 117/183/11 105/249/11 106/184/11 +f 110/182/12 98/181/12 99/186/12 +f 118/185/13 106/184/13 108/187/13 +f 119/190/15 120/250/15 109/251/15 +f 109/251/15 110/252/15 111/253/15 +f 111/253/15 112/254/15 115/188/15 +f 112/254/15 113/255/15 115/188/15 +f 113/255/15 114/256/15 115/188/15 +f 115/188/15 116/257/15 117/189/15 +f 117/189/15 118/258/15 119/190/15 +f 119/190/15 109/251/15 115/188/15 +f 109/251/15 111/253/15 115/188/15 +f 97/193/16 107/259/16 105/260/16 +f 107/259/16 108/261/16 105/260/16 +f 108/261/16 106/262/16 105/260/16 +f 105/260/16 104/263/16 103/191/16 +f 103/191/16 102/264/16 101/192/16 +f 101/192/16 100/265/16 97/193/16 +f 100/265/16 99/266/16 97/193/16 +f 99/266/16 98/267/16 97/193/16 +f 105/260/16 103/191/16 97/193/16 +f 125/194/15 127/200/15 123/195/15 +f 128/197/16 126/201/16 122/198/16 +f 127/200/18 128/197/18 124/199/18 +f 126/201/17 125/268/17 121/202/17 +f 129/203/15 133/269/15 135/204/15 +f 136/206/16 134/209/16 130/207/16 +f 135/204/21 136/206/21 132/208/21 +f 134/209/22 133/270/22 129/210/22 +f 137/211/15 141/271/15 143/212/15 +f 144/214/16 142/217/16 138/215/16 +f 143/212/26 144/214/26 140/216/26 +f 142/217/25 141/272/25 137/218/25 +o GearLeft +v 0.797997 0.717108 -1.031250 +v 0.797997 0.717108 -1.218750 +v 1.014503 0.842108 -1.031250 +v 1.014503 0.842108 -1.218750 +v 0.812500 1.808013 -1.250000 +v 0.562500 1.875000 -1.250000 +v 0.312500 1.808013 -1.250000 +v 0.129487 1.625000 -1.250000 +v 0.062500 1.375000 -1.250000 +v 0.129487 1.125000 -1.250000 +v 0.312500 0.941987 -1.250000 +v 0.562500 0.875000 -1.250000 +v 0.812500 0.941987 -1.250000 +v 0.995513 1.125000 -1.250000 +v 0.995513 1.625000 -1.250000 +v 1.062500 1.375000 -1.250000 +v 0.812500 1.808013 -1.000000 +v 0.562500 1.875000 -1.000000 +v 0.312500 1.808013 -1.000000 +v 0.129487 1.625000 -1.000000 +v 0.062500 1.375000 -1.000000 +v 0.129487 1.125000 -1.000000 +v 0.312500 0.941987 -1.000000 +v 0.562500 0.875000 -1.000000 +v 0.812500 0.941987 -1.000000 +v 0.995513 1.125000 -1.000000 +v 1.062500 1.375000 -1.000000 +v 0.995513 1.625000 -1.000000 +v 0.672997 0.933614 -1.218750 +v 0.889503 1.058614 -1.218750 +v 0.672997 0.933614 -1.031250 +v 0.889503 1.058614 -1.031250 +v 0.327004 2.032893 -1.031250 +v 0.327004 2.032893 -1.218750 +v 0.110497 1.907893 -1.031250 +v 0.110497 1.907893 -1.218750 +v 0.452004 1.816386 -1.218750 +v 0.235497 1.691386 -1.218750 +v 0.452004 1.816386 -1.031250 +v 0.235497 1.691386 -1.031250 +v 1.250000 1.250000 -1.031250 +v 1.250000 1.250000 -1.218750 +v 1.250000 1.500000 -1.031250 +v 1.250000 1.500000 -1.218750 +v 1.000000 1.250000 -1.218750 +v 1.000000 1.500000 -1.218750 +v 1.000000 1.250000 -1.031250 +v 1.000000 1.500000 -1.031250 +v -0.125000 1.500000 -1.031250 +v -0.125000 1.500000 -1.218750 +v -0.125000 1.250000 -1.031250 +v -0.125000 1.250000 -1.218750 +v 0.125000 1.500000 -1.218750 +v 0.125000 1.250000 -1.218750 +v 0.125000 1.500000 -1.031250 +v 0.125000 1.250000 -1.031250 +v 1.014503 1.907892 -1.031250 +v 1.014503 1.907892 -1.218750 +v 0.797997 2.032892 -1.031250 +v 0.797997 2.032892 -1.218750 +v 0.889503 1.691386 -1.218750 +v 0.672997 1.816386 -1.218750 +v 0.889503 1.691386 -1.031250 +v 0.672997 1.816386 -1.031250 +v 0.110497 0.842108 -1.031250 +v 0.110497 0.842108 -1.218750 +v 0.327003 0.717108 -1.031250 +v 0.327003 0.717108 -1.218750 +v 0.235497 1.058614 -1.218750 +v 0.452003 0.933614 -1.218750 +v 0.235497 1.058614 -1.031250 +v 0.452003 0.933614 -1.031250 +v 0.750000 1.699759 -1.000000 +v 0.562500 1.750000 -1.000000 +v 0.375000 1.699759 -1.000000 +v 0.237741 1.562500 -1.000000 +v 0.187500 1.375000 -1.000000 +v 0.237741 1.187500 -1.000000 +v 0.375000 1.050241 -1.000000 +v 0.562500 1.000000 -1.000000 +v 0.750000 1.050241 -1.000000 +v 0.887260 1.187500 -1.000000 +v 0.937500 1.375000 -1.000000 +v 0.887260 1.562500 -1.000000 +v 0.750000 1.699759 -1.250000 +v 0.562500 1.750000 -1.250000 +v 0.375000 1.699759 -1.250000 +v 0.237741 1.562500 -1.250000 +v 0.187500 1.375000 -1.250000 +v 0.237741 1.187500 -1.250000 +v 0.375000 1.050241 -1.250000 +v 0.562500 1.000000 -1.250000 +v 0.750000 1.050241 -1.250000 +v 0.887260 1.187500 -1.250000 +v 0.887260 1.562500 -1.250000 +v 0.937500 1.375000 -1.250000 +v 0.687500 1.591506 -1.250000 +v 0.562500 1.625000 -1.250000 +v 0.437500 1.591506 -1.250000 +v 0.345994 1.500000 -1.250000 +v 0.312500 1.375000 -1.250000 +v 0.345994 1.250000 -1.250000 +v 0.437500 1.158494 -1.250000 +v 0.562500 1.125000 -1.250000 +v 0.687500 1.158494 -1.250000 +v 0.779006 1.250000 -1.250000 +v 0.779006 1.500000 -1.250000 +v 0.812500 1.375000 -1.250000 +v 0.687500 1.591506 -1.000000 +v 0.562500 1.625000 -1.000000 +v 0.437500 1.591506 -1.000000 +v 0.345994 1.500000 -1.000000 +v 0.312500 1.375000 -1.000000 +v 0.345994 1.250000 -1.000000 +v 0.437500 1.158494 -1.000000 +v 0.562500 1.125000 -1.000000 +v 0.687500 1.158494 -1.000000 +v 0.779007 1.250000 -1.000000 +v 0.812500 1.375000 -1.000000 +v 0.779006 1.500000 -1.000000 +v 0.577003 1.599880 -1.062500 +v 0.577003 1.599880 -1.187500 +v 0.360497 1.474880 -1.062500 +v 0.360497 1.474880 -1.187500 +v 0.483254 1.762260 -1.062500 +v 0.483254 1.762260 -1.187500 +v 0.266747 1.637260 -1.062500 +v 0.266747 1.637260 -1.187500 +v 0.750000 1.250000 -1.062500 +v 0.750000 1.250000 -1.187500 +v 0.750000 1.500000 -1.062500 +v 0.750000 1.500000 -1.187500 +v 0.937500 1.250000 -1.062500 +v 0.937500 1.250000 -1.187500 +v 0.937500 1.500000 -1.062500 +v 0.937500 1.500000 -1.187500 +v 0.360497 1.275120 -1.062500 +v 0.360497 1.275120 -1.187500 +v 0.577003 1.150121 -1.062500 +v 0.577003 1.150121 -1.187500 +v 0.266747 1.112741 -1.062500 +v 0.266747 1.112741 -1.187500 +v 0.483253 0.987741 -1.062500 +v 0.483253 0.987741 -1.187500 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.595238 0.750000 +vt 0.619048 0.714286 +vt 0.619048 0.750000 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.708333 0.803571 +vt 0.732143 0.767857 +vt 0.732143 0.803571 +vt 0.666667 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.767857 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.690476 0.830357 +vt 0.666667 0.803571 +vt 0.690476 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.732143 0.803571 +vt 0.708333 0.767857 +vt 0.732143 0.767857 +vt 0.690476 0.767857 +vt 0.708333 0.803571 +vt 0.750000 0.767857 +vt 0.750000 0.803571 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.619048 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.767857 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.696429 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.595238 0.714286 +vt 0.616071 0.696429 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.598214 0.660714 +vt 0.616071 0.660714 +vt 0.690476 0.767857 +vt 0.702381 0.732143 +vt 0.702381 0.767857 +vt 0.642857 0.767857 +vt 0.654762 0.732143 +vt 0.654762 0.767857 +vt 0.714286 0.732143 +vt 0.714286 0.767857 +vt 0.726190 0.767857 +vt 0.726190 0.732143 +vt 0.738095 0.767857 +vt 0.738095 0.732143 +vt 0.750000 0.732143 +vt 0.750000 0.767857 +vt 0.666667 0.732143 +vt 0.666667 0.767857 +vt 0.761905 0.732143 +vt 0.761905 0.767857 +vt 0.678571 0.767857 +vt 0.678571 0.732143 +vt 0.619048 0.767857 +vt 0.630952 0.732143 +vt 0.630952 0.767857 +vt 0.690476 0.732143 +vt 0.642857 0.732143 +vt 0.623435 0.679608 +vt 0.642857 0.662788 +vt 0.662280 0.679608 +vt 0.662280 0.786751 +vt 0.662280 0.820392 +vt 0.623435 0.820392 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.732143 +vt 0.690476 0.705357 +vt 0.690476 0.732143 +vt 0.702381 0.705357 +vt 0.726190 0.732143 +vt 0.702381 0.732143 +vt 0.726190 0.705357 +vt 0.738095 0.732143 +vt 0.666667 0.830357 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.595238 0.714286 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.830357 +vt 0.666667 0.830357 +vt 0.666667 0.767857 +vt 0.666667 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.619048 0.767857 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.598214 0.696429 +vt 0.619048 0.732143 +vt 0.665285 0.696429 +vt 0.662280 0.713249 +vt 0.654071 0.725563 +vt 0.642857 0.730070 +vt 0.631644 0.725563 +vt 0.623435 0.713249 +vt 0.620430 0.696429 +vt 0.631644 0.667295 +vt 0.654071 0.667295 +vt 0.620430 0.803571 +vt 0.642857 0.769930 +vt 0.623435 0.786751 +vt 0.631644 0.774437 +vt 0.654071 0.774437 +vt 0.665284 0.803571 +vt 0.654071 0.832705 +vt 0.642857 0.837212 +vt 0.631644 0.832705 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vt 0.666667 0.705357 +vt 0.738095 0.705357 +vn 0.5000 -0.8660 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.9659 0.2588 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.9659 -0.2588 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.2588 -0.9659 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.8660 0.5000 0.0000 +vn -0.8660 -0.5000 0.0000 +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.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 -0.5000 0.0000 +s off +f 147/273/27 146/274/27 148/275/27 +f 163/276/28 152/277/28 164/278/28 +f 171/279/29 159/280/29 172/281/29 +f 164/282/30 153/283/30 165/284/30 +f 165/285/31 154/286/31 166/287/31 +f 166/288/32 155/289/32 167/290/32 +f 167/291/33 156/292/33 168/293/33 +f 172/294/34 149/295/34 161/296/34 +f 168/297/35 157/298/35 169/299/35 +f 161/300/36 150/301/36 162/302/36 +f 169/303/37 158/304/37 170/305/37 +f 162/306/38 151/307/38 163/308/38 +f 170/309/39 160/310/39 171/311/39 +f 179/312/40 178/313/40 180/314/40 +f 147/315/41 175/316/41 145/317/41 +f 148/275/42 173/318/42 174/319/42 +f 148/275/43 176/320/43 147/315/43 +f 145/317/44 173/321/44 146/322/44 +f 179/323/41 183/324/41 177/325/41 +f 180/314/42 181/326/42 182/327/42 +f 179/323/44 182/327/44 184/328/44 +f 177/325/43 181/329/43 178/330/43 +f 187/331/45 186/332/45 188/333/45 +f 195/334/46 194/335/46 196/336/46 +f 185/337/41 192/338/41 191/339/41 +f 186/332/42 190/340/42 188/333/42 +f 188/333/47 192/338/47 187/341/47 +f 185/337/48 189/342/48 186/343/48 +f 195/344/41 199/345/41 193/346/41 +f 196/336/42 197/347/42 198/348/42 +f 196/336/48 200/349/48 195/344/48 +f 193/346/47 197/350/47 194/351/47 +f 203/352/49 202/353/49 204/354/49 +f 211/355/50 210/356/50 212/357/50 +f 201/358/41 208/359/41 207/360/41 +f 202/353/42 206/361/42 204/354/42 +f 204/354/51 208/359/51 203/362/51 +f 201/358/52 205/363/52 202/364/52 +f 209/365/41 216/366/41 215/367/41 +f 210/356/42 214/368/42 212/357/42 +f 212/357/52 216/366/52 211/369/52 +f 209/365/51 213/370/51 210/371/51 +f 164/278/41 219/372/41 163/276/41 +f 171/311/41 226/373/41 170/309/41 +f 161/296/41 228/374/41 172/294/41 +f 167/291/41 224/375/41 223/376/41 +f 165/284/41 220/377/41 164/282/41 +f 172/281/41 227/378/41 171/279/41 +f 161/300/41 218/379/41 217/380/41 +f 169/299/41 224/381/41 168/297/41 +f 166/287/41 221/382/41 165/285/41 +f 163/308/41 218/383/41 162/306/41 +f 170/305/41 225/384/41 169/303/41 +f 167/290/41 222/385/41 166/288/41 +f 153/386/42 234/387/42 154/286/42 +f 150/388/42 231/389/42 151/307/42 +f 157/390/42 238/391/42 158/304/42 +f 154/392/42 235/393/42 155/289/42 +f 152/277/42 231/394/42 232/395/42 +f 158/396/42 240/397/42 160/310/42 +f 149/295/42 239/398/42 229/399/42 +f 155/400/42 236/401/42 156/292/42 +f 152/402/42 233/403/42 153/283/42 +f 159/280/42 240/404/42 239/405/42 +f 149/406/42 230/407/42 150/301/42 +f 156/408/42 237/409/42 157/298/42 +f 238/391/28 225/410/28 226/411/28 +f 240/397/30 226/412/30 227/413/30 +f 239/405/31 227/414/31 228/415/31 +f 229/399/32 228/416/32 217/417/32 +f 230/407/33 217/418/33 218/419/33 +f 231/389/35 218/420/35 219/421/35 +f 232/395/37 219/422/37 220/423/37 +f 233/403/39 220/424/39 221/425/39 +f 234/387/29 221/426/29 222/427/29 +f 235/393/34 222/428/34 223/429/34 +f 236/401/36 223/430/36 224/431/36 +f 237/409/38 224/432/38 225/433/38 +f 255/434/28 244/435/28 256/436/28 +f 263/437/29 251/438/29 264/439/29 +f 256/436/30 245/440/30 257/441/30 +f 258/442/31 245/440/31 246/443/31 +f 259/444/32 246/443/32 247/445/32 +f 259/444/33 248/446/33 260/447/33 +f 264/439/34 241/448/34 253/449/34 +f 260/447/35 249/450/35 261/451/35 +f 254/452/36 241/448/36 242/453/36 +f 261/454/37 250/455/37 262/456/37 +f 254/452/38 243/457/38 255/434/38 +f 262/456/39 252/458/39 263/437/39 +f 259/459/41 261/460/41 263/461/41 +f 247/462/42 245/463/42 241/464/42 +f 265/465/41 271/466/41 267/467/41 +f 272/468/42 266/469/42 268/470/42 +f 271/466/44 268/470/44 267/467/44 +f 270/471/43 265/472/43 266/469/43 +f 273/473/41 279/474/41 275/475/41 +f 280/476/42 274/477/42 276/478/42 +f 279/474/47 276/478/47 275/475/47 +f 278/479/48 273/480/48 274/477/48 +f 281/481/41 287/482/41 283/483/41 +f 288/484/42 282/485/42 284/486/42 +f 287/482/52 284/486/52 283/483/52 +f 286/487/51 281/488/51 282/485/51 +f 147/273/27 145/489/27 146/274/27 +f 163/276/28 151/490/28 152/277/28 +f 171/279/29 160/491/29 159/280/29 +f 164/282/30 152/402/30 153/283/30 +f 165/285/31 153/386/31 154/286/31 +f 166/288/32 154/392/32 155/289/32 +f 167/291/33 155/400/33 156/292/33 +f 172/294/34 159/492/34 149/295/34 +f 168/297/35 156/408/35 157/298/35 +f 161/300/36 149/406/36 150/301/36 +f 169/303/37 157/390/37 158/304/37 +f 162/306/38 150/388/38 151/307/38 +f 170/309/39 158/396/39 160/310/39 +f 179/312/40 177/493/40 178/313/40 +f 147/315/41 176/320/41 175/316/41 +f 148/275/42 146/274/42 173/318/42 +f 148/275/43 174/319/43 176/320/43 +f 145/317/44 175/316/44 173/321/44 +f 179/323/41 184/328/41 183/324/41 +f 180/314/42 178/313/42 181/326/42 +f 179/323/44 180/314/44 182/327/44 +f 177/325/43 183/324/43 181/329/43 +f 187/331/45 185/494/45 186/332/45 +f 195/334/46 193/495/46 194/335/46 +f 185/337/41 187/341/41 192/338/41 +f 186/332/42 189/496/42 190/340/42 +f 188/333/47 190/340/47 192/338/47 +f 185/337/48 191/339/48 189/342/48 +f 195/344/41 200/349/41 199/345/41 +f 196/336/42 194/335/42 197/347/42 +f 196/336/48 198/348/48 200/349/48 +f 193/346/47 199/345/47 197/350/47 +f 203/352/49 201/497/49 202/353/49 +f 211/355/50 209/498/50 210/356/50 +f 201/358/41 203/362/41 208/359/41 +f 202/353/42 205/499/42 206/361/42 +f 204/354/51 206/361/51 208/359/51 +f 201/358/52 207/360/52 205/363/52 +f 209/365/41 211/369/41 216/366/41 +f 210/356/42 213/500/42 214/368/42 +f 212/357/52 214/368/52 216/366/52 +f 209/365/51 215/367/51 213/370/51 +f 164/278/41 220/501/41 219/372/41 +f 171/311/41 227/502/41 226/373/41 +f 161/296/41 217/503/41 228/374/41 +f 167/291/41 168/293/41 224/375/41 +f 165/284/41 221/504/41 220/377/41 +f 172/281/41 228/505/41 227/378/41 +f 161/300/41 162/302/41 218/379/41 +f 169/299/41 225/506/41 224/381/41 +f 166/287/41 222/507/41 221/382/41 +f 163/308/41 219/508/41 218/383/41 +f 170/305/41 226/509/41 225/384/41 +f 167/290/41 223/510/41 222/385/41 +f 153/386/42 233/511/42 234/387/42 +f 150/388/42 230/512/42 231/389/42 +f 157/390/42 237/513/42 238/391/42 +f 154/392/42 234/514/42 235/393/42 +f 152/277/42 151/490/42 231/394/42 +f 158/396/42 238/515/42 240/397/42 +f 149/295/42 159/492/42 239/398/42 +f 155/400/42 235/516/42 236/401/42 +f 152/402/42 232/517/42 233/403/42 +f 159/280/42 160/491/42 240/404/42 +f 149/406/42 229/518/42 230/407/42 +f 156/408/42 236/519/42 237/409/42 +f 238/391/28 237/513/28 225/410/28 +f 240/397/30 238/515/30 226/412/30 +f 239/405/31 240/404/31 227/414/31 +f 229/399/32 239/398/32 228/416/32 +f 230/407/33 229/518/33 217/418/33 +f 231/389/35 230/512/35 218/420/35 +f 232/395/37 231/394/37 219/422/37 +f 233/403/39 232/517/39 220/424/39 +f 234/387/29 233/511/29 221/426/29 +f 235/393/34 234/514/34 222/428/34 +f 236/401/36 235/516/36 223/430/36 +f 237/409/38 236/519/38 224/432/38 +f 255/434/28 243/457/28 244/435/28 +f 263/437/29 252/458/29 251/438/29 +f 256/436/30 244/435/30 245/440/30 +f 258/442/31 257/441/31 245/440/31 +f 259/444/32 258/442/32 246/443/32 +f 259/444/33 247/445/33 248/446/33 +f 264/439/34 251/438/34 241/448/34 +f 260/447/35 248/446/35 249/450/35 +f 254/452/36 253/449/36 241/448/36 +f 261/454/37 249/520/37 250/455/37 +f 254/452/38 242/453/38 243/457/38 +f 262/456/39 250/455/39 252/458/39 +f 263/461/41 264/521/41 253/522/41 +f 253/522/41 254/523/41 255/524/41 +f 255/524/41 256/525/41 259/459/41 +f 256/525/41 257/526/41 259/459/41 +f 257/526/41 258/527/41 259/459/41 +f 259/459/41 260/528/41 261/460/41 +f 261/460/41 262/529/41 263/461/41 +f 263/461/41 253/522/41 259/459/41 +f 253/522/41 255/524/41 259/459/41 +f 241/464/42 251/530/42 249/531/42 +f 251/530/42 252/532/42 249/531/42 +f 252/532/42 250/533/42 249/531/42 +f 249/531/42 248/534/42 247/462/42 +f 247/462/42 246/535/42 245/463/42 +f 245/463/42 244/536/42 241/464/42 +f 244/536/42 243/537/42 241/464/42 +f 243/537/42 242/538/42 241/464/42 +f 249/531/42 247/462/42 241/464/42 +f 265/465/41 269/539/41 271/466/41 +f 272/468/42 270/471/42 266/469/42 +f 271/466/44 272/468/44 268/470/44 +f 270/471/43 269/540/43 265/472/43 +f 273/473/41 277/541/41 279/474/41 +f 280/476/42 278/479/42 274/477/42 +f 279/474/47 280/476/47 276/478/47 +f 278/479/48 277/542/48 273/480/48 +f 281/481/41 285/543/41 287/482/41 +f 288/484/42 286/487/42 282/485/42 +f 287/482/52 288/484/52 284/486/52 +f 286/487/51 285/544/51 281/488/51 +o Blade +v -0.000000 2.375000 0.937500 +v -0.195090 2.355785 0.937500 +v -0.382683 2.298879 0.937500 +v -0.555570 2.206470 0.937500 +v -0.707107 2.082107 0.937500 +v -0.831470 1.930570 0.937500 +v -0.923879 1.757683 0.937500 +v -0.980785 1.570090 0.937500 +v -1.000000 1.375000 0.937500 +v -0.980785 1.179909 0.937500 +v -0.923880 0.992316 0.937500 +v -0.831470 0.819430 0.937500 +v -0.707107 0.667893 0.937500 +v -0.555570 0.543530 0.937500 +v -0.382683 0.451120 0.937500 +v -0.195090 0.394214 0.937500 +v 0.000000 0.375000 0.937500 +v 0.195091 0.394215 0.937500 +v 0.382684 0.451120 0.937500 +v 0.555571 0.543530 0.937500 +v 0.707107 0.667893 0.937500 +v 0.831470 0.819430 0.937500 +v 0.923880 0.992317 0.937500 +v 0.980785 1.179910 0.937500 +v 1.000000 1.375001 0.937500 +v 0.980785 1.570091 0.937500 +v 0.923879 1.757684 0.937500 +v 0.831469 1.930571 0.937500 +v 0.707106 2.082108 0.937500 +v 0.555569 2.206470 0.937500 +v 0.382682 2.298880 0.937500 +v 0.195089 2.355785 0.937500 +v -0.000000 2.500000 0.937500 +v -0.219477 2.478383 0.937500 +v -0.430519 2.414364 0.937500 +v -0.625016 2.310403 0.937500 +v -0.795495 2.170495 0.937500 +v -0.935403 2.000016 0.937500 +v -1.039364 1.805518 0.937500 +v -1.103383 1.594476 0.937500 +v -1.125000 1.375000 0.937500 +v -1.103383 1.155523 0.937500 +v -1.039364 0.944481 0.937500 +v -0.935403 0.749983 0.937500 +v -0.795495 0.579504 0.937500 +v -0.625016 0.439596 0.937500 +v -0.430519 0.335635 0.937500 +v -0.219476 0.271616 0.937500 +v 0.000000 0.250000 0.937500 +v 0.219477 0.271616 0.937500 +v 0.430519 0.335635 0.937500 +v 0.625017 0.439597 0.937500 +v 0.795496 0.579505 0.937500 +v 0.935404 0.749984 0.937500 +v 1.039365 0.944482 0.937500 +v 1.103384 1.155524 0.937500 +v 1.125000 1.375001 0.937500 +v 1.103383 1.594477 0.937500 +v 1.039364 1.805520 0.937500 +v 0.935403 2.000017 0.937500 +v 0.795494 2.170496 0.937500 +v 0.625015 2.310404 0.937500 +v 0.430517 2.414365 0.937500 +v 0.219475 2.478383 0.937500 +v -0.000000 1.500000 0.875000 +v -0.000000 1.500000 1.000000 +v 0.088388 1.463388 0.875000 +v 0.088388 1.463388 1.000000 +v 0.125000 1.375000 0.875000 +v 0.125000 1.375000 1.000000 +v 0.088388 1.286612 0.875000 +v 0.088388 1.286612 1.000000 +v -0.000000 1.250000 0.875000 +v -0.000000 1.250000 1.000000 +v -0.088388 1.286612 0.875000 +v -0.088388 1.286612 1.000000 +v -0.125000 1.375000 0.875000 +v -0.125000 1.375000 1.000000 +v -0.088388 1.463388 0.875000 +v -0.088388 1.463388 1.000000 +v -0.000000 2.375000 0.937500 +v -0.195090 2.355785 0.937500 +v -0.382683 2.298879 0.937500 +v -0.555570 2.206470 0.937500 +v -0.707107 2.082107 0.937500 +v -0.831470 1.930570 0.937500 +v -0.923879 1.757683 0.937500 +v -0.980785 1.570090 0.937500 +v -1.000000 1.375000 0.937500 +v -0.980785 1.179909 0.937500 +v -0.923880 0.992316 0.937500 +v -0.831470 0.819430 0.937500 +v -0.707107 0.667893 0.937500 +v -0.555570 0.543530 0.937500 +v -0.382683 0.451120 0.937500 +v -0.195090 0.394214 0.937500 +v 0.000000 0.375000 0.937500 +v 0.195091 0.394215 0.937500 +v 0.382684 0.451120 0.937500 +v 0.555571 0.543530 0.937500 +v 0.707107 0.667893 0.937500 +v 0.831470 0.819430 0.937500 +v 0.923880 0.992317 0.937500 +v 0.980785 1.179910 0.937500 +v 1.000000 1.375001 0.937500 +v 0.980785 1.570091 0.937500 +v 0.923879 1.757684 0.937500 +v 0.831469 1.930571 0.937500 +v 0.707106 2.082108 0.937500 +v 0.555569 2.206470 0.937500 +v 0.382682 2.298880 0.937500 +v 0.195089 2.355785 0.937500 +v -0.000000 2.500000 0.937500 +v -0.219477 2.478383 0.937500 +v -0.430519 2.414364 0.937500 +v -0.625016 2.310403 0.937500 +v -0.795495 2.170495 0.937500 +v -0.935403 2.000016 0.937500 +v -1.039364 1.805518 0.937500 +v -1.103383 1.594476 0.937500 +v -1.125000 1.375000 0.937500 +v -1.103383 1.155523 0.937500 +v -1.039364 0.944481 0.937500 +v -0.935403 0.749983 0.937500 +v -0.795495 0.579504 0.937500 +v -0.625016 0.439596 0.937500 +v -0.430519 0.335635 0.937500 +v -0.219476 0.271616 0.937500 +v 0.000000 0.250000 0.937500 +v 0.219477 0.271616 0.937500 +v 0.430519 0.335635 0.937500 +v 0.625017 0.439597 0.937500 +v 0.795496 0.579505 0.937500 +v 0.935404 0.749984 0.937500 +v 1.039365 0.944482 0.937500 +v 1.103384 1.155524 0.937500 +v 1.125000 1.375001 0.937500 +v 1.103383 1.594477 0.937500 +v 1.039364 1.805520 0.937500 +v 0.935403 2.000017 0.937500 +v 0.795494 2.170496 0.937500 +v 0.625015 2.310404 0.937500 +v 0.430517 2.414365 0.937500 +v 0.219475 2.478383 0.937500 +vt 0.393893 0.464761 +vt 0.487778 0.608696 +vt 0.391822 0.749524 +vt 0.410360 0.747091 +vt 0.412547 0.764585 +vt 0.428225 0.739281 +vt 0.432646 0.755798 +vt 0.444731 0.726392 +vt 0.451216 0.741298 +vt 0.459244 0.708920 +vt 0.467543 0.721642 +vt 0.471206 0.687537 +vt 0.480999 0.697587 +vt 0.480157 0.663065 +vt 0.491069 0.670055 +vt 0.485753 0.636444 +vt 0.497364 0.640106 +vt 0.499643 0.608891 +vt 0.486157 0.580889 +vt 0.497819 0.577607 +vt 0.480949 0.554091 +vt 0.491961 0.547460 +vt 0.472357 0.529332 +vt 0.482294 0.519605 +vt 0.460709 0.507562 +vt 0.469191 0.495115 +vt 0.446454 0.489620 +vt 0.453154 0.474930 +vt 0.430139 0.476194 +vt 0.434800 0.459826 +vt 0.412392 0.467800 +vt 0.414833 0.450382 +vt 0.394023 0.446963 +vt 0.375355 0.467194 +vt 0.373167 0.449700 +vt 0.357489 0.475005 +vt 0.353068 0.458487 +vt 0.340983 0.487894 +vt 0.334498 0.472988 +vt 0.326470 0.505366 +vt 0.318171 0.492644 +vt 0.314508 0.526749 +vt 0.304715 0.516700 +vt 0.305557 0.551222 +vt 0.294645 0.544231 +vt 0.299962 0.577843 +vt 0.288350 0.574181 +vt 0.297936 0.605591 +vt 0.286071 0.605396 +vt 0.299558 0.633397 +vt 0.287896 0.636679 +vt 0.304765 0.660195 +vt 0.293754 0.666827 +vt 0.313358 0.684955 +vt 0.303420 0.694681 +vt 0.325006 0.706724 +vt 0.316524 0.719171 +vt 0.339261 0.724666 +vt 0.332561 0.739356 +vt 0.355576 0.738092 +vt 0.350916 0.754460 +vt 0.373323 0.746485 +vt 0.370882 0.763903 +vt 0.391692 0.767322 +vt 0.523810 0.767857 +vt 0.517857 0.750000 +vt 0.523810 0.750000 +vt 0.517857 0.767857 +vt 0.511905 0.750000 +vt 0.511905 0.767857 +vt 0.505952 0.750000 +vt 0.505952 0.767857 +vt 0.500000 0.750000 +vt 0.547619 0.767857 +vt 0.541667 0.750000 +vt 0.547619 0.750000 +vt 0.541667 0.767857 +vt 0.535714 0.750000 +vt 0.519557 0.720664 +vt 0.522727 0.732143 +vt 0.501083 0.732143 +vt 0.535714 0.767857 +vt 0.529762 0.750000 +vt 0.529762 0.767857 +vt 0.504252 0.774236 +vt 0.519557 0.774236 +vt 0.519557 0.797193 +vt 0.430139 0.476194 +vt 0.305557 0.551222 +vt 0.355576 0.738092 +vt 0.391822 0.749524 +vt 0.412547 0.764585 +vt 0.410360 0.747091 +vt 0.432646 0.755798 +vt 0.428225 0.739281 +vt 0.451216 0.741298 +vt 0.444731 0.726392 +vt 0.467543 0.721642 +vt 0.459244 0.708920 +vt 0.480999 0.697587 +vt 0.471206 0.687537 +vt 0.491069 0.670055 +vt 0.480157 0.663065 +vt 0.497364 0.640106 +vt 0.485753 0.636444 +vt 0.499643 0.608891 +vt 0.487778 0.608696 +vt 0.497819 0.577607 +vt 0.486157 0.580889 +vt 0.491961 0.547460 +vt 0.480949 0.554091 +vt 0.482294 0.519605 +vt 0.472357 0.529332 +vt 0.469191 0.495115 +vt 0.460709 0.507562 +vt 0.453154 0.474930 +vt 0.446454 0.489620 +vt 0.434800 0.459826 +vt 0.414833 0.450382 +vt 0.412392 0.467800 +vt 0.394023 0.446963 +vt 0.393893 0.464761 +vt 0.373167 0.449700 +vt 0.375355 0.467194 +vt 0.353068 0.458487 +vt 0.357489 0.475005 +vt 0.334498 0.472988 +vt 0.340983 0.487894 +vt 0.318171 0.492644 +vt 0.326470 0.505366 +vt 0.304715 0.516700 +vt 0.314508 0.526749 +vt 0.294645 0.544231 +vt 0.288350 0.574181 +vt 0.299962 0.577843 +vt 0.286071 0.605396 +vt 0.297936 0.605591 +vt 0.287896 0.636679 +vt 0.299558 0.633397 +vt 0.293754 0.666827 +vt 0.304765 0.660195 +vt 0.303420 0.694681 +vt 0.313358 0.684955 +vt 0.316524 0.719171 +vt 0.325006 0.706724 +vt 0.332561 0.739356 +vt 0.339261 0.724666 +vt 0.350916 0.754460 +vt 0.370882 0.763903 +vt 0.373323 0.746485 +vt 0.391692 0.767322 +vt 0.500000 0.767857 +vt 0.519557 0.743622 +vt 0.511905 0.748376 +vt 0.504252 0.743622 +vt 0.504252 0.720664 +vt 0.511905 0.715910 +vt 0.511905 0.801947 +vt 0.504252 0.797193 +vt 0.501083 0.785714 +vt 0.511905 0.769481 +vt 0.522727 0.785714 +vn 0.0000 -0.0000 1.0000 +vn 0.3827 0.9239 0.0000 +vn 0.9239 0.3827 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 0.0000 +vn -0.9239 0.3827 0.0000 +vn -0.3827 0.9239 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 305/545/53 313/546/53 289/547/53 +f 289/547/53 320/548/53 352/549/53 +f 320/548/53 319/550/53 351/551/53 +f 319/550/53 318/552/53 350/553/53 +f 318/552/53 317/554/53 349/555/53 +f 317/554/53 316/556/53 348/557/53 +f 316/556/53 315/558/53 347/559/53 +f 315/558/53 314/560/53 346/561/53 +f 314/560/53 313/546/53 345/562/53 +f 313/546/53 312/563/53 344/564/53 +f 312/563/53 311/565/53 343/566/53 +f 311/565/53 310/567/53 342/568/53 +f 310/567/53 309/569/53 341/570/53 +f 309/569/53 308/571/53 340/572/53 +f 308/571/53 307/573/53 339/574/53 +f 307/573/53 306/575/53 338/576/53 +f 306/575/53 305/545/53 337/577/53 +f 305/545/53 304/578/53 336/579/53 +f 304/578/53 303/580/53 335/581/53 +f 303/580/53 302/582/53 334/583/53 +f 302/582/53 301/584/53 333/585/53 +f 301/584/53 300/586/53 332/587/53 +f 300/586/53 299/588/53 331/589/53 +f 299/588/53 298/590/53 330/591/53 +f 298/590/53 297/592/53 329/593/53 +f 297/592/53 296/594/53 328/595/53 +f 296/594/53 295/596/53 327/597/53 +f 295/596/53 294/598/53 326/599/53 +f 294/598/53 293/600/53 325/601/53 +f 293/600/53 292/602/53 324/603/53 +f 292/602/53 291/604/53 323/605/53 +f 291/604/53 290/606/53 322/607/53 +f 290/606/53 289/547/53 321/608/53 +f 354/609/54 355/610/54 353/611/54 +f 356/612/55 357/613/55 355/610/55 +f 358/614/56 359/615/56 357/613/56 +f 360/616/57 361/617/57 359/615/57 +f 362/618/58 363/619/58 361/620/58 +f 364/621/59 365/622/59 363/619/59 +f 360/623/53 358/624/53 366/625/53 +f 366/626/60 367/627/60 365/622/60 +f 368/628/61 353/611/61 367/627/61 +f 359/629/62 363/630/62 367/631/62 +f 387/632/62 379/633/62 371/634/62 +f 369/635/62 432/636/62 400/637/62 +f 400/637/62 431/638/62 399/639/62 +f 399/639/62 430/640/62 398/641/62 +f 398/641/62 429/642/62 397/643/62 +f 397/643/62 428/644/62 396/645/62 +f 396/645/62 427/646/62 395/647/62 +f 395/647/62 426/648/62 394/649/62 +f 394/649/62 425/650/62 393/651/62 +f 393/651/62 424/652/62 392/653/62 +f 392/653/62 423/654/62 391/655/62 +f 391/655/62 422/656/62 390/657/62 +f 390/657/62 421/658/62 389/659/62 +f 389/659/62 420/660/62 388/661/62 +f 388/661/62 419/662/62 387/632/62 +f 387/632/62 418/663/62 386/664/62 +f 386/664/62 417/665/62 385/666/62 +f 385/666/62 416/667/62 384/668/62 +f 384/668/62 415/669/62 383/670/62 +f 383/670/62 414/671/62 382/672/62 +f 382/672/62 413/673/62 381/674/62 +f 381/674/62 412/675/62 380/676/62 +f 380/676/62 411/677/62 379/633/62 +f 379/633/62 410/678/62 378/679/62 +f 378/679/62 409/680/62 377/681/62 +f 377/681/62 408/682/62 376/683/62 +f 376/683/62 407/684/62 375/685/62 +f 375/685/62 406/686/62 374/687/62 +f 374/687/62 405/688/62 373/689/62 +f 373/689/62 404/690/62 372/691/62 +f 372/691/62 403/692/62 371/634/62 +f 371/634/62 402/693/62 370/694/62 +f 370/694/62 401/695/62 369/635/62 +f 289/547/53 290/606/53 291/604/53 +f 291/604/53 292/602/53 293/600/53 +f 293/600/53 294/598/53 297/592/53 +f 294/598/53 295/596/53 297/592/53 +f 295/596/53 296/594/53 297/592/53 +f 297/592/53 298/590/53 299/588/53 +f 299/588/53 300/586/53 301/584/53 +f 301/584/53 302/582/53 303/580/53 +f 303/580/53 304/578/53 305/545/53 +f 305/545/53 306/575/53 309/569/53 +f 306/575/53 307/573/53 309/569/53 +f 307/573/53 308/571/53 309/569/53 +f 309/569/53 310/567/53 313/546/53 +f 310/567/53 311/565/53 313/546/53 +f 311/565/53 312/563/53 313/546/53 +f 313/546/53 314/560/53 317/554/53 +f 314/560/53 315/558/53 317/554/53 +f 315/558/53 316/556/53 317/554/53 +f 317/554/53 318/552/53 319/550/53 +f 319/550/53 320/548/53 289/547/53 +f 289/547/53 291/604/53 297/592/53 +f 291/604/53 293/600/53 297/592/53 +f 297/592/53 299/588/53 305/545/53 +f 299/588/53 301/584/53 305/545/53 +f 301/584/53 303/580/53 305/545/53 +f 317/554/53 319/550/53 313/546/53 +f 319/550/53 289/547/53 313/546/53 +f 305/545/53 309/569/53 313/546/53 +f 289/547/53 297/592/53 305/545/53 +f 354/609/54 356/612/54 355/610/54 +f 356/612/55 358/614/55 357/613/55 +f 358/614/56 360/616/56 359/615/56 +f 360/616/57 362/696/57 361/617/57 +f 362/618/58 364/621/58 363/619/58 +f 364/621/59 366/626/59 365/622/59 +f 358/624/53 356/697/53 366/625/53 +f 356/697/53 354/698/53 366/625/53 +f 354/698/53 368/699/53 366/625/53 +f 366/625/53 364/700/53 362/701/53 +f 362/701/53 360/623/53 366/625/53 +f 366/626/60 368/628/60 367/627/60 +f 368/628/61 354/609/61 353/611/61 +f 367/631/62 353/702/62 355/703/62 +f 355/703/62 357/704/62 359/629/62 +f 359/629/62 361/705/62 363/630/62 +f 363/630/62 365/706/62 367/631/62 +f 367/631/62 355/703/62 359/629/62 +f 371/634/62 370/694/62 399/639/62 +f 370/694/62 369/635/62 399/639/62 +f 369/635/62 400/637/62 399/639/62 +f 399/639/62 398/641/62 397/643/62 +f 397/643/62 396/645/62 399/639/62 +f 396/645/62 395/647/62 399/639/62 +f 395/647/62 394/649/62 393/651/62 +f 393/651/62 392/653/62 391/655/62 +f 391/655/62 390/657/62 389/659/62 +f 389/659/62 388/661/62 391/655/62 +f 388/661/62 387/632/62 391/655/62 +f 387/632/62 386/664/62 383/670/62 +f 386/664/62 385/666/62 383/670/62 +f 385/666/62 384/668/62 383/670/62 +f 383/670/62 382/672/62 381/674/62 +f 381/674/62 380/676/62 383/670/62 +f 380/676/62 379/633/62 383/670/62 +f 379/633/62 378/679/62 377/681/62 +f 377/681/62 376/683/62 375/685/62 +f 375/685/62 374/687/62 371/634/62 +f 374/687/62 373/689/62 371/634/62 +f 373/689/62 372/691/62 371/634/62 +f 395/647/62 393/651/62 391/655/62 +f 379/633/62 377/681/62 375/685/62 +f 371/634/62 399/639/62 395/647/62 +f 395/647/62 391/655/62 371/634/62 +f 391/655/62 387/632/62 371/634/62 +f 387/632/62 383/670/62 379/633/62 +f 379/633/62 375/685/62 371/634/62 +o Main +v -1.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v -1.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.062500 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.500000 0.062500 0.500000 +v 0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.062500 -0.437500 +v -0.437500 0.000000 -0.437500 +v -0.437500 0.000000 0.437500 +v 0.437500 0.000000 0.437500 +v 0.437500 0.000000 -0.437500 +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 1.500000 +v -1.500000 1.000000 -1.500000 +v 1.500000 1.000000 -1.500000 +v -0.625000 1.000000 1.250000 +v 0.625000 1.000000 1.250000 +v -0.625000 1.000000 1.000000 +v 0.625000 1.000000 1.000000 +v -0.500000 1.125000 1.000000 +v -0.500000 1.125000 1.250000 +v 0.500000 1.125000 1.250000 +v 0.500000 1.125000 1.000000 +v -0.500000 1.625000 1.000000 +v -0.500000 1.625000 1.250000 +v 0.500000 1.625000 1.250000 +v 0.500000 1.625000 1.000000 +v -0.250000 1.875000 1.000000 +v -0.250000 1.875000 1.250000 +v 0.250000 1.875000 1.250000 +v 0.250000 1.875000 1.000000 +v -0.625000 1.000000 0.875000 +v 0.625000 1.000000 0.875000 +v -0.500000 1.125000 0.875000 +v 0.500000 1.125000 0.875000 +v -0.500000 1.625000 0.875000 +v 0.500000 1.625000 0.875000 +v -0.250000 1.875000 0.875000 +v 0.250000 1.875000 0.875000 +v 0.625000 1.000000 0.625000 +v -0.625000 1.000000 0.625000 +v -0.500000 1.125000 0.625000 +v 0.500000 1.125000 0.625000 +v 0.500000 1.625000 0.625000 +v -0.500000 1.625000 0.625000 +v 0.250000 1.875000 0.625000 +v -0.250000 1.875000 0.625000 +v -1.000000 1.000000 0.625000 +v 1.000000 1.000000 0.625000 +v -1.000000 1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +v -1.000000 1.750000 0.625000 +v 1.000000 1.750000 0.625000 +v -1.000000 1.750000 -1.000000 +v 1.000000 1.750000 -1.000000 +v -0.750000 2.000000 -1.000000 +v -0.750000 2.000000 0.625000 +v 0.750000 2.000000 0.625000 +v 0.750000 2.000000 -1.000000 +v -1.250000 1.000000 -1.250000 +v 1.250000 1.000000 -1.250000 +v -1.250000 1.000000 -1.000000 +v 1.250000 1.000000 -1.000000 +v 1.250000 0.625000 -1.250000 +v -1.250000 0.625000 -1.250000 +v 1.250000 0.625000 -1.000000 +v -1.250000 0.625000 -1.000000 +v 0.312500 1.000000 -1.250000 +v 0.812500 1.000000 -1.250000 +v 0.312500 1.000000 -1.375000 +v 0.812500 1.000000 -1.375000 +v 0.312500 1.500000 -1.375000 +v 0.312500 1.500000 -1.250000 +v 0.812500 1.500000 -1.250000 +v 0.812500 1.500000 -1.375000 +v 0.437500 1.625000 -1.375000 +v 0.437500 1.625000 -1.250000 +v 0.687500 1.625000 -1.250000 +v 0.687500 1.625000 -1.375000 +v 1.250000 1.000000 1.000000 +v 1.250000 1.000000 0.875000 +v -1.250000 1.000000 1.000000 +v -1.250000 1.000000 0.875000 +v -1.250000 0.375000 0.875000 +v 1.250000 0.375000 0.875000 +v -1.250000 0.375000 1.000000 +v 1.250000 0.375000 1.000000 +v -0.812500 1.000000 -1.250000 +v -0.312500 1.000000 -1.250000 +v -0.812500 1.000000 -1.375000 +v -0.312500 1.000000 -1.375000 +v -0.812500 1.500000 -1.375000 +v -0.812500 1.500000 -1.250000 +v -0.312500 1.500000 -1.250000 +v -0.312500 1.500000 -1.375000 +v -0.687500 1.625000 -1.375000 +v -0.687500 1.625000 -1.250000 +v -0.437500 1.625000 -1.250000 +v -0.437500 1.625000 -1.375000 +vt 0.285714 0.428571 +vt 0.190476 0.142857 +vt 0.285714 -0.000000 +vt 0.392857 -0.000000 +vt 0.297619 0.008929 +vt 0.297619 -0.000000 +vt 0.095238 0.142857 +vt -0.000000 -0.000000 +vt 0.095238 0.285714 +vt 0.000000 0.428571 +vt 0.190476 0.285714 +vt 0.398810 0.160714 +vt 0.392857 0.026786 +vt 0.398810 0.017857 +vt 0.297619 0.178571 +vt 0.392857 0.169643 +vt 0.392857 0.178571 +vt 0.404762 0.160714 +vt 0.404762 0.017857 +vt 0.285714 0.017857 +vt 0.291667 0.160714 +vt 0.285714 0.160714 +vt 0.386905 0.017857 +vt 0.303571 0.026786 +vt 0.303571 0.017857 +vt 0.291667 0.017857 +vt 0.297619 0.151786 +vt 0.392857 0.008929 +vt 0.297619 0.169643 +vt 0.386905 0.160714 +vt 0.386905 0.151786 +vt 0.303571 0.151786 +vt 0.303571 0.160714 +vt 0.392857 0.151786 +vt 0.386905 0.026786 +vt 0.297619 0.026786 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt -0.000000 0.571429 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.285714 0.428571 +vt -0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.023810 0.964286 +vt 0.285714 1.000000 +vt -0.000000 1.000000 +vt 0.976190 0.178571 +vt 0.928571 0.142857 +vt 0.976190 0.142857 +vt 0.833333 0.035714 +vt 0.940476 0.017857 +vt 0.928571 0.035714 +vt 0.988095 0.178571 +vt 0.988095 0.142857 +vt 0.773810 0.142857 +vt 0.785714 0.178571 +vt 0.773810 0.178571 +vt 0.928571 0.178571 +vt 0.904762 0.142857 +vt 0.785714 0.142857 +vt 0.833333 0.178571 +vt 0.857143 0.178571 +vt 0.857143 0.142857 +vt 0.833333 0.142857 +vt 0.928571 0.285714 +vt 0.821429 0.303571 +vt 0.833333 0.285714 +vt 0.928571 0.357143 +vt 0.904762 0.464286 +vt 0.857143 0.464286 +vt 0.857143 0.500000 +vt 0.976190 0.464286 +vt 0.928571 0.500000 +vt 0.928571 0.464286 +vt 0.785714 0.464286 +vt 0.773810 0.500000 +vt 0.773810 0.464286 +vt 0.904762 0.500000 +vt 0.833333 0.464286 +vt 0.785714 0.500000 +vt 0.988095 0.464286 +vt 0.976190 0.500000 +vt 0.833333 0.500000 +vt 0.690476 0.375000 +vt 0.761905 0.142857 +vt 0.761905 0.375000 +vt 0.500000 0.142857 +vt 0.428571 0.375000 +vt 0.428571 0.142857 +vt 0.500000 0.517857 +vt 0.666667 0.375000 +vt 0.690476 0.517857 +vt 0.523810 0.375000 +vt 0.500000 0.375000 +vt 0.523810 0.142857 +vt 0.666667 0.142857 +vt 0.690476 0.142857 +vt 0.690476 0.000000 +vt 0.500000 0.000000 +vt 0.523810 0.892857 +vt 0.547619 0.839286 +vt 0.547619 0.892857 +vt 0.261905 0.928571 +vt 0.261905 0.660714 +vt 0.023810 0.928571 +vt 0.285714 0.839286 +vt 0.523810 0.803571 +vt 0.523810 0.839286 +vt 0.785714 0.839286 +vt 0.785714 0.892857 +vt 0.809524 0.839286 +vt 0.809524 0.892857 +vt 0.285714 0.892857 +vt 0.285714 0.267857 +vt 0.333333 0.285714 +vt 0.285714 0.285714 +vt 0.428571 0.285714 +vt 0.380952 0.267857 +vt 0.428571 0.267857 +vt 0.369048 0.267857 +vt 0.345238 0.267857 +vt 0.333333 0.250000 +vt 0.345238 0.285714 +vt 0.369048 0.285714 +vt 0.333333 0.267857 +vt 0.380952 0.285714 +vt 0.380952 0.303571 +vt 0.380952 0.375000 +vt 0.333333 0.375000 +vt 0.523810 1.000000 +vt 0.535714 0.910714 +vt 0.535714 1.000000 +vt 0.285714 0.571429 +vt 0.023810 0.642857 +vt 0.285714 0.910714 +vt 0.523810 0.892857 +vt 0.523810 0.910714 +vt 0.773810 1.000000 +vt 0.785714 0.910714 +vt 0.785714 1.000000 +vt 0.773810 0.910714 +vt 0.285714 1.000000 +vt 0.285714 0.267857 +vt 0.333333 0.285714 +vt 0.285714 0.285714 +vt 0.428571 0.285714 +vt 0.380952 0.267857 +vt 0.428571 0.267857 +vt 0.369048 0.267857 +vt 0.345238 0.267857 +vt 0.333333 0.250000 +vt 0.345238 0.285714 +vt 0.369048 0.285714 +vt 0.333333 0.267857 +vt 0.380952 0.285714 +vt 0.380952 0.303571 +vt 0.380952 0.375000 +vt 0.333333 0.375000 +vt 0.285714 0.571429 +vt 0.285714 0.571429 +vt 0.285714 0.571429 +vt 0.261905 0.964286 +vt 0.928571 0.107143 +vt 0.833333 0.107143 +vt 0.821429 0.017857 +vt 0.904762 0.178571 +vt 0.833333 0.214286 +vt 0.928571 0.214286 +vt 0.940476 0.303571 +vt 0.833333 0.357143 +vt 0.821429 0.339286 +vt 0.940476 0.339286 +vt 0.928571 0.428571 +vt 0.833333 0.428571 +vt 0.988095 0.500000 +vt 0.500000 0.410714 +vt 0.690476 0.410714 +vt 0.690476 0.107143 +vt 0.500000 0.107143 +vt 0.261905 0.642857 +vt 0.023810 0.660714 +vt 0.285714 0.803571 +vt 0.333333 0.178571 +vt 0.380952 0.178571 +vt 0.380952 0.250000 +vt 0.333333 0.303571 +vt 0.285714 0.892857 +vt 0.333333 0.178571 +vt 0.380952 0.178571 +vt 0.380952 0.250000 +vt 0.333333 0.303571 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +s off +f 434/707/63 440/708/63 436/709/63 +f 440/710/64 441/711/64 439/712/64 +f 436/709/63 439/713/63 435/714/63 +f 435/714/63 437/715/63 433/716/63 +f 433/716/63 438/717/63 434/707/63 +f 443/718/63 448/719/63 444/720/63 +f 437/721/65 443/722/65 438/723/65 +f 438/724/66 444/720/66 440/725/66 +f 439/726/67 442/727/67 437/728/67 +f 448/729/65 449/730/65 445/731/65 +f 441/732/63 446/733/63 442/727/63 +f 444/734/63 445/731/63 441/711/63 +f 442/735/63 447/736/63 443/722/63 +f 449/730/63 451/737/63 450/738/63 +f 446/739/64 451/737/64 447/736/64 +f 447/740/67 452/741/67 448/719/67 +f 445/742/66 450/738/66 446/733/66 +f 435/743/65 456/744/65 436/745/65 +f 434/707/64 453/746/64 433/716/64 +f 436/747/67 454/748/67 434/749/67 +f 433/750/66 455/751/66 435/752/66 +f 501/753/68 456/754/68 455/755/68 +f 464/756/67 467/757/67 463/758/67 +f 462/759/64 458/760/64 463/761/64 +f 460/762/69 463/758/69 458/763/69 +f 457/764/70 461/765/70 459/766/70 +f 468/767/69 471/768/69 467/757/69 +f 462/769/66 465/770/66 461/765/66 +f 471/768/68 469/771/68 470/772/68 +f 466/773/70 469/771/70 465/770/70 +f 464/774/65 459/775/65 461/776/65 +f 476/777/64 480/778/64 479/779/64 +f 480/778/68 488/780/68 479/779/68 +f 476/781/67 485/782/67 478/783/67 +f 475/784/70 482/785/70 473/786/70 +f 478/783/69 487/787/69 480/778/69 +f 477/788/66 483/789/66 475/784/66 +f 474/790/69 484/791/69 476/781/69 +f 479/779/70 486/792/70 477/788/70 +f 496/793/67 490/794/67 492/795/67 +f 493/796/66 491/797/66 489/798/66 +f 491/799/65 500/800/65 492/801/65 +f 493/796/70 497/802/70 495/803/70 +f 498/804/68 500/800/68 497/802/68 +f 496/793/69 499/805/69 494/806/69 +f 490/807/64 498/804/64 489/808/64 +f 502/809/66 507/810/66 504/811/66 +f 456/754/68 504/812/68 522/813/68 +f 503/814/68 501/753/68 455/755/68 +f 503/814/68 522/813/68 504/812/68 +f 506/815/68 507/816/68 505/817/68 +f 504/811/65 508/818/65 503/819/65 +f 503/819/67 506/820/67 501/821/67 +f 501/822/64 505/817/64 502/809/64 +f 512/823/67 515/824/67 510/825/67 +f 509/826/66 513/827/66 511/828/66 +f 517/829/65 520/830/65 516/831/65 +f 519/832/68 517/829/68 518/833/68 +f 516/834/69 519/832/69 515/824/69 +f 514/835/70 517/829/70 513/827/70 +f 514/836/64 509/837/64 510/838/64 +f 522/839/66 528/840/66 521/841/66 +f 454/842/68 523/843/68 453/746/68 +f 525/844/68 528/845/68 526/846/68 +f 523/847/67 525/848/67 524/849/67 +f 521/841/65 527/850/65 523/847/65 +f 524/851/64 526/846/64 522/839/64 +f 532/852/67 535/853/67 530/854/67 +f 529/855/66 533/856/66 531/857/66 +f 537/858/65 540/859/65 536/860/65 +f 539/861/68 537/858/68 538/862/68 +f 536/863/69 539/861/69 535/853/69 +f 534/864/70 537/858/70 533/856/70 +f 534/865/64 529/866/64 530/867/64 +f 434/707/63 438/717/63 440/708/63 +f 440/710/64 444/734/64 441/711/64 +f 436/709/63 440/708/63 439/713/63 +f 435/714/63 439/713/63 437/715/63 +f 433/716/63 437/715/63 438/717/63 +f 443/718/63 447/740/63 448/719/63 +f 437/721/65 442/735/65 443/722/65 +f 438/724/66 443/718/66 444/720/66 +f 439/726/67 441/732/67 442/727/67 +f 448/729/65 452/741/65 449/730/65 +f 441/732/63 445/742/63 446/733/63 +f 444/734/63 448/729/63 445/731/63 +f 442/735/63 446/739/63 447/736/63 +f 449/730/63 452/741/63 451/737/63 +f 446/739/64 450/738/64 451/737/64 +f 447/740/67 451/737/67 452/741/67 +f 445/742/66 449/730/66 450/738/66 +f 435/743/65 455/868/65 456/744/65 +f 434/707/64 454/842/64 453/746/64 +f 436/747/67 456/869/67 454/748/67 +f 433/750/66 453/870/66 455/751/66 +f 501/753/68 502/871/68 456/754/68 +f 464/756/67 468/767/67 467/757/67 +f 463/761/64 467/872/64 462/759/64 +f 467/872/64 471/768/64 462/759/64 +f 471/768/64 470/772/64 466/873/64 +f 462/759/64 457/874/64 458/760/64 +f 471/768/64 466/873/64 462/759/64 +f 460/762/69 464/756/69 463/758/69 +f 457/764/70 462/769/70 461/765/70 +f 468/767/69 472/875/69 471/768/69 +f 462/769/66 466/773/66 465/770/66 +f 471/768/68 472/875/68 469/771/68 +f 466/773/70 470/772/70 469/771/70 +f 461/776/65 465/876/65 464/774/65 +f 465/876/65 469/771/65 464/774/65 +f 469/771/65 472/875/65 468/877/65 +f 464/774/65 460/878/65 459/775/65 +f 469/771/65 468/877/65 464/774/65 +f 475/879/64 473/880/64 474/881/64 +f 476/777/64 478/882/64 480/778/64 +f 475/879/64 474/881/64 476/777/64 +f 479/779/64 477/883/64 476/777/64 +f 477/883/64 475/879/64 476/777/64 +f 480/778/68 487/787/68 488/780/68 +f 476/781/67 484/791/67 485/782/67 +f 475/784/70 483/789/70 482/785/70 +f 478/783/69 485/782/69 487/787/69 +f 477/788/66 486/792/66 483/789/66 +f 474/790/69 481/884/69 484/791/69 +f 479/779/70 488/780/70 486/792/70 +f 496/793/67 494/806/67 490/794/67 +f 493/796/66 495/803/66 491/797/66 +f 491/799/65 495/885/65 497/802/65 +f 497/802/65 500/800/65 491/799/65 +f 500/800/65 496/886/65 492/801/65 +f 493/796/70 498/804/70 497/802/70 +f 498/804/68 499/805/68 500/800/68 +f 496/793/69 500/800/69 499/805/69 +f 490/807/64 494/887/64 499/805/64 +f 499/805/64 498/804/64 490/807/64 +f 498/804/64 493/888/64 489/808/64 +f 502/809/66 505/817/66 507/810/66 +f 521/889/68 454/842/68 522/813/68 +f 454/842/68 456/754/68 522/813/68 +f 456/754/68 502/871/68 504/812/68 +f 455/755/68 453/746/68 524/890/68 +f 453/746/68 523/843/68 524/890/68 +f 524/890/68 503/814/68 455/755/68 +f 503/814/68 524/890/68 522/813/68 +f 506/815/68 508/891/68 507/816/68 +f 504/811/65 507/810/65 508/818/65 +f 503/819/67 508/818/67 506/820/67 +f 501/822/64 506/815/64 505/817/64 +f 512/823/67 516/834/67 515/824/67 +f 509/826/66 514/835/66 513/827/66 +f 516/831/65 512/892/65 511/893/65 +f 511/893/65 513/894/65 516/831/65 +f 513/894/65 517/829/65 516/831/65 +f 519/832/68 520/830/68 517/829/68 +f 516/834/69 520/830/69 519/832/69 +f 514/835/70 518/833/70 517/829/70 +f 510/838/64 515/895/64 514/836/64 +f 515/895/64 519/832/64 514/836/64 +f 519/832/64 518/833/64 514/836/64 +f 522/839/66 526/846/66 528/840/66 +f 454/842/68 521/889/68 523/843/68 +f 525/844/68 527/896/68 528/845/68 +f 523/847/67 527/850/67 525/848/67 +f 521/841/65 528/840/65 527/850/65 +f 524/851/64 525/844/64 526/846/64 +f 532/852/67 536/863/67 535/853/67 +f 529/855/66 534/864/66 533/856/66 +f 536/860/65 532/897/65 531/898/65 +f 531/898/65 533/899/65 536/860/65 +f 533/899/65 537/858/65 536/860/65 +f 539/861/68 540/859/68 537/858/68 +f 536/863/69 540/859/69 539/861/69 +f 534/864/70 538/862/70 537/858/70 +f 530/867/64 535/900/64 534/865/64 +f 535/900/64 539/861/64 534/865/64 +f 539/861/64 538/862/64 534/865/64 diff --git a/src/main/resources/assets/hbm/models/weapons/chainsaw.obj b/src/main/resources/assets/hbm/models/weapons/chainsaw.obj new file mode 100644 index 000000000..3bd2f83db --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/chainsaw.obj @@ -0,0 +1,505 @@ +# Blender v2.79 (sub 0) OBJ File: 'chainsaw.blend' +# www.blender.org +o Tooth +v -0.421875 0.562500 0.625000 +v -0.390625 0.562500 0.625000 +v -0.390625 0.687500 0.625000 +v -0.421875 0.687500 0.625000 +v -0.421875 0.687500 0.500000 +v -0.390625 0.687500 0.500000 +v -0.390625 0.562500 0.500000 +v -0.421875 0.562500 0.500000 +vt 0.755814 0.579710 +vt 0.732558 0.608696 +vt 0.732558 0.579710 +vt 0.790698 0.579710 +vt 0.767442 0.608696 +vt 0.767442 0.579710 +vt 0.755814 0.608696 +vt 0.732558 0.623188 +vt 0.720930 0.579710 +vt 0.790698 0.608696 +vt 0.755814 0.623188 +vt 0.720930 0.608696 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +s off +f 1/1/1 5/2/1 8/3/1 +f 7/4/2 3/5/2 2/6/2 +f 1/1/3 3/5/3 4/7/3 +f 4/7/4 6/8/4 5/2/4 +f 5/2/5 7/9/5 8/3/5 +f 1/1/1 4/7/1 5/2/1 +f 7/4/2 6/10/2 3/5/2 +f 1/1/3 2/6/3 3/5/3 +f 4/7/4 3/11/4 6/8/4 +f 5/2/5 6/12/5 7/9/5 +o Saw +v 0.500000 0.687500 0.250000 +v 0.500000 0.062500 0.250000 +v 0.500000 0.687500 -0.312500 +v 0.500000 0.062500 -0.312500 +v 0.562500 0.625000 -0.250000 +v 0.562500 0.625000 0.250000 +v 0.562500 0.125000 0.250000 +v 0.562500 0.125000 -0.250000 +v -0.125000 0.000000 -1.000000 +v 0.125000 0.000000 -1.000000 +v -0.125000 0.000000 -1.750000 +v 0.125000 0.000000 -1.750000 +v -0.125000 0.375000 -1.750000 +v 0.125000 0.375000 -1.750000 +v -0.125000 0.750000 -1.000000 +v 0.125000 0.750000 -1.000000 +v -0.125000 0.125000 -1.000000 +v 0.125000 0.125000 -1.000000 +v -0.125000 0.125000 -1.625000 +v 0.125000 0.125000 -1.625000 +v -0.125000 0.250000 -1.625000 +v 0.125000 0.250000 -1.625000 +v -0.125000 0.625000 -0.885000 +v 0.125000 0.625000 -0.885000 +v -0.062500 0.896676 -0.695873 +v 0.062500 0.896676 -0.695873 +v -0.062500 0.834176 -0.804127 +v 0.062500 0.834176 -0.804127 +v -0.062500 0.888302 -0.835377 +v -0.062500 0.950802 -0.727123 +v 0.062500 0.950802 -0.727123 +v 0.062500 0.888302 -0.835377 +v -0.500000 0.125000 0.500000 +v -0.500000 0.625000 0.500000 +v 0.375000 0.750000 0.500000 +v -0.500000 0.625000 -0.250000 +v -0.375000 0.750000 0.500000 +v -0.625000 0.125000 0.500000 +v -0.625000 0.625000 0.500000 +v -0.625000 0.625000 -0.250000 +v -0.500000 0.375000 -0.500000 +v -0.500000 0.125000 -0.500000 +v -0.625000 0.375000 -0.500000 +v -0.625000 0.125000 -0.500000 +v 0.500000 0.000000 0.375000 +v 0.625000 0.000000 0.375000 +v 0.500000 0.000000 0.250000 +v 0.625000 0.000000 0.250000 +v 0.500000 1.250000 0.375000 +v 0.625000 1.375000 0.375000 +v 0.500000 1.250000 0.250000 +v 0.625000 1.375000 0.250000 +v -0.500000 1.250000 0.375000 +v -0.500000 1.250000 0.250000 +v -0.500000 0.625000 0.375000 +v -0.500000 0.625000 0.250000 +v -0.625000 1.375000 0.375000 +v -0.625000 1.375000 0.250000 +v -0.625000 0.625000 0.375000 +v -0.625000 0.625000 0.250000 +v -0.375000 0.750000 0.500000 +v 0.375000 0.750000 0.500000 +v -0.375000 1.000000 0.750000 +v 0.375000 1.000000 0.750000 +v -0.375000 1.500000 0.750000 +v 0.375000 1.500000 0.750000 +v -0.437500 0.125000 0.500000 +v -0.437500 0.625000 0.500000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.625000 0.500000 +v -0.437500 0.125000 2.500000 +v -0.437500 0.625000 2.500000 +v -0.375000 0.125000 2.500000 +v -0.375000 0.625000 2.500000 +v -0.375000 0.125000 0.500000 +v -0.375000 0.625000 0.500000 +v 0.375000 0.125000 0.500000 +v 0.375000 0.625000 0.500000 +v -0.375000 0.250000 0.625000 +v -0.375000 0.500000 0.625000 +v 0.375000 0.250000 0.625000 +v 0.375000 0.500000 0.625000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.000000 0.500000 +v -0.375000 0.198223 2.676777 +v -0.437500 0.551777 2.676777 +v -0.437500 0.375000 2.750000 +v -0.437500 0.198223 2.676777 +v -0.375000 0.375000 2.750000 +v -0.375000 0.551777 2.676777 +v 0.500000 0.000000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.250000 0.000000 -1.000000 +v 0.250000 0.000000 -1.000000 +v -0.500000 0.750000 -0.500000 +v -0.500000 0.750000 0.500000 +v 0.500000 0.750000 0.500000 +v 0.500000 0.750000 -0.500000 +v -0.250000 0.750000 -1.000000 +v 0.250000 0.750000 -1.000000 +v -0.250000 1.000000 0.500000 +v 0.250000 1.000000 0.500000 +v -0.250000 1.000000 -0.500000 +v 0.250000 1.000000 -0.500000 +v -0.447500 0.262500 0.625000 +v -0.447500 0.487500 0.625000 +v -0.447500 0.262500 2.500000 +v -0.447500 0.487500 2.500000 +v -0.365000 0.262500 0.625000 +v -0.365000 0.487500 0.625000 +v -0.365000 0.262500 2.500000 +v -0.365000 0.487500 2.500000 +v -0.375000 1.000000 0.750000 +v 0.375000 1.000000 0.750000 +v -0.375000 1.500000 0.750000 +v 0.375000 1.500000 0.750000 +vt 0.209302 0.057971 +vt 0.186047 0.086957 +vt 0.186047 0.057971 +vt 0.325581 0.724638 +vt 0.186047 0.637681 +vt 0.325581 0.637681 +vt 0.209302 0.086957 +vt 0.441860 0.115942 +vt 0.209302 0.115942 +vt 0.465116 0.130435 +vt 0.558140 0.246377 +vt 0.465116 0.246377 +vt 0.569767 0.260870 +vt 0.558140 0.130435 +vt 0.569767 0.115942 +vt 0.058140 0.869565 +vt 0.930233 1.000000 +vt 0.058140 1.000000 +vt 0.465116 0.115942 +vt 0.465116 0.260870 +vt 0.720930 0.289855 +vt 0.674419 0.115942 +vt 0.720930 0.115942 +vt 0.720930 0.376812 +vt 0.674419 0.289855 +vt 0.720930 0.550725 +vt 0.674419 0.376812 +vt 0.790698 0.115942 +vt 0.744186 0.260870 +vt 0.744186 0.115942 +vt 0.790698 0.318841 +vt 0.744186 0.347826 +vt 0.744186 0.318841 +vt 0.790698 0.405797 +vt 0.744186 0.579710 +vt 0.744186 0.405797 +vt 0.651163 0.347826 +vt 0.651163 0.260870 +vt 0.674419 0.550725 +vt 0.651163 0.405797 +vt 0.581395 0.159420 +vt 0.604651 0.130435 +vt 0.604651 0.159420 +vt 0.616279 0.159420 +vt 0.616279 0.130435 +vt 0.604651 0.115942 +vt 0.581395 0.130435 +vt 0.581395 0.115942 +vt 0.581395 0.173913 +vt 0.604651 0.173913 +vt 0.569767 0.130435 +vt 0.569767 0.159420 +vt 0.209302 0.289855 +vt 0.348837 0.260870 +vt 0.348837 0.289855 +vt 0.186047 0.637681 +vt 0.325581 0.724638 +vt 0.325581 0.637681 +vt 0.162791 0.260870 +vt 0.209302 0.260870 +vt 0.372093 0.260870 +vt 0.348837 0.144928 +vt 0.372093 0.144928 +vt 0.139535 0.144928 +vt 0.162791 0.202899 +vt 0.139535 0.202899 +vt 0.186047 0.724638 +vt 0.325581 0.840580 +vt 0.441860 0.028986 +vt 0.209302 0.028986 +vt 0.162791 0.144928 +vt 0.441860 -0.000000 +vt 0.209302 -0.000000 +vt 0.465116 0.057971 +vt 0.465116 0.086957 +vt 0.488372 -0.000000 +vt 0.674419 0.028986 +vt 0.488372 0.028986 +vt 0.720930 0.000000 +vt 0.837209 0.028986 +vt 0.720930 0.028986 +vt 0.697674 0.086957 +vt 0.697674 0.057971 +vt 0.837209 0.086957 +vt 0.488372 0.115942 +vt 0.720930 0.115942 +vt 0.837209 0.115942 +vt 0.837209 0.057971 +vt 0.325581 0.840580 +vt 0.186047 0.724638 +vt 0.895349 0.115942 +vt 0.883721 0.579710 +vt 0.883721 0.115942 +vt 0.988372 0.115942 +vt 0.895349 0.579710 +vt 1.000000 0.115942 +vt 0.988372 0.579710 +vt 0.790698 0.579710 +vt 0.790698 0.115942 +vt 0.511628 0.666667 +vt 0.651163 0.724638 +vt 0.511628 0.724638 +vt 0.511628 0.753623 +vt 0.651163 0.753623 +vt 0.651163 0.637681 +vt 0.511628 0.637681 +vt 0.674419 0.753623 +vt 0.651163 0.666667 +vt 0.674419 0.637681 +vt 0.988372 0.623188 +vt 1.000000 0.666667 +vt 0.988372 0.666667 +vt 0.895349 0.666667 +vt 0.883721 0.623188 +vt 0.895349 0.623188 +vt 1.000000 0.623188 +vt 1.000000 0.579710 +vt 0.974987 0.620786 +vt 0.941860 0.637681 +vt 0.909405 0.620786 +vt 0.870647 0.620786 +vt 0.805065 0.620786 +vt 0.186047 0.405797 +vt 0.000000 0.637681 +vt -0.000000 0.405797 +vt 0.046512 0.289855 +vt 0.651163 0.637681 +vt 0.511628 0.405797 +vt 0.651163 0.405797 +vt 0.186047 0.289855 +vt 0.325581 0.405797 +vt 0.325581 0.869565 +vt 0.511628 0.695652 +vt 0.511628 0.869565 +vt 0.511628 0.289855 +vt 0.651163 0.289855 +vt 0.465116 0.115942 +vt 0.372093 0.289855 +vt 0.372093 0.115942 +vt 0.325581 0.637681 +vt 0.186047 0.637681 +vt 0.325581 0.695652 +vt 0.465116 0.637681 +vt 0.372093 0.637681 +vt 0.465116 0.405797 +vt 0.372093 0.405797 +vt 0.511628 0.637681 +vt 0.465116 0.289855 +vt 0.325581 0.289855 +vt 0.058140 1.000000 +vt 0.930233 0.869565 +vt 0.930233 1.000000 +vt 0.348837 0.115942 +vt 0.930233 0.869565 +vt 0.790698 0.260870 +vt 0.790698 0.347826 +vt 0.790698 0.579710 +vt 0.651163 0.318841 +vt 0.651163 0.115942 +vt 0.651163 0.579710 +vt 0.162791 0.289855 +vt 0.186047 0.840580 +vt 0.674419 0.000000 +vt 0.837209 0.000000 +vt 0.674419 0.115942 +vt 0.186047 0.840580 +vt 0.883721 0.666667 +vt 0.837209 0.637681 +vt 0.139535 0.289855 +vt 0.058140 0.869565 +vt 0.162791 0.115942 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.8920 0.4520 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 0.5000 0.8660 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.8944 0.0000 -0.4472 +vn -0.8944 0.0000 -0.4472 +vn -0.7071 0.7071 0.0000 +vn -0.6667 0.6667 -0.3333 +vn 0.6667 0.6667 -0.3333 +s off +f 56/13/6 53/14/6 55/15/6 +f 71/16/7 70/17/7 69/18/7 +f 54/19/8 57/20/8 53/21/8 +f 15/22/9 13/23/9 14/24/9 +f 11/25/10 16/26/10 12/27/10 +f 113/28/11 116/29/11 114/30/11 +f 10/31/12 16/26/12 15/22/12 +f 9/32/13 13/23/13 11/25/13 +f 19/33/6 18/34/6 17/35/6 +f 21/36/14 20/37/14 19/33/14 +f 23/38/15 22/39/15 21/36/15 +f 26/40/16 27/41/16 25/42/16 +f 28/43/8 29/44/8 27/45/8 +f 30/46/17 31/47/17 29/48/17 +f 27/45/11 21/36/11 19/33/11 +f 30/49/9 20/37/9 22/39/9 +f 28/50/9 18/34/9 20/37/9 +f 29/48/11 23/38/11 21/36/11 +f 24/51/9 30/52/9 22/39/9 +f 17/35/11 27/41/11 19/33/11 +f 39/53/18 37/54/18 38/55/18 +f 33/56/11 37/54/11 35/57/11 +f 35/58/19 40/59/19 36/60/19 +f 34/61/20 38/55/20 33/62/20 +f 36/63/9 39/53/9 34/64/9 +f 44/65/16 47/66/16 42/67/16 +f 43/68/21 121/69/21 45/70/21 +f 44/65/7 51/71/7 48/72/7 +f 42/73/8 46/74/8 41/75/8 +f 50/76/14 51/77/14 49/78/14 +f 122/79/8 123/80/8 121/69/8 +f 59/81/14 56/13/14 55/82/14 +f 46/74/11 48/72/11 52/83/11 +f 57/84/11 55/82/11 53/85/11 +f 54/19/9 60/86/9 58/87/9 +f 57/88/6 62/89/6 59/90/6 +f 61/91/9 64/92/9 62/93/9 +f 60/86/16 65/94/16 58/87/16 +f 66/95/11 67/96/11 65/94/11 +f 65/94/8 57/97/8 58/87/8 +f 61/98/8 67/96/8 63/99/8 +f 59/90/14 66/95/14 60/86/14 +f 68/100/14 62/93/14 64/92/14 +f 73/101/14 72/102/14 71/16/14 +f 76/103/16 82/104/16 78/105/16 +f 75/106/11 80/107/11 76/103/11 +f 77/108/6 79/109/6 75/106/6 +f 78/105/9 81/110/9 77/111/9 +f 87/112/8 90/113/8 88/114/8 +f 84/115/22 90/113/22 86/116/22 +f 85/117/21 87/112/21 83/118/21 +f 86/119/9 89/120/9 85/121/9 +f 96/122/23 97/123/23 95/124/23 +f 95/125/24 98/126/24 94/127/24 +f 94/127/25 82/104/25 80/107/25 +f 93/128/26 79/109/26 81/129/26 +f 96/130/11 95/131/11 94/132/11 +f 98/133/9 93/134/9 81/110/9 +f 100/135/6 92/136/6 91/137/6 +f 101/138/6 100/135/6 91/137/6 +f 92/139/11 103/140/11 91/141/11 +f 102/142/27 106/143/27 100/135/27 +f 99/144/8 104/145/8 92/146/8 +f 91/141/28 107/147/28 101/148/28 +f 101/149/14 108/150/14 102/151/14 +f 100/135/9 105/152/9 99/153/9 +f 105/154/8 109/155/8 104/145/8 +f 110/156/16 111/157/16 109/155/16 +f 112/158/13 105/152/13 106/143/13 +f 109/155/29 103/140/29 104/159/29 +f 107/160/15 112/158/15 108/150/15 +f 107/147/30 103/140/30 111/157/30 +f 108/161/31 112/158/31 106/143/31 +f 120/162/9 117/163/9 118/164/9 +f 52/83/6 41/165/6 46/74/6 +f 56/13/6 54/19/6 53/14/6 +f 71/16/7 72/102/7 70/17/7 +f 54/19/8 58/87/8 57/20/8 +f 15/22/9 16/26/9 13/23/9 +f 11/25/10 13/23/10 16/26/10 +f 113/28/11 115/166/11 116/29/11 +f 10/31/12 12/27/12 16/26/12 +f 9/32/13 14/24/13 13/23/13 +f 19/33/6 20/37/6 18/34/6 +f 21/36/14 22/39/14 20/37/14 +f 23/38/15 24/51/15 22/39/15 +f 26/40/16 28/167/16 27/41/16 +f 28/43/8 30/168/8 29/44/8 +f 30/46/17 32/169/17 31/47/17 +f 27/45/11 29/44/11 21/36/11 +f 30/49/9 28/170/9 20/37/9 +f 28/50/9 26/171/9 18/34/9 +f 29/48/11 31/47/11 23/38/11 +f 24/51/9 32/172/9 30/52/9 +f 17/35/11 25/42/11 27/41/11 +f 39/53/18 40/59/18 37/54/18 +f 33/56/11 38/55/11 37/54/11 +f 35/58/19 37/54/19 40/59/19 +f 34/61/20 39/53/20 38/55/20 +f 36/63/9 40/59/9 39/53/9 +f 44/65/16 48/72/16 47/66/16 +f 43/68/21 122/79/21 121/69/21 +f 44/65/7 49/173/7 51/71/7 +f 42/73/8 47/66/8 46/74/8 +f 50/76/14 52/83/14 51/77/14 +f 122/79/8 124/174/8 123/80/8 +f 59/81/14 60/86/14 56/13/14 +f 47/66/11 48/72/11 46/74/11 +f 48/72/11 51/77/11 52/83/11 +f 57/84/11 59/81/11 55/82/11 +f 54/19/9 56/13/9 60/86/9 +f 57/88/6 61/175/6 62/89/6 +f 61/91/9 63/176/9 64/92/9 +f 60/86/16 66/95/16 65/94/16 +f 66/95/11 68/100/11 67/96/11 +f 65/94/8 61/177/8 57/97/8 +f 61/98/8 65/94/8 67/96/8 +f 59/90/14 62/89/14 66/95/14 +f 68/100/14 66/95/14 62/93/14 +f 73/101/14 74/178/14 72/102/14 +f 76/103/16 80/107/16 82/104/16 +f 75/106/11 79/109/11 80/107/11 +f 77/108/6 81/129/6 79/109/6 +f 78/105/9 82/104/9 81/110/9 +f 87/112/8 89/120/8 90/113/8 +f 84/115/22 88/114/22 90/113/22 +f 85/117/21 89/120/21 87/112/21 +f 86/119/9 90/113/9 89/120/9 +f 96/122/23 93/128/23 97/123/23 +f 95/125/24 97/179/24 98/126/24 +f 94/127/25 98/126/25 82/104/25 +f 93/128/26 96/122/26 79/109/26 +f 94/132/11 80/107/11 79/109/11 +f 79/109/11 96/130/11 94/132/11 +f 81/110/9 82/104/9 98/133/9 +f 98/133/9 97/180/9 93/134/9 +f 100/135/6 99/153/6 92/136/6 +f 101/138/6 102/181/6 100/135/6 +f 92/139/11 104/159/11 103/140/11 +f 102/142/27 108/161/27 106/143/27 +f 99/144/8 105/154/8 104/145/8 +f 91/141/28 103/140/28 107/147/28 +f 101/149/14 107/160/14 108/150/14 +f 100/135/9 106/143/9 105/152/9 +f 105/154/8 110/156/8 109/155/8 +f 110/156/16 112/158/16 111/157/16 +f 112/158/13 110/156/13 105/152/13 +f 109/155/29 111/157/29 103/140/29 +f 107/160/15 111/157/15 112/158/15 +f 120/162/9 119/182/9 117/163/9 +f 52/83/6 50/183/6 41/165/6 diff --git a/src/main/resources/assets/hbm/models/weapons/chemthrower.obj b/src/main/resources/assets/hbm/models/weapons/chemthrower.obj new file mode 100644 index 000000000..6951b0e8b --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/chemthrower.obj @@ -0,0 +1,10366 @@ +# Blender v2.79 (sub 0) OBJ File: 'chemthrower.blend' +# www.blender.org +o Gauge +v -0.812500 1.125000 1.750000 +v -0.812500 1.062500 1.718750 +v -0.812500 1.062500 1.781250 +v -0.812500 0.781250 1.718750 +v -0.812500 0.781250 1.781250 +v -0.812500 0.750000 1.687500 +v -0.812500 0.750000 1.812500 +v -0.812500 0.656250 1.687500 +v -0.812500 0.656250 1.812500 +v -0.781250 1.062500 1.718750 +v -0.781250 1.125000 1.750000 +v -0.781250 1.062500 1.781250 +v -0.781250 0.781250 1.718750 +v -0.781250 0.781250 1.781250 +v -0.781250 0.750000 1.687500 +v -0.781250 0.750000 1.812500 +v -0.781250 0.656250 1.687500 +v -0.781250 0.656250 1.812500 +vt 0.956522 0.427632 +vt 0.952569 0.434211 +vt 0.944664 0.434211 +vt 0.940711 0.427632 +vt 0.936759 0.434211 +vt 0.936759 0.427632 +vt 0.952569 0.506579 +vt 0.956522 0.434211 +vt 0.956522 0.506579 +vt 0.956522 0.407895 +vt 0.940711 0.401316 +vt 0.956522 0.401316 +vt 0.960474 0.407895 +vt 0.960474 0.427632 +vt 0.940711 0.506579 +vt 0.940711 0.434211 +vt 0.952569 0.519737 +vt 0.956522 0.519737 +vt 0.940711 0.407895 +vt 0.936759 0.407895 +vt 0.956522 0.434211 +vt 0.960474 0.434211 +vt 0.944664 0.506579 +vt 0.940711 0.519737 +vt 0.948617 0.519737 +vt 0.940711 0.434211 +vt 0.944664 0.519737 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.4472 -0.8944 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.4472 0.8944 +s off +f 15/1/1 13/2/1 14/3/1 +f 16/4/2 5/5/2 7/6/2 +f 10/7/3 4/8/3 2/9/3 +f 17/10/4 9/11/4 8/12/4 +f 15/1/3 8/13/3 6/14/3 +f 14/3/5 3/15/5 5/16/5 +f 11/17/6 2/9/6 1/18/6 +f 18/19/5 7/6/5 9/20/5 +f 13/21/7 6/14/7 4/22/7 +f 12/23/8 1/24/8 3/15/8 +f 12/23/1 10/7/1 11/25/1 +f 13/2/1 10/7/1 12/23/1 +f 14/3/1 16/4/1 15/1/1 +f 16/4/1 18/19/1 17/10/1 +f 13/2/1 12/23/1 14/3/1 +f 17/10/1 15/1/1 16/4/1 +f 16/4/2 14/26/2 5/5/2 +f 10/7/3 13/2/3 4/8/3 +f 17/10/4 18/19/4 9/11/4 +f 15/1/3 17/10/3 8/13/3 +f 14/3/5 12/23/5 3/15/5 +f 11/17/6 10/7/6 2/9/6 +f 18/19/5 16/4/5 7/6/5 +f 13/21/7 15/1/7 6/14/7 +f 12/23/8 11/27/8 1/24/8 +o Hose +v 3.636194 0.105520 1.124211 +v 3.431454 0.155037 1.151909 +v 3.374818 -0.029521 1.063205 +v 3.638785 0.003349 1.320623 +v 3.433896 0.048782 1.353090 +v 3.378546 -0.100682 1.223395 +v 3.583436 -0.146115 1.190928 +v 3.499617 -1.088292 0.865619 +v 3.294420 -1.078520 0.918903 +v 3.282859 -0.887307 0.833204 +v 3.488057 -0.897079 0.779921 +v 3.424359 -1.157790 0.631249 +v 3.221595 -1.144000 0.693171 +v 3.218235 -0.939250 0.636570 +v 3.420999 -0.953040 0.574649 +v 3.354418 -1.218511 0.415747 +v 3.151654 -1.204721 0.477669 +v 3.148294 -0.999971 0.421068 +v 3.351058 -1.013761 0.359147 +v 3.278193 -1.281636 0.183101 +v 3.078751 -1.266575 0.254083 +v 3.084637 -1.058287 0.222711 +v 3.284079 -1.073348 0.151728 +v 3.582730 -0.557112 1.391697 +v 3.373400 -0.555837 1.426606 +v 3.341904 -0.457226 1.245264 +v 3.551234 -0.458500 1.210355 +v 3.567073 -0.750126 1.240363 +v 3.356922 -0.757588 1.270663 +v 3.328674 -0.624428 1.107544 +v 3.538826 -0.616966 1.077243 +v 3.549878 -0.944667 1.080169 +v 3.340986 -0.945521 1.117642 +v 3.316982 -0.790103 0.978684 +v 3.525874 -0.789249 0.941211 +v 3.627329 -0.159071 1.443409 +v 3.421687 -0.123595 1.482787 +v 3.372809 -0.187485 1.293702 +v 3.578452 -0.222961 1.254324 +v 3.603014 -0.358402 1.464851 +v 3.395637 -0.338596 1.505368 +v 3.356417 -0.313269 1.301845 +v 3.563795 -0.333076 1.261328 +v 3.172221 -1.277496 -0.073578 +v 2.980067 -1.262438 0.015263 +v 3.006246 -1.054157 0.033612 +v 3.198400 -1.069215 -0.055229 +v 3.050292 -1.206096 -0.320498 +v 2.862106 -1.192312 -0.222860 +v 2.899330 -0.987577 -0.180018 +v 3.087517 -1.001361 -0.277656 +v 2.935870 -1.137106 -0.550774 +v 2.747684 -1.123321 -0.453135 +v 2.784908 -0.918586 -0.410293 +v 2.973094 -0.932371 -0.507932 +v 2.808083 -1.058682 -0.800750 +v 2.634602 -1.055277 -0.681434 +v 2.683850 -0.859030 -0.620868 +v 2.857332 -0.862434 -0.740184 +v 2.627134 -0.917498 -0.997121 +v 2.486886 -0.940009 -0.841662 +v 2.563307 -0.764951 -0.751544 +v 2.703555 -0.742439 -0.907003 +v 2.423224 -0.737106 -1.107039 +v 2.301505 -0.775153 -0.937114 +v 2.393075 -0.612796 -0.835169 +v 2.514794 -0.574749 -1.005094 +v 2.236154 -0.570833 -1.203811 +v 2.114434 -0.608880 -1.033886 +v 2.206005 -0.446523 -0.931941 +v 2.327724 -0.408477 -1.101866 +v 2.033221 -0.389803 -1.305461 +v 1.928881 -0.444018 -1.130191 +v 2.034797 -0.295007 -1.023835 +v 2.139136 -0.240792 -1.199104 +v 0.768002 0.897300 -0.902997 +v 0.769729 0.741081 -0.761747 +v 0.936046 0.831425 -0.665672 +v 0.934319 0.987643 -0.806922 +v 0.586922 1.034930 -0.691360 +v 0.605987 0.864148 -0.566430 +v 0.777991 0.949715 -0.475707 +v 0.758926 1.120497 -0.600637 +v 0.409624 1.167337 -0.480225 +v 0.444627 0.987386 -0.376602 +v 0.616153 1.073228 -0.285241 +v 0.581150 1.253179 -0.388864 +v 0.255900 1.232747 -0.255101 +v 0.321170 1.041185 -0.196884 +v 0.491789 1.127375 -0.104161 +v 0.426518 1.318937 -0.162378 +v -0.243118 1.089696 0.611090 +v -0.142188 0.902760 0.608758 +v 0.008606 0.982596 0.735347 +v -0.092324 1.169533 0.737679 +v -0.398558 0.998093 0.854647 +v -0.281298 0.828876 0.820545 +v -0.129019 0.910324 0.944245 +v -0.246279 1.079541 0.978347 +v -0.484899 0.840452 1.071465 +v -0.345375 0.716814 0.977688 +v -0.191071 0.802407 1.095962 +v -0.330596 0.926044 1.189738 +v -0.489997 0.641634 1.228992 +v -0.344539 0.545857 1.107312 +v -0.189696 0.633983 1.223048 +v -0.335154 0.729760 1.344728 +v -0.491858 0.458013 1.371299 +v -0.346400 0.362236 1.249619 +v -0.191557 0.450362 1.365355 +v -0.337015 0.546139 1.487035 +v -0.480968 0.237263 1.534873 +v -0.353568 0.194067 1.383075 +v -0.206169 0.303870 1.486394 +v -0.333570 0.347066 1.638193 +v -0.344535 0.032216 1.614572 +v -0.282839 0.082916 1.428124 +v -0.162528 0.231429 1.517159 +v -0.224224 0.180729 1.703606 +v -0.109536 -0.099468 1.574893 +v -0.149146 0.016430 1.414404 +v -0.033657 0.175379 1.493149 +v 0.005954 0.059481 1.653638 +v 0.027439 -0.147818 1.427059 +v -0.094405 -0.003112 1.356543 +v 0.043800 0.147879 1.410434 +v 0.165644 0.003173 1.480950 +v 1.807889 -0.170192 -1.324261 +v 1.737986 -0.257835 -1.145437 +v 1.872325 -0.136415 -1.036147 +v 1.942228 -0.048772 -1.214971 +v 1.591588 0.057490 -1.256966 +v 1.538742 -0.047411 -1.079934 +v 1.687160 0.059763 -0.972122 +v 1.740006 0.164665 -1.149155 +v 1.390855 0.269420 -1.191306 +v 1.338009 0.164519 -1.014274 +v 1.486427 0.271693 -0.906463 +v 1.539273 0.376595 -1.083495 +v 1.190122 0.481350 -1.125646 +v 1.137276 0.376449 -0.948614 +v 1.285694 0.483623 -0.840803 +v 1.338540 0.588525 -1.017835 +v 0.977027 0.705482 -1.053525 +v 0.942798 0.582204 -0.886224 +v 1.097323 0.683352 -0.781605 +v 1.131551 0.806630 -0.948905 +v 3.659060 0.000862 1.072935 +v 3.547982 0.176418 1.160236 +v 3.637631 0.058311 1.217889 +v 3.351951 0.075137 1.114481 +v 3.432854 0.106807 1.246779 +v 3.376540 -0.068978 1.147828 +v 3.581317 -0.117474 1.118938 +v 3.662333 -0.082741 1.247659 +v 3.550178 0.063431 1.369280 +v 3.636427 -0.066675 1.404950 +v 3.354999 -0.014591 1.296359 +v 3.431275 -0.025773 1.441530 +v 3.467154 -0.160764 1.174738 +v 3.378186 -0.136296 1.276492 +v 3.583339 -0.177199 1.239912 +v 3.545136 -0.995128 0.809449 +v 3.532326 -1.032816 0.982566 +v 3.399908 -1.131209 0.913686 +v 3.460659 -1.125235 0.743717 +v 3.324988 -1.027711 1.027578 +v 3.237340 -0.980471 0.889374 +v 3.257287 -1.112450 0.803479 +v 3.306216 -0.852215 0.914016 +v 3.382568 -0.844390 0.785138 +v 3.251877 -0.911084 0.739604 +v 3.513555 -0.857321 0.869004 +v 3.455249 -0.923870 0.679842 +v 3.473369 -1.058863 0.587469 +v 3.323817 -1.202083 0.676360 +v 3.389388 -1.188151 0.523498 +v 3.169224 -1.038178 0.680351 +v 3.186625 -1.174361 0.585420 +v 3.318777 -0.894958 0.591459 +v 3.183265 -0.969611 0.528819 +v 3.386028 -0.983401 0.466898 +v 3.403429 -1.119583 0.371967 +v 3.253876 -1.262803 0.460858 +v 3.317876 -1.249472 0.303710 +v 3.099283 -1.098898 0.464849 +v 3.115943 -1.235365 0.367897 +v 3.248836 -0.955678 0.375957 +v 3.114894 -1.029730 0.317603 +v 3.316828 -1.043838 0.253417 +v 3.330997 -1.181257 0.149669 +v 3.177001 -1.326178 0.226435 +v 3.231073 -1.296984 0.056483 +v 3.031833 -1.158666 0.256143 +v 3.035113 -1.281288 0.136461 +v 3.185829 -1.013745 0.179377 +v 3.050695 -1.071232 0.130133 +v 3.246655 -1.086928 0.050155 +v 3.619314 -0.508125 1.292299 +v 3.592019 -0.455955 1.449521 +v 3.485940 -0.581127 1.454487 +v 3.574598 -0.656845 1.314328 +v 3.383588 -0.445679 1.488136 +v 3.305320 -0.506213 1.344662 +v 3.364652 -0.662123 1.345781 +v 3.348536 -0.382662 1.292137 +v 3.438694 -0.433210 1.182474 +v 3.335592 -0.537600 1.178106 +v 3.556967 -0.392938 1.253522 +v 3.545538 -0.532322 1.146653 +v 3.605487 -0.681680 1.151228 +v 3.469059 -0.787147 1.296293 +v 3.559164 -0.843788 1.164183 +v 3.290260 -0.692873 1.196679 +v 3.349327 -0.849598 1.196276 +v 3.426688 -0.587407 1.051614 +v 3.322140 -0.710874 1.039197 +v 3.531977 -0.705064 1.007103 +v 3.590099 -0.866744 1.001322 +v 3.451433 -0.983948 1.133645 +v 3.276761 -0.868026 1.057531 +v 3.415427 -0.750822 0.925208 +v 3.654301 -0.199885 1.339022 +v 3.536728 -0.125361 1.510369 +v 3.615016 -0.260695 1.456532 +v 3.345838 -0.146671 1.398089 +v 3.408639 -0.232073 1.497265 +v 3.463411 -0.221195 1.226742 +v 3.364769 -0.248419 1.295372 +v 3.571146 -0.277040 1.254639 +v 3.635249 -0.350691 1.352960 +v 3.509130 -0.354831 1.535990 +v 3.324183 -0.320981 1.413736 +v 3.450301 -0.316841 1.230705 +v 3.233349 -1.177120 -0.086614 +v 3.069600 -1.322037 -0.033745 +v 3.109380 -1.241194 -0.201199 +v 2.945118 -1.154533 0.046648 +v 2.920202 -1.227091 -0.105760 +v 3.108867 -1.009616 -0.006221 +v 2.954665 -1.021469 -0.069042 +v 3.143843 -1.035572 -0.164481 +v 3.115951 -1.107175 -0.323487 +v 2.946893 -1.250388 -0.282390 +v 2.993081 -1.171601 -0.435636 +v 2.833672 -1.086498 -0.177029 +v 2.804895 -1.157816 -0.337998 +v 3.002730 -0.943285 -0.218127 +v 2.842119 -0.953082 -0.295156 +v 3.030305 -0.966866 -0.392794 +v 3.001529 -1.038184 -0.553762 +v 2.832471 -1.181397 -0.512665 +v 2.875318 -1.100252 -0.670836 +v 2.719249 -1.017508 -0.407305 +v 2.690808 -1.089063 -0.567779 +v 2.888308 -0.874295 -0.448402 +v 2.731038 -0.886450 -0.520506 +v 2.915548 -0.897639 -0.623564 +v 2.876078 -0.961409 -0.800296 +v 2.709031 -1.106042 -0.756233 +v 2.727558 -1.001421 -0.917262 +v 2.615856 -0.956303 -0.621322 +v 2.569738 -1.009686 -0.778071 +v 2.782903 -0.811670 -0.665385 +v 2.631791 -0.822979 -0.701256 +v 2.789611 -0.814714 -0.840446 +v 2.700406 -0.824341 -0.990927 +v 2.537905 -0.972518 -0.941920 +v 2.520969 -0.823772 -1.055367 +v 2.490035 -0.858108 -0.757738 +v 2.394618 -0.857935 -0.889058 +v 2.652536 -0.709930 -0.806745 +v 2.482401 -0.692403 -0.790070 +v 2.608752 -0.658240 -0.956379 +v 2.499439 -0.646416 -1.098548 +v 2.339472 -0.796719 -1.047563 +v 2.329689 -0.653970 -1.155425 +v 2.316861 -0.703486 -0.843661 +v 2.207970 -0.692016 -0.985500 +v 2.476828 -0.553184 -0.894646 +v 2.299540 -0.529660 -0.883555 +v 2.421259 -0.491613 -1.053480 +v 2.312368 -0.480143 -1.195320 +v 2.152401 -0.630445 -1.144335 +v 2.138653 -0.484007 -1.253417 +v 2.129790 -0.537213 -0.940433 +v 2.021279 -0.526096 -1.082155 +v 2.289757 -0.386911 -0.991417 +v 2.116435 -0.367076 -0.979108 +v 2.233809 -0.324987 -1.150369 +v 2.112263 -0.301744 -1.296100 +v 1.954572 -0.454164 -1.244416 +v 1.922189 -0.285954 -1.336793 +v 1.955754 -0.383066 -1.033196 +v 1.835149 -0.356610 -1.157963 +v 2.113445 -0.230647 -1.084880 +v 1.955342 -0.221169 -1.048667 +v 2.042383 -0.150513 -1.227497 +v 0.850729 0.981526 -0.890271 +v 0.868407 0.812520 -0.996247 +v 0.727287 0.796605 -0.856391 +v 0.674584 0.968533 -0.794469 +v 0.852476 0.671819 -0.840325 +v 0.853320 0.747199 -0.678398 +v 0.689314 0.801392 -0.665459 +v 1.013001 0.767251 -0.739438 +v 0.976762 0.932120 -0.712278 +v 0.859896 0.888152 -0.573399 +v 1.028932 0.907953 -0.895359 +v 0.845166 1.055293 -0.702409 +v 0.668158 1.120409 -0.677231 +v 0.553454 0.928148 -0.651576 +v 0.500206 1.100022 -0.588376 +v 0.696755 0.864236 -0.489836 +v 0.523255 0.926948 -0.468773 +v 0.811459 1.056498 -0.515492 +v 0.695139 1.012583 -0.377890 +v 0.672090 1.185658 -0.497494 +v 0.486636 1.255246 -0.460450 +v 0.384244 1.055902 -0.451254 +v 0.324936 1.217904 -0.368577 +v 0.539140 0.985319 -0.305015 +v 0.375474 1.030465 -0.286959 +v 0.641533 1.184664 -0.314212 +v 0.546535 1.116531 -0.194938 +v 0.495996 1.303969 -0.276556 +v 0.324891 1.323732 -0.223294 +v 0.245880 1.115419 -0.249173 +v 0.422797 1.036389 -0.135968 +v 0.501808 1.244703 -0.110089 +v -0.169789 1.130692 0.497876 +v -0.070228 0.943143 0.497768 +v 0.081810 1.023537 0.622334 +v -0.017750 1.211086 0.622442 +v -0.192953 1.176348 0.674968 +v -0.230351 0.976268 0.578277 +v -0.318611 1.046310 0.728536 +v -0.041558 0.895944 0.671470 +v -0.213598 0.863804 0.718262 +v -0.004160 1.096024 0.768160 +v -0.062433 0.944044 0.844128 +v -0.167446 1.126550 0.854403 +v -0.351734 1.081121 0.925023 +v -0.377998 0.893123 0.806671 +v -0.461230 0.933366 0.974074 +v -0.175843 0.827296 0.873869 +v -0.330239 0.784403 0.909167 +v -0.149579 1.015295 0.992221 +v -0.176711 0.867693 1.030066 +v -0.307703 1.016655 1.094972 +v -0.442629 0.914157 1.154046 +v -0.453713 0.757235 0.995008 +v -0.488257 0.737243 1.154034 +v -0.233342 0.728701 1.013381 +v -0.344282 0.634501 1.039329 +v -0.222258 0.885624 1.172418 +v -0.189574 0.721994 1.155700 +v -0.333549 0.824736 1.270404 +v -0.448940 0.709641 1.317280 +v -0.455979 0.571713 1.139218 +v -0.490928 0.549823 1.300146 +v -0.230753 0.565976 1.134760 +v -0.345469 0.454046 1.178465 +v -0.223714 0.703903 1.312822 +v -0.190626 0.542172 1.294201 +v -0.336085 0.637949 1.415882 +v -0.450801 0.526020 1.459587 +v -0.457840 0.388093 1.281525 +v -0.489601 0.356920 1.447769 +v -0.232614 0.382355 1.277067 +v -0.348657 0.274288 1.318559 +v -0.225575 0.520282 1.455129 +v -0.195675 0.367834 1.431191 +v -0.336619 0.450466 1.560401 +v -0.439119 0.302964 1.624482 +v -0.454118 0.188214 1.433144 +v -0.440950 0.121532 1.601008 +v -0.248018 0.238169 1.396785 +v -0.339004 0.128100 1.425488 +v -0.233020 0.352919 1.588123 +v -0.202100 0.258419 1.519028 +v -0.304045 0.251851 1.694548 +v -0.299803 0.093797 1.705701 +v -0.343765 0.020438 1.499089 +v -0.223478 -0.038759 1.598291 +v -0.207260 0.169847 1.426029 +v -0.210933 0.048899 1.416067 +v -0.163298 0.243207 1.632641 +v -0.101649 0.208537 1.501595 +v -0.114194 0.120879 1.683819 +v -0.041888 -0.048968 1.654388 +v -0.158213 -0.081256 1.474963 +v -0.020099 -0.139344 1.524457 +v -0.101304 0.124879 1.413654 +v -0.107097 -0.004303 1.401706 +v 0.015021 0.157167 1.593080 +v 0.021482 0.149359 1.470026 +v 0.108480 0.014317 1.592777 +v 0.127003 -0.108499 1.471634 +v -0.068034 -0.113213 1.378328 +v 0.051443 -0.140146 1.311562 +v -0.055764 0.108560 1.365860 +v -0.091833 0.008253 1.285659 +v 0.139273 0.113274 1.459165 +v 0.052292 0.158225 1.327227 +v 0.195568 0.009825 1.353130 +v 1.892534 -0.087572 -1.314322 +v 1.739353 -0.244369 -1.262171 +v 1.695847 -0.052413 -1.290205 +v 1.787680 -0.219035 -1.046086 +v 1.638736 -0.153000 -1.112725 +v 1.940861 -0.062238 -1.098236 +v 1.783634 -0.042264 -1.004544 +v 1.840745 0.058323 -1.182024 +v 1.679008 0.137303 -1.247318 +v 1.528061 -0.021754 -1.195403 +v 1.491222 0.163455 -1.224136 +v 1.599739 -0.020050 -0.981770 +v 1.438375 0.058553 -1.047104 +v 1.750687 0.139007 -1.033686 +v 1.586793 0.165728 -0.939293 +v 1.639639 0.270630 -1.116325 +v 1.478275 0.349233 -1.181658 +v 1.327328 0.190176 -1.129743 +v 1.290488 0.375386 -1.158476 +v 1.399006 0.191880 -0.916110 +v 1.237643 0.270484 -0.981444 +v 1.549954 0.350937 -0.968026 +v 1.386060 0.377658 -0.873633 +v 1.438906 0.482560 -1.050665 +v 1.277542 0.561163 -1.115999 +v 1.126595 0.402106 -1.064083 +v 1.086665 0.590366 -1.091201 +v 1.198273 0.403811 -0.850451 +v 1.038473 0.480870 -0.916602 +v 1.349221 0.562868 -0.902366 +v 1.188418 0.586538 -0.809588 +v 1.236609 0.696033 -0.984188 +v 1.062846 0.786876 -1.043040 +v 0.921282 0.618557 -0.996029 +v 1.011503 0.601959 -0.792090 +v 1.153068 0.770278 -0.839100 +v 3.661171 -0.132163 1.313286 +v 3.547123 -0.018593 1.464500 +v 3.353442 -0.070809 1.368156 +v 3.467491 -0.184378 1.216942 +v 3.574775 -0.946345 0.914532 +v 3.433350 -1.074137 1.033463 +v 3.263768 -0.938686 0.982050 +v 3.405193 -0.810894 0.863119 +v 3.626601 -0.427015 1.341868 +v 3.496567 -0.466571 1.517828 +v 3.313954 -0.411602 1.399790 +v 3.443989 -0.372046 1.223830 +v 3.287854 -1.195880 0.033325 +v 3.129198 -1.341650 0.098054 +v 2.993914 -1.172336 0.153292 +v 3.152571 -1.026566 0.088562 +v 2.798040 -0.906002 -0.913651 +v 2.633135 -1.052230 -0.866870 +v 2.561310 -0.918399 -0.704866 +v 2.726214 -0.772170 -0.751647 +v 2.004046 -0.200570 -1.326853 +v 1.848620 -0.355142 -1.274702 +v 1.873485 -0.306553 -1.058607 +v 2.028911 -0.151981 -1.110758 +v 0.397831 1.307796 -0.342971 +v 0.307440 1.102668 -0.350773 +v 0.473639 1.026639 -0.220544 +v 0.564030 1.231767 -0.212741 +v -0.417215 1.012251 1.050749 +v -0.434116 0.838062 0.911396 +v -0.220727 0.788807 0.953390 +v -0.203825 0.962997 1.092744 +v -0.397984 0.185049 1.691658 +v -0.424203 0.092236 1.489863 +v -0.245066 0.194901 1.428378 +v -0.218846 0.287714 1.630173 +v 0.065940 -0.096274 1.589305 +v -0.095743 -0.110239 1.446001 +v -0.064557 0.106288 1.405178 +v 0.097126 0.120253 1.548482 +v 0.952652 0.895412 -0.984783 +v 0.820310 0.718311 -0.943508 +v 0.928756 0.684360 -0.750901 +v 1.061098 0.861460 -0.792177 +v 3.660669 -0.041706 1.161191 +v 3.549321 0.126505 1.257072 +v 3.353503 0.031039 1.204526 +v 3.464850 -0.137172 1.108645 +v 3.508797 -1.027749 0.696839 +v 3.360325 -1.169184 0.789567 +v 3.203739 -1.008571 0.786482 +v 3.352210 -0.867136 0.693754 +v 3.438399 -1.089223 0.479718 +v 3.288846 -1.232443 0.568609 +v 3.134254 -1.068538 0.572600 +v 3.283806 -0.925318 0.483708 +v 3.367836 -1.150182 0.262517 +v 3.217172 -1.293827 0.348377 +v 3.064935 -1.129020 0.358797 +v 3.215599 -0.985375 0.272937 +v 3.612555 -0.593265 1.222627 +v 3.476890 -0.690615 1.371973 +v 3.297636 -0.601181 1.269806 +v 3.433300 -0.503831 1.120461 +v 3.598029 -0.772974 1.077620 +v 3.461042 -0.881374 1.219499 +v 3.283275 -0.781689 1.125760 +v 3.420262 -0.673288 0.983881 +v 3.644676 -0.276023 1.345402 +v 3.522795 -0.242298 1.527371 +v 3.335109 -0.233091 1.406502 +v 3.456990 -0.266816 1.224532 +v 3.173906 -1.141909 -0.206700 +v 3.006175 -1.285548 -0.162659 +v 2.890139 -1.120754 -0.063541 +v 3.057869 -0.977116 -0.107582 +v 3.058740 -1.072680 -0.438625 +v 2.889682 -1.215892 -0.397527 +v 2.776460 -1.052003 -0.292167 +v 2.945518 -0.908790 -0.333265 +v 2.941561 -1.001743 -0.672965 +v 2.773005 -1.145311 -0.631126 +v 2.664795 -0.984959 -0.518378 +v 2.833351 -0.841391 -0.560217 +v 2.596448 -0.732466 -1.047450 +v 2.435848 -0.882236 -0.996959 +v 2.406922 -0.783710 -0.797987 +v 2.567522 -0.633939 -0.848477 +v 2.405904 -0.563280 -1.146934 +v 2.245937 -0.713582 -1.095949 +v 2.223325 -0.620350 -0.892047 +v 2.383292 -0.470047 -0.943032 +v 2.215575 -0.393975 -1.244708 +v 2.056177 -0.544807 -1.193548 +v 2.039513 -0.457108 -0.987816 +v 2.198911 -0.306277 -1.038976 +v 0.756193 1.053698 -0.780692 +v 0.639304 0.863272 -0.752980 +v 0.778288 0.802987 -0.587177 +v 0.895177 0.993413 -0.614888 +v 0.580385 1.186108 -0.572836 +v 0.468759 0.992076 -0.551295 +v 0.614959 0.926497 -0.393431 +v 0.726585 1.120529 -0.414971 +v -0.118660 1.217776 0.560186 +v -0.158018 1.016819 0.466680 +v 0.030681 0.936453 0.560024 +v 0.070040 1.137410 0.653530 +v -0.269281 1.132057 0.794038 +v -0.303896 0.934998 0.691932 +v -0.111763 0.858297 0.778626 +v -0.077148 1.055357 0.880732 +v -0.446897 0.806675 1.240895 +v -0.454947 0.663999 1.067589 +v -0.230935 0.652562 1.068838 +v -0.222885 0.795238 1.242144 +v -0.449871 0.617831 1.388434 +v -0.456909 0.479903 1.210371 +v -0.231683 0.474165 1.205913 +v -0.224645 0.612092 1.383976 +v -0.448346 0.424351 1.536388 +v -0.457375 0.292218 1.355006 +v -0.236930 0.300403 1.342573 +v -0.227902 0.432536 1.523954 +v -0.171973 0.019145 1.686611 +v -0.244527 -0.034840 1.485797 +v -0.153155 0.150632 1.413275 +v -0.080601 0.204618 1.614089 +v 0.159325 -0.102261 1.338822 +v -0.056226 -0.103439 1.288218 +v -0.055590 0.120339 1.299967 +v 0.159961 0.121517 1.350570 +v 1.782573 0.028102 -1.280484 +v 1.631067 -0.130390 -1.228510 +v 1.696908 -0.122779 -1.014264 +v 1.848414 0.035713 -1.066238 +v 1.578642 0.243268 -1.214488 +v 1.427694 0.084211 -1.162573 +v 1.499373 0.085915 -0.948940 +v 1.650321 0.244972 -1.000856 +v 1.377909 0.455198 -1.148829 +v 1.226961 0.296141 -1.096913 +v 1.298640 0.297845 -0.883280 +v 1.449588 0.456903 -0.935196 +v 1.173685 0.670574 -1.081344 +v 1.025083 0.509201 -1.030655 +v 1.101398 0.506330 -0.819445 +v 1.250000 0.667703 -0.870135 +v -0.198370 1.075389 0.432724 +v 0.170365 1.169314 -0.213583 +v -0.142441 0.943850 0.445517 +v 0.226294 1.037776 -0.200790 +v -0.023875 0.889365 0.505244 +v 0.344860 0.983291 -0.141063 +v 0.087876 0.943850 0.576918 +v 0.456611 1.037776 -0.069388 +v 0.127348 1.075389 0.618555 +v 0.496083 1.169314 -0.027752 +v 0.071420 1.206927 0.605762 +v 0.440155 1.300853 -0.040545 +v -0.047147 1.261412 0.546035 +v 0.321588 1.355338 -0.100272 +v -0.158898 1.206927 0.474360 +v 0.209837 1.300853 -0.171947 +v 0.199561 1.004891 -0.220821 +v 0.129651 1.169314 -0.236811 +v 0.347769 0.936785 -0.146162 +v 0.487457 1.004891 -0.056568 +v 0.536798 1.169314 -0.004523 +v 0.466887 1.333738 -0.020514 +v 0.318679 1.401844 -0.095173 +v 0.178991 1.333738 -0.184766 +v 0.261017 1.020545 -0.328539 +v 0.191106 1.184969 -0.344529 +v 0.409225 0.952439 -0.253880 +v 0.548913 1.020545 -0.164286 +v 0.598253 1.184969 -0.112241 +v 0.528343 1.349392 -0.128232 +v 0.380135 1.417499 -0.202891 +v 0.240447 1.349392 -0.292484 +v -0.239084 1.075389 0.409495 +v -0.169174 0.910965 0.425486 +v -0.020966 0.842859 0.500145 +v 0.118722 0.910965 0.589738 +v 0.168063 1.075389 0.641783 +v 0.098152 1.239812 0.625793 +v -0.050056 1.307918 0.551134 +v -0.189744 1.239812 0.461541 +v -0.300540 1.059734 0.517213 +v -0.230630 0.895311 0.533204 +v -0.082421 0.827204 0.607863 +v 0.057267 0.895311 0.697456 +v 0.106607 1.059734 0.749501 +v 0.036696 1.224158 0.733511 +v -0.111512 1.292264 0.658852 +v -0.251200 1.224158 0.569258 +v -0.104048 1.238083 0.582708 +v -0.106962 1.235316 0.606286 +v -0.092269 1.234170 0.625124 +v -0.068576 1.235316 0.628186 +v -0.049762 1.238083 0.613680 +v -0.046848 1.240851 0.590102 +v -0.061541 1.241997 0.571265 +v -0.085234 1.240851 0.568202 +v -0.111806 1.362099 0.596305 +v -0.114720 1.359332 0.619883 +v -0.100027 1.358186 0.638721 +v -0.076334 1.359332 0.641783 +v -0.057520 1.362099 0.627277 +v -0.054606 1.364866 0.603699 +v -0.069299 1.366013 0.584862 +v -0.092992 1.364866 0.581799 +v -0.167738 1.323268 0.631279 +v -0.059165 1.323268 0.693223 +v 0.016630 1.370231 0.308126 +v 0.125202 1.370231 0.370069 +v 0.254696 1.556864 -0.109148 +v 0.363268 1.556864 -0.047205 +v 0.316152 1.572518 -0.216866 +v 0.424724 1.572518 -0.154923 +v 0.020509 1.308223 0.301327 +v 0.129081 1.308223 0.363271 +v 0.258574 1.494856 -0.115947 +v 0.367147 1.494856 -0.054003 +v -0.198370 1.075389 0.432724 +v 0.170365 1.169314 -0.213583 +v -0.142441 0.943850 0.445517 +v 0.226294 1.037776 -0.200790 +v -0.023875 0.889365 0.505244 +v 0.344860 0.983291 -0.141063 +v 0.087876 0.943850 0.576918 +v 0.456611 1.037776 -0.069388 +v 0.127348 1.075389 0.618555 +v 0.496083 1.169314 -0.027752 +v 0.071420 1.206927 0.605762 +v 0.440155 1.300853 -0.040545 +v -0.047147 1.261412 0.546035 +v 0.321588 1.355338 -0.100272 +v -0.158898 1.206927 0.474360 +v 0.209837 1.300853 -0.171947 +v 0.199561 1.004891 -0.220821 +v 0.129651 1.169314 -0.236811 +v 0.347769 0.936785 -0.146162 +v 0.487457 1.004891 -0.056568 +v 0.536798 1.169314 -0.004523 +v 0.466887 1.333738 -0.020514 +v 0.318679 1.401844 -0.095173 +v 0.178991 1.333738 -0.184766 +v 0.261017 1.020545 -0.328539 +v 0.191106 1.184969 -0.344529 +v 0.409225 0.952439 -0.253880 +v 0.548913 1.020545 -0.164286 +v 0.598253 1.184969 -0.112241 +v 0.528343 1.349392 -0.128232 +v 0.380135 1.417499 -0.202891 +v 0.240447 1.349392 -0.292484 +v -0.239084 1.075389 0.409495 +v -0.169174 0.910965 0.425486 +v -0.020966 0.842859 0.500145 +v 0.118722 0.910965 0.589738 +v 0.168063 1.075389 0.641783 +v 0.098152 1.239812 0.625793 +v -0.050056 1.307918 0.551134 +v -0.189744 1.239812 0.461541 +v -0.300540 1.059734 0.517213 +v -0.230630 0.895311 0.533204 +v -0.082421 0.827204 0.607863 +v 0.057267 0.895311 0.697456 +v 0.106607 1.059734 0.749501 +v 0.036696 1.224158 0.733511 +v -0.111512 1.292264 0.658852 +v -0.251200 1.224158 0.569258 +v -0.111806 1.362099 0.596305 +v -0.114720 1.359332 0.619883 +v -0.100027 1.358186 0.638721 +v -0.076334 1.359332 0.641783 +v -0.057520 1.362099 0.627277 +v -0.054606 1.364866 0.603699 +v -0.069299 1.366013 0.584862 +v -0.092992 1.364866 0.581799 +vt 0.225296 0.842105 +vt 0.229249 0.822368 +vt 0.229249 0.842105 +vt 0.177866 0.743421 +vt 0.173913 0.763158 +vt 0.173913 0.743421 +vt 0.225296 0.723684 +vt 0.229249 0.743421 +vt 0.225296 0.743421 +vt 0.225296 0.782895 +vt 0.229249 0.802632 +vt 0.225296 0.802632 +vt 0.225296 0.822368 +vt 0.225296 0.684211 +vt 0.229249 0.703947 +vt 0.225296 0.703947 +vt 0.229249 0.763158 +vt 0.225296 0.763158 +vt 0.229249 0.723684 +vt 0.229249 0.782895 +vt 0.252964 0.684553 +vt 0.268569 0.710526 +vt 0.252964 0.736500 +vt 0.177866 0.703947 +vt 0.173913 0.723684 +vt 0.173913 0.703947 +vt 0.177866 0.782895 +vt 0.177866 0.763158 +vt 0.177866 0.822368 +vt 0.173913 0.842105 +vt 0.173913 0.822368 +vt 0.177866 0.723684 +vt 0.173913 0.802632 +vt 0.173913 0.782895 +vt 0.177866 0.802632 +vt 0.177866 0.684211 +vt 0.173913 0.684211 +vt 0.139164 0.692160 +vt 0.161232 0.692160 +vt 0.161232 0.728892 +vt 0.724842 0.683746 +vt 0.721799 0.683746 +vt 0.719647 0.680164 +vt 0.743083 0.651316 +vt 0.782609 0.638158 +vt 0.782609 0.651316 +vt 0.782609 0.657895 +vt 0.790514 0.638158 +vt 0.782609 0.631579 +vt 0.790514 0.651316 +vt 0.719368 0.638158 +vt 0.719368 0.651316 +vt 0.743083 0.638158 +vt 0.743083 0.631579 +vt 0.743083 0.657895 +vt 0.229249 0.684211 +vt 0.263999 0.692160 +vt 0.263998 0.728892 +vt 0.241930 0.728892 +vt 0.237360 0.710526 +vt 0.241930 0.692160 +vt 0.177866 0.842105 +vt 0.139164 0.728892 +vt 0.134593 0.710526 +vt 0.150198 0.684553 +vt 0.165802 0.710526 +vt 0.150198 0.736499 +vt 0.719647 0.675099 +vt 0.721799 0.671518 +vt 0.724842 0.671518 +vt 0.726993 0.675099 +vt 0.726993 0.680164 +vt 0.229249 0.703947 +vt 0.237154 0.684211 +vt 0.237154 0.703947 +vt 0.229249 0.723684 +vt 0.237154 0.743421 +vt 0.229249 0.743421 +vt 0.229249 0.763158 +vt 0.237154 0.782895 +vt 0.229249 0.782895 +vt 0.229249 0.842105 +vt 0.237154 0.822368 +vt 0.237154 0.842105 +vt 0.237154 0.723684 +vt 0.225296 0.750000 +vt 0.177866 0.763158 +vt 0.177866 0.750000 +vt 0.225296 0.736842 +vt 0.177866 0.736842 +vt 0.225296 0.723684 +vt 0.177866 0.723684 +vt 0.177866 0.710526 +vt 0.177866 0.697368 +vt 0.225296 0.710526 +vt 0.225296 0.684211 +vt 0.177866 0.684211 +vt 0.177866 0.776316 +vt 0.225296 0.789474 +vt 0.177866 0.789474 +vt 0.225296 0.763158 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.513834 0.868421 +vt 0.529644 0.842105 +vt 0.529644 0.868421 +vt 0.529644 0.815789 +vt 0.513834 0.842105 +vt 0.513834 0.815789 +vt 0.545455 0.947368 +vt 0.545455 0.921053 +vt 0.529644 0.894737 +vt 0.545455 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.868421 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.789474 +vt 0.561265 0.815789 +vt 0.545455 1.000000 +vt 0.529644 0.973684 +vt 0.545455 0.973684 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.735178 0.921053 +vt 0.719368 0.947368 +vt 0.719368 0.921053 +vt 0.735178 0.894737 +vt 0.750988 0.894737 +vt 0.750988 0.921053 +vt 0.735178 0.947368 +vt 0.719368 0.868421 +vt 0.735178 0.868421 +vt 0.719368 0.842105 +vt 0.735178 0.842105 +vt 0.750988 0.868421 +vt 0.719368 0.815789 +vt 0.735178 0.815789 +vt 0.719368 0.789474 +vt 0.735178 0.789474 +vt 0.750988 0.815789 +vt 0.750988 0.842105 +vt 0.735178 0.973684 +vt 0.719368 1.000000 +vt 0.719368 0.973684 +vt 0.750988 0.947368 +vt 0.750988 0.973684 +vt 0.735178 1.000000 +vt 0.766798 0.921053 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.513834 0.947368 +vt 0.766798 0.868421 +vt 0.766798 0.842105 +vt 0.513834 0.868421 +vt 0.529644 0.842105 +vt 0.529644 0.868421 +vt 0.766798 0.815789 +vt 0.750988 0.789474 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.513834 0.842105 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.947368 +vt 0.529644 0.973684 +vt 0.513834 0.973684 +vt 0.513834 1.000000 +vt 0.545455 0.921053 +vt 0.529644 0.947368 +vt 0.545455 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.947368 +vt 0.545455 0.868421 +vt 0.529644 0.894737 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.529644 1.000000 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.947368 +vt 0.577075 0.921053 +vt 0.561265 0.894737 +vt 0.577075 0.894737 +vt 0.592885 0.921053 +vt 0.592885 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.577075 0.789474 +vt 0.592885 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.640316 0.921053 +vt 0.624506 0.947368 +vt 0.624506 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.624506 0.868421 +vt 0.640316 0.868421 +vt 0.624506 0.842105 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.624506 0.815789 +vt 0.640316 0.815789 +vt 0.624506 0.789474 +vt 0.640316 0.789474 +vt 0.656126 0.815789 +vt 0.656126 0.842105 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.624506 0.973684 +vt 0.656126 0.947368 +vt 0.656126 0.973684 +vt 0.640316 1.000000 +vt 0.671937 0.921053 +vt 0.671937 0.894737 +vt 0.687747 0.921053 +vt 0.687747 0.947368 +vt 0.671937 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.656126 0.789474 +vt 0.671937 0.789474 +vt 0.687747 0.789474 +vt 0.687747 0.815789 +vt 0.671937 0.973684 +vt 0.656126 1.000000 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.671937 1.000000 +vt 0.703557 0.947368 +vt 0.703557 0.921053 +vt 0.687747 0.894737 +vt 0.703557 0.894737 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.703557 0.815789 +vt 0.703557 0.789474 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.577075 0.921053 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.577075 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.592885 0.842105 +vt 0.577075 0.973684 +vt 0.592885 0.947368 +vt 0.592885 0.973684 +vt 0.577075 1.000000 +vt 0.608696 0.947368 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.608696 1.000000 +vt 0.608696 0.973684 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.624506 0.894737 +vt 0.624506 0.921053 +vt 0.608696 0.947368 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.624506 0.868421 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.624506 0.815789 +vt 0.624506 0.842105 +vt 0.608696 0.973684 +vt 0.624506 0.947368 +vt 0.624506 0.973684 +vt 0.608696 1.000000 +vt 0.640316 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.640316 0.868421 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.640316 0.815789 +vt 0.624506 0.789474 +vt 0.640316 0.789474 +vt 0.656126 0.815789 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.656126 0.947368 +vt 0.656126 0.973684 +vt 0.656126 1.000000 +vt 0.640316 1.000000 +vt 0.671937 0.947368 +vt 0.671937 0.921053 +vt 0.671937 0.894737 +vt 0.687747 0.894737 +vt 0.687747 0.921053 +vt 0.687747 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.656126 0.789474 +vt 0.671937 0.789474 +vt 0.687747 0.815789 +vt 0.671937 1.000000 +vt 0.671937 0.973684 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.947368 +vt 0.703557 0.921053 +vt 0.703557 0.894737 +vt 0.719368 0.894737 +vt 0.719368 0.921053 +vt 0.719368 0.947368 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.719368 0.842105 +vt 0.719368 0.868421 +vt 0.703557 0.815789 +vt 0.687747 0.789474 +vt 0.703557 0.789474 +vt 0.719368 0.815789 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.719368 0.973684 +vt 0.719368 1.000000 +vt 0.735178 0.921053 +vt 0.735178 0.894737 +vt 0.750988 0.921053 +vt 0.735178 0.947368 +vt 0.735178 0.868421 +vt 0.735178 0.842105 +vt 0.750988 0.868421 +vt 0.750988 0.894737 +vt 0.735178 0.815789 +vt 0.735178 0.789474 +vt 0.750988 0.789474 +vt 0.750988 0.815789 +vt 0.750988 0.842105 +vt 0.735178 0.973684 +vt 0.750988 0.947368 +vt 0.750988 0.973684 +vt 0.735178 1.000000 +vt 0.766798 0.921053 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.513834 0.947368 +vt 0.766798 0.868421 +vt 0.766798 0.842105 +vt 0.513834 0.842105 +vt 0.529644 0.868421 +vt 0.513834 0.868421 +vt 0.529644 0.894737 +vt 0.766798 0.815789 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.947368 +vt 0.513834 0.973684 +vt 0.529644 0.947368 +vt 0.529644 0.973684 +vt 0.529644 1.000000 +vt 0.513834 1.000000 +vt 0.545455 0.921053 +vt 0.545455 0.894737 +vt 0.561265 0.894737 +vt 0.561265 0.921053 +vt 0.561265 0.947368 +vt 0.545455 0.947368 +vt 0.545455 0.868421 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.529644 0.842105 +vt 0.545455 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.947368 +vt 0.577075 0.921053 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.592885 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.561265 0.789474 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.766798 0.947368 +vt 0.750988 0.921053 +vt 0.766798 0.921053 +vt 0.750988 0.894737 +vt 0.766798 0.894737 +vt 0.513834 0.894737 +vt 0.529644 0.921053 +vt 0.513834 0.921053 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.750988 0.868421 +vt 0.766798 0.868421 +vt 0.750988 0.842105 +vt 0.766798 0.842105 +vt 0.513834 0.842105 +vt 0.529644 0.868421 +vt 0.513834 0.868421 +vt 0.529644 0.894737 +vt 0.766798 0.815789 +vt 0.750988 0.815789 +vt 0.766798 0.789474 +vt 0.513834 0.815789 +vt 0.529644 0.789474 +vt 0.529644 0.815789 +vt 0.766798 0.973684 +vt 0.750988 1.000000 +vt 0.750988 0.973684 +vt 0.513834 0.973684 +vt 0.529644 0.973684 +vt 0.513834 1.000000 +vt 0.545455 0.947368 +vt 0.545455 0.921053 +vt 0.545455 0.894737 +vt 0.561265 0.894737 +vt 0.561265 0.921053 +vt 0.545455 0.868421 +vt 0.529644 0.842105 +vt 0.545455 0.842105 +vt 0.561265 0.842105 +vt 0.561265 0.868421 +vt 0.545455 0.815789 +vt 0.545455 0.789474 +vt 0.561265 0.815789 +vt 0.545455 0.973684 +vt 0.529644 1.000000 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.545455 1.000000 +vt 0.577075 0.921053 +vt 0.561265 0.947368 +vt 0.577075 0.894737 +vt 0.592885 0.894737 +vt 0.592885 0.921053 +vt 0.577075 0.947368 +vt 0.577075 0.868421 +vt 0.577075 0.842105 +vt 0.592885 0.842105 +vt 0.592885 0.868421 +vt 0.577075 0.815789 +vt 0.561265 0.789474 +vt 0.577075 0.789474 +vt 0.592885 0.815789 +vt 0.577075 1.000000 +vt 0.577075 0.973684 +vt 0.592885 0.973684 +vt 0.592885 1.000000 +vt 0.608696 0.947368 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.608696 0.973684 +vt 0.529644 0.868421 +vt 0.513834 0.842105 +vt 0.529644 0.842105 +vt 0.513834 0.815789 +vt 0.529644 0.815789 +vt 0.545455 0.815789 +vt 0.545455 0.842105 +vt 0.513834 0.789474 +vt 0.529644 0.789474 +vt 0.513834 1.000000 +vt 0.529644 0.973684 +vt 0.529644 1.000000 +vt 0.545455 0.973684 +vt 0.545455 1.000000 +vt 0.545455 0.789474 +vt 0.529644 0.947368 +vt 0.513834 0.973684 +vt 0.513834 0.947368 +vt 0.529644 0.921053 +vt 0.545455 0.947368 +vt 0.577075 0.894737 +vt 0.513834 0.921053 +vt 0.513834 0.894737 +vt 0.529644 0.894737 +vt 0.513834 0.868421 +vt 0.545455 0.894737 +vt 0.545455 0.921053 +vt 0.561265 0.842105 +vt 0.545455 0.868421 +vt 0.561265 0.815789 +vt 0.577075 0.815789 +vt 0.577075 0.842105 +vt 0.561265 0.868421 +vt 0.561265 0.789474 +vt 0.561265 0.973684 +vt 0.561265 1.000000 +vt 0.577075 0.973684 +vt 0.577075 1.000000 +vt 0.577075 0.789474 +vt 0.561265 0.947368 +vt 0.561265 0.921053 +vt 0.577075 0.947368 +vt 0.561265 0.894737 +vt 0.577075 0.894737 +vt 0.577075 0.921053 +vt 0.592885 0.868421 +vt 0.592885 0.842105 +vt 0.592885 0.815789 +vt 0.608696 0.842105 +vt 0.608696 0.868421 +vt 0.592885 0.789474 +vt 0.592885 1.000000 +vt 0.592885 0.973684 +vt 0.608696 1.000000 +vt 0.608696 0.815789 +vt 0.592885 0.947368 +vt 0.592885 0.921053 +vt 0.608696 0.921053 +vt 0.608696 0.947368 +vt 0.592885 0.894737 +vt 0.608696 0.894737 +vt 0.624506 0.868421 +vt 0.624506 0.842105 +vt 0.624506 0.815789 +vt 0.640316 0.815789 +vt 0.640316 0.842105 +vt 0.608696 0.789474 +vt 0.624506 0.789474 +vt 0.624506 1.000000 +vt 0.608696 0.973684 +vt 0.624506 0.973684 +vt 0.640316 1.000000 +vt 0.640316 0.789474 +vt 0.624506 0.947368 +vt 0.624506 0.921053 +vt 0.640316 0.947368 +vt 0.624506 0.894737 +vt 0.640316 0.894737 +vt 0.656126 0.868421 +vt 0.656126 0.842105 +vt 0.656126 0.815789 +vt 0.671937 0.815789 +vt 0.671937 0.842105 +vt 0.656126 0.789474 +vt 0.656126 0.973684 +vt 0.656126 1.000000 +vt 0.671937 0.973684 +vt 0.671937 1.000000 +vt 0.671937 0.789474 +vt 0.656126 0.947368 +vt 0.640316 0.921053 +vt 0.656126 0.921053 +vt 0.671937 0.947368 +vt 0.656126 0.894737 +vt 0.671937 0.894737 +vt 0.671937 0.921053 +vt 0.687747 0.842105 +vt 0.671937 0.868421 +vt 0.687747 0.815789 +vt 0.703557 0.815789 +vt 0.703557 0.842105 +vt 0.687747 0.868421 +vt 0.687747 0.789474 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.973684 +vt 0.703557 1.000000 +vt 0.703557 0.789474 +vt 0.687747 0.947368 +vt 0.687747 0.921053 +vt 0.703557 0.947368 +vt 0.687747 0.894737 +vt 0.703557 0.894737 +vt 0.703557 0.921053 +vt 0.719368 0.868421 +vt 0.719368 0.842105 +vt 0.719368 0.815789 +vt 0.735178 0.842105 +vt 0.719368 0.789474 +vt 0.719368 1.000000 +vt 0.719368 0.973684 +vt 0.735178 1.000000 +vt 0.735178 0.815789 +vt 0.719368 0.947368 +vt 0.719368 0.921053 +vt 0.735178 0.921053 +vt 0.735178 0.947368 +vt 0.735178 0.973684 +vt 0.719368 0.894737 +vt 0.735178 0.868421 +vt 0.735178 0.894737 +vt 0.750988 0.842105 +vt 0.750988 0.815789 +vt 0.766798 0.815789 +vt 0.766798 0.842105 +vt 0.750988 0.868421 +vt 0.750988 0.789474 +vt 0.735178 0.789474 +vt 0.750988 0.973684 +vt 0.750988 1.000000 +vt 0.766798 0.973684 +vt 0.766798 1.000000 +vt 0.766798 0.789474 +vt 0.750988 0.947368 +vt 0.750988 0.921053 +vt 0.766798 0.947368 +vt 0.750988 0.894737 +vt 0.766798 0.894737 +vt 0.766798 0.921053 +vt 0.529644 0.868421 +vt 0.513834 0.842105 +vt 0.529644 0.842105 +vt 0.513834 0.815789 +vt 0.529644 0.815789 +vt 0.545455 0.842105 +vt 0.545455 0.868421 +vt 0.513834 0.789474 +vt 0.529644 0.789474 +vt 0.529644 1.000000 +vt 0.513834 0.973684 +vt 0.529644 0.973684 +vt 0.545455 1.000000 +vt 0.545455 0.815789 +vt 0.529644 0.947368 +vt 0.513834 0.947368 +vt 0.529644 0.921053 +vt 0.545455 0.921053 +vt 0.545455 0.947368 +vt 0.529644 0.894737 +vt 0.513834 0.921053 +vt 0.513834 0.894737 +vt 0.545455 0.894737 +vt 0.608696 0.921053 +vt 0.608696 0.894737 +vt 0.624506 0.921053 +vt 0.608696 0.947368 +vt 0.608696 0.868421 +vt 0.608696 0.842105 +vt 0.624506 0.868421 +vt 0.624506 0.894737 +vt 0.608696 0.815789 +vt 0.608696 0.789474 +vt 0.624506 0.789474 +vt 0.624506 0.815789 +vt 0.624506 0.842105 +vt 0.608696 0.973684 +vt 0.624506 0.947368 +vt 0.624506 0.973684 +vt 0.608696 1.000000 +vt 0.640316 0.921053 +vt 0.640316 0.894737 +vt 0.656126 0.921053 +vt 0.640316 0.947368 +vt 0.640316 0.868421 +vt 0.640316 0.842105 +vt 0.656126 0.868421 +vt 0.640316 0.815789 +vt 0.640316 0.789474 +vt 0.656126 0.789474 +vt 0.656126 0.815789 +vt 0.656126 0.842105 +vt 0.640316 0.973684 +vt 0.624506 1.000000 +vt 0.656126 0.973684 +vt 0.640316 1.000000 +vt 0.671937 0.921053 +vt 0.656126 0.947368 +vt 0.656126 0.894737 +vt 0.671937 0.894737 +vt 0.687747 0.894737 +vt 0.687747 0.921053 +vt 0.671937 0.947368 +vt 0.671937 0.868421 +vt 0.671937 0.842105 +vt 0.687747 0.842105 +vt 0.687747 0.868421 +vt 0.671937 0.815789 +vt 0.671937 0.789474 +vt 0.687747 0.789474 +vt 0.687747 0.815789 +vt 0.671937 1.000000 +vt 0.671937 0.973684 +vt 0.687747 0.973684 +vt 0.687747 1.000000 +vt 0.703557 0.921053 +vt 0.687747 0.947368 +vt 0.703557 0.894737 +vt 0.719368 0.894737 +vt 0.719368 0.921053 +vt 0.703557 0.947368 +vt 0.703557 0.868421 +vt 0.703557 0.842105 +vt 0.719368 0.842105 +vt 0.719368 0.868421 +vt 0.703557 0.815789 +vt 0.703557 0.789474 +vt 0.719368 0.815789 +vt 0.703557 1.000000 +vt 0.703557 0.973684 +vt 0.719368 0.973684 +vt 0.719368 1.000000 +vt 0.735178 0.921053 +vt 0.719368 0.947368 +vt 0.735178 0.894737 +vt 0.735178 0.947368 +vt 0.735178 0.868421 +vt 0.735178 0.842105 +vt 0.735178 0.815789 +vt 0.719368 0.789474 +vt 0.735178 0.789474 +vt 0.735178 1.000000 +vt 0.735178 0.973684 +vt 0.739130 0.657895 +vt 0.743083 0.671053 +vt 0.739130 0.671053 +vt 0.731225 0.657895 +vt 0.735178 0.671053 +vt 0.731225 0.671053 +vt 0.727273 0.657895 +vt 0.723320 0.671053 +vt 0.723320 0.657895 +vt 0.747036 0.657895 +vt 0.743083 0.657895 +vt 0.735178 0.657895 +vt 0.727273 0.671053 +vt 0.719368 0.657895 +vt 0.719368 0.671053 +vt 0.750988 0.671053 +vt 0.747036 0.671053 +vt 0.229249 0.802632 +vt 0.229249 0.822368 +vt 0.237154 0.802632 +vt 0.237154 0.763158 +vt 0.173913 0.743421 +vt 0.166008 0.723684 +vt 0.173913 0.723684 +vt 0.173913 0.684211 +vt 0.166008 0.703947 +vt 0.166008 0.684211 +vt 0.173913 0.802632 +vt 0.166008 0.822368 +vt 0.166008 0.802632 +vt 0.173913 0.782895 +vt 0.166008 0.782895 +vt 0.173913 0.763158 +vt 0.166008 0.743421 +vt 0.173913 0.703947 +vt 0.173913 0.842105 +vt 0.173913 0.822368 +vt 0.166008 0.763158 +vt 0.229249 0.684211 +vt 0.225296 0.697368 +vt 0.225296 0.776316 +vt 0.561265 0.894737 +vt 0.529644 0.789474 +vt 0.529644 1.000000 +vt 0.719368 0.894737 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.894737 +vt 0.624506 0.894737 +vt 0.592885 0.789474 +vt 0.592885 1.000000 +vt 0.656126 0.842105 +vt 0.719368 0.789474 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.789474 +vt 0.750988 0.947368 +vt 0.750988 0.789474 +vt 0.513834 0.789474 +vt 0.766798 1.000000 +vt 0.592885 0.947368 +vt 0.592885 0.789474 +vt 0.608696 1.000000 +vt 0.577075 0.921053 +vt 0.577075 0.868421 +vt 0.640316 0.868421 +vt 0.640316 0.973684 +vt 0.703557 0.868421 +vt 0.766798 0.868421 +vt 0.513834 0.868421 +vt 0.513834 1.000000 +vt 0.545455 0.973684 +vt 0.545455 0.789474 +vt 0.656126 1.000000 +vt 0.750988 0.657895 +vt 0.166008 0.842105 +vn -0.4916 -0.1252 0.8617 +vn 0.4916 0.1252 -0.8617 +vn -0.0621 0.9921 0.1088 +vn -0.1794 0.9321 0.3145 +vn -0.8686 0.0000 -0.4955 +vn 0.8686 -0.0000 0.4955 +vn 0.6580 -0.7015 0.2735 +vn 0.0620 -0.9921 -0.1088 +vn 0.5703 0.7015 0.4273 +vn -0.0620 0.9921 0.1088 +vn -0.6580 0.7015 -0.2735 +vn -0.5703 -0.7015 -0.4273 +vn 0.2655 0.8600 0.4358 +vn 0.8657 0.4493 0.2207 +vn 0.8682 0.4489 0.2113 +vn 0.9930 -0.1019 -0.0596 +vn 0.9811 0.1805 0.0692 +vn -0.4891 0.7755 0.3993 +vn -0.9641 0.2296 0.1335 +vn -0.4841 0.7725 0.4108 +vn -0.9103 -0.3897 -0.1396 +vn -0.9638 0.2317 0.1318 +vn -0.9810 -0.1824 -0.0651 +vn 0.9687 -0.2124 -0.1283 +vn 0.8547 0.4277 0.2942 +vn 0.2648 0.8521 0.4515 +vn 0.2610 0.7895 0.5554 +vn 0.8394 0.2824 0.4643 +vn 0.9817 -0.1527 -0.1132 +vn -0.4675 0.7314 0.4964 +vn -0.9560 0.2478 0.1569 +vn -0.9432 0.2402 0.2295 +vn -0.4678 0.5455 0.6954 +vn -0.8657 -0.4447 -0.2296 +vn -0.2656 -0.8788 -0.3965 +vn -0.2741 -0.5813 -0.7661 +vn -0.8870 -0.2391 -0.3951 +vn 0.4645 -0.8205 -0.3332 +vn 0.4825 -0.7771 -0.4040 +vn 0.5373 -0.5375 -0.6499 +vn 0.7016 -0.7096 0.0641 +vn 0.9803 -0.0645 -0.1864 +vn 0.7452 -0.6214 0.2419 +vn 0.0509 -0.9357 0.3492 +vn 0.0219 -0.9604 0.2777 +vn 0.6868 -0.7268 -0.0063 +vn 0.9620 -0.0786 -0.2615 +vn -0.6019 -0.5911 0.5369 +vn -0.6386 -0.6355 0.4339 +vn -0.9719 -0.0111 0.2350 +vn -0.9594 0.0422 0.2786 +vn -0.6606 -0.6366 0.3977 +vn -0.7668 0.6018 -0.2232 +vn -0.7019 0.7117 -0.0260 +vn -0.0768 0.8368 -0.5420 +vn -0.0257 0.9495 -0.3126 +vn -0.6793 0.7332 0.0300 +vn -0.9534 0.0692 0.2936 +vn 0.6598 0.6207 -0.4235 +vn 0.6468 0.5549 -0.5231 +vn 0.9551 -0.0651 -0.2891 +vn 0.6622 0.6403 -0.3893 +vn 0.6863 -0.7271 -0.0149 +vn 0.0174 -0.9629 0.2693 +vn 0.6860 -0.7273 -0.0177 +vn 0.9545 -0.0649 -0.2909 +vn -0.6631 -0.6357 0.3952 +vn -0.9541 0.0659 0.2920 +vn -0.9544 0.0649 0.2915 +vn -0.6637 -0.6355 0.3945 +vn -0.6846 0.7286 0.0208 +vn -0.0120 0.9684 -0.2491 +vn -0.0149 0.9648 -0.2623 +vn -0.0158 0.9637 -0.2664 +vn -0.6860 0.7273 0.0177 +vn 0.6635 0.6365 -0.3931 +vn 0.6637 0.6355 -0.3945 +vn 0.6851 -0.7282 -0.0193 +vn 0.9544 -0.0649 -0.2915 +vn 0.0156 -0.9643 0.2642 +vn 0.6820 -0.7309 -0.0241 +vn 0.9538 -0.0662 -0.2929 +vn 0.9543 -0.0652 -0.2918 +vn -0.6636 -0.6359 0.3940 +vn 0.0158 -0.9637 0.2664 +vn -0.9546 0.0653 0.2907 +vn -0.9552 0.0667 0.2883 +vn -0.6631 -0.6373 0.3925 +vn -0.6866 0.7269 0.0152 +vn -0.0169 0.9630 -0.2690 +vn -0.0207 0.9607 -0.2769 +vn -0.6878 0.7258 0.0072 +vn 0.6630 0.6357 -0.3952 +vn 0.6607 0.6369 -0.3974 +vn 0.9458 -0.0907 -0.3118 +vn 0.6558 -0.7501 -0.0850 +vn 0.0149 -0.9661 0.2576 +vn -0.0010 -0.9819 0.1892 +vn 0.5891 -0.7678 -0.2517 +vn 0.9181 -0.1128 -0.3799 +vn -0.6637 -0.6546 0.3618 +vn -0.9471 0.0531 0.3165 +vn -0.9237 0.0399 0.3811 +vn -0.6894 -0.6700 0.2752 +vn -0.6720 0.7373 0.0687 +vn 0.0066 0.9758 -0.2183 +vn 0.0902 0.9957 -0.0213 +vn -0.6056 0.7515 0.2617 +vn 0.6792 0.6347 -0.3684 +vn 0.7194 0.6321 -0.2878 +vn 0.7844 -0.3903 0.4820 +vn 0.9896 -0.0551 -0.1328 +vn 0.7863 -0.2751 0.5531 +vn 0.1310 -0.5481 0.8261 +vn 0.1314 -0.6126 0.7794 +vn 0.7913 -0.4159 0.4482 +vn 0.9899 0.0173 -0.1409 +vn -0.5631 -0.2182 0.7970 +vn -0.5870 -0.4071 0.6997 +vn -0.9731 0.0176 0.2298 +vn -0.9847 -0.0305 0.1712 +vn -0.6005 -0.4591 0.6547 +vn -0.8253 0.2652 -0.4986 +vn -0.7949 0.3995 -0.4566 +vn -0.1742 0.3632 -0.9153 +vn -0.1353 0.6117 -0.7794 +vn -0.7888 0.4282 -0.4408 +vn -0.9889 -0.0333 0.1449 +vn 0.6012 0.4494 -0.6608 +vn 0.6005 0.2244 -0.7675 +vn 0.9888 0.0412 -0.1436 +vn 0.6024 0.4859 -0.6332 +vn 0.7924 -0.4202 0.4421 +vn 0.1329 -0.6258 0.7686 +vn 0.7905 -0.4285 0.4375 +vn 0.9891 0.0327 -0.1434 +vn 0.9891 0.0360 -0.1429 +vn -0.6040 -0.4665 0.6461 +vn -0.9892 -0.0349 0.1420 +vn -0.9898 -0.0355 0.1378 +vn -0.6034 -0.4720 0.6427 +vn -0.7925 0.4180 -0.4440 +vn -0.1291 0.6473 -0.7512 +vn -0.1328 0.6282 -0.7666 +vn -0.1358 0.6122 -0.7790 +vn -0.7922 0.4082 -0.4536 +vn 0.6043 0.4713 -0.6424 +vn 0.6014 0.4655 -0.6493 +vn 0.9898 0.0007 -0.1426 +vn 0.7786 -0.4886 0.3937 +vn 0.1343 -0.6370 0.7591 +vn 0.1339 -0.6978 0.7037 +vn -0.5943 -0.5091 0.6225 +vn -0.9850 -0.0317 0.1693 +vn -0.7914 0.4555 -0.4076 +vn -0.1244 0.6657 -0.7358 +vn 0.6143 0.4892 -0.6190 +vn 0.8256 0.0596 0.5611 +vn 0.2199 0.2434 0.9446 +vn 0.2029 0.0812 0.9758 +vn 0.8248 -0.0418 0.5638 +vn 0.9757 -0.1482 -0.1611 +vn -0.4996 0.2789 0.8201 +vn -0.9595 0.1633 0.2296 +vn -0.5271 0.1499 0.8365 +vn -0.8408 0.0024 -0.5413 +vn -0.2095 -0.0773 -0.9747 +vn -0.8168 0.0734 -0.5722 +vn -0.9702 0.1405 0.1973 +vn 0.5356 -0.1947 -0.8217 +vn 0.9688 -0.1391 -0.2050 +vn 0.5266 -0.1196 -0.8417 +vn 0.9796 -0.1122 -0.1663 +vn 0.8089 -0.1155 0.5765 +vn 0.1799 -0.0637 0.9816 +vn -0.5388 0.0279 0.8419 +vn -0.9673 0.1075 0.2297 +vn -0.8318 0.1115 -0.5438 +vn -0.2024 0.0245 -0.9790 +vn 0.5553 -0.0638 -0.8292 +vn 0.5236 -0.7476 -0.4085 +vn -0.1387 -0.9797 -0.1448 +vn -0.1702 -0.9658 -0.1956 +vn 0.5037 -0.7306 -0.4610 +vn 0.8925 -0.0869 -0.4426 +vn -0.7307 -0.6522 0.2014 +vn -0.8956 0.0564 0.4413 +vn -0.7486 -0.6372 0.1832 +vn -0.5215 0.7359 0.4319 +vn 0.1613 0.9732 0.1637 +vn -0.4970 0.7261 0.4751 +vn -0.8843 0.0666 0.4621 +vn 0.7439 0.6359 -0.2053 +vn 0.8863 -0.0661 -0.4582 +vn 0.7501 0.6368 -0.1786 +vn 0.5029 -0.7280 -0.4659 +vn -0.1740 -0.9642 -0.2001 +vn -0.1752 -0.9637 -0.2016 +vn 0.5024 -0.7273 -0.4675 +vn 0.8859 -0.0652 -0.4593 +vn -0.7499 -0.6358 0.1826 +vn -0.8854 0.0652 0.4602 +vn -0.7502 -0.6355 0.1823 +vn -0.5012 0.7269 0.4694 +vn 0.1785 0.9610 0.2111 +vn 0.1761 0.9630 0.2040 +vn -0.5024 0.7273 0.4675 +vn 0.7503 0.6357 -0.1815 +vn 0.8857 -0.0649 -0.4595 +vn 0.7502 0.6355 -0.1823 +vn 0.1752 0.9637 0.2016 +vn 0.8847 -0.0652 -0.4616 +vn 0.5011 -0.7262 -0.4705 +vn -0.1751 -0.9633 -0.2033 +vn -0.1749 -0.9622 -0.2086 +vn 0.4974 -0.7231 -0.4792 +vn 0.8813 -0.0662 -0.4679 +vn -0.7506 -0.6351 0.1822 +vn -0.8869 0.0664 0.4572 +vn -0.8902 0.0719 0.4499 +vn -0.7519 -0.6336 0.1820 +vn -0.5043 0.7283 0.4638 +vn 0.1734 0.9643 0.2002 +vn -0.5106 0.7314 0.4521 +vn 0.7501 0.6356 -0.1825 +vn 0.7496 0.6360 -0.1833 +vn 0.1672 0.9662 0.1961 +vn 0.8463 -0.0607 -0.5292 +vn 0.4581 -0.6955 -0.5536 +vn -0.1843 -0.9465 -0.2649 +vn -0.2599 -0.8816 -0.3940 +vn 0.3271 -0.5986 -0.7313 +vn 0.7374 0.0052 -0.6754 +vn -0.7398 -0.6479 0.1816 +vn -0.8656 0.0410 0.4991 +vn -0.7563 -0.0638 0.6510 +vn -0.7207 -0.6685 0.1834 +vn -0.4760 0.7114 0.5170 +vn 0.2060 0.9507 0.2316 +vn -0.3210 0.6036 0.7298 +vn 0.7541 0.6259 -0.1989 +vn 0.7432 0.6266 -0.2344 +vn 0.3191 0.8840 0.3415 +vn 0.1719 -0.4723 -0.8645 +vn -0.3752 -0.7977 -0.4722 +vn 0.1103 -0.4212 -0.9002 +vn 0.6178 0.1176 -0.7775 +vn -0.7132 -0.6685 0.2107 +vn -0.6106 -0.1575 0.7761 +vn -0.7090 -0.6671 0.2287 +vn -0.4247 -0.7674 -0.4802 +vn -0.1395 0.4490 0.8826 +vn 0.4094 0.7918 0.4531 +vn 0.4344 0.7579 0.4867 +vn -0.0884 0.4022 0.9113 +vn -0.5628 -0.1834 0.8060 +vn 0.7184 0.6539 -0.2375 +vn 0.5773 0.1708 -0.7984 +vn 0.7107 0.6663 -0.2256 +vn 0.1028 -0.4157 -0.9037 +vn -0.4295 -0.7649 -0.4799 +vn 0.1003 -0.4137 -0.9048 +vn 0.5740 0.1770 -0.7994 +vn -0.7096 -0.6670 0.2268 +vn -0.5705 -0.1802 0.8013 +vn -0.7099 -0.6670 0.2262 +vn -0.4310 -0.7642 -0.4798 +vn -0.0974 0.4110 0.9064 +vn 0.4320 0.7626 0.4814 +vn 0.4310 0.7642 0.4798 +vn -0.1003 0.4137 0.9048 +vn 0.7100 0.6669 -0.2261 +vn 0.5729 0.1791 -0.7998 +vn 0.7099 0.6670 -0.2262 +vn 0.0987 -0.4120 -0.9058 +vn -0.4314 -0.7634 -0.4807 +vn -0.4329 -0.7607 -0.4836 +vn 0.0938 -0.4070 -0.9086 +vn 0.5670 0.1810 -0.8035 +vn 0.5715 0.1796 -0.8007 +vn -0.7101 -0.6667 0.2264 +vn -0.5741 -0.1773 0.7993 +vn -0.5777 -0.1713 0.7981 +vn -0.7108 -0.6657 0.2272 +vn -0.1026 0.4157 0.9037 +vn -0.5729 -0.1791 0.7998 +vn 0.4294 0.7651 0.4798 +vn -0.1098 0.4215 0.9001 +vn 0.7097 0.6671 -0.2262 +vn 0.7093 0.6676 -0.2264 +vn 0.4245 0.7676 0.4802 +vn 0.5158 0.2107 -0.8304 +vn 0.0375 -0.3538 -0.9346 +vn -0.4601 -0.7239 -0.5141 +vn -0.5575 -0.6221 -0.5496 +vn -0.1160 -0.2076 -0.9713 +vn 0.3875 0.3196 -0.8647 +vn -0.7038 -0.6769 0.2154 +vn -0.5424 -0.2196 0.8108 +vn -0.4182 -0.3568 0.8353 +vn -0.6923 -0.6923 0.2036 +vn -0.0562 0.3752 0.9252 +vn 0.4692 0.7395 0.4827 +vn 0.1230 0.2094 0.9700 +vn 0.7051 0.6659 -0.2436 +vn 0.6848 0.6801 -0.2618 +vn 0.5855 0.6440 0.4924 +vn -0.0507 0.7650 -0.6419 +vn -0.4729 0.1650 -0.8655 +vn -0.5887 0.2591 -0.7657 +vn -0.7522 -0.4228 -0.5053 +vn -0.7969 -0.3980 -0.4545 +vn -0.6308 0.2828 -0.7225 +vn -0.0867 0.7998 -0.5940 +vn -0.5987 -0.7834 0.1665 +vn -0.5311 -0.8378 0.1266 +vn -0.0855 -0.6712 0.7363 +vn 0.0551 -0.7820 0.6208 +vn -0.5054 -0.8553 0.1138 +vn -0.8087 -0.4028 -0.4285 +vn 0.6076 -0.2579 0.7512 +vn 0.4884 -0.1436 0.8607 +vn 0.7966 0.4246 0.4303 +vn 0.8111 0.3999 0.4269 +vn 0.6397 -0.2891 0.7121 +vn 0.5198 0.8414 -0.1478 +vn 0.7579 0.4732 0.4491 +vn 0.5744 0.7912 -0.2100 +vn 0.5090 0.8528 -0.1165 +vn -0.0900 0.8037 -0.5882 +vn -0.6350 0.2840 -0.7184 +vn -0.8095 -0.4028 -0.4270 +vn -0.8101 -0.4031 -0.4258 +vn -0.6368 0.2873 -0.7155 +vn -0.5088 -0.8531 0.1149 +vn 0.0964 -0.8076 0.5817 +vn 0.0899 -0.8037 0.5881 +vn 0.0838 -0.7995 0.5948 +vn -0.5105 -0.8515 0.1197 +vn 0.6360 -0.2846 0.7173 +vn 0.8098 0.4021 0.4271 +vn 0.6315 -0.2838 0.7215 +vn 0.5083 0.8536 -0.1140 +vn 0.5051 0.8556 -0.1128 +vn 0.8091 0.4026 0.4281 +vn -0.6549 0.3121 -0.6883 +vn -0.0940 0.8072 -0.5827 +vn -0.8104 -0.3915 -0.4358 +vn -0.8131 -0.3718 -0.4478 +vn -0.7223 0.3588 -0.5912 +vn -0.1278 0.8315 -0.5405 +vn -0.4922 -0.8658 0.0898 +vn 0.1122 -0.8199 0.5614 +vn 0.2261 -0.8837 0.4097 +vn -0.4224 -0.9060 -0.0280 +vn 0.6550 -0.2939 0.6961 +vn 0.8067 0.4156 0.4202 +vn 0.7371 -0.3221 0.5941 +vn 0.4744 0.8757 -0.0894 +vn 0.3933 0.9194 0.0082 +vn 0.7967 0.4380 0.4165 +vn -0.2953 0.9072 -0.2995 +vn -0.7749 0.3620 -0.5181 +vn -0.8046 -0.4010 -0.4380 +vn -0.3527 -0.9301 -0.1028 +vn 0.3033 -0.9086 0.2871 +vn 0.7808 -0.3571 0.5126 +vn 0.8019 0.4112 0.4335 +vn 0.3523 0.9312 0.0930 +vn -0.4770 0.8788 0.0138 +vn -0.8372 0.3595 -0.4122 +vn -0.8388 0.3565 -0.4114 +vn -0.7111 -0.3725 -0.5962 +vn -0.7096 -0.3761 -0.5958 +vn -0.7103 -0.3771 -0.5943 +vn -0.8417 0.3582 -0.4039 +vn -0.1655 -0.8875 -0.4300 +vn -0.1661 -0.8888 -0.4271 +vn 0.4725 -0.8813 -0.0071 +vn 0.4642 -0.8857 0.0069 +vn -0.1659 -0.8929 -0.4185 +vn 0.8359 -0.3582 0.4158 +vn 0.4776 -0.8785 -0.0096 +vn 0.8384 -0.3535 0.4149 +vn 0.7098 0.3753 0.5961 +vn 0.8299 -0.3653 0.4217 +vn 0.1648 0.8879 0.4295 +vn 0.7084 0.3792 0.5953 +vn 0.1664 0.8883 0.4280 +vn -0.4722 0.8813 0.0123 +vn 0.1585 0.8876 0.4324 +vn 0.7098 0.3727 0.5977 +vn -0.8719 0.3479 -0.3446 +vn -0.4837 0.8749 0.0228 +vn -0.7244 -0.3600 -0.5878 +vn -0.7552 -0.3491 -0.5547 +vn -0.9487 0.2602 -0.1796 +vn -0.5278 0.8444 0.0914 +vn -0.1483 -0.8758 -0.4592 +vn 0.4957 -0.8673 -0.0450 +vn 0.6141 -0.7353 -0.2868 +vn -0.1002 -0.7846 -0.6119 +vn 0.8584 -0.3440 0.3805 +vn 0.7032 0.3937 0.5919 +vn 0.9507 -0.2223 0.2163 +vn 0.1182 0.8745 0.4703 +vn 0.0406 0.7970 0.6026 +vn 0.6884 0.4292 0.5847 +vn -0.6800 0.5472 0.4880 +vn -0.9934 0.1115 -0.0266 +vn -0.7478 -0.3915 -0.5361 +vn -0.9991 0.0375 0.0170 +vn -0.6851 0.4650 0.5607 +vn -0.0423 -0.6548 -0.7546 +vn 0.6806 -0.5067 -0.5292 +vn -0.0244 -0.6026 -0.7976 +vn -0.7280 -0.4136 -0.5466 +vn 0.9972 -0.0705 0.0257 +vn 0.7093 0.4219 0.5646 +vn 0.7309 0.4154 0.5414 +vn 0.9992 -0.0163 -0.0347 +vn 0.0130 0.6734 0.7391 +vn 0.0264 0.6185 0.7853 +vn -0.6848 0.4545 0.5697 +vn -0.9994 0.0282 0.0189 +vn -0.7287 -0.4145 -0.5452 +vn -0.7288 -0.4148 -0.5447 +vn -0.9995 0.0255 0.0198 +vn -0.0301 -0.6097 -0.7920 +vn 0.6852 -0.4287 -0.5888 +vn 0.6848 -0.4456 -0.5766 +vn -0.0312 -0.6120 -0.7902 +vn 0.9995 -0.0229 -0.0230 +vn 0.7293 0.4150 0.5440 +vn 0.9995 -0.0255 -0.0198 +vn 0.0303 0.6136 0.7890 +vn 0.0312 0.6120 0.7902 +vn -0.6867 0.4401 0.5785 +vn -0.9994 0.0179 0.0288 +vn -0.7299 -0.4163 -0.5422 +vn -0.7328 -0.4216 -0.5341 +vn -0.9984 -0.0017 0.0553 +vn -0.0282 -0.6156 -0.7875 +vn 0.6858 -0.4632 -0.5613 +vn 0.6891 -0.5061 -0.5186 +vn -0.0129 -0.6271 -0.7788 +vn 0.9991 -0.0390 -0.0112 +vn 0.7288 0.4148 0.5447 +vn 0.7313 0.4094 0.5455 +vn 0.9958 -0.0899 0.0159 +vn 0.0298 0.6104 0.7915 +vn 0.0229 0.6043 0.7964 +vn 0.7407 0.3906 0.5466 +vn -0.9825 -0.1087 0.1509 +vn -0.6917 0.4107 0.5939 +vn -0.7530 -0.4528 -0.4774 +vn -0.7086 -0.6106 -0.3535 +vn -0.8361 -0.4394 0.3282 +vn -0.6890 0.2843 0.6666 +vn -0.0245 -0.5875 -0.8088 +vn 0.6887 -0.4704 -0.5518 +vn 0.4799 -0.0367 -0.8765 +vn -0.1535 -0.4451 -0.8822 +vn 0.9985 -0.0482 -0.0234 +vn 0.7230 0.4403 0.5324 +vn 0.8540 0.4602 -0.2428 +vn -0.0044 0.5554 0.8316 +vn 0.0376 0.3820 0.9234 +vn 0.6050 0.6047 0.5180 +vn -0.2487 -0.3490 0.9035 +vn -0.5467 -0.7410 0.3898 +vn -0.5463 -0.7568 -0.3588 +vn -0.4011 -0.8368 0.3725 +vn -0.2394 -0.2747 -0.9312 +vn 0.0732 0.4201 -0.9045 +vn -0.2200 -0.2451 -0.9442 +vn -0.4700 -0.7794 -0.4143 +vn 0.3885 0.8495 -0.3569 +vn 0.5102 0.7459 0.4281 +vn 0.4612 0.7902 0.4035 +vn 0.3180 0.8755 -0.3637 +vn 0.0778 0.4295 -0.8997 +vn 0.2102 0.2405 0.9476 +vn -0.0629 -0.4365 0.8975 +vn 0.3063 0.2086 0.9288 +vn -0.2922 -0.8827 0.3681 +vn -0.5014 -0.7756 -0.3833 +vn -0.5630 -0.7828 -0.2649 +vn -0.0751 -0.9666 0.2448 +vn 0.1160 -0.5033 0.8563 +vn -0.2717 -0.2300 -0.9344 +vn 0.1034 0.4159 -0.9035 +vn -0.3900 0.7035 -0.5941 +vn -0.7457 -0.1077 -0.6575 +vn 0.3325 0.8768 -0.3473 +vn 0.5153 0.7382 0.4353 +vn 0.1775 0.9721 -0.1532 +vn 0.4318 0.1335 0.8920 +vn 0.7356 0.0013 0.6774 +vn 0.6502 0.6531 0.3882 +vn 0.6657 -0.6971 0.2662 +vn 0.0329 -0.9992 0.0196 +vn -0.6672 -0.7173 -0.2007 +vn 0.0178 -0.9976 -0.0667 +vn 0.6999 -0.7030 0.1258 +vn -0.9878 0.0183 -0.1548 +vn -0.7176 0.6964 -0.0016 +vn -0.9993 0.0291 -0.0247 +vn -0.7288 -0.6677 -0.1520 +vn -0.0155 0.9987 0.0482 +vn 0.7048 0.6701 0.2328 +vn 0.6751 0.7134 0.1876 +vn -0.0780 0.9883 0.1313 +vn 0.9379 -0.0417 0.3445 +vn 0.9756 -0.0203 0.2187 +vn -0.2620 -0.0627 -0.9630 +vn -0.6601 -0.5308 -0.5314 +vn -0.3115 -0.0135 -0.9501 +vn 0.2793 0.4423 -0.8522 +vn -0.6771 -0.7020 0.2205 +vn -0.2819 -0.4691 0.8369 +vn -0.6687 -0.7066 0.2315 +vn -0.6951 -0.5063 -0.5104 +vn 0.2850 0.0428 0.9575 +vn 0.6774 0.5343 0.5056 +vn 0.7017 0.4987 0.5089 +vn 0.3255 -0.0010 0.9455 +vn -0.2415 -0.4978 0.8330 +vn 0.6706 0.7003 -0.2446 +vn 0.2508 0.4881 -0.8359 +vn 0.6704 0.7053 -0.2304 +vn -0.3164 -0.0091 -0.9485 +vn -0.6977 -0.5049 -0.5081 +vn -0.3181 -0.0075 -0.9480 +vn 0.2493 0.4924 -0.8339 +vn -0.6696 -0.7060 0.2306 +vn -0.2470 -0.4949 0.8331 +vn -0.6699 -0.7058 0.2304 +vn 0.3200 0.0055 0.9474 +vn 0.6994 0.5031 0.5076 +vn 0.6986 0.5044 0.5074 +vn 0.3181 0.0075 0.9480 +vn -0.2487 -0.4937 0.8332 +vn 0.6700 0.7057 -0.2303 +vn 0.6699 0.7058 -0.2304 +vn 0.2487 0.4937 -0.8332 +vn -0.6986 -0.5044 -0.5074 +vn -0.3188 -0.0061 -0.9478 +vn -0.6988 -0.5041 -0.5075 +vn -0.6994 -0.5030 -0.5077 +vn -0.3207 -0.0013 -0.9471 +vn 0.2472 0.4949 -0.8330 +vn -0.6702 -0.7053 0.2310 +vn -0.2502 -0.4920 0.8339 +vn -0.2543 -0.4863 0.8359 +vn -0.6709 -0.7037 0.2337 +vn 0.3165 0.0088 0.9485 +vn 0.6981 0.5046 0.5080 +vn 0.3111 0.0119 0.9503 +vn 0.6695 0.7061 -0.2305 +vn 0.6680 0.7072 -0.2317 +vn 0.6966 0.5048 0.5098 +vn -0.3579 0.0473 -0.9326 +vn 0.2426 0.4982 -0.8325 +vn -0.7094 -0.4786 -0.5173 +vn 0.1932 0.5415 -0.8181 +vn -0.6540 -0.7248 0.2162 +vn -0.2184 -0.5309 0.8188 +vn 0.3524 -0.0244 0.9355 +vn 0.7149 0.4989 0.4899 +vn 0.6424 0.7291 -0.2361 +vn 0.9618 0.0885 -0.2589 +vn 0.2665 -0.0885 0.9597 +vn -0.9618 -0.0885 0.2589 +vn -0.2665 0.0885 -0.9597 +vn 0.2474 0.5604 0.7904 +vn -0.2563 -0.9131 -0.3170 +vn 0.1060 -0.8373 0.5363 +vn -0.0628 -0.9979 0.0141 +vn 0.1465 -0.3357 0.9305 +vn -0.1932 -0.0117 -0.9811 +vn -0.8857 0.0649 0.4595 +vn 0.0652 0.6598 -0.7486 +vn -0.2282 0.8864 -0.4028 +vn -0.6260 0.7237 0.2903 +vn -0.6847 0.4508 0.5727 +vn 0.6847 -0.4508 -0.5727 +vn -0.5499 -0.0533 0.8335 +vn 0.4528 -0.6374 0.6235 +vn -0.7418 0.6605 0.1161 +s off +f 614/28/9 625/29/9 627/30/9 +f 619/31/10 647/32/10 646/33/10 +f 618/34/9 630/35/9 620/36/9 +f 624/37/9 626/38/9 610/39/9 +f 610/39/9 625/29/9 612/40/9 +f 614/41/9 628/42/9 616/43/9 +f 620/36/9 631/44/9 622/45/9 +f 616/43/9 629/46/9 618/34/9 +f 622/45/9 632/47/9 624/37/9 +f 635/48/10 634/49/10 639/50/10 +f 615/51/10 645/52/10 644/53/10 +f 623/54/10 647/32/10 621/55/10 +f 611/56/10 643/57/10 642/58/10 +f 617/59/10 646/33/10 645/52/10 +f 623/54/10 641/60/10 648/61/10 +f 611/56/10 641/60/10 609/62/10 +f 613/63/10 644/53/10 643/64/10 +f 650/65/9 652/66/9 654/67/9 +f 739/68/11 740/69/11 733/70/11 +f 675/71/12 678/72/12 677/73/12 +f 683/74/13 675/71/13 677/73/13 +f 680/75/11 677/73/11 678/72/11 +f 680/75/14 678/72/14 684/76/14 +f 677/73/13 679/77/13 683/74/13 +f 674/78/11 675/71/11 673/79/11 +f 676/80/14 674/78/14 682/81/14 +f 673/79/13 675/71/13 681/82/13 +f 676/80/14 684/76/14 678/72/14 +f 614/28/9 612/40/9 625/29/9 +f 619/31/10 621/55/10 647/32/10 +f 618/34/9 629/46/9 630/35/9 +f 624/37/9 632/47/9 626/38/9 +f 610/39/9 626/38/9 625/29/9 +f 614/41/9 627/83/9 628/42/9 +f 620/36/9 630/35/9 631/44/9 +f 616/43/9 628/42/9 629/46/9 +f 622/45/9 631/44/9 632/47/9 +f 635/48/10 633/84/10 634/49/10 +f 634/49/10 640/85/10 639/50/10 +f 639/50/10 638/86/10 635/48/10 +f 638/86/10 637/87/10 635/48/10 +f 637/87/10 636/88/10 635/48/10 +f 615/51/10 617/59/10 645/52/10 +f 623/54/10 648/61/10 647/32/10 +f 611/56/10 613/89/10 643/57/10 +f 617/59/10 619/31/10 646/33/10 +f 623/54/10 609/62/10 641/60/10 +f 611/56/10 642/58/10 641/60/10 +f 613/63/10 615/51/10 644/53/10 +f 656/90/9 649/91/9 650/65/9 +f 650/65/9 651/92/9 652/66/9 +f 652/66/9 653/93/9 654/67/9 +f 654/67/9 655/94/9 656/90/9 +f 656/90/9 650/65/9 654/67/9 +f 733/70/11 734/95/11 735/96/11 +f 735/96/11 736/97/11 733/70/11 +f 736/97/11 737/98/11 733/70/11 +f 737/98/11 738/99/11 733/70/11 +f 738/99/11 739/68/11 733/70/11 +f 675/71/12 676/80/12 678/72/12 +f 683/74/13 681/82/13 675/71/13 +f 680/75/11 679/77/11 677/73/11 +f 674/78/11 676/80/11 675/71/11 +f 676/80/14 682/81/14 684/76/14 +s 1 +f 704/100/15 711/101/16 712/102/15 +f 705/103/14 714/104/17 706/105/17 +f 707/106/18 716/107/19 708/108/19 +f 703/109/16 709/110/20 711/111/16 +f 705/103/14 712/102/15 713/112/14 +f 700/113/19 685/114/13 699/115/19 +f 698/116/18 699/115/19 697/117/18 +f 696/118/17 697/117/18 695/119/17 +f 693/120/14 696/118/17 695/119/17 +f 691/121/15 694/122/14 693/120/14 +f 690/123/16 691/121/15 689/124/16 +f 687/125/20 690/126/16 689/127/16 +f 686/128/13 687/125/20 685/114/13 +f 167/129/21 168/130/22 19/131/23 +f 19/131/23 505/132/24 166/133/25 +f 20/134/26 507/135/27 170/136/28 +f 170/136/28 167/129/21 20/134/26 +f 171/137/29 169/138/30 21/139/31 +f 173/140/32 168/130/22 22/141/33 +f 22/141/33 506/142/34 174/143/35 +f 174/143/35 175/144/36 22/141/33 +f 22/141/33 461/145/37 173/140/32 +f 23/146/38 506/142/34 170/136/28 +f 170/136/28 176/147/39 23/146/38 +f 23/146/38 463/148/40 177/149/41 +f 177/149/41 174/143/35 23/146/38 +f 24/150/42 507/135/27 171/137/29 +f 171/137/29 178/151/43 24/150/42 +f 24/150/42 464/152/44 179/153/45 +f 179/153/45 176/147/39 24/150/42 +f 178/154/43 172/155/46 25/156/47 +f 25/156/47 505/132/24 173/140/32 +f 173/140/32 180/157/48 25/156/47 +f 25/156/47 464/158/44 178/154/43 +f 26/159/49 465/160/50 182/161/51 +f 182/161/51 183/162/52 26/159/49 +f 26/159/49 510/163/53 184/164/54 +f 184/164/54 181/165/55 26/159/49 +f 183/162/52 185/166/56 27/167/57 +f 27/167/57 467/168/58 186/169/59 +f 186/169/59 187/170/60 27/167/57 +f 27/167/57 510/163/53 183/162/52 +f 186/169/59 188/171/61 28/172/62 +f 28/172/62 468/173/63 189/174/64 +f 189/174/64 190/175/65 28/172/62 +f 28/172/62 511/176/66 186/169/59 +f 29/177/67 468/178/63 191/179/68 +f 191/179/68 181/165/55 29/177/67 +f 29/177/67 509/180/69 192/181/70 +f 192/181/70 189/182/64 29/177/67 +f 30/183/71 509/180/69 184/164/54 +f 184/164/54 194/184/72 30/183/71 +f 194/185/72 195/186/73 30/187/71 +f 195/186/73 193/188/74 30/187/71 +f 194/184/72 187/170/60 31/189/75 +f 31/189/75 511/176/66 196/190/76 +f 31/191/75 515/192/77 197/193/78 +f 197/193/78 194/185/72 31/191/75 +f 196/190/76 190/175/65 32/194/79 +f 32/194/79 512/195/80 198/196/81 +f 32/197/79 516/198/82 199/199/83 +f 32/197/79 515/192/77 196/200/76 +f 33/201/84 512/202/80 192/181/70 +f 192/181/70 193/203/74 33/201/84 +f 193/188/74 200/204/85 33/205/84 +f 200/204/85 198/206/81 33/205/84 +f 34/207/86 513/208/87 195/186/73 +f 195/186/73 202/209/88 34/207/86 +f 202/209/88 203/210/89 34/207/86 +f 34/207/86 517/211/90 201/212/91 +f 35/213/92 514/214/93 197/193/78 +f 35/213/92 515/192/77 204/215/94 +f 35/213/92 519/216/95 205/217/96 +f 205/217/96 202/209/88 35/213/92 +f 36/218/97 515/192/77 199/199/83 +f 199/199/83 206/219/98 36/218/97 +f 36/218/97 520/220/99 207/221/100 +f 207/221/100 204/215/94 36/218/97 +f 37/222/101 516/223/82 200/204/85 +f 200/204/85 201/212/91 37/222/101 +f 201/212/91 208/224/102 37/222/101 +f 37/222/101 520/225/99 206/226/98 +f 209/227/103 203/210/89 38/228/104 +f 38/228/104 518/229/105 210/230/106 +f 210/230/106 211/231/107 38/228/104 +f 38/228/104 473/232/108 209/227/103 +f 39/233/109 518/229/105 205/217/96 +f 205/217/96 212/234/110 39/233/109 +f 39/233/109 475/235/111 213/236/112 +f 213/236/112 210/230/106 39/233/109 +f 40/237/113 519/216/95 207/221/100 +f 207/221/100 214/238/114 40/237/113 +f 40/237/113 476/239/115 215/240/116 +f 215/240/116 212/234/110 40/237/113 +f 214/241/114 208/224/102 41/242/117 +f 41/242/117 517/211/90 209/227/103 +f 209/227/103 216/243/118 41/242/117 +f 41/242/117 476/244/115 214/241/114 +f 42/245/119 469/246/120 218/247/121 +f 218/247/121 219/248/122 42/245/119 +f 42/245/119 522/249/123 220/250/124 +f 220/250/124 217/251/125 42/245/119 +f 219/248/122 221/252/126 43/253/127 +f 43/253/127 471/254/128 222/255/129 +f 222/255/129 223/256/130 43/253/127 +f 43/253/127 522/249/123 219/248/122 +f 222/255/129 224/257/131 44/258/132 +f 44/258/132 472/259/133 225/260/134 +f 225/260/134 226/261/135 44/258/132 +f 44/258/132 523/262/136 222/255/129 +f 45/263/137 472/264/133 227/265/138 +f 227/265/138 217/251/125 45/263/137 +f 45/263/137 521/266/139 228/267/140 +f 228/267/140 225/268/134 45/263/137 +f 46/269/141 521/266/139 220/250/124 +f 220/250/124 230/270/142 46/269/141 +f 230/270/142 231/271/143 46/269/141 +f 46/269/141 525/272/144 229/273/145 +f 230/270/142 223/256/130 47/274/146 +f 47/274/146 523/262/136 232/275/147 +f 47/274/146 527/276/148 233/277/149 +f 233/277/149 230/270/142 47/274/146 +f 232/275/147 226/261/135 48/278/150 +f 48/278/150 524/279/151 234/280/152 +f 48/278/150 528/281/153 235/282/154 +f 235/282/154 232/275/147 48/278/150 +f 49/283/155 524/284/151 228/267/140 +f 228/267/140 229/273/145 49/283/155 +f 229/273/145 236/285/156 49/283/155 +f 49/283/155 528/286/153 234/287/152 +f 237/288/157 231/271/143 50/289/158 +f 50/289/158 526/290/159 238/291/160 +f 238/291/160 182/161/51 50/289/158 +f 50/289/158 465/160/50 237/288/157 +f 51/292/161 526/290/159 233/277/149 +f 233/277/149 239/293/162 51/292/161 +f 51/292/161 467/168/58 185/166/56 +f 185/166/56 238/291/160 51/292/161 +f 52/294/163 527/276/148 235/282/154 +f 235/282/154 240/295/164 52/294/163 +f 52/294/163 468/173/63 188/171/61 +f 188/171/61 239/293/162 52/294/163 +f 240/296/164 236/285/156 53/297/165 +f 53/297/165 525/272/144 237/288/157 +f 237/288/157 191/179/68 53/297/165 +f 53/297/165 468/178/63 240/296/164 +f 54/298/166 461/145/37 175/144/36 +f 175/144/36 242/299/167 54/298/166 +f 54/298/166 530/300/168 243/301/169 +f 243/301/169 241/302/170 54/298/166 +f 242/299/167 177/149/41 55/303/171 +f 55/303/171 463/148/40 244/304/172 +f 244/304/172 245/305/173 55/303/171 +f 55/303/171 530/300/168 242/299/167 +f 244/304/172 179/153/45 56/306/174 +f 56/306/174 464/152/44 246/307/175 +f 246/307/175 247/308/176 56/306/174 +f 56/306/174 531/309/177 244/304/172 +f 57/310/178 464/158/44 180/157/48 +f 180/157/48 241/302/170 57/310/178 +f 57/310/178 529/311/179 248/312/180 +f 248/312/180 246/313/175 57/310/178 +f 249/314/181 243/301/169 58/315/182 +f 58/315/182 530/300/168 250/316/183 +f 250/316/183 218/247/121 58/315/182 +f 58/315/182 469/246/120 249/314/181 +f 59/317/184 530/300/168 245/305/173 +f 245/305/173 251/318/185 59/317/184 +f 59/317/184 471/254/128 221/252/126 +f 221/252/126 250/316/183 59/317/184 +f 60/319/186 531/309/177 247/308/176 +f 247/308/176 252/320/187 60/319/186 +f 60/319/186 472/259/133 224/257/131 +f 224/257/131 251/318/185 60/319/186 +f 252/321/187 248/312/180 61/322/188 +f 61/322/188 529/311/179 249/314/181 +f 249/314/181 227/265/138 61/322/188 +f 61/322/188 472/264/133 252/321/187 +f 62/323/189 473/232/108 211/231/107 +f 211/231/107 254/324/190 62/323/189 +f 62/323/189 534/325/191 255/326/192 +f 255/326/192 253/327/193 62/323/189 +f 254/324/190 213/236/112 63/328/194 +f 63/328/194 475/235/111 256/329/195 +f 256/329/195 257/330/196 63/328/194 +f 63/328/194 534/325/191 254/324/190 +f 256/329/195 215/240/116 64/331/197 +f 64/331/197 476/239/115 258/332/198 +f 258/332/198 259/333/199 64/331/197 +f 64/331/197 535/334/200 256/329/195 +f 65/335/201 476/244/115 216/243/118 +f 216/243/118 253/327/193 65/335/201 +f 65/335/201 533/336/202 260/337/203 +f 260/337/203 258/338/198 65/335/201 +f 66/339/204 533/336/202 255/326/192 +f 255/326/192 262/340/205 66/339/204 +f 66/339/204 538/341/206 263/342/207 +f 263/342/207 261/343/208 66/339/204 +f 262/340/205 257/330/196 67/344/209 +f 67/344/209 535/334/200 264/345/210 +f 264/345/210 265/346/211 67/344/209 +f 67/344/209 538/341/206 262/340/205 +f 264/345/210 259/333/199 68/347/212 +f 68/347/212 536/348/213 266/349/214 +f 266/349/214 267/350/215 68/347/212 +f 267/350/215 264/345/210 68/347/212 +f 69/351/216 536/352/213 260/337/203 +f 260/337/203 261/343/208 69/351/216 +f 69/351/216 537/353/217 268/354/218 +f 69/351/216 540/355/219 266/356/214 +f 269/357/220 263/342/207 70/358/221 +f 263/342/207 270/359/222 70/358/221 +f 70/358/221 542/360/223 271/361/224 +f 70/358/221 541/362/225 269/357/220 +f 270/359/222 265/346/211 71/363/226 +f 265/346/211 272/364/227 71/363/226 +f 71/363/226 543/365/228 273/366/229 +f 273/366/229 270/359/222 71/363/226 +f 272/364/227 267/350/215 72/367/230 +f 72/367/230 540/368/219 274/369/231 +f 274/369/231 275/370/232 72/367/230 +f 275/370/232 272/364/227 72/367/230 +f 274/371/231 268/354/218 73/372/233 +f 268/354/218 269/357/220 73/372/233 +f 269/357/220 276/373/234 73/372/233 +f 73/372/233 544/374/235 274/371/231 +f 277/375/236 271/361/224 74/376/237 +f 271/361/224 278/377/238 74/376/237 +f 74/376/237 478/378/239 279/379/240 +f 74/376/237 477/380/241 277/375/236 +f 75/381/242 542/360/223 273/366/229 +f 273/366/229 280/382/243 75/381/242 +f 75/381/242 479/383/244 281/384/245 +f 281/384/245 278/377/238 75/381/242 +f 76/385/246 543/365/228 275/370/232 +f 76/385/246 544/386/235 282/387/247 +f 282/387/247 283/388/248 76/385/246 +f 283/388/248 280/382/243 76/385/246 +f 282/389/247 276/373/234 77/390/249 +f 77/390/249 541/362/225 277/375/236 +f 277/375/236 284/391/250 77/390/249 +f 77/390/249 480/392/251 282/389/247 +f 78/393/252 477/380/241 279/379/240 +f 78/393/252 478/378/239 286/394/253 +f 286/394/253 287/395/254 78/393/252 +f 287/395/254 285/396/255 78/393/252 +f 286/394/253 281/384/245 79/397/256 +f 79/397/256 479/383/244 288/398/257 +f 288/398/257 289/399/258 79/397/256 +f 79/397/256 546/400/259 286/394/253 +f 288/398/257 283/388/248 80/401/260 +f 283/388/248 290/402/261 80/401/260 +f 80/401/260 548/403/262 291/404/263 +f 80/401/260 547/405/264 288/398/257 +f 81/406/265 480/392/251 284/391/250 +f 284/391/250 285/396/255 81/406/265 +f 81/406/265 545/407/266 292/408/267 +f 292/408/267 290/409/261 81/406/265 +f 82/410/268 545/407/266 287/395/254 +f 82/410/268 546/400/259 294/411/269 +f 294/412/269 295/413/270 82/414/268 +f 295/413/270 293/415/271 82/414/268 +f 294/411/269 289/399/258 83/416/272 +f 83/416/272 547/405/264 296/417/273 +f 296/418/273 297/419/274 83/420/272 +f 83/420/272 550/421/275 294/412/269 +f 296/417/273 291/404/263 84/422/276 +f 291/404/263 298/423/277 84/422/276 +f 84/424/276 552/425/278 299/426/279 +f 299/426/279 296/418/273 84/424/276 +f 85/427/280 548/428/262 292/408/267 +f 292/408/267 293/429/271 85/427/280 +f 85/430/280 549/431/281 300/432/282 +f 85/430/280 552/433/278 298/434/277 +f 86/435/283 549/431/281 295/413/270 +f 86/435/283 550/421/275 302/436/284 +f 86/435/283 554/437/285 303/438/286 +f 86/435/283 553/439/287 301/440/288 +f 302/436/284 297/419/274 87/441/289 +f 297/419/274 304/442/290 87/441/289 +f 87/441/289 555/443/291 305/444/292 +f 305/444/292 302/436/284 87/441/289 +f 88/445/293 551/446/294 299/426/279 +f 299/426/279 306/447/295 88/445/293 +f 306/447/295 307/448/296 88/445/293 +f 307/448/296 304/442/290 88/445/293 +f 89/449/297 552/433/278 300/432/282 +f 89/449/297 549/431/281 301/440/288 +f 301/440/288 308/450/298 89/449/297 +f 89/449/297 556/451/299 306/452/295 +f 309/453/300 303/438/286 90/454/301 +f 303/438/286 310/455/302 90/454/301 +f 90/454/301 482/456/303 311/457/304 +f 90/454/301 481/458/305 309/453/300 +f 91/459/306 554/437/285 305/444/292 +f 305/444/292 312/460/307 91/459/306 +f 91/459/306 483/461/308 313/462/309 +f 313/462/309 310/455/302 91/459/306 +f 92/463/310 555/443/291 307/448/296 +f 92/463/310 556/464/299 314/465/311 +f 314/465/311 315/466/312 92/463/310 +f 315/466/312 312/460/307 92/463/310 +f 314/467/311 308/450/298 93/468/313 +f 93/468/313 553/439/287 309/453/300 +f 309/453/300 316/469/314 93/468/313 +f 93/468/313 484/470/315 314/467/311 +f 317/471/316 318/472/317 94/473/318 +f 94/473/318 502/474/319 319/475/320 +f 319/476/320 320/477/321 94/478/318 +f 94/478/318 557/479/322 317/480/316 +f 319/475/320 321/481/323 95/482/324 +f 95/482/324 503/483/325 322/484/326 +f 322/485/326 323/486/327 95/487/324 +f 95/487/324 558/488/328 319/476/320 +f 96/489/329 503/483/325 324/490/330 +f 324/490/330 325/491/331 96/489/329 +f 96/492/329 560/493/332 326/494/333 +f 326/494/333 322/485/326 96/492/329 +f 97/495/334 504/496/335 327/497/336 +f 327/497/336 317/471/316 97/495/334 +f 97/498/334 557/479/322 328/499/337 +f 328/499/337 325/500/331 97/498/334 +f 329/501/338 320/477/321 98/502/339 +f 98/502/339 558/488/328 330/503/340 +f 98/502/339 562/504/341 331/505/342 +f 331/505/342 329/501/338 98/502/339 +f 330/503/340 323/486/327 99/506/343 +f 99/506/343 559/507/344 332/508/345 +f 99/506/343 563/509/346 333/510/347 +f 333/510/347 330/503/340 99/506/343 +f 100/511/348 559/507/344 326/494/333 +f 326/494/333 334/512/349 100/511/348 +f 334/512/349 335/513/350 100/511/348 +f 100/511/348 563/509/346 332/508/345 +f 101/514/351 560/515/332 328/499/337 +f 328/499/337 329/501/338 101/514/351 +f 329/501/338 336/516/352 101/514/351 +f 101/514/351 564/517/353 334/518/349 +f 102/519/354 561/520/355 331/505/342 +f 331/505/342 338/521/356 102/519/354 +f 102/519/354 486/522/357 339/523/358 +f 339/523/358 337/524/359 102/519/354 +f 103/525/360 562/504/341 333/510/347 +f 333/510/347 340/526/361 103/525/360 +f 103/525/360 487/527/362 341/528/363 +f 341/528/363 338/521/356 103/525/360 +f 340/526/361 335/513/350 104/529/364 +f 104/529/364 564/530/353 342/531/365 +f 342/531/365 343/532/366 104/529/364 +f 104/529/364 487/527/362 340/526/361 +f 342/533/365 336/516/352 105/534/367 +f 105/534/367 561/520/355 337/524/359 +f 337/524/359 344/535/368 105/534/367 +f 105/534/367 488/536/369 342/533/365 +f 345/537/370 339/523/358 106/538/371 +f 106/538/371 486/522/357 346/539/372 +f 346/539/372 341/528/363 107/540/373 +f 107/540/373 487/527/362 347/541/374 +f 108/542/375 487/527/362 343/532/366 +f 343/532/366 348/543/376 108/542/375 +f 109/544/377 488/536/369 344/535/368 +f 344/535/368 345/537/370 109/544/377 +f 353/545/378 349/546/379 110/547/380 +f 110/547/380 566/548/381 354/549/382 +f 110/547/380 570/550/383 355/551/384 +f 355/551/384 353/545/378 110/547/380 +f 354/549/382 350/552/385 111/553/386 +f 350/554/385 356/555/387 111/556/386 +f 111/556/386 571/557/388 357/558/389 +f 357/559/389 354/549/382 111/553/386 +f 112/560/390 567/561/391 351/562/392 +f 351/562/392 358/563/393 112/560/390 +f 358/563/393 359/564/394 112/560/390 +f 112/560/390 571/557/388 356/555/387 +f 113/565/395 568/566/396 352/567/397 +f 113/568/395 565/569/398 353/545/378 +f 353/545/378 360/570/399 113/568/395 +f 113/568/395 572/571/400 358/563/393 +f 114/572/401 569/573/402 355/551/384 +f 355/551/384 362/574/403 114/572/401 +f 114/572/401 490/575/404 363/576/405 +f 363/576/405 361/577/406 114/572/401 +f 115/578/407 570/550/383 357/559/389 +f 357/558/389 364/579/408 115/580/407 +f 115/580/407 491/581/409 365/582/410 +f 365/583/410 362/574/403 115/578/407 +f 364/579/408 359/564/394 116/584/411 +f 116/584/411 572/571/400 366/585/412 +f 366/585/412 367/586/413 116/584/411 +f 116/584/411 491/581/409 364/579/408 +f 366/585/412 360/570/399 117/587/414 +f 117/587/414 569/573/402 361/577/406 +f 361/577/406 368/588/415 117/587/414 +f 117/587/414 492/589/416 366/585/412 +f 369/590/417 363/576/405 118/591/418 +f 118/591/418 490/575/404 370/592/419 +f 370/592/419 371/593/420 118/591/418 +f 118/591/418 573/594/421 369/590/417 +f 370/592/419 365/583/410 119/595/422 +f 119/596/422 491/581/409 372/597/423 +f 372/597/423 373/598/424 119/596/422 +f 119/595/422 574/599/425 370/592/419 +f 120/600/426 491/581/409 367/586/413 +f 367/586/413 374/601/427 120/600/426 +f 120/600/426 576/602/428 375/603/429 +f 375/603/429 372/597/423 120/600/426 +f 121/604/430 492/589/416 368/588/415 +f 368/588/415 369/590/417 121/604/430 +f 121/604/430 573/594/421 376/605/431 +f 376/605/431 374/601/427 121/604/430 +f 377/606/432 371/593/420 122/607/433 +f 122/607/433 574/599/425 378/608/434 +f 122/607/433 578/609/435 379/610/436 +f 379/610/436 377/606/432 122/607/433 +f 378/608/434 373/611/424 123/612/437 +f 123/613/437 575/614/438 380/615/439 +f 380/615/439 381/616/440 123/613/437 +f 381/617/440 378/608/434 123/612/437 +f 124/618/441 575/614/438 375/603/429 +f 375/603/429 382/619/442 124/618/441 +f 382/619/442 383/620/443 124/618/441 +f 383/620/443 380/615/439 124/618/441 +f 125/621/444 576/602/428 376/605/431 +f 376/605/431 377/606/432 125/621/444 +f 377/606/432 384/622/445 125/621/444 +f 384/622/445 382/619/442 125/621/444 +f 385/623/446 379/610/436 126/624/447 +f 379/610/436 386/625/448 126/624/447 +f 126/624/447 582/626/449 387/627/450 +f 387/627/450 385/623/446 126/624/447 +f 386/625/448 381/617/440 127/628/451 +f 381/616/440 388/629/452 127/630/451 +f 127/630/451 583/631/453 389/632/454 +f 389/633/454 386/625/448 127/628/451 +f 388/629/452 383/620/443 128/634/455 +f 128/634/455 580/635/456 390/636/457 +f 390/636/457 391/637/458 128/634/455 +f 128/634/455 583/631/453 388/629/452 +f 390/636/457 384/622/445 129/638/459 +f 384/622/445 385/623/446 129/638/459 +f 385/623/446 392/639/460 129/638/459 +f 129/638/459 584/640/461 390/636/457 +f 130/641/462 581/642/463 387/627/450 +f 387/627/450 394/643/464 130/641/462 +f 130/641/462 494/644/465 395/645/466 +f 395/645/466 393/646/467 130/641/462 +f 131/647/468 582/626/449 389/633/454 +f 389/632/454 396/648/469 131/649/468 +f 131/649/468 495/650/470 397/651/471 +f 397/652/471 394/643/464 131/647/468 +f 396/648/469 391/637/458 132/653/472 +f 132/653/472 584/640/461 398/654/473 +f 398/654/473 399/655/474 132/653/472 +f 132/653/472 495/650/470 396/648/469 +f 398/654/473 392/639/460 133/656/475 +f 133/656/475 581/642/463 393/646/467 +f 393/646/467 400/657/476 133/656/475 +f 133/656/475 496/658/477 398/654/473 +f 401/659/478 395/645/466 134/660/479 +f 134/660/479 494/644/465 402/661/480 +f 402/661/480 403/662/481 134/660/479 +f 403/662/481 401/659/478 134/660/479 +f 402/661/480 397/652/471 135/663/482 +f 135/664/482 495/650/470 404/665/483 +f 404/665/483 405/666/484 135/664/482 +f 135/663/482 586/667/485 402/661/480 +f 136/668/486 495/650/470 399/655/474 +f 399/655/474 406/669/487 136/668/486 +f 136/668/486 588/670/488 407/671/489 +f 136/668/486 587/672/490 404/665/483 +f 137/673/491 496/658/477 400/657/476 +f 400/657/476 401/659/478 137/673/491 +f 137/673/491 585/674/492 408/675/493 +f 408/675/493 406/669/487 137/673/491 +f 138/676/494 585/674/492 403/662/481 +f 403/662/481 410/677/495 138/676/494 +f 138/676/494 498/678/496 411/679/497 +f 411/679/497 409/680/498 138/676/494 +f 139/681/499 586/667/485 405/682/484 +f 405/666/484 412/683/500 139/684/499 +f 139/684/499 499/685/501 413/686/502 +f 413/687/502 410/677/495 139/681/499 +f 412/683/500 407/671/489 140/688/503 +f 140/688/503 588/670/488 414/689/504 +f 414/689/504 415/690/505 140/688/503 +f 140/688/503 499/685/501 412/683/500 +f 414/689/504 408/675/493 141/691/506 +f 141/691/506 585/674/492 409/680/498 +f 409/680/498 416/692/507 141/691/506 +f 141/691/506 500/693/508 414/689/504 +f 417/694/509 411/695/497 142/696/510 +f 142/696/510 498/697/496 418/698/511 +f 418/698/511 419/699/512 142/696/510 +f 142/696/510 589/700/513 417/694/509 +f 418/698/511 413/701/502 143/702/514 +f 143/703/514 499/704/501 420/705/515 +f 420/705/515 421/706/516 143/703/514 +f 143/702/514 590/707/517 418/698/511 +f 144/708/518 499/704/501 415/709/505 +f 415/709/505 422/710/519 144/708/518 +f 144/708/518 592/711/520 423/712/521 +f 423/712/521 420/705/515 144/708/518 +f 145/713/522 500/714/508 416/715/507 +f 416/715/507 417/694/509 145/713/522 +f 145/713/522 589/700/513 424/716/523 +f 424/716/523 422/710/519 145/713/522 +f 146/717/524 481/458/305 311/457/304 +f 146/717/524 482/456/303 426/718/525 +f 426/718/525 427/719/526 146/717/524 +f 427/719/526 425/720/527 146/717/524 +f 426/718/525 313/462/309 147/721/528 +f 147/721/528 483/461/308 428/722/529 +f 428/722/529 429/723/530 147/721/528 +f 147/721/528 594/724/531 426/718/525 +f 428/722/529 315/466/312 148/725/532 +f 315/466/312 430/726/533 148/725/532 +f 148/725/532 596/727/534 431/728/535 +f 148/725/532 595/729/536 428/722/529 +f 149/730/537 484/470/315 316/469/314 +f 316/469/314 425/720/527 149/730/537 +f 149/730/537 593/731/538 432/732/539 +f 432/732/539 430/733/533 149/730/537 +f 150/734/540 593/731/538 427/719/526 +f 150/734/540 594/724/531 434/735/541 +f 434/735/541 435/736/542 150/734/540 +f 435/736/542 433/737/543 150/734/540 +f 434/735/541 429/723/530 151/738/544 +f 151/738/544 595/729/536 436/739/545 +f 436/739/545 437/740/546 151/738/544 +f 437/740/546 434/735/541 151/738/544 +f 436/739/545 431/728/535 152/741/547 +f 431/728/535 438/742/548 152/741/547 +f 152/741/547 600/743/549 439/744/550 +f 152/741/547 599/745/551 436/739/545 +f 153/746/552 596/747/534 432/732/539 +f 432/732/539 433/737/543 153/746/552 +f 433/737/543 440/748/553 153/746/552 +f 440/748/553 438/749/548 153/746/552 +f 154/750/542 597/751/554 435/736/542 +f 154/750/542 598/752/555 442/753/555 +f 154/750/542 602/754/555 443/755/542 +f 443/755/542 441/756/554 154/750/542 +f 155/757/546 598/752/555 437/740/546 +f 155/757/546 599/745/551 444/758/551 +f 155/757/546 603/759/551 445/760/546 +f 445/760/546 442/753/555 155/757/546 +f 444/758/551 439/744/550 156/761/550 +f 439/744/550 446/762/549 156/761/550 +f 156/761/550 604/763/549 447/764/550 +f 156/761/550 603/759/551 444/758/551 +f 446/765/549 440/748/553 157/766/553 +f 157/766/553 597/751/554 441/756/554 +f 441/756/554 448/767/553 157/766/553 +f 157/766/553 604/768/549 446/765/549 +f 158/769/556 601/770/554 443/755/542 +f 443/755/542 450/771/557 158/769/556 +f 158/769/556 606/772/558 451/773/559 +f 451/773/559 449/774/560 158/769/556 +f 159/775/561 602/754/555 445/760/546 +f 445/760/546 452/776/562 159/775/561 +f 159/775/561 607/777/563 453/778/564 +f 453/778/564 450/771/557 159/775/561 +f 452/776/562 447/764/550 160/779/565 +f 160/779/565 604/763/549 454/780/566 +f 454/780/566 455/781/567 160/779/565 +f 160/779/565 607/777/563 452/776/562 +f 454/782/566 448/767/553 161/783/568 +f 448/767/553 449/774/560 161/783/568 +f 449/774/560 456/784/569 161/783/568 +f 161/783/568 608/785/570 454/782/566 +f 162/786/571 605/787/572 451/773/559 +f 451/773/559 458/788/573 162/786/571 +f 162/786/571 502/474/319 318/472/317 +f 318/472/317 457/789/574 162/786/571 +f 163/790/575 606/772/558 453/778/564 +f 453/778/564 459/791/576 163/790/575 +f 163/790/575 503/483/325 321/481/323 +f 321/481/323 458/788/573 163/790/575 +f 459/791/576 455/781/567 164/792/577 +f 164/792/577 608/793/570 460/794/578 +f 460/794/578 324/490/330 164/792/577 +f 164/792/577 503/483/325 459/791/576 +f 460/795/578 456/784/569 165/796/579 +f 165/796/579 605/787/572 457/789/574 +f 457/789/574 327/497/336 165/796/579 +f 165/796/579 504/496/335 460/795/578 +f 662/797/580 671/798/10 670/799/580 +f 660/800/581 669/801/14 668/802/581 +f 659/803/9 666/804/582 658/805/582 +f 664/806/583 671/798/10 663/807/10 +f 661/808/14 670/799/580 669/801/14 +f 659/803/9 668/802/581 667/809/9 +f 657/810/13 666/804/582 665/811/13 +f 664/806/583 665/812/13 672/813/583 +f 702/814/13 709/110/20 701/815/20 +f 708/108/19 710/816/13 702/814/13 +f 707/106/18 714/104/17 715/817/18 +f 722/818/17 729/819/14 721/820/14 +f 719/821/16 728/822/15 727/823/16 +f 717/824/13 726/825/20 725/826/13 +f 724/827/19 725/826/13 732/828/19 +f 723/829/18 730/830/17 722/818/17 +f 721/820/14 728/822/15 720/831/15 +f 719/832/16 726/825/20 718/833/20 +f 724/827/19 731/834/18 723/829/18 +f 704/100/15 703/835/16 711/101/16 +f 705/103/14 713/112/14 714/104/17 +f 707/106/18 715/817/18 716/107/19 +f 703/109/16 701/815/20 709/110/20 +f 705/103/14 704/100/15 712/102/15 +f 700/113/19 686/128/13 685/114/13 +f 698/116/18 700/113/19 699/115/19 +f 696/118/17 698/116/18 697/117/18 +f 693/120/14 694/122/14 696/118/17 +f 691/121/15 692/836/15 694/122/14 +f 690/123/16 692/836/15 691/121/15 +f 687/125/20 688/837/20 690/126/16 +f 686/128/13 688/837/20 687/125/20 +f 167/129/21 506/142/34 168/130/22 +f 19/131/23 168/130/22 505/132/24 +f 20/134/26 169/138/30 507/135/27 +f 170/136/28 506/142/34 167/129/21 +f 171/137/29 507/135/27 169/138/30 +f 173/140/32 505/132/24 168/130/22 +f 22/141/33 168/130/22 506/142/34 +f 174/143/35 462/838/584 175/144/36 +f 22/141/33 175/144/36 461/145/37 +f 23/146/38 174/143/35 506/142/34 +f 170/136/28 507/135/27 176/147/39 +f 23/146/38 176/147/39 463/148/40 +f 177/149/41 462/838/584 174/143/35 +f 24/150/42 176/147/39 507/135/27 +f 171/137/29 508/839/585 178/151/43 +f 24/150/42 178/151/43 464/152/44 +f 179/153/45 463/148/40 176/147/39 +f 178/154/43 508/840/585 172/155/46 +f 25/156/47 172/155/46 505/132/24 +f 173/140/32 461/145/37 180/157/48 +f 25/156/47 180/157/48 464/158/44 +f 26/159/49 181/165/55 465/160/50 +f 182/161/51 466/841/586 183/162/52 +f 26/159/49 183/162/52 510/163/53 +f 184/164/54 509/180/69 181/165/55 +f 183/162/52 466/841/586 185/166/56 +f 27/167/57 185/166/56 467/168/58 +f 186/169/59 511/176/66 187/170/60 +f 27/167/57 187/170/60 510/163/53 +f 186/169/59 467/168/58 188/171/61 +f 28/172/62 188/171/61 468/173/63 +f 189/174/64 512/195/80 190/175/65 +f 28/172/62 190/175/65 511/176/66 +f 29/177/67 189/182/64 468/178/63 +f 191/179/68 465/160/50 181/165/55 +f 29/177/67 181/165/55 509/180/69 +f 192/181/70 512/202/80 189/182/64 +f 30/183/71 193/203/74 509/180/69 +f 184/164/54 510/163/53 194/184/72 +f 194/185/72 514/214/93 195/186/73 +f 195/186/73 513/208/87 193/188/74 +f 194/184/72 510/163/53 187/170/60 +f 31/189/75 187/170/60 511/176/66 +f 31/191/75 196/200/76 515/192/77 +f 197/193/78 514/214/93 194/185/72 +f 196/190/76 511/176/66 190/175/65 +f 32/194/79 190/175/65 512/195/80 +f 32/197/79 198/842/81 516/198/82 +f 32/197/79 199/199/83 515/192/77 +f 33/201/84 198/843/81 512/202/80 +f 192/181/70 509/180/69 193/203/74 +f 193/188/74 513/208/87 200/204/85 +f 200/204/85 516/223/82 198/206/81 +f 34/207/86 201/212/91 513/208/87 +f 195/186/73 514/214/93 202/209/88 +f 202/209/88 518/229/105 203/210/89 +f 34/207/86 203/210/89 517/211/90 +f 35/213/92 202/209/88 514/214/93 +f 35/213/92 197/193/78 515/192/77 +f 35/213/92 204/215/94 519/216/95 +f 205/217/96 518/229/105 202/209/88 +f 36/218/97 204/215/94 515/192/77 +f 199/199/83 516/198/82 206/219/98 +f 36/218/97 206/219/98 520/220/99 +f 207/221/100 519/216/95 204/215/94 +f 37/222/101 206/226/98 516/223/82 +f 200/204/85 513/208/87 201/212/91 +f 201/212/91 517/211/90 208/224/102 +f 37/222/101 208/224/102 520/225/99 +f 209/227/103 517/211/90 203/210/89 +f 38/228/104 203/210/89 518/229/105 +f 210/230/106 474/844/587 211/231/107 +f 38/228/104 211/231/107 473/232/108 +f 39/233/109 210/230/106 518/229/105 +f 205/217/96 519/216/95 212/234/110 +f 39/233/109 212/234/110 475/235/111 +f 213/236/112 474/844/587 210/230/106 +f 40/237/113 212/234/110 519/216/95 +f 207/221/100 520/220/99 214/238/114 +f 40/237/113 214/238/114 476/239/115 +f 215/240/116 475/235/111 212/234/110 +f 214/241/114 520/225/99 208/224/102 +f 41/242/117 208/224/102 517/211/90 +f 209/227/103 473/232/108 216/243/118 +f 41/242/117 216/243/118 476/244/115 +f 42/245/119 217/251/125 469/246/120 +f 218/247/121 470/845/588 219/248/122 +f 42/245/119 219/248/122 522/249/123 +f 220/250/124 521/266/139 217/251/125 +f 219/248/122 470/845/588 221/252/126 +f 43/253/127 221/252/126 471/254/128 +f 222/255/129 523/262/136 223/256/130 +f 43/253/127 223/256/130 522/249/123 +f 222/255/129 471/254/128 224/257/131 +f 44/258/132 224/257/131 472/259/133 +f 225/260/134 524/279/151 226/261/135 +f 44/258/132 226/261/135 523/262/136 +f 45/263/137 225/268/134 472/264/133 +f 227/265/138 469/246/120 217/251/125 +f 45/263/137 217/251/125 521/266/139 +f 228/267/140 524/284/151 225/268/134 +f 46/269/141 229/273/145 521/266/139 +f 220/250/124 522/249/123 230/270/142 +f 230/270/142 526/290/159 231/271/143 +f 46/269/141 231/271/143 525/272/144 +f 230/270/142 522/249/123 223/256/130 +f 47/274/146 223/256/130 523/262/136 +f 47/274/146 232/275/147 527/276/148 +f 233/277/149 526/290/159 230/270/142 +f 232/275/147 523/262/136 226/261/135 +f 48/278/150 226/261/135 524/279/151 +f 48/278/150 234/280/152 528/281/153 +f 235/282/154 527/276/148 232/275/147 +f 49/283/155 234/287/152 524/284/151 +f 228/267/140 521/266/139 229/273/145 +f 229/273/145 525/272/144 236/285/156 +f 49/283/155 236/285/156 528/286/153 +f 237/288/157 525/272/144 231/271/143 +f 50/289/158 231/271/143 526/290/159 +f 238/291/160 466/841/586 182/161/51 +f 50/289/158 182/161/51 465/160/50 +f 51/292/161 238/291/160 526/290/159 +f 233/277/149 527/276/148 239/293/162 +f 51/292/161 239/293/162 467/168/58 +f 185/166/56 466/841/586 238/291/160 +f 52/294/163 239/293/162 527/276/148 +f 235/282/154 528/281/153 240/295/164 +f 52/294/163 240/295/164 468/173/63 +f 188/171/61 467/168/58 239/293/162 +f 240/296/164 528/286/153 236/285/156 +f 53/297/165 236/285/156 525/272/144 +f 237/288/157 465/160/50 191/179/68 +f 53/297/165 191/179/68 468/178/63 +f 54/298/166 241/302/170 461/145/37 +f 175/144/36 462/838/584 242/299/167 +f 54/298/166 242/299/167 530/300/168 +f 243/301/169 529/311/179 241/302/170 +f 242/299/167 462/838/584 177/149/41 +f 55/303/171 177/149/41 463/148/40 +f 244/304/172 531/309/177 245/305/173 +f 55/303/171 245/305/173 530/300/168 +f 244/304/172 463/148/40 179/153/45 +f 56/306/174 179/153/45 464/152/44 +f 246/307/175 532/846/589 247/308/176 +f 56/306/174 247/308/176 531/309/177 +f 57/310/178 246/313/175 464/158/44 +f 180/157/48 461/145/37 241/302/170 +f 57/310/178 241/302/170 529/311/179 +f 248/312/180 532/847/589 246/313/175 +f 249/314/181 529/311/179 243/301/169 +f 58/315/182 243/301/169 530/300/168 +f 250/316/183 470/845/588 218/247/121 +f 58/315/182 218/247/121 469/246/120 +f 59/317/184 250/316/183 530/300/168 +f 245/305/173 531/309/177 251/318/185 +f 59/317/184 251/318/185 471/254/128 +f 221/252/126 470/845/588 250/316/183 +f 60/319/186 251/318/185 531/309/177 +f 247/308/176 532/846/589 252/320/187 +f 60/319/186 252/320/187 472/259/133 +f 224/257/131 471/254/128 251/318/185 +f 252/321/187 532/847/589 248/312/180 +f 61/322/188 248/312/180 529/311/179 +f 249/314/181 469/246/120 227/265/138 +f 61/322/188 227/265/138 472/264/133 +f 62/323/189 253/327/193 473/232/108 +f 211/231/107 474/844/587 254/324/190 +f 62/323/189 254/324/190 534/325/191 +f 255/326/192 533/336/202 253/327/193 +f 254/324/190 474/844/587 213/236/112 +f 63/328/194 213/236/112 475/235/111 +f 256/329/195 535/334/200 257/330/196 +f 63/328/194 257/330/196 534/325/191 +f 256/329/195 475/235/111 215/240/116 +f 64/331/197 215/240/116 476/239/115 +f 258/332/198 536/348/213 259/333/199 +f 64/331/197 259/333/199 535/334/200 +f 65/335/201 258/338/198 476/244/115 +f 216/243/118 473/232/108 253/327/193 +f 65/335/201 253/327/193 533/336/202 +f 260/337/203 536/352/213 258/338/198 +f 66/339/204 261/343/208 533/336/202 +f 255/326/192 534/325/191 262/340/205 +f 66/339/204 262/340/205 538/341/206 +f 263/342/207 537/353/217 261/343/208 +f 262/340/205 534/325/191 257/330/196 +f 67/344/209 257/330/196 535/334/200 +f 264/345/210 539/848/590 265/346/211 +f 67/344/209 265/346/211 538/341/206 +f 264/345/210 535/334/200 259/333/199 +f 68/347/212 259/333/199 536/348/213 +f 266/349/214 540/368/219 267/350/215 +f 267/350/215 539/848/590 264/345/210 +f 69/351/216 266/356/214 536/352/213 +f 260/337/203 533/336/202 261/343/208 +f 69/351/216 261/343/208 537/353/217 +f 69/351/216 268/354/218 540/355/219 +f 269/357/220 537/353/217 263/342/207 +f 263/342/207 538/341/206 270/359/222 +f 70/358/221 270/359/222 542/360/223 +f 70/358/221 271/361/224 541/362/225 +f 270/359/222 538/341/206 265/346/211 +f 265/346/211 539/848/590 272/364/227 +f 71/363/226 272/364/227 543/365/228 +f 273/366/229 542/360/223 270/359/222 +f 272/364/227 539/848/590 267/350/215 +f 72/367/230 267/350/215 540/368/219 +f 274/369/231 544/386/235 275/370/232 +f 275/370/232 543/365/228 272/364/227 +f 274/371/231 540/355/219 268/354/218 +f 268/354/218 537/353/217 269/357/220 +f 269/357/220 541/362/225 276/373/234 +f 73/372/233 276/373/234 544/374/235 +f 277/375/236 541/362/225 271/361/224 +f 271/361/224 542/360/223 278/377/238 +f 74/376/237 278/377/238 478/378/239 +f 74/376/237 279/379/240 477/380/241 +f 75/381/242 278/377/238 542/360/223 +f 273/366/229 543/365/228 280/382/243 +f 75/381/242 280/382/243 479/383/244 +f 281/384/245 478/378/239 278/377/238 +f 76/385/246 280/382/243 543/365/228 +f 76/385/246 275/370/232 544/386/235 +f 282/387/247 480/849/251 283/388/248 +f 283/388/248 479/383/244 280/382/243 +f 282/389/247 544/374/235 276/373/234 +f 77/390/249 276/373/234 541/362/225 +f 277/375/236 477/380/241 284/391/250 +f 77/390/249 284/391/250 480/392/251 +f 78/393/252 285/396/255 477/380/241 +f 78/393/252 279/379/240 478/378/239 +f 286/394/253 546/400/259 287/395/254 +f 287/395/254 545/407/266 285/396/255 +f 286/394/253 478/378/239 281/384/245 +f 79/397/256 281/384/245 479/383/244 +f 288/398/257 547/405/264 289/399/258 +f 79/397/256 289/399/258 546/400/259 +f 288/398/257 479/383/244 283/388/248 +f 283/388/248 480/849/251 290/402/261 +f 80/401/260 290/402/261 548/403/262 +f 80/401/260 291/404/263 547/405/264 +f 81/406/265 290/409/261 480/392/251 +f 284/391/250 477/380/241 285/396/255 +f 81/406/265 285/396/255 545/407/266 +f 292/408/267 548/428/262 290/409/261 +f 82/410/268 293/429/271 545/407/266 +f 82/410/268 287/395/254 546/400/259 +f 294/412/269 550/421/275 295/413/270 +f 295/413/270 549/431/281 293/415/271 +f 294/411/269 546/400/259 289/399/258 +f 83/416/272 289/399/258 547/405/264 +f 296/418/273 551/446/294 297/419/274 +f 83/420/272 297/419/274 550/421/275 +f 296/417/273 547/405/264 291/404/263 +f 291/404/263 548/403/262 298/423/277 +f 84/424/276 298/850/277 552/425/278 +f 299/426/279 551/446/294 296/418/273 +f 85/427/280 298/851/277 548/428/262 +f 292/408/267 545/407/266 293/429/271 +f 85/430/280 293/415/271 549/431/281 +f 85/430/280 300/432/282 552/433/278 +f 86/435/283 301/440/288 549/431/281 +f 86/435/283 295/413/270 550/421/275 +f 86/435/283 302/436/284 554/437/285 +f 86/435/283 303/438/286 553/439/287 +f 302/436/284 550/421/275 297/419/274 +f 297/419/274 551/446/294 304/442/290 +f 87/441/289 304/442/290 555/443/291 +f 305/444/292 554/437/285 302/436/284 +f 88/445/293 304/442/290 551/446/294 +f 299/426/279 552/425/278 306/447/295 +f 306/447/295 556/464/299 307/448/296 +f 307/448/296 555/443/291 304/442/290 +f 89/449/297 306/452/295 552/433/278 +f 89/449/297 300/432/282 549/431/281 +f 301/440/288 553/439/287 308/450/298 +f 89/449/297 308/450/298 556/451/299 +f 309/453/300 553/439/287 303/438/286 +f 303/438/286 554/437/285 310/455/302 +f 90/454/301 310/455/302 482/456/303 +f 90/454/301 311/457/304 481/458/305 +f 91/459/306 310/455/302 554/437/285 +f 305/444/292 555/443/291 312/460/307 +f 91/459/306 312/460/307 483/461/308 +f 313/462/309 482/456/303 310/455/302 +f 92/463/310 312/460/307 555/443/291 +f 92/463/310 307/448/296 556/464/299 +f 314/465/311 484/852/315 315/466/312 +f 315/466/312 483/461/308 312/460/307 +f 314/467/311 556/451/299 308/450/298 +f 93/468/313 308/450/298 553/439/287 +f 309/453/300 481/458/305 316/469/314 +f 93/468/313 316/469/314 484/470/315 +f 317/471/316 501/853/591 318/472/317 +f 94/473/318 318/472/317 502/474/319 +f 319/476/320 558/488/328 320/477/321 +f 94/478/318 320/477/321 557/479/322 +f 319/475/320 502/474/319 321/481/323 +f 95/482/324 321/481/323 503/483/325 +f 322/485/326 559/507/344 323/486/327 +f 95/487/324 323/486/327 558/488/328 +f 96/489/329 322/484/326 503/483/325 +f 324/490/330 504/854/335 325/491/331 +f 96/492/329 325/855/331 560/493/332 +f 326/494/333 559/507/344 322/485/326 +f 97/495/334 325/856/331 504/496/335 +f 327/497/336 501/853/591 317/471/316 +f 97/498/334 317/480/316 557/479/322 +f 328/499/337 560/515/332 325/500/331 +f 329/501/338 557/479/322 320/477/321 +f 98/502/339 320/477/321 558/488/328 +f 98/502/339 330/503/340 562/504/341 +f 331/505/342 561/520/355 329/501/338 +f 330/503/340 558/488/328 323/486/327 +f 99/506/343 323/486/327 559/507/344 +f 99/506/343 332/508/345 563/509/346 +f 333/510/347 562/504/341 330/503/340 +f 100/511/348 332/508/345 559/507/344 +f 326/494/333 560/493/332 334/512/349 +f 334/512/349 564/530/353 335/513/350 +f 100/511/348 335/513/350 563/509/346 +f 101/514/351 334/518/349 560/515/332 +f 328/499/337 557/479/322 329/501/338 +f 329/501/338 561/520/355 336/516/352 +f 101/514/351 336/516/352 564/517/353 +f 102/519/354 337/524/359 561/520/355 +f 331/505/342 562/504/341 338/521/356 +f 102/519/354 338/521/356 486/522/357 +f 339/523/358 485/857/592 337/524/359 +f 103/525/360 338/521/356 562/504/341 +f 333/510/347 563/509/346 340/526/361 +f 103/525/360 340/526/361 487/527/362 +f 341/528/363 486/522/357 338/521/356 +f 340/526/361 563/509/346 335/513/350 +f 104/529/364 335/513/350 564/530/353 +f 342/531/365 488/858/369 343/532/366 +f 104/529/364 343/532/366 487/527/362 +f 342/533/365 564/517/353 336/516/352 +f 105/534/367 336/516/352 561/520/355 +f 337/524/359 485/857/592 344/535/368 +f 105/534/367 344/535/368 488/536/369 +f 345/537/370 485/857/592 339/523/358 +f 106/538/371 339/523/358 486/522/357 +f 346/539/372 486/522/357 341/528/363 +f 107/540/373 341/528/363 487/527/362 +f 108/542/375 347/541/374 487/527/362 +f 343/532/366 488/858/369 348/543/376 +f 109/544/377 348/859/376 488/536/369 +f 344/535/368 485/857/592 345/537/370 +f 353/545/378 565/569/398 349/546/379 +f 110/547/380 349/546/379 566/548/381 +f 110/547/380 354/549/382 570/550/383 +f 355/551/384 569/573/402 353/545/378 +f 354/549/382 566/548/381 350/552/385 +f 350/554/385 567/561/391 356/555/387 +f 111/556/386 356/555/387 571/557/388 +f 357/559/389 570/550/383 354/549/382 +f 112/560/390 356/555/387 567/561/391 +f 351/562/392 568/566/396 358/563/393 +f 358/563/393 572/571/400 359/564/394 +f 112/560/390 359/564/394 571/557/388 +f 113/565/395 358/860/393 568/566/396 +f 113/568/395 352/567/397 565/569/398 +f 353/545/378 569/573/402 360/570/399 +f 113/568/395 360/570/399 572/571/400 +f 114/572/401 361/577/406 569/573/402 +f 355/551/384 570/550/383 362/574/403 +f 114/572/401 362/574/403 490/575/404 +f 363/576/405 489/861/593 361/577/406 +f 115/578/407 362/574/403 570/550/383 +f 357/558/389 571/557/388 364/579/408 +f 115/580/407 364/579/408 491/581/409 +f 365/583/410 490/575/404 362/574/403 +f 364/579/408 571/557/388 359/564/394 +f 116/584/411 359/564/394 572/571/400 +f 366/585/412 492/589/416 367/586/413 +f 116/584/411 367/586/413 491/581/409 +f 366/585/412 572/571/400 360/570/399 +f 117/587/414 360/570/399 569/573/402 +f 361/577/406 489/861/593 368/588/415 +f 117/587/414 368/588/415 492/589/416 +f 369/590/417 489/861/593 363/576/405 +f 118/591/418 363/576/405 490/575/404 +f 370/592/419 574/599/425 371/593/420 +f 118/591/418 371/593/420 573/594/421 +f 370/592/419 490/575/404 365/583/410 +f 119/596/422 365/582/410 491/581/409 +f 372/597/423 575/614/438 373/598/424 +f 119/595/422 373/611/424 574/599/425 +f 120/600/426 372/597/423 491/581/409 +f 367/586/413 492/589/416 374/601/427 +f 120/600/426 374/601/427 576/602/428 +f 375/603/429 575/614/438 372/597/423 +f 121/604/430 374/601/427 492/589/416 +f 368/588/415 489/861/593 369/590/417 +f 121/604/430 369/590/417 573/594/421 +f 376/605/431 576/602/428 374/601/427 +f 377/606/432 573/594/421 371/593/420 +f 122/607/433 371/593/420 574/599/425 +f 122/607/433 378/608/434 578/609/435 +f 379/610/436 577/862/594 377/606/432 +f 378/608/434 574/599/425 373/611/424 +f 123/613/437 373/598/424 575/614/438 +f 380/615/439 579/863/595 381/616/440 +f 381/617/440 578/609/435 378/608/434 +f 124/618/441 380/615/439 575/614/438 +f 375/603/429 576/602/428 382/619/442 +f 382/619/442 580/635/456 383/620/443 +f 383/620/443 579/863/595 380/615/439 +f 125/621/444 382/619/442 576/602/428 +f 376/605/431 573/594/421 377/606/432 +f 377/606/432 577/862/594 384/622/445 +f 384/622/445 580/635/456 382/619/442 +f 385/623/446 577/862/594 379/610/436 +f 379/610/436 578/609/435 386/625/448 +f 126/624/447 386/625/448 582/626/449 +f 387/627/450 581/642/463 385/623/446 +f 386/625/448 578/609/435 381/617/440 +f 381/616/440 579/863/595 388/629/452 +f 127/630/451 388/629/452 583/631/453 +f 389/633/454 582/626/449 386/625/448 +f 388/629/452 579/863/595 383/620/443 +f 128/634/455 383/620/443 580/635/456 +f 390/636/457 584/640/461 391/637/458 +f 128/634/455 391/637/458 583/631/453 +f 390/636/457 580/635/456 384/622/445 +f 384/622/445 577/862/594 385/623/446 +f 385/623/446 581/642/463 392/639/460 +f 129/638/459 392/639/460 584/640/461 +f 130/641/462 393/646/467 581/642/463 +f 387/627/450 582/626/449 394/643/464 +f 130/641/462 394/643/464 494/644/465 +f 395/645/466 493/864/596 393/646/467 +f 131/647/468 394/643/464 582/626/449 +f 389/632/454 583/631/453 396/648/469 +f 131/649/468 396/648/469 495/650/470 +f 397/652/471 494/644/465 394/643/464 +f 396/648/469 583/631/453 391/637/458 +f 132/653/472 391/637/458 584/640/461 +f 398/654/473 496/658/477 399/655/474 +f 132/653/472 399/655/474 495/650/470 +f 398/654/473 584/640/461 392/639/460 +f 133/656/475 392/639/460 581/642/463 +f 393/646/467 493/864/596 400/657/476 +f 133/656/475 400/657/476 496/658/477 +f 401/659/478 493/864/596 395/645/466 +f 134/660/479 395/645/466 494/644/465 +f 402/661/480 586/667/485 403/662/481 +f 403/662/481 585/674/492 401/659/478 +f 402/661/480 494/644/465 397/652/471 +f 135/664/482 397/651/471 495/650/470 +f 404/665/483 587/672/490 405/666/484 +f 135/663/482 405/682/484 586/667/485 +f 136/668/486 404/665/483 495/650/470 +f 399/655/474 496/658/477 406/669/487 +f 136/668/486 406/669/487 588/670/488 +f 136/668/486 407/671/489 587/672/490 +f 137/673/491 406/669/487 496/658/477 +f 400/657/476 493/864/596 401/659/478 +f 137/673/491 401/659/478 585/674/492 +f 408/675/493 588/670/488 406/669/487 +f 138/676/494 409/680/498 585/674/492 +f 403/662/481 586/667/485 410/677/495 +f 138/676/494 410/677/495 498/678/496 +f 411/679/497 497/865/597 409/680/498 +f 139/681/499 410/677/495 586/667/485 +f 405/666/484 587/672/490 412/683/500 +f 139/684/499 412/683/500 499/685/501 +f 413/687/502 498/678/496 410/677/495 +f 412/683/500 587/672/490 407/671/489 +f 140/688/503 407/671/489 588/670/488 +f 414/689/504 500/693/508 415/690/505 +f 140/688/503 415/690/505 499/685/501 +f 414/689/504 588/670/488 408/675/493 +f 141/691/506 408/675/493 585/674/492 +f 409/680/498 497/865/597 416/692/507 +f 141/691/506 416/692/507 500/693/508 +f 417/694/509 497/866/597 411/695/497 +f 142/696/510 411/695/497 498/697/496 +f 418/698/511 590/707/517 419/699/512 +f 142/696/510 419/699/512 589/700/513 +f 418/698/511 498/697/496 413/701/502 +f 143/703/514 413/867/502 499/704/501 +f 420/705/515 591/868/598 421/706/516 +f 143/702/514 421/869/516 590/707/517 +f 144/708/518 420/705/515 499/704/501 +f 415/709/505 500/714/508 422/710/519 +f 144/708/518 422/710/519 592/711/520 +f 423/712/521 591/868/598 420/705/515 +f 145/713/522 422/710/519 500/714/508 +f 416/715/507 497/866/597 417/694/509 +f 145/713/522 417/694/509 589/700/513 +f 424/716/523 592/711/520 422/710/519 +f 146/717/524 425/720/527 481/458/305 +f 146/717/524 311/457/304 482/456/303 +f 426/718/525 594/724/531 427/719/526 +f 427/719/526 593/731/538 425/720/527 +f 426/718/525 482/456/303 313/462/309 +f 147/721/528 313/462/309 483/461/308 +f 428/722/529 595/729/536 429/723/530 +f 147/721/528 429/723/530 594/724/531 +f 428/722/529 483/461/308 315/466/312 +f 315/466/312 484/852/315 430/726/533 +f 148/725/532 430/726/533 596/727/534 +f 148/725/532 431/728/535 595/729/536 +f 149/730/537 430/733/533 484/470/315 +f 316/469/314 481/458/305 425/720/527 +f 149/730/537 425/720/527 593/731/538 +f 432/732/539 596/747/534 430/733/533 +f 150/734/540 433/737/543 593/731/538 +f 150/734/540 427/719/526 594/724/531 +f 434/735/541 598/752/555 435/736/542 +f 435/736/542 597/751/554 433/737/543 +f 434/735/541 594/724/531 429/723/530 +f 151/738/544 429/723/530 595/729/536 +f 436/739/545 599/745/551 437/740/546 +f 437/740/546 598/752/555 434/735/541 +f 436/739/545 595/729/536 431/728/535 +f 431/728/535 596/727/534 438/742/548 +f 152/741/547 438/742/548 600/743/549 +f 152/741/547 439/744/550 599/745/551 +f 153/746/552 438/749/548 596/747/534 +f 432/732/539 593/731/538 433/737/543 +f 433/737/543 597/751/554 440/748/553 +f 440/748/553 600/870/549 438/749/548 +f 154/750/542 441/756/554 597/751/554 +f 154/750/542 435/736/542 598/752/555 +f 154/750/542 442/753/555 602/754/555 +f 443/755/542 601/770/554 441/756/554 +f 155/757/546 442/753/555 598/752/555 +f 155/757/546 437/740/546 599/745/551 +f 155/757/546 444/758/551 603/759/551 +f 445/760/546 602/754/555 442/753/555 +f 444/758/551 599/745/551 439/744/550 +f 439/744/550 600/743/549 446/762/549 +f 156/761/550 446/762/549 604/763/549 +f 156/761/550 447/764/550 603/759/551 +f 446/765/549 600/870/549 440/748/553 +f 157/766/553 440/748/553 597/751/554 +f 441/756/554 601/770/554 448/767/553 +f 157/766/553 448/767/553 604/768/549 +f 158/769/556 449/774/560 601/770/554 +f 443/755/542 602/754/555 450/771/557 +f 158/769/556 450/771/557 606/772/558 +f 451/773/559 605/787/572 449/774/560 +f 159/775/561 450/771/557 602/754/555 +f 445/760/546 603/759/551 452/776/562 +f 159/775/561 452/776/562 607/777/563 +f 453/778/564 606/772/558 450/771/557 +f 452/776/562 603/759/551 447/764/550 +f 160/779/565 447/764/550 604/763/549 +f 454/780/566 608/793/570 455/781/567 +f 160/779/565 455/781/567 607/777/563 +f 454/782/566 604/768/549 448/767/553 +f 448/767/553 601/770/554 449/774/560 +f 449/774/560 605/787/572 456/784/569 +f 161/783/568 456/784/569 608/785/570 +f 162/786/571 457/789/574 605/787/572 +f 451/773/559 606/772/558 458/788/573 +f 162/786/571 458/788/573 502/474/319 +f 318/472/317 501/853/591 457/789/574 +f 163/790/575 458/788/573 606/772/558 +f 453/778/564 607/777/563 459/791/576 +f 163/790/575 459/791/576 503/483/325 +f 321/481/323 502/474/319 458/788/573 +f 459/791/576 607/777/563 455/781/567 +f 164/792/577 455/781/567 608/793/570 +f 460/794/578 504/854/335 324/490/330 +f 164/792/577 324/490/330 503/483/325 +f 460/795/578 608/785/570 456/784/569 +f 165/796/579 456/784/569 605/787/572 +f 457/789/574 501/853/591 327/497/336 +f 165/796/579 327/497/336 504/496/335 +f 662/797/580 663/807/10 671/798/10 +f 660/800/581 661/808/14 669/801/14 +f 659/803/9 667/809/9 666/804/582 +f 664/806/583 672/813/583 671/798/10 +f 661/808/14 662/797/580 670/799/580 +f 659/803/9 660/800/581 668/802/581 +f 657/810/13 658/805/582 666/804/582 +f 664/806/583 657/871/13 665/812/13 +f 702/814/13 710/816/13 709/110/20 +f 708/108/19 716/107/19 710/816/13 +f 707/106/18 706/105/17 714/104/17 +f 722/818/17 730/830/17 729/819/14 +f 719/821/16 720/831/15 728/822/15 +f 717/824/13 718/833/20 726/825/20 +f 724/827/19 717/824/13 725/826/13 +f 723/829/18 731/834/18 730/830/17 +f 721/820/14 729/819/14 728/822/15 +f 719/832/16 727/872/16 726/825/20 +f 724/827/19 732/828/19 731/834/18 +o Nozzle +v -6.250000 0.933709 -0.066291 +v -6.250000 1.000001 -0.093750 +v -6.187500 1.000001 -0.187500 +v -4.687500 1.000001 -0.187500 +v -6.187500 0.867418 -0.132583 +v -4.687500 0.867418 -0.132583 +v -6.187500 0.812501 0.000000 +v -4.687500 0.812501 0.000000 +v -6.187500 0.867418 0.132583 +v -4.687500 0.867418 0.132583 +v -6.187500 1.000001 0.187500 +v -4.687500 1.000001 0.187500 +v -6.187500 1.132583 0.132582 +v -4.687500 1.132583 0.132582 +v -6.187500 1.187501 -0.000000 +v -4.687500 1.187501 -0.000000 +v -6.187500 1.132583 -0.132582 +v -4.687500 1.132583 -0.132582 +v -6.250000 0.906251 0.000000 +v -6.250000 0.933709 0.066291 +v -6.250000 1.000001 0.093750 +v -6.250000 1.066292 0.066291 +v -6.250000 1.093751 -0.000000 +v -6.250000 1.066292 -0.066291 +v -4.625000 0.933709 -0.066291 +v -4.625000 1.000001 -0.093750 +v -4.625000 0.906251 0.000000 +v -4.625000 0.933709 0.066291 +v -4.625000 1.000001 0.093750 +v -4.625000 1.066292 0.066291 +v -4.625000 1.093751 0.000000 +v -4.625000 1.066292 -0.066291 +v -6.312500 1.066292 -0.066291 +v -6.312500 1.000001 -0.093750 +v -6.312500 1.093751 -0.000000 +v -6.312500 1.066292 0.066291 +v -6.312500 1.000001 0.093750 +v -6.312500 0.933709 0.066291 +v -6.312500 0.906251 -0.000000 +v -6.312500 0.933709 -0.066291 +v -4.562500 0.933709 -0.066291 +v -4.562500 1.000001 -0.093750 +v -4.562500 0.906251 0.000000 +v -4.562500 0.933709 0.066291 +v -4.562500 1.000001 0.093750 +v -4.562500 1.066292 0.066291 +v -4.562500 1.093751 0.000000 +v -4.562500 1.066292 -0.066291 +v -4.336167 0.044194 0.913833 +v -4.304917 0.062500 0.945083 +v -6.437500 0.062500 1.000000 +v -4.437500 0.062500 1.000000 +v -6.437500 0.044194 0.955806 +v -4.437500 0.044194 0.955806 +v -6.437500 0.000000 0.937500 +v -4.437500 0.000000 0.937500 +v -6.437500 -0.044194 0.955806 +v -4.437500 -0.044194 0.955806 +v -6.437500 -0.062500 1.000000 +v -4.437500 -0.062500 1.000000 +v -6.437500 -0.044194 1.044194 +v -4.437500 -0.044194 1.044194 +v -6.437500 0.000000 1.062500 +v -4.437500 0.000000 1.062500 +v -6.437500 0.044194 1.044194 +v -4.437500 0.044194 1.044194 +v -4.349112 0.000000 0.900889 +v -4.336167 -0.044194 0.913833 +v -4.304917 -0.062500 0.945083 +v -4.273667 -0.044194 0.976333 +v -4.260723 0.000000 0.989277 +v -4.273667 0.044194 0.976333 +v -4.294194 0.044194 0.812500 +v -4.250000 0.062500 0.812500 +v -4.312500 0.000000 0.812500 +v -4.294194 -0.044194 0.812500 +v -4.250000 -0.062500 0.812500 +v -4.205806 -0.044194 0.812500 +v -4.187500 0.000000 0.812500 +v -4.205806 0.044194 0.812500 +v -4.294194 0.044194 0.562500 +v -4.250000 0.062500 0.562500 +v -4.312500 0.000000 0.562500 +v -4.294194 -0.044194 0.562500 +v -4.250000 -0.062500 0.562500 +v -4.205806 -0.044194 0.562500 +v -4.187500 0.000000 0.562500 +v -4.205806 0.044194 0.562500 +v -4.338388 0.088389 0.437500 +v -4.250000 0.125000 0.437500 +v -4.375000 0.000000 0.437500 +v -4.338388 -0.088388 0.437500 +v -4.250000 -0.125000 0.437500 +v -4.161612 -0.088388 0.437500 +v -4.125000 0.000000 0.437500 +v -4.161612 0.088389 0.437500 +v -4.338388 0.088389 0.562500 +v -4.250000 0.125000 0.562500 +v -4.375000 0.000000 0.562500 +v -4.338388 -0.088388 0.562500 +v -4.250000 -0.125000 0.562500 +v -4.161612 -0.088388 0.562500 +v -4.125000 0.000000 0.562500 +v -4.161612 0.088389 0.562500 +v -6.570083 0.062500 0.945083 +v -6.538833 0.044194 0.913833 +v -6.525888 0.000000 0.900889 +v -6.538833 -0.044194 0.913833 +v -6.570083 -0.062500 0.945083 +v -6.601333 -0.044194 0.976333 +v -6.614277 0.000000 0.989277 +v -6.601333 0.044194 0.976333 +v -6.746859 0.062500 0.768306 +v -6.715609 0.044194 0.737056 +v -6.702665 0.000000 0.724112 +v -6.715609 -0.044194 0.737056 +v -6.746859 -0.062500 0.768306 +v -6.778109 -0.044194 0.799556 +v -6.791053 0.000000 0.812500 +v -6.778109 0.044194 0.799556 +v -6.746859 0.093750 0.768306 +v -6.699984 0.066291 0.721431 +v -6.680568 0.000000 0.702015 +v -6.699984 -0.066291 0.721431 +v -6.746859 -0.093750 0.768306 +v -6.793734 -0.066291 0.815181 +v -6.813150 0.000000 0.834597 +v -6.793734 0.066291 0.815181 +v -6.835247 0.093750 0.679918 +v -6.788372 0.066291 0.633043 +v -6.768956 0.000000 0.613626 +v -6.788372 -0.066291 0.633043 +v -6.835247 -0.093750 0.679918 +v -6.882122 -0.066291 0.726792 +v -6.901539 0.000000 0.746209 +v -6.882122 0.066291 0.726792 +v -6.250000 0.066292 0.933709 +v -6.250000 0.093750 1.000001 +v -6.187500 0.187500 1.000001 +v -4.687500 0.187500 1.000001 +v -6.187500 0.132583 0.867418 +v -4.687500 0.132583 0.867418 +v -6.187500 0.000000 0.812501 +v -4.687500 0.000000 0.812501 +v -6.187500 -0.132582 0.867418 +v -4.687500 -0.132582 0.867418 +v -6.187500 -0.187500 1.000001 +v -4.687500 -0.187500 1.000001 +v -6.187500 -0.132582 1.132583 +v -4.687500 -0.132582 1.132583 +v -6.187500 0.000000 1.187501 +v -4.687500 0.000000 1.187501 +v -6.187500 0.132583 1.132583 +v -4.687500 0.132583 1.132583 +v -6.250000 0.000000 0.906251 +v -6.250000 -0.066291 0.933710 +v -6.250000 -0.093750 1.000001 +v -6.250000 -0.066291 1.066292 +v -6.250000 0.000000 1.093751 +v -6.250000 0.066292 1.066292 +v -4.625000 0.066292 0.933710 +v -4.625000 0.093750 1.000001 +v -4.625000 0.000000 0.906251 +v -4.625000 -0.066291 0.933710 +v -4.625000 -0.093750 1.000001 +v -4.625000 -0.066291 1.066292 +v -4.625000 0.000000 1.093751 +v -4.625000 0.066291 1.066292 +v -6.312500 0.066292 1.066292 +v -6.312500 0.093750 1.000001 +v -6.312500 0.000000 1.093751 +v -6.312500 -0.066291 1.066292 +v -6.312500 -0.093750 1.000001 +v -6.312500 -0.066291 0.933710 +v -6.312500 0.000000 0.906251 +v -6.312500 0.066292 0.933710 +v -4.562500 0.066292 0.933709 +v -4.562500 0.093750 1.000001 +v -4.562500 0.000000 0.906251 +v -4.562500 -0.066291 0.933709 +v -4.562500 -0.093750 1.000001 +v -4.562500 -0.066291 1.066292 +v -4.562500 0.000000 1.093751 +v -4.562500 0.066292 1.066292 +v -6.250000 0.933709 -0.066291 +v -6.250000 1.000001 -0.093750 +v -6.187500 1.000001 -0.187500 +v -4.687500 1.000001 -0.187500 +v -6.187500 0.867418 -0.132583 +v -4.687500 0.867418 -0.132583 +v -6.187500 0.812501 0.000000 +v -4.687500 0.812501 0.000000 +v -6.187500 0.867418 0.132583 +v -4.687500 0.867418 0.132583 +v -6.187500 1.000001 0.187500 +v -4.687500 1.000001 0.187500 +v -6.187500 1.132583 0.132582 +v -4.687500 1.132583 0.132582 +v -6.187500 1.187501 -0.000000 +v -4.687500 1.187501 -0.000000 +v -6.187500 1.132583 -0.132582 +v -4.687500 1.132583 -0.132582 +v -6.250000 0.906251 0.000000 +v -6.250000 0.933709 0.066291 +v -6.250000 1.000001 0.093750 +v -6.250000 1.066292 0.066291 +v -6.250000 1.093751 -0.000000 +v -6.250000 1.066292 -0.066291 +v -4.625000 0.933709 -0.066291 +v -4.625000 1.000001 -0.093750 +v -4.625000 0.906251 0.000000 +v -4.625000 0.933709 0.066291 +v -4.625000 1.000001 0.093750 +v -4.625000 1.066292 0.066291 +v -4.625000 1.093751 0.000000 +v -4.625000 1.066292 -0.066291 +v -6.312500 1.066292 -0.066291 +v -6.312500 1.000001 -0.093750 +v -6.312500 1.093751 -0.000000 +v -6.312500 1.066292 0.066291 +v -6.312500 1.000001 0.093750 +v -6.312500 0.933709 0.066291 +v -6.312500 0.906251 -0.000000 +v -6.312500 0.933709 -0.066291 +v -4.562500 0.933709 -0.066291 +v -4.562500 1.000001 -0.093750 +v -4.562500 0.906251 0.000000 +v -4.562500 0.933709 0.066291 +v -4.562500 1.000001 0.093750 +v -4.562500 1.066292 0.066291 +v -4.562500 1.093751 0.000000 +v -4.562500 1.066292 -0.066291 +v -6.250000 0.066292 0.933709 +v -6.250000 0.093750 1.000001 +v -6.187500 0.187500 1.000001 +v -4.687500 0.187500 1.000001 +v -6.187500 0.132583 0.867418 +v -4.687500 0.132583 0.867418 +v -6.187500 0.000000 0.812501 +v -4.687500 0.000000 0.812501 +v -6.187500 -0.132582 0.867418 +v -4.687500 -0.132582 0.867418 +v -6.187500 -0.187500 1.000001 +v -4.687500 -0.187500 1.000001 +v -6.187500 -0.132582 1.132583 +v -4.687500 -0.132582 1.132583 +v -6.187500 0.000000 1.187501 +v -4.687500 0.000000 1.187501 +v -6.187500 0.132583 1.132583 +v -4.687500 0.132583 1.132583 +v -6.250000 0.000000 0.906251 +v -6.250000 -0.066291 0.933710 +v -6.250000 -0.093750 1.000001 +v -6.250000 -0.066291 1.066292 +v -6.250000 0.000000 1.093751 +v -6.250000 0.066292 1.066292 +v -4.625000 0.066292 0.933710 +v -4.625000 0.093750 1.000001 +v -4.625000 0.000000 0.906251 +v -4.625000 -0.066291 0.933710 +v -4.625000 -0.093750 1.000001 +v -4.625000 -0.066291 1.066292 +v -4.625000 0.000000 1.093751 +v -4.625000 0.066291 1.066292 +v -6.312500 0.066292 1.066292 +v -6.312500 0.093750 1.000001 +v -6.312500 0.000000 1.093751 +v -6.312500 -0.066291 1.066292 +v -6.312500 -0.093750 1.000001 +v -6.312500 -0.066291 0.933710 +v -6.312500 0.000000 0.906251 +v -6.312500 0.066292 0.933710 +v -4.562500 0.066292 0.933709 +v -4.562500 0.093750 1.000001 +v -4.562500 0.000000 0.906251 +v -4.562500 -0.066291 0.933709 +v -4.562500 -0.093750 1.000001 +v -4.562500 -0.066291 1.066292 +v -4.562500 0.000000 1.093751 +v -4.562500 0.066292 1.066292 +v -6.746859 0.062500 0.768306 +v -6.715609 0.044194 0.737056 +v -6.702665 0.000000 0.724112 +v -6.715609 -0.044194 0.737056 +v -6.746859 -0.062500 0.768306 +v -6.778109 -0.044194 0.799556 +v -6.791053 0.000000 0.812500 +v -6.778109 0.044194 0.799556 +v -6.746859 0.093750 0.768306 +v -6.699984 0.066291 0.721431 +v -6.680568 0.000000 0.702015 +v -6.699984 -0.066291 0.721431 +v -6.746859 -0.093750 0.768306 +v -6.793734 -0.066291 0.815181 +v -6.813150 0.000000 0.834597 +v -6.793734 0.066291 0.815181 +v -6.835247 0.093750 0.679918 +v -6.788372 0.066291 0.633043 +v -6.768956 0.000000 0.613626 +v -6.788372 -0.066291 0.633043 +v -6.835247 -0.093750 0.679918 +v -6.882122 -0.066291 0.726792 +v -6.901539 0.000000 0.746209 +v -6.882122 0.066291 0.726792 +v -4.338388 0.088389 0.562500 +v -4.250000 0.125000 0.562500 +v -4.375000 0.000000 0.562500 +v -4.338388 -0.088388 0.562500 +v -4.250000 -0.125000 0.562500 +v -4.161612 -0.088388 0.562500 +v -4.125000 0.000000 0.562500 +v -4.161612 0.088389 0.562500 +vt 0.411238 0.697368 +vt 0.418973 0.684493 +vt 0.426708 0.697368 +vt 0.405138 0.703796 +vt 0.399301 0.694079 +vt 0.405138 0.684363 +vt 0.274703 0.703644 +vt 0.270640 0.700842 +vt 0.278767 0.687315 +vt 0.239289 0.634604 +vt 0.239289 0.648291 +vt 0.231066 0.648291 +vt 0.252964 0.638158 +vt 0.249012 0.644737 +vt 0.249012 0.638158 +vt 0.252964 0.651316 +vt 0.249012 0.657895 +vt 0.249012 0.651316 +vt 0.252964 0.671053 +vt 0.249012 0.664474 +vt 0.252964 0.664474 +vt 0.252964 0.677632 +vt 0.249012 0.671053 +vt 0.249012 0.631579 +vt 0.252964 0.631579 +vt 0.252964 0.644737 +vt 0.252964 0.657895 +vt 0.252964 0.684211 +vt 0.249012 0.677632 +vt 0.274703 0.703644 +vt 0.270640 0.700842 +vt 0.278767 0.687315 +vt 0.405138 0.703796 +vt 0.399301 0.694079 +vt 0.405138 0.684363 +vt 0.424442 0.706472 +vt 0.418973 0.710243 +vt 0.413503 0.706472 +vt 0.413503 0.688264 +vt 0.424442 0.688264 +vt 0.409266 0.687209 +vt 0.410976 0.694079 +vt 0.409266 0.700950 +vt 0.401010 0.700950 +vt 0.401010 0.687209 +vt 0.268957 0.694079 +vt 0.270640 0.687315 +vt 0.274703 0.684514 +vt 0.280450 0.694079 +vt 0.278767 0.700842 +vt 0.229363 0.641447 +vt 0.231066 0.634604 +vt 0.235178 0.631769 +vt 0.240992 0.641447 +vt 0.235178 0.651126 +vt 0.249012 0.684211 +vt 0.268957 0.694079 +vt 0.270640 0.687315 +vt 0.274703 0.684514 +vt 0.280450 0.694079 +vt 0.278767 0.700842 +vt 0.409266 0.687209 +vt 0.410976 0.694079 +vt 0.409266 0.700950 +vt 0.401010 0.700950 +vt 0.401010 0.687209 +vt 0.387352 0.710526 +vt 0.395257 0.717105 +vt 0.387352 0.723684 +vt 0.292490 0.710526 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.387352 0.710526 +vt 0.395257 0.697368 +vt 0.395257 0.703947 +vt 0.292490 0.763158 +vt 0.284585 0.769737 +vt 0.284585 0.763158 +vt 0.387352 0.789474 +vt 0.395257 0.776316 +vt 0.395257 0.782895 +vt 0.292490 0.776316 +vt 0.284585 0.782895 +vt 0.284585 0.776316 +vt 0.395257 0.717105 +vt 0.387352 0.723684 +vt 0.387352 0.736842 +vt 0.395257 0.723684 +vt 0.395257 0.730263 +vt 0.292490 0.763158 +vt 0.284585 0.750000 +vt 0.292490 0.750000 +vt 0.292490 0.723684 +vt 0.284585 0.730263 +vt 0.284585 0.723684 +vt 0.387352 0.763158 +vt 0.395257 0.750000 +vt 0.395257 0.756579 +vt 0.395257 0.769737 +vt 0.387352 0.776316 +vt 0.292490 0.684211 +vt 0.284585 0.690789 +vt 0.284585 0.684211 +vt 0.284585 0.736842 +vt 0.292490 0.736842 +vt 0.387352 0.684211 +vt 0.395257 0.690789 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.284585 0.697368 +vt 0.292490 0.697368 +vt 0.395257 0.743421 +vt 0.387352 0.750000 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.395257 0.703947 +vt 0.292490 0.776316 +vt 0.284585 0.763158 +vt 0.387352 0.789474 +vt 0.395257 0.776316 +vt 0.395257 0.782895 +vt 0.292490 0.789474 +vt 0.284585 0.776316 +vt 0.387352 0.763158 +vt 0.292490 0.776316 +vt 0.292490 0.763158 +vt 0.387352 0.776316 +vt 0.292490 0.789474 +vt 0.387352 0.684211 +vt 0.292490 0.697368 +vt 0.292490 0.684211 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.387352 0.710526 +vt 0.292490 0.723684 +vt 0.395257 0.717105 +vt 0.399209 0.723684 +vt 0.395257 0.723684 +vt 0.387352 0.723684 +vt 0.292490 0.736842 +vt 0.284585 0.690789 +vt 0.280632 0.684211 +vt 0.284585 0.684211 +vt 0.387352 0.736842 +vt 0.292490 0.750000 +vt 0.387352 0.750000 +vt 0.284585 0.723684 +vt 0.280632 0.717105 +vt 0.284585 0.717105 +vt 0.284585 0.710526 +vt 0.280632 0.703947 +vt 0.284585 0.703947 +vt 0.284585 0.736842 +vt 0.280632 0.730263 +vt 0.284585 0.730263 +vt 0.280632 0.710526 +vt 0.280632 0.697368 +vt 0.284585 0.697368 +vt 0.280632 0.723684 +vt 0.280632 0.690789 +vt 0.395257 0.703947 +vt 0.399209 0.710526 +vt 0.395257 0.710526 +vt 0.395257 0.690789 +vt 0.399209 0.697368 +vt 0.395257 0.697368 +vt 0.395257 0.730263 +vt 0.399209 0.736842 +vt 0.395257 0.736842 +vt 0.399209 0.717105 +vt 0.399209 0.703947 +vt 0.395257 0.684211 +vt 0.399209 0.690789 +vt 0.399209 0.730263 +vt 0.411067 0.657895 +vt 0.418972 0.664474 +vt 0.411067 0.664474 +vt 0.411067 0.671053 +vt 0.403162 0.677632 +vt 0.403162 0.671053 +vt 0.276680 0.677632 +vt 0.276680 0.671053 +vt 0.403162 0.664474 +vt 0.276680 0.684211 +vt 0.411067 0.644737 +vt 0.418972 0.651316 +vt 0.411067 0.651316 +vt 0.403162 0.657895 +vt 0.403162 0.631579 +vt 0.276680 0.638158 +vt 0.276680 0.631579 +vt 0.418972 0.644737 +vt 0.411067 0.638158 +vt 0.418972 0.638158 +vt 0.403162 0.651316 +vt 0.403162 0.638158 +vt 0.276680 0.644737 +vt 0.411067 0.631579 +vt 0.418972 0.631579 +vt 0.403162 0.644737 +vt 0.276680 0.651316 +vt 0.418972 0.677632 +vt 0.411067 0.684211 +vt 0.411067 0.677632 +vt 0.276680 0.657895 +vt 0.403162 0.684211 +vt 0.276680 0.664474 +vt 0.418972 0.671053 +vt 0.268775 0.677632 +vt 0.434783 0.657895 +vt 0.418972 0.657895 +vt 0.434783 0.684211 +vt 0.418972 0.684211 +vt 0.434783 0.638158 +vt 0.434783 0.664474 +vt 0.434783 0.644737 +vt 0.434783 0.671053 +vt 0.434783 0.677632 +vt 0.434783 0.651316 +vt 0.434783 0.684211 +vt 0.426877 0.697368 +vt 0.426877 0.684211 +vt 0.434783 0.776316 +vt 0.426877 0.763158 +vt 0.434783 0.763158 +vt 0.434783 0.750000 +vt 0.426877 0.736842 +vt 0.434783 0.736842 +vt 0.434783 0.723684 +vt 0.426877 0.710526 +vt 0.434783 0.710526 +vt 0.434783 0.697368 +vt 0.426877 0.789474 +vt 0.426877 0.776316 +vt 0.426877 0.750000 +vt 0.426877 0.723684 +vt 0.268775 0.657895 +vt 0.252964 0.664474 +vt 0.252964 0.657895 +vt 0.268775 0.684211 +vt 0.268775 0.638158 +vt 0.268775 0.644737 +vt 0.268775 0.651316 +vt 0.268775 0.664474 +vt 0.268775 0.671053 +vt 0.252964 0.651316 +vt 0.252964 0.644737 +vt 0.268775 0.631579 +vt 0.252964 0.638158 +vt 0.252964 0.631579 +vt 0.252964 0.671053 +vt 0.252964 0.677632 +vt 0.249012 0.664474 +vt 0.241107 0.671053 +vt 0.241107 0.664474 +vt 0.249012 0.657895 +vt 0.241107 0.651316 +vt 0.249012 0.651316 +vt 0.249012 0.644737 +vt 0.241107 0.638158 +vt 0.249012 0.638158 +vt 0.249012 0.684211 +vt 0.241107 0.677632 +vt 0.249012 0.677632 +vt 0.241107 0.657895 +vt 0.241107 0.644737 +vt 0.249012 0.631579 +vt 0.241107 0.631579 +vt 0.249012 0.671053 +vt 0.387352 0.763158 +vt 0.292490 0.776316 +vt 0.292490 0.763158 +vt 0.387352 0.776316 +vt 0.292490 0.789474 +vt 0.387352 0.684211 +vt 0.292490 0.697368 +vt 0.292490 0.684211 +vt 0.387352 0.697368 +vt 0.292490 0.710526 +vt 0.387352 0.710526 +vt 0.292490 0.723684 +vt 0.395257 0.717105 +vt 0.399209 0.723684 +vt 0.395257 0.723684 +vt 0.387352 0.723684 +vt 0.292490 0.736842 +vt 0.284585 0.684211 +vt 0.280632 0.690789 +vt 0.280632 0.684211 +vt 0.387352 0.736842 +vt 0.292490 0.750000 +vt 0.387352 0.750000 +vt 0.284585 0.717105 +vt 0.280632 0.723684 +vt 0.280632 0.717105 +vt 0.284585 0.710526 +vt 0.280632 0.703947 +vt 0.284585 0.703947 +vt 0.284585 0.730263 +vt 0.280632 0.736842 +vt 0.280632 0.730263 +vt 0.280632 0.710526 +vt 0.280632 0.697368 +vt 0.284585 0.697368 +vt 0.284585 0.723684 +vt 0.284585 0.690789 +vt 0.395257 0.703947 +vt 0.399209 0.710526 +vt 0.395257 0.710526 +vt 0.395257 0.690789 +vt 0.399209 0.697368 +vt 0.395257 0.697368 +vt 0.395257 0.730263 +vt 0.399209 0.736842 +vt 0.395257 0.736842 +vt 0.399209 0.717105 +vt 0.399209 0.703947 +vt 0.395257 0.684211 +vt 0.399209 0.690789 +vt 0.399209 0.730263 +vt 0.387352 0.736842 +vt 0.395257 0.743421 +vt 0.387352 0.750000 +vt 0.284585 0.697368 +vt 0.292490 0.697368 +vt 0.387352 0.697368 +vt 0.395257 0.684211 +vt 0.395257 0.690789 +vt 0.292490 0.736842 +vt 0.284585 0.743421 +vt 0.284585 0.736842 +vt 0.284585 0.684211 +vt 0.292490 0.684211 +vt 0.387352 0.763158 +vt 0.395257 0.769737 +vt 0.387352 0.776316 +vt 0.395257 0.750000 +vt 0.395257 0.756579 +vt 0.284585 0.723684 +vt 0.292490 0.723684 +vt 0.284585 0.750000 +vt 0.292490 0.750000 +vt 0.395257 0.723684 +vt 0.395257 0.730263 +vt 0.395257 0.710526 +vt 0.292490 0.789474 +vt 0.395257 0.710526 +vt 0.284585 0.756579 +vt 0.395257 0.763158 +vt 0.284585 0.743421 +vt 0.395257 0.684211 +vt 0.284585 0.703947 +vt 0.395257 0.736842 +vt 0.395257 0.697368 +vt 0.284585 0.769737 +vt 0.284585 0.782895 +vt 0.387352 0.789474 +vt 0.280632 0.736842 +vt 0.399209 0.684211 +vt 0.434783 0.631579 +vt 0.434783 0.789474 +vt 0.252964 0.684211 +vt 0.241107 0.684211 +vt 0.387352 0.789474 +vt 0.284585 0.736842 +vt 0.399209 0.684211 +vt 0.395257 0.736842 +vt 0.284585 0.703947 +vt 0.387352 0.684211 +vt 0.284585 0.690789 +vt 0.395257 0.763158 +vt 0.284585 0.730263 +vt 0.284585 0.756579 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.8320 0.0000 0.5547 +vn 0.8320 0.3922 0.3922 +vn -0.8320 -0.5547 0.0000 +vn -0.8320 -0.3922 0.3922 +vn 0.8320 -0.5547 0.0000 +vn 0.8320 -0.3922 -0.3922 +vn -0.8320 0.5547 0.0000 +vn -0.8320 0.3922 -0.3922 +vn 0.8320 0.0000 -0.5547 +vn 0.8320 0.3922 -0.3922 +vn -0.8320 0.0000 -0.5547 +vn 0.8320 -0.3922 0.3922 +vn 0.8320 0.5547 0.0000 +vn -0.8320 0.3922 0.3922 +vn -0.8320 0.0000 0.5547 +vn -0.8320 -0.3922 -0.3922 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.7194 0.6794 0.1447 +vn 0.5293 0.6630 0.5293 +vn 0.0670 0.9955 0.0670 +vn -0.1363 0.7263 -0.6737 +vn 0.0196 0.9987 0.0473 +vn 0.1363 0.7263 -0.6737 +vn -0.0196 0.9987 0.0473 +vn 0.1447 0.6794 0.7194 +vn 0.2048 0.0000 -0.9788 +vn 0.0670 -0.9955 0.0670 +vn 0.7194 -0.6794 0.1447 +vn 0.5293 -0.6630 0.5293 +vn 0.1866 0.0000 0.9824 +vn -0.2048 0.0000 -0.9788 +vn 0.1363 -0.7263 -0.6737 +vn 0.0473 -0.9987 0.0196 +vn -0.4617 -0.7573 -0.4617 +vn -0.6737 -0.7263 -0.1363 +vn 0.1447 -0.6794 0.7194 +vn -0.1363 -0.7263 -0.6737 +vn -0.0196 -0.9987 0.0473 +vn -0.9788 0.0000 -0.2048 +vn 0.0196 -0.9987 0.0473 +vn -0.1447 -0.6794 0.7194 +vn -0.6737 0.7263 -0.1363 +vn -0.4617 0.7573 -0.4617 +vn -0.1866 0.0000 0.9824 +vn -0.1447 0.6794 0.7194 +vn 0.0473 0.9987 0.0196 +vn 0.3800 0.7263 -0.5727 +vn 0.9824 0.0000 0.1866 +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.5628 0.0000 0.8266 +vn -0.5000 0.7071 0.5000 +vn -0.7071 0.0000 0.7071 +vn 0.5472 0.0000 -0.8369 +vn 0.3800 -0.7263 -0.5727 +vn -0.4063 -0.6794 0.6110 +vn -0.4063 0.6794 0.6110 +vn -0.5000 -0.7071 0.5000 +vn 0.5000 -0.7071 -0.5000 +vn 0.7071 0.0000 -0.7071 +vn 0.5000 0.7071 -0.5000 +s off +f 1049/873/599 1051/874/599 1046/875/599 +f 971/876/600 969/877/600 967/878/600 +f 959/879/601 957/880/601 962/881/601 +f 1040/882/602 1042/883/602 1044/884/602 +f 1024/885/603 1033/886/603 1032/887/603 +f 1026/888/603 1035/889/603 1034/890/603 +f 1021/891/603 1036/892/603 1028/893/603 +f 1022/894/603 1029/895/603 1021/891/603 +f 1024/885/603 1031/896/603 1023/897/603 +f 1025/898/603 1034/890/603 1033/886/603 +f 1028/893/603 1035/889/603 1027/899/603 +f 1023/900/603 1030/901/603 1022/894/603 +f 1007/902/601 1005/903/601 1010/904/601 +f 1019/905/600 1017/906/600 1015/907/600 +f 1046/875/599 1045/908/599 1047/909/599 +f 1047/909/599 1048/910/599 1049/873/599 +f 1049/873/599 1050/911/599 1051/874/599 +f 1051/874/599 1052/912/599 1046/875/599 +f 1046/875/599 1047/909/599 1049/873/599 +f 967/878/600 965/913/600 966/914/600 +f 966/914/600 972/915/600 971/876/600 +f 971/876/600 970/916/600 969/877/600 +f 969/877/600 968/917/600 967/878/600 +f 967/878/600 966/914/600 971/876/600 +f 957/880/601 958/918/601 964/919/601 +f 964/919/601 963/920/601 957/880/601 +f 963/920/601 962/881/601 957/880/601 +f 962/881/601 961/921/601 960/922/601 +f 960/922/601 959/879/601 962/881/601 +f 1044/884/602 1037/923/602 1038/924/602 +f 1038/924/602 1039/925/602 1044/884/602 +f 1039/925/602 1040/882/602 1044/884/602 +f 1040/882/602 1041/926/602 1042/883/602 +f 1042/883/602 1043/927/602 1044/884/602 +f 1024/885/603 1025/898/603 1033/886/603 +f 1026/888/603 1027/899/603 1035/889/603 +f 1021/891/603 1029/895/603 1036/892/603 +f 1022/894/603 1030/901/603 1029/895/603 +f 1024/885/603 1032/887/603 1031/896/603 +f 1025/898/603 1026/888/603 1034/890/603 +f 1028/893/603 1036/892/603 1035/889/603 +f 1023/900/603 1031/928/603 1030/901/603 +f 1005/903/601 1006/929/601 1012/930/601 +f 1012/930/601 1011/931/601 1005/903/601 +f 1011/931/601 1010/904/601 1005/903/601 +f 1010/904/601 1009/932/601 1008/933/601 +f 1008/933/601 1007/902/601 1010/904/601 +f 1015/907/600 1013/934/600 1014/935/600 +f 1014/935/600 1020/936/600 1019/905/600 +f 1019/905/600 1018/937/600 1017/906/600 +f 1017/906/600 1016/938/600 1015/907/600 +f 1015/907/600 1014/935/600 1019/905/600 +s 1 +f 936/939/604 954/940/605 938/941/605 +f 983/942/606 994/943/607 993/944/606 +f 984/945/608 1000/946/609 1001/947/608 +f 975/948/610 973/949/611 974/950/610 +f 980/951/612 997/952/613 999/953/612 +f 977/954/611 991/955/614 973/956/611 +f 984/945/608 1002/957/615 986/958/615 +f 940/959/616 954/960/605 955/961/616 +f 927/962/614 948/963/611 941/964/611 +f 937/965/617 947/966/610 946/967/617 +f 928/968/612 956/969/613 950/970/612 +f 928/968/612 949/971/609 930/972/609 +f 931/973/606 944/974/607 943/975/606 +f 941/964/611 947/976/610 939/977/610 +f 932/978/608 952/979/615 934/980/615 +f 935/981/618 944/982/607 933/983/607 +f 940/959/616 956/984/613 942/985/613 +f 935/981/618 946/986/617 945/987/618 +f 934/980/615 953/988/604 936/939/604 +f 929/989/619 926/990/614 927/962/614 +f 932/991/608 949/992/609 951/993/608 +f 931/994/606 925/995/619 929/989/619 +f 744/996/620 745/997/621 743/998/620 +f 746/999/621 747/1000/622 745/997/621 +f 748/1001/622 749/1002/623 747/1003/622 +f 750/1004/623 751/1005/599 749/1002/623 +f 752/1006/599 753/1007/624 751/1005/599 +f 772/1008/625 782/1009/620 766/1010/620 +f 754/1011/624 755/1012/626 753/1007/624 +f 760/1013/623 779/1014/622 759/1015/622 +f 756/1016/626 757/1017/625 755/1012/626 +f 758/1018/625 743/998/620 757/1017/625 +f 742/1019/620 773/1020/625 764/1021/625 +f 763/1022/626 776/1023/624 762/1024/624 +f 759/1025/622 780/1026/621 741/1027/621 +f 764/1021/625 775/1028/626 763/1022/626 +f 762/1024/624 777/1029/599 761/1030/599 +f 741/1027/621 774/1031/620 742/1019/620 +f 761/1030/599 778/1032/623 760/1013/623 +f 770/1033/624 787/1034/626 771/1035/626 +f 768/1036/623 785/1037/599 769/1038/599 +f 765/1039/621 783/1040/622 767/1041/622 +f 771/1035/626 788/1042/625 772/1008/625 +f 769/1038/599 786/1043/624 770/1033/624 +f 767/1044/622 784/1045/623 768/1036/623 +f 766/1010/620 781/1046/621 765/1039/621 +f 811/1047/603 820/1048/627 812/1049/628 +f 790/1050/629 794/1051/630 792/1052/631 +f 792/1052/631 793/1053/632 791/1054/633 +f 820/1048/627 790/1050/629 812/1049/628 +f 790/1050/629 806/1055/634 812/1049/628 +f 794/1051/630 795/1056/635 793/1053/632 +f 809/1057/636 818/1058/637 810/1059/638 +f 812/1049/628 804/1060/639 811/1047/603 +f 796/1061/640 797/1062/641 795/1063/635 +f 817/1064/642 808/1065/643 816/1066/644 +f 811/1047/603 802/1067/645 810/1059/638 +f 798/1068/646 799/1069/647 797/1062/641 +f 816/1066/644 807/1070/602 815/1071/648 +f 809/1057/636 802/1067/645 800/1072/649 +f 800/1072/649 801/1073/650 799/1069/647 +f 813/1074/651 807/1075/602 789/1076/652 +f 807/1070/602 798/1068/646 796/1061/640 +f 802/1067/645 803/1077/653 801/1073/650 +f 808/1065/643 800/1072/649 798/1068/646 +f 789/1076/652 796/1078/640 794/1051/630 +f 804/1060/639 805/1079/654 803/1077/653 +f 818/1058/637 811/1047/603 810/1059/638 +f 813/1074/651 790/1050/629 814/1080/655 +f 806/1055/634 791/1054/633 805/1079/654 +f 846/1081/656 791/1054/633 793/1053/632 +f 818/1058/637 827/1082/600 819/1083/657 +f 813/1074/651 823/1084/601 815/1085/648 +f 815/1071/648 824/1086/658 816/1066/644 +f 819/1083/657 828/1087/659 820/1048/627 +f 816/1066/644 825/1088/622 817/1064/642 +f 820/1048/627 822/1089/626 814/1080/655 +f 814/1080/655 821/1090/660 813/1074/651 +f 817/1064/642 826/1091/661 818/1058/637 +f 835/1092/600 844/1093/659 843/1094/600 +f 834/1095/661 841/1096/622 833/1097/622 +f 832/1098/658 839/1099/601 831/1100/601 +f 829/1101/660 838/1102/626 830/1103/626 +f 830/1103/626 844/1093/659 836/1104/659 +f 834/1095/661 843/1105/600 842/1106/661 +f 833/1097/622 840/1107/658 832/1098/658 +f 831/1100/601 837/1108/660 829/1101/660 +f 851/1109/662 860/1110/663 859/1111/664 +f 847/1112/665 793/1053/632 795/1056/635 +f 848/1113/666 795/1063/635 797/1062/641 +f 849/1114/647 797/1062/641 799/1069/647 +f 850/1115/667 799/1069/647 801/1073/650 +f 851/1109/662 801/1073/650 803/1077/653 +f 852/1116/668 803/1077/653 805/1079/654 +f 845/1117/633 805/1079/654 791/1054/633 +f 849/1114/647 858/1118/669 857/1119/622 +f 847/1120/665 856/1121/670 855/1122/671 +f 846/1081/656 853/1123/626 845/1117/633 +f 852/1116/668 853/1123/626 860/1110/663 +f 850/1115/667 859/1111/664 858/1118/669 +f 848/1113/666 857/1119/622 856/1121/670 +f 847/1112/665 854/1124/672 846/1081/656 +f 868/1125/663 869/1126/626 876/1127/663 +f 867/1128/664 874/1129/669 866/1130/669 +f 865/1131/622 872/1132/670 864/1133/670 +f 863/1134/671 870/1135/672 862/1136/672 +f 867/1128/664 876/1127/663 875/1137/664 +f 866/1130/669 873/1138/622 865/1131/622 +f 863/1139/671 872/1132/670 871/1140/671 +f 862/1136/672 869/1126/626 861/1141/626 +f 880/1142/626 881/1143/625 879/1144/626 +f 882/1145/625 883/1146/620 881/1143/625 +f 884/1147/620 885/1148/621 883/1149/620 +f 886/1150/621 887/1151/622 885/1148/621 +f 888/1152/622 889/1153/623 887/1151/622 +f 908/1154/624 918/1155/626 902/1156/626 +f 890/1157/623 891/1158/599 889/1153/623 +f 895/1159/620 914/1160/621 915/1161/620 +f 892/1162/599 893/1163/624 891/1158/599 +f 894/1164/624 879/1144/626 893/1163/624 +f 900/1165/624 910/1166/626 909/1167/624 +f 899/1168/599 912/1169/623 898/1170/623 +f 877/1171/625 915/1172/620 916/1173/625 +f 900/1165/624 911/1174/599 899/1168/599 +f 898/1170/623 913/1175/622 897/1176/622 +f 878/1177/626 916/1173/625 910/1166/626 +f 897/1176/622 914/1160/621 896/1178/621 +f 906/1179/623 923/1180/599 907/1181/599 +f 904/1182/621 921/1183/622 905/1184/622 +f 901/1185/625 919/1186/620 903/1187/620 +f 908/1154/624 923/1180/599 924/1188/624 +f 906/1179/623 921/1183/622 922/1189/623 +f 903/1190/620 920/1191/621 904/1182/621 +f 901/1185/625 918/1155/626 917/1192/625 +f 988/1193/604 1004/1194/605 990/1195/605 +f 983/942/606 992/1196/619 981/1197/619 +f 982/1198/609 999/1199/612 1000/1200/609 +f 987/1201/618 996/1202/617 995/1203/618 +f 981/1197/619 991/1204/614 979/1205/614 +f 976/1206/616 997/1207/613 978/1208/613 +f 976/1206/616 1004/1209/605 998/1210/616 +f 987/1201/618 994/1211/607 985/1212/607 +f 975/948/610 996/1213/617 989/1214/617 +f 988/1193/604 1002/1215/615 1003/1216/604 +f 936/939/604 953/1217/604 954/940/605 +f 983/942/606 985/1212/607 994/943/607 +f 984/945/608 982/1198/609 1000/946/609 +f 975/948/610 977/954/611 973/949/611 +f 980/951/612 978/1208/613 997/952/613 +f 977/954/611 979/1218/614 991/955/614 +f 984/945/608 1001/1219/608 1002/957/615 +f 940/959/616 938/941/605 954/960/605 +f 927/962/614 926/1220/614 948/963/611 +f 937/965/617 939/977/610 947/966/610 +f 928/968/612 942/985/613 956/969/613 +f 928/968/612 950/1221/612 949/971/609 +f 931/973/606 933/983/607 944/974/607 +f 941/964/611 948/1222/611 947/976/610 +f 932/978/608 951/1223/608 952/979/615 +f 935/981/618 945/1224/618 944/982/607 +f 940/959/616 955/1225/616 956/984/613 +f 935/981/618 937/965/617 946/986/617 +f 934/980/615 952/1226/615 953/988/604 +f 929/989/619 925/1227/619 926/990/614 +f 932/991/608 930/972/609 949/992/609 +f 931/994/606 943/1228/606 925/995/619 +f 744/996/620 746/999/621 745/997/621 +f 746/999/621 748/1229/622 747/1000/622 +f 748/1001/622 750/1004/623 749/1002/623 +f 750/1004/623 752/1006/599 751/1005/599 +f 752/1006/599 754/1011/624 753/1007/624 +f 772/1008/625 788/1042/625 782/1009/620 +f 754/1011/624 756/1016/626 755/1012/626 +f 760/1013/623 778/1032/623 779/1014/622 +f 756/1016/626 758/1018/625 757/1017/625 +f 758/1018/625 744/996/620 743/998/620 +f 742/1019/620 774/1031/620 773/1020/625 +f 763/1022/626 775/1028/626 776/1023/624 +f 759/1025/622 779/1230/622 780/1026/621 +f 764/1021/625 773/1020/625 775/1028/626 +f 762/1024/624 776/1023/624 777/1029/599 +f 741/1027/621 780/1026/621 774/1031/620 +f 761/1030/599 777/1029/599 778/1032/623 +f 770/1033/624 786/1043/624 787/1034/626 +f 768/1036/623 784/1045/623 785/1037/599 +f 765/1039/621 781/1046/621 783/1040/622 +f 771/1035/626 787/1034/626 788/1042/625 +f 769/1038/599 785/1037/599 786/1043/624 +f 767/1044/622 783/1231/622 784/1045/623 +f 766/1010/620 782/1009/620 781/1046/621 +f 811/1047/603 819/1083/657 820/1048/627 +f 790/1050/629 789/1076/652 794/1051/630 +f 792/1052/631 794/1051/630 793/1053/632 +f 820/1048/627 814/1080/655 790/1050/629 +f 790/1050/629 792/1052/631 806/1055/634 +f 794/1051/630 796/1078/640 795/1056/635 +f 809/1057/636 817/1064/642 818/1058/637 +f 812/1049/628 806/1055/634 804/1060/639 +f 796/1061/640 798/1068/646 797/1062/641 +f 817/1064/642 809/1057/636 808/1065/643 +f 811/1047/603 804/1060/639 802/1067/645 +f 798/1068/646 800/1072/649 799/1069/647 +f 816/1066/644 808/1065/643 807/1070/602 +f 809/1057/636 810/1059/638 802/1067/645 +f 800/1072/649 802/1067/645 801/1073/650 +f 813/1074/651 815/1085/648 807/1075/602 +f 807/1070/602 808/1065/643 798/1068/646 +f 802/1067/645 804/1060/639 803/1077/653 +f 808/1065/643 809/1057/636 800/1072/649 +f 789/1076/652 807/1075/602 796/1078/640 +f 804/1060/639 806/1055/634 805/1079/654 +f 818/1058/637 819/1083/657 811/1047/603 +f 813/1074/651 789/1076/652 790/1050/629 +f 806/1055/634 792/1052/631 791/1054/633 +f 846/1081/656 845/1117/633 791/1054/633 +f 818/1058/637 826/1091/661 827/1082/600 +f 813/1074/651 821/1090/660 823/1084/601 +f 815/1071/648 823/1232/601 824/1086/658 +f 819/1083/657 827/1082/600 828/1087/659 +f 816/1066/644 824/1086/658 825/1088/622 +f 820/1048/627 828/1087/659 822/1089/626 +f 814/1080/655 822/1089/626 821/1090/660 +f 817/1064/642 825/1088/622 826/1091/661 +f 835/1092/600 836/1104/659 844/1093/659 +f 834/1095/661 842/1106/661 841/1096/622 +f 832/1098/658 840/1107/658 839/1099/601 +f 829/1101/660 837/1108/660 838/1102/626 +f 830/1103/626 838/1102/626 844/1093/659 +f 834/1095/661 835/1233/600 843/1105/600 +f 833/1097/622 841/1096/622 840/1107/658 +f 831/1100/601 839/1099/601 837/1108/660 +f 851/1109/662 852/1116/668 860/1110/663 +f 847/1112/665 846/1081/656 793/1053/632 +f 848/1113/666 847/1120/665 795/1063/635 +f 849/1114/647 848/1113/666 797/1062/641 +f 850/1115/667 849/1114/647 799/1069/647 +f 851/1109/662 850/1115/667 801/1073/650 +f 852/1116/668 851/1109/662 803/1077/653 +f 845/1117/633 852/1116/668 805/1079/654 +f 849/1114/647 850/1115/667 858/1118/669 +f 847/1120/665 848/1113/666 856/1121/670 +f 846/1081/656 854/1124/672 853/1123/626 +f 852/1116/668 845/1117/633 853/1123/626 +f 850/1115/667 851/1109/662 859/1111/664 +f 848/1113/666 849/1114/647 857/1119/622 +f 847/1112/665 855/1234/671 854/1124/672 +f 868/1125/663 861/1141/626 869/1126/626 +f 867/1128/664 875/1137/664 874/1129/669 +f 865/1131/622 873/1138/622 872/1132/670 +f 863/1134/671 871/1235/671 870/1135/672 +f 867/1128/664 868/1125/663 876/1127/663 +f 866/1130/669 874/1129/669 873/1138/622 +f 863/1139/671 864/1133/670 872/1132/670 +f 862/1136/672 870/1135/672 869/1126/626 +f 880/1142/626 882/1145/625 881/1143/625 +f 882/1145/625 884/1236/620 883/1146/620 +f 884/1147/620 886/1150/621 885/1148/621 +f 886/1150/621 888/1152/622 887/1151/622 +f 888/1152/622 890/1157/623 889/1153/623 +f 908/1154/624 924/1188/624 918/1155/626 +f 890/1157/623 892/1162/599 891/1158/599 +f 895/1159/620 896/1178/621 914/1160/621 +f 892/1162/599 894/1164/624 893/1163/624 +f 894/1164/624 880/1142/626 879/1144/626 +f 900/1165/624 878/1177/626 910/1166/626 +f 899/1168/599 911/1174/599 912/1169/623 +f 877/1171/625 895/1237/620 915/1172/620 +f 900/1165/624 909/1167/624 911/1174/599 +f 898/1170/623 912/1169/623 913/1175/622 +f 878/1177/626 877/1171/625 916/1173/625 +f 897/1176/622 913/1175/622 914/1160/621 +f 906/1179/623 922/1189/623 923/1180/599 +f 904/1182/621 920/1191/621 921/1183/622 +f 901/1185/625 917/1192/625 919/1186/620 +f 908/1154/624 907/1181/599 923/1180/599 +f 906/1179/623 905/1184/622 921/1183/622 +f 903/1190/620 919/1238/620 920/1191/621 +f 901/1185/625 902/1156/626 918/1155/626 +f 988/1193/604 1003/1239/604 1004/1194/605 +f 983/942/606 993/1240/606 992/1196/619 +f 982/1198/609 980/1241/612 999/1199/612 +f 987/1201/618 989/1214/617 996/1202/617 +f 981/1197/619 992/1242/619 991/1204/614 +f 976/1206/616 998/1243/616 997/1207/613 +f 976/1206/616 990/1195/605 1004/1209/605 +f 987/1201/618 995/1244/618 994/1211/607 +f 975/948/610 974/1245/610 996/1213/617 +f 988/1193/604 986/958/615 1002/1215/615 +o Gun +v -0.500000 0.000000 -1.000000 +v 4.000000 0.000000 -1.000000 +v -0.500000 -0.382683 -0.923879 +v 4.000000 -0.382683 -0.923879 +v -0.500000 -0.707107 -0.707107 +v 4.000000 -0.707107 -0.707107 +v -0.500000 -0.923879 -0.382683 +v 4.000000 -0.923879 -0.382683 +v -0.500000 -1.000000 0.000000 +v 4.000000 -1.000000 0.000000 +v -0.500000 -0.923879 0.382683 +v 4.000000 -0.923879 0.382683 +v -0.500000 -0.707107 0.707107 +v 4.000000 -0.707107 0.707107 +v -0.500000 -0.382683 0.923879 +v 4.000000 -0.382683 0.923879 +v -0.500000 0.000000 1.000000 +v 4.000000 -0.000000 1.000000 +v -0.500000 0.382683 0.923880 +v 4.000000 0.382683 0.923880 +v -0.500000 0.707107 0.707107 +v 4.000000 0.707107 0.707107 +v -0.500000 0.923880 0.382684 +v 4.000000 0.923880 0.382684 +v -0.500000 1.000000 -0.000000 +v 4.000000 1.000000 -0.000000 +v -0.500000 0.923880 -0.382684 +v 4.000000 0.923880 -0.382684 +v -0.500000 0.707107 -0.707107 +v 4.000000 0.707107 -0.707107 +v -0.500000 0.382683 -0.923880 +v 4.000000 0.382683 -0.923880 +v 4.125000 -0.334848 -0.808394 +v 4.125000 0.000000 -0.875000 +v 4.125000 -0.618718 -0.618718 +v 4.125000 -0.808394 -0.334848 +v 4.125000 -0.875000 0.000000 +v 4.125000 -0.808394 0.334848 +v 4.125000 -0.618718 0.618718 +v 4.125000 -0.334848 0.808394 +v 4.125000 -0.000000 0.875000 +v 4.125000 0.334848 0.808395 +v 4.125000 0.618718 0.618719 +v 4.125000 0.808395 0.334848 +v 4.125000 0.875000 -0.000000 +v 4.125000 0.808395 -0.334848 +v 4.125000 0.618718 -0.618719 +v 4.125000 0.334848 -0.808395 +v 4.250000 -0.191342 -0.461940 +v 4.250000 0.000000 -0.500000 +v 4.250000 -0.353553 -0.353553 +v 4.250000 -0.461940 -0.191342 +v 4.250000 -0.500000 0.000000 +v 4.250000 -0.461940 0.191342 +v 4.250000 -0.353553 0.353553 +v 4.250000 -0.191342 0.461940 +v 4.250000 -0.000000 0.500000 +v 4.250000 0.191342 0.461940 +v 4.250000 0.353553 0.353553 +v 4.250000 0.461940 0.191342 +v 4.250000 0.500000 -0.000000 +v 4.250000 0.461940 -0.191342 +v 4.250000 0.353553 -0.353554 +v 4.250000 0.191342 -0.461940 +v 3.687500 0.324759 1.125000 +v 3.824760 0.187500 1.125000 +v 3.875000 -0.000000 1.125000 +v 3.824759 -0.187500 1.125000 +v 3.687500 -0.324760 1.125000 +v 3.500000 -0.375000 1.125000 +v 3.312500 -0.324760 1.125000 +v 3.175241 -0.187500 1.125000 +v 3.125000 -0.000000 1.125000 +v 3.175241 0.187500 1.125000 +v 3.312500 0.324759 1.125000 +v 3.500000 0.375000 1.125000 +v 3.625000 0.216506 1.125000 +v 3.716506 0.125000 1.125000 +v 3.750000 -0.000000 1.125000 +v 3.716506 -0.125000 1.125000 +v 3.625000 -0.216506 1.125000 +v 3.500000 -0.250000 1.125000 +v 3.375000 -0.216506 1.125000 +v 3.283494 -0.125000 1.125000 +v 3.250000 -0.000000 1.125000 +v 3.283494 0.125000 1.125000 +v 3.375000 0.216506 1.125000 +v 3.500000 0.250000 1.125000 +v 4.742188 -0.088388 -0.088388 +v 4.742188 -0.125000 -0.000000 +v 4.742188 -0.088388 0.088388 +v 4.742188 -0.000000 0.125000 +v 4.742188 0.088388 0.088388 +v 4.742188 0.125000 -0.000000 +v 4.742188 0.088388 -0.088388 +v 4.742188 -0.000000 -0.125000 +v 4.492188 -0.000000 -0.125000 +v 4.492188 0.088388 -0.088388 +v 4.492188 0.125000 -0.000000 +v 4.492188 0.088388 0.088388 +v 4.492188 -0.000000 0.125000 +v 4.492188 -0.088388 0.088388 +v 4.492188 -0.125000 -0.000000 +v 4.492188 -0.088388 -0.088388 +v 4.742188 -0.000000 -0.125000 +v 4.742188 0.088388 -0.088388 +v 4.742188 0.125000 -0.000000 +v 4.742188 0.088388 0.088388 +v 4.742188 -0.000000 0.125000 +v 4.742188 -0.088388 0.088388 +v 4.742188 -0.125000 -0.000000 +v 4.742188 -0.088388 -0.088388 +v 4.554688 -0.000000 0.265165 +v 4.554688 -0.265165 -0.000000 +v 4.554688 0.265165 0.000000 +v 4.554688 -0.000000 -0.265165 +v 4.679688 0.265165 0.000000 +v 4.679688 -0.000000 0.265165 +v 4.679688 -0.265165 -0.000000 +v 4.679688 -0.000000 -0.265165 +v 5.054688 -0.265165 -0.000000 +v 5.054688 -0.000000 -0.265165 +v 5.054688 -0.883883 -0.618718 +v 5.054688 -0.618718 -0.883883 +v 4.929688 -0.883883 -0.618718 +v 4.929688 -0.618718 -0.883883 +v 4.929688 -0.353553 -0.088388 +v 4.929688 -0.088388 -0.353553 +v 4.679688 -0.353553 -0.088388 +v 4.679688 -0.088388 -0.353553 +v 5.054688 -0.928078 -0.751301 +v 5.054688 -0.751301 -0.928078 +v 4.929688 -0.928078 -0.751301 +v 4.929688 -0.751301 -0.928078 +v -1.000000 0.382683 -0.923880 +v -1.000000 0.707107 -0.707107 +v -1.000000 0.923880 -0.382684 +v -1.000000 1.000000 -0.000000 +v -1.000000 0.923880 0.382684 +v -1.000000 0.707107 0.707107 +v -1.000000 0.382683 0.923880 +v -1.000000 0.000000 1.000000 +v -1.000000 -0.382683 0.923879 +v -1.000000 -0.707107 0.707107 +v -1.000000 -0.923879 0.382683 +v -1.000000 -1.000000 0.000000 +v -1.000000 -0.923879 -0.382683 +v -1.000000 -0.707107 -0.707107 +v -1.000000 -0.382683 -0.923879 +v -1.000000 0.000000 -1.000000 +v -4.000000 0.143506 -0.346455 +v -4.000000 0.265165 -0.265165 +v -4.000000 0.346455 -0.143506 +v -4.000000 0.375000 -0.000000 +v -4.000000 0.346455 0.143506 +v -4.000000 0.265165 0.265165 +v -4.000000 0.143506 0.346455 +v -4.000000 0.000000 0.375000 +v -4.000000 -0.143506 0.346455 +v -4.000000 -0.265165 0.265165 +v -4.000000 -0.346455 0.143506 +v -4.000000 -0.375000 0.000000 +v -4.000000 -0.346455 -0.143506 +v -4.000000 -0.265165 -0.265165 +v -4.000000 -0.143506 -0.346455 +v -4.000000 0.000000 -0.375000 +v -1.500000 0.000000 -1.000000 +v -1.500000 -0.382683 -0.923879 +v -1.500000 -0.707107 -0.707107 +v -1.500000 -0.923879 -0.382683 +v -1.500000 -1.000000 0.000000 +v -1.500000 -0.923879 0.382683 +v -1.500000 -0.707107 0.707107 +v -1.500000 -0.382683 0.923879 +v -1.500000 0.000000 1.000000 +v -1.500000 0.382683 0.923880 +v -1.500000 0.707107 0.707107 +v -1.500000 0.923880 0.382684 +v -1.500000 1.000000 -0.000000 +v -1.500000 0.923880 -0.382684 +v -1.500000 0.707107 -0.707107 +v -1.500000 0.382683 -0.923880 +v -4.000000 0.000000 -0.375000 +v -4.000000 -0.143506 -0.346455 +v -4.000000 -0.265165 -0.265165 +v -4.000000 -0.346455 -0.143506 +v -4.000000 -0.375000 0.000000 +v -4.000000 -0.346455 0.143506 +v -4.000000 -0.265165 0.265165 +v -4.000000 -0.143506 0.346455 +v -4.000000 0.000000 0.375000 +v -4.000000 0.143506 0.346455 +v -4.000000 0.265165 0.265165 +v -4.000000 0.346455 0.143506 +v -4.000000 0.375000 -0.000000 +v -4.000000 0.346455 -0.143506 +v -4.000000 0.265165 -0.265165 +v -4.000000 0.143506 -0.346455 +v -4.000000 0.000000 -0.500000 +v -4.000000 -0.191342 -0.461940 +v -4.000000 -0.353553 -0.353553 +v -4.000000 -0.461940 -0.191342 +v -4.000000 -0.500000 0.000000 +v -4.000000 -0.461940 0.191342 +v -4.000000 -0.353553 0.353553 +v -4.000000 -0.191342 0.461940 +v -4.000000 0.000000 0.500000 +v -4.000000 0.191342 0.461940 +v -4.000000 0.353553 0.353553 +v -4.000000 0.461940 0.191342 +v -4.000000 0.500000 -0.000000 +v -4.000000 0.461940 -0.191342 +v -4.000000 0.353553 -0.353553 +v -4.000000 0.191342 -0.461940 +v -1.000000 -0.250000 1.031250 +v -1.000000 0.250000 1.031250 +v -1.500000 -0.250000 1.031250 +v -1.500000 0.250000 1.031250 +v -4.000000 -0.250000 0.406250 +v -4.000000 0.250000 0.406250 +v -1.000000 -1.031250 -0.250000 +v -1.000000 -1.031250 0.250000 +v -1.500000 -1.031250 -0.250000 +v -1.500000 -1.031250 0.250000 +v -4.000000 -0.406250 -0.250000 +v -4.000000 -0.406250 0.250000 +v -1.000000 0.250000 -1.031250 +v -1.000000 -0.250000 -1.031250 +v -1.500000 0.250000 -1.031250 +v -1.500000 -0.250000 -1.031250 +v -4.000000 0.250000 -0.406250 +v -4.000000 -0.250000 -0.406250 +v -1.000000 1.031250 0.250000 +v -1.000000 1.031250 -0.250000 +v -1.500000 1.031250 0.250000 +v -1.500000 1.031250 -0.250000 +v -4.000000 0.406250 0.250000 +v -4.000000 0.406250 -0.250000 +v -4.500000 0.000000 -0.500000 +v -4.500000 -0.191342 -0.461940 +v -4.500000 -0.353553 -0.353553 +v -4.500000 -0.461940 -0.191342 +v -4.500000 -0.500000 0.000000 +v -4.500000 -0.461940 0.191342 +v -4.500000 -0.353553 0.353553 +v -4.500000 -0.191342 0.461940 +v -4.500000 0.000000 0.500000 +v -4.500000 0.191342 0.461940 +v -4.500000 0.353553 0.353553 +v -4.500000 0.461940 0.191342 +v -4.500000 0.500000 -0.000000 +v -4.500000 0.461940 -0.191342 +v -4.500000 0.353553 -0.353553 +v -4.500000 0.191342 -0.461940 +v -4.500000 0.000000 -0.375000 +v -4.500000 -0.143506 -0.346455 +v -4.500000 -0.265165 -0.265165 +v -4.500000 -0.346455 -0.143506 +v -4.500000 -0.375000 0.000000 +v -4.500000 -0.346455 0.143506 +v -4.500000 -0.265165 0.265165 +v -4.500000 -0.143506 0.346455 +v -4.500000 0.000000 0.375000 +v -4.500000 0.143506 0.346455 +v -4.500000 0.265165 0.265165 +v -4.500000 0.346455 0.143506 +v -4.500000 0.375000 -0.000000 +v -4.500000 0.346455 -0.143506 +v -4.500000 0.265165 -0.265165 +v -4.500000 0.143506 -0.346455 +v -5.500000 0.000000 -0.375000 +v -5.500000 -0.143506 -0.346455 +v -5.500000 -0.265165 -0.265165 +v -5.500000 -0.346455 -0.143506 +v -5.500000 -0.375000 0.000000 +v -5.500000 -0.346455 0.143506 +v -5.500000 -0.265165 0.265165 +v -5.500000 -0.143506 0.346455 +v -5.500000 0.000000 0.375000 +v -5.500000 0.143506 0.346455 +v -5.500000 0.265165 0.265165 +v -5.500000 0.346455 0.143506 +v -5.500000 0.375000 -0.000000 +v -5.500000 0.346455 -0.143506 +v -5.500000 0.265165 -0.265165 +v -5.500000 0.143506 -0.346455 +v -5.750000 0.000000 -0.500000 +v -5.750000 -0.191342 -0.461940 +v -5.750000 -0.353553 -0.353553 +v -5.750000 -0.461940 -0.191342 +v -5.750000 -0.500000 0.000000 +v -5.750000 -0.461940 0.191342 +v -5.750000 -0.353553 0.353553 +v -5.750000 -0.191342 0.461940 +v -5.750000 0.000000 0.500000 +v -5.750000 0.191342 0.461940 +v -5.750000 0.353553 0.353553 +v -5.750000 0.461940 0.191342 +v -5.750000 0.500000 -0.000000 +v -5.750000 0.461940 -0.191342 +v -5.750000 0.353553 -0.353553 +v -5.750000 0.191342 -0.461940 +v -6.250000 0.000000 -0.500000 +v -6.250000 -0.191342 -0.461940 +v -6.250000 -0.353553 -0.353553 +v -6.250000 -0.461940 -0.191342 +v -6.250000 -0.500000 0.000000 +v -6.250000 -0.461940 0.191342 +v -6.250000 -0.353553 0.353553 +v -6.250000 -0.191342 0.461940 +v -6.250000 0.000000 0.500000 +v -6.250000 0.191342 0.461940 +v -6.250000 0.353553 0.353553 +v -6.250000 0.461940 0.191342 +v -6.250000 0.500000 -0.000000 +v -6.250000 0.461940 -0.191342 +v -6.250000 0.353553 -0.353553 +v -6.250000 0.191342 -0.461940 +v -6.250000 0.000000 -0.375000 +v -6.250000 -0.143506 -0.346455 +v -6.250000 -0.265165 -0.265165 +v -6.250000 -0.346455 -0.143506 +v -6.250000 -0.375000 0.000000 +v -6.250000 -0.346455 0.143506 +v -6.250000 -0.265165 0.265165 +v -6.250000 -0.143506 0.346455 +v -6.250000 0.000000 0.375000 +v -6.250000 0.143506 0.346455 +v -6.250000 0.265165 0.265165 +v -6.250000 0.346455 0.143506 +v -6.250000 0.375000 -0.000000 +v -6.250000 0.346455 -0.143506 +v -6.250000 0.265165 -0.265165 +v -6.250000 0.143506 -0.346455 +v -5.750000 0.000000 -0.375000 +v -5.750000 -0.143506 -0.346455 +v -5.750000 -0.265165 -0.265165 +v -5.750000 -0.346455 -0.143506 +v -5.750000 -0.375000 0.000000 +v -5.750000 -0.346455 0.143507 +v -5.750000 -0.265165 0.265165 +v -5.750000 -0.143506 0.346455 +v -5.750000 0.000000 0.375000 +v -5.750000 0.143506 0.346455 +v -5.750000 0.265165 0.265165 +v -5.750000 0.346455 0.143507 +v -5.750000 0.375000 0.000000 +v -5.750000 0.346455 -0.143506 +v -5.750000 0.265165 -0.265165 +v -5.750000 0.143506 -0.346455 +v 0.000000 0.375000 1.125000 +v -0.187500 0.324760 1.125000 +v -0.324759 0.187500 1.125000 +v -0.375000 0.000000 1.125000 +v -0.324759 -0.187500 1.125000 +v -0.187500 -0.324759 1.125000 +v 0.000000 -0.375000 1.125000 +v 0.187500 -0.324760 1.125000 +v 0.324760 -0.187500 1.125000 +v 0.375000 -0.000000 1.125000 +v 0.324760 0.187500 1.125000 +v 0.187500 0.324759 1.125000 +v 0.000000 0.375000 1.375000 +v -0.187500 0.324760 1.375000 +v -0.324759 0.187500 1.375000 +v -0.375000 0.000000 1.375000 +v -0.324759 -0.187500 1.375000 +v -0.187500 -0.324759 1.375000 +v 0.000000 -0.375000 1.375000 +v 0.187500 -0.324760 1.375000 +v 0.324760 -0.187500 1.375000 +v 0.375000 -0.000000 1.375000 +v 0.324760 0.187500 1.375000 +v 0.187500 0.324759 1.375000 +v 0.000000 0.500000 1.125000 +v -0.250000 0.433013 1.125000 +v -0.433012 0.250000 1.125000 +v -0.500000 0.000000 1.125000 +v -0.433012 -0.250000 1.125000 +v -0.250000 -0.433013 1.125000 +v 0.000000 -0.500000 1.125000 +v 0.250000 -0.433013 1.125000 +v 0.433013 -0.250000 1.125000 +v 0.500000 -0.000000 1.125000 +v 0.433013 0.250000 1.125000 +v 0.250001 0.433013 1.125000 +v 0.000000 0.500000 0.750000 +v -0.250000 0.433013 0.750000 +v -0.433012 0.250000 0.750000 +v -0.500000 0.000000 0.750000 +v -0.433012 -0.250000 0.750000 +v -0.250000 -0.433013 0.750000 +v 0.000000 -0.500000 0.750000 +v 0.250000 -0.433013 0.750000 +v 0.433013 -0.250000 0.750000 +v 0.500000 -0.000000 0.750000 +v 0.433013 0.250000 0.750000 +v 0.250001 0.433013 0.750000 +v 0.250000 0.433013 -0.750000 +v 0.433013 0.250000 -0.750000 +v 0.500000 -0.000000 -0.750000 +v 0.433013 -0.250000 -0.750000 +v 0.250000 -0.433013 -0.750000 +v 0.000000 -0.500000 -0.750000 +v -0.250000 -0.433013 -0.750000 +v -0.433012 -0.250000 -0.750000 +v -0.500000 0.000000 -0.750000 +v -0.433012 0.250000 -0.750000 +v -0.250000 0.433013 -0.750000 +v 0.000000 0.500000 -0.750000 +v 0.250000 0.433013 -1.125000 +v 0.433013 0.250000 -1.125000 +v 0.500000 -0.000000 -1.125000 +v 0.433013 -0.250000 -1.125000 +v 0.250000 -0.433013 -1.125000 +v 0.000000 -0.500000 -1.125000 +v -0.250000 -0.433013 -1.125000 +v -0.433012 -0.250000 -1.125000 +v -0.500000 0.000000 -1.125000 +v -0.433012 0.250000 -1.125000 +v -0.250000 0.433013 -1.125000 +v 0.000000 0.500000 -1.125000 +v 0.187500 0.324759 -1.375000 +v 0.324760 0.187500 -1.375000 +v 0.375000 -0.000000 -1.375000 +v 0.324760 -0.187500 -1.375000 +v 0.187500 -0.324760 -1.375000 +v 0.000000 -0.375000 -1.375000 +v -0.187500 -0.324759 -1.375000 +v -0.324759 -0.187500 -1.375000 +v -0.375000 0.000000 -1.375000 +v -0.324759 0.187500 -1.375000 +v -0.187500 0.324760 -1.375000 +v 0.000000 0.375000 -1.375000 +v 0.187500 0.324759 -1.125000 +v 0.324760 0.187500 -1.125000 +v 0.375000 -0.000000 -1.125000 +v 0.324760 -0.187500 -1.125000 +v 0.187500 -0.324760 -1.125000 +v 0.000000 -0.375000 -1.125000 +v -0.187500 -0.324759 -1.125000 +v -0.324759 -0.187500 -1.125000 +v -0.375000 0.000000 -1.125000 +v -0.324759 0.187500 -1.125000 +v -0.187500 0.324760 -1.125000 +v 0.000000 0.375000 -1.125000 +v 0.000000 2.250000 -1.125000 +v 0.000000 2.250000 1.125000 +v 0.125000 2.216507 -1.125000 +v 0.125000 2.216507 1.125000 +v 0.216507 2.125000 -1.125000 +v 0.216507 2.125000 1.125000 +v 0.250000 2.000000 -1.125000 +v 0.250000 2.000000 1.125000 +v 0.216507 1.875000 -1.125000 +v 0.216507 1.875000 1.125000 +v 0.125000 1.783494 -1.125000 +v 0.125000 1.783494 1.125000 +v 0.000000 1.750000 -1.125000 +v 0.000000 1.750000 1.125000 +v -0.125000 1.783494 -1.125000 +v -0.125000 1.783494 1.125000 +v -0.216506 1.875000 -1.125000 +v -0.216506 1.875000 1.125000 +v -0.250000 2.000000 -1.125000 +v -0.250000 2.000000 1.125000 +v -0.216506 2.125000 -1.125000 +v -0.216506 2.125000 1.125000 +v -0.125000 2.216506 -1.125000 +v -0.125000 2.216506 1.125000 +v 0.000000 2.187500 1.125000 +v 0.093750 2.162380 1.125000 +v 0.162380 2.093750 1.125000 +v 0.187500 2.000000 1.125000 +v -0.187500 2.000000 1.125000 +v -0.162380 2.093750 1.125000 +v -0.093750 2.162380 1.125000 +v 0.187500 0.250000 1.125000 +v -0.187500 0.250000 1.125000 +v 0.093750 2.162380 1.250000 +v 0.000000 2.187500 1.250000 +v 0.162380 2.093750 1.250000 +v 0.187500 2.000000 1.250000 +v -0.162380 2.093750 1.250000 +v -0.187500 2.000000 1.250000 +v -0.093750 2.162380 1.250000 +v 0.187500 0.250000 1.250000 +v -0.187500 0.250000 1.250000 +v -0.187500 0.250000 -1.125000 +v 0.187500 0.250000 -1.125000 +v -0.093750 2.162380 -1.125000 +v -0.187500 2.000000 -1.125000 +v -0.162380 2.093750 -1.125000 +v 0.187500 2.000000 -1.125000 +v 0.162380 2.093750 -1.125000 +v 0.000000 2.187500 -1.125000 +v 0.093750 2.162380 -1.125000 +v -0.187500 0.250000 -1.250000 +v 0.187500 0.250000 -1.250000 +v -0.093750 2.162380 -1.250000 +v -0.162380 2.093750 -1.250000 +v -0.187500 2.000000 -1.250000 +v 0.187500 2.000000 -1.250000 +v 0.162380 2.093750 -1.250000 +v 0.093750 2.162380 -1.250000 +v 0.000000 2.187500 -1.250000 +v -4.336167 0.913833 -0.044194 +v -4.304917 0.945083 -0.062500 +v -6.437500 1.000000 -0.062500 +v -4.437500 1.000000 -0.062500 +v -6.437500 0.955806 -0.044194 +v -4.437500 0.955806 -0.044194 +v -6.437500 0.937500 0.000000 +v -4.437500 0.937500 0.000000 +v -6.437500 0.955806 0.044194 +v -4.437500 0.955806 0.044194 +v -6.437500 1.000000 0.062500 +v -4.437500 1.000000 0.062500 +v -6.437500 1.044194 0.044194 +v -4.437500 1.044194 0.044194 +v -6.437500 1.062500 0.000000 +v -4.437500 1.062500 0.000000 +v -6.437500 1.044194 -0.044194 +v -4.437500 1.044194 -0.044194 +v -4.349112 0.900888 0.000000 +v -4.336167 0.913833 0.044194 +v -4.304917 0.945083 0.062500 +v -4.273667 0.976333 0.044194 +v -4.260723 0.989277 0.000000 +v -4.273667 0.976333 -0.044194 +v -4.294194 0.812500 -0.044194 +v -4.250000 0.812500 -0.062500 +v -4.312500 0.812500 0.000000 +v -4.294194 0.812500 0.044194 +v -4.250000 0.812500 0.062500 +v -4.205806 0.812500 0.044194 +v -4.187500 0.812500 0.000000 +v -4.205806 0.812500 -0.044194 +v -4.294194 0.562500 -0.044194 +v -4.250000 0.562500 -0.062500 +v -4.312500 0.562500 0.000000 +v -4.294194 0.562500 0.044194 +v -4.250000 0.562500 0.062500 +v -4.205806 0.562500 0.044194 +v -4.187500 0.562500 0.000000 +v -4.205806 0.562500 -0.044194 +v -4.338388 0.437500 -0.088388 +v -4.250000 0.437500 -0.125000 +v -4.375000 0.437500 0.000000 +v -4.338388 0.437500 0.088388 +v -4.250000 0.437500 0.125000 +v -4.161612 0.437500 0.088388 +v -4.125000 0.437500 -0.000000 +v -4.161612 0.437500 -0.088388 +v -4.338388 0.562500 -0.088388 +v -4.250000 0.562500 -0.125000 +v -4.375000 0.562500 0.000000 +v -4.338388 0.562500 0.088388 +v -4.250000 0.562500 0.125000 +v -4.161612 0.562500 0.088388 +v -4.125000 0.562500 -0.000000 +v -4.161612 0.562500 -0.088388 +v -6.570083 0.945083 -0.062500 +v -6.538833 0.913833 -0.044194 +v -6.525888 0.900888 0.000000 +v -6.538833 0.913833 0.044194 +v -6.570083 0.945083 0.062500 +v -6.601333 0.976333 0.044194 +v -6.614277 0.989277 0.000000 +v -6.601333 0.976333 -0.044194 +v -6.746859 0.768306 -0.062500 +v -6.715609 0.737056 -0.044194 +v -6.702665 0.724112 0.000000 +v -6.715609 0.737056 0.044195 +v -6.746859 0.768306 0.062500 +v -6.778109 0.799556 0.044195 +v -6.791053 0.812500 0.000000 +v -6.778109 0.799556 -0.044194 +v -6.746859 0.768306 -0.093750 +v -6.699984 0.721431 -0.066291 +v -6.680568 0.702015 0.000000 +v -6.699984 0.721431 0.066292 +v -6.746859 0.768306 0.093750 +v -6.793734 0.815181 0.066292 +v -6.813150 0.834597 0.000000 +v -6.793734 0.815181 -0.066291 +v -6.835247 0.679917 -0.093750 +v -6.788372 0.633042 -0.066291 +v -6.768956 0.613626 0.000000 +v -6.788372 0.633042 0.066292 +v -6.835247 0.679917 0.093750 +v -6.882122 0.726792 0.066292 +v -6.901539 0.746209 0.000000 +v -6.882122 0.726792 -0.066291 +v 1.500000 1.060660 0.530330 +v 1.312500 1.025135 0.565856 +v 1.175241 0.928078 0.662913 +v 1.125000 0.795495 0.795495 +v 1.175241 0.662913 0.928078 +v 1.312500 0.565856 1.025135 +v 1.500000 0.530330 1.060660 +v 1.687500 0.565856 1.025135 +v 1.824760 0.662913 0.928078 +v 1.875000 0.795495 0.795495 +v 1.824760 0.928078 0.662913 +v 1.687500 1.025135 0.565856 +v 1.500000 1.237437 0.707107 +v 1.312500 1.201912 0.742632 +v 1.175241 1.104854 0.839689 +v 1.125000 0.972272 0.972272 +v 1.175241 0.839689 1.104854 +v 1.312500 0.742632 1.201912 +v 1.500000 0.707107 1.237437 +v 1.687500 0.742632 1.201912 +v 1.824760 0.839689 1.104855 +v 1.875000 0.972272 0.972272 +v 1.824760 1.104854 0.839690 +v 1.687500 1.201911 0.742632 +v 1.500000 1.149049 0.441942 +v 1.250000 1.101681 0.489309 +v 1.066988 0.972272 0.618719 +v 1.000000 0.795495 0.795495 +v 1.066988 0.618719 0.972272 +v 1.250000 0.489309 1.101681 +v 1.500000 0.441942 1.149049 +v 1.750000 0.489309 1.101681 +v 1.933013 0.618719 0.972272 +v 2.000000 0.795495 0.795495 +v 1.933013 0.972272 0.618719 +v 1.750000 1.101681 0.489309 +v 1.500000 0.883884 0.176777 +v 1.250000 0.836517 0.224144 +v 1.066988 0.707107 0.353554 +v 1.000000 0.530330 0.530330 +v 1.066988 0.353554 0.707107 +v 1.250000 0.224144 0.836516 +v 1.500000 0.176777 0.883884 +v 1.750000 0.224144 0.836516 +v 1.933013 0.353554 0.707107 +v 2.000000 0.530330 0.530330 +v 1.933013 0.707107 0.353554 +v 1.750000 0.836516 0.224144 +v 1.548529 1.100337 0.844207 +v 1.367418 1.066022 0.878522 +v 1.318889 0.937957 1.006587 +v 1.451472 0.844207 1.100337 +v 1.632583 0.878522 1.066022 +v 1.681111 1.006587 0.937957 +v 1.548529 1.188725 0.932596 +v 1.367418 1.154410 0.966910 +v 1.318889 1.026345 1.094975 +v 1.451472 0.932595 1.188725 +v 1.632583 0.966910 1.154410 +v 1.681111 1.094975 1.026345 +v 1.524265 1.124693 0.996628 +v 1.475736 1.124693 0.996628 +v 1.433709 1.107535 1.013785 +v 1.409445 1.077818 1.043503 +v 1.409445 1.043503 1.077818 +v 1.433709 1.013785 1.107535 +v 1.475736 0.996628 1.124693 +v 1.524265 0.996628 1.124693 +v 1.566292 1.013785 1.107535 +v 1.590556 1.043503 1.077818 +v 1.590556 1.077818 1.043503 +v 1.566292 1.107535 1.013785 +v 1.516177 1.103348 1.017972 +v 1.483824 1.103348 1.017972 +v 1.455806 1.091910 1.029410 +v 1.439630 1.072098 1.049222 +v 1.439630 1.049222 1.072099 +v 1.455806 1.029410 1.091910 +v 1.483824 1.017972 1.103349 +v 1.516177 1.017972 1.103349 +v 1.544195 1.029410 1.091910 +v 1.560371 1.049222 1.072099 +v 1.560371 1.072098 1.049222 +v 1.544195 1.091910 1.029410 +v 1.391682 1.130054 0.814490 +v 1.310801 0.916613 1.027931 +v 1.443384 0.822863 1.121681 +v 1.624495 0.857178 1.087366 +v 1.705376 1.070619 0.873925 +v 1.793764 0.962366 0.982178 +v 1.238589 1.067554 0.876990 +v 1.729059 0.791613 1.152931 +v 1.173884 0.896801 1.047743 +v 1.515596 0.740551 1.203993 +v 1.322643 0.777110 1.167434 +v 1.483243 0.655175 1.289369 +v 1.290291 0.691733 1.252811 +v 0.821181 -0.499694 2.400044 +v 1.062663 -0.545448 2.445798 +v 1.274114 0.695578 1.204772 +v 1.515596 0.649824 1.250525 +v 0.945095 -0.935730 2.880275 +v 1.025976 -0.722289 2.666833 +v 0.893393 -0.628539 2.573083 +v 0.712282 -0.662854 2.607398 +v 0.631401 -0.876295 2.820839 +v 0.543013 -0.768042 2.712586 +v 1.098188 -0.873230 2.817774 +v 0.607718 -0.597289 2.541833 +v 1.162892 -0.702477 2.647021 +v 0.821181 -0.546227 2.490771 +v 1.014134 -0.582786 2.527330 +v 0.853533 -0.460851 2.405395 +v 1.046486 -0.497409 2.441953 +v 1.310801 1.005001 1.116319 +v 1.391682 1.218443 0.902878 +v 1.443384 0.911251 1.210069 +v 1.624495 0.945566 1.175755 +v 1.705376 1.159008 0.962313 +v 1.793764 1.050755 1.070566 +v 1.238589 1.155943 0.965378 +v 1.729059 0.880001 1.241319 +v 1.173884 0.985190 1.136131 +v 1.515596 0.828940 1.292381 +v 1.322643 0.865498 1.255823 +v 1.483243 0.743563 1.377758 +v 1.290291 0.780122 1.341199 +v 1.025976 -0.633901 2.755221 +v 0.945095 -0.847342 2.968663 +v 0.893393 -0.540151 2.661471 +v 0.712282 -0.574466 2.695786 +v 0.631401 -0.787907 2.909228 +v 0.543013 -0.679654 2.800974 +v 1.098188 -0.784842 2.906163 +v 0.607718 -0.508900 2.630221 +v 1.162892 -0.614089 2.735409 +v 0.821181 -0.457839 2.579160 +v 1.014134 -0.494397 2.615718 +v 0.853533 -0.372462 2.493783 +v 1.046486 -0.409021 2.530342 +v 1.274114 0.828160 1.337355 +v 0.821181 -0.367112 2.532627 +v 1.062663 -0.412865 2.578380 +v 1.515596 0.782407 1.383108 +v 2.676175 1.232172 -0.375000 +v 2.506242 1.311413 -0.324760 +v 2.381843 1.369421 -0.187500 +v 2.336309 1.390654 0.000000 +v 2.381843 1.369421 0.187500 +v 2.506242 1.311413 0.324760 +v 2.676175 1.232172 0.375000 +v 2.846107 1.152931 0.324760 +v 2.970507 1.094923 0.187500 +v 3.016040 1.073690 0.000000 +v 2.970507 1.094923 -0.187500 +v 2.846107 1.152931 -0.324759 +v 2.676175 1.232172 -0.250000 +v 2.562886 1.284999 -0.216506 +v 2.479953 1.323672 -0.125000 +v 2.449598 1.337827 0.000000 +v 2.479953 1.323672 0.125000 +v 2.562886 1.284999 0.216506 +v 2.676175 1.232172 0.250000 +v 2.789463 1.179345 0.216506 +v 2.872396 1.140673 0.125000 +v 2.902751 1.126518 0.000000 +v 2.872396 1.140672 -0.125000 +v 2.789463 1.179345 -0.216506 +v 2.729002 1.345461 -0.250000 +v 2.615713 1.398288 -0.216506 +v 2.532781 1.436960 -0.125000 +v 2.502425 1.451115 0.000000 +v 2.532781 1.436960 0.125000 +v 2.615713 1.398288 0.216506 +v 2.729002 1.345461 0.250000 +v 2.842290 1.292633 0.216506 +v 2.925223 1.253961 0.125000 +v 2.955579 1.239806 0.000000 +v 2.925223 1.253961 -0.125000 +v 2.842290 1.292633 -0.216506 +v 2.464866 0.779018 -0.375000 +v 2.294933 0.858259 -0.324760 +v 2.170533 0.916268 -0.187500 +v 2.125000 0.937500 0.000000 +v 2.170533 0.916268 0.187500 +v 2.294933 0.858259 0.324760 +v 2.464865 0.779018 0.375000 +v 2.634798 0.699777 0.324760 +v 2.759197 0.641769 0.187500 +v 2.804731 0.620536 0.000000 +v 2.759198 0.641769 -0.187500 +v 2.634799 0.699777 -0.324759 +v 2.305976 1.177717 -0.044194 +v 2.313713 1.194307 -0.000000 +v 2.305976 1.177717 0.044194 +v 2.287299 1.137663 0.062500 +v 2.268621 1.097610 0.044194 +v 2.260885 1.081019 0.000000 +v 2.268621 1.097610 -0.044194 +v 2.287299 1.137663 -0.062500 +v 2.079399 1.283371 -0.044194 +v 2.087136 1.299962 -0.000000 +v 2.079399 1.283371 0.044194 +v 2.060722 1.243318 0.062500 +v 2.042045 1.203264 0.044194 +v 2.034308 1.186674 0.000000 +v 2.042045 1.203264 -0.044194 +v 2.060722 1.243318 -0.062500 +v 2.061334 1.096744 0.000000 +v 2.117366 1.216904 0.132583 +v 2.117366 1.216904 -0.132582 +v 2.173398 1.337065 0.000000 +v 2.174010 1.190491 -0.132582 +v 2.117979 1.070330 0.000000 +v 2.174010 1.190491 0.132583 +v 2.230042 1.310651 0.000000 +v 2.004078 1.269732 0.132583 +v 2.060110 1.389892 0.000000 +v 2.134819 1.550106 0.441942 +v 2.190850 1.670267 0.309359 +v 2.191463 1.523693 0.441942 +v 2.247494 1.643853 0.309359 +v 2.079399 1.283371 0.176777 +v 2.135431 1.403532 0.044194 +v 2.136044 1.256958 0.176777 +v 2.192075 1.377118 0.044194 +v 2.172173 1.630213 0.441942 +v 2.190850 1.670267 0.397748 +v 2.228817 1.603800 0.441942 +v 2.247494 1.643853 0.397748 +v 3.500000 0.250000 1.125000 +v 3.375000 0.216506 1.125000 +v 3.283494 0.125000 1.125000 +v 3.250000 -0.000000 1.125000 +v 3.283494 -0.125000 1.125000 +v 3.375000 -0.216506 1.125000 +v 3.500000 -0.250000 1.125000 +v 3.625000 -0.216506 1.125000 +v 3.716506 -0.125000 1.125000 +v 3.750000 -0.000000 1.125000 +v 3.716506 0.125000 1.125000 +v 3.625000 0.216506 1.125000 +v 3.500000 0.375000 1.125000 +v 3.312500 0.324759 1.125000 +v 3.175241 0.187500 1.125000 +v 3.125000 -0.000000 1.125000 +v 3.175241 -0.187500 1.125000 +v 3.312500 -0.324760 1.125000 +v 3.500000 -0.375000 1.125000 +v 3.687500 -0.324760 1.125000 +v 3.824759 -0.187500 1.125000 +v 3.875000 -0.000000 1.125000 +v 3.824760 0.187500 1.125000 +v 3.687500 0.324759 1.125000 +v 3.500000 0.375000 0.875000 +v 3.312500 0.324759 0.875000 +v 3.175241 0.187500 0.875000 +v 3.125000 -0.000000 0.875000 +v 3.175241 -0.187500 0.875000 +v 3.312500 -0.324760 0.875000 +v 3.500000 -0.375000 0.875000 +v 3.687500 -0.324760 0.875000 +v 3.824759 -0.187500 0.875000 +v 3.875000 -0.000000 0.875000 +v 3.824760 0.187500 0.875000 +v 3.687500 0.324759 0.875000 +v 3.500000 0.250000 1.187500 +v 3.375000 0.216506 1.187500 +v 3.283494 0.125000 1.187500 +v 3.250000 -0.000000 1.187500 +v 3.283494 -0.125000 1.187500 +v 3.375000 -0.216506 1.187500 +v 3.500000 -0.250000 1.187500 +v 3.625000 -0.216506 1.187500 +v 3.716506 -0.125000 1.187500 +v 3.750000 -0.000000 1.187500 +v 3.716506 0.125000 1.187500 +v 3.625000 0.216506 1.187500 +v -0.750000 0.875000 1.375000 +v -0.750000 1.062500 1.425240 +v -0.750000 1.199759 1.562500 +v -0.750000 1.250000 1.750000 +v -0.750000 1.199759 1.937500 +v -0.750000 1.062500 2.074759 +v -0.750000 0.875000 2.125000 +v -0.750000 0.687500 2.074759 +v -0.750000 0.550240 1.937500 +v -0.750000 0.500000 1.750000 +v -0.750000 0.550240 1.562500 +v -0.750000 0.687500 1.425241 +v -0.937500 1.062500 1.425240 +v -0.937500 0.875000 1.375000 +v -0.937500 1.199759 1.562500 +v -0.937500 1.250000 1.750000 +v -0.937500 1.199759 1.937500 +v -0.937500 1.062500 2.074759 +v -0.937500 0.875000 2.125000 +v -0.937500 0.687500 2.074759 +v -0.937500 0.550240 1.937500 +v -0.937500 0.500000 1.750000 +v -0.937500 0.550240 1.562500 +v -0.937500 0.687500 1.425241 +v -0.750000 0.710938 2.034164 +v -0.750000 0.875000 2.078125 +v -0.750000 1.039062 2.034164 +v -0.750000 1.159164 1.914062 +v -0.750000 1.203125 1.750000 +v -0.750000 1.159164 1.585937 +v -0.750000 0.875000 1.421875 +v -0.750000 1.039062 1.465835 +v -0.843750 0.584917 1.106471 +v -0.799556 0.568326 1.114207 +v -0.781250 0.528273 1.132885 +v -0.799556 0.488219 1.151562 +v -0.843750 0.471629 1.159298 +v -0.887944 0.488219 1.151562 +v -0.906250 0.528273 1.132885 +v -0.887944 0.568326 1.114207 +v -0.843750 0.743399 1.446337 +v -0.799556 0.726808 1.454073 +v -0.781250 0.686755 1.472750 +v -0.799556 0.646701 1.491427 +v -0.843750 0.630110 1.499164 +v -0.887944 0.646701 1.491427 +v -0.906250 0.686755 1.472750 +v -0.887944 0.726808 1.454073 +v -0.750000 0.590835 1.914062 +v -0.750000 0.546875 1.750000 +v -0.750000 0.590835 1.585938 +v -0.750000 0.710937 1.465835 +v -0.812500 0.875000 1.421875 +v -0.812500 0.710937 1.465835 +v -0.812500 0.590835 1.585938 +v -0.812500 0.546875 1.750000 +v -0.812500 0.590835 1.914062 +v -0.812500 1.039062 2.034164 +v -0.812500 1.159164 1.914062 +v -0.812500 0.875000 2.078125 +v -0.812500 1.159164 1.585937 +v -0.812500 1.039062 1.465835 +v -0.812500 1.203125 1.750000 +v -0.812500 0.710938 2.034164 +v -0.812500 0.875000 1.687500 +v -0.812500 0.919194 1.705806 +v -0.812500 0.937500 1.750000 +v -0.812500 0.919194 1.794194 +v -0.812500 0.875000 1.812500 +v -0.812500 0.830806 1.794194 +v -0.812500 0.812500 1.750000 +v -0.812500 0.830806 1.705806 +v -0.750000 0.875000 1.687500 +v -0.750000 0.919194 1.705806 +v -0.750000 0.937500 1.750000 +v -0.750000 0.919194 1.794194 +v -0.750000 0.875000 1.812500 +v -0.750000 0.830806 1.794194 +v -0.750000 0.812500 1.750000 +v -0.750000 0.830806 1.705806 +v -0.500000 0.000000 -1.375000 +v -0.500000 -0.526190 -1.270334 +v -0.500000 -0.972272 -0.972272 +v -0.500000 -1.270334 -0.526190 +v -0.500000 -1.375000 0.000000 +v -0.500000 -1.270334 0.526190 +v -0.500000 -0.972272 0.972272 +v -0.500000 -0.526190 1.270334 +v -0.500000 -0.000000 1.375000 +v -0.500000 0.526190 1.270334 +v -0.500000 0.972272 0.972272 +v -0.500000 1.270334 0.526190 +v -0.500000 1.375000 -0.000000 +v -0.500000 1.270334 -0.526190 +v -0.500000 0.972272 -0.972272 +v -0.500000 0.526189 -1.270335 +v -1.000000 -0.526190 -1.270334 +v -1.000000 -0.972272 -0.972272 +v -1.000000 0.000000 -1.375000 +v -1.000000 -1.270334 -0.526190 +v -1.000000 -1.375000 0.000000 +v -1.000000 -1.270334 0.526190 +v -1.000000 -0.972272 0.972272 +v -1.000000 -0.526190 1.270334 +v -1.000000 -0.000000 1.375000 +v -1.000000 0.526190 1.270334 +v -1.000000 0.972272 0.972272 +v -1.000000 1.270334 0.526190 +v -1.000000 1.375000 -0.000000 +v -1.000000 1.270334 -0.526190 +v -1.000000 0.972272 -0.972272 +v -1.000000 0.526189 -1.270335 +v -1.000000 -0.526190 -1.270334 +v -1.000000 -0.972272 -0.972272 +v -1.000000 0.000000 -1.375000 +v -1.000000 -1.270334 -0.526190 +v -1.000000 -1.375000 0.000000 +v -1.000000 -1.270334 0.526190 +v -1.000000 -0.972272 0.972272 +v -1.000000 -0.526190 1.270334 +v -1.000000 -0.000000 1.375000 +v -1.000000 0.526190 1.270334 +v -1.000000 0.972272 0.972272 +v -1.000000 1.270334 0.526190 +v -1.000000 1.375000 -0.000000 +v -1.000000 1.270334 -0.526190 +v -1.000000 0.972272 -0.972272 +v -1.000000 0.526189 -1.270335 +v -1.000000 0.000000 -1.000000 +v -1.000000 -0.382683 -0.923879 +v -1.000000 -0.707107 -0.707107 +v -1.000000 -0.923879 -0.382683 +v -1.000000 -1.000000 0.000000 +v -1.000000 -0.923879 0.382683 +v -1.000000 -0.707107 0.707107 +v -1.000000 -0.382683 0.923879 +v -1.000000 0.000000 1.000000 +v -1.000000 0.382683 0.923880 +v -1.000000 0.707107 0.707107 +v -1.000000 0.923880 0.382684 +v -1.000000 1.000000 -0.000000 +v -1.000000 0.923880 -0.382684 +v -1.000000 0.707107 -0.707107 +v -1.000000 0.382683 -0.923880 +v -1.500000 0.000000 -1.000000 +v -1.500000 -0.382683 -0.923879 +v -1.500000 -0.707107 -0.707107 +v -1.500000 -0.923879 -0.382683 +v -1.500000 -1.000000 0.000000 +v -1.500000 -0.923879 0.382683 +v -1.500000 -0.707107 0.707107 +v -1.500000 -0.382683 0.923879 +v -1.500000 0.000000 1.000000 +v -1.500000 0.382683 0.923880 +v -1.500000 0.707107 0.707107 +v -1.500000 0.923880 0.382684 +v -1.500000 1.000000 -0.000000 +v -1.500000 0.923880 -0.382684 +v -1.500000 0.707107 -0.707107 +v -1.500000 0.382683 -0.923880 +v -4.000000 0.000000 -0.500000 +v -4.000000 -0.191342 -0.461940 +v -4.000000 -0.353553 -0.353553 +v -4.000000 -0.461940 -0.191342 +v -4.000000 -0.500000 0.000000 +v -4.000000 -0.461940 0.191342 +v -4.000000 -0.353553 0.353553 +v -4.000000 -0.191342 0.461940 +v -4.000000 0.000000 0.500000 +v -4.000000 0.191342 0.461940 +v -4.000000 0.353553 0.353553 +v -4.000000 0.461940 0.191342 +v -4.000000 0.500000 -0.000000 +v -4.000000 0.461940 -0.191342 +v -4.000000 0.353553 -0.353553 +v -4.000000 0.191342 -0.461940 +v -4.500000 0.000000 -0.500000 +v -4.500000 -0.191342 -0.461940 +v -4.500000 -0.353553 -0.353553 +v -4.500000 -0.461940 -0.191342 +v -4.500000 -0.500000 0.000000 +v -4.500000 -0.461940 0.191342 +v -4.500000 -0.353553 0.353553 +v -4.500000 -0.191342 0.461940 +v -4.500000 0.000000 0.500000 +v -4.500000 0.191342 0.461940 +v -4.500000 0.353553 0.353553 +v -4.500000 0.461940 0.191342 +v -4.500000 0.500000 -0.000000 +v -4.500000 0.461940 -0.191342 +v -4.500000 0.353553 -0.353553 +v -4.500000 0.191342 -0.461940 +v -4.500000 0.000000 -0.375000 +v -4.500000 -0.143506 -0.346455 +v -4.500000 -0.265165 -0.265165 +v -4.500000 -0.346455 -0.143506 +v -4.500000 -0.375000 0.000000 +v -4.500000 -0.346455 0.143506 +v -4.500000 -0.265165 0.265165 +v -4.500000 -0.143506 0.346455 +v -4.500000 0.000000 0.375000 +v -4.500000 0.143506 0.346455 +v -4.500000 0.265165 0.265165 +v -4.500000 0.346455 0.143506 +v -4.500000 0.375000 -0.000000 +v -4.500000 0.346455 -0.143506 +v -4.500000 0.265165 -0.265165 +v -4.500000 0.143506 -0.346455 +v -5.500000 0.000000 -0.375000 +v -5.500000 -0.143506 -0.346455 +v -5.500000 -0.265165 -0.265165 +v -5.500000 -0.346455 -0.143506 +v -5.500000 -0.375000 0.000000 +v -5.500000 -0.346455 0.143506 +v -5.500000 -0.265165 0.265165 +v -5.500000 -0.143506 0.346455 +v -5.500000 0.000000 0.375000 +v -5.500000 0.143506 0.346455 +v -5.500000 0.265165 0.265165 +v -5.500000 0.346455 0.143506 +v -5.500000 0.375000 -0.000000 +v -5.500000 0.346455 -0.143506 +v -5.500000 0.265165 -0.265165 +v -5.500000 0.143506 -0.346455 +v -5.750000 0.000000 -0.500000 +v -5.750000 -0.191342 -0.461940 +v -5.750000 -0.353553 -0.353553 +v -5.750000 -0.461940 -0.191342 +v -5.750000 -0.500000 0.000000 +v -5.750000 -0.461940 0.191342 +v -5.750000 -0.353553 0.353553 +v -5.750000 -0.191342 0.461940 +v -5.750000 0.000000 0.500000 +v -5.750000 0.191342 0.461940 +v -5.750000 0.353553 0.353553 +v -5.750000 0.461940 0.191342 +v -5.750000 0.500000 -0.000000 +v -5.750000 0.461940 -0.191342 +v -5.750000 0.353553 -0.353553 +v -5.750000 0.191342 -0.461940 +v -6.250000 0.000000 -0.500000 +v -6.250000 -0.191342 -0.461940 +v -6.250000 -0.353553 -0.353553 +v -6.250000 -0.461940 -0.191342 +v -6.250000 -0.500000 0.000000 +v -6.250000 -0.461940 0.191342 +v -6.250000 -0.353553 0.353553 +v -6.250000 -0.191342 0.461940 +v -6.250000 0.000000 0.500000 +v -6.250000 0.191342 0.461940 +v -6.250000 0.353553 0.353553 +v -6.250000 0.461940 0.191342 +v -6.250000 0.500000 -0.000000 +v -6.250000 0.461940 -0.191342 +v -6.250000 0.353553 -0.353553 +v -6.250000 0.191342 -0.461940 +v -6.250000 0.000000 -0.375000 +v -6.250000 -0.143506 -0.346455 +v -6.250000 -0.265165 -0.265165 +v -6.250000 -0.346455 -0.143506 +v -6.250000 -0.375000 0.000000 +v -6.250000 -0.346455 0.143506 +v -6.250000 -0.265165 0.265165 +v -6.250000 -0.143506 0.346455 +v -6.250000 0.000000 0.375000 +v -6.250000 0.143506 0.346455 +v -6.250000 0.265165 0.265165 +v -6.250000 0.346455 0.143506 +v -6.250000 0.375000 -0.000000 +v -6.250000 0.346455 -0.143506 +v -6.250000 0.265165 -0.265165 +v -6.250000 0.143506 -0.346455 +v -5.750000 0.000000 -0.375000 +v -5.750000 -0.143506 -0.346455 +v -5.750000 -0.265165 -0.265165 +v -5.750000 -0.346455 -0.143506 +v -5.750000 -0.375000 0.000000 +v -5.750000 -0.346455 0.143507 +v -5.750000 -0.265165 0.265165 +v -5.750000 -0.143506 0.346455 +v -5.750000 0.000000 0.375000 +v -5.750000 0.143506 0.346455 +v -5.750000 0.265165 0.265165 +v -5.750000 0.346455 0.143507 +v -5.750000 0.375000 0.000000 +v -5.750000 0.346455 -0.143506 +v -5.750000 0.265165 -0.265165 +v -5.750000 0.143506 -0.346455 +v -0.500000 0.000000 -1.000000 +v -0.500000 -0.382683 -0.923879 +v -0.500000 -0.707107 -0.707107 +v -0.500000 -0.923879 -0.382683 +v -0.500000 -1.000000 0.000000 +v -0.500000 -0.923879 0.382683 +v -0.500000 -0.707107 0.707107 +v -0.500000 -0.382683 0.923879 +v -0.500000 0.000000 1.000000 +v -0.500000 0.382683 0.923880 +v -0.500000 0.707107 0.707107 +v -0.500000 0.923880 0.382684 +v -0.500000 1.000000 -0.000000 +v -0.500000 0.923880 -0.382684 +v -0.500000 0.707107 -0.707107 +v -0.500000 0.382683 -0.923880 +v -0.500000 0.000000 -1.375000 +v -0.500000 -0.526190 -1.270334 +v -0.500000 -0.972272 -0.972272 +v -0.500000 -1.270334 -0.526190 +v -0.500000 -1.375000 0.000000 +v -0.500000 -1.270334 0.526190 +v -0.500000 -0.972272 0.972272 +v -0.500000 -0.526190 1.270334 +v -0.500000 -0.000000 1.375000 +v -0.500000 0.526190 1.270334 +v -0.500000 0.972272 0.972272 +v -0.500000 1.270334 0.526190 +v -0.500000 1.375000 -0.000000 +v -0.500000 1.270334 -0.526190 +v -0.500000 0.972272 -0.972272 +v -0.500000 0.526189 -1.270335 +v 4.250000 -0.191342 -0.461940 +v 4.250000 0.000000 -0.500000 +v 4.250000 -0.353553 -0.353553 +v 4.250000 -0.461940 -0.191342 +v 4.250000 -0.500000 0.000000 +v 4.250000 -0.461940 0.191342 +v 4.250000 -0.353553 0.353553 +v 4.250000 -0.191342 0.461940 +v 4.250000 -0.000000 0.500000 +v 4.250000 0.191342 0.461940 +v 4.250000 0.353553 0.353553 +v 4.250000 0.461940 0.191342 +v 4.250000 0.500000 -0.000000 +v 4.250000 0.461940 -0.191342 +v 4.250000 0.353553 -0.353554 +v 4.250000 0.191342 -0.461940 +v 4.382812 -0.167424 -0.404197 +v 4.382812 0.000000 -0.437500 +v 4.382812 -0.309359 -0.309359 +v 4.382812 -0.404197 -0.167424 +v 4.382812 -0.437500 -0.000000 +v 4.382812 -0.404197 0.167424 +v 4.382812 -0.309359 0.309359 +v 4.382812 -0.167424 0.404197 +v 4.382812 -0.000000 0.437500 +v 4.382812 0.167424 0.404197 +v 4.382812 0.309359 0.309359 +v 4.382812 0.404197 0.167424 +v 4.382812 0.437500 -0.000000 +v 4.382812 0.404197 -0.167424 +v 4.382812 0.309359 -0.309359 +v 4.382812 0.167424 -0.404197 +v 4.492188 -0.083712 -0.202099 +v 4.492188 -0.000000 -0.218750 +v 4.492188 -0.154680 -0.154680 +v 4.492188 -0.202099 -0.083712 +v 4.492188 -0.218750 -0.000000 +v 4.492188 -0.202099 0.083712 +v 4.492188 -0.154680 0.154680 +v 4.492188 -0.083712 0.202099 +v 4.492188 -0.000000 0.218750 +v 4.492188 0.083712 0.202099 +v 4.492188 0.154680 0.154680 +v 4.492188 0.202099 0.083712 +v 4.492188 0.218750 -0.000000 +v 4.492188 0.202099 -0.083712 +v 4.492188 0.154680 -0.154680 +v 4.492188 0.083712 -0.202099 +v 3.500000 0.250000 1.187500 +v 3.375000 0.216506 1.187500 +v 3.283494 0.125000 1.187500 +v 3.250000 -0.000000 1.187500 +v 3.283494 -0.125000 1.187500 +v 3.375000 -0.216506 1.187500 +v 3.500000 -0.250000 1.187500 +v 3.625000 -0.216506 1.187500 +v 3.716506 -0.125000 1.187500 +v 3.750000 -0.000000 1.187500 +v 3.716506 0.125000 1.187500 +v 3.625000 0.216506 1.187500 +v 2.676175 1.232172 -0.375000 +v 2.506242 1.311413 -0.324760 +v 2.381843 1.369421 -0.187500 +v 2.336309 1.390654 0.000000 +v 2.381843 1.369421 0.187500 +v 2.506242 1.311413 0.324760 +v 2.676175 1.232172 0.375000 +v 2.846107 1.152931 0.324760 +v 2.970507 1.094923 0.187500 +v 3.016040 1.073690 0.000000 +v 2.970507 1.094923 -0.187500 +v 2.846107 1.152931 -0.324759 +v 2.676175 1.232172 -0.250000 +v 2.562886 1.284999 -0.216506 +v 2.479953 1.323672 -0.125000 +v 2.449598 1.337827 0.000000 +v 2.479953 1.323672 0.125000 +v 2.562886 1.284999 0.216506 +v 2.676175 1.232172 0.250000 +v 2.789463 1.179345 0.216506 +v 2.872396 1.140673 0.125000 +v 2.902751 1.126518 0.000000 +v 2.872396 1.140672 -0.125000 +v 2.789463 1.179345 -0.216506 +v 2.729002 1.345461 -0.250000 +v 2.615713 1.398288 -0.216506 +v 2.532781 1.436960 -0.125000 +v 2.502425 1.451115 0.000000 +v 2.532781 1.436960 0.125000 +v 2.615713 1.398288 0.216506 +v 2.729002 1.345461 0.250000 +v 2.842290 1.292633 0.216506 +v 2.925223 1.253961 0.125000 +v 2.955579 1.239806 0.000000 +v 2.925223 1.253961 -0.125000 +v 2.842290 1.292633 -0.216506 +v 1.500000 1.060660 0.530330 +v 1.312500 1.025135 0.565856 +v 1.175241 0.928078 0.662913 +v 1.125000 0.795495 0.795495 +v 1.175241 0.662913 0.928078 +v 1.312500 0.565856 1.025135 +v 1.500000 0.530330 1.060660 +v 1.687500 0.565856 1.025135 +v 1.824760 0.662913 0.928078 +v 1.875000 0.795495 0.795495 +v 1.824760 0.928078 0.662913 +v 1.687500 1.025135 0.565856 +v 1.500000 1.237437 0.707107 +v 1.312500 1.201912 0.742632 +v 1.175241 1.104854 0.839689 +v 1.125000 0.972272 0.972272 +v 1.175241 0.839689 1.104854 +v 1.312500 0.742632 1.201912 +v 1.500000 0.707107 1.237437 +v 1.687500 0.742632 1.201912 +v 1.824760 0.839689 1.104855 +v 1.875000 0.972272 0.972272 +v 1.824760 1.104854 0.839690 +v 1.687500 1.201911 0.742632 +v 1.500000 1.149049 0.441942 +v 1.250000 1.101681 0.489309 +v 1.066988 0.972272 0.618719 +v 1.000000 0.795495 0.795495 +v 1.066988 0.618719 0.972272 +v 1.250000 0.489309 1.101681 +v 1.500000 0.441942 1.149049 +v 1.750000 0.489309 1.101681 +v 1.933013 0.618719 0.972272 +v 2.000000 0.795495 0.795495 +v 1.933013 0.972272 0.618719 +v 1.750000 1.101681 0.489309 +v 0.000000 0.375000 1.125000 +v -0.187500 0.324760 1.125000 +v -0.324759 0.187500 1.125000 +v -0.375000 0.000000 1.125000 +v -0.324759 -0.187500 1.125000 +v -0.187500 -0.324759 1.125000 +v 0.000000 -0.375000 1.125000 +v 0.187500 -0.324760 1.125000 +v 0.324760 -0.187500 1.125000 +v 0.375000 -0.000000 1.125000 +v 0.324760 0.187500 1.125000 +v 0.187500 0.324759 1.125000 +v 0.000000 0.375000 1.375000 +v -0.187500 0.324760 1.375000 +v -0.324759 0.187500 1.375000 +v -0.375000 0.000000 1.375000 +v -0.324759 -0.187500 1.375000 +v -0.187500 -0.324759 1.375000 +v 0.000000 -0.375000 1.375000 +v 0.187500 -0.324760 1.375000 +v 0.324760 -0.187500 1.375000 +v 0.375000 -0.000000 1.375000 +v 0.324760 0.187500 1.375000 +v 0.187500 0.324759 1.375000 +v 0.000000 0.500000 1.125000 +v -0.250000 0.433013 1.125000 +v -0.433012 0.250000 1.125000 +v -0.500000 0.000000 1.125000 +v -0.433012 -0.250000 1.125000 +v -0.250000 -0.433013 1.125000 +v 0.000000 -0.500000 1.125000 +v 0.250000 -0.433013 1.125000 +v 0.433013 -0.250000 1.125000 +v 0.500000 -0.000000 1.125000 +v 0.433013 0.250000 1.125000 +v 0.250001 0.433013 1.125000 +v -0.750000 0.875000 1.375000 +v -0.750000 1.062500 1.425240 +v -0.750000 1.199759 1.562500 +v -0.750000 1.250000 1.750000 +v -0.750000 1.199759 1.937500 +v -0.750000 1.062500 2.074759 +v -0.750000 0.875000 2.125000 +v -0.750000 0.687500 2.074759 +v -0.750000 0.550240 1.937500 +v -0.750000 0.500000 1.750000 +v -0.750000 0.550240 1.562500 +v -0.750000 0.687500 1.425241 +v -0.937500 1.062500 1.425240 +v -0.937500 0.875000 1.375000 +v -0.937500 1.199759 1.562500 +v -0.937500 1.250000 1.750000 +v -0.937500 1.199759 1.937500 +v -0.937500 1.062500 2.074759 +v -0.937500 0.875000 2.125000 +v -0.937500 0.687500 2.074759 +v -0.937500 0.550240 1.937500 +v -0.937500 0.500000 1.750000 +v -0.937500 0.550240 1.562500 +v -0.937500 0.687500 1.425241 +v -0.750000 0.710938 2.034164 +v -0.750000 0.875000 2.078125 +v -0.750000 1.039062 2.034164 +v -0.750000 1.159164 1.914062 +v -0.750000 1.203125 1.750000 +v -0.750000 1.159164 1.585937 +v -0.750000 0.875000 1.421875 +v -0.750000 1.039062 1.465835 +v -0.750000 0.590835 1.914062 +v -0.750000 0.546875 1.750000 +v -0.750000 0.590835 1.585938 +v -0.750000 0.710937 1.465835 +v -0.812500 0.875000 1.421875 +v -0.812500 0.710937 1.465835 +v -0.812500 0.590835 1.585938 +v -0.812500 0.546875 1.750000 +v -0.812500 0.590835 1.914062 +v -0.812500 1.039062 2.034164 +v -0.812500 1.159164 1.914062 +v -0.812500 0.875000 2.078125 +v -0.812500 1.159164 1.585937 +v -0.812500 1.039062 1.465835 +v -0.812500 1.203125 1.750000 +v -0.812500 0.710938 2.034164 +v -0.750000 0.875000 1.687500 +v -0.750000 0.919194 1.705806 +v -0.750000 0.937500 1.750000 +v -0.750000 0.919194 1.794194 +v -0.750000 0.875000 1.812500 +v -0.750000 0.830806 1.794194 +v -0.750000 0.812500 1.750000 +v -0.750000 0.830806 1.705806 +v 0.000000 2.250000 -1.125000 +v 0.000000 2.250000 1.125000 +v 0.125000 2.216507 -1.125000 +v 0.125000 2.216507 1.125000 +v 0.216507 2.125000 -1.125000 +v 0.216507 2.125000 1.125000 +v 0.250000 2.000000 -1.125000 +v 0.250000 2.000000 1.125000 +v 0.216507 1.875000 -1.125000 +v 0.216507 1.875000 1.125000 +v 0.125000 1.783494 -1.125000 +v 0.125000 1.783494 1.125000 +v 0.000000 1.750000 -1.125000 +v 0.000000 1.750000 1.125000 +v -0.125000 1.783494 -1.125000 +v -0.125000 1.783494 1.125000 +v -0.216506 1.875000 -1.125000 +v -0.216506 1.875000 1.125000 +v -0.250000 2.000000 -1.125000 +v -0.250000 2.000000 1.125000 +v -0.216506 2.125000 -1.125000 +v -0.216506 2.125000 1.125000 +v -0.125000 2.216506 -1.125000 +v -0.125000 2.216506 1.125000 +v -0.093750 2.162380 -1.125000 +v -0.187500 2.000000 -1.125000 +v -0.162380 2.093750 -1.125000 +v 0.187500 2.000000 -1.125000 +v 0.162380 2.093750 -1.125000 +v 0.000000 2.187500 -1.125000 +v 0.093750 2.162380 -1.125000 +v -0.093750 2.162380 -1.250000 +v -0.162380 2.093750 -1.250000 +v -0.187500 2.000000 -1.250000 +v 0.187500 2.000000 -1.250000 +v 0.162380 2.093750 -1.250000 +v 0.093750 2.162380 -1.250000 +v 0.000000 2.187500 -1.250000 +v 0.000000 2.187500 1.125000 +v 0.093750 2.162380 1.125000 +v 0.162380 2.093750 1.125000 +v 0.187500 2.000000 1.125000 +v -0.187500 2.000000 1.125000 +v -0.162380 2.093750 1.125000 +v -0.093750 2.162380 1.125000 +v 0.093750 2.162380 1.250000 +v 0.000000 2.187500 1.250000 +v 0.162380 2.093750 1.250000 +v 0.187500 2.000000 1.250000 +v -0.162380 2.093750 1.250000 +v -0.187500 2.000000 1.250000 +v -0.093750 2.162380 1.250000 +v 0.250000 0.433013 -1.125000 +v 0.433013 0.250000 -1.125000 +v 0.500000 -0.000000 -1.125000 +v 0.433013 -0.250000 -1.125000 +v 0.250000 -0.433013 -1.125000 +v 0.000000 -0.500000 -1.125000 +v -0.250000 -0.433013 -1.125000 +v -0.433012 -0.250000 -1.125000 +v -0.500000 0.000000 -1.125000 +v -0.433012 0.250000 -1.125000 +v -0.250000 0.433013 -1.125000 +v 0.000000 0.500000 -1.125000 +v 0.187500 0.324759 -1.375000 +v 0.324760 0.187500 -1.375000 +v 0.375000 -0.000000 -1.375000 +v 0.324760 -0.187500 -1.375000 +v 0.187500 -0.324760 -1.375000 +v 0.000000 -0.375000 -1.375000 +v -0.187500 -0.324759 -1.375000 +v -0.324759 -0.187500 -1.375000 +v -0.375000 0.000000 -1.375000 +v -0.324759 0.187500 -1.375000 +v -0.187500 0.324760 -1.375000 +v 0.000000 0.375000 -1.375000 +v 0.187500 0.324759 -1.125000 +v 0.324760 0.187500 -1.125000 +v 0.375000 -0.000000 -1.125000 +v 0.324760 -0.187500 -1.125000 +v 0.187500 -0.324760 -1.125000 +v 0.000000 -0.375000 -1.125000 +v -0.187500 -0.324759 -1.125000 +v -0.324759 -0.187500 -1.125000 +v -0.375000 0.000000 -1.125000 +v -0.324759 0.187500 -1.125000 +v -0.187500 0.324760 -1.125000 +v 0.000000 0.375000 -1.125000 +v 2.079399 1.283371 -0.044194 +v 2.087136 1.299962 -0.000000 +v 2.079399 1.283371 0.044194 +v 2.060722 1.243318 0.062500 +v 2.042045 1.203264 0.044194 +v 2.034308 1.186674 0.000000 +v 2.042045 1.203264 -0.044194 +v 2.060722 1.243318 -0.062500 +v -6.746859 0.768306 -0.062500 +v -6.715609 0.737056 -0.044194 +v -6.702665 0.724112 0.000000 +v -6.715609 0.737056 0.044195 +v -6.746859 0.768306 0.062500 +v -6.778109 0.799556 0.044195 +v -6.791053 0.812500 0.000000 +v -6.778109 0.799556 -0.044194 +v -6.746859 0.768306 -0.093750 +v -6.699984 0.721431 -0.066291 +v -6.680568 0.702015 0.000000 +v -6.699984 0.721431 0.066292 +v -6.746859 0.768306 0.093750 +v -6.793734 0.815181 0.066292 +v -6.813150 0.834597 0.000000 +v -6.793734 0.815181 -0.066291 +v -6.835247 0.679917 -0.093750 +v -6.788372 0.633042 -0.066291 +v -6.768956 0.613626 0.000000 +v -6.788372 0.633042 0.066292 +v -6.835247 0.679917 0.093750 +v -6.882122 0.726792 0.066292 +v -6.901539 0.746209 0.000000 +v -6.882122 0.726792 -0.066291 +v -4.338388 0.562500 -0.088388 +v -4.250000 0.562500 -0.125000 +v -4.375000 0.562500 0.000000 +v -4.338388 0.562500 0.088388 +v -4.250000 0.562500 0.125000 +v -4.161612 0.562500 0.088388 +v -4.125000 0.562500 -0.000000 +v -4.161612 0.562500 -0.088388 +v 1.516177 1.103348 1.017972 +v 1.483824 1.103348 1.017972 +v 1.455806 1.091910 1.029410 +v 1.439630 1.072098 1.049222 +v 1.439630 1.049222 1.072099 +v 1.455806 1.029410 1.091910 +v 1.483824 1.017972 1.103349 +v 1.516177 1.017972 1.103349 +v 1.544195 1.029410 1.091910 +v 1.560371 1.049222 1.072099 +v 1.560371 1.072098 1.049222 +v 1.544195 1.091910 1.029410 +v 1.524265 1.102596 0.974531 +v 1.475736 1.102596 0.974531 +v 1.433709 1.085438 0.991688 +v 1.409445 1.055721 1.021406 +v 1.409445 1.021406 1.055721 +v 1.433709 0.991688 1.085438 +v 1.475736 0.974531 1.102596 +v 1.524265 0.974531 1.102596 +v 1.566292 0.991688 1.085438 +v 1.590556 1.021406 1.055721 +v 1.590556 1.055721 1.021406 +v 1.566292 1.085438 0.991688 +v 1.524265 1.124693 0.996628 +v 1.475736 1.124693 0.996628 +v 1.433709 1.107535 1.013785 +v 1.409445 1.077818 1.043503 +v 1.409445 1.043503 1.077818 +v 1.433709 1.013785 1.107535 +v 1.475736 0.996628 1.124693 +v 1.524265 0.996628 1.124693 +v 1.566292 1.013785 1.107535 +v 1.590556 1.043503 1.077818 +v 1.590556 1.077818 1.043503 +v 1.566292 1.107535 1.013785 +v 1.524265 1.102596 0.974531 +v 1.475736 1.102596 0.974531 +v 1.433709 1.085438 0.991688 +v 1.409445 1.055721 1.021406 +v 1.409445 1.021406 1.055721 +v 1.433709 0.991688 1.085438 +v 1.475736 0.974531 1.102596 +v 1.524265 0.974531 1.102596 +v 1.566292 0.991688 1.085438 +v 1.590556 1.021406 1.055721 +v 1.590556 1.055721 1.021406 +v 1.566292 1.085438 0.991688 +vt 0.043478 0.368553 +vt 0.057102 0.381645 +vt 0.043478 0.420921 +vt 0.063241 0.467105 +vt 0.071146 0.486842 +vt 0.063241 0.480263 +vt 0.063241 0.500000 +vt 0.063241 0.486842 +vt 0.063241 0.506579 +vt 0.071146 0.526316 +vt 0.063241 0.519737 +vt 0.063241 0.539474 +vt 0.063241 0.526316 +vt 0.063241 0.546053 +vt 0.071146 0.565789 +vt 0.063241 0.559211 +vt 0.063241 0.578947 +vt 0.063241 0.565789 +vt 0.071146 0.585526 +vt 0.063241 0.598684 +vt 0.063241 0.585526 +vt 0.071146 0.368421 +vt 0.063241 0.381579 +vt 0.063241 0.368421 +vt 0.071146 0.388158 +vt 0.063241 0.401316 +vt 0.063241 0.388158 +vt 0.063241 0.407895 +vt 0.071146 0.427632 +vt 0.063241 0.421053 +vt 0.063241 0.440789 +vt 0.063241 0.427632 +vt 0.943923 0.034534 +vt 0.939726 0.051399 +vt 0.929594 0.044413 +vt 0.063241 0.447368 +vt 0.071146 0.467105 +vt 0.063241 0.460526 +vt 0.928854 0.302632 +vt 0.905138 0.342105 +vt 0.905138 0.302632 +vt 0.905138 0.250000 +vt 0.928854 0.289474 +vt 0.905138 0.289474 +vt 0.936759 0.342105 +vt 0.928854 0.342105 +vt 0.897233 0.302632 +vt 0.928854 0.210526 +vt 0.928854 0.250000 +vt 0.905138 0.078947 +vt 0.905138 0.000000 +vt 0.928854 0.000000 +vt 0.928854 0.118421 +vt 0.936759 0.105263 +vt 0.936759 0.118421 +vt 0.905138 0.381579 +vt 0.928854 0.355263 +vt 0.928854 0.381579 +vt 0.897233 0.197368 +vt 0.905138 0.118421 +vt 0.905138 0.210526 +vt 0.936759 0.197368 +vt 0.897233 0.394737 +vt 0.897233 0.355263 +vt 0.936759 0.355263 +vt 0.909091 0.105263 +vt 0.924901 0.092105 +vt 0.924901 0.105263 +vt 0.897233 0.118421 +vt 0.905138 0.105263 +vt 0.434783 0.730263 +vt 0.458498 0.684211 +vt 0.458498 0.736842 +vt 0.434783 0.677632 +vt 0.458498 0.631579 +vt 0.434783 0.585526 +vt 0.458498 0.578947 +vt 0.434783 0.572368 +vt 0.458498 0.526316 +vt 0.434783 0.480263 +vt 0.458498 0.473684 +vt 0.434783 0.467105 +vt 0.458498 0.421053 +vt 0.434783 0.375000 +vt 0.458498 0.368421 +vt 0.434783 0.361842 +vt 0.458498 0.315789 +vt 0.434783 0.309211 +vt 0.458498 0.263158 +vt 0.434783 0.256579 +vt 0.458498 0.210526 +vt 0.434783 0.203947 +vt 0.458498 0.157895 +vt 0.434783 0.151316 +vt 0.458498 0.105263 +vt 0.434783 0.098684 +vt 0.458498 0.052632 +vt 0.434783 0.046053 +vt 0.458498 -0.000000 +vt 0.434783 0.835526 +vt 0.458498 0.789474 +vt 0.458498 0.842105 +vt 0.434783 0.743421 +vt 0.237154 0.157895 +vt 0.245059 0.138158 +vt 0.245059 0.151316 +vt 0.245059 0.171053 +vt 0.245059 0.157895 +vt 0.237154 0.197368 +vt 0.245059 0.177632 +vt 0.245059 0.190789 +vt 0.237154 0.217105 +vt 0.245059 0.197368 +vt 0.245059 0.210526 +vt 0.237154 0.236842 +vt 0.245059 0.217105 +vt 0.245059 0.230263 +vt 0.237154 0.256579 +vt 0.245059 0.236842 +vt 0.245059 0.250000 +vt 0.237154 0.276316 +vt 0.245059 0.256579 +vt 0.245059 0.269737 +vt 0.237154 0.296053 +vt 0.245059 0.276316 +vt 0.245059 0.289474 +vt 0.237154 0.315789 +vt 0.245059 0.296053 +vt 0.245059 0.309211 +vt 0.245059 0.013158 +vt 0.237154 -0.000000 +vt 0.245059 0.000000 +vt 0.237154 0.039474 +vt 0.245059 0.019737 +vt 0.245059 0.032895 +vt 0.245059 0.052632 +vt 0.245059 0.039474 +vt 0.237154 0.078947 +vt 0.245059 0.059211 +vt 0.245059 0.072368 +vt 0.237154 0.098684 +vt 0.245059 0.078947 +vt 0.245059 0.092105 +vt 0.245059 0.111842 +vt 0.245059 0.098684 +vt 0.245059 0.131579 +vt 0.237154 0.118421 +vt 0.245059 0.118421 +vt 0.205534 0.157895 +vt 0.197628 0.138158 +vt 0.205534 0.138158 +vt 0.197628 0.171053 +vt 0.205534 0.177632 +vt 0.197628 0.190789 +vt 0.205534 0.197368 +vt 0.197628 0.210526 +vt 0.205534 0.217105 +vt 0.205534 0.236842 +vt 0.197628 0.217105 +vt 0.197628 0.250000 +vt 0.205534 0.256579 +vt 0.197628 0.269737 +vt 0.205534 0.276316 +vt 0.197628 0.289474 +vt 0.205534 0.296053 +vt 0.197628 0.309211 +vt 0.205534 0.315789 +vt 0.197628 0.013158 +vt 0.205534 0.000000 +vt 0.205534 0.019737 +vt 0.205534 0.039474 +vt 0.197628 0.019737 +vt 0.197628 0.052632 +vt 0.205534 0.059211 +vt 0.197628 0.072368 +vt 0.205534 0.078947 +vt 0.197628 0.092105 +vt 0.205534 0.098684 +vt 0.197628 0.111842 +vt 0.205534 0.118421 +vt 0.197628 0.131579 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.245059 0.368421 +vt 0.213439 0.315789 +vt 0.245059 0.315789 +vt 0.213439 0.368421 +vt 0.055336 0.315789 +vt 0.086957 0.315789 +vt 0.079051 0.296053 +vt 0.086957 0.296053 +vt 0.086957 0.118421 +vt 0.079051 0.131579 +vt 0.079051 0.118421 +vt 0.079051 0.276316 +vt 0.086957 0.276316 +vt 0.079051 0.098684 +vt 0.086957 0.098684 +vt 0.079051 0.256579 +vt 0.086957 0.256579 +vt 0.086957 0.078947 +vt 0.079051 0.092105 +vt 0.079051 0.078947 +vt 0.086957 0.236842 +vt 0.079051 0.217105 +vt 0.086957 0.217105 +vt 0.079051 0.236842 +vt 0.086957 0.059211 +vt 0.079051 0.072368 +vt 0.079051 0.059211 +vt 0.079051 0.197368 +vt 0.086957 0.197368 +vt 0.086957 0.039474 +vt 0.079051 0.052632 +vt 0.079051 0.039474 +vt 0.079051 0.177632 +vt 0.086957 0.177632 +vt 0.079051 0.019737 +vt 0.086957 0.019737 +vt 0.086957 0.157895 +vt 0.079051 0.171053 +vt 0.079051 0.157895 +vt 0.079051 -0.000000 +vt 0.086957 -0.000000 +vt 0.079051 0.138158 +vt 0.086957 0.138158 +vt 0.490119 0.736842 +vt 0.513834 0.690789 +vt 0.513834 0.730263 +vt 0.490119 0.684211 +vt 0.513834 0.638158 +vt 0.513834 0.677632 +vt 0.490119 0.631579 +vt 0.513834 0.585526 +vt 0.513834 0.625000 +vt 0.513834 0.572368 +vt 0.490119 0.526316 +vt 0.513834 0.532895 +vt 0.513834 0.480263 +vt 0.513834 0.519737 +vt 0.513834 0.467105 +vt 0.490119 0.421053 +vt 0.513834 0.427632 +vt 0.513834 0.375000 +vt 0.513834 0.414474 +vt 0.513834 0.361842 +vt 0.490119 0.315789 +vt 0.513834 0.322368 +vt 0.513834 0.309211 +vt 0.490119 0.263158 +vt 0.513834 0.269737 +vt 0.513834 0.256579 +vt 0.490119 0.210526 +vt 0.513834 0.217105 +vt 0.513834 0.203947 +vt 0.490119 0.157895 +vt 0.513834 0.164474 +vt 0.513834 0.151316 +vt 0.490119 0.105263 +vt 0.513834 0.111842 +vt 0.513834 0.059211 +vt 0.513834 0.098684 +vt 0.513834 0.046053 +vt 0.490119 -0.000000 +vt 0.513834 0.006579 +vt 0.513834 0.835526 +vt 0.490119 0.789474 +vt 0.513834 0.796053 +vt 0.014804 0.003666 +vt 0.045228 0.024642 +vt 0.032626 0.075281 +vt 0.513834 0.743421 +vt 0.513834 0.782895 +vt 0.885349 0.519522 +vt 0.875134 0.509705 +vt 0.897233 0.500000 +vt 0.853893 0.519522 +vt 0.843678 0.509705 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.865613 0.315789 +vt 0.873518 0.315789 +vt 0.833992 0.315789 +vt 0.841897 0.500000 +vt 0.833992 0.500000 +vt 0.833992 0.315789 +vt 0.841897 0.500000 +vt 0.833992 0.500000 +vt 0.873518 0.500000 +vt 0.865613 0.315789 +vt 0.873518 0.315789 +vt 0.853893 0.519522 +vt 0.843678 0.509705 +vt 0.865613 0.500000 +vt 0.885349 0.519522 +vt 0.875134 0.509705 +vt 0.897233 0.500000 +vt 0.205534 0.526316 +vt 0.197628 0.546053 +vt 0.197628 0.526316 +vt 0.197628 0.552632 +vt 0.205534 0.578947 +vt 0.197628 0.572368 +vt 0.197628 0.578947 +vt 0.205534 0.605263 +vt 0.197628 0.598684 +vt 0.197628 0.605263 +vt 0.205534 0.631579 +vt 0.197628 0.625000 +vt 0.197628 0.631579 +vt 0.205534 0.657895 +vt 0.197628 0.651316 +vt 0.197628 0.657895 +vt 0.205534 0.684211 +vt 0.197628 0.677632 +vt 0.197628 0.368421 +vt 0.205534 0.394737 +vt 0.197628 0.388158 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.421053 +vt 0.205534 0.447368 +vt 0.197628 0.440789 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.205534 0.473684 +vt 0.197628 0.493421 +vt 0.197628 0.473684 +vt 0.205534 0.500000 +vt 0.197628 0.519737 +vt 0.197628 0.500000 +vt 0.158103 0.369092 +vt 0.178292 0.388493 +vt 0.158103 0.446698 +vt 0.047431 0.157895 +vt 0.039526 0.177632 +vt 0.039526 0.157895 +vt 0.047431 0.098684 +vt 0.039526 0.118421 +vt 0.039526 0.098684 +vt 0.047431 0.197368 +vt 0.047431 0.177632 +vt 0.039526 0.138158 +vt 0.047431 0.138158 +vt 0.047431 0.118421 +vt 0.039526 0.078947 +vt 0.047431 0.078947 +vt 0.031621 0.131579 +vt 0.031621 0.125000 +vt 0.031621 0.111842 +vt 0.031621 0.105263 +vt 0.031621 0.092105 +vt 0.031621 0.085526 +vt 0.039526 0.197368 +vt 0.031621 0.190789 +vt 0.031621 0.184211 +vt 0.031621 0.171053 +vt 0.031621 0.164474 +vt 0.031621 0.151316 +vt 0.031621 0.144737 +vt 0.023068 0.088703 +vt 0.019763 0.091880 +vt 0.016457 0.082350 +vt 1.000000 0.046053 +vt 0.984190 0.230263 +vt 0.984190 0.046053 +vt 0.984190 0.315789 +vt 0.992095 0.289474 +vt 0.992095 0.315789 +vt 0.936759 0.289474 +vt 0.944664 0.315789 +vt 0.936759 0.315789 +vt 0.944664 0.263158 +vt 0.936759 0.263158 +vt 0.984190 0.263158 +vt 0.992095 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.263158 +vt 0.968379 0.250000 +vt 0.960474 0.250000 +vt 0.984190 0.315789 +vt 0.992095 0.289474 +vt 0.992095 0.315789 +vt 0.936759 0.289474 +vt 0.944664 0.315789 +vt 0.936759 0.315789 +vt 0.944664 0.263158 +vt 0.936759 0.263158 +vt 0.984190 0.263158 +vt 0.992095 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.263158 +vt 0.960474 0.250000 +vt 0.968379 0.289474 +vt 0.976285 0.315789 +vt 0.968379 0.315789 +vt 0.952569 0.315789 +vt 0.960474 0.289474 +vt 0.960474 0.315789 +vt 0.952569 0.263158 +vt 0.960474 0.263158 +vt 0.976285 0.263158 +vt 0.976102 0.289411 +vt 0.960474 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.960474 0.250000 +vt 0.968379 0.250000 +vt 0.968379 0.289474 +vt 0.976285 0.315789 +vt 0.968379 0.315789 +vt 0.952569 0.315789 +vt 0.960474 0.289474 +vt 0.960474 0.315789 +vt 0.952569 0.263158 +vt 0.960474 0.263158 +vt 0.976285 0.263158 +vt 0.976285 0.289474 +vt 0.960474 0.263158 +vt 0.968379 0.263158 +vt 0.964427 0.276316 +vt 0.968379 0.250000 +vt 0.960474 0.250000 +vt 0.984190 0.355263 +vt 0.976285 0.381579 +vt 0.976285 0.355263 +vt 0.944664 0.355263 +vt 0.952569 0.381579 +vt 0.944664 0.381579 +vt 0.984190 0.250000 +vt 0.976285 0.250000 +vt 0.952569 0.289474 +vt 0.944664 0.289474 +vt 0.976285 0.328947 +vt 0.984190 0.328947 +vt 0.984190 0.355263 +vt 0.976285 0.381579 +vt 0.976285 0.355263 +vt 0.952569 0.250000 +vt 0.976285 0.250000 +vt 0.984190 0.250000 +vt 0.984190 0.328947 +vt 0.976285 0.328947 +vt 0.944664 0.250000 +vt 0.952569 0.328947 +vt 0.944664 0.328947 +vt 0.984784 0.289312 +vt 0.952569 0.328947 +vt 0.944664 0.328947 +vt 0.952569 0.289474 +vt 0.984190 0.289474 +vt 0.944664 0.355263 +vt 0.952569 0.355263 +vt 0.952569 0.381579 +vt 0.944664 0.381579 +vt 0.952569 0.355263 +vt 0.944664 0.289474 +vt 0.956522 0.046053 +vt 0.972332 0.230263 +vt 0.956522 0.230263 +vt 0.972332 0.046053 +vt 0.944664 0.230263 +vt 0.956522 0.250000 +vt 0.972332 0.250000 +vt 0.972332 0.026316 +vt 0.956522 0.026316 +vt 0.102767 0.526316 +vt 0.110672 0.552632 +vt 0.102767 0.546053 +vt 0.102767 0.552632 +vt 0.110672 0.578947 +vt 0.102767 0.572368 +vt 0.102767 0.578947 +vt 0.110672 0.605263 +vt 0.102767 0.598684 +vt 0.102767 0.605263 +vt 0.110672 0.631579 +vt 0.102767 0.625000 +vt 0.102767 0.631579 +vt 0.110672 0.657895 +vt 0.102767 0.651316 +vt 0.102767 0.657895 +vt 0.110672 0.684211 +vt 0.102767 0.677632 +vt 0.102767 0.368421 +vt 0.110672 0.394737 +vt 0.102767 0.388158 +vt 0.102767 0.414474 +vt 0.102767 0.394737 +vt 0.102767 0.421053 +vt 0.110672 0.447368 +vt 0.102767 0.440789 +vt 0.102767 0.467105 +vt 0.102767 0.447368 +vt 0.110672 0.473684 +vt 0.102767 0.493421 +vt 0.102767 0.473684 +vt 0.110672 0.500000 +vt 0.102767 0.519737 +vt 0.102767 0.500000 +vt 0.137679 0.506469 +vt 0.137679 0.467215 +vt 0.178527 0.467215 +vt 0.869565 0.197368 +vt 0.881423 0.217105 +vt 0.869565 0.217105 +vt 0.881423 0.223684 +vt 0.869565 0.243421 +vt 0.869565 0.223684 +vt 0.885375 0.223684 +vt 0.881423 0.243421 +vt 0.865613 0.223684 +vt 0.865613 0.243421 +vt 0.881423 0.184211 +vt 0.881423 0.197368 +vt 0.869565 0.118421 +vt 0.869565 0.072368 +vt 0.881423 0.072368 +vt 0.869565 0.256579 +vt 0.881423 0.250000 +vt 0.881423 0.256579 +vt 0.869565 0.250000 +vt 0.865613 0.263158 +vt 0.865613 0.250000 +vt 0.885375 0.250000 +vt 0.881423 0.138158 +vt 0.885375 0.177632 +vt 0.865613 0.177632 +vt 0.869565 0.138158 +vt 0.869565 0.184211 +vt 0.873518 0.131579 +vt 0.877470 0.125000 +vt 0.877470 0.131579 +vt 0.885375 0.138158 +vt 0.881423 0.131579 +vt 0.885375 0.131579 +vt 0.865613 0.138158 +vt 0.869565 0.131579 +vt 0.849802 0.828947 +vt 0.841897 0.809211 +vt 0.849802 0.809211 +vt 0.841897 0.789474 +vt 0.849802 0.789474 +vt 0.841897 0.769737 +vt 0.849802 0.769737 +vt 0.841897 0.750000 +vt 0.849802 0.750000 +vt 0.849802 0.730263 +vt 0.841897 0.743421 +vt 0.841897 0.730263 +vt 0.841897 0.710526 +vt 0.849802 0.710526 +vt 0.849802 0.690789 +vt 0.841897 0.703947 +vt 0.841897 0.690789 +vt 0.841897 0.671053 +vt 0.849802 0.671053 +vt 0.849802 0.651316 +vt 0.841897 0.664474 +vt 0.841897 0.651316 +vt 0.849802 0.631579 +vt 0.841897 0.644737 +vt 0.841897 0.631579 +vt 0.849802 0.868421 +vt 0.841897 0.848684 +vt 0.849802 0.848684 +vt 0.841897 0.828947 +vt 0.810292 0.680641 +vt 0.810292 0.635149 +vt 0.833962 0.657895 +vt 0.857871 0.081560 +vt 0.857871 0.076335 +vt 0.860091 0.072641 +vt 0.893281 0.717105 +vt 0.897233 0.736842 +vt 0.893281 0.736842 +vt 0.869479 0.612884 +vt 0.845936 0.612884 +vt 0.845936 0.545011 +vt 0.893281 0.677632 +vt 0.897233 0.697368 +vt 0.893281 0.697368 +vt 0.893281 0.618421 +vt 0.897233 0.598684 +vt 0.897233 0.618421 +vt 0.893281 0.756579 +vt 0.897233 0.776316 +vt 0.893281 0.776316 +vt 0.893281 0.657895 +vt 0.897233 0.638158 +vt 0.897233 0.657895 +vt 0.893281 0.559211 +vt 0.897233 0.539474 +vt 0.897233 0.559211 +vt 0.897233 0.677632 +vt 0.893281 0.578947 +vt 0.893281 0.598684 +vt 0.897233 0.756579 +vt 0.897233 0.717105 +vt 0.897233 0.578947 +vt 0.893281 0.638158 +vt 0.972245 0.550301 +vt 0.995874 0.618421 +vt 0.924988 0.686541 +vt 0.688010 0.657895 +vt 0.711331 0.635484 +vt 0.711331 0.680306 +vt 0.928909 0.405208 +vt 0.934420 0.401409 +vt 0.936703 0.410581 +vt 0.516180 0.670834 +vt 0.529644 0.632017 +vt 0.543109 0.670834 +vt 0.411238 0.697368 +vt 0.418973 0.684493 +vt 0.426708 0.697368 +vt 0.239289 0.634604 +vt 0.239289 0.648291 +vt 0.231066 0.648291 +vt 0.252964 0.638158 +vt 0.249012 0.644737 +vt 0.249012 0.638158 +vt 0.252964 0.657895 +vt 0.249012 0.651316 +vt 0.252964 0.651316 +vt 0.252964 0.664474 +vt 0.249012 0.671053 +vt 0.249012 0.664474 +vt 0.252964 0.677632 +vt 0.252964 0.671053 +vt 0.252964 0.631579 +vt 0.249012 0.631579 +vt 0.252964 0.644737 +vt 0.249012 0.657895 +vt 0.252964 0.684211 +vt 0.249012 0.677632 +vt 0.858186 0.023026 +vt 0.862097 0.007307 +vt 0.880985 0.007307 +vt 0.197628 0.546053 +vt 0.205534 0.526316 +vt 0.197628 0.526316 +vt 0.197628 0.552632 +vt 0.205534 0.578947 +vt 0.205534 0.552632 +vt 0.197628 0.598684 +vt 0.197628 0.578947 +vt 0.197628 0.605263 +vt 0.205534 0.631579 +vt 0.205534 0.605263 +vt 0.197628 0.631579 +vt 0.205534 0.657895 +vt 0.197628 0.657895 +vt 0.205534 0.684211 +vt 0.197628 0.368421 +vt 0.205534 0.394737 +vt 0.205534 0.368421 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.421053 +vt 0.205534 0.447368 +vt 0.205534 0.421053 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.197628 0.493421 +vt 0.205534 0.473684 +vt 0.197628 0.473684 +vt 0.197628 0.519737 +vt 0.205534 0.500000 +vt 0.197628 0.500000 +vt 0.178292 0.427296 +vt 0.158103 0.369092 +vt 0.137913 0.427296 +vt 0.035613 0.417413 +vt 0.029855 0.407829 +vt 0.027747 0.394737 +vt 0.029855 0.381645 +vt 0.035613 0.372061 +vt 0.051344 0.372061 +vt 0.059210 0.394737 +vt 0.057102 0.407829 +vt 0.051344 0.417413 +vt 0.071146 0.506579 +vt 0.071146 0.546053 +vt 0.071146 0.605263 +vt 0.071146 0.407895 +vt 0.071146 0.447368 +vt 0.943923 0.044413 +vt 0.933791 0.051399 +vt 0.929594 0.034534 +vt 0.933791 0.027548 +vt 0.939726 0.027548 +vt 0.936759 0.302632 +vt 0.897233 0.342105 +vt 0.928854 0.078947 +vt 0.909091 0.092105 +vt 0.905138 0.355263 +vt 0.897233 0.342105 +vt 0.936759 0.342105 +vt 0.936759 0.394737 +vt 0.897233 0.105263 +vt 0.434783 0.690789 +vt 0.434783 0.638158 +vt 0.434783 0.625000 +vt 0.434783 0.532895 +vt 0.434783 0.519737 +vt 0.434783 0.427632 +vt 0.434783 0.414474 +vt 0.434783 0.322368 +vt 0.434783 0.269737 +vt 0.434783 0.217105 +vt 0.434783 0.164474 +vt 0.434783 0.111842 +vt 0.434783 0.059211 +vt 0.434783 0.006579 +vt 0.434783 0.796053 +vt 0.434783 0.782895 +vt 0.237154 0.138158 +vt 0.237154 0.177632 +vt 0.237154 0.019737 +vt 0.237154 0.059211 +vt 0.197628 0.151316 +vt 0.197628 0.157895 +vt 0.197628 0.177632 +vt 0.197628 0.197368 +vt 0.197628 0.230263 +vt 0.197628 0.236842 +vt 0.197628 0.256579 +vt 0.197628 0.276316 +vt 0.197628 0.296053 +vt 0.197628 0.000000 +vt 0.197628 0.032895 +vt 0.197628 0.039474 +vt 0.197628 0.059211 +vt 0.197628 0.078947 +vt 0.197628 0.098684 +vt 0.197628 0.118421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.055336 0.368421 +vt 0.079051 0.309211 +vt 0.079051 0.289474 +vt 0.079051 0.111842 +vt 0.079051 0.269737 +vt 0.079051 0.230263 +vt 0.079051 0.250000 +vt 0.079051 0.210526 +vt 0.079051 0.190789 +vt 0.079051 0.032895 +vt 0.079051 0.013158 +vt 0.079051 0.151316 +vt 0.490119 0.578947 +vt 0.490119 0.473684 +vt 0.490119 0.368421 +vt 0.490119 0.052632 +vt 0.490119 0.842105 +vt 0.002202 0.054306 +vt 0.000430 0.039474 +vt 0.002202 0.024642 +vt 0.007250 0.012068 +vt 0.023715 0.000716 +vt 0.032626 0.003666 +vt 0.040181 0.012068 +vt 0.047001 0.039474 +vt 0.045228 0.054306 +vt 0.040181 0.066880 +vt 0.023715 0.078232 +vt 0.014804 0.075281 +vt 0.007250 0.066880 +vt 0.879451 0.516891 +vt 0.897233 0.315789 +vt 0.895565 0.509705 +vt 0.891247 0.516891 +vt 0.864109 0.509705 +vt 0.859792 0.516891 +vt 0.847996 0.516891 +vt 0.841897 0.315789 +vt 0.841897 0.315789 +vt 0.864109 0.509705 +vt 0.859792 0.516891 +vt 0.847996 0.516891 +vt 0.879451 0.516891 +vt 0.897233 0.315789 +vt 0.895565 0.509705 +vt 0.891247 0.516891 +vt 0.205534 0.552632 +vt 0.205534 0.368421 +vt 0.205534 0.421053 +vt 0.146446 0.441499 +vt 0.137913 0.427296 +vt 0.134790 0.407895 +vt 0.137913 0.388493 +vt 0.146446 0.374290 +vt 0.169759 0.374290 +vt 0.181415 0.407895 +vt 0.178292 0.427296 +vt 0.169759 0.441499 +vt 0.031621 0.118421 +vt 0.031621 0.098684 +vt 0.031621 0.078947 +vt 0.031621 0.177632 +vt 0.031621 0.157895 +vt 0.031621 0.138158 +vt 0.017854 0.091028 +vt 0.016457 0.088703 +vt 0.015946 0.085526 +vt 0.017854 0.080024 +vt 0.023068 0.082350 +vt 0.019763 0.079173 +vt 0.021671 0.080024 +vt 0.023580 0.085526 +vt 0.021671 0.091028 +vt 1.000000 0.230263 +vt 0.968379 0.250000 +vt 0.968379 0.263158 +vt 0.968379 0.263158 +vt 0.984190 0.381579 +vt 0.984190 0.381579 +vt 0.944664 0.250000 +vt 0.952569 0.250000 +vt 0.944664 0.046053 +vt 0.110672 0.526316 +vt 0.110672 0.368421 +vt 0.110672 0.421053 +vt 0.158103 0.526096 +vt 0.146311 0.520837 +vt 0.134520 0.486842 +vt 0.146311 0.452847 +vt 0.158103 0.447588 +vt 0.169895 0.452847 +vt 0.181686 0.486842 +vt 0.178527 0.506469 +vt 0.169895 0.520837 +vt 0.885375 0.243421 +vt 0.881423 0.118421 +vt 0.873518 0.125000 +vt 0.865613 0.243421 +vt 0.885375 0.243421 +vt 0.885375 0.263158 +vt 0.865613 0.131579 +vt 0.841897 0.822368 +vt 0.841897 0.802632 +vt 0.841897 0.782895 +vt 0.841897 0.763158 +vt 0.841897 0.723684 +vt 0.841897 0.684211 +vt 0.841897 0.861842 +vt 0.841897 0.842105 +vt 0.831847 0.671027 +vt 0.826072 0.680641 +vt 0.818182 0.684160 +vt 0.804516 0.671027 +vt 0.802402 0.657895 +vt 0.804516 0.644762 +vt 0.818182 0.631630 +vt 0.826072 0.635149 +vt 0.831847 0.644762 +vt 0.863229 0.072641 +vt 0.863229 0.085254 +vt 0.865449 0.076335 +vt 0.865449 0.081560 +vt 0.860091 0.085254 +vt 0.837319 0.598541 +vt 0.834165 0.578947 +vt 0.837319 0.559354 +vt 0.857707 0.539761 +vt 0.869479 0.545011 +vt 0.878096 0.559354 +vt 0.881250 0.578947 +vt 0.878096 0.598541 +vt 0.857707 0.618134 +vt 0.893281 0.539474 +vt 0.989543 0.657750 +vt 0.972245 0.686541 +vt 0.948617 0.697079 +vt 0.907691 0.657750 +vt 0.901359 0.618421 +vt 0.907691 0.579092 +vt 0.924988 0.550301 +vt 0.948617 0.539763 +vt 0.989543 0.579092 +vt 0.703557 0.683773 +vt 0.695784 0.680306 +vt 0.690093 0.670834 +vt 0.690093 0.644956 +vt 0.695784 0.635484 +vt 0.703557 0.632017 +vt 0.717022 0.644956 +vt 0.719104 0.657895 +vt 0.717022 0.670834 +vt 0.934420 0.414381 +vt 0.931192 0.414381 +vt 0.928909 0.410581 +vt 0.931192 0.401409 +vt 0.936703 0.405208 +vt 0.537418 0.680306 +vt 0.529644 0.683773 +vt 0.521871 0.680306 +vt 0.514097 0.657895 +vt 0.516180 0.644956 +vt 0.521871 0.635484 +vt 0.537418 0.635484 +vt 0.543109 0.644956 +vt 0.545191 0.657895 +vt 0.424442 0.706472 +vt 0.418973 0.710243 +vt 0.413503 0.706472 +vt 0.413503 0.688264 +vt 0.424442 0.688264 +vt 0.229363 0.641447 +vt 0.231066 0.634604 +vt 0.235178 0.631769 +vt 0.240992 0.641447 +vt 0.235178 0.651126 +vt 0.249012 0.684211 +vt 0.883881 0.014519 +vt 0.884897 0.023026 +vt 0.883881 0.031534 +vt 0.880985 0.038746 +vt 0.876652 0.043565 +vt 0.871541 0.045257 +vt 0.866430 0.043565 +vt 0.862097 0.038746 +vt 0.859202 0.031534 +vt 0.859202 0.014519 +vt 0.866430 0.002488 +vt 0.871542 0.000796 +vt 0.876652 0.002488 +vt 0.197628 0.572368 +vt 0.197628 0.625000 +vt 0.197628 0.651316 +vt 0.197628 0.677632 +vt 0.197628 0.388158 +vt 0.197628 0.440789 +vt 0.146446 0.441499 +vt 0.158103 0.446698 +vt 0.169759 0.441499 +vt 0.181415 0.407895 +vt 0.178292 0.388493 +vt 0.169759 0.374290 +vt 0.146446 0.374290 +vt 0.137913 0.388493 +vt 0.134790 0.407895 +vt 0.798419 0.473684 +vt 0.513834 0.513158 +vt 0.513834 0.473684 +vt 0.798419 0.513158 +vt 0.513834 0.552632 +vt 0.798419 0.552632 +vt 0.513834 0.592105 +vt 0.798419 0.592105 +vt 0.513834 0.631579 +vt 0.798419 0.000000 +vt 0.513834 0.039474 +vt 0.513834 -0.000000 +vt 0.798419 0.039474 +vt 0.513834 0.078947 +vt 0.798419 0.078947 +vt 0.513834 0.118421 +vt 0.798419 0.118421 +vt 0.513834 0.157895 +vt 0.798419 0.157895 +vt 0.513834 0.197368 +vt 0.798419 0.197368 +vt 0.513834 0.236842 +vt 0.798419 0.236842 +vt 0.513834 0.276316 +vt 0.798419 0.276316 +vt 0.513834 0.315789 +vt 0.798419 0.315789 +vt 0.513834 0.355263 +vt 0.798419 0.355263 +vt 0.513834 0.394737 +vt 0.810277 0.631579 +vt 0.798419 0.631579 +vt 0.798419 0.394737 +vt 0.513834 0.434211 +vt 0.810277 0.513158 +vt 0.833992 0.480263 +vt 0.833992 0.500000 +vt 0.810277 0.197368 +vt 0.810277 0.355263 +vt 0.810277 0.394737 +vt 0.810277 0.552632 +vt 0.810277 0.118421 +vt 0.810277 0.276316 +vt 0.810277 0.315789 +vt 0.810277 0.039474 +vt 0.810277 0.236842 +vt 0.810277 0.434211 +vt 0.798419 0.434211 +vt 0.810277 0.592105 +vt 0.810277 0.157895 +vt 0.810277 0.078947 +vt 0.810277 0.473684 +vt 0.833992 0.440789 +vt 0.833992 0.460526 +vt 0.833992 0.184211 +vt 0.833992 0.539474 +vt 0.833992 0.223684 +vt 0.833992 0.578947 +vt 0.833992 0.243421 +vt 0.833992 0.263158 +vt 0.833992 0.618421 +vt 0.833992 0.302632 +vt 0.833992 0.006579 +vt 0.833992 0.026316 +vt 0.833992 0.322368 +vt 0.833992 0.342105 +vt 0.833992 0.065789 +vt 0.833992 0.381579 +vt 0.833992 0.105263 +vt 0.833992 0.421053 +vt 0.833992 0.144737 +vt 0.897233 0.657895 +vt 0.901186 0.677632 +vt 0.897233 0.677632 +vt 0.897233 0.736842 +vt 0.901186 0.756579 +vt 0.897233 0.756579 +vt 0.897233 0.578947 +vt 0.901186 0.598684 +vt 0.897233 0.598684 +vt 0.901186 0.697368 +vt 0.897233 0.697368 +vt 0.897233 0.717105 +vt 0.901186 0.736842 +vt 0.901186 0.717105 +vt 0.897233 0.539474 +vt 0.901186 0.559211 +vt 0.897233 0.559211 +vt 0.901186 0.618421 +vt 0.897233 0.618421 +vt 0.897233 0.638158 +vt 0.901186 0.657895 +vt 0.901186 0.776316 +vt 0.897233 0.776316 +vt 0.901186 0.578947 +vt 0.944664 0.000000 +vt 0.936759 0.026316 +vt 0.936759 0.000000 +vt 0.992095 0.000000 +vt 0.984190 0.026316 +vt 0.984190 0.000000 +vt 0.976285 0.000000 +vt 0.968379 0.026316 +vt 0.968379 0.000000 +vt 0.960474 0.000000 +vt 0.952569 0.026316 +vt 0.952569 0.000000 +vt 0.928854 0.026316 +vt 0.928854 0.000000 +vt 0.976285 0.026316 +vt 0.960474 0.026316 +vt 0.944664 0.026316 +vt 0.434783 0.394737 +vt 0.403162 0.355263 +vt 0.434783 0.355263 +vt 0.434783 0.039474 +vt 0.403162 0.078947 +vt 0.403162 0.039474 +vt 0.403162 0.315789 +vt 0.434783 0.315789 +vt 0.403162 0.000000 +vt 0.434783 0.000000 +vt 0.403162 0.276316 +vt 0.434783 0.276316 +vt 0.434783 0.631579 +vt 0.403162 0.592105 +vt 0.434783 0.592105 +vt 0.403162 0.236842 +vt 0.434783 0.236842 +vt 0.403162 0.552632 +vt 0.434783 0.552632 +vt 0.403162 0.197368 +vt 0.434783 0.197368 +vt 0.403162 0.513158 +vt 0.434783 0.513158 +vt 0.403162 0.157895 +vt 0.434783 0.157895 +vt 0.434783 0.473684 +vt 0.403162 0.434211 +vt 0.434783 0.434211 +vt 0.403162 0.473684 +vt 0.403162 0.118421 +vt 0.434783 0.118421 +vt 0.403162 0.394737 +vt 0.434783 0.078947 +vt 0.403162 0.315789 +vt 0.245059 0.289474 +vt 0.403162 0.276316 +vt 0.403162 0.039474 +vt 0.245059 0.013158 +vt 0.403162 0.000000 +vt 0.245059 0.342105 +vt 0.245059 0.328947 +vt 0.403162 0.078947 +vt 0.245059 0.052632 +vt 0.403162 0.394737 +vt 0.245059 0.368421 +vt 0.403162 0.355263 +vt 0.403162 0.118421 +vt 0.245059 0.092105 +vt 0.403162 0.434211 +vt 0.245059 0.407895 +vt 0.245059 0.144737 +vt 0.245059 0.131579 +vt 0.403162 0.513158 +vt 0.245059 0.486842 +vt 0.403162 0.473684 +vt 0.245059 0.447368 +vt 0.403162 0.197368 +vt 0.245059 0.171053 +vt 0.403162 0.157895 +vt 0.245059 0.539474 +vt 0.245059 0.526316 +vt 0.245059 0.223684 +vt 0.245059 0.210526 +vt 0.403162 0.552632 +vt 0.245059 0.578947 +vt 0.245059 0.565789 +vt 0.245059 0.250000 +vt 0.403162 0.236842 +vt 0.403162 0.592105 +vt 0.245059 0.618421 +vt 0.245059 0.605263 +vt 0.237154 0.217105 +vt 0.205534 0.197368 +vt 0.237154 0.197368 +vt 0.237154 0.078947 +vt 0.205534 0.059211 +vt 0.237154 0.059211 +vt 0.237154 0.256579 +vt 0.205534 0.236842 +vt 0.237154 0.236842 +vt 0.205534 0.217105 +vt 0.237154 0.098684 +vt 0.205534 0.078947 +vt 0.237154 0.276316 +vt 0.205534 0.256579 +vt 0.237154 0.118421 +vt 0.205534 0.098684 +vt 0.237154 0.296053 +vt 0.205534 0.276316 +vt 0.237154 0.138158 +vt 0.205534 0.118421 +vt 0.237154 0.315789 +vt 0.205534 0.296053 +vt 0.237154 0.157895 +vt 0.205534 0.138158 +vt 0.237154 0.019737 +vt 0.205534 0.000000 +vt 0.237154 -0.000000 +vt 0.237154 0.177632 +vt 0.205534 0.157895 +vt 0.237154 0.039474 +vt 0.205534 0.019737 +vt 0.205534 0.177632 +vt 0.205534 0.039474 +vt 0.134387 0.151316 +vt 0.118577 0.138158 +vt 0.134387 0.138158 +vt 0.134387 0.171053 +vt 0.118577 0.157895 +vt 0.134387 0.157895 +vt 0.118577 0.197368 +vt 0.134387 0.177632 +vt 0.134387 0.190789 +vt 0.118577 0.217105 +vt 0.134387 0.197368 +vt 0.134387 0.210526 +vt 0.118577 0.236842 +vt 0.134387 0.217105 +vt 0.134387 0.230263 +vt 0.134387 0.250000 +vt 0.134387 0.236842 +vt 0.134387 0.269737 +vt 0.118577 0.256579 +vt 0.134387 0.256579 +vt 0.134387 0.289474 +vt 0.118577 0.276316 +vt 0.134387 0.276316 +vt 0.118577 0.315789 +vt 0.134387 0.296053 +vt 0.134387 0.309211 +vt 0.134387 0.013158 +vt 0.118577 -0.000000 +vt 0.134387 -0.000000 +vt 0.118577 0.039474 +vt 0.134387 0.019737 +vt 0.134387 0.032895 +vt 0.118577 0.059211 +vt 0.134387 0.039474 +vt 0.134387 0.052632 +vt 0.118577 0.078947 +vt 0.134387 0.059211 +vt 0.134387 0.072368 +vt 0.134387 0.092105 +vt 0.134387 0.078947 +vt 0.134387 0.111842 +vt 0.118577 0.098684 +vt 0.134387 0.098684 +vt 0.134387 0.118421 +vt 0.134387 0.131579 +vt 0.197628 0.210526 +vt 0.134387 0.197368 +vt 0.197628 0.197368 +vt 0.197628 0.105263 +vt 0.134387 0.092105 +vt 0.197628 0.092105 +vt 0.197628 0.013158 +vt 0.134387 0.000000 +vt 0.197628 0.000000 +vt 0.197628 0.118421 +vt 0.134387 0.105263 +vt 0.197628 0.026316 +vt 0.134387 0.013158 +vt 0.197628 0.131579 +vt 0.134387 0.118421 +vt 0.197628 0.039474 +vt 0.134387 0.026316 +vt 0.197628 0.144737 +vt 0.134387 0.131579 +vt 0.197628 0.052632 +vt 0.134387 0.039474 +vt 0.197628 0.171053 +vt 0.134387 0.157895 +vt 0.197628 0.157895 +vt 0.134387 0.144737 +vt 0.197628 0.065789 +vt 0.134387 0.052632 +vt 0.197628 0.184211 +vt 0.134387 0.171053 +vt 0.197628 0.078947 +vt 0.134387 0.065789 +vt 0.134387 0.184211 +vt 0.134387 0.078947 +vt 0.118577 0.197368 +vt 0.086957 0.177632 +vt 0.118577 0.177632 +vt 0.118577 0.059211 +vt 0.086957 0.039474 +vt 0.118577 0.039474 +vt 0.118577 0.217105 +vt 0.086957 0.197368 +vt 0.118577 0.078947 +vt 0.086957 0.059211 +vt 0.118577 0.256579 +vt 0.086957 0.236842 +vt 0.118577 0.236842 +vt 0.086957 0.217105 +vt 0.118577 0.098684 +vt 0.086957 0.078947 +vt 0.118577 0.276316 +vt 0.086957 0.256579 +vt 0.118577 0.118421 +vt 0.086957 0.098684 +vt 0.118577 0.296053 +vt 0.086957 0.276316 +vt 0.118577 0.138158 +vt 0.086957 0.118421 +vt 0.118577 0.315789 +vt 0.086957 0.296053 +vt 0.118577 0.157895 +vt 0.086957 0.138158 +vt 0.118577 0.019737 +vt 0.086957 -0.000000 +vt 0.118577 -0.000000 +vt 0.086957 0.157895 +vt 0.086957 0.019737 +vt 0.047431 0.026316 +vt 0.079051 0.039474 +vt 0.047431 0.039474 +vt 0.047431 0.131579 +vt 0.079051 0.144737 +vt 0.047431 0.144737 +vt 0.047431 0.013158 +vt 0.079051 0.026316 +vt 0.047431 0.118421 +vt 0.079051 0.131579 +vt 0.047431 -0.000000 +vt 0.079051 0.013158 +vt 0.047431 0.105263 +vt 0.079051 0.118421 +vt 0.047431 0.197368 +vt 0.079051 0.210526 +vt 0.047431 0.210526 +vt 0.047431 0.092105 +vt 0.079051 0.105263 +vt 0.047431 0.184211 +vt 0.079051 0.197368 +vt 0.047431 0.078947 +vt 0.079051 0.092105 +vt 0.047431 0.171053 +vt 0.079051 0.184211 +vt 0.047431 0.065789 +vt 0.079051 0.078947 +vt 0.047431 0.157895 +vt 0.079051 0.171053 +vt 0.079051 0.052632 +vt 0.047431 0.052632 +vt 0.079051 0.065789 +vt 0.079051 0.157895 +vt 0.197628 0.598684 +vt 0.181818 0.578947 +vt 0.197628 0.578947 +vt 0.197628 0.467105 +vt 0.181818 0.447368 +vt 0.197628 0.447368 +vt 0.197628 0.388158 +vt 0.181818 0.368421 +vt 0.197628 0.368421 +vt 0.197628 0.625000 +vt 0.181818 0.605263 +vt 0.197628 0.605263 +vt 0.197628 0.493421 +vt 0.181818 0.473684 +vt 0.197628 0.473684 +vt 0.197628 0.526316 +vt 0.181818 0.546053 +vt 0.181818 0.526316 +vt 0.197628 0.414474 +vt 0.181818 0.394737 +vt 0.197628 0.394737 +vt 0.197628 0.651316 +vt 0.181818 0.631579 +vt 0.197628 0.631579 +vt 0.197628 0.519737 +vt 0.181818 0.500000 +vt 0.197628 0.500000 +vt 0.197628 0.572368 +vt 0.181818 0.552632 +vt 0.197628 0.552632 +vt 0.197628 0.440789 +vt 0.181818 0.421053 +vt 0.197628 0.421053 +vt 0.197628 0.677632 +vt 0.181818 0.657895 +vt 0.197628 0.657895 +vt 0.901186 0.638158 +vt 0.893281 0.638158 +vt 0.881423 0.618421 +vt 0.893281 0.618421 +vt 0.893281 0.578947 +vt 0.881423 0.559211 +vt 0.893281 0.559211 +vt 0.893281 0.717105 +vt 0.881423 0.697368 +vt 0.893281 0.697368 +vt 0.893281 0.756579 +vt 0.881423 0.736842 +vt 0.893281 0.736842 +vt 0.893281 0.657895 +vt 0.881423 0.638158 +vt 0.893281 0.598684 +vt 0.881423 0.578947 +vt 0.893281 0.776316 +vt 0.881423 0.756579 +vt 0.893281 0.677632 +vt 0.881423 0.657895 +vt 0.881423 0.598684 +vt 0.881423 0.539474 +vt 0.893281 0.539474 +vt 0.881423 0.677632 +vt 0.881423 0.717105 +vt 0.205534 0.526316 +vt 0.229249 0.552632 +vt 0.205534 0.552632 +vt 0.205534 0.394737 +vt 0.229249 0.421053 +vt 0.205534 0.421053 +vt 0.205534 0.631579 +vt 0.229249 0.657895 +vt 0.205534 0.657895 +vt 0.205534 0.500000 +vt 0.229249 0.526316 +vt 0.229249 0.578947 +vt 0.205534 0.578947 +vt 0.229249 0.447368 +vt 0.205534 0.447368 +vt 0.229249 0.684211 +vt 0.205534 0.684211 +vt 0.229249 0.605263 +vt 0.205534 0.605263 +vt 0.229249 0.473684 +vt 0.205534 0.473684 +vt 0.205534 0.368421 +vt 0.229249 0.394737 +vt 0.229249 0.631579 +vt 0.229249 0.500000 +vt 0.229249 0.500000 +vt 0.205534 0.473684 +vt 0.205534 0.500000 +vt 0.229249 0.631579 +vt 0.205534 0.605263 +vt 0.205534 0.631579 +vt 0.229249 0.394737 +vt 0.205534 0.368421 +vt 0.205534 0.394737 +vt 0.229249 0.473684 +vt 0.205534 0.447368 +vt 0.229249 0.605263 +vt 0.205534 0.578947 +vt 0.229249 0.684211 +vt 0.205534 0.657895 +vt 0.205534 0.684211 +vt 0.229249 0.447368 +vt 0.205534 0.421053 +vt 0.229249 0.578947 +vt 0.205534 0.552632 +vt 0.229249 0.526316 +vt 0.205534 0.526316 +vt 0.229249 0.657895 +vt 0.229249 0.421053 +vt 0.229249 0.552632 +vt 0.181818 0.657895 +vt 0.197628 0.677632 +vt 0.197628 0.657895 +vt 0.181818 0.421053 +vt 0.197628 0.440789 +vt 0.197628 0.421053 +vt 0.181818 0.552632 +vt 0.197628 0.572368 +vt 0.197628 0.552632 +vt 0.181818 0.500000 +vt 0.197628 0.519737 +vt 0.197628 0.500000 +vt 0.181818 0.631579 +vt 0.197628 0.651316 +vt 0.197628 0.631579 +vt 0.181818 0.394737 +vt 0.197628 0.414474 +vt 0.197628 0.394737 +vt 0.197628 0.526316 +vt 0.181818 0.546053 +vt 0.197628 0.546053 +vt 0.181818 0.473684 +vt 0.197628 0.493421 +vt 0.197628 0.473684 +vt 0.181818 0.605263 +vt 0.197628 0.625000 +vt 0.197628 0.605263 +vt 0.181818 0.368421 +vt 0.197628 0.388158 +vt 0.197628 0.368421 +vt 0.181818 0.447368 +vt 0.197628 0.467105 +vt 0.197628 0.447368 +vt 0.181818 0.578947 +vt 0.197628 0.598684 +vt 0.197628 0.578947 +vt 0.545455 0.710526 +vt 0.687747 0.697368 +vt 0.687747 0.710526 +vt 0.545455 0.697368 +vt 0.687747 0.684211 +vt 0.545455 0.684211 +vt 0.687747 0.671053 +vt 0.545455 0.671053 +vt 0.687747 0.657895 +vt 0.545455 0.657895 +vt 0.687747 0.644737 +vt 0.545455 0.644737 +vt 0.687747 0.631579 +vt 0.545455 0.789474 +vt 0.687747 0.776316 +vt 0.687747 0.789474 +vt 0.545455 0.776316 +vt 0.687747 0.763158 +vt 0.545455 0.763158 +vt 0.687747 0.750000 +vt 0.545455 0.750000 +vt 0.687747 0.736842 +vt 0.873518 0.526316 +vt 0.865613 0.513158 +vt 0.873518 0.513158 +vt 0.545455 0.736842 +vt 0.687747 0.723684 +vt 0.545455 0.723684 +vt 0.833992 0.526316 +vt 0.841897 0.539474 +vt 0.833992 0.539474 +vt 0.833992 0.526316 +vt 0.841897 0.539474 +vt 0.833992 0.539474 +vt 0.873518 0.526316 +vt 0.865613 0.513158 +vt 0.873518 0.513158 +vt 0.833992 0.513158 +vt 0.841897 0.526316 +vt 0.865613 0.539474 +vt 0.865613 0.526316 +vt 0.833992 0.500000 +vt 0.841897 0.513158 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.411067 0.657895 +vt 0.418972 0.664474 +vt 0.411067 0.664474 +vt 0.403162 0.671053 +vt 0.411067 0.677632 +vt 0.403162 0.677632 +vt 0.276680 0.677632 +vt 0.276680 0.671053 +vt 0.418972 0.671053 +vt 0.411067 0.671053 +vt 0.403162 0.664474 +vt 0.276680 0.684211 +vt 0.418972 0.644737 +vt 0.411067 0.651316 +vt 0.411067 0.644737 +vt 0.403162 0.657895 +vt 0.403162 0.631579 +vt 0.276680 0.638158 +vt 0.276680 0.631579 +vt 0.411067 0.638158 +vt 0.418972 0.638158 +vt 0.403162 0.651316 +vt 0.403162 0.638158 +vt 0.276680 0.644737 +vt 0.411067 0.631579 +vt 0.418972 0.631579 +vt 0.403162 0.644737 +vt 0.276680 0.651316 +vt 0.418972 0.677632 +vt 0.411067 0.684211 +vt 0.276680 0.657895 +vt 0.403162 0.684211 +vt 0.276680 0.664474 +vt 0.418972 0.651316 +vt 0.268775 0.677632 +vt 0.434783 0.657895 +vt 0.418972 0.657895 +vt 0.434783 0.684211 +vt 0.418972 0.684211 +vt 0.434783 0.638158 +vt 0.434783 0.664474 +vt 0.434783 0.644737 +vt 0.434783 0.671053 +vt 0.434783 0.677632 +vt 0.434783 0.651316 +vt 0.434783 0.697368 +vt 0.426877 0.684211 +vt 0.434783 0.684211 +vt 0.434783 0.776316 +vt 0.426877 0.763158 +vt 0.434783 0.763158 +vt 0.434783 0.750000 +vt 0.426877 0.736842 +vt 0.434783 0.736842 +vt 0.434783 0.723684 +vt 0.426877 0.710526 +vt 0.434783 0.710526 +vt 0.426877 0.697368 +vt 0.434783 0.789474 +vt 0.426877 0.776316 +vt 0.426877 0.750000 +vt 0.426877 0.723684 +vt 0.268775 0.657895 +vt 0.252964 0.664474 +vt 0.252964 0.657895 +vt 0.268775 0.631579 +vt 0.268775 0.638158 +vt 0.268775 0.644737 +vt 0.268775 0.651316 +vt 0.268775 0.664474 +vt 0.268775 0.671053 +vt 0.252964 0.644737 +vt 0.252964 0.631579 +vt 0.252964 0.671053 +vt 0.252964 0.651316 +vt 0.252964 0.638158 +vt 0.268775 0.684211 +vt 0.252964 0.677632 +vt 0.249012 0.671053 +vt 0.241107 0.664474 +vt 0.249012 0.664474 +vt 0.027668 0.164474 +vt 0.023715 0.171053 +vt 0.023715 0.164474 +vt 0.023715 0.177632 +vt 0.027668 0.184211 +vt 0.023715 0.184211 +vt 0.023715 0.190789 +vt 0.249012 0.657895 +vt 0.241107 0.651316 +vt 0.249012 0.651316 +vt 0.249012 0.644737 +vt 0.241107 0.638158 +vt 0.249012 0.638158 +vt 0.249012 0.684211 +vt 0.241107 0.677632 +vt 0.249012 0.677632 +vt 0.241107 0.657895 +vt 0.241107 0.644737 +vt 0.249012 0.631579 +vt 0.241107 0.631579 +vt 0.241107 0.671053 +vt 0.102767 0.598684 +vt 0.086957 0.578947 +vt 0.102767 0.578947 +vt 0.102767 0.447368 +vt 0.086957 0.467105 +vt 0.086957 0.447368 +vt 0.102767 0.388158 +vt 0.086957 0.368421 +vt 0.102767 0.368421 +vt 0.102767 0.625000 +vt 0.086957 0.605263 +vt 0.102767 0.605263 +vt 0.102767 0.473684 +vt 0.086957 0.493421 +vt 0.086957 0.473684 +vt 0.102767 0.526316 +vt 0.086957 0.546053 +vt 0.086957 0.526316 +vt 0.102767 0.414474 +vt 0.086957 0.394737 +vt 0.102767 0.394737 +vt 0.102767 0.651316 +vt 0.086957 0.631579 +vt 0.102767 0.631579 +vt 0.102767 0.519737 +vt 0.086957 0.500000 +vt 0.102767 0.500000 +vt 0.102767 0.572368 +vt 0.086957 0.552632 +vt 0.102767 0.552632 +vt 0.102767 0.421053 +vt 0.086957 0.440789 +vt 0.086957 0.421053 +vt 0.102767 0.657895 +vt 0.086957 0.677632 +vt 0.086957 0.657895 +vt 0.110672 0.552632 +vt 0.134387 0.526316 +vt 0.134387 0.552632 +vt 0.110672 0.394737 +vt 0.134387 0.421053 +vt 0.110672 0.421053 +vt 0.110672 0.657895 +vt 0.134387 0.631579 +vt 0.134387 0.657895 +vt 0.110672 0.526316 +vt 0.134387 0.500000 +vt 0.134387 0.578947 +vt 0.110672 0.578947 +vt 0.134387 0.447368 +vt 0.110672 0.447368 +vt 0.110672 0.684211 +vt 0.134387 0.684211 +vt 0.134387 0.605263 +vt 0.110672 0.605263 +vt 0.134387 0.473684 +vt 0.110672 0.473684 +vt 0.110672 0.368421 +vt 0.134387 0.394737 +vt 0.110672 0.631579 +vt 0.110672 0.500000 +vt 0.841897 0.848684 +vt 0.833992 0.861842 +vt 0.833992 0.848684 +vt 0.841897 0.789474 +vt 0.833992 0.802632 +vt 0.833992 0.789474 +vt 0.841897 0.730263 +vt 0.833992 0.743421 +vt 0.833992 0.730263 +vt 0.841897 0.644737 +vt 0.833992 0.631579 +vt 0.841897 0.631579 +vt 0.841897 0.822368 +vt 0.833992 0.809211 +vt 0.841897 0.809211 +vt 0.841897 0.763158 +vt 0.833992 0.750000 +vt 0.841897 0.750000 +vt 0.841897 0.664474 +vt 0.833992 0.651316 +vt 0.841897 0.651316 +vt 0.841897 0.703947 +vt 0.833992 0.690789 +vt 0.841897 0.690789 +vt 0.841897 0.842105 +vt 0.833992 0.828947 +vt 0.841897 0.828947 +vt 0.841897 0.769737 +vt 0.833992 0.782895 +vt 0.833992 0.769737 +vt 0.841897 0.684211 +vt 0.833992 0.671053 +vt 0.841897 0.671053 +vt 0.841897 0.723684 +vt 0.833992 0.710526 +vt 0.841897 0.710526 +vt 0.849802 0.750000 +vt 0.881423 0.769737 +vt 0.849802 0.769737 +vt 0.849802 0.651316 +vt 0.881423 0.671053 +vt 0.849802 0.671053 +vt 0.849802 0.690789 +vt 0.881423 0.710526 +vt 0.849802 0.710526 +vt 0.849802 0.828947 +vt 0.881423 0.848684 +vt 0.849802 0.848684 +vt 0.881423 0.789474 +vt 0.849802 0.789474 +vt 0.881423 0.690789 +vt 0.881423 0.730263 +vt 0.849802 0.730263 +vt 0.849802 0.868421 +vt 0.881423 0.868421 +vt 0.881423 0.809211 +vt 0.849802 0.809211 +vt 0.881423 0.750000 +vt 0.881423 0.631579 +vt 0.881423 0.651316 +vt 0.881423 0.828947 +vt 0.881423 0.072368 +vt 0.877470 0.046053 +vt 0.881423 0.046053 +vt 0.889328 0.072368 +vt 0.885375 0.046053 +vt 0.889328 0.046053 +vt 0.865613 0.072368 +vt 0.861660 0.046053 +vt 0.865613 0.046053 +vt 0.873518 0.072368 +vt 0.869565 0.046053 +vt 0.873518 0.046053 +vt 0.857708 0.072368 +vt 0.857708 0.046053 +vt 0.071146 0.368421 +vt 0.086957 0.388158 +vt 0.071146 0.388158 +vt 0.071146 0.546053 +vt 0.086957 0.565789 +vt 0.071146 0.565789 +vt 0.071146 0.447368 +vt 0.086957 0.467105 +vt 0.071146 0.467105 +vt 0.071146 0.486842 +vt 0.086957 0.506579 +vt 0.071146 0.506579 +vt 0.086957 0.407895 +vt 0.071146 0.407895 +vt 0.086957 0.585526 +vt 0.071146 0.585526 +vt 0.086957 0.486842 +vt 0.086957 0.526316 +vt 0.071146 0.526316 +vt 0.086957 0.427632 +vt 0.071146 0.427632 +vt 0.086957 0.605263 +vt 0.071146 0.605263 +vt 0.086957 0.546053 +vt 0.086957 0.447368 +vt 0.063241 0.480263 +vt 0.059289 0.467105 +vt 0.063241 0.467105 +vt 0.063241 0.519737 +vt 0.059289 0.506579 +vt 0.063241 0.506579 +vt 0.063241 0.421053 +vt 0.059289 0.407895 +vt 0.063241 0.407895 +vt 0.063241 0.598684 +vt 0.059289 0.585526 +vt 0.063241 0.585526 +vt 0.063241 0.539474 +vt 0.059289 0.526316 +vt 0.063241 0.526316 +vt 0.063241 0.440789 +vt 0.059289 0.427632 +vt 0.063241 0.427632 +vt 0.063241 0.381579 +vt 0.059289 0.368421 +vt 0.063241 0.368421 +vt 0.063241 0.559211 +vt 0.059289 0.546053 +vt 0.063241 0.546053 +vt 0.063241 0.460526 +vt 0.059289 0.447368 +vt 0.063241 0.447368 +vt 0.063241 0.500000 +vt 0.059289 0.486842 +vt 0.063241 0.486842 +vt 0.063241 0.401316 +vt 0.059289 0.388158 +vt 0.063241 0.388158 +vt 0.063241 0.578947 +vt 0.059289 0.565789 +vt 0.063241 0.565789 +vt 0.924901 0.394737 +vt 0.928854 0.434211 +vt 0.924901 0.434211 +vt 0.905138 0.394737 +vt 0.909091 0.434211 +vt 0.905138 0.434211 +vt 0.897233 0.394737 +vt 0.901186 0.434211 +vt 0.897233 0.434211 +vt 0.913043 0.394737 +vt 0.913043 0.434211 +vt 0.920949 0.394737 +vt 0.920949 0.434211 +vt 0.916996 0.394737 +vt 0.916996 0.434211 +vt 0.865613 0.500000 +vt 0.873518 0.500000 +vt 0.833992 0.500000 +vt 0.841897 0.513158 +vt 0.833992 0.513158 +vt 0.865613 0.539474 +vt 0.865613 0.526316 +vt 0.841897 0.526316 +vt 0.944664 0.401316 +vt 0.948617 0.394737 +vt 0.948617 0.401316 +vt 0.956522 0.401316 +vt 0.960474 0.394737 +vt 0.960474 0.401316 +vt 0.932806 0.401316 +vt 0.936759 0.394737 +vt 0.936759 0.401316 +vt 0.940711 0.401316 +vt 0.944664 0.394737 +vt 0.952569 0.394737 +vt 0.952569 0.401316 +vt 0.956522 0.394737 +vt 0.928854 0.401316 +vt 0.932806 0.394737 +vt 0.940711 0.394737 +vt 0.027668 0.157895 +vt 0.023715 0.157895 +vt 0.023715 0.078947 +vt 0.027668 0.085526 +vt 0.023715 0.085526 +vt 0.027668 0.092105 +vt 0.023715 0.092105 +vt 0.023715 0.098684 +vt 0.027668 0.105263 +vt 0.023715 0.105263 +vt 0.023715 0.111842 +vt 0.027668 0.118421 +vt 0.023715 0.125000 +vt 0.023715 0.118421 +vt 0.027668 0.131579 +vt 0.023715 0.131579 +vt 0.027668 0.138158 +vt 0.023715 0.144737 +vt 0.023715 0.138158 +vt 0.027668 0.144737 +vt 0.023715 0.151316 +vt 0.490119 0.421053 +vt 0.458498 0.368421 +vt 0.490119 0.368421 +vt 0.490119 0.052632 +vt 0.458498 -0.000000 +vt 0.490119 -0.000000 +vt 0.490119 0.473684 +vt 0.458498 0.421053 +vt 0.458498 0.105263 +vt 0.458498 0.052632 +vt 0.490119 0.526316 +vt 0.458498 0.473684 +vt 0.490119 0.157895 +vt 0.490119 0.105263 +vt 0.490119 0.578947 +vt 0.458498 0.526316 +vt 0.458498 0.210526 +vt 0.458498 0.157895 +vt 0.490119 0.631579 +vt 0.458498 0.578947 +vt 0.490119 0.736842 +vt 0.458498 0.684211 +vt 0.490119 0.684211 +vt 0.490119 0.263158 +vt 0.490119 0.210526 +vt 0.458498 0.315789 +vt 0.458498 0.263158 +vt 0.490119 0.789474 +vt 0.458498 0.736842 +vt 0.490119 0.315789 +vt 0.490119 0.842105 +vt 0.458498 0.789474 +vt 0.458498 0.631579 +vt 0.833992 0.019737 +vt 0.841897 0.039474 +vt 0.833992 0.039474 +vt 0.841897 0.138158 +vt 0.857708 0.125000 +vt 0.857708 0.131579 +vt 0.833992 0.197368 +vt 0.841897 0.177632 +vt 0.841897 0.197368 +vt 0.833992 0.059211 +vt 0.841897 0.059211 +vt 0.833992 0.217105 +vt 0.841897 0.217105 +vt 0.841897 0.078947 +vt 0.833992 0.078947 +vt 0.833992 0.236842 +vt 0.841897 0.256579 +vt 0.833992 0.256579 +vt 0.841897 0.236842 +vt 0.833992 0.098684 +vt 0.841897 0.098684 +vt 0.841897 0.276316 +vt 0.833992 0.276316 +vt 0.833992 0.118421 +vt 0.841897 0.118421 +vt 0.833992 0.296053 +vt 0.841897 0.296053 +vt 0.833992 0.138158 +vt 0.841897 0.315789 +vt 0.833992 0.315789 +vt 0.841897 0.157895 +vt 0.833992 0.157895 +vt 0.841897 -0.000000 +vt 0.841897 0.019737 +vt 0.833992 0.177632 +vt 0.857708 0.309211 +vt 0.857708 0.151316 +vt 0.857708 0.013158 +vt 0.857708 0.171053 +vt 0.857708 0.032895 +vt 0.857708 0.184211 +vt 0.857708 0.190789 +vt 0.857708 0.046053 +vt 0.857708 0.052632 +vt 0.857708 0.210526 +vt 0.857708 0.065789 +vt 0.857708 0.072368 +vt 0.857708 0.250000 +vt 0.857708 0.230263 +vt 0.857708 0.092105 +vt 0.857708 0.269737 +vt 0.857708 0.111842 +vt 0.857708 0.289474 +vt 0.031621 0.111842 +vt 0.027668 0.105263 +vt 0.031621 0.105263 +vt 0.031621 0.085526 +vt 0.027668 0.078947 +vt 0.031621 0.078947 +vt 0.031621 0.171053 +vt 0.027668 0.164474 +vt 0.031621 0.164474 +vt 0.031621 0.118421 +vt 0.027668 0.125000 +vt 0.027668 0.118421 +vt 0.031621 0.144737 +vt 0.027668 0.138158 +vt 0.031621 0.138158 +vt 0.027668 0.092105 +vt 0.027668 0.085526 +vt 0.031621 0.177632 +vt 0.027668 0.184211 +vt 0.027668 0.177632 +vt 0.031621 0.131579 +vt 0.031621 0.125000 +vt 0.027668 0.151316 +vt 0.027668 0.144737 +vt 0.027668 0.098684 +vt 0.031621 0.098684 +vt 0.031621 0.190789 +vt 0.031621 0.184211 +vt 0.027668 0.157895 +vt 0.031621 0.157895 +vt 0.810277 0.000000 +vt 0.833992 0.164474 +vt 0.833992 0.519737 +vt 0.833992 0.203947 +vt 0.833992 0.559211 +vt 0.833992 0.598684 +vt 0.833992 0.282895 +vt 0.833992 0.046053 +vt 0.833992 0.361842 +vt 0.833992 0.085526 +vt 0.833992 0.401316 +vt 0.833992 0.125000 +vt 0.901186 0.539474 +vt 0.992095 0.026316 +vt 0.403162 0.631579 +vt 0.245059 0.302632 +vt 0.245059 0.026316 +vt 0.245059 0.065789 +vt 0.245059 0.381579 +vt 0.245059 0.105263 +vt 0.245059 0.421053 +vt 0.245059 0.500000 +vt 0.245059 0.460526 +vt 0.245059 0.184211 +vt 0.245059 0.263158 +vt 0.403162 0.631579 +vt 0.205534 0.315789 +vt 0.118577 0.177632 +vt 0.118577 0.296053 +vt 0.118577 0.019737 +vt 0.118577 0.118421 +vt 0.134387 0.210526 +vt 0.086957 0.315789 +vt 0.079051 -0.000000 +vt 0.181818 0.598684 +vt 0.181818 0.467105 +vt 0.181818 0.388158 +vt 0.181818 0.625000 +vt 0.181818 0.493421 +vt 0.197628 0.546053 +vt 0.181818 0.414474 +vt 0.181818 0.651316 +vt 0.181818 0.519737 +vt 0.181818 0.572368 +vt 0.181818 0.440789 +vt 0.181818 0.677632 +vt 0.881423 0.776316 +vt 0.229249 0.368421 +vt 0.229249 0.368421 +vt 0.181818 0.677632 +vt 0.181818 0.440789 +vt 0.181818 0.572368 +vt 0.181818 0.519737 +vt 0.181818 0.651316 +vt 0.181818 0.414474 +vt 0.181818 0.526316 +vt 0.181818 0.493421 +vt 0.181818 0.625000 +vt 0.181818 0.388158 +vt 0.181818 0.467105 +vt 0.181818 0.598684 +vt 0.545455 0.631579 +vt 0.873518 0.539474 +vt 0.841897 0.500000 +vt 0.434783 0.631579 +vt 0.426877 0.789474 +vt 0.252964 0.684211 +vt 0.027668 0.171053 +vt 0.027668 0.177632 +vt 0.027668 0.190789 +vt 0.241107 0.684211 +vt 0.086957 0.598684 +vt 0.102767 0.467105 +vt 0.086957 0.388158 +vt 0.086957 0.625000 +vt 0.102767 0.493421 +vt 0.102767 0.546053 +vt 0.086957 0.414474 +vt 0.086957 0.651316 +vt 0.086957 0.519737 +vt 0.086957 0.572368 +vt 0.102767 0.440789 +vt 0.102767 0.677632 +vt 0.134387 0.368421 +vt 0.841897 0.861842 +vt 0.841897 0.802632 +vt 0.841897 0.743421 +vt 0.833992 0.644737 +vt 0.833992 0.822368 +vt 0.833992 0.763158 +vt 0.833992 0.664474 +vt 0.833992 0.703947 +vt 0.833992 0.842105 +vt 0.841897 0.782895 +vt 0.833992 0.684211 +vt 0.833992 0.723684 +vt 0.849802 0.631579 +vt 0.877470 0.072368 +vt 0.885375 0.072368 +vt 0.861660 0.072368 +vt 0.869565 0.072368 +vt 0.086957 0.368421 +vt 0.059289 0.480263 +vt 0.059289 0.519737 +vt 0.059289 0.421053 +vt 0.059289 0.598684 +vt 0.059289 0.539474 +vt 0.059289 0.440789 +vt 0.059289 0.381579 +vt 0.059289 0.559211 +vt 0.059289 0.460526 +vt 0.059289 0.500000 +vt 0.059289 0.401316 +vt 0.059289 0.578947 +vt 0.928854 0.394737 +vt 0.909091 0.394737 +vt 0.901186 0.394737 +vt 0.841897 0.500000 +vt 0.873518 0.539474 +vt 0.928854 0.394737 +vt 0.027668 0.078947 +vt 0.027668 0.098684 +vt 0.027668 0.111842 +vt 0.027668 0.125000 +vt 0.027668 0.151316 +vt 0.458498 0.842105 +vt 0.833992 0.000000 +vt 0.857708 0.302632 +vt 0.857708 0.144737 +vt 0.857708 0.006579 +vt 0.857708 0.164474 +vt 0.857708 0.026316 +vt 0.857708 0.203947 +vt 0.857708 0.243421 +vt 0.857708 0.223684 +vt 0.857708 0.085526 +vt 0.857708 0.263158 +vt 0.857708 0.105263 +vt 0.857708 0.282895 +vt 0.027668 0.111842 +vt 0.027668 0.171053 +vt 0.031621 0.092105 +vt 0.027668 0.131579 +vt 0.031621 0.151316 +vt 0.027668 0.190789 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 -0.5000 -0.5000 +vn 0.0000 -0.9487 0.3162 +vn -0.2425 0.0000 0.9701 +vn 0.0000 -1.0000 0.0000 +vn -0.2425 -0.9701 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.2425 0.0000 -0.9701 +vn 0.0000 1.0000 0.0000 +vn -0.2425 0.9701 0.0000 +vn -0.9659 0.1830 -0.1830 +vn 0.9659 -0.1830 0.1830 +vn -0.7071 -0.5000 0.5000 +vn -0.2588 0.6830 -0.6830 +vn 0.7071 0.5000 -0.5000 +vn 0.2588 -0.6830 0.6830 +vn 0.7511 0.4668 -0.4668 +vn 0.8660 0.3536 -0.3536 +vn -0.5000 0.6124 -0.6124 +vn -0.8660 -0.3536 0.3536 +vn 0.5000 -0.6124 0.6124 +vn 0.3204 -0.6698 0.6698 +vn -0.7511 -0.4668 0.4668 +vn -0.3204 0.6698 -0.6698 +vn 0.2588 0.6830 -0.6830 +vn -0.2588 -0.6830 0.6830 +vn -0.9063 0.4226 0.0000 +vn 0.9063 -0.4226 0.0000 +vn 0.2988 0.6409 -0.7071 +vn -0.2988 -0.6409 0.7071 +vn -0.2988 -0.6409 -0.7071 +vn 0.2988 0.6409 0.7071 +vn 0.8522 0.1543 0.5000 +vn 0.4226 0.9063 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.3668 0.0000 -0.9303 +vn 0.0000 -0.3827 -0.9239 +vn 0.3668 -0.3560 -0.8595 +vn 0.3668 -0.6578 -0.6578 +vn 0.0000 -0.9239 -0.3827 +vn 0.3668 -0.8595 -0.3560 +vn 0.3668 -0.9303 0.0000 +vn 0.0000 -0.9239 0.3827 +vn 0.3668 -0.8595 0.3560 +vn 0.3668 -0.6578 0.6578 +vn 0.0000 -0.3827 0.9239 +vn 0.3668 -0.3560 0.8595 +vn 0.3668 0.0000 0.9303 +vn 0.0000 0.3827 0.9239 +vn 0.3668 0.3560 0.8595 +vn 0.3668 0.6578 0.6578 +vn 0.0000 0.9239 0.3827 +vn 0.3668 0.8595 0.3560 +vn 0.3668 0.9303 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.3668 0.8595 -0.3560 +vn 0.8379 -0.5459 0.0000 +vn 0.3668 0.6578 -0.6578 +vn 0.0000 0.3827 -0.9239 +vn 0.8379 -0.2089 -0.5043 +vn 0.9487 0.0000 -0.3162 +vn 0.9487 -0.1210 -0.2922 +vn 0.8379 0.2089 0.5043 +vn 0.8379 0.5043 -0.2089 +vn 0.8379 0.3860 -0.3860 +vn 0.8379 -0.3860 -0.3860 +vn 0.8379 -0.2089 0.5043 +vn 0.8379 0.5043 0.2089 +vn 0.8379 0.5459 0.0000 +vn 0.8379 -0.5043 0.2089 +vn 0.8379 0.3860 0.3860 +vn 0.8379 0.2089 -0.5043 +vn 0.3668 0.3560 -0.8595 +vn 0.8379 -0.5043 -0.2089 +vn 0.8379 0.0000 0.5459 +vn 0.8379 -0.3860 0.3860 +vn 0.8379 0.0000 -0.5459 +vn 0.9487 0.1210 -0.2922 +vn 0.9487 0.1210 0.2922 +vn 0.9487 -0.2236 -0.2236 +vn 0.9487 0.2236 0.2236 +vn 0.9487 -0.2922 -0.1210 +vn 0.9487 0.2922 0.1210 +vn 0.9487 -0.3162 0.0000 +vn 0.9487 0.3162 0.0000 +vn 0.9487 -0.2922 0.1210 +vn 0.9487 0.2922 -0.1210 +vn 0.9487 -0.2236 0.2236 +vn 0.9487 0.2236 -0.2236 +vn 0.9487 -0.1210 0.2922 +vn 0.9487 0.0000 0.3162 +vn 0.0000 -0.8660 0.5000 +vn 0.0000 0.5000 0.8660 +vn 0.0000 0.8660 0.5000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 -0.8660 -0.5000 +vn -0.2425 0.8963 0.3712 +vn -0.2425 -0.8963 0.3713 +vn -0.2425 0.8963 -0.3712 +vn -0.2425 -0.6860 0.6860 +vn -0.2425 -0.8963 0.3712 +vn -0.2425 0.6860 -0.6860 +vn -0.2425 -0.3713 0.8963 +vn -0.2425 0.3712 -0.8963 +vn -0.2425 -0.3712 0.8963 +vn -0.2425 -0.3712 -0.8963 +vn -0.2425 0.3712 0.8963 +vn -0.2425 -0.6860 -0.6860 +vn -0.2425 0.6860 0.6860 +vn -0.2425 -0.8963 -0.3712 +vn -0.2425 -0.8963 -0.3713 +vn 0.4472 0.8944 0.0000 +vn 0.4472 0.8263 0.3423 +vn 0.4472 0.8263 -0.3423 +vn 0.4472 0.6324 -0.6324 +vn 0.4472 0.3423 -0.8263 +vn 0.4472 0.0000 -0.8944 +vn 0.4472 -0.3423 -0.8263 +vn 0.4472 -0.6324 -0.6324 +vn 0.4472 -0.8263 -0.3423 +vn 0.4472 -0.8944 0.0000 +vn 0.4472 -0.8263 0.3423 +vn 0.4472 -0.6324 0.6324 +vn 0.4472 -0.3423 0.8263 +vn 0.4472 0.0000 0.8944 +vn 0.4472 0.3423 0.8263 +vn 0.4472 0.6324 0.6324 +vn -0.8660 0.5000 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -0.8660 -0.5000 0.0000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.8660 -0.5000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.9659 0.2588 0.0000 +vn 0.9659 0.2588 0.0000 +vn 0.7194 0.1447 -0.6794 +vn 0.5293 0.5293 -0.6630 +vn 0.0196 0.0473 -0.9987 +vn -0.4617 -0.4617 -0.7573 +vn -0.1363 -0.6737 -0.7263 +vn 0.1363 -0.6737 -0.7263 +vn -0.0196 0.0473 -0.9987 +vn 0.0473 0.0196 -0.9987 +vn 0.0670 0.0670 -0.9955 +vn 0.1447 0.7194 -0.6794 +vn 0.2048 -0.9788 0.0000 +vn 0.0473 0.0196 0.9987 +vn 0.5293 0.5293 0.6630 +vn 0.0670 0.0670 0.9955 +vn 0.1866 0.9824 0.0000 +vn -0.2048 -0.9788 0.0000 +vn 0.1363 -0.6737 0.7263 +vn -0.4617 -0.4617 0.7573 +vn -0.6737 -0.1363 0.7263 +vn 0.1447 0.7194 0.6794 +vn -0.1363 -0.6737 0.7263 +vn -0.0196 0.0473 0.9987 +vn -0.9788 -0.2048 0.0000 +vn 0.0196 0.0473 0.9987 +vn -0.1447 0.7194 0.6794 +vn -0.6737 -0.1363 -0.7263 +vn -0.1866 0.9824 0.0000 +vn -0.1447 0.7194 -0.6794 +vn 0.7194 0.1447 0.6794 +vn 0.3800 -0.5727 -0.7263 +vn 0.9824 0.1866 0.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 -0.5628 0.8266 0.0000 +vn -0.5000 0.5000 -0.7071 +vn -0.7071 0.7071 0.0000 +vn 0.5473 -0.8369 0.0000 +vn 0.3800 -0.5727 0.7263 +vn -0.4063 0.6110 0.6794 +vn -0.4063 0.6110 -0.6794 +vn 0.7071 -0.7071 0.0000 +vn -0.5000 0.5000 0.7071 +vn 0.5000 -0.5000 0.7071 +vn 0.5000 -0.5000 -0.7071 +vn -0.6830 0.6294 0.3706 +vn -0.6830 0.3706 0.6294 +vn -0.5000 0.1464 0.8535 +vn -0.1830 0.0170 0.9829 +vn -0.8660 0.3535 -0.3535 +vn 0.8660 0.3535 -0.3535 +vn -0.8660 -0.3535 0.3535 +vn 0.5000 0.6124 -0.6124 +vn 0.8660 -0.3535 0.3535 +vn -0.5000 -0.6124 0.6124 +vn 0.7849 -0.3660 0.5000 +vn -0.4531 0.2113 0.8660 +vn -0.7849 0.3660 -0.5000 +vn 0.7849 -0.3660 -0.5000 +vn 0.4531 -0.2113 0.8660 +vn -0.7849 0.3660 0.5000 +vn 0.4531 -0.2113 -0.8660 +vn -0.4531 0.2113 -0.8660 +vn 0.2988 0.6408 -0.7071 +vn -0.4226 -0.9063 0.0000 +vn -0.2988 -0.6408 -0.7071 +vn -0.2988 -0.6408 0.7071 +vn 0.2988 0.6408 0.7071 +vn 0.7071 -0.6408 0.2988 +vn 0.0000 -0.9063 0.4226 +vn -0.7071 0.6408 -0.2988 +vn -0.7071 -0.6408 0.2988 +vn 0.0000 0.9063 -0.4226 +vn 0.7071 0.6408 -0.2988 +vn 0.7071 0.6409 -0.2988 +vn -0.5000 0.8535 0.1464 +vn 0.1830 0.0170 0.9829 +vn 0.5000 0.1464 0.8535 +vn 0.6830 0.3706 0.6294 +vn 0.6830 0.6294 0.3706 +vn 0.5000 0.8535 0.1464 +vn 0.1830 0.9829 0.0170 +vn -0.1830 0.9829 0.0170 +vn 0.4258 -0.8359 0.3462 +vn 0.6788 -0.5192 0.5192 +vn 0.4258 -0.6398 0.6398 +vn 0.6788 0.6784 0.2810 +vn 0.9665 0.1814 0.1814 +vn 0.9665 0.2370 0.0982 +vn 0.4258 0.6398 -0.6398 +vn 0.6788 0.6784 -0.2810 +vn 0.6788 0.5192 -0.5192 +vn 0.4258 -0.3462 0.8359 +vn 0.6788 -0.2810 0.6784 +vn 0.4258 0.3462 -0.8359 +vn 0.6788 0.2810 -0.6784 +vn 0.6788 0.0000 0.7343 +vn 0.4258 0.0000 0.9048 +vn 0.4258 0.0000 -0.9048 +vn 0.6788 -0.2810 -0.6784 +vn 0.4258 -0.3462 -0.8359 +vn 0.6788 0.0000 -0.7343 +vn 0.4258 0.3462 0.8359 +vn 0.6788 0.2810 0.6784 +vn 0.6788 -0.5192 -0.5192 +vn 0.4258 -0.6398 -0.6398 +vn 0.4258 0.6398 0.6398 +vn 0.6788 0.5192 0.5192 +vn 0.4258 -0.8359 -0.3462 +vn 0.6788 -0.6784 -0.2810 +vn 0.4258 0.8359 0.3462 +vn 0.6788 -0.7343 0.0000 +vn 0.4258 -0.9048 0.0000 +vn 0.6788 0.7343 0.0000 +vn 0.4258 0.9048 0.0000 +vn 0.6788 -0.6784 0.2810 +vn 0.4258 0.8359 -0.3462 +vn 0.9665 -0.2566 0.0000 +vn 0.9665 0.2566 0.0000 +vn 0.9665 -0.2370 0.0982 +vn 0.9665 0.2370 -0.0982 +vn 0.9665 -0.1814 0.1814 +vn 0.9665 0.1814 -0.1814 +vn 0.9665 -0.0982 0.2370 +vn 0.9665 0.0982 -0.2370 +vn 0.9665 0.0000 0.2566 +vn 0.9665 -0.0982 -0.2370 +vn 0.9665 0.0000 -0.2566 +vn 0.9665 0.0982 0.2370 +vn 0.9665 -0.1814 -0.1814 +vn 0.9665 -0.2370 -0.0982 +vn -0.9659 -0.1830 0.1830 +vn 0.9659 0.1830 -0.1830 +vn -0.7071 0.5000 -0.5000 +vn 0.7071 -0.5000 0.5000 +s off +f 2299/1246/673 2301/1247/673 2293/1248/673 +f 1129/1249/673 1128/1250/673 1140/1251/673 +f 1128/1250/673 1139/1252/673 1140/1253/673 +f 1139/1254/673 1126/1255/673 1138/1256/673 +f 1126/1255/673 1137/1257/673 1138/1258/673 +f 1137/1259/673 1124/1260/673 1136/1261/673 +f 1124/1260/673 1135/1262/673 1136/1263/673 +f 1123/1264/673 1134/1265/673 1135/1266/673 +f 1122/1267/673 1133/1268/673 1134/1269/673 +f 1121/1270/673 1132/1271/673 1133/1272/673 +f 1132/1273/673 1119/1274/673 1131/1275/673 +f 1119/1274/673 1130/1276/673 1131/1277/673 +f 1148/1278/674 1146/1279/674 1144/1280/674 +f 1130/1281/673 1117/1282/673 1129/1283/673 +f 1167/1284/675 1166/1285/675 1165/1286/675 +f 1171/1287/674 1169/1288/674 1170/1289/674 +f 1167/1284/676 1172/1290/676 1168/1291/676 +f 1166/1285/677 1170/1292/677 1165/1286/677 +f 1171/1287/678 1174/1293/678 1172/1294/678 +f 1165/1286/678 1169/1288/678 1167/1284/678 +f 1177/1295/675 1179/1296/675 1180/1297/675 +f 1176/1298/679 1186/1299/679 1178/1300/679 +f 1179/1301/680 1182/1302/680 1180/1303/680 +f 1182/1302/681 1166/1285/681 1168/1291/681 +f 1179/1304/677 1175/1305/677 1173/1306/677 +f 1176/1298/676 1180/1307/676 1174/1293/676 +f 1179/1301/677 1173/1308/677 1171/1309/677 +f 1182/1302/676 1172/1310/676 1180/1303/676 +f 1183/1311/680 1186/1312/680 1184/1313/680 +f 1177/1314/682 1183/1315/682 1175/1305/682 +f 1176/1298/674 1174/1293/674 1173/1306/674 +f 2055/1316/675 2037/1317/675 2038/1318/675 +f 2054/1319/675 2039/1320/675 2037/1317/675 +f 2039/1320/675 2068/1321/675 2052/1322/675 +f 2068/1323/675 2051/1324/675 2052/1322/675 +f 2051/1324/675 2066/1325/675 2050/1326/675 +f 2066/1327/675 2049/1328/675 2050/1326/675 +f 2049/1328/675 2064/1329/675 2048/1330/675 +f 2064/1331/675 2047/1332/675 2048/1330/675 +f 2063/1333/675 2046/1334/675 2047/1332/675 +f 2062/1335/675 2045/1336/675 2046/1334/675 +f 2061/1337/675 2044/1338/675 2045/1336/675 +f 2060/1339/675 2043/1340/675 2044/1338/675 +f 2059/1341/675 2042/1342/675 2043/1340/675 +f 2058/1343/675 2041/1344/675 2042/1342/675 +f 2057/1345/675 2040/1346/675 2041/1347/675 +f 2040/1346/675 2055/1348/675 2038/1318/675 +f 2097/1349/674 1207/1350/674 1206/1351/674 +f 1205/1352/674 2097/1349/674 1206/1353/674 +f 2099/1354/674 1205/1355/674 1204/1356/674 +f 2100/1357/674 1204/1358/674 1203/1359/674 +f 2085/1360/674 1203/1361/674 1218/1362/674 +f 2086/1363/674 1218/1364/674 1217/1365/674 +f 2087/1366/674 1217/1367/674 1216/1368/674 +f 2088/1369/674 1216/1370/674 1215/1371/674 +f 2089/1372/674 1215/1373/674 1214/1374/674 +f 1213/1375/674 2089/1376/674 1214/1377/674 +f 2091/1378/674 1213/1379/674 1212/1380/674 +f 1211/1381/674 2091/1378/674 1212/1382/674 +f 2093/1383/674 1211/1384/674 1210/1385/674 +f 2094/1386/674 1210/1387/674 1209/1388/674 +f 1208/1389/674 2094/1386/674 1209/1390/674 +f 1207/1391/674 2095/1392/674 1208/1393/674 +f 2113/1394/675 2128/1395/675 2112/1396/675 +f 2130/1397/675 2113/1394/675 2114/1398/675 +f 2131/1399/675 2114/1398/675 2115/1400/675 +f 2132/1401/675 2115/1400/675 2116/1402/675 +f 2101/1403/675 2132/1404/675 2116/1402/675 +f 2118/1405/675 2101/1403/675 2102/1406/675 +f 2119/1407/675 2102/1406/675 2103/1408/675 +f 2120/1409/675 2103/1408/675 2104/1410/675 +f 2121/1411/675 2104/1410/675 2105/1412/675 +f 2122/1413/675 2105/1414/675 2106/1415/675 +f 2107/1416/675 2122/1417/675 2106/1415/675 +f 2124/1418/675 2107/1416/675 2108/1419/675 +f 2125/1420/675 2108/1419/675 2109/1421/675 +f 2126/1422/675 2109/1421/675 2110/1423/675 +f 2127/1424/675 2110/1423/675 2111/1425/675 +f 2128/1426/675 2111/1425/675 2112/1396/675 +f 1268/1427/673 1269/1428/673 1267/1429/673 +f 1270/1430/683 1271/1431/683 1269/1428/683 +f 1274/1432/684 1275/1433/684 1273/1434/684 +f 1276/1435/685 1277/1436/685 1275/1433/685 +f 1280/1437/686 1281/1438/686 1279/1439/686 +f 1282/1440/687 1283/1441/687 1281/1438/687 +f 1286/1442/688 1287/1443/688 1285/1444/688 +f 1288/1445/689 1289/1446/689 1287/1443/689 +f 2169/1447/675 2184/1448/675 2168/1449/675 +f 2175/1450/675 2192/1451/675 2191/1452/675 +f 2168/1449/675 2183/1453/675 2167/1454/675 +f 2175/1450/675 2190/1455/675 2174/1456/675 +f 2167/1454/675 2182/1457/675 2166/1458/675 +f 2173/1459/675 2190/1460/675 2189/1461/675 +f 2165/1462/675 2196/1463/675 2180/1464/675 +f 2166/1458/675 2181/1465/675 2165/1462/675 +f 2172/1466/675 2189/1467/675 2188/1468/675 +f 2180/1464/675 2195/1469/675 2179/1470/675 +f 2171/1471/675 2188/1472/675 2187/1473/675 +f 2179/1470/675 2194/1474/675 2178/1475/675 +f 2171/1471/675 2186/1476/675 2170/1477/675 +f 2177/1478/675 2194/1479/675 2193/1480/675 +f 2170/1477/675 2185/1481/675 2169/1482/675 +f 2177/1478/675 2192/1483/675 2176/1484/675 +f 2231/1485/674 2214/1486/674 2215/1487/674 +f 2230/1488/674 2213/1489/674 2214/1490/674 +f 2229/1491/674 2228/1492/674 2213/1493/674 +f 2228/1494/674 2243/1495/674 2227/1496/674 +f 2243/1495/674 2226/1497/674 2227/1498/674 +f 2226/1499/674 2241/1500/674 2225/1501/674 +f 2241/1500/674 2224/1502/674 2225/1503/674 +f 2224/1504/674 2239/1505/674 2223/1506/674 +f 2223/1507/674 2238/1508/674 2222/1509/674 +f 2222/1510/674 2237/1511/674 2221/1512/674 +f 2221/1513/674 2236/1514/674 2220/1515/674 +f 2220/1516/674 2235/1517/674 2219/1518/674 +f 2235/1517/674 2218/1519/674 2219/1520/674 +f 2218/1521/674 2233/1522/674 2217/1523/674 +f 2217/1524/674 2232/1525/674 2216/1526/674 +f 2200/1527/675 2204/1528/675 2208/1529/675 +f 2232/1525/674 2215/1530/674 2216/1531/674 +f 1523/1532/686 1525/1533/686 1527/1534/686 +f 1533/1535/673 1536/1536/673 1535/1537/673 +f 1526/1538/674 1539/1539/674 1530/1540/674 +f 1531/1541/675 1537/1542/675 1527/1543/675 +f 1550/1544/675 1544/1545/675 1554/1546/675 +f 1555/1547/674 1542/1548/674 1551/1549/674 +f 1548/1550/673 1545/1551/673 1546/1552/673 +f 1558/1553/686 1556/1554/686 1554/1555/686 +f 2401/1556/673 2378/1557/673 2377/1558/673 +f 2378/1559/673 2403/1560/673 2379/1561/673 +f 2379/1562/673 2404/1563/673 2380/1564/673 +f 2380/1565/673 2405/1566/673 2381/1567/673 +f 2381/1568/673 2406/1569/673 2382/1570/673 +f 2382/1571/673 2407/1572/673 2383/1573/673 +f 2383/1574/673 2408/1575/673 2384/1576/673 +f 2408/1575/673 2385/1577/673 2384/1578/673 +f 2385/1579/673 2410/1580/673 2386/1581/673 +f 2410/1580/673 2387/1582/673 2386/1583/673 +f 2411/1584/673 2388/1585/673 2387/1586/673 +f 2412/1587/673 2377/1588/673 2388/1589/673 +f 2395/1590/673 2397/1591/673 2389/1592/673 +f 1696/1593/690 1703/1594/690 1702/1595/690 +f 1699/1596/691 1706/1597/691 1705/1598/691 +f 1698/1599/692 1703/1594/692 1697/1600/692 +f 1696/1593/693 1701/1601/693 1695/1602/693 +f 1695/1602/694 1706/1597/694 1700/1603/694 +f 1699/1596/695 1704/1604/695 1698/1605/695 +f 1701/1601/678 1707/1606/678 1718/1607/678 +f 1706/1597/678 1717/1608/678 1716/1609/678 +f 1705/1598/678 1715/1610/678 1714/1611/678 +f 1704/1612/678 1713/1613/678 1712/1614/678 +f 1703/1594/678 1711/1615/678 1710/1616/678 +f 1702/1595/678 1709/1617/678 1708/1618/678 +f 1729/1619/678 1719/1620/678 1723/1621/678 +f 1744/1622/680 1747/1623/680 1745/1624/680 +f 1736/1625/680 1734/1626/680 1735/1627/680 +f 1732/1628/680 1737/1629/680 1731/1630/680 +f 1741/1631/680 1732/1628/680 1733/1632/680 +f 1734/1626/680 1740/1633/680 1733/1634/680 +f 1741/1635/680 1733/1636/680 1740/1637/680 +f 1743/1638/680 1740/1637/680 1742/1639/680 +f 1753/1640/680 1751/1641/680 1752/1642/680 +f 1749/1643/680 1754/1644/680 1748/1645/680 +f 1758/1646/680 1749/1643/680 1750/1647/680 +f 1751/1641/680 1757/1648/680 1750/1649/680 +f 1758/1650/680 1750/1651/680 1757/1652/680 +f 1759/1653/680 1758/1650/680 1757/1652/680 +f 1764/1654/678 1766/1655/678 1765/1656/678 +f 1767/1657/678 1761/1658/678 1762/1659/678 +f 1761/1658/678 1771/1660/678 1763/1661/678 +f 1764/1654/678 1770/1662/678 1768/1663/678 +f 1771/1664/678 1770/1665/678 1763/1666/678 +f 1770/1665/678 1773/1667/678 1772/1668/678 +f 1777/1669/678 1779/1670/678 1778/1671/678 +f 1780/1672/678 1774/1673/678 1775/1674/678 +f 1774/1673/678 1784/1675/678 1776/1676/678 +f 1777/1669/678 1783/1677/678 1781/1678/678 +f 1784/1679/678 1783/1680/678 1776/1681/678 +f 1785/1682/678 1784/1679/678 1786/1683/678 +f 1734/1684/693 1763/1685/693 1764/1686/693 +f 1749/1687/692 1776/1688/692 1750/1689/692 +f 1742/1690/691 1770/1662/691 1772/1691/691 +f 1758/1646/696 1782/1692/696 1756/1693/696 +f 1734/1684/690 1765/1694/690 1735/1695/690 +f 1751/1696/695 1776/1697/695 1777/1698/695 +f 1741/1631/690 1773/1699/690 1771/1660/690 +f 1757/1648/690 1785/1700/690 1759/1701/690 +f 1735/1695/697 1766/1655/697 1736/1625/697 +f 1752/1702/691 1777/1698/691 1778/1703/691 +f 1760/1704/691 1784/1675/691 1758/1646/691 +f 1737/1629/698 1762/1705/698 1731/1706/698 +f 1753/1640/699 1778/1703/699 1779/1670/699 +f 1736/1625/691 1768/1663/691 1738/1707/691 +f 1754/1644/700 1775/1708/700 1748/1709/700 +f 1737/1629/690 1769/1710/690 1767/1657/690 +f 1755/1711/690 1779/1670/690 1781/1678/690 +f 1732/1712/691 1762/1705/691 1761/1713/691 +f 1738/1707/701 1770/1662/701 1740/1633/701 +f 1756/1693/691 1780/1672/691 1754/1644/691 +f 1732/1712/694 1763/1714/694 1733/1715/694 +f 1748/1709/690 1774/1716/690 1749/1687/690 +f 1741/1631/702 1769/1710/702 1739/1717/702 +f 1755/1711/703 1783/1677/703 1757/1648/703 +f 1788/1718/678 1790/1719/678 1787/1720/678 +f 1747/1623/691 1789/1721/691 1745/1624/691 +f 1746/1722/690 1788/1718/690 1787/1720/690 +f 1746/1723/704 1790/1719/704 1747/1724/704 +f 1745/1725/705 1788/1718/705 1744/1726/705 +f 2341/1727/678 2366/1728/678 2342/1729/678 +f 2342/1730/678 2367/1731/678 2343/1732/678 +f 2343/1733/678 2368/1734/678 2344/1735/678 +f 2344/1736/678 2369/1737/678 2345/1738/678 +f 2345/1739/678 2370/1740/678 2346/1741/678 +f 2346/1742/678 2371/1743/678 2347/1744/678 +f 2347/1745/678 2372/1746/678 2348/1747/678 +f 2372/1746/678 2349/1748/678 2348/1749/678 +f 2349/1750/678 2374/1751/678 2350/1752/678 +f 2374/1751/678 2351/1753/678 2350/1754/678 +f 2375/1755/678 2352/1756/678 2351/1757/678 +f 2376/1758/678 2341/1759/678 2352/1760/678 +f 2355/1761/678 2357/1762/678 2361/1763/678 +f 1856/1764/706 1857/1765/706 1855/1766/706 +f 1859/1767/707 1861/1768/707 1860/1769/707 +f 1857/1770/708 1862/1771/708 1859/1767/708 +f 1855/1772/709 1861/1768/709 1856/1773/709 +f 1856/1764/710 1864/1774/710 1858/1775/710 +f 1855/1766/710 1859/1767/710 1860/1769/710 +f 1867/1776/707 1869/1777/707 1870/1778/707 +f 1869/1779/711 1872/1780/711 1870/1781/711 +f 1862/1771/712 1871/1782/712 1861/1768/712 +f 1869/1779/709 1863/1783/709 1856/1784/709 +f 1872/1780/708 1858/1785/708 1870/1781/708 +f 1866/1786/708 1870/1787/708 1864/1774/708 +f 1869/1788/709 1865/1789/709 1863/1790/709 +f 1873/1791/711 1876/1792/711 1874/1793/711 +f 1868/1794/713 1874/1795/713 1876/1796/713 +f 1867/1797/673 1873/1798/673 1865/1789/673 +f 1866/1786/706 1864/1774/706 1863/1790/706 +f 2312/1799/713 2323/1800/713 2311/1801/713 +f 2311/1801/713 2322/1802/713 2310/1803/713 +f 2310/1803/713 2321/1804/713 2309/1805/713 +f 2309/1805/713 2320/1806/713 2308/1807/713 +f 2307/1808/713 2320/1809/713 2319/1810/713 +f 2307/1808/713 2318/1811/713 2306/1812/713 +f 2305/1813/713 2318/1814/713 2317/1815/713 +f 2305/1813/713 2328/1816/713 2316/1817/713 +f 2315/1818/713 2328/1819/713 2327/1820/713 +f 2314/1821/713 2327/1822/713 2326/1823/713 +f 2314/1824/713 2325/1825/713 2313/1826/713 +f 2313/1826/713 2324/1827/713 2312/1799/713 +f 2333/1828/713 2337/1829/713 2329/1830/713 +f 2561/1831/706 2560/1832/706 2559/1833/706 +f 1925/1834/674 1976/1835/674 1936/1836/674 +f 1941/1837/675 1939/1838/675 1947/1839/675 +f 1927/1840/674 1956/1841/674 1926/1842/674 +f 1930/1843/674 1950/1844/674 1951/1845/674 +f 1935/1846/674 1974/1847/674 1934/1848/674 +f 1928/1849/674 1952/1850/674 1953/1851/674 +f 1933/1852/674 1974/1853/674 1973/1854/674 +f 1927/1840/674 1953/1851/674 1954/1855/674 +f 1932/1856/674 1950/1844/674 1931/1857/674 +f 1936/1836/674 1975/1858/674 1935/1846/674 +f 1926/1842/674 1955/1859/674 1925/1834/674 +f 1933/1852/674 1949/1860/674 1932/1856/674 +f 1929/1861/674 1951/1845/674 1952/1850/674 +f 1979/1862/674 1977/1863/674 1983/1864/674 +f 2475/1865/686 2483/1866/686 2491/1867/686 +f 2465/1868/674 2467/1869/674 2461/1870/674 +f 2490/1871/673 2482/1872/673 2474/1873/673 +f 2593/1874/688 2595/1875/688 2590/1876/688 +f 2584/1877/714 2586/1878/714 2588/1879/714 +f 2568/1880/715 2577/1881/715 2576/1882/715 +f 2571/1883/715 2578/1884/715 2570/1885/715 +f 2572/1886/715 2573/1887/715 2580/1888/715 +f 2566/1889/715 2573/1887/715 2565/1890/715 +f 2567/1891/715 2576/1882/715 2575/1892/715 +f 2570/1885/715 2577/1881/715 2569/1893/715 +f 2571/1883/715 2580/1888/715 2579/1894/715 +f 2567/1895/715 2574/1896/715 2566/1889/715 +f 2285/1897/674 2283/1898/674 2279/1899/674 +f 2555/1900/686 2532/1901/686 2556/1902/686 +f 2555/1903/686 2530/1904/686 2531/1905/686 +f 2553/1906/686 2530/1904/686 2554/1907/686 +f 2553/1908/686 2528/1909/686 2529/1910/686 +f 2552/1911/686 2527/1912/686 2528/1909/686 +f 2551/1913/686 2526/1914/686 2527/1912/686 +f 2550/1915/686 2525/1916/686 2526/1917/686 +f 2548/1918/686 2525/1916/686 2549/1919/686 +f 2548/1920/686 2523/1921/686 2524/1922/686 +f 2546/1923/686 2523/1921/686 2547/1924/686 +f 2545/1925/686 2522/1926/686 2546/1927/686 +f 2556/1928/686 2521/1929/686 2545/1930/686 +f 2534/1931/686 2538/1932/686 2542/1933/686 +f 2293/1248/673 2294/1934/673 2295/1935/673 +f 2295/1935/673 2296/1936/673 2297/1937/673 +f 2297/1937/673 2298/1938/673 2299/1246/673 +f 2299/1246/673 2300/1939/673 2301/1247/673 +f 2301/1247/673 2302/1940/673 2293/1248/673 +f 2302/1940/673 2303/1941/673 2293/1248/673 +f 2303/1941/673 2304/1942/673 2293/1248/673 +f 2293/1248/673 2295/1935/673 2297/1937/673 +f 2297/1937/673 2299/1246/673 2293/1248/673 +f 1129/1249/673 1117/1282/673 1128/1250/673 +f 1128/1250/673 1127/1943/673 1139/1252/673 +f 1139/1254/673 1127/1943/673 1126/1255/673 +f 1126/1255/673 1125/1944/673 1137/1257/673 +f 1137/1259/673 1125/1944/673 1124/1260/673 +f 1124/1260/673 1123/1264/673 1135/1262/673 +f 1123/1264/673 1122/1945/673 1134/1265/673 +f 1122/1267/673 1121/1270/673 1133/1268/673 +f 1121/1270/673 1120/1946/673 1132/1271/673 +f 1132/1273/673 1120/1946/673 1119/1274/673 +f 1119/1274/673 1118/1947/673 1130/1276/673 +f 1148/1278/674 1147/1948/674 1146/1279/674 +f 1146/1279/674 1145/1949/674 1144/1280/674 +f 1144/1280/674 1143/1950/674 1148/1278/674 +f 1143/1950/674 1142/1951/674 1148/1278/674 +f 1142/1951/674 1141/1952/674 1148/1278/674 +f 1130/1281/673 1118/1947/673 1117/1282/673 +f 1167/1284/675 1168/1291/675 1166/1285/675 +f 1171/1287/674 1172/1294/674 1169/1288/674 +f 1167/1284/676 1169/1953/676 1172/1290/676 +f 1166/1285/677 1171/1954/677 1170/1292/677 +f 1171/1287/678 1173/1306/678 1174/1293/678 +f 1165/1286/678 1170/1289/678 1169/1288/678 +f 1180/1297/675 1178/1955/675 1177/1295/675 +f 1178/1955/675 1186/1312/675 1177/1295/675 +f 1186/1312/675 1185/1956/675 1177/1295/675 +f 1176/1298/679 1184/1313/679 1186/1299/679 +f 1179/1301/680 1181/1957/680 1182/1302/680 +f 1182/1302/681 1181/1957/681 1166/1285/681 +f 1179/1304/677 1177/1314/677 1175/1305/677 +f 1176/1298/676 1178/1300/676 1180/1307/676 +f 1171/1309/677 1166/1958/677 1181/1957/677 +f 1181/1957/677 1179/1301/677 1171/1309/677 +f 1168/1959/676 1172/1310/676 1182/1302/676 +f 1172/1310/676 1174/1960/676 1180/1303/676 +f 1183/1311/680 1185/1956/680 1186/1312/680 +f 1177/1314/682 1185/1961/682 1183/1315/682 +f 1173/1306/674 1175/1305/674 1176/1298/674 +f 1175/1305/674 1183/1311/674 1176/1298/674 +f 1183/1311/674 1184/1313/674 1176/1298/674 +f 2055/1316/675 2054/1962/675 2037/1317/675 +f 2054/1319/675 2053/1963/675 2039/1320/675 +f 2039/1320/675 2053/1964/675 2068/1321/675 +f 2068/1323/675 2067/1965/675 2051/1324/675 +f 2051/1324/675 2067/1966/675 2066/1325/675 +f 2066/1327/675 2065/1967/675 2049/1328/675 +f 2049/1328/675 2065/1968/675 2064/1329/675 +f 2064/1331/675 2063/1969/675 2047/1332/675 +f 2063/1333/675 2062/1970/675 2046/1334/675 +f 2062/1335/675 2061/1971/675 2045/1336/675 +f 2061/1337/675 2060/1972/675 2044/1338/675 +f 2060/1339/675 2059/1973/675 2043/1340/675 +f 2059/1341/675 2058/1974/675 2042/1342/675 +f 2058/1343/675 2057/1975/675 2041/1344/675 +f 2057/1345/675 2056/1976/675 2040/1346/675 +f 2040/1346/675 2056/1977/675 2055/1348/675 +f 2097/1349/674 2096/1978/674 1207/1350/674 +f 1205/1352/674 2098/1979/674 2097/1349/674 +f 2099/1354/674 2098/1979/674 1205/1355/674 +f 2100/1357/674 2099/1354/674 1204/1358/674 +f 2085/1360/674 2100/1357/674 1203/1361/674 +f 2086/1363/674 2085/1360/674 1218/1364/674 +f 2087/1366/674 2086/1363/674 1217/1367/674 +f 2088/1369/674 2087/1366/674 1216/1370/674 +f 2089/1372/674 2088/1369/674 1215/1373/674 +f 1213/1375/674 2090/1980/674 2089/1376/674 +f 2091/1378/674 2090/1980/674 1213/1379/674 +f 1211/1381/674 2092/1981/674 2091/1378/674 +f 2093/1383/674 2092/1981/674 1211/1384/674 +f 2094/1386/674 2093/1383/674 1210/1387/674 +f 1208/1389/674 2095/1392/674 2094/1386/674 +f 1207/1391/674 2096/1978/674 2095/1392/674 +f 2113/1394/675 2129/1982/675 2128/1395/675 +f 2130/1397/675 2129/1983/675 2113/1394/675 +f 2131/1399/675 2130/1984/675 2114/1398/675 +f 2132/1401/675 2131/1985/675 2115/1400/675 +f 2101/1403/675 2117/1986/675 2132/1404/675 +f 2118/1405/675 2117/1987/675 2101/1403/675 +f 2119/1407/675 2118/1988/675 2102/1406/675 +f 2120/1409/675 2119/1989/675 2103/1408/675 +f 2121/1411/675 2120/1990/675 2104/1410/675 +f 2122/1413/675 2121/1991/675 2105/1414/675 +f 2107/1416/675 2123/1992/675 2122/1417/675 +f 2124/1418/675 2123/1993/675 2107/1416/675 +f 2125/1420/675 2124/1994/675 2108/1419/675 +f 2126/1422/675 2125/1995/675 2109/1421/675 +f 2127/1424/675 2126/1996/675 2110/1423/675 +f 2128/1426/675 2127/1997/675 2111/1425/675 +f 1268/1427/673 1270/1430/673 1269/1428/673 +f 1270/1430/683 1272/1998/683 1271/1431/683 +f 1274/1432/684 1276/1435/684 1275/1433/684 +f 1276/1435/685 1278/1999/685 1277/1436/685 +f 1280/1437/686 1282/1440/686 1281/1438/686 +f 1282/1440/687 1284/2000/687 1283/1441/687 +f 1286/1442/688 1288/1445/688 1287/1443/688 +f 1288/1445/689 1290/2001/689 1289/1446/689 +f 2169/1447/675 2185/2002/675 2184/1448/675 +f 2175/1450/675 2176/1484/675 2192/1451/675 +f 2168/1449/675 2184/2003/675 2183/1453/675 +f 2175/1450/675 2191/2004/675 2190/1455/675 +f 2167/1454/675 2183/2005/675 2182/1457/675 +f 2173/1459/675 2174/1456/675 2190/1460/675 +f 2165/1462/675 2181/2006/675 2196/1463/675 +f 2166/1458/675 2182/2007/675 2181/1465/675 +f 2172/1466/675 2173/1459/675 2189/1467/675 +f 2180/1464/675 2196/2008/675 2195/1469/675 +f 2171/1471/675 2172/1466/675 2188/1472/675 +f 2179/1470/675 2195/2009/675 2194/1474/675 +f 2171/1471/675 2187/2010/675 2186/1476/675 +f 2177/1478/675 2178/1475/675 2194/1479/675 +f 2170/1477/675 2186/2011/675 2185/1481/675 +f 2177/1478/675 2193/2012/675 2192/1483/675 +f 2231/1485/674 2230/1488/674 2214/1486/674 +f 2230/1488/674 2229/1491/674 2213/1489/674 +f 2229/1491/674 2244/2013/674 2228/1492/674 +f 2228/1494/674 2244/2013/674 2243/1495/674 +f 2243/1495/674 2242/2014/674 2226/1497/674 +f 2226/1499/674 2242/2014/674 2241/1500/674 +f 2241/1500/674 2240/2015/674 2224/1502/674 +f 2224/1504/674 2240/2015/674 2239/1505/674 +f 2223/1507/674 2239/1505/674 2238/1508/674 +f 2222/1510/674 2238/1508/674 2237/1511/674 +f 2221/1513/674 2237/1511/674 2236/1514/674 +f 2220/1516/674 2236/1514/674 2235/1517/674 +f 2235/1517/674 2234/2016/674 2218/1519/674 +f 2218/1521/674 2234/2016/674 2233/1522/674 +f 2217/1524/674 2233/2017/674 2232/1525/674 +f 2212/2018/675 2197/2019/675 2198/2020/675 +f 2198/2020/675 2199/2021/675 2212/2018/675 +f 2199/2021/675 2200/1527/675 2212/2018/675 +f 2200/1527/675 2201/2022/675 2202/2023/675 +f 2202/2023/675 2203/2024/675 2200/1527/675 +f 2203/2024/675 2204/1528/675 2200/1527/675 +f 2204/1528/675 2205/2025/675 2208/1529/675 +f 2205/2025/675 2206/2026/675 2208/1529/675 +f 2206/2026/675 2207/2027/675 2208/1529/675 +f 2208/1529/675 2209/2028/675 2212/2018/675 +f 2209/2028/675 2210/2029/675 2212/2018/675 +f 2210/2029/675 2211/2030/675 2212/2018/675 +f 2212/2018/675 2200/1527/675 2208/1529/675 +f 2232/1525/674 2231/1485/674 2215/1530/674 +f 1523/1532/686 1524/2031/686 1525/1533/686 +f 1525/1533/686 1526/1538/686 1527/1534/686 +f 1526/1538/686 1530/1540/686 1527/1534/686 +f 1530/1540/686 1531/2032/686 1527/1534/686 +f 1527/1534/686 1528/2033/686 1529/2034/686 +f 1529/2034/686 1523/1532/686 1527/1534/686 +f 1534/2035/673 1532/2036/673 1533/1535/673 +f 1533/1535/673 1538/2037/673 1536/1536/673 +f 1536/1536/673 1537/1542/673 1535/1537/673 +f 1537/1542/673 1540/2038/673 1535/1537/673 +f 1540/2038/673 1539/1539/673 1535/1537/673 +f 1535/1537/673 1534/2035/673 1533/1535/673 +f 1526/1538/674 1535/1537/674 1539/1539/674 +f 1531/1541/675 1540/2038/675 1537/1542/675 +f 1550/1544/675 1541/2039/675 1544/1545/675 +f 1555/1547/674 1546/1552/674 1542/1548/674 +f 1547/2040/673 1549/2041/673 1548/1550/673 +f 1548/1550/673 1543/2042/673 1545/1551/673 +f 1545/1551/673 1544/1545/673 1546/1552/673 +f 1544/1545/673 1541/2039/673 1546/1552/673 +f 1541/2039/673 1542/1548/673 1546/1552/673 +f 1546/1552/673 1547/2040/673 1548/1550/673 +f 1558/1553/686 1557/2043/686 1556/1554/686 +f 1556/1554/686 1555/1547/686 1554/1555/686 +f 1555/1547/686 1551/1549/686 1554/1555/686 +f 1551/1549/686 1550/2044/686 1554/1555/686 +f 1554/1555/686 1553/2045/686 1552/2046/686 +f 1552/2046/686 1558/1553/686 1554/1555/686 +f 2401/1556/673 2402/2047/673 2378/1557/673 +f 2378/1559/673 2402/2047/673 2403/1560/673 +f 2379/1562/673 2403/1560/673 2404/1563/673 +f 2380/1565/673 2404/1563/673 2405/1566/673 +f 2381/1568/673 2405/1566/673 2406/1569/673 +f 2382/1571/673 2406/1569/673 2407/1572/673 +f 2383/1574/673 2407/2048/673 2408/1575/673 +f 2408/1575/673 2409/2049/673 2385/1577/673 +f 2385/1579/673 2409/2049/673 2410/1580/673 +f 2410/1580/673 2411/1584/673 2387/1582/673 +f 2411/1584/673 2412/1587/673 2388/1585/673 +f 2412/1587/673 2401/1556/673 2377/1588/673 +f 2389/1592/673 2390/2050/673 2391/2051/673 +f 2391/2051/673 2392/2052/673 2393/2053/673 +f 2393/2053/673 2394/2054/673 2395/1590/673 +f 2395/1590/673 2396/2055/673 2397/1591/673 +f 2397/1591/673 2398/2056/673 2389/1592/673 +f 2398/2056/673 2399/2057/673 2389/1592/673 +f 2399/2057/673 2400/2058/673 2389/1592/673 +f 2389/1592/673 2391/2051/673 2393/2053/673 +f 2393/2053/673 2395/1590/673 2389/1592/673 +f 1696/1593/690 1697/1600/690 1703/1594/690 +f 1699/1596/691 1700/1603/691 1706/1597/691 +f 1698/1599/692 1704/1612/692 1703/1594/692 +f 1696/1593/693 1702/1595/693 1701/1601/693 +f 1695/1602/694 1701/1601/694 1706/1597/694 +f 1699/1596/695 1705/1598/695 1704/1604/695 +f 1717/2059/678 1706/1597/678 1718/1607/678 +f 1706/1597/678 1701/1601/678 1718/1607/678 +f 1715/2060/678 1705/1598/678 1716/1609/678 +f 1705/1598/678 1706/1597/678 1716/1609/678 +f 1713/2061/678 1704/1604/678 1714/1611/678 +f 1704/1604/678 1705/1598/678 1714/1611/678 +f 1711/2062/678 1703/1594/678 1712/1614/678 +f 1703/1594/678 1704/1612/678 1712/1614/678 +f 1709/2063/678 1702/1595/678 1710/1616/678 +f 1702/1595/678 1703/1594/678 1710/1616/678 +f 1707/2064/678 1701/1601/678 1708/1618/678 +f 1701/1601/678 1702/1595/678 1708/1618/678 +f 1719/1620/678 1720/2065/678 1723/1621/678 +f 1720/2065/678 1721/2066/678 1723/1621/678 +f 1721/2066/678 1722/2067/678 1723/1621/678 +f 1723/1621/678 1724/2068/678 1727/2069/678 +f 1724/2068/678 1725/2070/678 1727/2069/678 +f 1725/2070/678 1726/2071/678 1727/2069/678 +f 1727/2069/678 1728/2072/678 1729/1619/678 +f 1729/1619/678 1730/2073/678 1719/1620/678 +f 1727/2069/678 1729/1619/678 1723/1621/678 +f 1744/1622/680 1746/2074/680 1747/1623/680 +f 1736/1625/680 1738/1707/680 1734/1626/680 +f 1732/1628/680 1739/1717/680 1737/1629/680 +f 1741/1631/680 1739/1717/680 1732/1628/680 +f 1734/1626/680 1738/1707/680 1740/1633/680 +f 1743/1638/680 1741/1635/680 1740/1637/680 +f 1753/1640/680 1755/1711/680 1751/1641/680 +f 1749/1643/680 1756/1693/680 1754/1644/680 +f 1758/1646/680 1756/1693/680 1749/1643/680 +f 1751/1641/680 1755/1711/680 1757/1648/680 +f 1759/1653/680 1760/2075/680 1758/1650/680 +f 1764/1654/678 1768/1663/678 1766/1655/678 +f 1767/1657/678 1769/1710/678 1761/1658/678 +f 1761/1658/678 1769/1710/678 1771/1660/678 +f 1764/1654/678 1763/2076/678 1770/1662/678 +f 1770/1665/678 1771/1664/678 1773/1667/678 +f 1777/1669/678 1781/1678/678 1779/1670/678 +f 1780/1672/678 1782/1692/678 1774/1673/678 +f 1774/1673/678 1782/1692/678 1784/1675/678 +f 1777/1669/678 1776/2077/678 1783/1677/678 +f 1785/1682/678 1783/1680/678 1784/1679/678 +f 1734/1684/693 1733/2078/693 1763/1685/693 +f 1749/1687/692 1774/1716/692 1776/1688/692 +f 1742/1690/691 1740/1633/691 1770/1662/691 +f 1758/1646/696 1784/1675/696 1782/1692/696 +f 1734/1684/690 1764/1686/690 1765/1694/690 +f 1751/1696/695 1750/2079/695 1776/1697/695 +f 1741/1631/690 1743/2080/690 1773/1699/690 +f 1757/1648/690 1783/1677/690 1785/1700/690 +f 1735/1695/697 1765/1694/697 1766/1655/697 +f 1752/1702/691 1751/1696/691 1777/1698/691 +f 1760/1704/691 1786/2081/691 1784/1675/691 +f 1737/1629/698 1767/1657/698 1762/1705/698 +f 1753/1640/699 1752/1702/699 1778/1703/699 +f 1736/1625/691 1766/1655/691 1768/1663/691 +f 1754/1644/700 1780/1672/700 1775/1708/700 +f 1737/1629/690 1739/1717/690 1769/1710/690 +f 1755/1711/690 1753/1640/690 1779/1670/690 +f 1732/1712/691 1731/1706/691 1762/1705/691 +f 1738/1707/701 1768/1663/701 1770/1662/701 +f 1756/1693/691 1782/1692/691 1780/1672/691 +f 1732/1712/694 1761/1713/694 1763/1714/694 +f 1748/1709/690 1775/1708/690 1774/1716/690 +f 1741/1631/702 1771/1660/702 1769/1710/702 +f 1755/1711/703 1781/1678/703 1783/1677/703 +f 1788/1718/678 1789/1721/678 1790/1719/678 +f 1747/1623/691 1790/1719/691 1789/1721/691 +f 1746/1722/690 1744/2082/690 1788/1718/690 +f 1746/1723/704 1787/1720/704 1790/1719/704 +f 1745/1725/705 1789/1721/705 1788/1718/705 +f 2341/1727/678 2365/2083/678 2366/1728/678 +f 2342/1730/678 2366/1728/678 2367/1731/678 +f 2343/1733/678 2367/1731/678 2368/1734/678 +f 2344/1736/678 2368/1734/678 2369/1737/678 +f 2345/1739/678 2369/1737/678 2370/1740/678 +f 2346/1742/678 2370/1740/678 2371/1743/678 +f 2347/1745/678 2371/2084/678 2372/1746/678 +f 2372/1746/678 2373/2085/678 2349/1748/678 +f 2349/1750/678 2373/2085/678 2374/1751/678 +f 2374/1751/678 2375/1755/678 2351/1753/678 +f 2375/1755/678 2376/1758/678 2352/1756/678 +f 2376/1758/678 2365/2083/678 2341/1759/678 +f 2353/2086/678 2354/2087/678 2355/1761/678 +f 2355/1761/678 2356/2088/678 2357/1762/678 +f 2357/1762/678 2358/2089/678 2359/2090/678 +f 2359/2090/678 2360/2091/678 2357/1762/678 +f 2360/2091/678 2361/1763/678 2357/1762/678 +f 2361/1763/678 2362/2092/678 2353/2086/678 +f 2362/2092/678 2363/2093/678 2353/2086/678 +f 2363/2093/678 2364/2094/678 2353/2086/678 +f 2353/2086/678 2355/1761/678 2361/1763/678 +f 1856/1764/706 1858/1775/706 1857/1765/706 +f 1859/1767/707 1862/1771/707 1861/1768/707 +f 1857/1770/708 1858/2095/708 1862/1771/708 +f 1855/1772/709 1860/1769/709 1861/1768/709 +f 1856/1764/710 1863/1790/710 1864/1774/710 +f 1855/1766/710 1857/1765/710 1859/1767/710 +f 1870/1778/707 1868/2096/707 1867/1776/707 +f 1868/2096/707 1876/1792/707 1867/1776/707 +f 1876/1792/707 1875/2097/707 1867/1776/707 +f 1869/1779/711 1871/1782/711 1872/1780/711 +f 1862/1771/712 1872/1780/712 1871/1782/712 +f 1856/1784/709 1861/2098/709 1871/1782/709 +f 1871/1782/709 1869/1779/709 1856/1784/709 +f 1862/2099/708 1858/1785/708 1872/1780/708 +f 1858/1785/708 1864/2100/708 1870/1781/708 +f 1866/1786/708 1868/1794/708 1870/1787/708 +f 1869/1788/709 1867/1797/709 1865/1789/709 +f 1873/1791/711 1875/2097/711 1876/1792/711 +f 1868/1794/713 1866/1786/713 1874/1795/713 +f 1867/1797/673 1875/2101/673 1873/1798/673 +f 1863/1790/706 1865/1789/706 1866/1786/706 +f 1865/1789/706 1873/1791/706 1866/1786/706 +f 1873/1791/706 1874/1793/706 1866/1786/706 +f 2312/1799/713 2324/2102/713 2323/1800/713 +f 2311/1801/713 2323/2103/713 2322/1802/713 +f 2310/1803/713 2322/2104/713 2321/1804/713 +f 2309/1805/713 2321/2105/713 2320/1806/713 +f 2307/1808/713 2308/1807/713 2320/1809/713 +f 2307/1808/713 2319/2106/713 2318/1811/713 +f 2305/1813/713 2306/1812/713 2318/1814/713 +f 2305/1813/713 2317/2107/713 2328/1816/713 +f 2315/1818/713 2316/1817/713 2328/1819/713 +f 2314/1821/713 2315/1818/713 2327/1822/713 +f 2314/1824/713 2326/2108/713 2325/1825/713 +f 2313/1826/713 2325/2109/713 2324/1827/713 +f 2329/1830/713 2330/2110/713 2331/2111/713 +f 2331/2111/713 2332/2112/713 2333/1828/713 +f 2333/1828/713 2334/2113/713 2335/2114/713 +f 2335/2114/713 2336/2115/713 2337/1829/713 +f 2337/1829/713 2338/2116/713 2329/1830/713 +f 2338/2116/713 2339/2117/713 2329/1830/713 +f 2339/2117/713 2340/2118/713 2329/1830/713 +f 2329/1830/713 2331/2111/713 2333/1828/713 +f 2333/1828/713 2335/2114/713 2337/1829/713 +f 2559/1833/706 2558/2119/706 2563/2120/706 +f 2558/2119/706 2557/2121/706 2563/2120/706 +f 2557/2121/706 2564/2122/706 2563/2120/706 +f 2563/2120/706 2562/2123/706 2559/1833/706 +f 2562/2123/706 2561/1831/706 2559/1833/706 +f 1925/1834/674 1955/1859/674 1976/1835/674 +f 1939/1838/675 1937/2124/675 1947/1839/675 +f 1937/2124/675 1938/2125/675 1947/1839/675 +f 1938/2125/675 1948/2126/675 1947/1839/675 +f 1947/1839/675 1946/2127/675 1945/2128/675 +f 1945/2128/675 1944/2129/675 1943/2130/675 +f 1943/2130/675 1942/2131/675 1941/1837/675 +f 1941/1837/675 1940/2132/675 1939/1838/675 +f 1947/1839/675 1945/2128/675 1943/2130/675 +f 1943/2130/675 1941/1837/675 1947/1839/675 +f 1927/1840/674 1954/1855/674 1956/1841/674 +f 1930/1843/674 1931/1857/674 1950/1844/674 +f 1935/1846/674 1975/1858/674 1974/1847/674 +f 1928/1849/674 1929/1861/674 1952/1850/674 +f 1933/1852/674 1934/2133/674 1974/1853/674 +f 1927/1840/674 1928/1849/674 1953/1851/674 +f 1932/1856/674 1949/1860/674 1950/1844/674 +f 1936/1836/674 1976/1835/674 1975/1858/674 +f 1926/1842/674 1956/1841/674 1955/1859/674 +f 1933/1852/674 1973/1854/674 1949/1860/674 +f 1929/1861/674 1930/1843/674 1951/1845/674 +f 1977/1863/674 1986/2134/674 1985/2135/674 +f 1985/2135/674 1987/2136/674 1983/1864/674 +f 1983/1864/674 1982/2137/674 1984/2138/674 +f 1984/2138/674 1988/2139/674 1983/1864/674 +f 1988/2139/674 1981/2140/674 1983/1864/674 +f 1981/2140/674 1980/2141/674 1979/1862/674 +f 1979/1862/674 1978/2142/674 1977/1863/674 +f 1977/1863/674 1985/2135/674 1983/1864/674 +f 1981/2140/674 1979/1862/674 1983/1864/674 +f 2491/1867/686 2469/2143/686 2471/2144/686 +f 2471/2144/686 2473/2145/686 2475/1865/686 +f 2475/1865/686 2477/2146/686 2479/2147/686 +f 2479/2147/686 2481/2148/686 2483/1866/686 +f 2483/1866/686 2485/2149/686 2487/2150/686 +f 2487/2150/686 2489/2151/686 2491/1867/686 +f 2491/1867/686 2471/2144/686 2475/1865/686 +f 2475/1865/686 2479/2147/686 2483/1866/686 +f 2483/1866/686 2487/2150/686 2491/1867/686 +f 2461/1870/674 2462/2152/674 2463/2153/674 +f 2463/2153/674 2464/2154/674 2465/1868/674 +f 2465/1868/674 2466/2155/674 2467/1869/674 +f 2467/1869/674 2468/2156/674 2461/1870/674 +f 2461/1870/674 2463/2153/674 2465/1868/674 +f 2474/1873/673 2472/2157/673 2470/2158/673 +f 2470/2158/673 2492/2159/673 2474/1873/673 +f 2492/2159/673 2490/1871/673 2474/1873/673 +f 2490/1871/673 2488/2160/673 2486/2161/673 +f 2486/2161/673 2484/2162/673 2490/1871/673 +f 2484/2162/673 2482/1872/673 2490/1871/673 +f 2482/1872/673 2480/2163/673 2474/1873/673 +f 2480/2163/673 2478/2164/673 2474/1873/673 +f 2478/2164/673 2476/2165/673 2474/1873/673 +f 2590/1876/688 2589/2166/688 2591/2167/688 +f 2591/2167/688 2592/2168/688 2593/1874/688 +f 2593/1874/688 2594/2169/688 2595/1875/688 +f 2595/1875/688 2596/2170/688 2590/1876/688 +f 2590/1876/688 2591/2167/688 2593/1874/688 +f 2588/1879/714 2581/2171/714 2582/2172/714 +f 2582/2172/714 2583/2173/714 2588/1879/714 +f 2583/2173/714 2584/1877/714 2588/1879/714 +f 2584/1877/714 2585/2174/714 2586/1878/714 +f 2586/1878/714 2587/2175/714 2588/1879/714 +f 2568/1880/715 2569/1893/715 2577/1881/715 +f 2571/1883/715 2579/1894/715 2578/1884/715 +f 2572/1886/715 2565/1890/715 2573/1887/715 +f 2566/1889/715 2574/1896/715 2573/1887/715 +f 2567/1891/715 2568/1880/715 2576/1882/715 +f 2570/1885/715 2578/1884/715 2577/1881/715 +f 2571/1883/715 2572/1886/715 2580/1888/715 +f 2567/1895/715 2575/2176/715 2574/1896/715 +f 2279/1899/674 2277/2177/674 2278/2178/674 +f 2278/2178/674 2292/2179/674 2291/2180/674 +f 2291/2180/674 2290/2181/674 2289/2182/674 +f 2289/2182/674 2288/2183/674 2287/2184/674 +f 2287/2184/674 2286/2185/674 2285/1897/674 +f 2285/1897/674 2284/2186/674 2283/1898/674 +f 2283/1898/674 2282/2187/674 2279/1899/674 +f 2282/2187/674 2281/2188/674 2279/1899/674 +f 2281/2188/674 2280/2189/674 2279/1899/674 +f 2279/1899/674 2278/2178/674 2287/2184/674 +f 2278/2178/674 2291/2180/674 2287/2184/674 +f 2291/2180/674 2289/2182/674 2287/2184/674 +f 2287/2184/674 2285/1897/674 2279/1899/674 +f 2555/1900/686 2531/1905/686 2532/1901/686 +f 2555/1903/686 2554/2190/686 2530/1904/686 +f 2553/1906/686 2529/1910/686 2530/1904/686 +f 2553/1908/686 2552/2191/686 2528/1909/686 +f 2552/1911/686 2551/2192/686 2527/1912/686 +f 2551/1913/686 2550/2193/686 2526/1914/686 +f 2550/1915/686 2549/2194/686 2525/1916/686 +f 2548/1918/686 2524/1922/686 2525/1916/686 +f 2548/1920/686 2547/2195/686 2523/1921/686 +f 2546/1923/686 2522/1926/686 2523/1921/686 +f 2545/1925/686 2521/1929/686 2522/1926/686 +f 2556/1928/686 2532/1901/686 2521/1929/686 +f 2542/1933/686 2543/2196/686 2534/1931/686 +f 2543/2196/686 2544/2197/686 2534/1931/686 +f 2544/2197/686 2533/2198/686 2534/1931/686 +f 2534/1931/686 2535/2199/686 2538/1932/686 +f 2535/2199/686 2536/2200/686 2538/1932/686 +f 2536/2200/686 2537/2201/686 2538/1932/686 +f 2538/1932/686 2539/2202/686 2542/1933/686 +f 2539/2202/686 2540/2203/686 2542/1933/686 +f 2540/2203/686 2541/2204/686 2542/1933/686 +s 1 +f 1054/2205/716 1055/2206/717 1053/2207/686 +f 1056/2208/718 1057/2209/680 1055/2206/717 +f 1058/2210/719 1059/2211/720 1057/2209/680 +f 1060/2212/721 1061/2213/684 1059/2211/720 +f 1062/2214/722 1063/2215/723 1061/2216/684 +f 1064/2217/724 1065/2218/677 1063/2215/723 +f 1066/2219/725 1067/2220/726 1065/2218/677 +f 1068/2221/727 1069/2222/673 1067/2220/726 +f 1070/2223/728 1071/2224/729 1069/2222/673 +f 1072/2225/730 1073/2226/678 1071/2224/729 +f 1074/2227/731 1075/2228/732 1073/2226/678 +f 1076/2229/733 1077/2230/688 1075/2228/732 +f 1078/2231/734 1079/2232/735 1077/2230/688 +f 1080/2233/736 1081/2234/676 1079/2232/735 +f 1060/2212/721 1089/2235/737 1062/2236/722 +f 1082/2237/738 1083/2238/739 1081/2234/676 +f 1083/2238/739 1054/2205/716 1053/2207/686 +f 1085/2239/740 1102/2240/741 1101/2241/742 +f 1070/2223/728 1094/2242/743 1072/2225/730 +f 1082/2237/738 1098/2243/744 1099/2244/745 +f 1058/2210/719 1085/2239/740 1087/2245/746 +f 1066/2219/725 1092/2246/747 1068/2221/727 +f 1078/2231/734 1096/2247/748 1097/2248/749 +f 1062/2214/722 1090/2249/750 1064/2217/724 +f 1074/2227/731 1094/2242/743 1095/2250/751 +f 1082/2237/738 1100/2251/752 1084/2252/753 +f 1058/2210/719 1088/2253/754 1060/2212/721 +f 1068/2221/727 1093/2254/755 1070/2223/728 +f 1054/2205/716 1085/2239/740 1056/2208/718 +f 1078/2231/734 1098/2243/744 1080/2233/736 +f 1064/2217/724 1091/2255/756 1066/2219/725 +f 1074/2227/731 1096/2247/748 1076/2229/733 +f 1084/2252/753 1086/2256/757 1054/2205/716 +f 1086/2256/757 1116/2257/758 1102/2258/741 +f 1093/2254/755 1110/2259/759 1094/2242/743 +f 1085/2239/740 1103/2260/760 1087/2245/746 +f 1094/2242/743 1111/2261/761 1095/2250/751 +f 1087/2245/746 1104/2262/762 1088/2253/754 +f 1096/2247/748 1111/2263/761 1112/2264/763 +f 1088/2253/754 1105/2265/764 1089/2235/737 +f 1096/2247/748 1113/2266/765 1097/2248/749 +f 1090/2249/750 1105/2267/764 1106/2268/766 +f 1098/2243/744 1113/2269/765 1114/2270/767 +f 1090/2249/750 1107/2271/768 1091/2255/756 +f 1098/2243/744 1115/2272/769 1099/2244/745 +f 1091/2255/756 1108/2273/770 1092/2246/747 +f 1099/2244/745 1116/2274/758 1100/2251/752 +f 1092/2246/747 1109/2275/771 1093/2254/755 +f 2441/2276/684 2457/2277/772 2442/2278/772 +f 2448/2279/773 2451/2280/774 2447/2281/774 +f 2437/2282/775 2456/2283/686 2438/2284/686 +f 2442/2278/772 2458/2285/776 2444/2286/776 +f 2443/2287/673 2450/2288/773 2448/2279/773 +f 2444/2286/776 2449/2289/673 2443/2287/673 +f 2446/2290/688 2453/2291/777 2445/2292/777 +f 2438/2284/686 2454/2293/778 2439/2294/778 +f 2440/2295/779 2459/2296/684 2441/2276/684 +f 2447/2281/774 2452/2297/688 2446/2298/688 +f 2445/2292/777 2460/2299/775 2437/2282/775 +f 1149/2300/686 1164/2301/680 1156/2302/680 +f 1155/2303/684 1162/2304/677 1154/2305/677 +f 1153/2306/673 1160/2307/678 1152/2308/678 +f 1151/2309/688 1158/2310/676 1150/2311/676 +f 1156/2302/680 1163/2312/684 1155/2313/684 +f 1154/2305/677 1161/2314/673 1153/2306/673 +f 1152/2308/678 1159/2315/688 1151/2309/688 +f 1150/2311/676 1157/2316/686 1149/2300/686 +f 1188/2317/676 2082/2318/735 1189/2319/735 +f 1197/2320/723 2075/2321/677 2074/2322/723 +f 1189/2319/735 2081/2323/688 1190/2324/688 +f 1197/2320/723 2073/2325/684 1198/2326/684 +f 1190/2324/688 2080/2327/732 1191/2328/732 +f 1198/2329/684 2072/2330/720 1199/2331/720 +f 1191/2328/732 2079/2332/678 1192/2333/678 +f 1199/2331/720 2071/2334/680 1200/2335/680 +f 1192/2333/678 2078/2336/729 1193/2337/729 +f 1200/2335/680 2070/2338/717 1201/2339/717 +f 1193/2337/729 2077/2340/673 1194/2341/673 +f 1202/2342/686 2084/2343/739 1187/2344/739 +f 1201/2339/717 2069/2345/686 1202/2342/686 +f 1194/2341/673 2076/2346/726 1195/2347/726 +f 1187/2344/739 2083/2348/676 1188/2317/676 +f 1195/2347/726 2075/2321/677 1196/2349/677 +f 1231/2350/689 1246/2351/780 1230/2352/780 +f 1224/2353/781 1239/2354/685 1223/2355/685 +f 1231/2350/689 1248/2356/782 1247/2357/689 +f 1225/2358/783 1240/2359/784 1224/2353/781 +f 1233/2360/785 1248/2361/782 1232/2362/782 +f 1226/2363/786 1241/2364/783 1225/2358/783 +f 1234/2365/787 1249/2366/785 1233/2360/785 +f 1226/2363/786 1243/2367/683 1242/2368/788 +f 1220/2369/789 1235/2370/687 1219/2371/687 +f 1219/2371/687 1250/2372/787 1234/2365/787 +f 1228/2373/790 1243/2374/683 1227/2375/683 +f 1220/2369/789 1237/2376/791 1236/2377/789 +f 1228/2373/790 1245/2378/792 1244/2379/790 +f 1221/2380/791 1238/2381/793 1237/2382/791 +f 1230/2352/780 1245/2383/792 1229/2384/792 +f 1222/2385/794 1239/2386/685 1238/2387/793 +f 1266/2388/739 1305/2389/676 1265/2390/676 +f 1259/2391/673 1298/2392/726 1258/2393/726 +f 1252/2394/717 1291/2395/686 1251/2396/686 +f 1251/2396/686 1306/2397/739 1266/2388/739 +f 1260/2398/729 1299/2399/673 1259/2391/673 +f 1253/2400/680 1292/2401/717 1252/2394/717 +f 1261/2402/678 1300/2403/729 1260/2398/729 +f 1254/2404/720 1293/2405/680 1253/2400/680 +f 1262/2406/732 1301/2407/678 1261/2402/678 +f 1255/2408/684 1294/2409/720 1254/2404/720 +f 1263/2410/688 1302/2411/732 1262/2406/732 +f 1256/2412/723 1295/2413/684 1255/2414/684 +f 1264/2415/735 1303/2416/688 1263/2410/688 +f 1257/2417/677 1296/2418/723 1256/2412/723 +f 1265/2390/676 1304/2419/735 1264/2415/735 +f 1258/2393/726 1297/2420/677 1257/2417/677 +f 2145/2421/795 2160/2422/796 2144/2423/796 +f 2146/2424/797 2161/2425/795 2145/2426/795 +f 2163/2427/798 2146/2428/797 2147/2429/798 +f 2164/2430/799 2147/2431/798 2148/2432/799 +f 2149/2433/800 2148/2434/799 2133/2435/800 +f 2134/2436/801 2149/2433/800 2133/2437/800 +f 2135/2438/802 2150/2439/801 2134/2440/801 +f 2136/2441/803 2151/2442/802 2135/2443/802 +f 2153/2444/804 2136/2445/803 2137/2446/804 +f 2138/2447/805 2153/2448/804 2137/2449/804 +f 2155/2450/806 2138/2451/805 2139/2452/806 +f 2156/2453/807 2139/2454/806 2140/2455/807 +f 2157/2456/808 2140/2457/807 2141/2458/808 +f 2142/2459/809 2157/2456/808 2141/2460/808 +f 2143/2461/810 2158/2462/809 2142/2463/809 +f 2160/2422/796 2143/2464/810 2144/2465/796 +f 1311/2466/684 1326/2467/720 1310/2468/720 +f 1319/2469/688 1334/2470/732 1318/2471/732 +f 1312/2472/723 1327/2473/684 1311/2474/684 +f 1320/2475/735 1335/2476/688 1319/2469/688 +f 1313/2477/677 1328/2478/723 1312/2472/723 +f 1321/2479/676 1336/2480/735 1320/2475/735 +f 1314/2481/726 1329/2482/677 1313/2477/677 +f 1322/2483/739 1337/2484/676 1321/2479/676 +f 1315/2485/673 1330/2486/726 1314/2481/726 +f 1308/2487/717 1323/2488/686 1307/2489/686 +f 1307/2489/686 1338/2490/739 1322/2483/739 +f 1316/2491/729 1331/2492/673 1315/2485/673 +f 1309/2493/680 1324/2494/717 1308/2487/717 +f 1317/2495/678 1332/2496/729 1316/2491/729 +f 1310/2468/720 1325/2497/680 1309/2493/680 +f 1318/2471/732 1333/2498/678 1317/2495/678 +f 1353/2499/676 1368/2500/735 1352/2501/735 +f 1346/2502/726 1361/2503/677 1345/2504/677 +f 1354/2505/739 1369/2506/676 1353/2499/676 +f 1347/2507/673 1362/2508/726 1346/2502/726 +f 1340/2509/717 1355/2510/686 1339/2511/686 +f 1339/2511/686 1370/2512/739 1354/2505/739 +f 1348/2513/729 1363/2514/673 1347/2507/673 +f 1341/2515/680 1356/2516/717 1340/2509/717 +f 1349/2517/678 1364/2518/729 1348/2513/729 +f 1342/2519/720 1357/2520/680 1341/2515/680 +f 1350/2521/732 1365/2522/678 1349/2517/678 +f 1343/2523/684 1358/2524/720 1342/2519/720 +f 1351/2525/688 1366/2526/732 1350/2521/732 +f 1344/2527/723 1359/2528/684 1343/2529/684 +f 1352/2501/735 1367/2530/688 1351/2525/688 +f 1345/2504/677 1360/2531/723 1344/2527/723 +f 1373/2532/678 1388/2533/729 1372/2534/729 +f 1381/2535/680 1396/2536/717 1380/2537/717 +f 1374/2538/732 1389/2539/678 1373/2532/678 +f 1382/2540/720 1397/2541/680 1381/2535/680 +f 1375/2542/688 1390/2543/732 1374/2538/732 +f 1383/2544/684 1398/2545/720 1382/2540/720 +f 1376/2546/735 1391/2547/688 1375/2548/688 +f 1384/2549/723 1399/2550/684 1383/2544/684 +f 1377/2551/676 1392/2552/735 1376/2546/735 +f 1385/2553/677 1400/2554/723 1384/2549/723 +f 1378/2555/739 1393/2556/676 1377/2551/676 +f 1386/2557/726 1401/2558/677 1385/2553/677 +f 1379/2559/686 1394/2560/739 1378/2555/739 +f 1372/2534/729 1387/2561/673 1371/2562/673 +f 1371/2562/673 1402/2563/726 1386/2557/726 +f 1380/2537/717 1395/2564/686 1379/2559/686 +f 1406/2565/675 1417/2566/811 1405/2567/811 +f 1413/2568/812 1424/2569/674 1412/2570/674 +f 1410/2571/813 1421/2572/684 1409/2573/684 +f 1407/2574/814 1418/2575/675 1406/2576/675 +f 1414/2577/815 1425/2578/812 1413/2579/812 +f 1403/2580/688 1416/2581/816 1415/2582/688 +f 1411/2583/817 1422/2584/813 1410/2585/813 +f 1408/2586/818 1419/2587/814 1407/2588/814 +f 1403/2589/688 1426/2590/815 1414/2591/815 +f 1405/2592/811 1416/2593/816 1404/2594/816 +f 1412/2595/674 1423/2596/817 1411/2597/817 +f 1409/2598/684 1420/2599/818 1408/2600/818 +f 2439/2294/778 2455/2601/779 2440/2295/779 +f 2417/2602/774 2430/2603/773 2418/2604/773 +f 2420/2605/776 2433/2606/772 2421/2607/772 +f 2413/2608/686 2425/2609/775 2414/2610/775 +f 2423/2611/779 2436/2612/778 2424/2613/778 +f 2416/2614/688 2429/2615/774 2417/2602/774 +f 2419/2616/673 2432/2617/776 2420/2605/776 +f 2422/2618/684 2435/2619/779 2423/2611/779 +f 2415/2620/777 2428/2621/688 2416/2614/688 +f 2418/2604/773 2431/2622/673 2419/2616/673 +f 2421/2607/772 2434/2623/684 2422/2624/684 +f 2414/2610/775 2427/2625/777 2415/2620/777 +f 2424/2613/778 2426/2626/686 2413/2608/686 +f 1427/2627/688 1440/2628/816 1428/2629/816 +f 1434/2630/813 1447/2631/817 1435/2632/817 +f 1431/2633/814 1444/2634/818 1432/2635/818 +f 1438/2636/815 1439/2637/688 1427/2627/688 +f 1428/2629/816 1441/2638/811 1429/2639/811 +f 1435/2632/817 1448/2640/674 1436/2641/674 +f 1432/2635/818 1445/2642/684 1433/2643/684 +f 1429/2639/811 1442/2644/675 1430/2645/675 +f 1436/2641/674 1449/2646/812 1437/2647/812 +f 1433/2648/684 1446/2649/813 1434/2630/813 +f 1430/2645/675 1443/2650/814 1431/2633/814 +f 1437/2647/812 1450/2651/815 1438/2636/815 +f 1451/2652/815 1464/2653/812 1463/2654/815 +f 1458/2655/814 1471/2656/675 1470/2657/814 +f 1455/2658/813 1468/2659/684 1467/2660/813 +f 1452/2661/812 1465/2662/674 1464/2653/812 +f 1459/2663/675 1472/2664/811 1471/2656/675 +f 1456/2665/684 1469/2666/818 1468/2667/684 +f 1453/2668/674 1466/2669/817 1465/2662/674 +f 1460/2670/811 1473/2671/816 1472/2664/811 +f 1462/2672/688 1463/2654/815 1474/2673/688 +f 1457/2674/818 1470/2657/814 1469/2666/818 +f 1454/2675/817 1467/2660/813 1466/2669/817 +f 1461/2676/816 1474/2673/688 1473/2671/816 +f 1481/2677/818 1492/2678/684 1493/2679/818 +f 1478/2680/817 1489/2681/674 1490/2682/817 +f 1485/2683/816 1496/2684/811 1497/2685/816 +f 1475/2686/815 1498/2687/688 1487/2688/815 +f 1482/2689/814 1493/2690/818 1494/2691/814 +f 1479/2692/813 1490/2693/817 1491/2694/813 +f 1498/2695/688 1485/2696/816 1497/2697/816 +f 1476/2698/812 1487/2699/815 1488/2700/812 +f 1483/2701/675 1494/2702/814 1495/2703/675 +f 1480/2704/684 1491/2705/813 1492/2706/684 +f 1477/2707/674 1488/2708/812 1489/2709/674 +f 1484/2710/811 1495/2711/675 1496/2712/811 +f 1500/2713/688 1501/2714/815 1499/2715/688 +f 1502/2716/815 1503/2717/812 1501/2714/815 +f 1504/2718/812 1505/2719/674 1503/2717/812 +f 1506/2720/674 1507/2721/817 1505/2719/674 +f 1508/2722/817 1509/2723/813 1507/2721/817 +f 1510/2724/813 1511/2725/684 1509/2723/813 +f 1512/2726/684 1513/2727/818 1511/2728/684 +f 1514/2729/818 1515/2730/814 1513/2727/818 +f 1516/2731/814 1517/2732/675 1515/2730/814 +f 1518/2733/675 1519/2734/811 1517/2732/675 +f 2505/2735/815 2497/2736/812 2504/2737/812 +f 1520/2738/811 1521/2739/816 1519/2734/811 +f 1522/2740/816 1499/2715/688 1521/2739/816 +f 2500/2741/816 2498/2742/688 2506/2743/688 +f 2513/2744/816 2515/2745/688 2507/2746/688 +f 2508/2747/815 2516/2748/812 2509/2749/812 +f 2512/2750/811 2520/2751/816 2513/2744/816 +f 2508/2747/815 2515/2752/688 2514/2753/815 +f 2511/2754/819 2518/2755/811 2512/2750/811 +f 2509/2749/812 2517/2756/820 2510/2757/820 +f 1581/2758/715 1590/2759/821 1582/2760/822 +f 1562/2761/823 1559/2762/824 1564/2763/825 +f 1562/2761/823 1563/2764/826 1561/2765/827 +f 1582/2760/822 1584/2766/828 1560/2767/829 +f 1560/2767/829 1576/2768/830 1582/2760/822 +f 1564/2763/825 1565/2769/831 1563/2764/826 +f 1587/2770/832 1580/2771/833 1579/2772/834 +f 1582/2760/822 1574/2773/835 1581/2758/715 +f 1566/2774/836 1567/2775/837 1565/2776/831 +f 1587/2770/832 1578/2777/838 1586/2778/839 +f 1580/2771/833 1574/2773/835 1572/2779/840 +f 1568/2780/841 1569/2781/842 1567/2775/837 +f 1586/2778/839 1577/2782/714 1585/2783/843 +f 1579/2772/834 1572/2779/840 1570/2784/844 +f 1570/2784/844 1571/2785/845 1569/2781/842 +f 1583/2786/846 1577/2787/714 1559/2762/824 +f 1577/2782/714 1568/2780/841 1566/2774/836 +f 1572/2779/840 1573/2788/847 1571/2785/845 +f 1578/2777/838 1570/2784/844 1568/2780/841 +f 1564/2763/825 1577/2787/714 1566/2789/836 +f 1574/2773/835 1575/2790/848 1573/2788/847 +f 1588/2791/849 1581/2758/715 1580/2771/833 +f 1584/2766/828 1559/2762/824 1560/2767/829 +f 1576/2768/830 1561/2765/827 1575/2790/848 +f 1616/2792/850 1561/2765/827 1563/2764/826 +f 1588/2791/849 1597/2793/674 1589/2794/851 +f 1583/2786/846 1593/2795/675 1585/2796/843 +f 1585/2783/843 1594/2797/852 1586/2778/839 +f 1589/2794/851 1598/2798/853 1590/2759/821 +f 1586/2778/839 1595/2799/673 1587/2770/832 +f 1590/2759/821 1592/2800/686 1584/2766/828 +f 1584/2766/828 1591/2801/854 1583/2786/846 +f 1587/2770/832 1596/2802/855 1588/2791/849 +f 1606/2803/853 1613/2804/674 1605/2805/674 +f 1604/2806/855 1611/2807/673 1603/2808/673 +f 1602/2809/852 1609/2810/675 1601/2811/675 +f 1599/2812/854 1608/2813/686 1600/2814/686 +f 1600/2814/686 1614/2815/853 1606/2803/853 +f 1605/2816/674 1612/2817/855 1604/2806/855 +f 1603/2808/673 1610/2818/852 1602/2809/852 +f 1601/2811/675 1607/2819/854 1599/2812/854 +f 1621/2820/856 1630/2821/857 1629/2822/858 +f 1565/2769/831 1616/2792/850 1563/2764/826 +f 1567/2775/837 1617/2823/859 1565/2776/831 +f 1569/2781/842 1618/2824/860 1567/2775/837 +f 1571/2785/845 1619/2825/842 1569/2781/842 +f 1573/2788/847 1620/2826/861 1571/2785/845 +f 1622/2827/862 1573/2788/847 1575/2790/848 +f 1615/2828/827 1575/2790/848 1561/2765/827 +f 1620/2826/861 1627/2829/673 1619/2825/842 +f 1618/2824/860 1625/2830/863 1617/2823/859 +f 1616/2792/850 1623/2831/686 1615/2828/827 +f 1622/2827/862 1623/2831/686 1630/2821/857 +f 1620/2826/861 1629/2822/858 1628/2832/864 +f 1619/2825/842 1626/2833/865 1618/2824/860 +f 1617/2834/859 1624/2835/866 1616/2792/850 +f 1631/2836/686 1646/2837/857 1638/2838/857 +f 2612/2839/867 2601/2840/868 2600/2841/867 +f 2601/2842/868 2614/2843/869 2602/2844/869 +f 2614/2843/869 2603/2845/870 2602/2844/869 +f 1637/2846/858 1644/2847/864 1636/2848/864 +f 1635/2849/673 1642/2850/865 1634/2851/865 +f 1633/2852/863 1640/2853/866 1632/2854/866 +f 1637/2846/858 1646/2837/857 1645/2855/858 +f 1636/2848/864 1643/2856/673 1635/2849/673 +f 1633/2857/863 1642/2850/865 1641/2858/863 +f 1632/2854/866 1639/2859/686 1631/2836/686 +f 1650/2860/675 1661/2861/871 1649/2862/871 +f 1656/2863/674 1669/2864/872 1668/2865/674 +f 1654/2866/700 1665/2867/677 1653/2868/677 +f 1651/2869/873 1662/2870/675 1650/2871/675 +f 1657/2872/872 1670/2873/874 1669/2874/872 +f 1647/2875/676 1660/2876/698 1659/2877/676 +f 1655/2878/875 1666/2879/700 1654/2880/700 +f 1652/2881/876 1663/2882/873 1651/2883/873 +f 1647/2884/676 1670/2885/874 1658/2886/874 +f 1649/2887/871 1660/2888/698 1648/2889/698 +f 1655/2890/875 1668/2891/674 1667/2892/875 +f 1652/2893/876 1665/2894/677 1664/2895/876 +f 1672/2896/698 1683/2897/676 1684/2898/698 +f 1678/2899/700 1691/2900/875 1679/2901/875 +f 1676/2902/876 1687/2903/873 1688/2904/876 +f 1671/2905/676 1694/2906/874 1683/2897/676 +f 1672/2896/698 1685/2907/871 1673/2908/871 +f 1679/2901/875 1692/2909/674 1680/2910/674 +f 1677/2911/677 1688/2904/876 1689/2912/677 +f 1673/2908/871 1686/2913/675 1674/2914/675 +f 1680/2910/674 1693/2915/872 1681/2916/872 +f 1677/2917/677 1690/2918/700 1678/2899/700 +f 1674/2914/675 1687/2903/873 1675/2919/873 +f 1682/2920/874 1693/2915/872 1694/2906/874 +f 1811/2921/877 1824/2922/707 1823/2923/877 +f 1808/2924/878 1821/2925/673 1820/2926/878 +f 1805/2927/879 1818/2928/706 1817/2929/879 +f 1813/2930/880 1824/2931/707 1812/2932/707 +f 1810/2933/881 1821/2934/673 1809/2935/673 +f 1807/2936/882 1818/2937/706 1806/2938/706 +f 1814/2939/883 1825/2940/880 1813/2941/880 +f 1804/2942/884 1815/2943/686 1803/2944/686 +f 1811/2945/877 1822/2946/881 1810/2947/881 +f 1807/2948/882 1820/2949/878 1819/2950/882 +f 1803/2951/686 1826/2952/883 1814/2953/883 +f 1805/2954/879 1816/2955/884 1804/2956/884 +f 1794/2957/706 1831/2958/882 1795/2959/882 +f 1801/2960/880 1838/2961/883 1802/2962/883 +f 1791/2963/686 1828/2964/884 1792/2965/884 +f 1798/2966/881 1835/2967/877 1799/2968/877 +f 1795/2959/882 1832/2969/878 1796/2970/878 +f 1791/2963/686 1838/2961/883 1827/2971/686 +f 1792/2965/884 1829/2972/879 1793/2973/879 +f 1800/2974/707 1835/2967/877 1836/2975/707 +f 1796/2970/878 1833/2976/673 1797/2977/673 +f 1794/2957/706 1829/2972/879 1830/2978/706 +f 1801/2960/880 1836/2979/707 1837/2980/880 +f 1797/2977/673 1834/2981/881 1798/2966/881 +f 1854/2982/686 1839/2983/885 1846/2984/686 +f 1852/2985/886 1845/2986/887 1844/2987/886 +f 1850/2988/673 1843/2989/888 1842/2990/673 +f 1848/2991/713 1841/2992/889 1840/2993/713 +f 1845/2986/887 1854/2982/686 1846/2984/686 +f 1843/2989/888 1852/2994/886 1844/2995/886 +f 1841/2992/889 1850/2988/673 1842/2990/673 +f 1839/2983/885 1848/2991/713 1840/2993/713 +f 1895/2996/684 1908/2997/813 1896/2998/813 +f 1892/2999/675 1905/3000/814 1893/3001/814 +f 1899/3002/812 1912/3003/815 1900/3004/815 +f 1889/3005/688 1902/3006/816 1890/3007/816 +f 1896/2998/813 1909/3008/817 1897/3009/817 +f 1893/3001/814 1906/3010/818 1894/3011/818 +f 1900/3004/815 1901/3012/688 1889/3005/688 +f 1890/3007/816 1903/3013/811 1891/3014/811 +f 1897/3009/817 1910/3015/674 1898/3016/674 +f 1894/3011/818 1907/3017/684 1895/3018/684 +f 1891/3014/811 1904/3019/675 1892/2999/675 +f 1898/3016/674 1911/3020/812 1899/3002/812 +f 1877/3021/688 1924/3022/815 1888/3023/815 +f 1879/3024/811 1914/3025/816 1878/3026/816 +f 1886/3027/674 1921/3028/817 1885/3029/817 +f 1883/3030/684 1918/3031/818 1882/3032/818 +f 1880/3033/675 1915/3034/811 1879/3035/811 +f 1887/3036/812 1922/3037/674 1886/3038/674 +f 1884/3039/813 1919/3040/684 1883/3041/684 +f 1881/3042/814 1916/3043/675 1880/3044/675 +f 1888/3045/815 1923/3046/812 1887/3047/812 +f 1878/3048/816 1913/3049/688 1877/3050/688 +f 1885/3051/817 1920/3052/813 1884/3053/813 +f 1882/3054/818 1917/3055/814 1881/3056/814 +f 1968/3057/890 1961/3058/891 1960/3059/890 +f 1971/3060/675 1964/3061/892 1963/3062/675 +f 1969/3063/891 1962/3064/893 1961/3065/891 +f 1964/3061/892 1965/3066/894 1957/3067/894 +f 1967/3068/674 1960/3059/890 1959/3069/674 +f 1962/3064/893 1971/3060/675 1963/3062/675 +f 1966/3070/895 1959/3069/674 1958/3071/896 +f 1957/3067/894 1966/3070/895 1958/3071/896 +f 2504/2737/812 2496/3072/820 2503/3073/820 +f 2502/3074/819 2495/3075/811 2501/3076/811 +f 2505/2735/815 2498/3077/688 2499/3078/815 +f 2501/3076/811 2493/3079/816 2500/2741/816 +f 1991/3080/688 1998/3081/676 1990/3082/676 +f 1996/3083/680 2003/3084/684 1995/3085/684 +f 1994/3086/677 2001/3087/673 1993/3088/673 +f 1992/3089/678 1999/3090/688 1991/3080/688 +f 1990/3082/676 1997/3091/686 1989/3092/686 +f 1989/3092/686 2004/3093/680 1996/3083/680 +f 1995/3094/684 2002/3095/677 1994/3086/677 +f 1993/3088/673 2000/3096/678 1992/3089/678 +f 2611/3097/897 2600/2841/867 2599/3098/897 +f 2603/3099/870 2616/3100/898 2604/3101/898 +f 2604/3101/898 2617/3102/899 2605/3103/899 +f 2605/3104/899 2618/3105/900 2606/3106/900 +f 2618/3105/900 2607/3107/901 2606/3106/900 +f 2619/3108/901 2608/3109/902 2607/3110/901 +f 2608/3109/902 2609/3111/903 2597/3112/903 +f 2609/3113/903 2598/3114/904 2597/3115/903 +f 2610/3116/904 2599/3117/897 2598/3114/904 +f 2017/3118/688 2032/3119/732 2016/3120/732 +f 2010/3121/723 2025/3122/684 2009/3123/684 +f 2018/3124/735 2033/3125/688 2017/3118/688 +f 2010/3121/723 2027/3126/677 2026/3127/723 +f 2019/3128/676 2034/3129/735 2018/3124/735 +f 2012/3130/726 2027/3126/677 2011/3131/677 +f 2020/3132/739 2035/3133/676 2019/3128/676 +f 2012/3130/726 2029/3134/673 2028/3135/726 +f 2005/3136/686 2036/3137/739 2020/3132/739 +f 2007/3138/680 2021/3139/717 2006/3140/717 +f 2014/3141/729 2029/3134/673 2013/3142/673 +f 2014/3141/729 2031/3143/678 2030/3144/729 +f 2008/3145/720 2022/3146/680 2007/3138/680 +f 2016/3120/732 2031/3143/678 2015/3147/678 +f 2009/3148/684 2024/3149/720 2008/3145/720 +f 2005/3136/686 2021/3139/717 2023/3150/686 +f 2250/3151/905 2267/3152/906 2251/3153/907 +f 2272/3154/908 2287/3155/909 2288/3156/910 +f 2259/3157/911 2274/3158/912 2275/3159/913 +f 2252/3160/914 2267/3152/906 2268/3161/915 +f 2260/3162/916 2275/3159/913 2276/3163/917 +f 2252/3160/914 2269/3164/918 2253/3165/919 +f 2246/3166/920 2261/3167/921 2245/3168/922 +f 2246/3166/920 2276/3163/917 2262/3169/923 +f 2254/3170/924 2269/3164/918 2270/3171/925 +f 2245/3168/922 2263/3172/926 2247/3173/927 +f 2255/3174/928 2270/3171/925 2271/3175/929 +f 2248/3176/930 2263/3172/926 2264/3177/931 +f 2255/3174/928 2272/3154/908 2256/3178/932 +f 2248/3176/930 2265/3179/933 2249/3180/934 +f 2256/3178/932 2273/3181/935 2257/3182/936 +f 2250/3151/905 2265/3183/933 2266/3184/937 +f 2258/3185/938 2273/3181/935 2274/3158/912 +f 2264/3177/931 2281/3186/939 2265/3179/933 +f 2272/3154/908 2289/3187/940 2273/3181/935 +f 2265/3183/933 2282/3188/941 2266/3184/937 +f 2273/3181/935 2290/3189/942 2274/3158/912 +f 2266/3184/937 2283/3190/943 2267/3152/906 +f 2275/3159/913 2290/3191/942 2291/3192/944 +f 2268/3161/915 2283/3193/943 2284/3194/945 +f 2275/3159/913 2292/3195/946 2276/3163/917 +f 2269/3164/918 2284/3196/945 2285/3197/947 +f 2262/3169/923 2277/3198/948 2261/3167/921 +f 2276/3163/917 2278/3199/949 2262/3169/923 +f 2269/3164/918 2286/3200/950 2270/3171/925 +f 2261/3167/921 2279/3201/951 2263/3172/926 +f 2270/3171/925 2287/3202/909 2271/3175/929 +f 2263/3172/926 2280/3203/952 2264/3177/931 +f 2631/3204/953 2642/3205/690 2630/3206/690 +f 2628/3207/693 2639/3208/704 2627/3209/704 +f 2625/3210/954 2636/3211/691 2624/3212/691 +f 2631/3213/953 2644/3214/692 2643/3215/953 +f 2622/3216/695 2633/3217/705 2621/3218/705 +f 2628/3207/693 2641/3219/955 2640/3220/693 +f 2625/3221/954 2638/3222/694 2637/3223/954 +f 2621/3224/705 2644/3214/692 2632/3225/692 +f 2622/3216/695 2635/3226/956 2634/3227/695 +f 2630/3206/690 2641/3228/955 2629/3229/955 +f 2627/3230/704 2638/3222/694 2626/3231/694 +f 2624/3212/691 2635/3232/956 2623/3233/956 +f 1054/2205/716 1056/2208/718 1055/2206/717 +f 1056/2208/718 1058/2210/719 1057/2209/680 +f 1058/2210/719 1060/2212/721 1059/2211/720 +f 1060/2212/721 1062/2236/722 1061/2213/684 +f 1062/2214/722 1064/2217/724 1063/2215/723 +f 1064/2217/724 1066/2219/725 1065/2218/677 +f 1066/2219/725 1068/2221/727 1067/2220/726 +f 1068/2221/727 1070/2223/728 1069/2222/673 +f 1070/2223/728 1072/2225/730 1071/2224/729 +f 1072/2225/730 1074/2227/731 1073/2226/678 +f 1074/2227/731 1076/2229/733 1075/2228/732 +f 1076/2229/733 1078/2231/734 1077/2230/688 +f 1078/2231/734 1080/2233/736 1079/2232/735 +f 1080/2233/736 1082/2237/738 1081/2234/676 +f 1060/2212/721 1088/2253/754 1089/2235/737 +f 1082/2237/738 1084/2252/753 1083/2238/739 +f 1083/2238/739 1084/2252/753 1054/2205/716 +f 1085/2239/740 1086/2256/757 1102/2240/741 +f 1070/2223/728 1093/2254/755 1094/2242/743 +f 1082/2237/738 1080/2233/736 1098/2243/744 +f 1058/2210/719 1056/2208/718 1085/2239/740 +f 1066/2219/725 1091/2255/756 1092/2246/747 +f 1078/2231/734 1076/2229/733 1096/2247/748 +f 1062/2214/722 1089/3234/737 1090/2249/750 +f 1074/2227/731 1072/2225/730 1094/2242/743 +f 1082/2237/738 1099/2244/745 1100/2251/752 +f 1058/2210/719 1087/2245/746 1088/2253/754 +f 1068/2221/727 1092/2246/747 1093/2254/755 +f 1054/2205/716 1086/2256/757 1085/2239/740 +f 1078/2231/734 1097/2248/749 1098/2243/744 +f 1064/2217/724 1090/2249/750 1091/2255/756 +f 1074/2227/731 1095/2250/751 1096/2247/748 +f 1084/2252/753 1100/2251/752 1086/2256/757 +f 1086/2256/757 1100/2251/752 1116/2257/758 +f 1093/2254/755 1109/3235/771 1110/2259/759 +f 1085/2239/740 1101/3236/742 1103/2260/760 +f 1094/2242/743 1110/3237/759 1111/2261/761 +f 1087/2245/746 1103/3238/760 1104/2262/762 +f 1096/2247/748 1095/2250/751 1111/2263/761 +f 1088/2253/754 1104/3239/762 1105/2265/764 +f 1096/2247/748 1112/3240/763 1113/2266/765 +f 1090/2249/750 1089/3234/737 1105/2267/764 +f 1098/2243/744 1097/2248/749 1113/2269/765 +f 1090/2249/750 1106/3241/766 1107/2271/768 +f 1098/2243/744 1114/3242/767 1115/2272/769 +f 1091/2255/756 1107/3243/768 1108/2273/770 +f 1099/2244/745 1115/3244/769 1116/2274/758 +f 1092/2246/747 1108/3245/770 1109/2275/771 +f 2441/2276/684 2459/2296/684 2457/2277/772 +f 2448/2279/773 2450/2288/773 2451/2280/774 +f 2437/2282/775 2460/2299/775 2456/2283/686 +f 2442/2278/772 2457/2277/772 2458/2285/776 +f 2443/2287/673 2449/2289/673 2450/2288/773 +f 2444/2286/776 2458/2285/776 2449/2289/673 +f 2446/2290/688 2452/3246/688 2453/2291/777 +f 2438/2284/686 2456/2283/686 2454/2293/778 +f 2440/2295/779 2455/2601/779 2459/2296/684 +f 2447/2281/774 2451/2280/774 2452/2297/688 +f 2445/2292/777 2453/2291/777 2460/2299/775 +f 1149/2300/686 1157/2316/686 1164/2301/680 +f 1155/2303/684 1163/3247/684 1162/2304/677 +f 1153/2306/673 1161/2314/673 1160/2307/678 +f 1151/2309/688 1159/2315/688 1158/2310/676 +f 1156/2302/680 1164/2301/680 1163/2312/684 +f 1154/2305/677 1162/2304/677 1161/2314/673 +f 1152/2308/678 1160/2307/678 1159/2315/688 +f 1150/2311/676 1158/2310/676 1157/2316/686 +f 1188/2317/676 2083/2348/676 2082/2318/735 +f 1197/2320/723 1196/2349/677 2075/2321/677 +f 1189/2319/735 2082/2318/735 2081/2323/688 +f 1197/2320/723 2074/2322/723 2073/2325/684 +f 1190/2324/688 2081/2323/688 2080/2327/732 +f 1198/2329/684 2073/3248/684 2072/2330/720 +f 1191/2328/732 2080/2327/732 2079/2332/678 +f 1199/2331/720 2072/2330/720 2071/2334/680 +f 1192/2333/678 2079/2332/678 2078/2336/729 +f 1200/2335/680 2071/2334/680 2070/2338/717 +f 1193/2337/729 2078/2336/729 2077/2340/673 +f 1202/2342/686 2069/2345/686 2084/2343/739 +f 1201/2339/717 2070/2338/717 2069/2345/686 +f 1194/2341/673 2077/2340/673 2076/2346/726 +f 1187/2344/739 2084/2343/739 2083/2348/676 +f 1195/2347/726 2076/2346/726 2075/2321/677 +f 1231/2350/689 1247/3249/689 1246/2351/780 +f 1224/2353/781 1240/3250/784 1239/2354/685 +f 1231/2350/689 1232/2362/782 1248/2356/782 +f 1225/2358/783 1241/3251/783 1240/2359/784 +f 1233/2360/785 1249/3252/785 1248/2361/782 +f 1226/2363/786 1242/3253/788 1241/2364/783 +f 1234/2365/787 1250/3254/787 1249/2366/785 +f 1226/2363/786 1227/2375/683 1243/2367/683 +f 1220/2369/789 1236/3255/789 1235/2370/687 +f 1219/2371/687 1235/3256/687 1250/2372/787 +f 1228/2373/790 1244/3257/790 1243/2374/683 +f 1220/2369/789 1221/2380/791 1237/2376/791 +f 1228/2373/790 1229/2384/792 1245/2378/792 +f 1221/2380/791 1222/2385/794 1238/2381/793 +f 1230/2352/780 1246/3258/780 1245/2383/792 +f 1222/2385/794 1223/3259/685 1239/2386/685 +f 1266/2388/739 1306/2397/739 1305/2389/676 +f 1259/2391/673 1299/2399/673 1298/2392/726 +f 1252/2394/717 1292/2401/717 1291/2395/686 +f 1251/2396/686 1291/2395/686 1306/2397/739 +f 1260/2398/729 1300/2403/729 1299/2399/673 +f 1253/2400/680 1293/2405/680 1292/2401/717 +f 1261/2402/678 1301/2407/678 1300/2403/729 +f 1254/2404/720 1294/2409/720 1293/2405/680 +f 1262/2406/732 1302/2411/732 1301/2407/678 +f 1255/2408/684 1295/3260/684 1294/2409/720 +f 1263/2410/688 1303/2416/688 1302/2411/732 +f 1256/2412/723 1296/2418/723 1295/2413/684 +f 1264/2415/735 1304/2419/735 1303/2416/688 +f 1257/2417/677 1297/2420/677 1296/2418/723 +f 1265/2390/676 1305/2389/676 1304/2419/735 +f 1258/2393/726 1298/2392/726 1297/2420/677 +f 2145/2421/795 2161/2425/795 2160/2422/796 +f 2146/2424/797 2162/3261/797 2161/2425/795 +f 2163/2427/798 2162/3261/797 2146/2428/797 +f 2164/2430/799 2163/2427/798 2147/2431/798 +f 2149/2433/800 2164/2430/799 2148/2434/799 +f 2134/2436/801 2150/2439/801 2149/2433/800 +f 2135/2438/802 2151/2442/802 2150/2439/801 +f 2136/2441/803 2152/3262/803 2151/2442/802 +f 2153/2444/804 2152/3262/803 2136/2445/803 +f 2138/2447/805 2154/3263/805 2153/2448/804 +f 2155/2450/806 2154/3263/805 2138/2451/805 +f 2156/2453/807 2155/2450/806 2139/2454/806 +f 2157/2456/808 2156/2453/807 2140/2457/807 +f 2142/2459/809 2158/2462/809 2157/2456/808 +f 2143/2461/810 2159/3264/810 2158/2462/809 +f 2160/2422/796 2159/3264/810 2143/2464/810 +f 1311/2466/684 1327/3265/684 1326/2467/720 +f 1319/2469/688 1335/2476/688 1334/2470/732 +f 1312/2472/723 1328/2478/723 1327/2473/684 +f 1320/2475/735 1336/2480/735 1335/2476/688 +f 1313/2477/677 1329/2482/677 1328/2478/723 +f 1321/2479/676 1337/2484/676 1336/2480/735 +f 1314/2481/726 1330/2486/726 1329/2482/677 +f 1322/2483/739 1338/2490/739 1337/2484/676 +f 1315/2485/673 1331/2492/673 1330/2486/726 +f 1308/2487/717 1324/2494/717 1323/2488/686 +f 1307/2489/686 1323/2488/686 1338/2490/739 +f 1316/2491/729 1332/2496/729 1331/2492/673 +f 1309/2493/680 1325/2497/680 1324/2494/717 +f 1317/2495/678 1333/2498/678 1332/2496/729 +f 1310/2468/720 1326/2467/720 1325/2497/680 +f 1318/2471/732 1334/2470/732 1333/2498/678 +f 1353/2499/676 1369/2506/676 1368/2500/735 +f 1346/2502/726 1362/2508/726 1361/2503/677 +f 1354/2505/739 1370/2512/739 1369/2506/676 +f 1347/2507/673 1363/2514/673 1362/2508/726 +f 1340/2509/717 1356/2516/717 1355/2510/686 +f 1339/2511/686 1355/2510/686 1370/2512/739 +f 1348/2513/729 1364/2518/729 1363/2514/673 +f 1341/2515/680 1357/2520/680 1356/2516/717 +f 1349/2517/678 1365/2522/678 1364/2518/729 +f 1342/2519/720 1358/2524/720 1357/2520/680 +f 1350/2521/732 1366/2526/732 1365/2522/678 +f 1343/2523/684 1359/3266/684 1358/2524/720 +f 1351/2525/688 1367/2530/688 1366/2526/732 +f 1344/2527/723 1360/2531/723 1359/2528/684 +f 1352/2501/735 1368/2500/735 1367/2530/688 +f 1345/2504/677 1361/2503/677 1360/2531/723 +f 1373/2532/678 1389/2539/678 1388/2533/729 +f 1381/2535/680 1397/2541/680 1396/2536/717 +f 1374/2538/732 1390/2543/732 1389/2539/678 +f 1382/2540/720 1398/2545/720 1397/2541/680 +f 1375/2542/688 1391/3267/688 1390/2543/732 +f 1383/2544/684 1399/2550/684 1398/2545/720 +f 1376/2546/735 1392/2552/735 1391/2547/688 +f 1384/2549/723 1400/2554/723 1399/2550/684 +f 1377/2551/676 1393/2556/676 1392/2552/735 +f 1385/2553/677 1401/2558/677 1400/2554/723 +f 1378/2555/739 1394/2560/739 1393/2556/676 +f 1386/2557/726 1402/2563/726 1401/2558/677 +f 1379/2559/686 1395/2564/686 1394/2560/739 +f 1372/2534/729 1388/2533/729 1387/2561/673 +f 1371/2562/673 1387/2561/673 1402/2563/726 +f 1380/2537/717 1396/2536/717 1395/2564/686 +f 1406/2565/675 1418/3268/675 1417/2566/811 +f 1413/2568/812 1425/3269/812 1424/2569/674 +f 1410/2571/813 1422/3270/813 1421/2572/684 +f 1407/2574/814 1419/3271/814 1418/2575/675 +f 1414/2577/815 1426/3272/815 1425/2578/812 +f 1403/2580/688 1404/3273/816 1416/2581/816 +f 1411/2583/817 1423/3274/817 1422/2584/813 +f 1408/2586/818 1420/3275/818 1419/2587/814 +f 1403/2589/688 1415/3276/688 1426/2590/815 +f 1405/2592/811 1417/3277/811 1416/2593/816 +f 1412/2595/674 1424/3278/674 1423/2596/817 +f 1409/2598/684 1421/3279/684 1420/2599/818 +f 2439/2294/778 2454/2293/778 2455/2601/779 +f 2417/2602/774 2429/2615/774 2430/2603/773 +f 2420/2605/776 2432/2617/776 2433/2606/772 +f 2413/2608/686 2426/2626/686 2425/2609/775 +f 2423/2611/779 2435/2619/779 2436/2612/778 +f 2416/2614/688 2428/2621/688 2429/2615/774 +f 2419/2616/673 2431/2622/673 2432/2617/776 +f 2422/2618/684 2434/3280/684 2435/2619/779 +f 2415/2620/777 2427/2625/777 2428/2621/688 +f 2418/2604/773 2430/2603/773 2431/2622/673 +f 2421/2607/772 2433/2606/772 2434/2623/684 +f 2414/2610/775 2425/2609/775 2427/2625/777 +f 2424/2613/778 2436/2612/778 2426/2626/686 +f 1427/2627/688 1439/2637/688 1440/2628/816 +f 1434/2630/813 1446/2649/813 1447/2631/817 +f 1431/2633/814 1443/2650/814 1444/2634/818 +f 1438/2636/815 1450/2651/815 1439/2637/688 +f 1428/2629/816 1440/2628/816 1441/2638/811 +f 1435/2632/817 1447/2631/817 1448/2640/674 +f 1432/2635/818 1444/2634/818 1445/2642/684 +f 1429/2639/811 1441/2638/811 1442/2644/675 +f 1436/2641/674 1448/2640/674 1449/2646/812 +f 1433/2648/684 1445/3281/684 1446/2649/813 +f 1430/2645/675 1442/2644/675 1443/2650/814 +f 1437/2647/812 1449/2646/812 1450/2651/815 +f 1451/2652/815 1452/2661/812 1464/2653/812 +f 1458/2655/814 1459/2663/675 1471/2656/675 +f 1455/2658/813 1456/3282/684 1468/2659/684 +f 1452/2661/812 1453/2668/674 1465/2662/674 +f 1459/2663/675 1460/2670/811 1472/2664/811 +f 1456/2665/684 1457/2674/818 1469/2666/818 +f 1453/2668/674 1454/2675/817 1466/2669/817 +f 1460/2670/811 1461/2676/816 1473/2671/816 +f 1462/2672/688 1451/2652/815 1463/2654/815 +f 1457/2674/818 1458/2655/814 1470/2657/814 +f 1454/2675/817 1455/2658/813 1467/2660/813 +f 1461/2676/816 1462/2672/688 1474/2673/688 +f 1481/2677/818 1480/3283/684 1492/2678/684 +f 1478/2680/817 1477/3284/674 1489/2681/674 +f 1485/2683/816 1484/3285/811 1496/2684/811 +f 1475/2686/815 1486/3286/688 1498/2687/688 +f 1482/2689/814 1481/3287/818 1493/2690/818 +f 1479/2692/813 1478/3288/817 1490/2693/817 +f 1498/2695/688 1486/3289/688 1485/2696/816 +f 1476/2698/812 1475/3290/815 1487/2699/815 +f 1483/2701/675 1482/3291/814 1494/2702/814 +f 1480/2704/684 1479/3292/813 1491/2705/813 +f 1477/2707/674 1476/3293/812 1488/2708/812 +f 1484/2710/811 1483/3294/675 1495/2711/675 +f 1500/2713/688 1502/2716/815 1501/2714/815 +f 1502/2716/815 1504/2718/812 1503/2717/812 +f 1504/2718/812 1506/2720/674 1505/2719/674 +f 1506/2720/674 1508/2722/817 1507/2721/817 +f 1508/2722/817 1510/2724/813 1509/2723/813 +f 1510/2724/813 1512/3295/684 1511/2725/684 +f 1512/2726/684 1514/2729/818 1513/2727/818 +f 1514/2729/818 1516/2731/814 1515/2730/814 +f 1516/2731/814 1518/2733/675 1517/2732/675 +f 1518/2733/675 1520/2738/811 1519/2734/811 +f 2505/2735/815 2499/3078/815 2497/2736/812 +f 1520/2738/811 1522/2740/816 1521/2739/816 +f 1522/2740/816 1500/2713/688 1499/2715/688 +f 2500/2741/816 2493/3079/816 2498/2742/688 +f 2513/2744/816 2520/2751/816 2515/2745/688 +f 2508/2747/815 2514/2753/815 2516/2748/812 +f 2512/2750/811 2518/2755/811 2520/2751/816 +f 2508/2747/815 2507/3296/688 2515/2752/688 +f 2511/2754/819 2519/3297/819 2518/2755/811 +f 2509/2749/812 2516/2748/812 2517/2756/820 +f 1581/2758/715 1589/2794/851 1590/2759/821 +f 1562/2761/823 1560/2767/829 1559/2762/824 +f 1562/2761/823 1564/2763/825 1563/2764/826 +f 1582/2760/822 1590/2759/821 1584/2766/828 +f 1560/2767/829 1562/2761/823 1576/2768/830 +f 1564/2763/825 1566/2789/836 1565/2769/831 +f 1587/2770/832 1588/2791/849 1580/2771/833 +f 1582/2760/822 1576/2768/830 1574/2773/835 +f 1566/2774/836 1568/2780/841 1567/2775/837 +f 1587/2770/832 1579/2772/834 1578/2777/838 +f 1580/2771/833 1581/2758/715 1574/2773/835 +f 1568/2780/841 1570/2784/844 1569/2781/842 +f 1586/2778/839 1578/2777/838 1577/2782/714 +f 1579/2772/834 1580/2771/833 1572/2779/840 +f 1570/2784/844 1572/2779/840 1571/2785/845 +f 1583/2786/846 1585/2796/843 1577/2787/714 +f 1577/2782/714 1578/2777/838 1568/2780/841 +f 1572/2779/840 1574/2773/835 1573/2788/847 +f 1578/2777/838 1579/2772/834 1570/2784/844 +f 1564/2763/825 1559/2762/824 1577/2787/714 +f 1574/2773/835 1576/2768/830 1575/2790/848 +f 1588/2791/849 1589/2794/851 1581/2758/715 +f 1584/2766/828 1583/2786/846 1559/2762/824 +f 1576/2768/830 1562/2761/823 1561/2765/827 +f 1616/2792/850 1615/2828/827 1561/2765/827 +f 1588/2791/849 1596/2802/855 1597/2793/674 +f 1583/2786/846 1591/2801/854 1593/2795/675 +f 1585/2783/843 1593/3298/675 1594/2797/852 +f 1589/2794/851 1597/2793/674 1598/2798/853 +f 1586/2778/839 1594/2797/852 1595/2799/673 +f 1590/2759/821 1598/2798/853 1592/2800/686 +f 1584/2766/828 1592/2800/686 1591/2801/854 +f 1587/2770/832 1595/2799/673 1596/2802/855 +f 1606/2803/853 1614/2815/853 1613/2804/674 +f 1604/2806/855 1612/2817/855 1611/2807/673 +f 1602/2809/852 1610/2818/852 1609/2810/675 +f 1599/2812/854 1607/2819/854 1608/2813/686 +f 1600/2814/686 1608/2813/686 1614/2815/853 +f 1605/2816/674 1613/3299/674 1612/2817/855 +f 1603/2808/673 1611/2807/673 1610/2818/852 +f 1601/2811/675 1609/2810/675 1607/2819/854 +f 1621/2820/856 1622/2827/862 1630/2821/857 +f 1565/2769/831 1617/2834/859 1616/2792/850 +f 1567/2775/837 1618/2824/860 1617/2823/859 +f 1569/2781/842 1619/2825/842 1618/2824/860 +f 1571/2785/845 1620/2826/861 1619/2825/842 +f 1573/2788/847 1621/2820/856 1620/2826/861 +f 1622/2827/862 1621/2820/856 1573/2788/847 +f 1615/2828/827 1622/2827/862 1575/2790/848 +f 1620/2826/861 1628/2832/864 1627/2829/673 +f 1618/2824/860 1626/2833/865 1625/2830/863 +f 1616/2792/850 1624/2835/866 1623/2831/686 +f 1622/2827/862 1615/2828/827 1623/2831/686 +f 1620/2826/861 1621/2820/856 1629/2822/858 +f 1619/2825/842 1627/2829/673 1626/2833/865 +f 1617/2834/859 1625/3300/863 1624/2835/866 +f 1631/2836/686 1639/2859/686 1646/2837/857 +f 2612/2839/867 2613/3301/868 2601/2840/868 +f 2601/2842/868 2613/3302/868 2614/2843/869 +f 2614/2843/869 2615/3303/870 2603/2845/870 +f 1637/2846/858 1645/2855/858 1644/2847/864 +f 1635/2849/673 1643/2856/673 1642/2850/865 +f 1633/2852/863 1641/3304/863 1640/2853/866 +f 1637/2846/858 1638/2838/857 1646/2837/857 +f 1636/2848/864 1644/2847/864 1643/2856/673 +f 1633/2857/863 1634/2851/865 1642/2850/865 +f 1632/2854/866 1640/2853/866 1639/2859/686 +f 1650/2860/675 1662/3305/675 1661/2861/871 +f 1656/2863/674 1657/3306/872 1669/2864/872 +f 1654/2866/700 1666/3307/700 1665/2867/677 +f 1651/2869/873 1663/3308/873 1662/2870/675 +f 1657/2872/872 1658/3309/874 1670/2873/874 +f 1647/2875/676 1648/3310/698 1660/2876/698 +f 1655/2878/875 1667/3311/875 1666/2879/700 +f 1652/2881/876 1664/3312/876 1663/2882/873 +f 1647/2884/676 1659/3313/676 1670/2885/874 +f 1649/2887/871 1661/3314/871 1660/2888/698 +f 1655/2890/875 1656/3315/674 1668/2891/674 +f 1652/2893/876 1653/3316/677 1665/2894/677 +f 1672/2896/698 1671/2905/676 1683/2897/676 +f 1678/2899/700 1690/2918/700 1691/2900/875 +f 1676/2902/876 1675/2919/873 1687/2903/873 +f 1671/2905/676 1682/2920/874 1694/2906/874 +f 1672/2896/698 1684/2898/698 1685/2907/871 +f 1679/2901/875 1691/2900/875 1692/2909/674 +f 1677/2911/677 1676/2902/876 1688/2904/876 +f 1673/2908/871 1685/2907/871 1686/2913/675 +f 1680/2910/674 1692/2909/674 1693/2915/872 +f 1677/2917/677 1689/3317/677 1690/2918/700 +f 1674/2914/675 1686/2913/675 1687/2903/873 +f 1682/2920/874 1681/2916/872 1693/2915/872 +f 1811/2921/877 1812/3318/707 1824/2922/707 +f 1808/2924/878 1809/3319/673 1821/2925/673 +f 1805/2927/879 1806/3320/706 1818/2928/706 +f 1813/2930/880 1825/3321/880 1824/2931/707 +f 1810/2933/881 1822/3322/881 1821/2934/673 +f 1807/2936/882 1819/3323/882 1818/2937/706 +f 1814/2939/883 1826/3324/883 1825/2940/880 +f 1804/2942/884 1816/3325/884 1815/2943/686 +f 1811/2945/877 1823/3326/877 1822/2946/881 +f 1807/2948/882 1808/3327/878 1820/2949/878 +f 1803/2951/686 1815/3328/686 1826/2952/883 +f 1805/2954/879 1817/3329/879 1816/2955/884 +f 1794/2957/706 1830/2978/706 1831/2958/882 +f 1801/2960/880 1837/2980/880 1838/2961/883 +f 1791/2963/686 1827/2971/686 1828/2964/884 +f 1798/2966/881 1834/2981/881 1835/2967/877 +f 1795/2959/882 1831/2958/882 1832/2969/878 +f 1791/2963/686 1802/2962/883 1838/2961/883 +f 1792/2965/884 1828/2964/884 1829/2972/879 +f 1800/2974/707 1799/2968/877 1835/2967/877 +f 1796/2970/878 1832/2969/878 1833/2976/673 +f 1794/2957/706 1793/2973/879 1829/2972/879 +f 1801/2960/880 1800/3330/707 1836/2979/707 +f 1797/2977/673 1833/2976/673 1834/2981/881 +f 1854/2982/686 1847/3331/885 1839/2983/885 +f 1852/2985/886 1853/3332/887 1845/2986/887 +f 1850/2988/673 1851/3333/888 1843/2989/888 +f 1848/2991/713 1849/3334/889 1841/2992/889 +f 1845/2986/887 1853/3332/887 1854/2982/686 +f 1843/2989/888 1851/3333/888 1852/2994/886 +f 1841/2992/889 1849/3334/889 1850/2988/673 +f 1839/2983/885 1847/3331/885 1848/2991/713 +f 1895/2996/684 1907/3335/684 1908/2997/813 +f 1892/2999/675 1904/3019/675 1905/3000/814 +f 1899/3002/812 1911/3020/812 1912/3003/815 +f 1889/3005/688 1901/3012/688 1902/3006/816 +f 1896/2998/813 1908/2997/813 1909/3008/817 +f 1893/3001/814 1905/3000/814 1906/3010/818 +f 1900/3004/815 1912/3003/815 1901/3012/688 +f 1890/3007/816 1902/3006/816 1903/3013/811 +f 1897/3009/817 1909/3008/817 1910/3015/674 +f 1894/3011/818 1906/3010/818 1907/3017/684 +f 1891/3014/811 1903/3013/811 1904/3019/675 +f 1898/3016/674 1910/3015/674 1911/3020/812 +f 1877/3021/688 1913/3336/688 1924/3022/815 +f 1879/3024/811 1915/3337/811 1914/3025/816 +f 1886/3027/674 1922/3338/674 1921/3028/817 +f 1883/3030/684 1919/3339/684 1918/3031/818 +f 1880/3033/675 1916/3340/675 1915/3034/811 +f 1887/3036/812 1923/3341/812 1922/3037/674 +f 1884/3039/813 1920/3342/813 1919/3040/684 +f 1881/3042/814 1917/3343/814 1916/3043/675 +f 1888/3045/815 1924/3344/815 1923/3046/812 +f 1878/3048/816 1914/3345/816 1913/3049/688 +f 1885/3051/817 1921/3346/817 1920/3052/813 +f 1882/3054/818 1918/3347/818 1917/3055/814 +f 1968/3057/890 1969/3348/891 1961/3058/891 +f 1971/3060/675 1972/3349/892 1964/3061/892 +f 1969/3063/891 1970/3350/893 1962/3064/893 +f 1964/3061/892 1972/3349/892 1965/3066/894 +f 1967/3068/674 1968/3057/890 1960/3059/890 +f 1962/3064/893 1970/3350/893 1971/3060/675 +f 1966/3070/895 1967/3068/674 1959/3069/674 +f 1957/3067/894 1965/3066/894 1966/3070/895 +f 2504/2737/812 2497/2736/812 2496/3072/820 +f 2502/3074/819 2494/3351/819 2495/3075/811 +f 2505/2735/815 2506/3352/688 2498/3077/688 +f 2501/3076/811 2495/3075/811 2493/3079/816 +f 1991/3080/688 1999/3090/688 1998/3081/676 +f 1996/3083/680 2004/3093/680 2003/3084/684 +f 1994/3086/677 2002/3095/677 2001/3087/673 +f 1992/3089/678 2000/3096/678 1999/3090/688 +f 1990/3082/676 1998/3081/676 1997/3091/686 +f 1989/3092/686 1997/3091/686 2004/3093/680 +f 1995/3094/684 2003/3353/684 2002/3095/677 +f 1993/3088/673 2001/3087/673 2000/3096/678 +f 2611/3097/897 2612/2839/867 2600/2841/867 +f 2603/3099/870 2615/3354/870 2616/3100/898 +f 2604/3101/898 2616/3100/898 2617/3102/899 +f 2605/3104/899 2617/3355/899 2618/3105/900 +f 2618/3105/900 2619/3356/901 2607/3107/901 +f 2619/3108/901 2620/3357/902 2608/3109/902 +f 2608/3109/902 2620/3357/902 2609/3111/903 +f 2609/3113/903 2610/3116/904 2598/3114/904 +f 2610/3116/904 2611/3358/897 2599/3117/897 +f 2017/3118/688 2033/3125/688 2032/3119/732 +f 2010/3121/723 2026/3127/723 2025/3122/684 +f 2018/3124/735 2034/3129/735 2033/3125/688 +f 2010/3121/723 2011/3131/677 2027/3126/677 +f 2019/3128/676 2035/3133/676 2034/3129/735 +f 2012/3130/726 2028/3135/726 2027/3126/677 +f 2020/3132/739 2036/3137/739 2035/3133/676 +f 2012/3130/726 2013/3142/673 2029/3134/673 +f 2005/3136/686 2023/3150/686 2036/3137/739 +f 2007/3138/680 2022/3146/680 2021/3139/717 +f 2014/3141/729 2030/3144/729 2029/3134/673 +f 2014/3141/729 2015/3147/678 2031/3143/678 +f 2008/3145/720 2024/3149/720 2022/3146/680 +f 2016/3120/732 2032/3119/732 2031/3143/678 +f 2009/3148/684 2025/3359/684 2024/3149/720 +f 2005/3136/686 2006/3140/717 2021/3139/717 +f 2250/3151/905 2266/3184/937 2267/3152/906 +f 2272/3154/908 2271/3175/929 2287/3155/909 +f 2259/3157/911 2258/3185/938 2274/3158/912 +f 2252/3160/914 2251/3153/907 2267/3152/906 +f 2260/3162/916 2259/3157/911 2275/3159/913 +f 2252/3160/914 2268/3161/915 2269/3164/918 +f 2246/3166/920 2262/3169/923 2261/3167/921 +f 2246/3166/920 2260/3162/916 2276/3163/917 +f 2254/3170/924 2253/3165/919 2269/3164/918 +f 2245/3168/922 2261/3167/921 2263/3172/926 +f 2255/3174/928 2254/3170/924 2270/3171/925 +f 2248/3176/930 2247/3173/927 2263/3172/926 +f 2255/3174/928 2271/3175/929 2272/3154/908 +f 2248/3176/930 2264/3177/931 2265/3179/933 +f 2256/3178/932 2272/3154/908 2273/3181/935 +f 2250/3151/905 2249/3360/934 2265/3183/933 +f 2258/3185/938 2257/3182/936 2273/3181/935 +f 2264/3177/931 2280/3361/952 2281/3186/939 +f 2272/3154/908 2288/3362/910 2289/3187/940 +f 2265/3183/933 2281/3363/939 2282/3188/941 +f 2273/3181/935 2289/3364/940 2290/3189/942 +f 2266/3184/937 2282/3365/941 2283/3190/943 +f 2275/3159/913 2274/3158/912 2290/3191/942 +f 2268/3161/915 2267/3152/906 2283/3193/943 +f 2275/3159/913 2291/3366/944 2292/3195/946 +f 2269/3164/918 2268/3161/915 2284/3196/945 +f 2262/3169/923 2278/3367/949 2277/3198/948 +f 2276/3163/917 2292/3368/946 2278/3199/949 +f 2269/3164/918 2285/3369/947 2286/3200/950 +f 2261/3167/921 2277/3370/948 2279/3201/951 +f 2270/3171/925 2286/3371/950 2287/3202/909 +f 2263/3172/926 2279/3372/951 2280/3203/952 +f 2631/3204/953 2643/3373/953 2642/3205/690 +f 2628/3207/693 2640/3220/693 2639/3208/704 +f 2625/3210/954 2637/3374/954 2636/3211/691 +f 2631/3213/953 2632/3225/692 2644/3214/692 +f 2622/3216/695 2634/3227/695 2633/3217/705 +f 2628/3207/693 2629/3375/955 2641/3219/955 +f 2625/3221/954 2626/3231/694 2638/3222/694 +f 2621/3224/705 2633/3376/705 2644/3214/692 +f 2622/3216/695 2623/3377/956 2635/3226/956 +f 2630/3206/690 2642/3205/690 2641/3228/955 +f 2627/3230/704 2639/3378/704 2638/3222/694 +f 2624/3212/691 2636/3211/691 2635/3232/956 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 2bcda4f58..9f9711070 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -45,6 +45,7 @@ "block.openC": {"category": "block", "sounds": ["block/openC1", "block/openC2", "block/openCSqueaky"]}, "block.closeC": {"category": "block", "sounds": ["block/closeC1", "block/closeC2", "block/closeC3"]}, "block.warnOverspeed": {"category": "block", "sounds": [{"name": "block/warnOverspeed", "stream": false}]}, + "block.boilerGroan": {"category": "block", "sounds": ["block/boilerGroan0", "block/boilerGroan1", "block/boilerGroan2"]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg new file mode 100644 index 000000000..8a4dca960 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/boilerGroan0.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg new file mode 100644 index 000000000..694face26 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/boilerGroan1.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg b/src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg new file mode 100644 index 000000000..2d09c62ac Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/boilerGroan2.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg b/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg index d225f7e54..633d242ad 100644 Binary files a/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg and b/src/main/resources/assets/hbm/sounds/block/centrifugeOperate.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg b/src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg new file mode 100644 index 000000000..a687020c8 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/weapon/chainsaw_loop.ogg differ diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_fire.png b/src/main/resources/assets/hbm/textures/blocks/brick_fire.png new file mode 100644 index 000000000..f3b5094cc Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/brick_fire.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png b/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png new file mode 100644 index 000000000..40d39d2aa Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/brick_light_alt.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png new file mode 100644 index 000000000..5d76282fe Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png new file mode 100644 index 000000000..13ce2f116 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/concrete_liquid_flowing.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor.png b/src/main/resources/assets/hbm/textures/blocks/conveyor.png index 07cda57ee..c9bd51ea5 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/conveyor.png and b/src/main/resources/assets/hbm/textures/blocks/conveyor.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png new file mode 100644 index 000000000..05cf8986e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_left.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png new file mode 100644 index 000000000..9142a44aa Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_curve_right.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png index 4b8ccb039..aa49e18c8 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png and b/src/main/resources/assets/hbm/textures/blocks/conveyor_double.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png new file mode 100644 index 000000000..f5f4c4a8c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_left.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png new file mode 100644 index 000000000..fafd8b190 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_double_curve_right.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple.png index 8edc93579..cb948832b 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple.png and b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png new file mode 100644 index 000000000..f6411e3c5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_left.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png new file mode 100644 index 000000000..4c32e96e5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png.mcmeta new file mode 100644 index 000000000..df9cfce6e --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/conveyor_triple_curve_right.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": { } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png index a1dae7462..2a32ab7d9 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png and b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_down.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_up.png b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_up.png index e5865ba2c..ac979552c 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_up.png and b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_side_up.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_top.png b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_top.png index 7cd0f79c3..e472ff0e7 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_boxer_top.png and b/src/main/resources/assets/hbm/textures/blocks/crane_boxer_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_router_overlay.png b/src/main/resources/assets/hbm/textures/blocks/crane_router_overlay.png new file mode 100644 index 000000000..184f108a8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/crane_router_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png new file mode 100644 index 000000000..8c92452dd Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png new file mode 100644 index 000000000..51d9daf32 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/crane_teleporter_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png index 37835aa95..1ca9e8f4d 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png and b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_down.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png index 6609e9ae9..0c0396c5b 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png and b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_side_up.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png index 5bed3b005..6fafd3b25 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png and b/src/main/resources/assets/hbm/textures/blocks/crane_unboxer_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crate_entangled_side.png b/src/main/resources/assets/hbm/textures/blocks/crate_entangled_side.png deleted file mode 100644 index bd9e5fc2e..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/crate_entangled_side.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png b/src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png deleted file mode 100644 index dc1866989..000000000 Binary files a/src/main/resources/assets/hbm/textures/blocks/crate_entangled_top.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png b/src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png new file mode 100644 index 000000000..fab8d3cd2 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/deco_computer_0.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png new file mode 100644 index 000000000..53406350f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png new file mode 100644 index 000000000..79de6ddee Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_inner.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png new file mode 100644 index 000000000..1573c1d22 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_basin_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_top.png new file mode 100644 index 000000000..11686284a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_basin_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png new file mode 100644 index 000000000..53406350f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png new file mode 100644 index 000000000..62c97bacf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_inner.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_side.png new file mode 100644 index 000000000..d5c3eaf9a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_channel_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_top.png new file mode 100644 index 000000000..535bd7097 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_channel_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png new file mode 100644 index 000000000..53406350f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png new file mode 100644 index 000000000..62c97bacf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_inner.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_side.png new file mode 100644 index 000000000..d5c3eaf9a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_mold_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_top.png new file mode 100644 index 000000000..11686284a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_mold_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png new file mode 100644 index 000000000..53406350f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png new file mode 100644 index 000000000..f04272852 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_filter.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png new file mode 100644 index 000000000..98bb463c7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_front.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_inner.png new file mode 100644 index 000000000..62c97bacf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_inner.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png new file mode 100644 index 000000000..7b31541d5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_lock.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_side.png new file mode 100644 index 000000000..a87b2a4ad Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png new file mode 100644 index 000000000..843899184 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_outlet_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png new file mode 100644 index 000000000..53406350f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png new file mode 100644 index 000000000..58ef85a61 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_inner.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png new file mode 100644 index 000000000..dbc0b9d66 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_top.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_top.png new file mode 100644 index 000000000..11686284a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png new file mode 100644 index 000000000..917d94ed4 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/foundry_tank_upper.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/lava_gray.png b/src/main/resources/assets/hbm/textures/blocks/lava_gray.png new file mode 100644 index 000000000..5e8ddc411 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/lava_gray.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png new file mode 100644 index 000000000..9898dc7ee Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_dead.bigflower.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png new file mode 100644 index 000000000..6df4a0508 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_dead.fern.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png new file mode 100644 index 000000000..f3d5b4bcd Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_dead.flower.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png new file mode 100644 index 000000000..95c164e6a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_dead.generic.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_dead.grass.png b/src/main/resources/assets/hbm/textures/blocks/plant_dead.grass.png new file mode 100644 index 000000000..423622b80 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_dead.grass.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png index f1357aa19..bba918c74 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png and b/src/main/resources/assets/hbm/textures/blocks/plant_flower.foxglove.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png index 77d18136a..01a3dcf59 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png and b/src/main/resources/assets/hbm/textures/blocks/plant_flower.nightshade.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png b/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png index ea4d67d05..56f0815de 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png and b/src/main/resources/assets/hbm/textures/blocks/plant_flower.tobacco.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png new file mode 100644 index 000000000..1e412f0cf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.lower.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png new file mode 100644 index 000000000..e7a23bdbe Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/plant_tall.weed.upper.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/structure_anchor.png b/src/main/resources/assets/hbm/textures/blocks/structure_anchor.png new file mode 100644 index 000000000..b0de5a33b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/structure_anchor.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png b/src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png new file mode 100644 index 000000000..346d3471a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/tele_anchor_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/tele_anchor_top.png b/src/main/resources/assets/hbm/textures/blocks/tele_anchor_top.png new file mode 100644 index 000000000..151bb9f3f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/tele_anchor_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png b/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png index 7286794bc..411d7960f 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png and b/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_utility.png b/src/main/resources/assets/hbm/textures/gui/gui_utility.png index e36d0f1cc..ec502b69e 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_utility.png and b/src/main/resources/assets/hbm/textures/gui/gui_utility.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png index 1a9907bdf..2834d3569 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png and b/src/main/resources/assets/hbm/textures/gui/machine/gui_armor_modifier.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png new file mode 100644 index 000000000..a22923565 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png new file mode 100644 index 000000000..cd06a8101 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png new file mode 100644 index 000000000..e2d7bf72d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/potions.png b/src/main/resources/assets/hbm/textures/gui/potions.png index 8eafece73..09759f2f9 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/potions.png and b/src/main/resources/assets/hbm/textures/gui/potions.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png new file mode 100644 index 000000000..42e8fb314 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_base.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_base.png new file mode 100644 index 000000000..4e3ede879 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_base.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_brighten_21.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_brighten_21.png new file mode 100644 index 000000000..fe06a9054 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_brighten_21.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_multiply_100.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_multiply_100.png new file mode 100644 index 000000000..386ac8145 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible_multiply_100.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png new file mode 100644 index 000000000..ae0884951 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_crystallizer_alt.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png index ba84eb214..5946a1293 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png and b/src/main/resources/assets/hbm/textures/gui/storage/gui_crate_desh.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png new file mode 100644 index 000000000..1e5b2b287 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_full.png b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_full.png new file mode 100644 index 000000000..471ce714d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ammo_arty_cargo_full.png differ diff --git a/src/main/resources/assets/hbm/textures/items/anchor_remote.png b/src/main/resources/assets/hbm/textures/items/anchor_remote.png new file mode 100644 index 000000000..3fc5ec420 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/anchor_remote.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ball_fireclay.png b/src/main/resources/assets/hbm/textures/items/ball_fireclay.png new file mode 100644 index 000000000..77ade8b21 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ball_fireclay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/bandaid.png b/src/main/resources/assets/hbm/textures/items/bandaid.png index fbf2effb9..7f687357c 100644 Binary files a/src/main/resources/assets/hbm/textures/items/bandaid.png and b/src/main/resources/assets/hbm/textures/items/bandaid.png differ diff --git a/src/main/resources/assets/hbm/textures/items/briquette_sawdust.png b/src/main/resources/assets/hbm/textures/items/briquette_sawdust.png new file mode 100644 index 000000000..885b03ba9 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/briquette_sawdust.png differ diff --git a/src/main/resources/assets/hbm/textures/items/chem_icon_ETHANOL.png b/src/main/resources/assets/hbm/textures/items/chem_icon_ETHANOL.png index c3e90bb5c..7950c4d2c 100644 Binary files a/src/main/resources/assets/hbm/textures/items/chem_icon_ETHANOL.png and b/src/main/resources/assets/hbm/textures/items/chem_icon_ETHANOL.png differ diff --git a/src/main/resources/assets/hbm/textures/items/crucible_template.png b/src/main/resources/assets/hbm/textures/items/crucible_template.png new file mode 100644 index 000000000..959edefae Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/crucible_template.png differ diff --git a/src/main/resources/assets/hbm/textures/items/empblast.png b/src/main/resources/assets/hbm/textures/items/empblast.png index 12caa186e..7db45b035 100644 Binary files a/src/main/resources/assets/hbm/textures/items/empblast.png and b/src/main/resources/assets/hbm/textures/items/empblast.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ingot_firebrick.png b/src/main/resources/assets/hbm/textures/items/ingot_firebrick.png new file mode 100644 index 000000000..8e6650152 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ingot_firebrick.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_base.png b/src/main/resources/assets/hbm/textures/items/mold_base.png new file mode 100644 index 000000000..21a8f9729 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_base.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_billet.png b/src/main/resources/assets/hbm/textures/items/mold_billet.png new file mode 100644 index 000000000..186a7dea3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_billet.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_blade.png b/src/main/resources/assets/hbm/textures/items/mold_blade.png new file mode 100644 index 000000000..b078333b4 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_blade.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_blades.png b/src/main/resources/assets/hbm/textures/items/mold_blades.png new file mode 100644 index 000000000..09497e5a2 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_blades.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_block.png b/src/main/resources/assets/hbm/textures/items/mold_block.png new file mode 100644 index 000000000..1d101b37b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_block.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_c357.png b/src/main/resources/assets/hbm/textures/items/mold_c357.png new file mode 100644 index 000000000..2086e490b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_c357.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_c44.png b/src/main/resources/assets/hbm/textures/items/mold_c44.png new file mode 100644 index 000000000..98fc977a7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_c44.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_c50.png b/src/main/resources/assets/hbm/textures/items/mold_c50.png new file mode 100644 index 000000000..cf0625b41 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_c50.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_c9.png b/src/main/resources/assets/hbm/textures/items/mold_c9.png new file mode 100644 index 000000000..4921bd05b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_c9.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png b/src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png new file mode 100644 index 000000000..a82cdf756 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_cbuckshot.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_gem.png b/src/main/resources/assets/hbm/textures/items/mold_gem.png new file mode 100644 index 000000000..700902141 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_gem.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_hull_big.png b/src/main/resources/assets/hbm/textures/items/mold_hull_big.png new file mode 100644 index 000000000..81e63e8da Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_hull_big.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_hull_small.png b/src/main/resources/assets/hbm/textures/items/mold_hull_small.png new file mode 100644 index 000000000..3c52d67cb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_hull_small.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_ingot.png b/src/main/resources/assets/hbm/textures/items/mold_ingot.png new file mode 100644 index 000000000..0bc314f24 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_ingot.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_ingots.png b/src/main/resources/assets/hbm/textures/items/mold_ingots.png new file mode 100644 index 000000000..455976e43 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_ingots.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_mogus.png b/src/main/resources/assets/hbm/textures/items/mold_mogus.png new file mode 100644 index 000000000..1da1368d6 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_mogus.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_nugget.png b/src/main/resources/assets/hbm/textures/items/mold_nugget.png new file mode 100644 index 000000000..a672a55a7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_nugget.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_pipes.png b/src/main/resources/assets/hbm/textures/items/mold_pipes.png new file mode 100644 index 000000000..a38e473ba Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_pipes.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_plate.png b/src/main/resources/assets/hbm/textures/items/mold_plate.png new file mode 100644 index 000000000..4a9c0d4a0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_plate.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_plates.png b/src/main/resources/assets/hbm/textures/items/mold_plates.png new file mode 100644 index 000000000..286385774 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_plates.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_stamp.png b/src/main/resources/assets/hbm/textures/items/mold_stamp.png new file mode 100644 index 000000000..16dfddc0b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_stamp.png differ diff --git a/src/main/resources/assets/hbm/textures/items/mold_wire.png b/src/main/resources/assets/hbm/textures/items/mold_wire.png new file mode 100644 index 000000000..d1f9db61c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/mold_wire.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pill_herbal.png b/src/main/resources/assets/hbm/textures/items/pill_herbal.png new file mode 100644 index 000000000..fbb4dd0ed Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pill_herbal.png differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_sawdust.png b/src/main/resources/assets/hbm/textures/items/powder_sawdust.png new file mode 100644 index 000000000..bd75baa48 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/powder_sawdust.png differ diff --git a/src/main/resources/assets/hbm/textures/items/recycled_crystal.png b/src/main/resources/assets/hbm/textures/items/recycled_crystal.png index 8c9b8e56d..89635cfba 100644 Binary files a/src/main/resources/assets/hbm/textures/items/recycled_crystal.png and b/src/main/resources/assets/hbm/textures/items/recycled_crystal.png differ diff --git a/src/main/resources/assets/hbm/textures/items/sawblade.png b/src/main/resources/assets/hbm/textures/items/sawblade.png new file mode 100644 index 000000000..e495181e4 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/sawblade.png differ diff --git a/src/main/resources/assets/hbm/textures/items/scraps.png b/src/main/resources/assets/hbm/textures/items/scraps.png new file mode 100644 index 000000000..bb5ad932e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/scraps.png differ diff --git a/src/main/resources/assets/hbm/textures/items/structure_pattern.png b/src/main/resources/assets/hbm/textures/items/structure_pattern.png new file mode 100644 index 000000000..f1fad870d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/structure_pattern.png differ diff --git a/src/main/resources/assets/hbm/textures/items/structure_single.png b/src/main/resources/assets/hbm/textures/items/structure_single.png new file mode 100644 index 000000000..0569201b8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/structure_single.png differ diff --git a/src/main/resources/assets/hbm/textures/items/structure_solid.png b/src/main/resources/assets/hbm/textures/items/structure_solid.png new file mode 100644 index 000000000..47c3e443f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/structure_solid.png differ diff --git a/src/main/resources/assets/hbm/textures/items/tape_cluster.png b/src/main/resources/assets/hbm/textures/items/tape_cluster.png new file mode 100644 index 000000000..cb7682889 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/tape_cluster.png differ diff --git a/src/main/resources/assets/hbm/textures/items/void_anim.png b/src/main/resources/assets/hbm/textures/items/void_anim.png index b908de8de..da3efcedd 100644 Binary files a/src/main/resources/assets/hbm/textures/items/void_anim.png and b/src/main/resources/assets/hbm/textures/items/void_anim.png differ diff --git a/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta b/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta deleted file mode 100644 index dd1bedb12..000000000 --- a/src/main/resources/assets/hbm/textures/items/void_anim.png.mcmeta +++ /dev/null @@ -1,3 +0,0 @@ -{ - "animation": {} -} diff --git a/src/main/resources/assets/hbm/textures/items/wrench_archineer.png b/src/main/resources/assets/hbm/textures/items/wrench_archineer.png new file mode 100644 index 000000000..046de3841 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/wrench_archineer.png differ diff --git a/src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png b/src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png new file mode 100644 index 000000000..958caa4ff Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/wrench_archineer_hd.png differ diff --git a/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png b/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png new file mode 100644 index 000000000..e0eaab8e7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/capes/CapeHoboy_mk3.png differ diff --git a/src/main/resources/assets/hbm/textures/models/horse/horse_demo.png b/src/main/resources/assets/hbm/textures/models/horse/horse_demo.png new file mode 100644 index 000000000..ecb0e8764 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/horse/horse_demo.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/boiler.png b/src/main/resources/assets/hbm/textures/models/machines/boiler.png new file mode 100644 index 000000000..47d190b9d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/boiler.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/centrifuge.png b/src/main/resources/assets/hbm/textures/models/machines/centrifuge.png new file mode 100644 index 000000000..e5b62d482 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/centrifuge.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png b/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png new file mode 100644 index 000000000..b467ac3bf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/electric_heater.png b/src/main/resources/assets/hbm/textures/models/machines/electric_heater.png new file mode 100644 index 000000000..bdd971aa1 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/electric_heater.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/lava.png b/src/main/resources/assets/hbm/textures/models/machines/lava.png new file mode 100644 index 000000000..ea9d5e37b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/lava.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/lava_gray.png b/src/main/resources/assets/hbm/textures/models/machines/lava_gray.png new file mode 100644 index 000000000..5e8ddc411 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/lava_gray.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/sawmill.png b/src/main/resources/assets/hbm/textures/models/machines/sawmill.png new file mode 100644 index 000000000..9a369ddf3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/sawmill.png differ diff --git a/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png b/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png index 2f97a307d..0e5dee8d7 100644 Binary files a/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png and b/src/main/resources/assets/hbm/textures/models/projectiles/himars_single.png differ diff --git a/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png b/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png index 79604841b..54a00f7df 100644 Binary files a/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png and b/src/main/resources/assets/hbm/textures/models/projectiles/himars_standard.png differ diff --git a/src/main/resources/assets/hbm/textures/models/turrets/himars.png b/src/main/resources/assets/hbm/textures/models/turrets/himars.png index 1d468f355..20d361c0a 100644 Binary files a/src/main/resources/assets/hbm/textures/models/turrets/himars.png and b/src/main/resources/assets/hbm/textures/models/turrets/himars.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/chainsaw.png b/src/main/resources/assets/hbm/textures/models/weapons/chainsaw.png new file mode 100644 index 000000000..60c9c44f8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/chainsaw.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png b/src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png new file mode 100644 index 000000000..6d09425ae Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/chemthrower.png differ diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 882779243..3041f9144 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "hbm", "name": "Hbm's Nuclear Tech", "description": "A mod that adds weapons, nuclear themed stuff and machines", - "version":"1.0.27_X4312", + "version":"1.0.27_X4389", "mcversion": "1.7.10", "url": "", "updateUrl": "",